diff --git a/aurorastation.dme b/aurorastation.dme index 535980a2d0d..9730c877292 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -745,6 +745,7 @@ #include "code\game\objects\items\devices\megaphone.dm" #include "code\game\objects\items\devices\modkit.dm" #include "code\game\objects\items\devices\multitool.dm" +#include "code\game\objects\items\devices\oxycandle.dm" #include "code\game\objects\items\devices\paicard.dm" #include "code\game\objects\items\devices\pipe_painter.dm" #include "code\game\objects\items\devices\powersink.dm" diff --git a/code/game/objects/items/devices/oxycandle.dm b/code/game/objects/items/devices/oxycandle.dm new file mode 100644 index 00000000000..229346dbb1b --- /dev/null +++ b/code/game/objects/items/devices/oxycandle.dm @@ -0,0 +1,73 @@ +/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" + icon = 'icons/obj/device.dmi' + icon_state = "oxycandle" + item_state = "oxycandle" + w_class = ITEMSIZE_SMALL // Should fit into internal's box or maybe pocket + var/target_pressure = ONE_ATMOSPHERE + var/datum/gas_mixture/air_contents = null + var/volume = 5600 // One tile has 2500 volume of air, so two tiles plus a bit extra + var/on = FALSE + var/activation_sound = 'sound/items/flare.ogg' + light_color = LIGHT_COLOR_FLARE + uv_intensity = 50 + var/brightness_on = 2 // Moderate bright. + light_power = 2 + action_button_name = null + +/obj/item/device/oxycandle/attack_self(mob/user) + if(!on) + user << "You pull the cord and [src] ignites." + light_range = brightness_on + on = TRUE + update_icon() + playsound(src.loc, activation_sound, 75, 1) + air_contents = new /datum/gas_mixture() + air_contents.volume = 200 //liters + air_contents.temperature = T20C + var/list/air_mix = list("oxygen" = O2STANDARD * (target_pressure * air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature), + "nitrogen" = N2STANDARD * (target_pressure * air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjust_multi("oxygen", air_mix["oxygen"], "nitrogen", air_mix["nitrogen"]) + START_PROCESSING(SSprocessing, src) + +// Process of Oxygen candles releasing air. Makes 200 volume of oxygen and nitrogen mix +/obj/item/device/oxycandle/process() + if(!loc) + return + var/turf/pos = get_turf(src) + if(volume <= 0 || istype(pos, /turf/simulated/floor/beach/water) || istype(pos, /turf/unsimulated/beach/water)) + STOP_PROCESSING(SSprocessing, src) + icon_state = "oxycandle_burnt" + item_state = icon_state + set_light(0) + update_held_icon() + name = "burnt oxygen candle" + desc += "This tube has exhausted its chemicals." + return + if(pos) + pos.hotspot_expose(1500, 5) + var/datum/gas_mixture/environment = loc.return_air() + var/pressure_delta = target_pressure - environment.return_pressure() + var/output_volume = environment.volume * environment.group_multiplier + var/air_temperature = air_contents.temperature? air_contents.temperature : environment.temperature + var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION) + var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) + if (!removed) //Just in case + return + environment.merge(removed) + volume -= 200 + var/list/air_mix = list("oxygen" = O2STANDARD * (target_pressure * air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature), + "nitrogen" = N2STANDARD * (target_pressure * air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjust_multi("oxygen", air_mix["oxygen"], "nitrogen", air_mix["nitrogen"]) + +/obj/item/device/oxycandle/update_icon() + if(on) + icon_state = "oxycandle_on" + item_state = icon_state + set_light(brightness_on) + else + icon_state = "oxycandle" + item_state = icon_state + set_light(0) + update_held_icon() diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index d995e358bf4..a1de0fb4dc5 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -28,6 +28,7 @@ new /obj/item/clothing/mask/breath(src) new /obj/item/clothing/suit/space/emergency(src) new /obj/item/clothing/head/helmet/space/emergency(src) + new /obj/item/device/oxycandle(src) if ("aid") new /obj/item/weapon/tank/emergency_oxygen(src) new /obj/item/weapon/storage/toolbox/emergency(src) @@ -35,11 +36,14 @@ new /obj/item/weapon/storage/firstaid/o2(src) new /obj/item/clothing/suit/space/emergency(src) new /obj/item/clothing/head/helmet/space/emergency(src) + new /obj/item/device/oxycandle(src) if ("tank") new /obj/item/weapon/tank/emergency_oxygen/engi(src) new /obj/item/clothing/mask/breath(src) new /obj/item/weapon/tank/emergency_oxygen/engi(src) new /obj/item/clothing/mask/breath(src) + new /obj/item/device/oxycandle(src) + new /obj/item/device/oxycandle(src) if ("both") new /obj/item/weapon/storage/toolbox/emergency(src) new /obj/item/weapon/tank/emergency_oxygen/engi(src) @@ -49,6 +53,9 @@ new /obj/item/clothing/suit/space/emergency(src) new /obj/item/clothing/head/helmet/space/emergency(src) new /obj/item/clothing/head/helmet/space/emergency(src) + new /obj/item/device/oxycandle(src) + new /obj/item/device/oxycandle(src) + new /obj/item/device/oxycandle(src) /obj/structure/closet/emcloset/legacy/fill() ..() diff --git a/html/changelogs/sindorman-oxycandle.yml b/html/changelogs/sindorman-oxycandle.yml new file mode 100644 index 00000000000..b882e8afc86 --- /dev/null +++ b/html/changelogs/sindorman-oxycandle.yml @@ -0,0 +1,6 @@ +author: PoZe + +delete-after: True + +changes: + - rscadd: "Added oxygen candles as an item. They are one-time emergency item that is used to fill 2-3 tiles of depressurized environment" diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi index 244e23fc7d8..fc86ff39d7f 100644 Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi index 1ece352df81..89c14787ff9 100644 Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 77f8e73f151..a7149ea9c4e 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