From f405ed66033f9eda5afa6d05336f336d1c944d55 Mon Sep 17 00:00:00 2001 From: AndrewJacksonThe2nd Date: Tue, 30 Aug 2016 23:25:32 -0700 Subject: [PATCH 01/96] GOOFMOS: FREON REWORK and WATER VAPOR --- code/datums/gas_overrides.dm | 5 +++- code/game/turfs/open.dm | 25 ++++++++++++++++++ .../atmospherics/gasmixtures/gas_mixture.dm | 17 +++++++----- .../atmospherics/gasmixtures/gas_types.dm | 11 ++++++-- .../atmospherics/machinery/airalarm.dm | 11 ++++++-- .../components/unary_devices/vent_scrubber.dm | 15 +++++++++++ .../machinery/portable/canister.dm | 9 ++++++- .../machinery/portable/scrubber.dm | 2 +- .../mob/living/carbon/human/species.dm | 1 - code/modules/mob/living/living.dm | 4 +-- code/modules/mob/living/living_defines.dm | 2 ++ icons/effects/tile_effects.dmi | Bin 2190 -> 2532 bytes icons/obj/atmos.dmi | Bin 21426 -> 22502 bytes 13 files changed, 85 insertions(+), 17 deletions(-) diff --git a/code/datums/gas_overrides.dm b/code/datums/gas_overrides.dm index 027aa07e6dc..c58d5ad176a 100644 --- a/code/datums/gas_overrides.dm +++ b/code/datums/gas_overrides.dm @@ -1,2 +1,5 @@ /datum/proc/freon_gas_act() - return \ No newline at end of file + return 0 + +/datum/proc/water_vapor_gas_act() // We get it + return 0 // You vape \ No newline at end of file diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 07d70bfc4b7..efd17e61da0 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -72,7 +72,30 @@ for(var/obj/I in contents) if(!I.is_frozen) //let it go I.make_frozen_visual(I) + for(var/mob/living/L in contents) + if(L.bodytemperature >= 10) + L.bodytemperature -= 10 + if(L.bodytemperature <= 50) + L.apply_status_effect(/datum/status_effect/freon) MakeSlippery(TURF_WET_PERMAFROST, 5) + return 1 + +/turf/open/water_vapor_gas_act() + MakeSlippery(min_wet_time = 10, wet_time_to_add = 5) + + for(var/mob/living/simple_animal/slime/M in src) + M.apply_water() + + clean_blood() + for(var/obj/effect/O in src) + if(is_cleanable(O)) + qdel(O) + + var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in src) + if(hotspot && !istype(src, /turf/open/space)) + air.temperature = max(min(air.temperature-2000,air.temperature/2),0) + qdel(hotspot) + return 1 /turf/open/handle_fall(mob/faller, forced) faller.lying = pick(90, 270) @@ -119,8 +142,10 @@ step(C, olddir) C.spin(1,1) else if(lube&SLIDE_ICE) + C.slipping = TRUE spawn(1) step(C, olddir) + C.slipping = FALSE return 1 /turf/open/proc/MakeSlippery(wet_setting = TURF_WET_WATER, min_wet_time = 0, wet_time_to_add = 0) // 1 = Water, 2 = Lube, 3 = Ice, 4 = Permafrost, 5 = Slide diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index c7ed7f4fb33..2d72f8cc43a 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -181,13 +181,16 @@ var/list/gaslist_cache = null //world << "post [temperature], [cached_gases["plasma"][MOLES]], [cached_gases["co2"][MOLES]] */ if(holder) - if(cached_gases["freon"] && cached_gases["o2"]) - if(cached_gases["freon"][MOLES] >= 3) - if(return_temperature() < 50) - holder.freon_gas_act() - cached_gases["freon"][MOLES] -= 3 - cached_gases["o2"][MOLES] += 3 - temperature += 1 + if(cached_gases["freon"]) + if(cached_gases["freon"][MOLES] >= MOLES_PLASMA_VISIBLE) + if(holder.freon_gas_act()) + cached_gases["freon"][MOLES] -= MOLES_PLASMA_VISIBLE + + if(cached_gases["water_vapor"]) + if(cached_gases["water_vapor"][MOLES] >= MOLES_PLASMA_VISIBLE) + if(holder.water_vapor_gas_act()) + cached_gases["water_vapor"][MOLES] -= MOLES_PLASMA_VISIBLE + fuel_burnt = 0 if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) //world << "pre [temperature], [cached_gases["o2"][MOLES]], [cached_gases["plasma"][MOLES]]" diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm index 650b331d681..e13256a2160 100644 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ b/code/modules/atmospherics/gasmixtures/gas_types.dm @@ -51,12 +51,19 @@ var/list/hardcoded_gases = list("o2","n2","co2","plasma") //the main four gases, gas_overlay = "plasma" moles_visible = MOLES_PLASMA_VISIBLE +/datum/gas/water_vapor + id = "water_vapor" + specific_heat = 40 + name = "Water Vapor" + gas_overlay = "water_vapor" + moles_visible = MOLES_PLASMA_VISIBLE + /datum/gas/freon id = "freon" - specific_heat = 1000 + specific_heat = 2000 name = "Freon" gas_overlay = "freon" - moles_visible = 3 + moles_visible = MOLES_PLASMA_VISIBLE /datum/gas/nitrous_oxide id = "n2o" diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 912cad976c7..0d0212114ca 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -78,6 +78,7 @@ "n2o" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa "bz" = new/datum/tlv(-1, -1, 0.2, 0.5), "freon" = new/datum/tlv(-1, -1, 0.2, 0.5), + "water_vapor" = new/datum/tlv(-1, -1, 0.2, 0.5), ) /obj/machinery/airalarm/server // No checks here. @@ -91,6 +92,7 @@ "n2o" = new/datum/tlv(-1, -1, -1, -1), "bz" = new/datum/tlv(-1, -1, -1, -1), "freon" = new/datum/tlv(-1, -1, -1, -1), + "water_vapor" = new/datum/tlv(-1, -1, -1, -1) ) /obj/machinery/airalarm/kitchen_cold_room // Copypasta: to check temperatures. @@ -104,6 +106,7 @@ "n2o" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa "bz" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa "freon" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa + "water_vapor" = new/datum/tlv(-1, -1, 0.2, 0.5) ) //all air alarms in area are connected via magic @@ -237,7 +240,8 @@ "filter_toxins" = info["filter_toxins"], "filter_n2o" = info["filter_n2o"], "filter_bz" = info["filter_bz"], - "filter_freon" = info["filter_freon"] + "filter_freon" = info["filter_freon"], + "filter_water_vapor" = info["filter_water_vapor"] )) data["mode"] = mode data["modes"] = list() @@ -293,7 +297,7 @@ if(usr.has_unlimited_silicon_privilege && !wires.is_cut(WIRE_IDSCAN)) locked = !locked . = TRUE - if("power", "co2_scrub", "tox_scrub", "n2o_scrub", "bz_scrub", "freon_scrub", "widenet", "scrubbing") + if("power", "co2_scrub", "tox_scrub", "n2o_scrub", "bz_scrub", "freon_scrub","water_vapor_scrub", "widenet", "scrubbing") send_signal(device_id, list("[action]" = text2num(params["val"]))) . = TRUE if("excheck") @@ -412,6 +416,7 @@ "n2o_scrub" = 0, "bz_scrub" = 1, "freon_scrub"= 1, + "water_vapor_scrub"= 1, "scrubbing" = 1, "widenet" = 0, )) @@ -430,6 +435,7 @@ "n2o_scrub" = 1, "bz_scrub" = 1, "freon_scrub"= 1, + "water_vapor_scrub"= 1, "scrubbing" = 1, "widenet" = 1, )) @@ -461,6 +467,7 @@ "n2o_scrub" = 0, "bz_scrub" = 0, "freon_scrub"= 1, + "water_vapor_scrub"= 1, "scrubbing" = 1, "widenet" = 0, )) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 181cce17d29..d34f7231d7b 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -21,6 +21,8 @@ var/scrub_N2O = 0 var/scrub_BZ = 0 var/scrub_Freon = 1 + var/scrub_WaterVapor = 1 + var/volume_rate = 200 var/widenet = 0 //is this scrubber acting on the 3x3 area around it. @@ -72,6 +74,8 @@ amount += idle_power_usage if(scrub_Freon) amount += idle_power_usage + if(scrub_WaterVapor) + amount += idle_power_usage else //scrubbing == SIPHONING amount = active_power_usage @@ -123,6 +127,7 @@ "filter_n2o" = scrub_N2O, "filter_bz" = scrub_BZ, "filter_Freon" = scrub_Freon, + "filter_WaterVapor" = scrub_WaterVapor, "sigtype" = "status" ) @@ -218,6 +223,11 @@ filtered_out.gases["freon"][MOLES] = removed_gases["freon"][MOLES] removed.gases["freon"][MOLES] = 0 + if(scrub_Freon && removed_gases["water_vapor"]) + filtered_out.assert_gas("water_vapor") + filtered_out.gases["water_vapor"][MOLES] = removed_gases["water_vapor"][MOLES] + removed.gases["water_vapor"][MOLES] = 0 + removed.garbage_collect() //Remix the resulting gases @@ -303,6 +313,11 @@ if("toggle_freon_scrub" in signal.data) scrub_Freon = !scrub_Freon + if("water_vapor_scrub" in signal.data) + scrub_WaterVapor = text2num(signal.data["water_vapor_scrub"]) + if("toggle_water_vapor_scrub" in signal.data) + scrub_WaterVapor = !scrub_WaterVapor + if("init" in signal.data) name = signal.data["init"] return diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 6cdb1ce2b12..f679764fefa 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -85,7 +85,14 @@ desc = "Freon. Great for the atmosphere!" icon_state = "freon" gas_type = "freon" - starter_temp = 2.7 + starter_temp = 120 + +/obj/machinery/portable_atmospherics/canister/water_vapor + name = "water vapor canister" + desc = "Water Vapor. We get it, you vape." + icon_state = "water_vapor" + gas_type = "water_vapor" + filled = 1 /obj/machinery/portable_atmospherics/canister/New(loc, datum/gas_mixture/existing_mixture) ..() diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index 04cda991256..308daa43f2a 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -7,7 +7,7 @@ var/volume_rate = 1000 volume = 1000 - var/list/scrubbing = list("plasma", "co2", "n2o", "agent_b", "bz", "freon") + var/list/scrubbing = list("plasma", "co2", "n2o", "agent_b", "bz", "freon", "water_vapor") /obj/machinery/portable_atmospherics/scrubber/Destroy() var/turf/T = get_turf(src) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index b4ee5a8844d..9f0c803600f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1416,7 +1416,6 @@ if(-INFINITY to 120) H.throw_alert("temp", /obj/screen/alert/cold, 3) H.apply_damage(COLD_DAMAGE_LEVEL_3*coldmod, BURN) - H.apply_status_effect(/datum/status_effect/freon) else H.clear_alert("temp") diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 2ac3753795c..31136f8ab02 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -666,8 +666,8 @@ if (AM.density && AM.anchored) pressure_resistance_prob_delta -= 20 break - - ..(pressure_difference, direction, pressure_resistance_prob_delta) + if(!slipping) + ..(pressure_difference, direction, pressure_resistance_prob_delta) /mob/living/verb/resist() set name = "Resist" diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 83103ebf337..d33be72052d 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -71,3 +71,5 @@ var/blood_volume = 0 //how much blood the mob has var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override + + var/slipping = FALSE \ No newline at end of file diff --git a/icons/effects/tile_effects.dmi b/icons/effects/tile_effects.dmi index 2a62737820382582839e1ef168ad329ecad71a7c..3e86da783d351336dea99f0c01a7cb0ce8284a28 100644 GIT binary patch literal 2532 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 QJOBUy07*qoM6N<$f)@=N82|tP diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi index c70d01ab2e1998a16e8614857584416ab245ff3f..d2bb36cc0bf74219c294d8f03997c6ee2b23c974 100644 GIT binary patch literal 22502 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 Date: Tue, 30 Aug 2016 23:37:12 -0700 Subject: [PATCH 02/96] code memes --- code/modules/atmospherics/gasmixtures/gas_mixture.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 2d72f8cc43a..6f33ecff435 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -185,11 +185,14 @@ var/list/gaslist_cache = null if(cached_gases["freon"][MOLES] >= MOLES_PLASMA_VISIBLE) if(holder.freon_gas_act()) cached_gases["freon"][MOLES] -= MOLES_PLASMA_VISIBLE + if(temperature >= 3) + temperature -= 3 if(cached_gases["water_vapor"]) if(cached_gases["water_vapor"][MOLES] >= MOLES_PLASMA_VISIBLE) if(holder.water_vapor_gas_act()) cached_gases["water_vapor"][MOLES] -= MOLES_PLASMA_VISIBLE + temperature += 3 fuel_burnt = 0 if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) From 15eac23ac311b9f7062369f753514416b13143ca Mon Sep 17 00:00:00 2001 From: AndrewJacksonThe2nd Date: Wed, 31 Aug 2016 19:35:39 -0700 Subject: [PATCH 03/96] CHEMICAL GAS & Reworks --- code/datums/datumvars.dm | 1 + code/datums/gas_overrides.dm | 5 +- code/datums/recipe.dm | 6 +- code/game/atoms.dm | 3 - code/game/mecha/mech_fabricator.dm | 2 +- code/game/turfs/open.dm | 10 ++- .../environmental/LINDA_turf_tile.dm | 9 ++- .../atmospherics/gasmixtures/gas_mixture.dm | 58 ++++++++++++++++-- .../atmospherics/gasmixtures/gas_types.dm | 9 ++- .../atmospherics/machinery/airalarm.dm | 15 +++-- .../components/unary_devices/vent_scrubber.dm | 9 +++ .../machinery/portable/canister.dm | 21 +++++++ .../machinery/portable/scrubber.dm | 2 +- code/modules/reagents/chemistry/holder.dm | 25 +++++--- code/modules/research/designs.dm | 2 +- code/modules/research/rdconsole.dm | 2 +- icons/effects/tile_effects.dmi | Bin 2532 -> 2861 bytes tgstation.dme | 2 +- 18 files changed, 146 insertions(+), 35 deletions(-) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index f8f46c007d7..03c08a3a4e2 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -4,6 +4,7 @@ var/global/list/internal_byond_list_vars = list("contents" = TRUE, "verbs" = TRU /datum var/var_edited = 0 //Warrenty void if seal is broken + var/datum/reagents/reagents = null /datum/proc/on_varedit(modified_var) //called whenever a var is edited var_edited = 1 diff --git a/code/datums/gas_overrides.dm b/code/datums/gas_overrides.dm index c58d5ad176a..73f60b3a686 100644 --- a/code/datums/gas_overrides.dm +++ b/code/datums/gas_overrides.dm @@ -2,4 +2,7 @@ return 0 /datum/proc/water_vapor_gas_act() // We get it - return 0 // You vape \ No newline at end of file + return 0 // You vape + +/datum/proc/chem_gas_act(var/datum/reagents/gas) + return 0 \ No newline at end of file diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm index d3085976a18..3c94862ea2e 100644 --- a/code/datums/recipe.dm +++ b/code/datums/recipe.dm @@ -34,7 +34,7 @@ * */ /datum/recipe - var/list/reagents // example: = list("berryjuice" = 5) // do not list same reagent twice + var/list/reagents_list // example: = list("berryjuice" = 5) // do not list same reagent twice var/list/items // example: =list(/obj/item/weapon/crowbar, /obj/item/weapon/welder) // place /foo/bar before /foo var/result //example: = /obj/item/weapon/reagent_containers/food/snacks/donut var/time = 100 // 1/10 part of second @@ -49,7 +49,7 @@ . = -1 else return 0 - if ((reagents?(reagents.len):(0)) < avail_reagents.reagent_list.len) + if ((reagents_list?(reagents_list.len):(0)) < avail_reagents.reagent_list.len) return -1 return . @@ -112,7 +112,7 @@ . = possible_recipes[1] for (var/datum/recipe/recipe in possible_recipes) var/N_i = (recipe.items)?(recipe.items.len):0 - var/N_r = (recipe.reagents)?(recipe.reagents.len):0 + var/N_r = (recipe.reagents_list)?(recipe.reagents_list.len):0 if (N_i > i_count || (N_i== i_count && N_r > r_count )) r_count = N_r i_count = N_i diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 7a19a16a171..d6a8896a634 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -8,9 +8,6 @@ var/list/blood_DNA var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff. - ///Chemistry. - var/datum/reagents/reagents = null - //This atom's HUD (med/sec, etc) images. Associative list. var/list/image/hud_list = null //HUD images that this atom can provide. diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 70ed306061a..f923502ef4b 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -143,7 +143,7 @@ return resources /obj/machinery/mecha_part_fabricator/proc/check_resources(datum/design/D) - if(D.reagents.len) // No reagents storage - no reagent designs. + if(D.reagents_list.len) // No reagents storage - no reagent designs. return 0 if(materials.has_materials(get_resources_w_coeff(D))) return 1 diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index efd17e61da0..247bc7862a6 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -97,6 +97,12 @@ qdel(hotspot) return 1 +/turf/open/chem_gas_act(var/datum/reagents/gas) + for(var/A in contents) + gas.reaction(A, VAPOR) + gas.reaction(src, VAPOR) + return 1 + /turf/open/handle_fall(mob/faller, forced) faller.lying = pick(90, 270) if(!forced) @@ -118,8 +124,8 @@ return 0 if(!(lube&SLIDE_ICE)) C << "You slipped[ O ? " on the [O.name]" : ""]!" - - C.attack_log += "\[[time_stamp()]\] Slipped[O ? " on the [O.name]" : ""][(lube&SLIDE)? " (LUBE)" : ""]!" + if(!C.slipping) + C.attack_log += "\[[time_stamp()]\] Slipped[O ? " on the [O.name]" : ""][(lube&SLIDE)? " (LUBE)" : ""]!" if(!(lube&SLIDE_ICE)) playsound(C.loc, 'sound/misc/slip.ogg', 50, 1, -3) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 6391a9f1bbc..4e97ceb3686 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -110,10 +110,17 @@ /turf/open/proc/tile_graphic() . = new /list var/list/gases = air.gases + var/list/reagent_gas_memes = air.reagents.reagent_list for(var/id in gases) var/gas = gases[id] if(gas[GAS_META][META_GAS_OVERLAY] && gas[MOLES] > gas[GAS_META][META_GAS_MOLES_VISIBLE]) - . += gas[GAS_META][META_GAS_OVERLAY] + if(id == "chem_gas") + var/obj/effect/overlay/gas/G = gas[GAS_META][META_GAS_OVERLAY] + if(reagent_gas_memes.len) + G.color = mix_color_from_reagents(reagent_gas_memes) + . += G + else + . += gas[GAS_META][META_GAS_OVERLAY] /////////////////////////////SIMULATION/////////////////////////////////// diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 6f33ecff435..aa372e6ba2d 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -6,7 +6,7 @@ What are the archived variables for? #define MINIMUM_HEAT_CAPACITY 0.0003 #define QUANTIZE(variable) (round(variable,0.0000001))/*I feel the need to document what happens here. Basically this is used to catch most rounding errors, however it's previous value made it so that once gases got hot enough, most procedures wouldnt occur due to the fact that the mole counts would get rounded away. Thus, we lowered it a few orders of magnititude */ - +#define REAGENT_GAS_AMT 2.5 var/list/meta_gas_info = meta_gas_list() //see ATMOSPHERICS/gas_types.dm var/list/gaslist_cache = null @@ -49,6 +49,7 @@ var/list/gaslist_cache = null src.volume = volume last_share = 0 fuel_burnt = 0 + create_reagents(1000) //listmos procs @@ -185,14 +186,15 @@ var/list/gaslist_cache = null if(cached_gases["freon"][MOLES] >= MOLES_PLASMA_VISIBLE) if(holder.freon_gas_act()) cached_gases["freon"][MOLES] -= MOLES_PLASMA_VISIBLE - if(temperature >= 3) - temperature -= 3 if(cached_gases["water_vapor"]) if(cached_gases["water_vapor"][MOLES] >= MOLES_PLASMA_VISIBLE) if(holder.water_vapor_gas_act()) cached_gases["water_vapor"][MOLES] -= MOLES_PLASMA_VISIBLE - temperature += 3 + + if(cached_gases["chem_gas"]) + if(cached_gases["chem_gas"][MOLES] >= MOLES_PLASMA_VISIBLE) + holder.chem_gas_act(reagents) fuel_burnt = 0 if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) @@ -336,6 +338,13 @@ var/list/gaslist_cache = null var/list/cached_gases = gases //accessing datum vars is slower than proc vars var/list/giver_gases = giver.gases + + var/list/cached_reagents = giver.reagents.reagent_list + + for(var/R in cached_reagents) + var/datum/reagent/RA = R + if(!reagents.has_reagent(RA.id)) + reagents.add_reagent(RA.id, REAGENT_GAS_AMT) //gas transfer for(var/giver_id in giver_gases) assert_gas(giver_id) @@ -348,7 +357,7 @@ var/list/gaslist_cache = null amount = min(amount, sum) //Can not take more air than tile has! if(amount <= 0) return null - + var/list/cached_reagents = reagents.reagent_list var/list/cached_gases = gases var/datum/gas_mixture/removed = new var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars @@ -358,6 +367,12 @@ var/list/gaslist_cache = null removed.add_gas(id) removed_gases[id][MOLES] = QUANTIZE((cached_gases[id][MOLES] / sum) * amount) cached_gases[id][MOLES] -= removed_gases[id][MOLES] + for(var/R in cached_reagents) + var/datum/reagent/RA = R + var/temp_id = RA.id + var/mathmemes = QUANTIZE((RA.volume / reagents.total_volume) * amount) + reagents.remove_reagent(temp_id, mathmemes) + removed.reagents.add_reagent(temp_id, mathmemes) garbage_collect() return removed @@ -367,6 +382,8 @@ var/list/gaslist_cache = null return null ratio = min(ratio, 1) + var/list/cached_reagents = reagents.reagent_list + var/list/cached_gases = gases var/datum/gas_mixture/removed = new var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars @@ -376,12 +393,21 @@ var/list/gaslist_cache = null removed.add_gas(id) removed_gases[id][MOLES] = QUANTIZE(cached_gases[id][MOLES] * ratio) cached_gases[id][MOLES] -= removed_gases[id][MOLES] + + for(var/R in cached_reagents) + var/datum/reagent/RA = R + var/temp_id = RA.id + var/mathmemes = QUANTIZE(RA.volume * ratio) + reagents.remove_reagent(temp_id, mathmemes) + removed.reagents.add_reagent(temp_id, mathmemes) + garbage_collect() return removed /datum/gas_mixture/copy() var/list/cached_gases = gases + var/list/cached_reagents = reagents.reagent_list var/datum/gas_mixture/copy = new var/list/copy_gases = copy.gases @@ -389,17 +415,27 @@ var/list/gaslist_cache = null for(var/id in cached_gases) copy.add_gas(id) copy_gases[id][MOLES] = cached_gases[id][MOLES] + for(var/R in cached_reagents) + var/datum/reagent/RA = R + copy.reagents.add_reagent(RA.id, REAGENT_GAS_AMT) return copy /datum/gas_mixture/copy_from(datum/gas_mixture/sample) var/list/cached_gases = gases //accessing datum vars is slower than proc vars var/list/sample_gases = sample.gases + var/list/their_reagents = sample.reagents.reagent_list temperature = sample.temperature for(var/id in sample_gases) assert_gas(id) cached_gases[id][MOLES] = sample_gases[id][MOLES] + + reagents.clear_reagents() + for(var/R in their_reagents) + var/datum/reagent/RA = R + reagents.add_reagent(RA.id, REAGENT_GAS_AMT) + //remove all gases not in the sample cached_gases &= sample_gases @@ -433,6 +469,18 @@ var/list/gaslist_cache = null var/list/cached_gases = gases var/list/sharer_gases = sharer.gases + var/list/our_reagents = reagents.reagent_list + var/list/their_reagents = sharer.reagents.reagent_list + + for(var/R in our_reagents) + var/datum/reagent/RAO = R + if(!sharer.reagents.has_reagent(RAO.id)) + sharer.reagents.add_reagent(RAO.id, REAGENT_GAS_AMT) + + for(var/RA in their_reagents) + var/datum/reagent/RAT = RA + if(!reagents.has_reagent(RAT.id)) + reagents.add_reagent(RAT.id, REAGENT_GAS_AMT) var/temperature_delta = temperature_archived - sharer.temperature_archived var/abs_temperature_delta = abs(temperature_delta) diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm index e13256a2160..9eb68916c07 100644 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ b/code/modules/atmospherics/gasmixtures/gas_types.dm @@ -87,11 +87,18 @@ var/list/hardcoded_gases = list("o2","n2","co2","plasma") //the main four gases, specific_heat = 20 name = "BZ" +/datum/gas/chem_gas + id = "chem_gas" + specific_heat = 20 + name = "Chemicals" + gas_overlay = "chem_gas" + moles_visible = MOLES_PLASMA_VISIBLE + /obj/effect/overlay/gas/ icon = 'icons/effects/tile_effects.dmi' mouse_opacity = 0 layer = FLY_LAYER - appearance_flags = RESET_COLOR|TILE_BOUND + appearance_flags = TILE_BOUND /obj/effect/overlay/gas/New(state) . = ..() diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 0d0212114ca..e5e3488baac 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -79,6 +79,7 @@ "bz" = new/datum/tlv(-1, -1, 0.2, 0.5), "freon" = new/datum/tlv(-1, -1, 0.2, 0.5), "water_vapor" = new/datum/tlv(-1, -1, 0.2, 0.5), + "chem_gas" = new/datum/tlv(-1, -1, 0.2, 0.5) ) /obj/machinery/airalarm/server // No checks here. @@ -92,7 +93,8 @@ "n2o" = new/datum/tlv(-1, -1, -1, -1), "bz" = new/datum/tlv(-1, -1, -1, -1), "freon" = new/datum/tlv(-1, -1, -1, -1), - "water_vapor" = new/datum/tlv(-1, -1, -1, -1) + "water_vapor" = new/datum/tlv(-1, -1, -1, -1), + "chem_gas" = new/datum/tlv(-1, -1, -1, -1) ) /obj/machinery/airalarm/kitchen_cold_room // Copypasta: to check temperatures. @@ -106,7 +108,8 @@ "n2o" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa "bz" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa "freon" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa - "water_vapor" = new/datum/tlv(-1, -1, 0.2, 0.5) + "water_vapor" = new/datum/tlv(-1, -1, 0.2, 0.5), + "chem_gas" = new/datum/tlv(-1, -1, 0.2, 0.5) ) //all air alarms in area are connected via magic @@ -241,7 +244,8 @@ "filter_n2o" = info["filter_n2o"], "filter_bz" = info["filter_bz"], "filter_freon" = info["filter_freon"], - "filter_water_vapor" = info["filter_water_vapor"] + "filter_water_vapor" = info["filter_water_vapor"], + "filter_chem_gas" = info["filter_chem_gas"] )) data["mode"] = mode data["modes"] = list() @@ -297,7 +301,7 @@ if(usr.has_unlimited_silicon_privilege && !wires.is_cut(WIRE_IDSCAN)) locked = !locked . = TRUE - if("power", "co2_scrub", "tox_scrub", "n2o_scrub", "bz_scrub", "freon_scrub","water_vapor_scrub", "widenet", "scrubbing") + if("power", "co2_scrub", "tox_scrub", "n2o_scrub", "bz_scrub", "freon_scrub","water_vapor_scrub", "chem_gas_scrub", "widenet", "scrubbing") send_signal(device_id, list("[action]" = text2num(params["val"]))) . = TRUE if("excheck") @@ -416,6 +420,7 @@ "n2o_scrub" = 0, "bz_scrub" = 1, "freon_scrub"= 1, + "chem_gas_scrub"= 0, // set to contaminated to scrub this shit "water_vapor_scrub"= 1, "scrubbing" = 1, "widenet" = 0, @@ -435,6 +440,7 @@ "n2o_scrub" = 1, "bz_scrub" = 1, "freon_scrub"= 1, + "chem_gas_scrub"= 1, "water_vapor_scrub"= 1, "scrubbing" = 1, "widenet" = 1, @@ -467,6 +473,7 @@ "n2o_scrub" = 0, "bz_scrub" = 0, "freon_scrub"= 1, + "chem_gas_scrub"= 0, "water_vapor_scrub"= 1, "scrubbing" = 1, "widenet" = 0, diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index d34f7231d7b..a76e245c9f8 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -22,6 +22,7 @@ var/scrub_BZ = 0 var/scrub_Freon = 1 var/scrub_WaterVapor = 1 + var/scrub_ChemGas = 1 var/volume_rate = 200 @@ -76,6 +77,8 @@ amount += idle_power_usage if(scrub_WaterVapor) amount += idle_power_usage + if(scrub_ChemGas) + amount += idle_power_usage else //scrubbing == SIPHONING amount = active_power_usage @@ -128,6 +131,7 @@ "filter_bz" = scrub_BZ, "filter_Freon" = scrub_Freon, "filter_WaterVapor" = scrub_WaterVapor, + "filter_ChemGas" = scrub_ChemGas, "sigtype" = "status" ) @@ -318,6 +322,11 @@ if("toggle_water_vapor_scrub" in signal.data) scrub_WaterVapor = !scrub_WaterVapor + if("chem_gas_scrub" in signal.data) + scrub_ChemGas = text2num(signal.data["chem_gas_scrub"]) + if("toggle_chem_gas_scrub" in signal.data) + scrub_ChemGas = !scrub_ChemGas + if("init" in signal.data) name = signal.data["init"] return diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index f679764fefa..505900bda32 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -94,6 +94,13 @@ gas_type = "water_vapor" filled = 1 +/obj/machinery/portable_atmospherics/canister/chem_gas + name = "chemical gas canister" + desc = "Chemical Gas. Hit this with a beaker with reagents to add the reagent to the gas." + icon_state = "black" + gas_type = "chem_gas" + filled = 1 + /obj/machinery/portable_atmospherics/canister/New(loc, datum/gas_mixture/existing_mixture) ..() if(existing_mixture) @@ -260,6 +267,20 @@ take_damage(rand(15, 40), BRUTE, 0) /obj/machinery/portable_atmospherics/canister/attacked_by(obj/item/I, mob/user) + if(istype(I, /obj/item/weapon/reagent_containers/glass)) + if(air_contents.gases["chem_gas"]) + if(I.reagents.reagent_list) + user << "You scan the beaker with the canister." + for(var/R in I.reagents.reagent_list) + var/datum/reagent/RI = R + if(!air_contents.reagents.has_reagent(RI.id)) + air_contents.reagents.add_reagent(RI.id, REAGENT_GAS_AMT) + say("Injected [RI.name].") + say("All new chemicals scanned and injected.") + return + else + say("ERROR: Does not contain chemical mixture gas.") + return if(I.force) user.visible_message("[user] has hit [src] with [I]!", "You hit [src] with [I]!") investigate_log("was smacked with \a [I] by [key_name(user)].", "atmos") diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index 308daa43f2a..bc8b96713fb 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -7,7 +7,7 @@ var/volume_rate = 1000 volume = 1000 - var/list/scrubbing = list("plasma", "co2", "n2o", "agent_b", "bz", "freon", "water_vapor") + var/list/scrubbing = list("plasma", "co2", "n2o", "agent_b", "bz", "freon", "water_vapor", "chem_gas") /obj/machinery/portable_atmospherics/scrubber/Destroy() var/turf/T = get_turf(src) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 62f8a1ceec0..e3a16c57913 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -424,16 +424,17 @@ var/const/INJECT = 5 //injection for(var/_reagent in reagent_list) var/datum/reagent/R = _reagent if(R.id == reagent) - if(istype(my_atom, /mob/living)) + if(my_atom && istype(my_atom, /mob/living)) var/mob/living/M = my_atom R.on_mob_delete(M) qdel(R) reagent_list -= R update_total() - my_atom.on_reagent_change() - check_ignoreslow(my_atom) - check_gofast(my_atom) - check_goreallyfast(my_atom) + if(my_atom) + my_atom.on_reagent_change() + check_ignoreslow(my_atom) + check_gofast(my_atom) + check_goreallyfast(my_atom) return 1 /datum/reagents/proc/check_ignoreslow(mob/M) @@ -506,7 +507,8 @@ var/const/INJECT = 5 //injection if (R.id == reagent) R.volume += amount update_total() - my_atom.on_reagent_change() + if(my_atom) + my_atom.on_reagent_change() R.on_merge(data) if(!no_react) handle_reactions() @@ -524,7 +526,8 @@ var/const/INJECT = 5 //injection R.on_new(data) update_total() - my_atom.on_reagent_change() + if(my_atom) + my_atom.on_reagent_change() if(!no_react) handle_reactions() return 0 @@ -556,7 +559,8 @@ var/const/INJECT = 5 //injection update_total() if(!safety)//So it does not handle reactions when it need not to handle_reactions() - my_atom.on_reagent_change() + if(my_atom) + my_atom.on_reagent_change() return 0 return 1 @@ -658,8 +662,9 @@ var/const/INJECT = 5 //injection // Convenience proc to create a reagents holder for an atom // Max vol is maximum volume of holder -/atom/proc/create_reagents(max_vol) +/datum/proc/create_reagents(max_vol) if(reagents) qdel(reagents) reagents = new/datum/reagents(max_vol) - reagents.my_atom = src + if(istype(src, /atom)) + reagents.my_atom = src diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 2e364b7e72f..8b304469259 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -37,7 +37,7 @@ other types of metals and chemistry for reagents). var/build_path = null //The file path of the object that gets created var/list/make_reagents = list() //Reagents produced. Format: "id" = amount. Currently only supported by the biogenerator. var/list/category = null //Primarily used for Mech Fabricators, but can be used for anything - var/list/reagents = list() //List of reagents. Format: "id" = amount. + var/list/reagents_list = list() //List of reagents. Format: "id" = amount. var/maxstack = 1 diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 1930b09d148..ee9fc9a6d0d 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -256,7 +256,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/datum/design/D = files.known_designs[href_list["copy_design_ID"]] if(D) var/autolathe_friendly = 1 - if(D.reagents.len) + if(D.reagents_list.len) autolathe_friendly = 0 D.category -= "Imported" else diff --git a/icons/effects/tile_effects.dmi b/icons/effects/tile_effects.dmi index 3e86da783d351336dea99f0c01a7cb0ce8284a28..0bd03133ea129e9001c1543934cd92fca59c57b3 100644 GIT binary patch literal 2861 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 Date: Wed, 31 Aug 2016 19:55:26 -0700 Subject: [PATCH 04/96] Adds Chem Gas and Water Vapor to the map. --- _maps/map_files/MetaStation/MetaStation.dmm | 67 ++++++++----------- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 32 ++++----- 2 files changed, 42 insertions(+), 57 deletions(-) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 68ee5f769bb..8529de15843 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -35087,6 +35087,7 @@ d2 = 8; icon_state = "4-8" }, +/obj/machinery/portable_atmospherics/canister/water_vapor, /mob/living/simple_animal/hostile/lizard{ name = "Wags-His-Tail"; real_name = "Wags-His-Tail" @@ -49959,6 +49960,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/portable_atmospherics/canister/chem_gas, /turf/open/floor/plasteel/loadingarea{ dir = 4 }, @@ -49967,6 +49969,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/portable_atmospherics/canister/chem_gas, /turf/open/floor/plasteel, /area/atmos) "bHP" = ( @@ -67516,44 +67519,13 @@ /turf/open/floor/plasteel/white, /area/medical/chemistry) "cmh" = ( +/obj/machinery/portable_atmospherics/canister/chem_gas, /turf/open/floor/plasteel/whiteyellow/side{ dir = 4 }, /area/medical/chemistry) "cmi" = ( -/obj/item/device/assembly/timer{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/device/assembly/timer{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/device/assembly/igniter{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/device/assembly/igniter{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/device/assembly/igniter{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/device/assembly/igniter{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/device/assembly/timer{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/device/assembly/timer{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/structure/table/glass, +/obj/machinery/portable_atmospherics/canister/chem_gas, /turf/open/floor/plasteel/whiteyellow{ dir = 4 }, @@ -68354,6 +68326,22 @@ dir = 1; pixel_y = -24 }, +/obj/item/device/assembly/igniter{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/item/device/assembly/igniter{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/item/device/assembly/timer{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/device/assembly/timer{ + pixel_x = -3; + pixel_y = 3 + }, /turf/open/floor/plasteel/whiteyellow{ dir = 4 }, @@ -73107,7 +73095,7 @@ /obj/structure/sign/nosmoking_2{ pixel_y = 32 }, -/obj/machinery/portable_atmospherics/canister/bz, +/obj/machinery/portable_atmospherics/canister/chem_gas, /turf/open/floor/plasteel/warning{ dir = 5 }, @@ -74106,7 +74094,6 @@ "cxg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, -/obj/machinery/portable_atmospherics/canister/freon, /turf/open/floor/plasteel/warning{ dir = 4 }, @@ -75370,7 +75357,7 @@ /obj/machinery/light_switch{ pixel_y = -23 }, -/obj/machinery/portable_atmospherics/canister/bz, +/obj/machinery/portable_atmospherics/canister/chem_gas, /turf/open/floor/plasteel/warning{ dir = 10 }, @@ -90646,8 +90633,10 @@ }, /area/shuttle/transport) "cZx" = ( -/turf/closed/wall/mineral/titanium/overspace, -/area/shuttle/abandoned) +/turf/open/floor/plasteel/warning{ + dir = 8 + }, +/area/toxins/storage) "cZy" = ( /turf/open/floor/plating/warnplate{ dir = 1 @@ -127416,7 +127405,7 @@ cta cuf cvs cwj -cxf +cZx cxf czi cud diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 602803562ed..5c089421b6f 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -5736,7 +5736,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/portable_atmospherics/canister/bz, +/obj/machinery/portable_atmospherics/canister/chem_gas, /turf/open/floor/plasteel, /area/atmos) "alY" = ( @@ -7375,13 +7375,9 @@ /turf/closed/wall/mineral/titanium/overspace, /area/shuttle/pod_1) "apG" = ( -/turf/open/space, -/turf/closed/wall/shuttle{ - dir = 2; - icon_state = "swall_f10"; - layer = 2 - }, -/area/shuttle/pod_1) +/obj/machinery/portable_atmospherics/canister/water_vapor, +/turf/open/floor/plasteel, +/area/janitor) "apH" = ( /obj/structure/grille, /obj/structure/window/shuttle, @@ -25819,6 +25815,7 @@ dir = 4; icon_state = "pipe-c" }, +/obj/machinery/portable_atmospherics/canister/chem_gas, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bgQ" = ( @@ -29026,12 +29023,7 @@ "bnD" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/table, -/obj/item/weapon/book/manual/wiki/chemistry, -/obj/item/weapon/book/manual/wiki/chemistry{ - pixel_x = 3; - pixel_y = 3 - }, +/obj/machinery/portable_atmospherics/canister/chem_gas, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bnE" = ( @@ -29941,6 +29933,10 @@ /obj/structure/table, /obj/item/weapon/hand_labeler, /obj/item/stack/packageWrap, +/obj/item/weapon/book/manual/wiki/chemistry{ + pixel_x = 3; + pixel_y = 3 + }, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bpu" = ( @@ -36609,7 +36605,7 @@ scrub_N2O = 0; scrub_Toxins = 0 }, -/obj/machinery/portable_atmospherics/canister/freon, +/obj/machinery/portable_atmospherics/canister/chem_gas, /turf/open/floor/plasteel/floorgrime, /area/toxins/storage) "bCY" = ( @@ -37059,7 +37055,7 @@ icon_state = "4-8"; pixel_y = 0 }, -/obj/machinery/portable_atmospherics/canister/freon, +/obj/machinery/portable_atmospherics/canister/chem_gas, /mob/living/simple_animal/mouse, /turf/open/floor/plasteel/floorgrime, /area/toxins/storage) @@ -41836,7 +41832,7 @@ name = "Station Intercom (General)"; pixel_x = -30 }, -/obj/machinery/portable_atmospherics/canister/bz, +/obj/machinery/portable_atmospherics/canister/chem_gas, /turf/open/floor/plasteel, /area/atmos) "bNQ" = ( @@ -91946,7 +91942,7 @@ aLY aLY bBx bCv -bDL +apG bFk bDs bCv From 56bf06c2553294f41d0ab40eeab0139aa1051bf1 Mon Sep 17 00:00:00 2001 From: AndrewJacksonThe2nd Date: Wed, 31 Aug 2016 20:09:53 -0700 Subject: [PATCH 05/96] iudehjbkwedjkhbwjbh --- tgstation.dme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tgstation.dme b/tgstation.dme index 0c06e568320..3487e60a3af 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -14,7 +14,7 @@ // BEGIN_INCLUDE #include "_maps\__MAP_DEFINES.dm" -#include "_maps\testmap.dm" +#include "_maps\tgstation2.dm" #include "code\_compile_options.dm" #include "code\hub.dm" #include "code\world.dm" From ad66c15ac727b9fef8299aa2e345d2d89e6b589e Mon Sep 17 00:00:00 2001 From: GunHog Date: Thu, 1 Sep 2016 13:55:06 -0500 Subject: [PATCH 06/96] Ghosts may now examine silicons to read their laws! - Examining an AI or Cyborg as a ghost now displays its laws. --- code/modules/mob/living/silicon/ai/examine.dm | 4 +++- code/modules/mob/living/silicon/examine.dm | 4 ++++ code/modules/mob/living/silicon/robot/examine.dm | 2 ++ tgstation.dme | 1 + 4 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 code/modules/mob/living/silicon/examine.dm diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index a47c0e8293c..b7980140e2c 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -19,4 +19,6 @@ msg += "[src]Core.exe has stopped responding! NTOS is searching for a solution to the problem...\n" msg += "*---------*" - user << msg \ No newline at end of file + user << msg + + ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/examine.dm b/code/modules/mob/living/silicon/examine.dm new file mode 100644 index 00000000000..ab04306d11f --- /dev/null +++ b/code/modules/mob/living/silicon/examine.dm @@ -0,0 +1,4 @@ +/mob/living/silicon/examine(mob/user) //Displays a silicon's laws to ghosts + if(laws && isobserver(user)) + user << "[src] has the following laws:" + laws.show_laws(user) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index 81e0365ba06..44eb229d7ba 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -47,3 +47,5 @@ msg += "*---------*" user << msg + + ..() \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 3487e60a3af..898bd7e9fb8 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1392,6 +1392,7 @@ #include "code\modules\mob\living\carbon\monkey\punpun.dm" #include "code\modules\mob\living\carbon\monkey\update_icons.dm" #include "code\modules\mob\living\silicon\death.dm" +#include "code\modules\mob\living\silicon\examine.dm" #include "code\modules\mob\living\silicon\laws.dm" #include "code\modules\mob\living\silicon\login.dm" #include "code\modules\mob\living\silicon\say.dm" From 4cb3ff593e0235abba3984efbdb5a071a32188ba Mon Sep 17 00:00:00 2001 From: XDTM Date: Thu, 1 Sep 2016 21:22:15 +0200 Subject: [PATCH 07/96] Epinephrine to potassium iodide --- code/game/machinery/computer/dna_console.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index fdc6d980933..7df6df63362 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -96,7 +96,7 @@ occupant_status += "" occupant_status += "

