diff --git a/code/ATMOSPHERICS/components/unary_devices/cryo.dm b/code/ATMOSPHERICS/components/unary_devices/cryo.dm index 2d7b771243d..3e562c8d91c 100644 --- a/code/ATMOSPHERICS/components/unary_devices/cryo.dm +++ b/code/ATMOSPHERICS/components/unary_devices/cryo.dm @@ -123,8 +123,8 @@ ..() update_icon() -/obj/machinery/atmospherics/components/unary/cryo_cell/relaymove(mob/user) // Prevent ventcrawl in this machine. - return +/obj/machinery/atmospherics/components/unary/cryo_cell/relaymove(mob/user) + container_resist() /obj/machinery/atmospherics/components/unary/cryo_cell/open_machine() if(!state_open && !panel_open) @@ -175,7 +175,7 @@ I.loc = src user.visible_message("[user] places [I] in [src].", \ "You place [I] in [src].") - if(!(on || occupant || state_open)) + if(!on && !occupant && !state_open) if(default_deconstruction_screwdriver(user, "cell-o", "cell-off", I)) return if(exchange_parts(user, I)) diff --git a/code/datums/wires/suit_storage_unit.dm b/code/datums/wires/suit_storage_unit.dm new file mode 100644 index 00000000000..d51e4c850b6 --- /dev/null +++ b/code/datums/wires/suit_storage_unit.dm @@ -0,0 +1,42 @@ +/datum/wires/suit_storage_unit + holder_type = /obj/machinery/suit_storage_unit + +/datum/wires/suit_storage_unit/New(atom/holder) + wires = list( + WIRE_HACK, WIRE_SAFETY, + WIRE_ZAP + ) + add_duds(2) + ..() + +/datum/wires/suit_storage_unit/interactable(mob/user) + var/obj/machinery/suit_storage_unit/SSU = holder + if(SSU.panel_open) + return TRUE + +/datum/wires/suit_storage_unit/get_status() + var/obj/machinery/suit_storage_unit/SSU = holder + var/list/status = list() + status += "The UV bulb is [SSU.uv_super ? "glowing" : "dim"]." + status += "The service light is [SSU.safeties ? "off" : "on"]." + return status + +/datum/wires/suit_storage_unit/on_pulse(wire) + var/obj/machinery/suit_storage_unit/SSU = holder + switch(wire) + if(WIRE_HACK) + SSU.uv_super = !SSU.uv_super + if(WIRE_SAFETY) + SSU.safeties = !SSU.safeties + if(WIRE_ZAP) + SSU.shock(usr) + +/datum/wires/suit_storage_unit/on_cut(wire, mend) + var/obj/machinery/suit_storage_unit/SSU = holder + switch(wire) + if(WIRE_HACK) + SSU.uv_super = !mend + if(WIRE_SAFETY) + SSU.safeties = mend + if(WIRE_ZAP) + SSU.shock(usr) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 1f92e2eadf3..16f3ba8324f 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -1,12 +1,3 @@ -////////////////////////////////////// -// SUIT STORAGE UNIT ///////////////// -////////////////////////////////////// - -#define REPAIR_NEEDS_WIRECUTTERS 1 -#define REPAIR_NEEDS_WIRES 2 -#define REPAIR_NEEDS_CROWBAR 3 -#define REPAIR_NEEDS_METAL 4 - /obj/machinery/suit_storage_unit name = "suit storage unit" desc = "An industrial unit made to hold space suits. It comes with a built-in UV cauterization mechanism. A small warning label advises that organic matter should not be placed into the unit." @@ -14,197 +5,294 @@ icon_state = "close" anchored = 1 density = 1 - //Vars to hold internal items + var/obj/item/clothing/suit/space/suit = null var/obj/item/clothing/head/helmet/space/helmet = null var/obj/item/clothing/mask/mask = null var/obj/item/storage = null - //Base types on creation - var/SUIT_TYPE = null - var/HELMET_TYPE = null - var/MASK_TYPE = null - var/STORAGE_TYPE = null - - //Machine related vars - var/maintenance_mode = 0 - var/isopen = 0 - var/islocked = 0 - var/isUV = 0 - var/ispowered = 1 - var/isbroken = 0 - var/issuperUV = 0 - var/safetieson = 1 - var/cycletime_left = 0 - var/repair_stage = 0 - -/obj/machinery/suit_storage_unit/examine(mob/user) - ..() - if(isbroken && isopen) - if(!maintenance_mode) - user << "A small LED above the maintenance panel is flashing red." - return - switch(repair_stage) - if(REPAIR_NEEDS_WIRECUTTERS) - user << "The wires inside are charred and snapped." - if(REPAIR_NEEDS_WIRES) - user << "There are no wires inside." - if(REPAIR_NEEDS_CROWBAR) - user << "Some of the interior metal is burnt and broken." - if(REPAIR_NEEDS_METAL) - user << "It lacks interior plating." + var/suit_type = null + var/helmet_type = null + var/mask_type = null + var/storage_type = null + state_open = FALSE + var/locked = FALSE + panel_open = FALSE + var/safeties = TRUE + var/uv = FALSE + var/uv_super = FALSE + var/uv_cycles = 6 /obj/machinery/suit_storage_unit/standard_unit - SUIT_TYPE = /obj/item/clothing/suit/space/eva - HELMET_TYPE = /obj/item/clothing/head/helmet/space/eva - MASK_TYPE = /obj/item/clothing/mask/breath + suit_type = /obj/item/clothing/suit/space/eva + helmet_type = /obj/item/clothing/head/helmet/space/eva + mask_type = /obj/item/clothing/mask/breath /obj/machinery/suit_storage_unit/captain - SUIT_TYPE = /obj/item/clothing/suit/space/captain - HELMET_TYPE = /obj/item/clothing/head/helmet/space/captain - MASK_TYPE = /obj/item/clothing/mask/gas - STORAGE_TYPE = /obj/item/weapon/tank/jetpack/oxygen/captain + suit_type = /obj/item/clothing/suit/space/captain + helmet_type = /obj/item/clothing/head/helmet/space/captain + mask_type = /obj/item/clothing/mask/gas + storage_type = /obj/item/weapon/tank/jetpack/oxygen/captain /obj/machinery/suit_storage_unit/engine - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/engine - MASK_TYPE = /obj/item/clothing/mask/breath + suit_type = /obj/item/clothing/suit/space/hardsuit/engine + mask_type = /obj/item/clothing/mask/breath /obj/machinery/suit_storage_unit/ce - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/engine/elite - MASK_TYPE = /obj/item/clothing/mask/breath - STORAGE_TYPE= /obj/item/clothing/shoes/magboots/advance + suit_type = /obj/item/clothing/suit/space/hardsuit/engine/elite + mask_type = /obj/item/clothing/mask/breath + storage_type= /obj/item/clothing/shoes/magboots/advance /obj/machinery/suit_storage_unit/security - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/security - MASK_TYPE = /obj/item/clothing/mask/gas/sechailer + suit_type = /obj/item/clothing/suit/space/hardsuit/security + mask_type = /obj/item/clothing/mask/gas/sechailer /obj/machinery/suit_storage_unit/hos - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/security/hos - MASK_TYPE = /obj/item/clothing/mask/gas/sechailer + suit_type = /obj/item/clothing/suit/space/hardsuit/security/hos + mask_type = /obj/item/clothing/mask/gas/sechailer /obj/machinery/suit_storage_unit/atmos - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/engine/atmos - MASK_TYPE = /obj/item/clothing/mask/gas - STORAGE_TYPE = /obj/item/weapon/watertank/atmos + suit_type = /obj/item/clothing/suit/space/hardsuit/engine/atmos + mask_type = /obj/item/clothing/mask/gas + storage_type = /obj/item/weapon/watertank/atmos /obj/machinery/suit_storage_unit/mining - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/mining - MASK_TYPE = /obj/item/clothing/mask/breath + suit_type = /obj/item/clothing/suit/space/hardsuit/mining + mask_type = /obj/item/clothing/mask/breath /obj/machinery/suit_storage_unit/cmo - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/medical - MASK_TYPE = /obj/item/clothing/mask/breath + suit_type = /obj/item/clothing/suit/space/hardsuit/medical + mask_type = /obj/item/clothing/mask/breath /obj/machinery/suit_storage_unit/rd - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/rd - MASK_TYPE = /obj/item/clothing/mask/breath + suit_type = /obj/item/clothing/suit/space/hardsuit/rd + mask_type = /obj/item/clothing/mask/breath /obj/machinery/suit_storage_unit/syndicate - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/syndi - MASK_TYPE = /obj/item/clothing/mask/gas/syndicate - STORAGE_TYPE = /obj/item/weapon/tank/jetpack/oxygen/harness + suit_type = /obj/item/clothing/suit/space/hardsuit/syndi + mask_type = /obj/item/clothing/mask/gas/syndicate + storage_type = /obj/item/weapon/tank/jetpack/oxygen/harness -/obj/machinery/suit_storage_unit/ertCom - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/ert - MASK_TYPE = /obj/item/clothing/mask/breath - STORAGE_TYPE = /obj/item/weapon/tank/internals/emergency_oxygen/double +/obj/machinery/suit_storage_unit/ert/command + suit_type = /obj/item/clothing/suit/space/hardsuit/ert + mask_type = /obj/item/clothing/mask/breath + storage_type = /obj/item/weapon/tank/internals/emergency_oxygen/double -/obj/machinery/suit_storage_unit/ertSec - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/ert/sec - MASK_TYPE = /obj/item/clothing/mask/breath - STORAGE_TYPE = /obj/item/weapon/tank/internals/emergency_oxygen/double +/obj/machinery/suit_storage_unit/ert/security + suit_type = /obj/item/clothing/suit/space/hardsuit/ert/sec + mask_type = /obj/item/clothing/mask/breath + storage_type = /obj/item/weapon/tank/internals/emergency_oxygen/double -/obj/machinery/suit_storage_unit/ertEngi - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/ert/engi - MASK_TYPE = /obj/item/clothing/mask/breath - STORAGE_TYPE = /obj/item/weapon/tank/internals/emergency_oxygen/double +/obj/machinery/suit_storage_unit/ert/engineer + suit_type = /obj/item/clothing/suit/space/hardsuit/ert/engi + mask_type = /obj/item/clothing/mask/breath + storage_type = /obj/item/weapon/tank/internals/emergency_oxygen/double -/obj/machinery/suit_storage_unit/ertMed - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/ert/med - MASK_TYPE = /obj/item/clothing/mask/breath - STORAGE_TYPE = /obj/item/weapon/tank/internals/emergency_oxygen/double +/obj/machinery/suit_storage_unit/ert/medical + suit_type = /obj/item/clothing/suit/space/hardsuit/ert/med + mask_type = /obj/item/clothing/mask/breath + storage_type = /obj/item/weapon/tank/internals/emergency_oxygen/double /obj/machinery/suit_storage_unit/New() + wires = new /datum/wires/suit_storage_unit(src) + if(suit_type) + suit = new suit_type(src) + if(helmet_type) + helmet = new helmet_type(src) + if(mask_type) + mask = new mask_type(src) + if(storage_type) + storage = new storage_type(src) update_icon() - if(SUIT_TYPE) - suit = new SUIT_TYPE(src) - if(HELMET_TYPE) - helmet = new HELMET_TYPE(src) - if(MASK_TYPE) - mask = new MASK_TYPE(src) - if(STORAGE_TYPE) - storage = new STORAGE_TYPE(src) -/obj/machinery/suit_storage_unit/update_icon() //overlays yaaaay - Jordie - overlays = 0 +/obj/machinery/suit_storage_unit/update_icon() + overlays.Cut() - if(!isopen) - overlays += "close" - if(occupant) - overlays += "human" - if(occupant && isUV) - overlays += "uvhuman" - if(isUV) - overlays += "uv" - if(issuperUV && isUV) - overlays += "super" - if(isopen) - overlays += "open" - if(suit) - overlays += "suit" - if(helmet) - overlays += "helm" - if(storage) - overlays += "storage" - if(isbroken) + if(uv) + if(uv_super) + overlays += "super" + else if(occupant) + overlays += "uvhuman" + else + overlays += "uv" + else if(state_open) + if(stat & BROKEN) overlays += "broken" - return + else + overlays += "open" + if(suit) + overlays += "suit" + if(helmet) + overlays += "helm" + if(storage) + overlays += "storage" + else if(occupant) + overlays += "human" /obj/machinery/suit_storage_unit/power_change() ..() - ispowered = !(stat & NOPOWER) - if((stat & NOPOWER) && isopen) - dump_everything() + if(!is_operational() && state_open) + open_machine(dump = TRUE) + update_icon() + +/obj/machinery/suit_storage_unit/open_machine(dump = FALSE) + state_open = TRUE + if(dump) + dropContents() + helmet = null + suit = null + mask = null + storage = null + occupant = null update_icon() /obj/machinery/suit_storage_unit/ex_act(severity, target) switch(severity) if(1) if(prob(50)) - dump_everything() //So suits dont survive all the time + open_machine(dump = TRUE) qdel(src) - return if(2) if(prob(50)) - dump_everything() + open_machine(dump = TRUE) qdel(src) - return - else - return - return -/obj/machinery/suit_storage_unit/get_ui_data() - var/list/data = list() - data["isBroken"] = isbroken - data["isLocked"] = islocked - data["isOpen"] = isopen - data["isBaking"] = isUV - data["uv"] = issuperUV - data["safety"] = safetieson - data["maintenance"] = maintenance_mode - if(helmet) - data["helmet"] = helmet.name - if(suit) - data["suit"] = suit.name - if(mask) - data["mask"] = mask.name - if(storage) - data["aux"] = storage.name - if(occupant) - data["occupied"] = 1 - return data +/obj/machinery/suit_storage_unit/MouseDrop_T(mob/target, mob/user) + stuff_mob(target, user) + +/obj/machinery/suit_storage_unit/proc/stuff_mob(mob/target, mob/user) + if(user.stat || user.lying || !Adjacent(user) || !Adjacent(target)) + return + + if(!state_open) + user << "The unit's doors are shut!" + return + if(!is_operational()) + user << "The unit is not operational!" + return + if(occupant || helmet || suit || storage) + user << "It's too cluttered inside to fit in!" + return + + if(target == user) + visible_message("[user] squeezes into [src]!", "You squeeze into [src].") + else + visible_message("[user] starts putting [target] into [src]!", "[user] starts shoving you into [src]!") + + if(do_mob(user, target, 10)) + close_machine(target) + add_fingerprint(user) + +/obj/machinery/suit_storage_unit/proc/cook() + if(uv_cycles) + uv_cycles-- + uv = TRUE + locked = TRUE + update_icon() + if(occupant) + if(uv_super) + occupant.adjustFireLoss(rand(20, 36)) + else + occupant.adjustFireLoss(rand(10, 16)) + if(iscarbon(occupant)) + occupant.emote("scream") + addtimer(src, "cook", 50, FALSE) + else + uv_cycles = initial(uv_cycles) + uv = FALSE + locked = FALSE + if(uv_super) + visible_message("With a loud whining noise, [src]'s door grinds open. A foul cloud of smoke emanates from the chamber.") + helmet = null + qdel(helmet) + suit = null + qdel(suit) // Delete everything but the occupant. + mask = null + qdel(mask) + storage = null + qdel(storage) + // The wires get damaged too. + wires.cut_all() + else + visible_message("With a loud whining noise, [src]'s door grinds open. A light cloud of steam escapes from the chamber.") + for(var/obj/item/I in src) + I.clean_blood() + open_machine(dump = !!occupant) + +/obj/machinery/suit_storage_unit/proc/shock(mob/user, prb) + if(!prob(prb)) + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(5, 1, src) + s.start() + if(electrocute_mob(user, src, src)) + return 1 + +/obj/machinery/suit_storage_unit/relaymove(mob/user) + container_resist() + +/obj/machinery/suit_storage_unit/container_resist() + var/mob/living/user = usr + add_fingerprint(user) + if(locked) + visible_message("You see [user] kicking against the doors of [src]!", "You start kicking against the doors...") + addtimer(src, "resist_open", 300, FALSE, user) + else + open_machine() + +/obj/machinery/suit_storage_unit/proc/resist_open(mob/user) + if(!state_open && occupant && (user in src) && user.stat == 0) // Check they're still here. + visible_message("You see [user] bursts out of [src]!", "You escape the cramped confines of [src]!") + open_machine() + +/obj/machinery/suit_storage_unit/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = I + stuff_mob(G.affecting, user) + else if(state_open && is_operational()) + if(istype(I, /obj/item/clothing/suit/space)) + if(suit) + user << "The unit already contains a suit!." + return + if(!user.drop_item()) + return + suit = I + else if(istype(I, /obj/item/clothing/head/helmet)) + if(helmet) + user << "The unit already contains a helmet!" + return + if(!user.drop_item()) + return + helmet = I + else if(istype(I, /obj/item/clothing/mask)) + if(mask) + user << "The unit already contains a mask!" + return + if(!user.drop_item()) + return + mask = I + else if(istype(I, /obj/item)) + if(storage) + user << "The auxiliary storage compartment is full!" + return + if(!user.drop_item()) + return + storage = I + + I.loc = src + visible_message("[user] inserts [I] into [src]", "You load [I] into [src].") + + if(panel_open && is_wire_tool(I)) + wires.interact(user) + if(!state_open) + if(default_deconstruction_screwdriver(user, "panel", "close", I)) + return + if(default_pry_open(I)) + return + + update_icon() + return /obj/machinery/suit_storage_unit/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ datum/tgui/master_ui = null, datum/ui_state/state = physical_state) @@ -213,401 +301,61 @@ ui = new(user, src, ui_key, "suit_storage", name, 400, 305, master_ui, state) ui.open() +/obj/machinery/suit_storage_unit/get_ui_data() + var/list/data = list() + data["locked"] = locked + data["open"] = state_open + data["safeties"] = safeties + data["uv_active"] = uv + data["uv_super"] = uv_super + if(helmet) + data["helmet"] = helmet.name + if(suit) + data["suit"] = suit.name + if(mask) + data["mask"] = mask.name + if(storage) + data["storage"] = storage.name + if(occupant) + data["occupied"] = 1 + return data + /obj/machinery/suit_storage_unit/ui_act(action, params) + if(..() || uv) + return switch(action) - if ("uv") - toggleUV(usr) - if ("safety") - togglesafeties(usr) - if ("helmet") - dispense_helmet(usr) - if ("suit") - dispense_suit(usr) - if ("mask") - dispense_mask(usr) - if ("aux") - eject_storage(usr) - if ("toggle_open") - toggle_open(usr) - if ("toggle_lock") - toggle_lock(usr) - if ("uv_start") - start_UV(usr) - if ("mob") - eject_occupant(usr) - update_icon() - return 1 - -/obj/machinery/suit_storage_unit/proc/toggleUV(mob/user) - if(!maintenance_mode) - return - else - if(issuperUV) - user << "You slide the dial back towards \"185nm\"." - issuperUV = 0 - else - user << "You crank the dial all the way up to \"15nm\"." - issuperUV = 1 - return - - -/obj/machinery/suit_storage_unit/proc/togglesafeties(mob/user) - if(!maintenance_mode) //Needed check due to bugs - return - else - user << "You push the button. The coloured LED next to it changes." - safetieson = !safetieson - - -/obj/machinery/suit_storage_unit/proc/dispense_helmet() - eject(helmet) - helmet = null - -/obj/machinery/suit_storage_unit/proc/dispense_suit() - eject(suit) - suit = null - -/obj/machinery/suit_storage_unit/proc/dispense_mask() - eject(mask) - mask = null - -/obj/machinery/suit_storage_unit/proc/eject_storage() - eject(storage) - storage = null - -/obj/machinery/suit_storage_unit/proc/eject(atom/movable/ITEM) - //Check item still exists - if not, then usually someone has already ejected the item - if(ITEM) - ITEM.loc = loc - -/obj/machinery/suit_storage_unit/proc/dump_everything() - for(var/obj/item/ITEM in src) - eject(ITEM) - suit = null - helmet = null - mask = null - storage = null - if(occupant) - eject_occupant(occupant) - return - - -/obj/machinery/suit_storage_unit/proc/toggle_open(mob/user) - if(islocked || isUV) - user << "You're unable to open unit!" - return 0 - if(occupant) - eject_occupant(user) - return 1 // eject_occupant opens the door, so we need to return - isopen = !isopen - return 1 - - -/obj/machinery/suit_storage_unit/proc/toggle_lock(mob/user) - if(occupant && safetieson) - user << "The unit's safety protocols disallow locking when a biological form is detected inside its compartments." - return - if(isopen) - return - islocked = !islocked - return - - -/obj/machinery/suit_storage_unit/proc/start_UV(mob/user) - if(isUV || isopen) //I'm bored of all these sanity checks - return - if(occupant && safetieson) - user << "WARNING: Biological entity detected in the confines of the unit's storage. Cannot initiate cycle." - return - if(!helmet && !mask && !suit && !storage && !occupant ) - user << "Unit storage bays empty. Nothing to disinfect -- Aborting." - return - user << "You start the unit's cauterisation cycle." - cycletime_left = 20 - isUV = 1 - if(occupant && !islocked) - islocked = 1 //Let's lock it for good measure - update_icon() - - var/i - spawn(0) - for(i=0,i<4,++i) - sleep(50) - if(occupant) - var/burndamage = rand(6,10) - if(issuperUV) - burndamage = rand(28,35) - if(iscarbon(occupant)) - occupant.take_organ_damage(0,burndamage) - occupant.emote("scream") - else - occupant.take_organ_damage(burndamage) - if(i==3) //End of the cycle - if(!issuperUV) - for(var/obj/item/ITEM in src) - ITEM.clean_blood() - if(istype(storage, /obj/item/weapon/reagent_containers/food)) - qdel(storage) - else //It was supercycling, destroy everything - helmet = null - suit = null - mask = null - qdel(storage) - visible_message("With a loud whining noise, [src]'s door grinds open. A foul cloud of smoke emanates from the chamber.") - isbroken = 1 - isopen = 1 - islocked = 0 - repair_stage = REPAIR_NEEDS_WIRECUTTERS - eject_occupant(occupant) - isUV = 0 //Cycle ends - update_icon() - return - -/obj/machinery/suit_storage_unit/proc/cycletimeleft() - if(cycletime_left >= 1) - cycletime_left-- - return cycletime_left - - -/obj/machinery/suit_storage_unit/proc/eject_occupant(mob/user) - if (islocked) - return - - if (!occupant) - return - - if (occupant.client) - if(user != occupant) - occupant << "The machine kicks you out!" - if(user.loc != loc) - occupant << "You leave the not-so-cozy confines of [src]." - - occupant.client.eye = occupant.client.mob - occupant.client.perspective = MOB_PERSPECTIVE - if(occupant.loc == src) - occupant.loc = loc - occupant = null - if(!isopen) - isopen = 1 - update_icon() - return - - -/obj/machinery/suit_storage_unit/relaymove(mob/user) - if(user.stat || !isturf(loc)) - return - container_resist() - - -/obj/machinery/suit_storage_unit/container_resist() - var/mob/living/user = usr - if(islocked) - user.changeNext_move(CLICK_CD_BREAKOUT) - user.last_special = world.time + CLICK_CD_BREAKOUT - var/breakout_time = 2 - user << "You start kicking against the doors to escape... (This will take about [breakout_time] minutes.)" - visible_message("You see [user] kicking against the doors of \the [src]!") - if(do_after(user,(breakout_time*60*10), target = src)) - if(!user || user.stat != CONSCIOUS || user.loc != src || isopen || !islocked) + if("door") + if(state_open) + close_machine() + else + open_machine(!!occupant) // Dump out contents if someone is in there. + . = TRUE + if("lock") + locked = !locked + . = TRUE + if("uv") + if(occupant && safeties) + return + else if(!helmet && !mask && !suit && !storage && !occupant) return else - isopen = 1 - islocked = 0 - visible_message("[user] kicks their way out of [src]!") - - else - return - eject_occupant(user) - add_fingerprint(user) - update_icon() - return - - -/obj/machinery/suit_storage_unit/MouseDrop_T(mob/M, mob/user) - store_mob(M, user) - -/obj/machinery/suit_storage_unit/proc/store_mob(mob/living/M, mob/user) - if(!istype(M)) - return - if (user.stat != 0) - return - if (!isopen) - user << "The unit's doors are shut!" - return - if (!ispowered || isbroken) - user << "The unit is not operational!" - return - if ( occupant || helmet || suit || storage ) - user << "It's too cluttered inside to fit in!" - return - if(M == user) - visible_message("[user] squeezes into [src]!", "You squeeze into [src].") - else - M.visible_message("[user] starts putting [M] into [src]!", "[user] starts shoving you into [src]!") - if(do_mob(user, M, 10)) - user.stop_pulling() - if(M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src - M.loc = src - occupant = M - isopen = 0 - update_icon() - - add_fingerprint(user) - return - return - -/obj/machinery/suit_storage_unit/proc/fix() - audible_message("[src] beeps and comes back online!") - playsound(src, 'sound/machines/defib_ready.ogg', 50, 1) - repair_stage = 0 - isbroken = 0 - update_icon() - -/obj/machinery/suit_storage_unit/attackby(obj/item/I, mob/user, params) - if(!ispowered) - if(istype(I, /obj/item/weapon/crowbar) && !isopen) - if(toggle_open(user)) - dump_everything() - user << text("You pry open [src]'s doors.") - update_icon() - return - if(istype(I, /obj/item/weapon/screwdriver)) - maintenance_mode = !maintenance_mode - playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << text("You [] the unit's maintenance panel.",(maintenance_mode ? "open up" : "close") ) - return - if(isbroken && maintenance_mode) - if(istype(I, /obj/item/weapon/wirecutters) && repair_stage == REPAIR_NEEDS_WIRECUTTERS) - user.visible_message("[user] starts removing [src]'s damaged wires.", \ - "You begin removing the damaged wires from [src]...") - playsound(src, 'sound/items/Wirecutter.ogg', 50, 1) - if(!do_after(user, 30/I.toolspeed, target = src)) + cook() + . = TRUE + if("dispense") + if(!state_open) return - user.visible_message("[user] removes the damaged wires from [src].", \ - "You remove the damaged wiring from [src].") - playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) - repair_stage = REPAIR_NEEDS_WIRES - return - if(istype(I, /obj/item/stack/cable_coil) && repair_stage == REPAIR_NEEDS_WIRES) - var/obj/item/stack/cable_coil/C = I - if(C.amount < 5) - user << "You need at least five cables to rewire [src]!" - return - user.visible_message("[user] begins replacing [src] wires.", \ - "You begin rewiring [src]...") - playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) - if(!do_after(user, 30, target = src)) - return - user.visible_message("[user] adds wires to [src].", \ - "You rewire [src].") - C.amount -= 5 - if(C.amount <= 0) - user.drop_item() - qdel(C) - playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) - repair_stage = REPAIR_NEEDS_CROWBAR - return - if(istype(I, /obj/item/weapon/crowbar) && repair_stage == REPAIR_NEEDS_CROWBAR) - user.visible_message("[user] starts removing [src]'s broken interior plating.", \ - "You begin removing the damaged interior plating from [src]...") - playsound(src, 'sound/items/Crowbar.ogg', 50, 1) - if(!do_after(user, 30/I.toolspeed, target = src)) - return - user.visible_message("[user] removes the damaged interior plating from [src].", \ - "You remove the damaged interior plating from [src].") - playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) - repair_stage = REPAIR_NEEDS_METAL - return - if(istype(I, /obj/item/stack/sheet/metal) && repair_stage == REPAIR_NEEDS_METAL) - var/obj/item/stack/sheet/metal/M = I - if(M.amount < 3) - user << "You need at least three sheets of metal to repair [src]!" - return - user.visible_message("[user] starts adding interior plating to [src].", \ - "You begin adding interior plating to [src]...") - playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) - if(!do_after(user, 30, target = src)) - return - user.visible_message("[user] adds interior plating to [src].", \ - "You add interior plating to [src].") - fix() - return - if ( istype(I, /obj/item/weapon/grab) ) - var/obj/item/weapon/grab/G = I - store_mob(G.affecting, user) - return - if( istype(I,/obj/item/clothing/suit/space) ) - if(!isopen || isbroken) - return - var/obj/item/clothing/suit/space/S = I - if(suit) - user << "The unit already contains a suit." - return - if(!user.drop_item()) - user << "[S] is stuck to your hand, you cannot put it in [src]!" - return - user << "You load [S] into the suit storage compartment." - S.loc = src - suit = S - update_icon() - return - if( istype(I,/obj/item/clothing/head/helmet) ) - if(!isopen || isbroken) - return - var/obj/item/clothing/head/helmet/H = I - if(helmet) - user << "The unit already contains a helmet!" - return - if(!user.drop_item()) - user << "[H] is stuck to your hand, you cannot put it in the Suit Storage Unit!" - return - user << "You load [H] into the helmet storage compartment." - H.loc = src - helmet = H - update_icon() - return - if( istype(I,/obj/item/clothing/mask) ) - if(!isopen || isbroken) - return - var/obj/item/clothing/mask/M = I - if(mask) - user << "The unit already contains a mask!" - return - if(!user.drop_item()) - user << "[M] is stuck to your hand, you cannot put it in the Suit Storage Unit!" - return - user << "You load [M] into the mask storage compartment." - M.loc = src - mask = M - update_icon() - return - if( istype(I,/obj/item) ) - if(!isopen || isbroken) - return - var/obj/item/ITEM = I - if(storage) - user << "The auxiliary storage compartment is full!" - return - if(!user.drop_item()) - user << "[ITEM] is stuck to your hand, you cannot put it in the Suit Storage Unit!" - return - user << "You load [ITEM] into the auxiliary storage compartment." - ITEM.loc = src - storage = ITEM - update_icon() - return - - -/obj/machinery/suit_storage_unit/attack_ai(mob/user) - return attack_hand(user) - -/obj/machinery/suit_storage_unit/attack_paw(mob/user) - user << "You don't know how to work this!" - return - -#undef REPAIR_NEEDS_WIRECUTTERS -#undef REPAIR_NEEDS_WIRES -#undef REPAIR_NEEDS_CROWBAR -#undef REPAIR_NEEDS_METAL + switch(params["item"]) + if("helmet") + helmet.loc = loc + helmet = null + if("suit") + suit.loc = loc + suit = null + if("mask") + mask.loc = loc + mask = null + if("storage") + storage.loc = loc + storage = null + . = TRUE + update_icon() \ No newline at end of file diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 514f3af3c99..19fec171d6d 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -11,7 +11,6 @@ var/mob/living/silicon/ai/AI origin_tech = "programming=4;materials=4" - /obj/item/device/aicard/afterattack(atom/target, mob/user, proximity) ..() if(!proximity || !target) @@ -21,20 +20,21 @@ add_logs(user, AI, "carded", src) else //No AI on the card, therefore the user wants to download one. target.transfer_ai(AI_TRANS_TO_CARD, user, null, src) - update_state() //Whatever happened, update the card's state (icon, name) to match. + update_icon() //Whatever happened, update the card's state (icon, name) to match. - -/obj/item/device/aicard/proc/update_state() +/obj/item/device/aicard/update_icon() if(AI) - name = "intelliCard - [AI.name]" - if (AI.stat == DEAD) + name = "[initial(name)]- [AI.name]" + if(AI.stat == DEAD) icon_state = "aicard-404" else icon_state = "aicard-full" - AI.cancel_camera() //AI are forced to move when transferred, so do this whenver one is downloaded. + if(!AI.control_disabled) + overlays += image('icons/obj/aicards.dmi', "aicard-on") + AI.cancel_camera() else - icon_state = "aicard" - name = "intelliCard" + name = initial(name) + icon_state = initial(icon_state) overlays.Cut() /obj/item/device/aicard/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ @@ -44,7 +44,6 @@ ui = new(user, src, ui_key, "intellicard", name, 500, 500, master_ui, state) ui.open() - /obj/item/device/aicard/get_ui_data() var/list/data = list() if(AI) @@ -61,28 +60,26 @@ /obj/item/device/aicard/ui_act(action,params) if(..()) return - switch(action) if("wipe") - var/confirm = alert("Are you sure you want to wipe this card's memory? This cannot be undone once started.", "Confirm Wipe", "Yes", "No") + var/confirm = alert("Are you sure you want to wipe this card's memory? This cannot be undone once started.", name, "Yes", "No") if(confirm == "Yes" && !..()) - flush = 1 + flush = TRUE if(AI && AI.loc == src) - AI.suiciding = 1 + AI.suiciding = TRUE AI << "Your core files are being wiped!" while(AI.stat != DEAD) AI.adjustOxyLoss(2) AI.updatehealth() sleep(10) - flush = 0 + flush = FALSE + . = TRUE if("wireless") AI.control_disabled = !AI.control_disabled - AI << "The intellicard's wireless port has been [AI.control_disabled ? "disabled" : "enabled"]!" - if (AI.control_disabled) - overlays -= image('icons/obj/aicards.dmi', "aicard-on") - else - overlays += image('icons/obj/aicards.dmi', "aicard-on") + AI << "[src]'s wireless port has been [AI.control_disabled ? "disabled" : "enabled"]!" + . = TRUE if("radio") AI.radio_enabled = !AI.radio_enabled AI << "Your Subspace Transceiver has been [AI.radio_enabled ? "enabled" : "disabled"]!" - return 1 \ No newline at end of file + . = TRUE + update_icon() \ No newline at end of file diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index f4a6f69f91f..985515faaa0 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1124,7 +1124,7 @@ s.start() if(isalien(user)) return 0 - if (electrocute_mob(user, src, src)) + if(electrocute_mob(user, src, src)) return 1 else return 0 diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index 1e6a4cf2098..b81553e3de8 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -58,13 +58,16 @@ var/datum/events/keycard_events = new() if("red_alert") if(!event_source) sendEvent("Red Alert") + . = TRUE if("emergency_maint") if(!event_source) sendEvent("Emergency Maintenance Access") + . = TRUE if("auth_swipe") if(event_source) event_source.trigger_event(usr) event_source = null + . = TRUE /obj/machinery/keycard_auth/proc/sendEvent(event_type) triggerer = usr diff --git a/icons/obj/suitstorage.dmi b/icons/obj/suitstorage.dmi index 8d43fa84775..25830e47141 100644 Binary files a/icons/obj/suitstorage.dmi and b/icons/obj/suitstorage.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 73fa4b7f871..a7f8d1f9e3c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -282,6 +282,7 @@ #include "code\datums\wires\r_n_d.dm" #include "code\datums\wires\radio.dm" #include "code\datums\wires\robot.dm" +#include "code\datums\wires\suit_storage_unit.dm" #include "code\datums\wires\syndicatebomb.dm" #include "code\datums\wires\vending.dm" #include "code\datums\wires\wires.dm" diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index 83f8c0a2f50..5ca8e0464f2 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -1,11 +1,11 @@ -require=function t(e,n,r){function i(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(a)return a(o,!0);var c=Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[o]={exports:{}};e[o][0].call(l.exports,function(t){var n=e[o][1][t];return i(n?n:t)},l,l.exports,t,e,n,r)}return n[o].exports}for(var a="function"==typeof require&&require,o=0;o=0;--r){var i=this.tryEntries[r],a=i.completion;if("root"===i.tryLoc)return e("end");if(i.tryLoc<=this.prev){var o=y.call(i,"catchLoc"),s=y.call(i,"finallyLoc");if(o&&s){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&y.call(r,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),h(n),O}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;h(n)}return i}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},O}}}("object"==typeof n?n:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,t(193),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{193:193}],3:[function(t,e,n){e.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},{}],4:[function(t,e,n){var r=t(84)("unscopables"),i=Array.prototype;void 0==i[r]&&t(32)(i,r,{}),e.exports=function(t){i[r][t]=!0}},{32:32,84:84}],5:[function(t,e,n){var r=t(39);e.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},{39:39}],6:[function(t,e,n){"use strict";var r=t(81),i=t(77),a=t(80);e.exports=[].copyWithin||function(t,e){var n=r(this),o=a(n.length),s=i(t,o),u=i(e,o),c=arguments,l=c.length>2?c[2]:void 0,p=Math.min((void 0===l?o:i(l,o))-u,o-s),f=1;for(s>u&&u+p>s&&(f=-1,u+=p-1,s+=p-1);p-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{77:77,80:80,81:81}],7:[function(t,e,n){"use strict";var r=t(81),i=t(77),a=t(80);e.exports=[].fill||function(t){for(var e=r(this),n=a(e.length),o=arguments,s=o.length,u=i(s>1?o[1]:void 0,n),c=s>2?o[2]:void 0,l=void 0===c?n:i(c,n);l>u;)e[u++]=t;return e}},{77:77,80:80,81:81}],8:[function(t,e,n){var r=t(79),i=t(80),a=t(77);e.exports=function(t){return function(e,n,o){var s,u=r(e),c=i(u.length),l=a(o,c);if(t&&n!=n){for(;c>l;)if(s=u[l++],s!=s)return!0}else for(;c>l;l++)if((t||l in u)&&u[l]===n)return t||l;return!t&&-1}}},{77:77,79:79,80:80}],9:[function(t,e,n){var r=t(18),i=t(35),a=t(81),o=t(80),s=t(10);e.exports=function(t){var e=1==t,n=2==t,u=3==t,c=4==t,l=6==t,p=5==t||l;return function(f,h,d){for(var m,v,g=a(f),y=i(g),b=r(h,d,3),w=o(y.length),x=0,_=e?s(f,w):n?s(f,0):void 0;w>x;x++)if((p||x in y)&&(m=y[x],v=b(m,x,g),t))if(e)_[x]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return x;case 2:_.push(m)}else if(c)return!1;return l?-1:u||c?c:_}}},{10:10,18:18,35:35,80:80,81:81}],10:[function(t,e,n){var r=t(39),i=t(37),a=t(84)("species");e.exports=function(t,e){var n;return i(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!i(n.prototype)||(n=void 0),r(n)&&(n=n[a],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{37:37,39:39,84:84}],11:[function(t,e,n){var r=t(12),i=t(84)("toStringTag"),a="Arguments"==r(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))[i])?n:a?r(e):"Object"==(o=r(e))&&"function"==typeof e.callee?"Arguments":o}},{12:12,84:84}],12:[function(t,e,n){var r={}.toString;e.exports=function(t){return r.call(t).slice(8,-1)}},{}],13:[function(t,e,n){"use strict";var r=t(47),i=t(32),a=t(61),o=t(18),s=t(70),u=t(19),c=t(28),l=t(43),p=t(45),f=t(83)("id"),h=t(31),d=t(39),m=t(66),v=t(20),g=Object.isExtensible||d,y=v?"_s":"size",b=0,w=function(t,e){if(!d(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!h(t,f)){if(!g(t))return"F";if(!e)return"E";i(t,f,++b)}return"O"+t[f]},x=function(t,e){var n,r=w(e);if("F"!==r)return t._i[r];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,i){var l=t(function(t,a){s(t,l,e),t._i=r.create(null),t._f=void 0,t._l=void 0,t[y]=0,void 0!=a&&c(a,n,t[i],t)});return a(l.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[y]=0},"delete":function(t){var e=this,n=x(e,t);if(n){var r=n.n,i=n.p;delete e._i[n.i],n.r=!0,i&&(i.n=r),r&&(r.p=i),e._f==n&&(e._f=r),e._l==n&&(e._l=i),e[y]--}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&&r.setDesc(l.prototype,"size",{get:function(){return u(this[y])}}),l},def:function(t,e,n){var r,i,a=x(t,e);return a?a.v=n:(t._l=a={i:i=w(e,!0),k:e,v:n,p:r=t._l,n:void 0,r:!1},t._f||(t._f=a),r&&(r.n=a),t[y]++,"F"!==i&&(t._i[i]=a)),t},getEntry:x,setStrong:function(t,e,n){l(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?p(0,n.k):"values"==e?p(0,n.v):p(0,[n.k,n.v]):(t._t=void 0,p(1))},n?"entries":"values",!n,!0),m(e)}}},{18:18,19:19,20:20,28:28,31:31,32:32,39:39,43:43,45:45,47:47,61:61,66:66,70:70,83:83}],14:[function(t,e,n){var r=t(28),i=t(11);e.exports=function(t){return function(){if(i(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return r(this,!1,e.push,e),e}}},{11:11,28:28}],15:[function(t,e,n){"use strict";var r=t(32),i=t(61),a=t(5),o=t(39),s=t(70),u=t(28),c=t(9),l=t(31),p=t(83)("weak"),f=Object.isExtensible||o,h=c(5),d=c(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},y=function(t,e){return h(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=y(this,t);return e?e[1]:void 0},has:function(t){return!!y(this,t)},set:function(t,e){var n=y(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=d(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,r){var a=t(function(t,i){s(t,a,e),t._i=m++,t._l=void 0,void 0!=i&&u(i,n,t[r],t)});return i(a.prototype,{"delete":function(t){return o(t)?f(t)?l(t,p)&&l(t[p],this._i)&&delete t[p][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?l(t,p)&&l(t[p],this._i):v(this).has(t):!1}}),a},def:function(t,e,n){return f(a(e))?(l(e,p)||r(e,p,{}),e[p][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:p}},{28:28,31:31,32:32,39:39,5:5,61:61,70:70,83:83,9:9}],16:[function(t,e,n){"use strict";var r=t(30),i=t(23),a=t(62),o=t(61),s=t(28),u=t(70),c=t(39),l=t(25),p=t(44),f=t(67);e.exports=function(t,e,n,h,d,m){var v=r[t],g=v,y=d?"set":"add",b=g&&g.prototype,w={},x=function(t){var e=b[t];a(b,t,"delete"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!c(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||b.forEach&&!l(function(){(new g).entries().next()}))){var _,k=new g,E=k[y](m?{}:-0,1)!=k,S=l(function(){k.has(1)}),O=p(function(t){new g(t)});O||(g=e(function(e,n){u(e,g,t);var r=new v;return void 0!=n&&s(n,d,r[y],r),r}),g.prototype=b,b.constructor=g),m||k.forEach(function(t,e){_=1/e===-(1/0)}),(S||_)&&(x("delete"),x("has"),d&&x("get")),(_||E)&&x(y),m&&b.clear&&delete b.clear}else g=h.getConstructor(e,t,d,y),o(g.prototype,n);return f(g,t),w[t]=g,i(i.G+i.W+i.F*(g!=v),w),m||h.setStrong(g,t,d),g}},{23:23,25:25,28:28,30:30,39:39,44:44,61:61,62:62,67:67,70:70}],17:[function(t,e,n){var r=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=r)},{}],18:[function(t,e,n){var r=t(3);e.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}}},{3:3}],19:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],20:[function(t,e,n){e.exports=!t(25)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{25:25}],21:[function(t,e,n){var r=t(39),i=t(30).document,a=r(i)&&r(i.createElement);e.exports=function(t){return a?i.createElement(t):{}}},{30:30,39:39}],22:[function(t,e,n){var r=t(47);e.exports=function(t){var e=r.getKeys(t),n=r.getSymbols;if(n)for(var i,a=n(t),o=r.isEnum,s=0;a.length>s;)o.call(t,i=a[s++])&&e.push(i);return e}},{47:47}],23:[function(t,e,n){var r=t(30),i=t(17),a=t(32),o=t(62),s=t(18),u="prototype",c=function(t,e,n){var l,p,f,h,d=t&c.F,m=t&c.G,v=t&c.S,g=t&c.P,y=t&c.B,b=m?r:v?r[e]||(r[e]={}):(r[e]||{})[u],w=m?i:i[e]||(i[e]={}),x=w[u]||(w[u]={});m&&(n=e);for(l in n)p=!d&&b&&l in b,f=(p?b:n)[l],h=y&&p?s(f,r):g&&"function"==typeof f?s(Function.call,f):f,b&&!p&&o(b,l,f),w[l]!=f&&a(w,l,h),g&&x[l]!=f&&(x[l]=f)};r.core=i,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,e.exports=c},{17:17,18:18,30:30,32:32,62:62}],24:[function(t,e,n){var r=t(84)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(i){}}return!0}},{84:84}],25:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],26:[function(t,e,n){"use strict";var r=t(32),i=t(62),a=t(25),o=t(19),s=t(84);e.exports=function(t,e,n){var u=s(t),c=""[t];a(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(i(String.prototype,t,n(o,u,c)),r(RegExp.prototype,u,2==e?function(t,e){return c.call(t,this,e)}:function(t){return c.call(t,this)}))}},{19:19,25:25,32:32,62:62,84:84}],27:[function(t,e,n){"use strict";var r=t(5);e.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{5:5}],28:[function(t,e,n){var r=t(18),i=t(41),a=t(36),o=t(5),s=t(80),u=t(85);e.exports=function(t,e,n,c){var l,p,f,h=u(t),d=r(n,c,e?2:1),m=0;if("function"!=typeof h)throw TypeError(t+" is not iterable!");if(a(h))for(l=s(t.length);l>m;m++)e?d(o(p=t[m])[0],p[1]):d(t[m]);else for(f=h.call(t);!(p=f.next()).done;)i(f,d,p.value,e)}},{18:18,36:36,41:41,5:5,80:80,85:85}],29:[function(t,e,n){var r=t(79),i=t(47).getNames,a={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return i(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==a.call(t)?s(t):i(r(t))}},{47:47,79:79}],30:[function(t,e,n){var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],31:[function(t,e,n){var r={}.hasOwnProperty;e.exports=function(t,e){return r.call(t,e)}},{}],32:[function(t,e,n){var r=t(47),i=t(60);e.exports=t(20)?function(t,e,n){return r.setDesc(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},{20:20,47:47,60:60}],33:[function(t,e,n){e.exports=t(30).document&&document.documentElement},{30:30}],34:[function(t,e,n){e.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?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)}},{}],35:[function(t,e,n){var r=t(12);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},{12:12}],36:[function(t,e,n){var r=t(46),i=t(84)("iterator"),a=Array.prototype;e.exports=function(t){return void 0!==t&&(r.Array===t||a[i]===t)}},{46:46,84:84}],37:[function(t,e,n){var r=t(12);e.exports=Array.isArray||function(t){return"Array"==r(t)}},{12:12}],38:[function(t,e,n){var r=t(39),i=Math.floor;e.exports=function(t){return!r(t)&&isFinite(t)&&i(t)===t}},{39:39}],39:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],40:[function(t,e,n){var r=t(39),i=t(12),a=t(84)("match");e.exports=function(t){var e;return r(t)&&(void 0!==(e=t[a])?!!e:"RegExp"==i(t))}},{12:12,39:39,84:84}],41:[function(t,e,n){var r=t(5);e.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(a){var o=t["return"];throw void 0!==o&&r(o.call(t)),a}}},{5:5}],42:[function(t,e,n){"use strict";var r=t(47),i=t(60),a=t(67),o={};t(32)(o,t(84)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=r.create(o,{next:i(1,n)}),a(t,e+" Iterator")}},{32:32,47:47,60:60,67:67,84:84}],43:[function(t,e,n){"use strict";var r=t(49),i=t(23),a=t(62),o=t(32),s=t(31),u=t(46),c=t(42),l=t(67),p=t(47).getProto,f=t(84)("iterator"),h=!([].keys&&"next"in[].keys()),d="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,y,b,w,x){c(n,e,y);var _,k,E=function(t){if(!h&&t in P)return P[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)}},S=e+" Iterator",O=b==v,A=!1,P=t.prototype,C=P[f]||P[d]||b&&P[b],T=C||E(b);if(C){var j=p(T.call(new t));l(j,S,!0),!r&&s(P,d)&&o(j,f,g),O&&C.name!==v&&(A=!0,T=function(){return C.call(this)})}if(r&&!x||!h&&!A&&P[f]||o(P,f,T),u[e]=T,u[S]=g,b)if(_={values:O?T:E(v),keys:w?T:E(m),entries:O?E("entries"):T},x)for(k in _)k in P||a(P,k,_[k]);else i(i.P+i.F*(h||A),e,_);return _}},{23:23,31:31,32:32,42:42,46:46,47:47,49:49,62:62,67:67,84:84}],44:[function(t,e,n){var r=t(84)("iterator"),i=!1;try{var a=[7][r]();a["return"]=function(){i=!0},Array.from(a,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var a=[7],o=a[r]();o.next=function(){n=!0},a[r]=function(){return o},t(a)}catch(s){}return n}},{84:84}],45:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],46:[function(t,e,n){e.exports={}},{}],47:[function(t,e,n){var r=Object;e.exports={create:r.create,getProto:r.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:r.getOwnPropertyDescriptor,setDesc:r.defineProperty,setDescs:r.defineProperties,getKeys:r.keys,getNames:r.getOwnPropertyNames,getSymbols:r.getOwnPropertySymbols,each:[].forEach}},{}],48:[function(t,e,n){var r=t(47),i=t(79);e.exports=function(t,e){for(var n,a=i(t),o=r.getKeys(a),s=o.length,u=0;s>u;)if(a[n=o[u++]]===e)return n}},{47:47,79:79}],49:[function(t,e,n){e.exports=!1},{}],50:[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}},{}],51:[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)}},{}],52:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],53:[function(t,e,n){var r,i,a,o=t(30),s=t(76).set,u=o.MutationObserver||o.WebKitMutationObserver,c=o.process,l=o.Promise,p="process"==t(12)(c),f=function(){var t,e,n;for(p&&(t=c.domain)&&(c.domain=null,t.exit());r;)e=r.domain,n=r.fn,e&&e.enter(),n(),e&&e.exit(),r=r.next;i=void 0,t&&t.enter()};if(p)a=function(){c.nextTick(f)};else if(u){var h=1,d=document.createTextNode("");new u(f).observe(d,{characterData:!0}),a=function(){d.data=h=-h}}else a=l&&l.resolve?function(){l.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:p&&c.domain};i&&(i.next=e),r||(r=e,a()),i=e}},{12:12,30:30,76:76}],54:[function(t,e,n){var r=t(47),i=t(81),a=t(35);e.exports=t(25)(function(){var t=Object.assign,e={},n={},r=Symbol(),i="abcdefghijklmnopqrst";return e[r]=7,i.split("").forEach(function(t){n[t]=t}),7!=t({},e)[r]||Object.keys(t({},n)).join("")!=i})?function(t,e){for(var n=i(t),o=arguments,s=o.length,u=1,c=r.getKeys,l=r.getSymbols,p=r.isEnum;s>u;)for(var f,h=a(o[u++]),d=l?c(h).concat(l(h)):c(h),m=d.length,v=0;m>v;)p.call(h,f=d[v++])&&(n[f]=h[f]);return n}:Object.assign},{25:25,35:35,47:47,81:81}],55:[function(t,e,n){var r=t(23),i=t(17),a=t(25);e.exports=function(t,e){var n=(i.Object||{})[t]||Object[t],o={};o[t]=e(n),r(r.S+r.F*a(function(){n(1)}),"Object",o)}},{17:17,23:23,25:25}],56:[function(t,e,n){var r=t(47),i=t(79),a=r.isEnum;e.exports=function(t){return function(e){for(var n,o=i(e),s=r.getKeys(o),u=s.length,c=0,l=[];u>c;)a.call(o,n=s[c++])&&l.push(t?[n,o[n]]:o[n]);return l}}},{47:47,79:79}],57:[function(t,e,n){var r=t(47),i=t(5),a=t(30).Reflect;e.exports=a&&a.ownKeys||function(t){var e=r.getNames(i(t)),n=r.getSymbols;return n?e.concat(n(t)):e}},{30:30,47:47,5:5}],58:[function(t,e,n){"use strict";var r=t(59),i=t(34),a=t(3);e.exports=function(){for(var t=a(this),e=arguments.length,n=Array(e),o=0,s=r._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var r,a=this,o=arguments,c=o.length,l=0,p=0;if(!u&&!c)return i(t,n,a);if(r=n.slice(),u)for(;e>l;l++)r[l]===s&&(r[l]=o[p++]);for(;c>p;)r.push(o[p++]);return i(t,r,a)}}},{3:3,34:34,59:59}],59:[function(t,e,n){e.exports=t(30)},{30:30}],60:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],61:[function(t,e,n){var r=t(62);e.exports=function(t,e){for(var n in e)r(t,n,e[n]);return t}},{62:62}],62:[function(t,e,n){var r=t(30),i=t(32),a=t(83)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(17).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(a)||i(n,a,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||i(n,"name",e)),t===r?t[e]=n:(o||delete t[e],i(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[a]||s.call(this)})},{17:17,30:30,32:32,83:83}],63:[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)}}},{}],64:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],65:[function(t,e,n){var r=t(47).getDesc,i=t(39),a=t(5),o=function(t,e){if(a(t),!i(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,i){try{i=t(18)(Function.call,r(Object.prototype,"__proto__").set,2),i(e,[]),n=!(e instanceof Array)}catch(a){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:i(t,e),t}}({},!1):void 0),check:o}},{18:18,39:39,47:47,5:5}],66:[function(t,e,n){"use strict";var r=t(30),i=t(47),a=t(20),o=t(84)("species");e.exports=function(t){var e=r[t];a&&e&&!e[o]&&i.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{20:20,30:30,47:47,84:84}],67:[function(t,e,n){var r=t(47).setDesc,i=t(31),a=t(84)("toStringTag");e.exports=function(t,e,n){t&&!i(t=n?t:t.prototype,a)&&r(t,a,{configurable:!0,value:e})}},{31:31,47:47,84:84}],68:[function(t,e,n){var r=t(30),i="__core-js_shared__",a=r[i]||(r[i]={});e.exports=function(t){return a[t]||(a[t]={})}},{30:30}],69:[function(t,e,n){var r=t(5),i=t(3),a=t(84)("species");e.exports=function(t,e){var n,o=r(t).constructor;return void 0===o||void 0==(n=r(o)[a])?e:i(n)}},{3:3,5:5,84:84}],70:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],71:[function(t,e,n){var r=t(78),i=t(19);e.exports=function(t){return function(e,n){var a,o,s=i(e)+"",u=r(n),c=s.length;return 0>u||u>=c?t?"":void 0:(a=s.charCodeAt(u),55296>a||a>56319||u+1===c||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):a:t?s.slice(u,u+2):(a-55296<<10)+(o-56320)+65536)}}},{19:19,78:78}],72:[function(t,e,n){var r=t(40),i=t(19);e.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return i(t)+""}},{19:19,40:40}],73:[function(t,e,n){var r=t(80),i=t(74),a=t(19);e.exports=function(t,e,n,o){var s=a(t)+"",u=s.length,c=void 0===n?" ":n+"",l=r(e);if(u>=l)return s;""==c&&(c=" ");var p=l-u,f=i.call(c,Math.ceil(p/c.length));return f.length>p&&(f=f.slice(0,p)),o?f+s:s+f}},{19:19,74:74,80:80}],74:[function(t,e,n){"use strict";var r=t(78),i=t(19);e.exports=function(t){var e=i(this)+"",n="",a=r(t);if(0>a||a==1/0)throw RangeError("Count can't be negative");for(;a>0;(a>>>=1)&&(e+=e))1&a&&(n+=e);return n}},{19:19,78:78}],75:[function(t,e,n){var r=t(23),i=t(19),a=t(25),o=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",s="["+o+"]",u="​…",c=RegExp("^"+s+s+"*"),l=RegExp(s+s+"*$"),p=function(t,e){var n={};n[t]=e(f),r(r.P+r.F*a(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=p.trim=function(t,e){return t=i(t)+"",1&e&&(t=t.replace(c,"")),2&e&&(t=t.replace(l,"")),t};e.exports=p},{19:19,23:23,25:25}],76:[function(t,e,n){var r,i,a,o=t(18),s=t(34),u=t(33),c=t(21),l=t(30),p=l.process,f=l.setImmediate,h=l.clearImmediate,d=l.MessageChannel,m=0,v={},g="onreadystatechange",y=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},b=function(t){y.call(t.data)};f&&h||(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)},r(m),m},h=function(t){delete v[t]},"process"==t(12)(p)?r=function(t){p.nextTick(o(y,t,1))}:d?(i=new d,a=i.port2,i.port1.onmessage=b,r=o(a.postMessage,a,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(t){l.postMessage(t+"","*")},l.addEventListener("message",b,!1)):r=g in c("script")?function(t){u.appendChild(c("script"))[g]=function(){u.removeChild(this),y.call(t)}}:function(t){setTimeout(o(y,t,1),0)}),e.exports={set:f,clear:h}},{12:12,18:18,21:21,30:30,33:33,34:34}],77:[function(t,e,n){var r=t(78),i=Math.max,a=Math.min;e.exports=function(t,e){return t=r(t),0>t?i(t+e,0):a(t,e)}},{78:78}],78:[function(t,e,n){var r=Math.ceil,i=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?i:r)(t)}},{}],79:[function(t,e,n){var r=t(35),i=t(19);e.exports=function(t){return r(i(t))}},{19:19,35:35}],80:[function(t,e,n){var r=t(78),i=Math.min;e.exports=function(t){return t>0?i(r(t),9007199254740991):0}},{78:78}],81:[function(t,e,n){var r=t(19);e.exports=function(t){return Object(r(t))}},{19:19}],82:[function(t,e,n){var r=t(39);e.exports=function(t,e){if(!r(t))return t;var n,i;if(e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;if("function"==typeof(n=t.valueOf)&&!r(i=n.call(t)))return i;if(!e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},{39:39}],83:[function(t,e,n){var r=0,i=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+i).toString(36))}},{}],84:[function(t,e,n){var r=t(68)("wks"),i=t(83),a=t(30).Symbol;e.exports=function(t){return r[t]||(r[t]=a&&a[t]||(a||i)("Symbol."+t))}},{30:30,68:68,83:83}],85:[function(t,e,n){var r=t(11),i=t(84)("iterator"),a=t(46);e.exports=t(17).getIteratorMethod=function(t){return void 0!=t?t[i]||t["@@iterator"]||a[r(t)]:void 0}},{11:11,17:17,46:46,84:84}],86:[function(t,e,n){"use strict";var r,i=t(47),a=t(23),o=t(20),s=t(60),u=t(33),c=t(21),l=t(31),p=t(12),f=t(34),h=t(25),d=t(5),m=t(3),v=t(39),g=t(81),y=t(79),b=t(78),w=t(77),x=t(80),_=t(35),k=t(83)("__proto__"),E=t(9),S=t(8)(!1),O=Object.prototype,A=Array.prototype,P=A.slice,C=A.join,T=i.setDesc,j=i.getDesc,M=i.setDescs,F={};o||(r=!h(function(){return 7!=T(c("div"),"a",{get:function(){return 7}}).a}),i.setDesc=function(t,e,n){if(r)try{return T(t,e,n)}catch(i){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(d(t)[e]=n.value),t},i.getDesc=function(t,e){if(r)try{return j(t,e)}catch(n){}return l(t,e)?s(!O.propertyIsEnumerable.call(t,e),t[e]):void 0},i.setDescs=M=function(t,e){d(t);for(var n,r=i.getKeys(e),a=r.length,o=0;a>o;)i.setDesc(t,n=r[o++],e[n]);return t}),a(a.S+a.F*!o,"Object",{getOwnPropertyDescriptor:i.getDesc,defineProperty:i.setDesc,defineProperties:M});var N="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),L=N.concat("length","prototype"),R=N.length,D=function(){var t,e=c("iframe"),n=R,r=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("