diff --git a/code/__defines/atmos.dm b/code/__defines/atmos.dm index 3eb95c75a07..38db16bff28 100644 --- a/code/__defines/atmos.dm +++ b/code/__defines/atmos.dm @@ -93,7 +93,9 @@ #define ZONE_ACTIVE 1 #define ZONE_SLEEPING 0 -#define MAX_PUMP_PRESSURE 15000 // Maximal pressure setting for pumps and vents +#define MAX_VENT_PRESSURE 15000 // 15000 kPa of pressure. +#define PRESSURE_ONE_THOUSAND 1000 // 1000 kPa of pressure. Allows for easier searchability. +#define PRESSURE_EXERTED 200 // 200 kPa of pressure. // Defines how much of certain gas do the Atmospherics tanks start with. Values are in kpa per tile (assuming 20C) #define ATMOSTANK_NITROGEN 90000 // A lot of N2 is needed to produce air mix, that's why we keep 90MPa of it diff --git a/code/__defines/machinery.dm b/code/__defines/machinery.dm index fca543a7c54..865a44ccbed 100644 --- a/code/__defines/machinery.dm +++ b/code/__defines/machinery.dm @@ -121,9 +121,9 @@ var/list/restricted_camera_networks = list(NETWORK_ERT,NETWORK_MERCENARY,"Secret #define ATMOS_DEFAULT_VOLUME_HE_PIPE 70 // L. // Default maximum pressure for simple pipes -#define ATMOS_DEFAULT_MAX_PRESSURE 70*ONE_ATMOSPHERE -#define ATMOS_DEFAULT_FATIGUE_PRESSURE 55*ONE_ATMOSPHERE -#define ATMOS_DEFAULT_ALERT_PRESSURE ATMOS_DEFAULT_FATIGUE_PRESSURE +#define ATMOS_DEFAULT_MAX_PRESSURE PRESSURE_ONE_THOUSAND * 20 // 20000 kPa. +#define ATMOS_DEFAULT_FATIGUE_PRESSURE PRESSURE_ONE_THOUSAND * 15 // 15000 kPa. +#define ATMOS_DEFAULT_ALERT_PRESSURE ATMOS_DEFAULT_FATIGUE_PRESSURE // See above. // Misc process flags. #define M_PROCESSES 0x1 diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index 053c89aaf21..d6f9b2b4870 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -152,9 +152,9 @@ obj/machinery/computer/general_air_control/Destroy() var/list/output_info var/default_input_flow_setting = 200 - var/default_pressure_setting = 2000 + var/default_pressure_setting = PRESSURE_ONE_THOUSAND * 2 var/max_input_flow_setting = ATMOS_DEFAULT_VOLUME_PUMP + 500 - var/max_pressure_setting = 15000 + var/max_pressure_setting = MAX_VENT_PRESSURE circuit = /obj/item/circuitboard/air_management/tank_control /obj/machinery/computer/general_air_control/large_tank_control/wall @@ -247,7 +247,7 @@ obj/machinery/computer/general_air_control/Destroy() var/default_input_flow_setting = 700 var/default_pressure_setting = 100 var/max_input_flow_setting = ATMOS_DEFAULT_VOLUME_PUMP + 500 - var/max_pressure_setting = 1000 + var/max_pressure_setting = PRESSURE_ONE_THOUSAND circuit = /obj/item/circuitboard/air_management/supermatter_core /obj/machinery/computer/general_air_control/supermatter_core/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 84df3012dc9..35dd8c0dc88 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -20,7 +20,7 @@ var/canister_color = "yellow" var/can_label = 1 - start_pressure = 5000 + start_pressure = PRESSURE_ONE_THOUSAND * 5 var/temperature_resistance = 1000 + T0C volume = 1000 use_power = POWER_USE_OFF diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index e3b5fe6cfe1..ce8c0b0fc35 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -7,15 +7,15 @@ icon = 'icons/obj/atmos.dmi' icon_state = "psiphon:0" - density = 1 + density = TRUE w_class = ITEMSIZE_NORMAL - var/on = 0 + var/on = FALSE var/direction_out = 0 //0 = siphoning, 1 = releasing var/target_pressure = ONE_ATMOSPHERE var/pressuremin = 0 - var/pressuremax = 10 * ONE_ATMOSPHERE + var/pressuremax = PRESSURE_ONE_THOUSAND volume = 1000 @@ -23,7 +23,7 @@ power_losses = 150 /obj/machinery/portable_atmospherics/powered/pump/filled - start_pressure = 90 * ONE_ATMOSPHERE + start_pressure = PRESSURE_ONE_THOUSAND * 5 /obj/machinery/portable_atmospherics/powered/pump/Initialize() . = ..() diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 1b7a74bebd7..6b6a211f939 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -7,10 +7,10 @@ icon = 'icons/obj/atmos.dmi' icon_state = "pscrubber:0" - density = 1 + density = TRUE w_class = ITEMSIZE_NORMAL - var/on = 0 + var/on = FALSE var/volume_rate = 800 volume = 750 @@ -19,7 +19,7 @@ power_losses = 150 var/minrate = 0 - var/maxrate = 10 * ONE_ATMOSPHERE + var/maxrate = PRESSURE_ONE_THOUSAND var/list/scrubbing_gas = list(GAS_PHORON, GAS_CO2, GAS_N2O, GAS_HYDROGEN) diff --git a/code/game/objects/items/devices/oxycandle.dm b/code/game/objects/items/devices/oxycandle.dm index 848abc9356a..961e5143054 100644 --- a/code/game/objects/items/devices/oxycandle.dm +++ b/code/game/objects/items/devices/oxycandle.dm @@ -1,6 +1,6 @@ /obj/item/device/oxycandle name = "oxygen candle" - desc = "A steel tube with the words 'OXYGEN - PULL CORD TO IGNITE' stamped on the side. A small label warns against using the device underwater" + desc = "A steel tube with the words 'OXYGEN - PULL CORD TO IGNITE' stamped on the side. A small label warns against using the device underwater." icon = 'icons/obj/device.dmi' icon_state = "oxycandle" item_state = "oxycandle" diff --git a/code/game/objects/items/weapons/circuitboards/computer/air_management.dm b/code/game/objects/items/weapons/circuitboards/computer/air_management.dm index fac2fd3df12..da11d858ffc 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/air_management.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/air_management.dm @@ -21,7 +21,7 @@ var/list/output_info = list() var/input_flow_setting = 200 - var/pressure_setting = 2000 + var/pressure_setting = PRESSURE_ONE_THOUSAND * 2 /obj/item/circuitboard/air_management/supermatter_core name = T_BOARD("core control") diff --git a/code/modules/atmospherics/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/components/binary_devices/passive_gate.dm index e3c7a3939cc..768f7824ddb 100644 --- a/code/modules/atmospherics/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/components/binary_devices/passive_gate.dm @@ -280,7 +280,7 @@ return TRUE var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + if ((int_air.return_pressure()-env_air.return_pressure()) > PRESSURE_EXERTED) to_chat(user, "You cannot unwrench \the [src], it too exerted due to internal pressure.") add_fingerprint(user) return TRUE diff --git a/code/modules/atmospherics/components/binary_devices/pump.dm b/code/modules/atmospherics/components/binary_devices/pump.dm index 57b618de1d7..5933bbf7b0c 100644 --- a/code/modules/atmospherics/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/components/binary_devices/pump.dm @@ -226,7 +226,7 @@ Thus, the two variables affect pump operation are set in New(): return TRUE var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE && !istype(W, /obj/item/pipewrench)) + if ((int_air.return_pressure()-env_air.return_pressure()) > PRESSURE_EXERTED && !istype(W, /obj/item/pipewrench)) to_chat(user, "You cannot unwrench this [src], it's too exerted due to internal pressure.") add_fingerprint(user) return TRUE diff --git a/code/modules/atmospherics/components/omni_devices/omni_base.dm b/code/modules/atmospherics/components/omni_devices/omni_base.dm index 2810d579c0f..e84f02b6f19 100644 --- a/code/modules/atmospherics/components/omni_devices/omni_base.dm +++ b/code/modules/atmospherics/components/omni_devices/omni_base.dm @@ -89,7 +89,7 @@ for(var/datum/omni_port/P in ports) int_pressure += P.air.return_pressure() var/datum/gas_mixture/env_air = loc.return_air() - if ((int_pressure - env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + if ((int_pressure - env_air.return_pressure()) > PRESSURE_EXERTED) to_chat(user, "You cannot unwrench \the [src], it is too exerted due to internal pressure.") add_fingerprint(user) return TRUE diff --git a/code/modules/atmospherics/components/portables_connector.dm b/code/modules/atmospherics/components/portables_connector.dm index 4b27ffc7c51..0b1eb5193e8 100644 --- a/code/modules/atmospherics/components/portables_connector.dm +++ b/code/modules/atmospherics/components/portables_connector.dm @@ -140,7 +140,7 @@ return TRUE var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + if ((int_air.return_pressure()-env_air.return_pressure()) > PRESSURE_EXERTED) to_chat(user, "You cannot unwrench \the [src], it too exerted due to internal pressure.") add_fingerprint(user) return TRUE diff --git a/code/modules/atmospherics/components/trinary_devices/filter.dm b/code/modules/atmospherics/components/trinary_devices/filter.dm index f45722db791..121e4db7074 100644 --- a/code/modules/atmospherics/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/components/trinary_devices/filter.dm @@ -136,7 +136,7 @@ return ..() var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + if ((int_air.return_pressure()-env_air.return_pressure()) > PRESSURE_EXERTED) to_chat(user, "You cannot unwrench \the [src], it too exerted due to internal pressure.") add_fingerprint(user) return TRUE diff --git a/code/modules/atmospherics/components/trinary_devices/mixer.dm b/code/modules/atmospherics/components/trinary_devices/mixer.dm index 77cf636289d..f035b9a0726 100644 --- a/code/modules/atmospherics/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/components/trinary_devices/mixer.dm @@ -108,7 +108,7 @@ return ..() var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + if ((int_air.return_pressure()-env_air.return_pressure()) > PRESSURE_EXERTED) to_chat(user, "You cannot unwrench \the [src], it too exerted due to internal pressure.") add_fingerprint(user) return TRUE diff --git a/code/modules/atmospherics/components/tvalve.dm b/code/modules/atmospherics/components/tvalve.dm index b2bc9946736..e45b19c7877 100644 --- a/code/modules/atmospherics/components/tvalve.dm +++ b/code/modules/atmospherics/components/tvalve.dm @@ -351,7 +351,7 @@ return TRUE var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + if ((int_air.return_pressure()-env_air.return_pressure()) > PRESSURE_EXERTED) to_chat(user, "You cannot unwrench \the [src], it too exerted due to internal pressure.") add_fingerprint(user) return TRUE diff --git a/code/modules/atmospherics/components/unary/heat_exchanger.dm b/code/modules/atmospherics/components/unary/heat_exchanger.dm index 12a87e58fdc..cf686d5d1f2 100644 --- a/code/modules/atmospherics/components/unary/heat_exchanger.dm +++ b/code/modules/atmospherics/components/unary/heat_exchanger.dm @@ -74,7 +74,7 @@ return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + if ((int_air.return_pressure()-env_air.return_pressure()) > PRESSURE_EXERTED) to_chat(user, "You cannot unwrench \the [src], it is too exerted due to internal pressure.") add_fingerprint(user) return 1 diff --git a/code/modules/atmospherics/components/unary/vent_pump.dm b/code/modules/atmospherics/components/unary/vent_pump.dm index 71711f1abc2..cd05b038c8b 100644 --- a/code/modules/atmospherics/components/unary/vent_pump.dm +++ b/code/modules/atmospherics/components/unary/vent_pump.dm @@ -62,8 +62,8 @@ icon_state = "map_vent_in" external_pressure_bound = 0 external_pressure_bound_default = 0 - internal_pressure_bound = 2000 - internal_pressure_bound_default = 2000 + internal_pressure_bound = PRESSURE_ONE_THOUSAND * 2 + internal_pressure_bound_default = PRESSURE_ONE_THOUSAND * 2 pressure_checks = 2 pressure_checks_default = 2 @@ -76,8 +76,8 @@ icon_state = "map_vent_in" external_pressure_bound = 0 external_pressure_bound_default = 0 - internal_pressure_bound = 2000 - internal_pressure_bound_default = 2000 + internal_pressure_bound = PRESSURE_ONE_THOUSAND * 2 + internal_pressure_bound_default = PRESSURE_ONE_THOUSAND * 2 pressure_checks = 2 pressure_checks_default = 2 @@ -327,7 +327,7 @@ internal_pressure_bound = between( 0, text2num(signal.data["set_internal_pressure"]), - ONE_ATMOSPHERE*50 + MAX_VENT_PRESSURE ) if(signal.data["set_external_pressure"] != null) @@ -337,14 +337,14 @@ external_pressure_bound = between( 0, text2num(signal.data["set_external_pressure"]), - ONE_ATMOSPHERE*50 + MAX_VENT_PRESSURE ) if(signal.data["adjust_internal_pressure"] != null) internal_pressure_bound = between( 0, internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]), - ONE_ATMOSPHERE*50 + MAX_VENT_PRESSURE ) if(signal.data["adjust_external_pressure"] != null) @@ -353,7 +353,7 @@ external_pressure_bound = between( 0, external_pressure_bound + text2num(signal.data["adjust_external_pressure"]), - ONE_ATMOSPHERE*50 + MAX_VENT_PRESSURE ) if(signal.data["init"] != null) @@ -436,7 +436,7 @@ return TRUE var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + if ((int_air.return_pressure()-env_air.return_pressure()) > PRESSURE_EXERTED) to_chat(user, SPAN_WARNING("You cannot unwrench \the [src], it is too exerted due to internal pressure.")) add_fingerprint(user) return TRUE diff --git a/code/modules/atmospherics/components/unary/vent_scrubber.dm b/code/modules/atmospherics/components/unary/vent_scrubber.dm index f36d52a394f..22c265037e4 100644 --- a/code/modules/atmospherics/components/unary/vent_scrubber.dm +++ b/code/modules/atmospherics/components/unary/vent_scrubber.dm @@ -306,7 +306,7 @@ return TRUE var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + if ((int_air.return_pressure()-env_air.return_pressure()) > PRESSURE_EXERTED) to_chat(user, SPAN_WARNING("You cannot unwrench \the [src], it is too exerted due to internal pressure.")) add_fingerprint(user) return TRUE diff --git a/code/modules/atmospherics/components/valve.dm b/code/modules/atmospherics/components/valve.dm index 858b6aeb6b5..dca6eecb555 100644 --- a/code/modules/atmospherics/components/valve.dm +++ b/code/modules/atmospherics/components/valve.dm @@ -309,7 +309,7 @@ return TRUE var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + if ((int_air.return_pressure()-env_air.return_pressure()) > PRESSURE_EXERTED) to_chat(user, "You cannot unwrench \the [src], it is too exerted due to internal pressure.") add_fingerprint(user) return TRUE diff --git a/code/modules/atmospherics/pipes.dm b/code/modules/atmospherics/pipes.dm index 64cb272bc8f..6d1b2f94e93 100644 --- a/code/modules/atmospherics/pipes.dm +++ b/code/modules/atmospherics/pipes.dm @@ -9,7 +9,7 @@ layer = PIPE_LAYER use_power = POWER_USE_OFF - var/alert_pressure = 80*ONE_ATMOSPHERE + var/alert_pressure = ATMOS_DEFAULT_ALERT_PRESSURE //minimum pressure before check_pressure(...) should be called can_buckle = 1 @@ -95,7 +95,7 @@ return TRUE var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + if ((int_air.return_pressure()-env_air.return_pressure()) > PRESSURE_EXERTED) if(!istype(W, /obj/item/pipewrench)) to_chat(user, "You cannot unwrench \the [src], it is too exerted due to internal pressure.") add_fingerprint(user) @@ -1137,7 +1137,7 @@ desc = "A large vessel containing pressurized gas." volume = 10000 //in liters, 1 meters by 1 meters by 2 meters ~tweaked it a little to simulate a pressure tank without needing to recode them yet - var/start_pressure = 25*ONE_ATMOSPHERE + var/start_pressure = PRESSURE_ONE_THOUSAND * 2.5 level = 1 dir = SOUTH diff --git a/code/modules/multiz/pipes.dm b/code/modules/multiz/pipes.dm index 3eda5756eb9..baeda168324 100644 --- a/code/modules/multiz/pipes.dm +++ b/code/modules/multiz/pipes.dm @@ -17,9 +17,9 @@ var/minimum_temperature_difference = 300 var/thermal_conductivity = 0 //WALL_HEAT_TRANSFER_COEFFICIENT No - var/maximum_pressure = 70*ONE_ATMOSPHERE - var/fatigue_pressure = 55*ONE_ATMOSPHERE - alert_pressure = 55*ONE_ATMOSPHERE + var/maximum_pressure = ATMOS_DEFAULT_MAX_PRESSURE + var/fatigue_pressure = ATMOS_DEFAULT_FATIGUE_PRESSURE + alert_pressure = ATMOS_DEFAULT_ALERT_PRESSURE var/travel_verbname = "UNDEFINED" var/travel_direction_verb = "UNDEFINED" diff --git a/html/changelogs/atmos_output_fix.yml b/html/changelogs/atmos_output_fix.yml new file mode 100644 index 00000000000..ff4b895f764 --- /dev/null +++ b/html/changelogs/atmos_output_fix.yml @@ -0,0 +1,7 @@ +author: SleepyGemmy + +delete-after: True + +changes: + - bugfix: "Fixes atmos volume tanks output pressure." + - bugfix: "Adds a pump from the mix loop to the mixed gas tank." \ No newline at end of file diff --git a/maps/sccv_horizon/sccv_horizon-1_deck_1.dmm b/maps/sccv_horizon/sccv_horizon-1_deck_1.dmm index 3ca170fba83..d3672cbdb70 100644 --- a/maps/sccv_horizon/sccv_horizon-1_deck_1.dmm +++ b/maps/sccv_horizon/sccv_horizon-1_deck_1.dmm @@ -5386,7 +5386,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/binary/passive_gate/on{ - name = "Reactor to Mix" + name = "Reactor Waste to Mix" }, /obj/effect/floor_decal/corner/yellow{ dir = 1 @@ -6494,12 +6494,6 @@ /obj/structure/lattice/catwalk/indoor/grate, /turf/simulated/floor/plating, /area/maintenance/research_port) -"faE" = ( -/obj/machinery/atmospherics/pipe/simple/visible/yellow{ - dir = 5 - }, -/turf/simulated/floor/tiled/dark, -/area/engineering/atmos) "fbc" = ( /obj/structure/cable/green{ icon_state = "4-8" @@ -9567,9 +9561,6 @@ /turf/simulated/floor/tiled/full, /area/maintenance/engineering) "hpU" = ( -/obj/machinery/atmospherics/pipe/simple/visible/yellow{ - dir = 4 - }, /obj/structure/cable/green{ icon_state = "4-8" }, @@ -9579,7 +9570,14 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/tiled/dark, +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/machinery/atmospherics/pipe/simple/visible/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/binary/pump{ + name = "Mix to Connector" + }, +/turf/simulated/floor/tiled/dark/full, /area/engineering/atmos) "hqa" = ( /obj/effect/floor_decal/corner/blue{ @@ -12704,9 +12702,6 @@ /turf/simulated/floor/tiled/dark/full, /area/engineering/atmos) "jVj" = ( -/obj/machinery/atmospherics/pipe/simple/visible/yellow{ - dir = 4 - }, /obj/structure/cable/green{ icon_state = "1-8" }, @@ -12719,10 +12714,11 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/atmospherics/binary/pump{ - name = "Mix to Connector" - }, /obj/effect/floor_decal/industrial/outline/yellow, +/obj/machinery/atmospherics/binary/pump{ + dir = 8; + name = "Mix to Mixed Gas Tank" + }, /turf/simulated/floor/tiled/dark/full, /area/engineering/atmos) "jWE" = ( @@ -26931,9 +26927,6 @@ /obj/structure/cable/green{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/visible/yellow{ - dir = 10 - }, /turf/simulated/floor/tiled/dark, /area/engineering/atmos) "vnJ" = ( @@ -50056,9 +50049,9 @@ jCK jCK jCK sNH -faE +mRc hpU -iFd +dMa qew eIS suA @@ -50260,7 +50253,7 @@ iUi bDt vlY jVj -dMa +iFd mGp eIS qDK