Health:
[viable_occupant.health] %
" occupant_status += "
Radiation Level:
[viable_occupant.radiation] %
" - var/rejuvenators = viable_occupant.reagents.get_reagent_amount("epinephrine") + var/rejuvenators = viable_occupant.reagents.get_reagent_amount("potass_iodide") occupant_status += "
Rejuvenators:
[rejuvenators] units
" occupant_status += "
Unique Enzymes :
[viable_occupant.dna.unique_enzymes]
" occupant_status += "
Last Operation:
[last_change ? last_change : "----"]
" @@ -350,9 +350,9 @@ current_screen = href_list["text"] if("rejuv") if(viable_occupant && viable_occupant.reagents) - var/epinephrine_amount = viable_occupant.reagents.get_reagent_amount("epinephrine") - var/can_add = max(min(REJUVENATORS_MAX - epinephrine_amount, REJUVENATORS_INJECT), 0) - viable_occupant.reagents.add_reagent("epinephrine", can_add) + var/potassiodide_amount = viable_occupant.reagents.get_reagent_amount("potass_iodide") + var/can_add = max(min(REJUVENATORS_MAX - potassiodide_amount, REJUVENATORS_INJECT), 0) + viable_occupant.reagents.add_reagent("potass_iodide", can_add) if("setbufferlabel") var/text = sanitize(input(usr, "Input a new label:", "Input an Text", null) as text|null) if(num && text) From f3de290b00b7b2f7e294276ef80316a4d5727630 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Thu, 1 Sep 2016 13:45:56 -0700 Subject: [PATCH 08/96] >there's already a global list named uplink items this should fix the memes --- code/modules/cargo/packs.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 81fab5def1a..444b71099cd 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -153,8 +153,6 @@ dangerous = TRUE /datum/supply_pack/emergency/syndicate/fill(obj/structure/closet/crate/C) - var/static/list/uplink_items = get_uplink_items() - var/crate_value = 50 while(crate_value) var/category = pick(uplink_items) From a6b3f3dc6e392f3af909fe9e63d20d4f9f2a4c01 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Thu, 1 Sep 2016 18:45:36 -0400 Subject: [PATCH 09/96] Fixes beam-using projectiles runtiming if shooting a target adjacent to the firer --- .../mining/lavaland/necropolis_chests.dm | 18 +++++++++++------- code/modules/projectiles/projectile/energy.dm | 9 +++++---- icons/obj/lavaland/artefacts.dmi | Bin 9381 -> 7882 bytes 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index abcc8e7521b..02c5381b50d 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -193,19 +193,23 @@ weaken = 3 var/chain -/obj/item/ammo_casing/magic/hook/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") +/obj/item/projectile/hook/fire(setAngle) + if(firer) + chain = Beam(firer, icon_state = "chain", icon = 'icons/obj/lavaland/artefacts.dmi', time = INFINITY, maxdistance = INFINITY) ..() - var/obj/item/projectile/hook/P = BB - spawn(1) - P.chain = P.Beam(user,icon_state="chain",icon = 'icons/obj/lavaland/artefacts.dmi',time=1000, maxdistance = 30) /obj/item/projectile/hook/on_hit(atom/target) . = ..() if(isliving(target)) var/mob/living/L = target - L.visible_message("[L] is snagged by [firer]'s hook!") - L.forceMove(get_turf(firer)) - qdel(chain) + if(!L.anchored) + L.visible_message("[L] is snagged by [firer]'s hook!") + L.forceMove(get_turf(firer)) + +/obj/item/projectile/hook/Destroy() + qdel(chain) + return ..() + //Immortality Talisman /obj/item/device/immortality_talisman diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index ce5682ecb73..6c41ca751d7 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -177,14 +177,15 @@ icon_state = "purple_laser" var/chain -/obj/item/ammo_casing/energy/shock_revolver/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") +/obj/item/projectile/energy/shock_revolver/fire(setAngle) + if(firer) + chain = Beam(firer, icon_state = "lightning[rand(1, 12)]", icon = 'icons/effects/effects.dmi', time = INFINITY, maxdistance = INFINITY) ..() - var/obj/item/projectile/hook/P = BB - spawn(1) - P.chain = P.Beam(user,icon_state="purple_lightning",icon = 'icons/effects/effects.dmi',time=1000, maxdistance = 30) /obj/item/projectile/energy/shock_revolver/on_hit(atom/target) . = ..() if(isliving(target)) tesla_zap(src, 3, 10000) + +/obj/item/projectile/energy/shock_revolver/Destroy() qdel(chain) diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi index 9123949dc7cbbc63dedf676a3b010c38ce67283c..7c5458e1d84fb24da3d7b22f101d425c33777db5 100644 GIT binary patch literal 7882 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 literal 9381 zcmWk!1ymGk6dsoDlCGsox_glhX(W_RK>_Jz3F+~rw1tzI<7Wrw&-Qiz z;GUT@S&bFIiG#G>i0=1{Vwj3Lp^YP30f$Ec$`83Mimf)Qp;J)@woA>um^RP)}rta{eBX zm1j#_kF_KuM^SI7P5p@?j(73KaZA5fFHn{p494hQH=AG=40Ubop^ z3`2AYoTzlvy+I<$O1x+cAW0eKIJBETo;G5CDZRXYA&Z^Y=Vd#V5m0%w|I#igDxwkV zBvL=*3zw{`Mlt+7M2{*t=mMro7+SVEyLskX=%J%CXK#WIo%u8J)N&lH)cSgr-&C~C ziF}!_Fd&w3E-o(4y}#Ns8;GXRtuaS+JzWm_^GAc9+^nRmtROxWl%VoFNL`waf6!uJ`bHIRG+V({_bYO_J}uWRjD0OaD?ZN-HM z9vVd^Ap1T*9V8vLxTw$MmO-b0kf}4MmRD952?yPDJ#9W>PtM37yYY}k#i2iKyE8-r zO9u=OD}u&Z&6%pqhvMNx=B;svkvB0rP5U57dEfM)I&%_YZ#Ah9kBmGmba&uGZP5r> zVb+p3N`xcE(}n&2^QK9w8Uv#K6hR?gcI^2ai0mt7?iP^uFS^C3_aWs29w2&NDM5TG zQe9GVun-UsuotXv_xUsP(XgDFmzS6PeKlQv9t||_U&!hMPE#Jz@x>bWs&j9p0h0mu zOiXu1DDu)Cm(n2#k0_)5e zYcIT8zMCXt(0PgJ)Dp2Xb3$0@h^_VFIxTDaT)aCF ztUrrI?3}g2y?Ni$%;q;x>b4rb7$ecO0$7HV0x0@{Y<_YT#a-cfp9MdOB4^Lle#2Cj zEG%7JPF5gb*tN1dx%CkoJtQ-=OTg4`Qs*fOPt(EZ zdbSz`OI}GKw>l;c4#q5%ko0uYbWW3Z%H}cFgjII)R`T=vRn6{LSOPO!vm*A0I9g9; zjVnO}A77$p`<$xstVtWRC?F~tj&IEl@LLq;B+XRhzU|oXYEkvWQ~;r{yfn1Mm?-t5 zz0s+Vg^4b1Hbal+c0|(hr6V3z1_P~E<01vq2eGhh&&}+vqsZ<$u9t{mtjCg+IK9994jK$g_D75OP z|BQx_nS`BWKamcAcooqmS6^eMPylMzJ6AYDST)6%xEuXz_A(l>Smqt*@kRK+U{PeoN?^d>9FiB@+!jkeF$%1)I66A+XSuCXgRM#Ogv4pk&#zW;;DAVBip4CII+3iZmHIkzmh!RIw*}bMNz` zrp8fz=LRu*Z^32WAf%yz|I704xL?11(YPw$wg7S|-I&4@k-`SnOG@aKk^zR;A=6=4 zMLdhua!4r@73__9(`30k#8MfAl)k8*W}wV0EI|s2K-vyu78VxycsfN@)et%b-cPfT zjmZP&FMZ(zutm`G+PZf@Mj9$$$Kl(5ipP2A)(^JSk{h$%_kzUYKct`ZmNhRS+NK? zJ(Q*#jQi_?OEX{Be)LCEh^T$|z)zmX0qrxDl#+r!cJ=Cbl)d4tV#I|xESi_kb%{T9 zUjZRXHn4D!7S@*eZES6)CMO~PV~!>oXD}_UGgn=Gy(A7os&b+4T~sN}e#vanzDsNIy&A>p+yvD}HhQ^UcTU(pg=fPRGe9kusI}#7fj-ky^#kvx4 zd3hNTpZn`q_*+7B2G#7yr>CdTaSF}%>+&J-7#iIEQtEj9SE3)AotYKlrM+&C;efv< zw|4%9CMMMVktFaLWBn>Q;uKRJaxhp7uBCgM2xVbss9nHNe(Rea6jo<7oCS_X*dd-wkR z`(g|yvJHQEm@K%IvlUJ}TwFMq)0Ox$Fk$9YEqq~OVL8<7+S%Eub3XVp@`ox~TKWw_ z^CxzjFJF#z?$KbDGcht+&ES1P+800}m+%$kv^t(Clv3*><+T2e8VB&l`r~<&fEM{-uBS}<6tLK`%?r4V} zWqVZud{K=Xmp1MmO{#TGg_q;kO<`P>kcePAtXag)Gf zMSY-$4w=7`l9F0}A1d{IEJGk+U<)-#df^LyrlEIyR+62jL9|^bUG1%K*9&GoW zg^Oox5)%`H!fAVc{0`2`qp4Z=veKXwFJ0O3A`E-fb%E)%@#f~du+TJPHoU*TKlQDo zG~s%*$f+@946grl=G&Pupg-;e1%K6c-i-D=I1d zm_EpB_UfUsOdH$%iyWDYczCbpz5+~KDKnEsg&?RD;Tu*G0S*}}l+BM@k~6CCNvG2l z&i2bfuP~Dj^)DV4mh3y81NIJK${o9k@Pi;WEWU2L7;^=MNNa8enp>?NF|tmWTm(U|zZMb_8XOr3 zT(LWwMd%N>y}dhb6bRioX5W5IL45k^&2T z6}?h&Zjqx$ww2%G(wdr@S|=JBT6Toi{f1lZ^g+;&c|c34#Po?P%o>-g=c#RwDGe+n zWfc`zFbBaBMx8@(lBoN+08jKr+kvEVbZ%~L@~GVs(Wh(2QC&s`kwH1NGZEQHj0*a_ za<>FLN5A6Ft~2T4wshj!nwA}HM26wcBPM1(mB;mrX3CD5!D#|=YWf5(?!v;#YGz?! zp^Tc1ls{QhRaN!zCVqa;?EClcxGvKy_W=&qyZ>iR+B=Yi{?UayJBp*3|MWrc*w~nR zb1lArfPfsueF$wu-eio#OX}`;me*05CINWg$WGrNrz4D(2AzR1j;`Mw$Qxl;wGT0;gQQllQ)?s%O7AXu6tJN1@@Wx z&)W3CFar*NbvH~*%=5?R*yazAmc48*UD4WX_bDDi!1U@FEw2GcS=4WeqlrJ*JeV#@ zQz?>yZ9(9=7{fMXDtk))t>VO->EO6voPV{A{Qc=iFX&?V8G^ySu3CvAU#i67uNhJJV5_T^Hsl<$F|2rRl(m|$Rr z2}hb}7$B-UtZgmOihi; zCx=bTwGat?0{{gdd5H8z`@`LL8imCW*4rx@IZ|)ZyQn++5?_}dJYg*o^X4ZeFY1G) zuiqtdAi_tZ1?4RUW$09DmHhpe%ftZmH#WBQMpHN3WX5SgploT&>GjYemFFk+(M&$t z_Wooznob!5h~F^s!>MY_JcV@L)5|t?orwF*P6{)RNK3}0#KP|fF~EI8r!m;uA?30b zS8Gxc>WeTq@42kP%=dNFCh9}Te50ZF$?Hq3-TR{(m%30vB;vA{>k%1oK)xMNRu~Gu zRL%B$iM#tEPI2hh6h!WSRa&e!TDS$MfZQic`F*fEmjFDV1{8GM`jnOD{<*A~5Jqkq zUz`DIL=67mcP}9XRFgM9iN;HBhUUmD4Mng4ZbnsRcaNTDC1&+=6LM&y1tpD#)FTUF zrzt;k#Sd}_8nhNzcXk#nnL0Fm`Ki!lo<|Y09DPB!f?o4>>+OKa@UtI7#|mXV+3#Y+ z!8MnGMYgkObnToEIyz<Cycx7e=b7wz zqbui6Kjs8XEA+n^JC#%IVvoh`)!*q1HCyg-ybb~>cFr+b$_sFxq}_omulY=AL>Le-fkH??rDIs)-ErYh|>-yH*1F(3nCCBz$rU z{Wm^<_3x)f0r%*xBkayt<98aC*|t+-5w9NqCZ}#TUU4z@YrH5QGrZd6hDttL-=RTL z7j$66LAC5{zLlRVx(n_PN&qiGGw*>NAt9`x!VoLL5HoJiSOKLUM_SS+A`hjX7)$JN zt5_aK9U~StDy#n(E>QWkb>oSJz`n2uer$~Bx(M4@(f$ASAr5O7Y^xL@@;h=O&mzuw zB=K~#M#VB$aX!trSo7MYbFT-7FVT-{a=wb1HKXSTZ>xx*ua9REzGoLHuTV6%{1bp=jaD4S~KkHYjooZq=MPuzjY*wOZTbFbq3e)lni3;Gm4ry^A^ z9?`txBMDou55jD4aOo646IVY@kYC-g3tx_RLIb)(Q75O-T7S)g0K-`uf5|~0IA4Hu zGUZ7(UgA!oo%&kl>+(6q%HxQU%j0IhB|E4J1^JFj+z&nd&&Eu8+}~?Hz}PjJ;3k0N zJs&b$rcSFqy;R=%!JjfSW3CLAFXhp%p|>I^2q3kR=2E3(3(o#rjgn@)kn{Ox>fLbg z|By93jqI{2Mt~s~#}`topS_4epRK1dq~_ZYWU^J+X4Kt>2k&Z$!9u z|Gut9(Jkuc{YfnG+LNP0^vP-KusJ`3%j8h`*z@Ry>Qkh(&;J{_Ya0N{r-$C}DIvp4 z2(E~)+Gu_ZQF>|Xcp_N(y+Hyx&&ESnZrUlLGO*|80)7|TcHjj`pc^lA4M=sCcer~8 zs#Hp}UY%985to07-dewVgmamk7sz&^9dq7rR*OfqqA-*e9tbU^kv~wSf)PN6dnp5q znr}Tki4r%8?roF+B%KeRE$ZgS$>+IIHDCcB&4Wg!bXv+@;s!r752e-+(GN_l#c-&# z;yVh14~2LzF6X^bwk#cX=w=NNm~`DlzI|ueU8IuZ-R0W_aEqtjkh)F>`sFp|JfNm~ zix&{{0YC>GJUP`9S+G0|!u8%X!_ZGkAG;X5j22m-QB@(=`Am~8*YmADnBsrLEl#S0 zPDqyzb(RQcs5wB)d<><01eYUdHri@ev1fxhl_`X~S$ zbbjICzNK2>M&`niD@c}qh{(VvwDor~nQ~HUl-IwVZ!)8JY=rAk0o1_1kytGpjRTYu z$BCaJnaY*aZLrkl=;q+go#P-<&}6vNQ%zb&+%DQHQ-fb7$0-7TRT=F-2XvfRk$m`^ zgpif}UzP^MzMv`$0&|8yRO!TV$WSBz{U$ny0S*MvnprezjX!9cD|!;hqr6bttCc8A z(Q(|`CSXr^*^VUgT@n2}yZJkf#XWO@;2Z}oI$Bq!!SKT9Bu3!umv7)yo?QVC$T5mga}UCOO*zh9t{f!AU%z z5ZuJnrgV=7uX#a4v5eAL^%02Iri`B^iT(4_n-*R$n&~4*nS6_MhVBXuf{ruMsfBS| zhC)mq`{Iq2sDOZg!a1^gyyhz*5}{fuL|y+N+#!f%xgNNO2tjc@t3u)|aDuFG8r=W% z-(Upv^f=cw6D!SfrI9SRAuO_&yr^p5po4I}SiL;myzeGGvl@+Sl#OM>hy<)g(=Q^9 zC)yK91sR&WvshKQPGf=n@r3V*eq;VWIyRNidrm>)89ub|qvT9+=;@wp$d=o16sk3b zG6lO`%b>{;q+C##sQk8n#jEnR)Iob!5T5|RanG@9p6lhqD*7IVztcqmPN{` zCzB{gr^*O9)o33K6q1QYM^P&Uq9F2{aFPH%B4-W~XR-T5TQy>>{k>kN>av?XUZwZx zMD~Qd;W2z<_m&q7jWwRzl@e}*uSP10lp&Gz84V&B09aXE5 z=5-%jiO0B`yRFrTEfs*IGTFg3m3TiU7I`wyeOiU2Op%Ceka9$_5GsT+Dz7Tl%*Qs9 zP5y{ehk@gf#|oc&Abn}qblJ8fFlzL4pmTtuizFTU|VGeCnUk6iEPy?JY{*B8a2lfRDw>~2pJyB(h%&+cCG&eMV-yIY)h zRh5Xwh@8l?wqJ*0X1_<4Dk9RsMdAY#0}=1H5a2$U@d%+tjw+0Dig!5dMk%%5(T3n> z&#zwliFp;qsymjm6?47!z3RZ7j)L^l=Rb^s~8;~iO%ew?2FPUC5#_x zRyJFXyJ?wWQzeam6Wvl37{;;{=82lv!1wV*5YF0eX;9<4?a21NqK~(FAQ9;U7$^Rc zcoYdN_8MLKouZaZeCR<8i=fotE*x zb-kSEP!aK`t5mh3^eY#itq%I8zeQ%BUHVl_&Q}k~9qTEw#_h+x5v5t6%4Uz|Beq*=EtGxvu$zn{6i>;0MR>X>tz}%jtx;{m{DXTNY#w^ zX`5(R9^3@D+$MQHXxD0|HR)xN0Qg!st1AZ*l62oP56_0Ag}A|-{fmhGzZ65Fa21=i)u-s=>BYE}VvjxBA@ROieAp-N8jaGgJ} z?JDAdAI}(_B@|dYh_`LA#-v68qH)$Otx*}lp*?=IfYwQ3G^8+ky|Rd zrp_T<5#&Nsx)|(O(K)IU_l~cj;lRf5nVCWQz5>LCW;j-+=T$k2_i^p?bs!tkHm#ts z!rbID(GD3&bsjh7<-9oODrsw1ch%Dndf$>I%K9o}0D#!iD~E?iwCO8+j@OsGUaHTO zQpn=xmBe#Wwiksh{>x^=a~x$(vvTQ3Zk?QX074hp)zQ0 zk0f#W`)ing{j<67D6afu@;+-u-A(Zn0aE^To9%ai>gB^aa;G3t#Y52XV3lJ(0(`Hl zNCGU?CMd*d7Mw0G841TWG&_WGs_GlM#4Kp;iIL^;hCUypnbikJQn_U(+#!p;FVaeH zORL!yVZ7hXj=Fy6D2G*jWZgX{cjk`pVaLMLx_uUvdn?Y;qWO)#l>h%(UISPY%iD4f z_uH%7iygi0i(7N?_{cGOo0WV2nvkpE^2gU%W!ojYR-XKv7MlqhTf<-UDl}c`)-T7! zW8^cv%m1T1h;uXB)STG&Jx^Q+d60au{Z%!`obdH1+QyON*1!Z#pFw9@UIt zE7ie`{^ph50zl!!bwSJ}oaJl(8($0#-2`3*bW6qd2iF*}3!JU!sDGYNC1cWkU`tpq zZ=r$&pTcN1D}E^yirUmVY?mTbpH9t;`^l5Vy?*f8$r3dU)pJ1}WgpPv`^ug3Nl+=t zcinb~Bz8NoPAk%k+`_FnS5eXYup~jNq=;SNx9|aVai|o3injj`O*eXj*ow&bRyVDsldu-EKY7(xvz54@hAG zq#ja^G{}u9Tz+UAhxOd%#gjAJyu!jmmW>fsZQ^=jbENXrp>WwDmi?$0Sa$#bAOHWi z05j6lY5bB2@!cc?7K8oFh@TX}fDle@XV?rCp(lll7u?rZ_@`uAOAxO>!?i-d{@Y+f zkP0e~B>`!T>js-lm4Q*SKZ5Kyv3f2PlKDtVjSlC?TF#dRK~Jdq zBSx>Tf6@{&4=&tWpNhP)RukXsKWW6rTF!B#-cw}1G)?%u6$ojps~_o(vuPUJVHi4F z^a`(bB9HUywE}IippvDgK{Mi>oc2<@Hkw|7quny}XR|E?&~=JuBL((J1p2$X_N)Z; zPeO#kf`=Ae~rfq_Hj?`IFd|DNOR{?OG5aEcId8+qM zzpgGNZqUq|Xr6r%EUJ{rF9{~RgOf)j?c(ekT0Q`(EQ)K$sF7cmV$Yz{_=a))J-!yr zfPA}WgJJ%Z1Kls7v8N+m(kT5+Z59UQH2FQkHRq^#4yq4=`2xX^V|dB^!hKaMX?2%_H{no!p|zE)fcWe7gDb#8tK8Tl=;qKVSC zK6Q^F4s-Ph_<%q6LMP_R@CZ3r2%5!-;FLE7?J@>3Trkh`;h|lg0e5$;eF9?MavY(DB& zrIl zGc#(<+YmzWO+l=alM^rv0tgN^B*(!OjP7Z2+Iy$;^WoW-j)5T{w3Ars9=#yRQjy{nzF}sQn2ri00kKp>56y80sjH-$F=bQ From 1bbfb0cd9f7222ba6c55e0f2b0fce365ffc215f7 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Thu, 1 Sep 2016 20:08:58 -0400 Subject: [PATCH 10/96] Makes telekinesis less bullshit --- code/_onclick/telekinesis.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 9c783dc19ef..cf28bb9fa7b 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -121,15 +121,16 @@ var/const/tk_maxrange = 15 focus_object(target, user) return - if(focus.anchored) + if(focus.anchored || !isturf(focus.loc)) qdel(src) + return if(target == focus) target.attack_self_tk(user) return // todo: something like attack_self not laden with assumptions inherent to attack_self - if(!istype(target, /turf) && istype(focus,/obj/item) && target.Adjacent(focus)) + if(!isturf(target) && istype(focus,/obj/item) && target.Adjacent(focus)) var/obj/item/I = focus var/resolved = target.attackby(I, user, params) if(!resolved && target && I) @@ -139,7 +140,6 @@ var/const/tk_maxrange = 15 focus.throw_at(target, 10, 1,user) last_throw = world.time user.changeNext_move(CLICK_CD_MELEE) - return /proc/tkMaxRangeCheck(mob/user, atom/target, atom/focus) var/d = get_dist(user, target) @@ -155,7 +155,7 @@ var/const/tk_maxrange = 15 /obj/item/tk_grab/proc/focus_object(obj/target, mob/living/user) - if(!istype(target,/obj)) + if(!isobj(target)) return//Cant throw non objects atm might let it do mobs later if(target.anchored || !isturf(target.loc)) qdel(src) From e13f8ce2fc98f7cc810a1b923a881abc9e414efa Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Thu, 1 Sep 2016 18:04:45 -0700 Subject: [PATCH 11/96] Hacky freon fixes pending the rework fixes the slip --- code/game/turfs/open.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 07d70bfc4b7..0b8947328ad 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -119,8 +119,10 @@ step(C, olddir) C.spin(1,1) else if(lube&SLIDE_ICE) + C.slipping = TRUE spawn(1) step(C, olddir) + C.slipping = FALSE return 1 /turf/open/proc/MakeSlippery(wet_setting = TURF_WET_WATER, min_wet_time = 0, wet_time_to_add = 0) // 1 = Water, 2 = Lube, 3 = Ice, 4 = Permafrost, 5 = Slide From b777e451ef130b53dc6ae0405d1abc83d737985b Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Thu, 1 Sep 2016 18:06:15 -0700 Subject: [PATCH 12/96] Update living.dm --- code/modules/mob/living/living.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 2ac3753795c..31136f8ab02 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -666,8 +666,8 @@ if (AM.density && AM.anchored) pressure_resistance_prob_delta -= 20 break - - ..(pressure_difference, direction, pressure_resistance_prob_delta) + if(!slipping) + ..(pressure_difference, direction, pressure_resistance_prob_delta) /mob/living/verb/resist() set name = "Resist" From bd1bb7c22a04f1e5576913f5a9d56a2b7479bf09 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Thu, 1 Sep 2016 18:06:47 -0700 Subject: [PATCH 13/96] Update living_defines.dm --- code/modules/mob/living/living_defines.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 83103ebf337..71fecbb33a2 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -71,3 +71,5 @@ var/blood_volume = 0 //how much blood the mob has var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override + + var/slipping = FALSE From cbb73abb34474999ca2a0bc3d7d7f6ab37c409fa Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Thu, 1 Sep 2016 18:11:16 -0700 Subject: [PATCH 14/96] Update open.dm --- code/game/turfs/open.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 0b8947328ad..89bdd405b93 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -122,7 +122,7 @@ C.slipping = TRUE spawn(1) step(C, olddir) - C.slipping = FALSE + C.slipping = FALSE return 1 /turf/open/proc/MakeSlippery(wet_setting = TURF_WET_WATER, min_wet_time = 0, wet_time_to_add = 0) // 1 = Water, 2 = Lube, 3 = Ice, 4 = Permafrost, 5 = Slide From 07baa6921c04dcd21e7e3d027fbf41093b351a78 Mon Sep 17 00:00:00 2001 From: Ergovisavi Date: Thu, 1 Sep 2016 19:21:36 -0700 Subject: [PATCH 15/96] Fixes #20271 --- code/game/objects/items/weapons/weaponry.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 983705144d1..0434b288c9c 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -470,7 +470,7 @@ var/highlander_claymores = 0 playsound(get_turf(src), 'sound/weapons/HOMERUN.ogg', 100, 1) homerun_ready = 0 return - else + else if(!target.anchored) target.throw_at(throw_target, rand(1,2), 7, user) /obj/item/weapon/melee/baseball_bat/ablative From bbcdb773737c6080b1216d291d7b0f5820a9ec57 Mon Sep 17 00:00:00 2001 From: Ergovisavi Date: Thu, 1 Sep 2016 18:49:35 -0700 Subject: [PATCH 16/96] Fixes #19982 --- code/game/objects/items/weapons/twohanded.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 544613b54ea..2e5746ba010 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -107,6 +107,11 @@ unwield(M) return +/obj/item/weapon/twohanded/equipped(mob/user, slot) + ..() + if(slot != slot_l_hand && slot != slot_r_hand && wielded) + unwield(user) + ///////////OFFHAND/////////////// /obj/item/weapon/twohanded/offhand name = "offhand" @@ -152,9 +157,6 @@ else unwield(user) - -/obj/item/weapon/twohanded/ - /* * Fireaxe */ From 84539b1e79dd1d24ca495aa6b8b59c2836ee9012 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Thu, 1 Sep 2016 22:55:02 -0500 Subject: [PATCH 17/96] Explosive water tanks --- code/modules/reagents/reagent_dispenser.dm | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index ec86f0817f5..c80147fe422 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -49,6 +49,8 @@ /obj/structure/reagent_dispensers/proc/boom() + visible_message("\The [src] ruptures!" + chem_splash(loc, 5, list(reagents)) qdel(src) /obj/structure/reagent_dispensers/watertank @@ -56,20 +58,11 @@ desc = "A water tank." icon_state = "water" -/obj/structure/reagent_dispensers/waterank/bullet_act(obj/item/projectile/Proj) +/obj/structure/reagent_dispensers/bullet_act(obj/item/projectile/Proj) ..() if(tank_volume && istype(Proj) && !Proj.nodamage && ((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))) boom() -/obj/structure/reagent_dispensers/watertank/boom() - playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6) - PoolOrNew(/obj/effect/particle_effect/water, loc) - for(var/turf/open/T in view(5,loc)) - T.MakeSlippery(min_wet_time = 20, wet_time_to_add = 15) - for(var/mob/living/L in T) - L.adjust_fire_stacks(-20) - qdel(src) - /obj/structure/reagent_dispensers/watertank/blob_act(obj/effect/blob/B) if(prob(50)) PoolOrNew(/obj/effect/particle_effect/water, loc) From 678d8625c9839348c497df58e337dffb1976ca0e Mon Sep 17 00:00:00 2001 From: Kyle Franz Date: Thu, 1 Sep 2016 22:35:14 -0700 Subject: [PATCH 18/96] Fix silent not working with radiation. Make a nicer message for when it does. --- code/game/objects/radiation.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/game/objects/radiation.dm b/code/game/objects/radiation.dm index 87fec24f831..0dfa2b1b907 100644 --- a/code/game/objects/radiation.dm +++ b/code/game/objects/radiation.dm @@ -31,8 +31,11 @@ /mob/living/rad_act(amount, silent = 0) if(amount) - var/message = silent ? null : "Your clothes feel warm." - var/blocked = run_armor_check(null, "rad", message, message) + var/blocked = getarmor(null, "rad") + + if(!silent) + src << "Your skin feels warm." + apply_effect(amount, IRRADIATE, blocked) for(var/obj/I in src) //Radiation is also applied to items held by the mob I.rad_act(amount) From ae102fbc0ece32becb59676d302de528d0b94f97 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 2 Sep 2016 01:56:13 -0500 Subject: [PATCH 19/96] Missing ) --- code/modules/reagents/reagent_dispenser.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index c80147fe422..5ed872fc0ff 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -49,7 +49,7 @@ /obj/structure/reagent_dispensers/proc/boom() - visible_message("\The [src] ruptures!" + visible_message("\The [src] ruptures!") chem_splash(loc, 5, list(reagents)) qdel(src) From 91bbdfee5633ebe6e237ac48493697312365f37b Mon Sep 17 00:00:00 2001 From: A-t48 Date: Fri, 2 Sep 2016 01:14:15 -0700 Subject: [PATCH 20/96] Fixed cyborgs being able to use Power Warning emote when broken. (#20249) * Fix #19905 * Slight cleanup --- code/modules/mob/living/silicon/robot/emote.dm | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index de797f9fe9a..bbb524a7dc7 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -236,7 +236,7 @@ else src << "Unusable emote '[act]'. Say *help for a list." - if (message && src.stat == CONSCIOUS) + if (message && stat == CONSCIOUS) log_emote("[name]/[key] : [message]") if (m_type & 1) visible_message(message) @@ -248,9 +248,10 @@ set category = "Robot Commands" set name = "Power Warning" - if(!cell || !cell.charge) - visible_message("The power warning light on [src] flashes urgently.",\ - "You announce you are operating in low power mode.") - playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0) - else - src << "You can only use this emote when you're out of charge." \ No newline at end of file + if(stat == CONSCIOUS) + if(!cell || !cell.charge) + visible_message("The power warning light on [src] flashes urgently.",\ + "You announce you are operating in low power mode.") + playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0) + else + src << "You can only use this emote when you're out of charge." \ No newline at end of file From 228a6b8a71fc0463b63a790bc6b502791823c043 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Fri, 2 Sep 2016 08:14:17 +0000 Subject: [PATCH 21/96] Automatic changelog generation for PR #20249 [ci skip] --- html/changelogs/AutoChangeLog-pr-20249.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-20249.yml diff --git a/html/changelogs/AutoChangeLog-pr-20249.yml b/html/changelogs/AutoChangeLog-pr-20249.yml new file mode 100644 index 00000000000..059a1f969c2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-20249.yml @@ -0,0 +1,4 @@ +author: "A-t48" +delete-after: True +changes: + - bugfix: "Fixed cyborgs being able to use Power Warning emote when broken." From 2d4355ca971eae6cf57ae93c58f5217ffd1115d4 Mon Sep 17 00:00:00 2001 From: AnturK Date: Fri, 2 Sep 2016 11:21:46 +0200 Subject: [PATCH 22/96] Fixes ADMIN_COORDJMP define --- code/__DEFINES/admin.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 50f83c2d947..a50bf74d557 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -51,6 +51,6 @@ #define ADMIN_LOOKUPFLW(user) "[key_name_admin(user)][ADMIN_QUE(user)] [ADMIN_FLW(user)]" #define ADMIN_SET_SD_CODE "(SETCODE)" #define ADMIN_FULLMONTY(user) "[key_name_admin(user)] [ADMIN_QUE(user)] [ADMIN_PP(user)] [ADMIN_VV(user)] [ADMIN_SM(user)] [ADMIN_FLW(user)] [ADMIN_TP(user)]" -#define ADMIN_JMP(src) "(JMP)" +#define ADMIN_JMP(src) "(JMP)" #define COORD(src) "[src ? "([src.x],[src.y],[src.z])" : "nonexistent location"]" #define ADMIN_COORDJMP(src) "[src ? "[COORD(src)] [ADMIN_JMP(src)]" : "nonexistent location"]" From aa7ae7dc38cba47fa1434e342371d78ca3f0fdfc Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Fri, 2 Sep 2016 18:40:16 +0100 Subject: [PATCH 23/96] Fixes cloth from cutting bedsheets ending up INSIDE THE USER (#20286) --- code/game/objects/structures/bedsheet_bin.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 946b2caf509..b81634de888 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -38,7 +38,7 @@ LINEN BINS /obj/item/weapon/bedsheet/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/wirecutters) || I.is_sharp()) - var/obj/item/stack/sheet/cloth/C = new (loc, 3) + var/obj/item/stack/sheet/cloth/C = new (get_turf(src), 3) transfer_fingerprints_to(C) C.add_fingerprint(user) qdel(src) From ccd962abf2fed6c82ad5d96070a26d2eaaca0709 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Fri, 2 Sep 2016 17:40:17 +0000 Subject: [PATCH 24/96] Automatic changelog generation for PR #20286 [ci skip] --- html/changelogs/AutoChangeLog-pr-20286.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-20286.yml diff --git a/html/changelogs/AutoChangeLog-pr-20286.yml b/html/changelogs/AutoChangeLog-pr-20286.yml new file mode 100644 index 00000000000..e8ae3f8f378 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-20286.yml @@ -0,0 +1,4 @@ +author: "RemieRichards" +delete-after: True +changes: + - bugfix: "Cutting bedsheets with a sharp object/wirecutters no longer puts the resulting cloth INSIDE OF YOU if you're holding it, what a bug." From 05752136663a2aaec702d210d153e7fc338875a1 Mon Sep 17 00:00:00 2001 From: GunHog Date: Fri, 2 Sep 2016 14:36:28 -0500 Subject: [PATCH 25/96] Tweaks Aux Base Stat Logging Aux Mining Base stat logging actually works now, and includes the coordinates where the base lands. --- code/modules/mining/mine_items.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index ecb2988d2fb..5392b410a6f 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -535,9 +535,15 @@ interface with the mining shuttle at the landing site if a mobile beacon is also say("Launch sequence activated! Prepare for drop!") playsound(loc, 'sound/machines/warning-buzzer.ogg', 70, 0) launch_warning = FALSE - feedback_add_details("colonies_dropped") //Number of times a base has been dropped! ..() + + +/obj/machinery/computer/shuttle/auxillary_base/onShuttleMove(turf/T1, rotation) + ..() + if(z == ZLEVEL_MINING) //Avoids double logging and landing on other Z-levels due to badminnery + feedback_add_details("colonies_dropped", "[x]|[y]|[z]") //Number of times a base has been dropped! + /obj/machinery/computer/shuttle/auxillary_base/proc/set_mining_mode() if(z == ZLEVEL_MINING) //The console switches to controlling the mining shuttle once landed. req_access = list() From 0f3031bd7e99b3f03cdaa3aa7600f24fb62be7bc Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Fri, 2 Sep 2016 16:51:26 -0400 Subject: [PATCH 26/96] Fixes some potential weird faction bugs --- code/datums/mind.dm | 2 +- code/game/gamemodes/clock_cult/clock_cult.dm | 4 +++- code/modules/mob/living/simple_animal/bot/bot.dm | 2 +- .../mob/living/simple_animal/hostile/megafauna/legion.dm | 2 ++ code/modules/mob/living/simple_animal/hostile/mining_mobs.dm | 3 +-- code/modules/research/xenobiology/xenobiology.dm | 2 +- 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index f5c465d390e..61c61673d11 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -238,7 +238,7 @@ enslaved_to = creator - current.faction = creator.faction + current.faction = creator.faction.Copy() if(special_role) message_admins("[key_name_admin(current)](?) has been created by [key_name_admin(creator)](?), an antagonist.") diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 63397149602..3e012efca34 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -90,10 +90,11 @@ This file's folder contains: whim without hesitation.") ticker.mode.servants_of_ratvar += M.mind ticker.mode.update_servant_icons_added(M.mind) + all_clockwork_mobs += M + M.faction |= "ratvar" M.mind.special_role = "Servant of Ratvar" M.languages_spoken |= RATVAR M.languages_understood |= RATVAR - all_clockwork_mobs += M M.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them for whatever reason, we need to update buttons M.attack_log += "\[[time_stamp()]\] Has been converted to the cult of Ratvar!" if(issilicon(M)) @@ -152,6 +153,7 @@ This file's folder contains: ticker.mode.servants_of_ratvar -= M.mind ticker.mode.update_servant_icons_removed(M.mind) all_clockwork_mobs -= M + M.faction -= "ratvar" M.mind.memory = "" //Not sure if there's a better way to do this M.mind.special_role = null M.languages_spoken &= ~RATVAR diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index d14a6bf087d..042de50dcad 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -859,7 +859,7 @@ Pass a positive integer as an argument to override a bot's default speed. src << "You sense your form change as you are uploaded into [src]." bot_name = name name = paicard.pai.name - faction = user.faction + faction = user.faction.Copy() add_logs(user, paicard.pai, "uploaded to [bot_name],") return 1 else diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index b81f0a77789..fa7e0330f24 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -110,6 +110,8 @@ Difficulty: Medium L.update_transform() update_transform() + L.faction = faction.Copy() + L.GiveTarget(target) visible_message("[src] splits in twain!") diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 45a0f519989..7c83b8c354a 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -223,9 +223,8 @@ A.admin_spawned = admin_spawned A.GiveTarget(target) A.friends = friends - A.faction = faction + A.faction = faction.Copy() ranged_cooldown = world.time + ranged_cooldown_time - return /mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget() OpenFire() diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 5534256453f..cc5f39f8672 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -239,7 +239,7 @@ user.mind.transfer_to(SM) SM.languages_spoken = user.languages_spoken SM.languages_understood = user.languages_understood - SM.faction = user.faction + SM.faction = user.faction.Copy() SM.sentience_act() //Same deal here as with sentience user.death() SM << "In a quick flash, you feel your consciousness flow into [SM]!" From 2953360310d5831c51829b90ee65567ecee15ec8 Mon Sep 17 00:00:00 2001 From: AndrewJacksonThe2nd Date: Fri, 2 Sep 2016 15:04:51 -0700 Subject: [PATCH 27/96] Removes reagent gas, Misc changes, REAGENT CODE OPTIMIZATION --- code/datums/datumvars.dm | 4 + code/datums/gas_overrides.dm | 5 +- code/game/atoms.dm | 3 - code/game/turfs/open.dm | 6 - .../environmental/LINDA_turf_tile.dm | 9 +- .../atmospherics/gasmixtures/gas_mixture.dm | 4 - .../atmospherics/gasmixtures/gas_types.dm | 7 - .../atmospherics/machinery/airalarm.dm | 27 +- .../components/unary_devices/vent_scrubber.dm | 13 +- .../machinery/portable/canister.dm | 21 -- .../machinery/portable/scrubber.dm | 2 +- code/modules/reagents/chemistry/holder.dm | 271 +++++++++--------- code/modules/research/rdconsole.dm | 26 +- tgui/assets/tgui.js | 30 +- tgui/src/interfaces/airalarm/scrubbers.ract | 2 + tgui/src/interfaces/atmos_filter.ract | 4 + 16 files changed, 195 insertions(+), 239 deletions(-) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 03c08a3a4e2..9ef0b9e9a54 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -5,10 +5,14 @@ var/global/list/internal_byond_list_vars = list("contents" = TRUE, "verbs" = TRU /datum var/var_edited = 0 //Warrenty void if seal is broken var/datum/reagents/reagents = null + var/fingerprintslast = null /datum/proc/on_varedit(modified_var) //called whenever a var is edited var_edited = 1 +/datum/proc/on_reagent_change() + return + /client/proc/debug_variables(datum/D in world) set category = "Debug" set name = "View Variables" diff --git a/code/datums/gas_overrides.dm b/code/datums/gas_overrides.dm index 73f60b3a686..c58d5ad176a 100644 --- a/code/datums/gas_overrides.dm +++ b/code/datums/gas_overrides.dm @@ -2,7 +2,4 @@ return 0 /datum/proc/water_vapor_gas_act() // We get it - return 0 // You vape - -/datum/proc/chem_gas_act(var/datum/reagents/gas) - return 0 \ No newline at end of file + return 0 // You vape \ No newline at end of file diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d6a8896a634..1be70564a1b 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -4,7 +4,6 @@ var/flags = 0 var/list/fingerprints var/list/fingerprintshidden - var/fingerprintslast = null var/list/blood_DNA var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff. @@ -99,8 +98,6 @@ /atom/proc/check_eye(mob/user) return -/atom/proc/on_reagent_change() - return /atom/proc/Bumped(AM as mob|obj) return diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 247bc7862a6..9b3a7304781 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -97,12 +97,6 @@ qdel(hotspot) return 1 -/turf/open/chem_gas_act(var/datum/reagents/gas) - for(var/A in contents) - gas.reaction(A, VAPOR) - gas.reaction(src, VAPOR) - return 1 - /turf/open/handle_fall(mob/faller, forced) faller.lying = pick(90, 270) if(!forced) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 4e97ceb3686..6391a9f1bbc 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -110,17 +110,10 @@ /turf/open/proc/tile_graphic() . = new /list var/list/gases = air.gases - var/list/reagent_gas_memes = air.reagents.reagent_list for(var/id in gases) var/gas = gases[id] if(gas[GAS_META][META_GAS_OVERLAY] && gas[MOLES] > gas[GAS_META][META_GAS_MOLES_VISIBLE]) - if(id == "chem_gas") - var/obj/effect/overlay/gas/G = gas[GAS_META][META_GAS_OVERLAY] - if(reagent_gas_memes.len) - G.color = mix_color_from_reagents(reagent_gas_memes) - . += G - else - . += gas[GAS_META][META_GAS_OVERLAY] + . += gas[GAS_META][META_GAS_OVERLAY] /////////////////////////////SIMULATION/////////////////////////////////// diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index aa372e6ba2d..92ed55025bc 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -192,10 +192,6 @@ var/list/gaslist_cache = null if(holder.water_vapor_gas_act()) cached_gases["water_vapor"][MOLES] -= MOLES_PLASMA_VISIBLE - if(cached_gases["chem_gas"]) - if(cached_gases["chem_gas"][MOLES] >= MOLES_PLASMA_VISIBLE) - holder.chem_gas_act(reagents) - fuel_burnt = 0 if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) //world << "pre [temperature], [cached_gases["o2"][MOLES]], [cached_gases["plasma"][MOLES]]" diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm index 9eb68916c07..439026c2551 100644 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ b/code/modules/atmospherics/gasmixtures/gas_types.dm @@ -87,13 +87,6 @@ var/list/hardcoded_gases = list("o2","n2","co2","plasma") //the main four gases, specific_heat = 20 name = "BZ" -/datum/gas/chem_gas - id = "chem_gas" - specific_heat = 20 - name = "Chemicals" - gas_overlay = "chem_gas" - moles_visible = MOLES_PLASMA_VISIBLE - /obj/effect/overlay/gas/ icon = 'icons/effects/tile_effects.dmi' mouse_opacity = 0 diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index e5e3488baac..1d5476c4d4f 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -78,8 +78,7 @@ "n2o" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa "bz" = new/datum/tlv(-1, -1, 0.2, 0.5), "freon" = new/datum/tlv(-1, -1, 0.2, 0.5), - "water_vapor" = new/datum/tlv(-1, -1, 0.2, 0.5), - "chem_gas" = new/datum/tlv(-1, -1, 0.2, 0.5) + "water_vapor" = new/datum/tlv(-1, -1, 0.2, 0.5) ) /obj/machinery/airalarm/server // No checks here. @@ -93,8 +92,7 @@ "n2o" = new/datum/tlv(-1, -1, -1, -1), "bz" = new/datum/tlv(-1, -1, -1, -1), "freon" = new/datum/tlv(-1, -1, -1, -1), - "water_vapor" = new/datum/tlv(-1, -1, -1, -1), - "chem_gas" = new/datum/tlv(-1, -1, -1, -1) + "water_vapor" = new/datum/tlv(-1, -1, -1, -1) ) /obj/machinery/airalarm/kitchen_cold_room // Copypasta: to check temperatures. @@ -108,8 +106,7 @@ "n2o" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa "bz" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa "freon" = new/datum/tlv(-1, -1, 0.2, 0.5), // Partial pressure, kpa - "water_vapor" = new/datum/tlv(-1, -1, 0.2, 0.5), - "chem_gas" = new/datum/tlv(-1, -1, 0.2, 0.5) + "water_vapor" = new/datum/tlv(-1, -1, 0.2, 0.5) ) //all air alarms in area are connected via magic @@ -244,8 +241,7 @@ "filter_n2o" = info["filter_n2o"], "filter_bz" = info["filter_bz"], "filter_freon" = info["filter_freon"], - "filter_water_vapor" = info["filter_water_vapor"], - "filter_chem_gas" = info["filter_chem_gas"] + "filter_water_vapor" = info["filter_water_vapor"] )) data["mode"] = mode data["modes"] = list() @@ -301,7 +297,7 @@ if(usr.has_unlimited_silicon_privilege && !wires.is_cut(WIRE_IDSCAN)) locked = !locked . = TRUE - if("power", "co2_scrub", "tox_scrub", "n2o_scrub", "bz_scrub", "freon_scrub","water_vapor_scrub", "chem_gas_scrub", "widenet", "scrubbing") + if("power", "co2_scrub", "tox_scrub", "n2o_scrub", "bz_scrub", "freon_scrub","water_vapor_scrub", "widenet", "scrubbing") send_signal(device_id, list("[action]" = text2num(params["val"]))) . = TRUE if("excheck") @@ -418,10 +414,9 @@ "co2_scrub" = 1, "tox_scrub" = 0, "n2o_scrub" = 0, - "bz_scrub" = 1, - "freon_scrub"= 1, - "chem_gas_scrub"= 0, // set to contaminated to scrub this shit - "water_vapor_scrub"= 1, + "bz_scrub" = 0, + "freon_scrub"= 0, + "water_vapor_scrub"= 0, "scrubbing" = 1, "widenet" = 0, )) @@ -440,7 +435,6 @@ "n2o_scrub" = 1, "bz_scrub" = 1, "freon_scrub"= 1, - "chem_gas_scrub"= 1, "water_vapor_scrub"= 1, "scrubbing" = 1, "widenet" = 1, @@ -472,9 +466,8 @@ "tox_scrub" = 0, "n2o_scrub" = 0, "bz_scrub" = 0, - "freon_scrub"= 1, - "chem_gas_scrub"= 0, - "water_vapor_scrub"= 1, + "freon_scrub"= 0, + "water_vapor_scrub"= 0, "scrubbing" = 1, "widenet" = 0, )) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index a76e245c9f8..4b494a47872 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -20,9 +20,8 @@ var/scrub_Toxins = 0 var/scrub_N2O = 0 var/scrub_BZ = 0 - var/scrub_Freon = 1 - var/scrub_WaterVapor = 1 - var/scrub_ChemGas = 1 + var/scrub_Freon = 0 + var/scrub_WaterVapor = 0 var/volume_rate = 200 @@ -77,8 +76,6 @@ amount += idle_power_usage if(scrub_WaterVapor) amount += idle_power_usage - if(scrub_ChemGas) - amount += idle_power_usage else //scrubbing == SIPHONING amount = active_power_usage @@ -131,7 +128,6 @@ "filter_bz" = scrub_BZ, "filter_Freon" = scrub_Freon, "filter_WaterVapor" = scrub_WaterVapor, - "filter_ChemGas" = scrub_ChemGas, "sigtype" = "status" ) @@ -322,11 +318,6 @@ if("toggle_water_vapor_scrub" in signal.data) scrub_WaterVapor = !scrub_WaterVapor - if("chem_gas_scrub" in signal.data) - scrub_ChemGas = text2num(signal.data["chem_gas_scrub"]) - if("toggle_chem_gas_scrub" in signal.data) - scrub_ChemGas = !scrub_ChemGas - if("init" in signal.data) name = signal.data["init"] return diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 505900bda32..f679764fefa 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -94,13 +94,6 @@ gas_type = "water_vapor" filled = 1 -/obj/machinery/portable_atmospherics/canister/chem_gas - name = "chemical gas canister" - desc = "Chemical Gas. Hit this with a beaker with reagents to add the reagent to the gas." - icon_state = "black" - gas_type = "chem_gas" - filled = 1 - /obj/machinery/portable_atmospherics/canister/New(loc, datum/gas_mixture/existing_mixture) ..() if(existing_mixture) @@ -267,20 +260,6 @@ take_damage(rand(15, 40), BRUTE, 0) /obj/machinery/portable_atmospherics/canister/attacked_by(obj/item/I, mob/user) - if(istype(I, /obj/item/weapon/reagent_containers/glass)) - if(air_contents.gases["chem_gas"]) - if(I.reagents.reagent_list) - user << "You scan the beaker with the canister." - for(var/R in I.reagents.reagent_list) - var/datum/reagent/RI = R - if(!air_contents.reagents.has_reagent(RI.id)) - air_contents.reagents.add_reagent(RI.id, REAGENT_GAS_AMT) - say("Injected [RI.name].") - say("All new chemicals scanned and injected.") - return - else - say("ERROR: Does not contain chemical mixture gas.") - return if(I.force) user.visible_message("[user] has hit [src] with [I]!", "You hit [src] with [I]!") investigate_log("was smacked with \a [I] by [key_name(user)].", "atmos") diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index bc8b96713fb..308daa43f2a 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -7,7 +7,7 @@ var/volume_rate = 1000 volume = 1000 - var/list/scrubbing = list("plasma", "co2", "n2o", "agent_b", "bz", "freon", "water_vapor", "chem_gas") + var/list/scrubbing = list("plasma", "co2", "n2o", "agent_b", "bz", "freon", "water_vapor") /obj/machinery/portable_atmospherics/scrubber/Destroy() var/turf/T = get_turf(src) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index e3a16c57913..f3b2ebb8a27 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -12,7 +12,7 @@ var/const/INJECT = 5 //injection var/list/datum/reagent/reagent_list = new/list() var/total_volume = 0 var/maximum_volume = 100 - var/atom/my_atom = null + var/datum/my_atom = null var/chem_temp = 150 var/last_tick = 1 var/addiction_tick = 1 @@ -61,30 +61,32 @@ var/const/INJECT = 5 //injection /datum/reagents/Destroy() . = ..() STOP_PROCESSING(SSobj, src) - for(var/reagent in reagent_list) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) var/datum/reagent/R = reagent qdel(R) - reagent_list.Cut() - reagent_list = null + cached_reagents.Cut() + cached_reagents = null if(my_atom && my_atom.reagents == src) my_atom.reagents = null /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, reagent_list.len) + current_list_element = rand(1, cached_reagents.len) while(total_transfered != amount) if(total_transfered >= amount) break - if(total_volume <= 0 || !reagent_list.len) + if(total_volume <= 0 || !cached_reagents.len) break - if(current_list_element > reagent_list.len) + if(current_list_element > cached_reagents.len) current_list_element = 1 - var/datum/reagent/R = reagent_list[current_list_element] + var/datum/reagent/R = cached_reagents[current_list_element] remove_reagent(R.id, 1) current_list_element++ @@ -95,9 +97,10 @@ var/const/INJECT = 5 //injection 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 reagent_list) + for(var/reagent in cached_reagents) var/datum/reagent/R = reagent remove_reagent(R.id, R.volume * part) @@ -106,9 +109,10 @@ var/const/INJECT = 5 //injection 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 reagent_list) + for(var/reagent in cached_reagents) var/datum/reagent/R = reagent if(R.volume > max_volume) max_volume = R.volume @@ -117,9 +121,10 @@ var/const/INJECT = 5 //injection 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 reagent_list) + for(var/reagent in cached_reagents) var/datum/reagent/R = reagent if(R.volume > max_volume) max_volume = R.volume @@ -128,6 +133,8 @@ var/const/INJECT = 5 //injection return id /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 var/datum/reagents/R @@ -140,7 +147,7 @@ var/const/INJECT = 5 //injection 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 reagent_list) + for(var/reagent in cached_reagents) var/datum/reagent/T = reagent var/transfer_amount = T.volume * part if(preserve_data) @@ -156,6 +163,7 @@ var/const/INJECT = 5 //injection return amount /datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1) + var/list/cached_reagents = reagent_list if(!target) return if(!target.reagents || src.total_volume<=0) @@ -164,7 +172,7 @@ var/const/INJECT = 5 //injection 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 reagent_list) + for(var/reagent in cached_reagents) var/datum/reagent/T = reagent var/copy_amount = T.volume * part if(preserve_data) @@ -178,6 +186,7 @@ var/const/INJECT = 5 //injection 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)) @@ -188,58 +197,28 @@ var/const/INJECT = 5 //injection amount = src.get_reagent_amount(reagent) amount = min(amount, R.maximum_volume-R.total_volume) var/trans_data = null - for (var/datum/reagent/current_reagent in src.reagent_list) + for (var/CR in cached_reagents) + var/datum/reagent/current_reagent = CR 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) - src.remove_reagent(current_reagent.id, amount, 1) + remove_reagent(current_reagent.id, amount, 1) break src.update_total() R.update_total() R.handle_reactions() - //src.handle_reactions() Don't need to handle reactions on the source since you're (presumably isolating and) transferring a specific reagent. return amount -/* - if (!target) return - var/total_transfered = 0 - var/current_list_element = 1 - var/datum/reagents/R = target.reagents - var/trans_data = null - //if(R.total_volume + amount > R.maximum_volume) return 0 - - current_list_element = rand(1,reagent_list.len) //Eh, bandaid fix. - - while(total_transfered != amount) - if(total_transfered >= amount) break //Better safe than sorry. - if(total_volume <= 0 || !reagent_list.len) break - if(R.total_volume >= R.maximum_volume) break - - if(current_list_element > reagent_list.len) current_list_element = 1 - var/datum/reagent/current_reagent = reagent_list[current_list_element] - if(preserve_data) - trans_data = current_reagent.data - R.add_reagent(current_reagent.id, (1 * multiplier), trans_data) - src.remove_reagent(current_reagent.id, 1) - - current_list_element++ - total_transfered++ - src.update_total() - R.update_total() - R.handle_reactions() - handle_reactions() - - return total_transfered -*/ - /datum/reagents/proc/metabolize(mob/living/carbon/C, can_overdose = 0) + var/list/cached_reagents = reagent_list + var/list/cached_addictions = addiction_list if(C) chem_temp = C.bodytemperature handle_reactions() var/need_mob_update = 0 - for(var/reagent in reagent_list) + for(var/reagent in cached_reagents) var/datum/reagent/R = reagent if(!R.holder) continue @@ -253,13 +232,13 @@ var/const/INJECT = 5 //injection 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, addiction_list)) + if(R.volume >= R.addiction_threshold && !is_type_in_list(R, cached_addictions)) var/datum/reagent/new_reagent = new R.type() - addiction_list.Add(new_reagent) + cached_addictions.Add(new_reagent) if(R.overdosed) need_mob_update += R.overdose_process(C) - if(is_type_in_list(R,addiction_list)) - for(var/addiction in addiction_list) + 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. @@ -268,7 +247,7 @@ var/const/INJECT = 5 //injection if(can_overdose) if(addiction_tick == 6) addiction_tick = 1 - for(var/addiction in addiction_list) + for(var/addiction in cached_addictions) var/datum/reagent/R = addiction if(C && R) R.addiction_stage++ @@ -283,7 +262,7 @@ var/const/INJECT = 5 //injection need_mob_update += R.addiction_act_stage4(C) if(40 to INFINITY) C << "You feel like you've gotten over your need for [R.name]." - addiction_list.Remove(R) + 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() @@ -292,11 +271,12 @@ var/const/INJECT = 5 //injection update_total() /datum/reagents/process() + var/list/cached_reagents = reagent_list if(flags & REAGENT_NOREACT) STOP_PROCESSING(SSobj, src) return - for(var/reagent in reagent_list) + for(var/reagent in cached_reagents) var/datum/reagent/R = reagent R.on_tick() @@ -311,34 +291,41 @@ var/const/INJECT = 5 //injection flags |= REAGENT_NOREACT /datum/reagents/proc/conditional_update_move(atom/A, Running = 0) - for(var/reagent in reagent_list) + 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) - for(var/reagent in reagent_list) + 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() + var/list/cached_reagents = reagent_list + var/list/cached_reactions = chemical_reactions_list + var/datum/cached_my_atom = my_atom if(flags & REAGENT_NOREACT) return //Yup, no reactions here. No siree. var/reaction_occured = 0 do reaction_occured = 0 - for(var/reagent in reagent_list) + for(var/reagent in cached_reagents) var/datum/reagent/R = reagent - for(var/reaction in chemical_reactions_list[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id + 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/total_required_reagents = C.required_reagents.len + var/list/cached_required_reagents = C.required_reagents + var/total_required_reagents = cached_required_reagents.len var/total_matching_reagents = 0 - var/total_required_catalysts = C.required_catalysts.len + 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 @@ -347,32 +334,39 @@ var/const/INJECT = 5 //injection var/is_cold_recipe = C.is_cold_recipe var/meets_temp_requirement = 0 - for(var/B in C.required_reagents) - if(!has_reagent(B, C.required_reagents[B])) + var/list/cached_results = C.results + + for(var/B in cached_required_reagents) + if(!has_reagent(B, cached_required_reagents[B])) break total_matching_reagents++ - multipliers += round(get_reagent_amount(B) / C.required_reagents[B]) - for(var/B in C.required_catalysts) - if(!has_reagent(B, C.required_catalysts[B])) + multipliers += round(get_reagent_amount(B) / cached_required_reagents[B]) + for(var/B in cached_required_catalysts) + if(!has_reagent(B, cached_required_catalysts[B])) break total_matching_catalysts++ - - if(!C.required_container) - matching_container = 1 - - else - if(my_atom.type == C.required_container) + if(cached_my_atom) + if(!C.required_container) matching_container = 1 - if (isliving(my_atom)) //Makes it so certain chemical reactions don't occur in mobs - if (C.mob_react) - return - if(!C.required_other) - matching_other = 1 - else if(istype(my_atom, /obj/item/slime_extract)) - var/obj/item/slime_extract/M = my_atom + else + if(cached_my_atom.type == C.required_container) + matching_container = 1 + if (isliving(cached_my_atom)) //Makes it so certain chemical reactions don't occur in mobs + if (C.mob_react) + return + if(!C.required_other) + matching_other = 1 - if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this + else if(istype(cached_my_atom, /obj/item/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) + 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)) @@ -380,30 +374,30 @@ var/const/INJECT = 5 //injection if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement) var/multiplier = min(multipliers) - for(var/B in C.required_reagents) - remove_reagent(B, (multiplier * C.required_reagents[B]), safety = 1) + for(var/B in cached_required_reagents) + remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1) for(var/P in C.results) - feedback_add_details("chemical_reaction", "[P]|[C.results[P]*multiplier]") + feedback_add_details("chemical_reaction", "[P]|[cached_results[P]*multiplier]") multiplier = max(multiplier, 1) //this shouldnt happen ... - add_reagent(P, C.results[P]*multiplier, null, chem_temp) + add_reagent(P, cached_results[P]*multiplier, null, chem_temp) var/list/seen = viewers(4, get_turf(my_atom)) - - if(!istype(my_atom, /mob)) // No bubbling mobs - if(C.mix_sound) - playsound(get_turf(my_atom), C.mix_sound, 80, 1) - for(var/mob/M in seen) - M << "\icon[my_atom] [C.mix_message]" - - if(istype(my_atom, /obj/item/slime_extract)) - var/obj/item/slime_extract/ME2 = my_atom - ME2.Uses-- - if(ME2.Uses <= 0) // give the notification that the slime core is dead + if(cached_my_atom) + if(!istype(cached_my_atom, /mob)) // No bubbling mobs + if(C.mix_sound) + playsound(get_turf(cached_my_atom), C.mix_sound, 80, 1) for(var/mob/M in seen) - M << "\icon[my_atom] \The [my_atom]'s power is consumed in the reaction." - ME2.name = "used slime extract" - ME2.desc = "This extract has been used up." + M << "\icon[my_atom] [C.mix_message]" + + if(istype(cached_my_atom, /obj/item/slime_extract)) + 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) + M << "\icon[my_atom] \The [my_atom]'s power is consumed in the reaction." + ME2.name = "used slime extract" + ME2.desc = "This extract has been used up." C.on_reaction(src, multiplier) reaction_occured = 1 @@ -414,14 +408,16 @@ var/const/INJECT = 5 //injection return 0 /datum/reagents/proc/isolate_reagent(reagent) - for(var/_reagent in reagent_list) + 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) - for(var/_reagent in reagent_list) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) var/datum/reagent/R = _reagent if(R.id == reagent) if(my_atom && istype(my_atom, /mob/living)) @@ -459,8 +455,9 @@ var/const/INJECT = 5 //injection M.status_flags &= ~GOTTAGOREALLYFAST /datum/reagents/proc/update_total() + var/list/cached_reagents = reagent_list total_volume = 0 - for(var/reagent in reagent_list) + for(var/reagent in cached_reagents) var/datum/reagent/R = reagent if(R.volume < 0.1) del_reagent(R.id) @@ -470,38 +467,47 @@ var/const/INJECT = 5 //injection return 0 /datum/reagents/proc/clear_reagents() - for(var/reagent in reagent_list) + 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)) - var/touch_protection = 0 - if(method == VAPOR) - var/mob/living/L = A - touch_protection = L.get_permeability_protection() - for(var/reagent in reagent_list) - var/datum/reagent/R = reagent - R.reaction_mob(A, method, R.volume * volume_modifier, show_message, touch_protection) + react_type = "LIVING" else if(isturf(A)) - for(var/reagent in reagent_list) - var/datum/reagent/R = reagent - R.reaction_turf(A, R.volume * volume_modifier, show_message) + react_type = "TURF" else if(isobj(A)) - for(var/reagent in reagent_list) - var/datum/reagent/R = reagent - R.reaction_obj(A, R.volume * volume_modifier, show_message) + 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/add_reagent(reagent, amount, list/data=null, reagtemp = 300, no_react = 0) if(!isnum(amount) || !amount) return 1 + var/list/cached_reagents = reagent_list update_total() if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. chem_temp = round(((amount * reagtemp) + (total_volume * chem_temp)) / (total_volume + amount)) //equalize with new chems - for(var/A in reagent_list) + for(var/A in cached_reagents) var/datum/reagent/R = A if (R.id == reagent) @@ -518,7 +524,7 @@ var/const/INJECT = 5 //injection if(D) var/datum/reagent/R = new D.type(data) - reagent_list += R + cached_reagents += R R.holder = src R.volume = amount if(data) @@ -552,7 +558,9 @@ var/const/INJECT = 5 //injection if(!isnum(amount)) return 1 - for(var/A in reagent_list) + var/list/cached_reagents = reagent_list + + for(var/A in cached_reagents) var/datum/reagent/R = A if (R.id == reagent) R.volume -= amount @@ -566,7 +574,8 @@ var/const/INJECT = 5 //injection return 1 /datum/reagents/proc/has_reagent(reagent, amount = -1) - for(var/_reagent in reagent_list) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) var/datum/reagent/R = _reagent if (R.id == reagent) if(!amount) @@ -580,7 +589,8 @@ var/const/INJECT = 5 //injection return 0 /datum/reagents/proc/get_reagent_amount(reagent) - for(var/_reagent in reagent_list) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) var/datum/reagent/R = _reagent if (R.id == reagent) return R.volume @@ -589,7 +599,8 @@ var/const/INJECT = 5 //injection /datum/reagents/proc/get_reagents() var/list/names = list() - for(var/reagent in reagent_list) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) var/datum/reagent/R = reagent names += R.name @@ -597,10 +608,10 @@ var/const/INJECT = 5 //injection /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 reagent_list) + for(var/reagent in cached_reagents) var/datum/reagent/R = reagent var/matches = 0 // Switch between how we check the reagent type @@ -619,14 +630,16 @@ var/const/INJECT = 5 //injection //two helper functions to preserve data across reactions (needed for xenoarch) /datum/reagents/proc/get_data(reagent_id) - for(var/reagent in reagent_list) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) var/datum/reagent/R = reagent if(R.id == reagent_id) //world << "proffering a data-carrying reagent ([reagent_id])" return R.data /datum/reagents/proc/set_data(reagent_id, new_data) - for(var/reagent in reagent_list) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) var/datum/reagent/R = reagent if(R.id == reagent_id) //world << "reagent data set ([reagent_id])" @@ -654,7 +667,8 @@ var/const/INJECT = 5 //injection return trans_data /datum/reagents/proc/get_reagent(type) - . = locate(type) in reagent_list + var/list/cached_reagents = reagent_list + . = locate(type) in cached_reagents /////////////////////////////////////////////////////////////////////////////////// @@ -666,5 +680,4 @@ var/const/INJECT = 5 //injection if(reagents) qdel(reagents) reagents = new/datum/reagents(max_vol) - if(istype(src, /atom)) - reagents.my_atom = src + reagents.my_atom = src diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index ee9fc9a6d0d..76a956259bf 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -426,16 +426,16 @@ won't update every console in existence) but it's more of a hassle to do. Also, enough_materials = 0 g2g = 0 else - for(var/R in being_built.reagents) - if(!linked_lathe.reagents.has_reagent(R, being_built.reagents[R]*coeff)) + for(var/R in being_built.reagents_list) + if(!linked_lathe.reagents.has_reagent(R, being_built.reagents_list[R]*coeff)) linked_lathe.say("Not enough reagents to complete prototype.") enough_materials = 0 g2g = 0 if(enough_materials) linked_lathe.materials.use_amount(efficient_mats, amount) - for(var/R in being_built.reagents) - linked_lathe.reagents.remove_reagent(R, being_built.reagents[R]*coeff) + for(var/R in being_built.reagents_list) + linked_lathe.reagents.remove_reagent(R, being_built.reagents_list[R]*coeff) var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes. spawn(32*coeff*amount**0.8) @@ -499,16 +499,16 @@ won't update every console in existence) but it's more of a hassle to do. Also, enough_materials = 0 g2g = 0 else - for(var/R in being_built.reagents) - if(!linked_imprinter.reagents.has_reagent(R, being_built.reagents[R]/coeff)) + for(var/R in being_built.reagents_list) + if(!linked_imprinter.reagents.has_reagent(R, being_built.reagents_list[R]/coeff)) linked_imprinter.say("Not enough reagents to complete prototype.") enough_materials = 0 g2g = 0 if(enough_materials) linked_imprinter.materials.use_amount(efficient_mats) - for(var/R in being_built.reagents) - linked_imprinter.reagents.remove_reagent(R, being_built.reagents[R]/coeff) + for(var/R in being_built.reagents_list) + linked_imprinter.reagents.remove_reagent(R, being_built.reagents_list[R]/coeff) var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes. spawn(16) @@ -727,7 +727,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(D.build_type & MECHFAB) dat += "Exosuit Fabricator
" if(D.build_type & BIOGENERATOR) dat += "Biogenerator
" dat += "Required Materials:
" - var/all_mats = D.materials + D.reagents + var/all_mats = D.materials + D.reagents_list for(var/M in all_mats) dat += "* [CallMaterialName(M)] x [all_mats[M]]
" dat += "Operations: Upload to Database Clear Slot" @@ -848,7 +848,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/c = 50 var/t - var/all_materials = D.materials + D.reagents + var/all_materials = D.materials + D.reagents_list for(var/M in all_materials) t = linked_lathe.check_mat(D, M) temp_material += " | " @@ -882,7 +882,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/temp_material var/c = 50 var/t - var/all_materials = D.materials + D.reagents + var/all_materials = D.materials + D.reagents_list for(var/M in all_materials) t = linked_lathe.check_mat(D, M) temp_material += " | " @@ -967,7 +967,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/temp_materials var/check_materials = 1 - var/all_materials = D.materials + D.reagents + var/all_materials = D.materials + D.reagents_list for(var/M in all_materials) temp_materials += " | " @@ -993,7 +993,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, for(var/datum/design/D in matching_designs) var/temp_materials var/check_materials = 1 - var/all_materials = D.materials + D.reagents + var/all_materials = D.materials + D.reagents_list for(var/M in all_materials) temp_materials += " | " if (!linked_imprinter.check_mat(D, M)) diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index 18b561ff10b..47ef698d7f9 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -1,15 +1,15 @@ -require=function t(e,n,a){function r(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(i)return i(o,!0);var p=Error("Cannot find module '"+o+"'");throw p.code="MODULE_NOT_FOUND",p}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n?n:t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?p[2]:void 0,l=Math.min((void 0===c?o:r(c,o))-u,o-s),f=1;for(s>u&&u+l>s&&(f=-1,u+=l-1,s+=l-1);l-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var a=t(80),r=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=a(this),n=i(e.length),o=arguments,s=o.length,u=r(s>1?o[1]:void 0,n),p=s>2?o[2]:void 0,c=void 0===p?n:r(p,n);c>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var a=t(78),r=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=a(e),p=r(u.length),c=i(o,p);if(t&&n!=n){for(;p>c;)if(s=u[c++],s!=s)return!0}else for(;p>c;c++)if((t||c in u)&&u[c]===n)return t||c;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var a=t(17),r=t(34),i=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,p=4==t,c=6==t,l=5==t||c;return function(f,d,h){for(var m,v,g=i(f),b=r(g),y=a(d,h,3),_=o(b.length),x=0,w=e?s(f,_):n?s(f,0):void 0;_>x;x++)if((l||x in b)&&(m=b[x],v=y(m,x,g),t))if(e)w[x]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return x;case 2:w.push(m)}else if(p)return!1;return c?-1:u||p?p:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var a=t(38),r=t(36),i=t(83)("species");e.exports=function(t,e){var n;return r(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)||(n=void 0),a(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var a=t(11),r=t(83)("toStringTag"),i="Arguments"==a(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[r])?n:i?a(e):"Object"==(o=a(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var a=t(46),r=t(31),i=t(60),o=t(17),s=t(69),u=t(18),p=t(27),c=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,b=v?"_s":"size",y=0,_=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";r(t,f,++y)}return"O"+t[f]},x=function(t,e){var n,a=_(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,r){var c=t(function(t,i){s(t,c,e),t._i=a.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&p(i,n,t[r],t)});return i(c.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=x(e,t);if(n){var a=n.n,r=n.p;delete e._i[n.i],n.r=!0,r&&(r.n=a),a&&(a.p=r),e._f==n&&(e._f=a),e._l==n&&(e._l=r),e[b]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!x(this,t)}}),v&&a.setDesc(c.prototype,"size",{get:function(){return u(this[b])}}),c},def:function(t,e,n){var a,r,i=x(t,e);return i?i.v=n:(t._l=i={i:r=_(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[b]++,"F"!==r&&(t._i[r]=i)),t},getEntry:x,setStrong:function(t,e,n){c(t,e,function(t,e){this._t=t,this._k=e,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?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var a=t(27),r=t(10);e.exports=function(t){return function(){if(r(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return a(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var a=t(31),r=t(60),i=t(4),o=t(38),s=t(69),u=t(27),p=t(8),c=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=p(5),h=p(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,a){var i=t(function(t,r){s(t,i,e),t._i=m++,t._l=void 0,void 0!=r&&u(r,n,t[a],t)});return r(i.prototype,{"delete":function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(c(e,l)||a(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var a=t(29),r=t(22),i=t(61),o=t(60),s=t(27),u=t(69),p=t(38),c=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=a[t],g=v,b=h?"set":"add",y=g&&g.prototype,_={},x=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!p(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 g&&(m||y.forEach&&!c(function(){(new g).entries().next()}))){var w,k=new g,P=k[b](m?{}:-0,1)!=k,E=c(function(){k.has(1)}),C=l(function(t){new g(t)});C||(g=e(function(e,n){u(e,g,t);var a=new v;return void 0!=n&&s(n,h,a[b],a),a}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(E||w)&&(x("delete"),x("has"),h&&x("get")),(w||P)&&x(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),_[t]=g,r(r.G+r.W+r.F*(g!=v),_),m||d.setStrong(g,t,h),g}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var a=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=a)},{}],17:[function(t,e,n){var a=t(2);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)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var a=t(38),r=t(29).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var a=t(46);e.exports=function(t){var e=a.getKeys(t),n=a.getSymbols;if(n)for(var r,i=n(t),o=a.isEnum,s=0;i.length>s;)o.call(t,r=i[s++])&&e.push(r);return e}},{46:46}],22:[function(t,e,n){var a=t(29),r=t(16),i=t(31),o=t(61),s=t(17),u="prototype",p=function(t,e,n){var c,l,f,d,h=t&p.F,m=t&p.G,v=t&p.S,g=t&p.P,b=t&p.B,y=m?a:v?a[e]||(a[e]={}):(a[e]||{})[u],_=m?r:r[e]||(r[e]={}),x=_[u]||(_[u]={});m&&(n=e);for(c in n)l=!h&&y&&c in y,f=(l?y:n)[c],d=b&&l?s(f,a):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,c,f),_[c]!=f&&i(_,c,d),g&&x[c]!=f&&(x[c]=f)};a.core=r,p.F=1,p.G=2,p.S=4,p.P=8,p.B=16,p.W=32,e.exports=p},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var a=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var a=t(31),r=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),p=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,n(o,u,p)),a(RegExp.prototype,u,2==e?function(t,e){return p.call(t,this,e)}:function(t){return p.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var a=t(4);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}},{4:4}],27:[function(t,e,n){var a=t(17),r=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,p){var c,l,f,d=u(t),h=a(n,p,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(c=s(t.length);c>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)r(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var a=t(78),r=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{46:46,78:78}],29:[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)},{}],30:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],31:[function(t,e,n){var a=t(46),r=t(59);e.exports=t(19)?function(t,e,n){return a.setDesc(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[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)}},{}],34:[function(t,e,n){var a=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var a=t(45),r=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{45:45,83:83}],36:[function(t,e,n){var a=t(11);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{11:11}],37:[function(t,e,n){var a=t(38),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var a=t(38),r=t(11),i=t(83)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var a=t(4);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}}},{4:4}],41:[function(t,e,n){"use strict";var a=t(46),r=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a.create(o,{next:r(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var a=t(48),r=t(22),i=t(61),o=t(31),s=t(30),u=t(45),p=t(41),c=t(66),l=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,_,x){p(n,e,b);var w,k,P=function(t){if(!d&&t in A)return A[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},E=e+" Iterator",C=y==v,S=!1,A=t.prototype,O=A[f]||A[h]||y&&A[y],T=O||P(y);if(O){var M=l(T.call(new t));c(M,E,!0),!a&&s(A,h)&&o(M,f,g),C&&O.name!==v&&(S=!0,T=function(){return O.call(this)})}if(a&&!x||!d&&!S&&A[f]||o(A,f,T),u[e]=T,u[E]=g,y)if(w={values:C?T:P(v),keys:_?T:P(m),entries:C?P("entries"):T},x)for(k in w)k in A||i(A,k,w[k]);else r(r.P+r.F*(d||S),e,w);return w}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var a=t(83)("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}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var a=Object;e.exports={create:a.create,getProto:a.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:a.getOwnPropertyDescriptor,setDesc:a.defineProperty,setDescs:a.defineProperties,getKeys:a.keys,getNames:a.getOwnPropertyNames,getSymbols:a.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var a=t(46),r=t(78);e.exports=function(t,e){for(var n,i=r(t),o=a.getKeys(i),s=o.length,u=0;s>u;)if(i[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[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)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var a,r,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,p=o.process,c=o.Promise,l="process"==t(11)(p),f=function(){var t,e,n;for(l&&(t=p.domain)&&(p.domain=null,t.exit());a;)e=a.domain,n=a.fn,e&&e.enter(),n(),e&&e.exit(),a=a.next;r=void 0,t&&t.enter()};if(l)i=function(){p.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=c&&c.resolve?function(){c.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&p.domain};r&&(r.next=e),a||(a=e,i()),r=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var a=t(46),r=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},a=Symbol(),r="abcdefghijklmnopqrst";return e[a]=7,r.split("").forEach(function(t){n[t]=t}),7!=t({},e)[a]||Object.keys(t({},n)).join("")!=r})?function(t,e){for(var n=r(t),o=arguments,s=o.length,u=1,p=a.getKeys,c=a.getSymbols,l=a.isEnum;s>u;)for(var f,d=i(o[u++]),h=c?p(d).concat(c(d)):p(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var a=t(22),r=t(16),i=t(24);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)}},{16:16,22:22,24:24}],55:[function(t,e,n){var a=t(46),r=t(78),i=a.isEnum;e.exports=function(t){return function(e){for(var n,o=r(e),s=a.getKeys(o),u=s.length,p=0,c=[];u>p;)i.call(o,n=s[p++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{46:46,78:78}],56:[function(t,e,n){var a=t(46),r=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=a.getNames(r(t)),n=a.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var a=t(58),r=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=a._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var a,i=this,o=arguments,p=o.length,c=0,l=0;if(!u&&!p)return r(t,n,i);if(a=n.slice(),u)for(;e>c;c++)a[c]===s&&(a[c]=o[l++]);for(;p>l;)a.push(o[l++]);return r(t,a,i)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var a=t(61);e.exports=function(t,e){for(var n in e)a(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var a=t(29),r=t(31),i=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||r(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||r(n,"name",e)),t===a?t[e]=n:(o||delete t[e],r(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[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)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var a=t(46).getDesc,r=t(38),i=t(4),o=function(t,e){if(i(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,r){try{r=t(17)(Function.call,a(Object.prototype,"__proto__").set,2),r(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var a=t(29),r=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var a=t(46).setDesc,r=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var a=t(29),r="__core-js_shared__",i=a[r]||(a[r]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var a=t(4),r=t(2),i=t(83)("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)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var a=t(77),r=t(18);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",u=a(n),p=s.length;return 0>u||u>=p?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===p||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):(i-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var a=t(39),r=t(18);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{18:18,39:39}],72:[function(t,e,n){var a=t(79),r=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,p=void 0===n?" ":n+"",c=a(e);if(u>=c)return s;""==p&&(p=" ");var l=c-u,f=r.call(p,Math.ceil(l/p.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var a=t(77),r=t(18);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}},{18:18,77:77}],74:[function(t,e,n){var a=t(22),r=t(18),i=t(24),o=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",s="["+o+"]",u="​…",p=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),a(a.P+a.F*i(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(p,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var a,r,i,o=t(17),s=t(33),u=t(32),p=t(20),c=t(29),l=c.process,f=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},a(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?a=function(t){l.nextTick(o(b,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=y,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",y,!1)):a=g in p("script")?function(t){u.appendChild(p("script"))[g]=function(){u.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var a=t(77),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{77:77}],77:[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)}},{}],78:[function(t,e,n){var a=t(34),r=t(18);e.exports=function(t){return a(r(t))}},{18:18,34:34}],79:[function(t,e,n){var a=t(77),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var a=t(18);e.exports=function(t){return Object(a(t))}},{18:18}],81:[function(t,e,n){var a=t(38);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")}},{38:38}],82:[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))}},{}],83:[function(t,e,n){var a=t(67)("wks"),r=t(82),i=t(29).Symbol;e.exports=function(t){return a[t]||(a[t]=i&&i[t]||(i||r)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var a=t(10),r=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var a,r=t(46),i=t(22),o=t(19),s=t(59),u=t(32),p=t(20),c=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),_=t(76),x=t(79),w=t(34),k=t(82)("__proto__"),P=t(8),E=t(7)(!1),C=Object.prototype,S=Array.prototype,A=S.slice,O=S.join,T=r.setDesc,M=r.getDesc,R=r.setDescs,j={};o||(a=!d(function(){return 7!=T(p("div"),"a",{get:function(){return 7}}).a}),r.setDesc=function(t,e,n){if(a)try{return T(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},r.getDesc=function(t,e){if(a)try{return M(t,e)}catch(n){}return c(t,e)?s(!C.propertyIsEnumerable.call(t,e),t[e]):void 0},r.setDescs=R=function(t,e){h(t);for(var n,a=r.getKeys(e),i=a.length,o=0;i>o;)r.setDesc(t,n=a[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:r.getDesc,defineProperty:r.setDesc,defineProperties:R});var L="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=L.concat("length","prototype"),F=L.length,D=function(){var t,e=p("iframe"),n=F,a=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("