diff --git a/.github/workflows/autochangelog.yml b/.github/workflows/autochangelog.yml index 7953929ce5..71a53a5b2d 100644 --- a/.github/workflows/autochangelog.yml +++ b/.github/workflows/autochangelog.yml @@ -11,7 +11,7 @@ env: jobs: autochangelog: name: Autochangelog - runs-on: ubuntu-16.04 + runs-on: ubuntu-20.04 if: github.event.pull_request.merged == true steps: - uses: /actions/checkout@v2 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0473967037..454348a5cd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ env: jobs: file_tests: name: Run Linters - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Ensure +x on CI directory @@ -26,7 +26,7 @@ jobs: # dreamchecker: # name: DreamChecker -# runs-on: ubuntu-18.04 +# runs-on: ubuntu-20.04 # steps: # - uses: actions/checkout@v2 # @@ -54,7 +54,7 @@ jobs: unit_tests: name: Integration Tests - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Ensure +x on CI directory @@ -69,7 +69,7 @@ jobs: run: | sudo dpkg --add-architecture i386 sudo apt update || true - sudo apt install libc6:i386 libgcc1:i386 libstdc++6:i386 libssl1.0.0:i386 zlib1g:i386 + sudo apt install zlib1g-dev:i386 libssl-dev:i386 pkg-config:i386 ldd librust_g.so - name: Unit Tests run: | diff --git a/.github/workflows/render_nanomaps.yml b/.github/workflows/render_nanomaps.yml index f3a50a5e94..fd5536ea48 100644 --- a/.github/workflows/render_nanomaps.yml +++ b/.github/workflows/render_nanomaps.yml @@ -14,7 +14,7 @@ on: jobs: generate_maps: name: 'Generate NanoMaps' - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - name: Clone uses: actions/checkout@v2 diff --git a/_build_dependencies.sh b/_build_dependencies.sh index b278c1115a..cf9e6ed7bd 100644 --- a/_build_dependencies.sh +++ b/_build_dependencies.sh @@ -4,8 +4,8 @@ export SPACEMAN_DMM_VERSION=suite-1.7 # For NanoUI + TGUI export NODE_VERSION=12 # Byond Major -export BYOND_MAJOR=513 +export BYOND_MAJOR=514 # Byond Minor -export BYOND_MINOR=1542 +export BYOND_MINOR=1557 # Macro Count export MACRO_COUNT=4 diff --git a/code/controllers/subsystems/transcore_vr.dm b/code/controllers/subsystems/transcore_vr.dm index ebf47439d6..6b0815999b 100644 --- a/code/controllers/subsystems/transcore_vr.dm +++ b/code/controllers/subsystems/transcore_vr.dm @@ -114,7 +114,7 @@ SUBSYSTEM_DEF(transcore) else if(curr_MR.dead_state != MR_DEAD) //First time switching to dead if(curr_MR.do_notify) - db.notify(curr_MR.mindname) + db.notify(curr_MR) curr_MR.last_notification = world.time curr_MR.dead_state = MR_DEAD @@ -250,10 +250,15 @@ SUBSYSTEM_DEF(transcore) return 1 -// Send a past-due notification to the medical radio channel. -/datum/transcore_db/proc/notify(var/name) - ASSERT(name) - global_announcer.autosay("[name] is past-due for a mind backup.", "TransCore Oversight", "Medical") +// Send a past-due notification to the proper radio channel. +/datum/transcore_db/proc/notify(var/datum/transhuman/mind_record/MR) + ASSERT(MR) + var/datum/transcore_db/db = SStranscore.db_by_mind_name(MR.mindname) + var/datum/transhuman/body_record/BR = db.body_scans[MR.mindname] + if(!BR) + global_announcer.autosay("[MR.mindname] is past-due for a mind backup, but lacks a corresponding body record.", "TransCore Oversight", "Medical") + return + global_announcer.autosay("[MR.mindname] is past-due for a mind backup.", "TransCore Oversight", BR.synthetic ? "Science" : "Medical") // Called from mind_record to add itself to the transcore. /datum/transcore_db/proc/add_backup(var/datum/transhuman/mind_record/MR) @@ -295,4 +300,4 @@ SUBSYSTEM_DEF(transcore) return disk.stored.len #undef SSTRANSCORE_BACKUPS -#undef SSTRANSCORE_IMPLANTS \ No newline at end of file +#undef SSTRANSCORE_IMPLANTS diff --git a/code/datums/outfits/jobs/medical.dm b/code/datums/outfits/jobs/medical.dm index 0ad0938db5..ca95c8b52e 100644 --- a/code/datums/outfits/jobs/medical.dm +++ b/code/datums/outfits/jobs/medical.dm @@ -92,7 +92,7 @@ /decl/hierarchy/outfit/job/medical/paramedic name = OUTFIT_JOB_NAME("Paramedic") - uniform = /obj/item/clothing/under/rank/medical/scrubs/black + uniform = /obj/item/clothing/under/rank/medical/paramedic suit = /obj/item/clothing/suit/storage/toggle/fr_jacket shoes = /obj/item/clothing/shoes/boots/jackboots l_hand = /obj/item/weapon/storage/firstaid/regular @@ -103,5 +103,5 @@ /decl/hierarchy/outfit/job/medical/paramedic/emt name = OUTFIT_JOB_NAME("Emergency Medical Technician") - uniform = /obj/item/clothing/under/rank/medical/paramedic + uniform = /obj/item/clothing/under/rank/medical/paramedic_alt suit = /obj/item/clothing/suit/storage/toggle/labcoat/emt diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm index 69f198bbd4..eb7d350c5f 100644 --- a/code/datums/supplypacks/medical.dm +++ b/code/datums/supplypacks/medical.dm @@ -202,7 +202,7 @@ /obj/item/clothing/under/rank/medical/paramedic, /obj/item/clothing/suit/storage/toggle/fr_jacket, /obj/item/clothing/mask/gas, - /obj/item/clothing/under/rank/medical/paramedic, + /obj/item/clothing/under/rank/medical/paramedic_alt, /obj/item/clothing/accessory/stethoscope, /obj/item/weapon/storage/firstaid/adv, /obj/item/clothing/shoes/boots/jackboots, @@ -305,8 +305,8 @@ /datum/supply_pack/med/medicalbiosuits name = "Medical biohazard gear" contains = list( - /obj/item/clothing/head/bio_hood = 3, - /obj/item/clothing/suit/bio_suit = 3, + /obj/item/clothing/head/bio_hood/modern = 3, + /obj/item/clothing/suit/bio_suit/modern = 3, /obj/item/clothing/head/bio_hood/virology = 2, /obj/item/clothing/suit/bio_suit/cmo, /obj/item/clothing/head/bio_hood/cmo, diff --git a/code/game/machinery/casino_ch.dm b/code/game/machinery/casino_ch.dm index b6aa6a712d..1c39d2221c 100644 --- a/code/game/machinery/casino_ch.dm +++ b/code/game/machinery/casino_ch.dm @@ -229,57 +229,6 @@ busy = FALSE - -/obj/structure/wheel_of_fortune - name = "wheel of fortune" - desc = "May fortune favour the lucky one!" - icon = 'icons/obj/casino_ch.dmi' - icon_state = "wheel_of_fortune" - density = 1 - anchored = 1 - var/interval = 1 - var/busy = 0 - - var/datum/effect/effect/system/confetti_spread - var/confetti_strength = 8 - -/obj/structure/wheel_of_fortune/verb/setinterval() - set name = "Change interval" - set category = "Object" - set src in view(1) - - if(usr.incapacitated()) - return - if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) - interval = input("Put the desired interval (1-100)", "Set Interval") as num - if(interval>100 || interval<1) - usr << "Invalid interval." - return - usr << "You set the interval to [interval]" - return - - -/obj/structure/wheel_of_fortune/attack_hand(mob/user as mob) - if (busy) - to_chat(user,"The wheel of fortune is already spinning! ") - return - visible_message("\ [user] spins the wheel of fortune!") - busy = 1 - icon_state = "wheel_of_fortune_spinning" - var/result = rand(1,interval) - add_fingerprint(user) - spawn(5 SECONDS) - visible_message("The wheel of fortune stops spinning, the number is [result]!") - - src.confetti_spread = new /datum/effect/effect/system/confetti_spread() - src.confetti_spread.attach(src) //If somehow people start dragging slot machine - spawn(0) - for(var/i = 1 to confetti_strength) - src.confetti_spread.start() - sleep(10) - busy=0 - icon_state = "wheel_of_fortune" - /obj/structure/stripper_pole name = "stripper pole" icon = 'icons/obj/casino_ch.dmi' @@ -1009,3 +958,186 @@ spawn_money(round(I:worth/2.5), src.loc) src.attack_hand(user) qdel(I) + +/obj/machinery/wheel_of_fortune + name = "wheel of fortune" + desc = "The Wheel of Fortune! Insert chips and may fortune favour the lucky one at the next lottery!" + icon = 'icons/obj/64x64_ch.dmi' + icon_state = "wheel_of_fortune" + density = 1 + anchored = 1 + pixel_x = -16 + + req_access = list(300) + var/interval = 1 + var/busy = 0 + var/public_spin = 0 + var/lottery_sale = "disabled" + var/lottery_price = 100 + var/lottery_entries = 0 + var/lottery_tickets = list() + var/lottery_tickets_ckeys = list() + + var/datum/effect/effect/system/confetti_spread + var/confetti_strength = 15 + + +/obj/machinery/wheel_of_fortune/attack_hand(mob/user as mob) + if (busy) + to_chat(user,"The wheel of fortune is already spinning! ") + return + + if(usr.incapacitated()) + return + if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) + switch(input(user,"Choose what to do","Wheel Of Fortune") in list("Spin the Wheel! (Not Lottery)", "Set the interval", "Cancel")) + if("Cancel") + return + if("Spin the Wheel! (Not Lottery)") + if(public_spin == 0) + to_chat(user,"The Wheel makes a sad beep, public spins are not enabled right now.. ") + return + else + to_chat(user,"You spin the wheel! ") + spin_the_wheel("not_lottery") + if("Set the interval") + setinterval() + + +/obj/machinery/wheel_of_fortune/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (busy) + to_chat(user,"The wheel of fortune is already spinning! ") + return + + if(usr.incapacitated()) + return + + if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) + if(!check_access(W)) + to_chat(user, "Access Denied.") + return + else + to_chat(user, "Proper access, allowed staff controls.") + if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) + switch(input(user,"Choose what to do (Management)","Wheel Of Fortune (Management)") in list("Spin the Lottery Wheel!", "Toggle Lottery Sales", "Toggle Public Spins", "Reset Lottery", "Cancel")) + if("Cancel") + return + if("Spin the Lottery Wheel!") + to_chat(user,"You spin the wheel for the lottery! ") + spin_the_wheel("lottery") + + if("Toggle Lottery Sales") + if(lottery_sale == "disabled") + lottery_sale = "enabled" + to_chat(user,"Public Lottery sale has been enabled. ") + else + lottery_sale = "disabled" + to_chat(user,"Public Lottery sale has been disabled. ") + + if("Toggle Public Spins") + if(public_spin == 0) + public_spin = 1 + to_chat(user,"Public spins has been enabled. ") + else + public_spin = 0 + to_chat(user,"Public spins has been disabled. ") + + if("Reset Lottery") + var/confirm = tgui_alert(usr, "Are you sure you want to reset Lottery?", "Confirm Lottery Reset", list("Yes", "No")) + if(confirm == "Yes") + to_chat(user, "Lottery has been Reset!") + lottery_entries = 0 + lottery_tickets = list() + lottery_tickets_ckeys = list() + + if(istype(W, /obj/item/weapon/spacecasinocash)) + if(lottery_sale == "disabled") + to_chat(user, "Lottery sales are currently disabled.") + return + else + if(user.client.ckey in lottery_tickets_ckeys) + to_chat(user, "The scanner beeps in an upset manner, you already have a ticket!") + return + + var/obj/item/weapon/spacecasinocash/C = W + insert_chip(C, user) + +/obj/machinery/wheel_of_fortune/proc/insert_chip(var/obj/item/weapon/spacecasinocash/cashmoney, mob/user) + if (busy) + to_chat(user,"The Wheel of Fortune is busy, wait for it to be done to buy a lottery ticket. ") + return + if(cashmoney.worth < lottery_price) + to_chat(user,"You dont have enough chips to buy a lottery ticket! ") + return + + to_chat(user,"You put [lottery_price] credits worth of chips into the Wheel of Fortune and it pings to notify of your lottery ticket registered!") + cashmoney.worth -= lottery_price + cashmoney.update_icon() + + if(cashmoney.worth <= 0) + usr.drop_from_inventory(cashmoney) + qdel(cashmoney) + cashmoney.update_icon() + + lottery_entries++ + lottery_tickets += "Number.[lottery_entries] [user.name]" + lottery_tickets_ckeys += user.client.ckey + +/obj/machinery/wheel_of_fortune/proc/spin_the_wheel(var/mode) + var/result = 0 + + if(mode == "not_lottery") + busy = 1 + icon_state = "wheel_of_fortune_spinning" + result = rand(1,interval) + + spawn(5 SECONDS) + visible_message("The wheel of fortune stops spinning, the number is [result]!") + src.confetti_spread = new /datum/effect/effect/system/confetti_spread() + src.confetti_spread.attach(src) //If somehow people start dragging slot machine + spawn(0) + for(var/i = 1 to confetti_strength) + src.confetti_spread.start() + sleep(10) + + flick("[icon_state]-winning",src) + busy = 0 + icon_state = "wheel_of_fortune" + + if(mode == "lottery") + if(lottery_entries == 0) + visible_message("There are no tickets in the system!") + return + + busy = 1 + icon_state = "wheel_of_fortune_spinning" + result = pick(lottery_tickets) + + spawn(5 SECONDS) + visible_message("The wheel of fortune stops spinning, and the winner is [result]!") + src.confetti_spread = new /datum/effect/effect/system/confetti_spread() + src.confetti_spread.attach(src) //If somehow people start dragging slot machine + spawn(0) + for(var/i = 1 to confetti_strength) + src.confetti_spread.start() + sleep(10) + + flick("[icon_state]-winning",src) + busy = 0 + icon_state = "wheel_of_fortune" + + +/obj/machinery/wheel_of_fortune/verb/setinterval() + set name = "Change interval" + set category = "Object" + set src in view(1) + + if(usr.incapacitated()) + return + if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) + interval = input("Put the desired interval (1-1000)", "Set Interval") as num + if(interval>1000 || interval<1) + usr << "Invalid interval." + return + usr << "You set the interval to [interval]" + return \ No newline at end of file diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index f04aba5a25..5b39bc618f 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -13,12 +13,13 @@ var/list/network = list() var/datum/tgui_module/camera/camera + var/camera_datum_type = /datum/tgui_module/camera /obj/machinery/computer/security/Initialize() . = ..() if(!LAZYLEN(network)) network = get_default_networks() - camera = new(src, network) + camera = new camera_datum_type(src, network) /obj/machinery/computer/security/proc/get_default_networks() . = using_map.station_networks.Copy() @@ -67,19 +68,41 @@ density = 0 circuit = null +GLOBAL_LIST_EMPTY(entertainment_screens) /obj/machinery/computer/security/telescreen/entertainment name = "entertainment monitor" desc = "Damn, why do they never have anything interesting on these things?" - icon = 'icons/obj/status_display.dmi' - icon_screen = "entertainment" + icon = 'icons/obj/entertainment_monitor.dmi' + icon_state = "screen" + icon_screen = null light_color = "#FFEEDB" light_range_on = 2 network = list(NETWORK_THUNDER) circuit = /obj/item/weapon/circuitboard/security/telescreen/entertainment + camera_datum_type = /datum/tgui_module/camera/bigscreen + var/obj/item/device/radio/radio = null + var/obj/effect/overlay/vis/pinboard + var/weakref/showing /obj/machinery/computer/security/telescreen/entertainment/Initialize() + GLOB.entertainment_screens += src + + var/static/icon/mask = icon('icons/obj/entertainment_monitor.dmi', "mask") + + add_overlay("glass") + + pinboard = new() + pinboard.icon = icon + pinboard.icon_state = "pinboard" + pinboard.layer = 0.1 + pinboard.vis_flags = VIS_UNDERLAY|VIS_INHERIT_ID|VIS_INHERIT_PLANE + pinboard.appearance_flags = KEEP_TOGETHER + pinboard.add_filter("screen cutter", 1, alpha_mask_filter(icon = mask)) + vis_contents += pinboard + . = ..() + radio = new(src) radio.listening = TRUE radio.broadcasting = FALSE @@ -87,13 +110,44 @@ radio.canhear_range = 7 // Same as default sight range. power_change() +/obj/machinery/computer/security/telescreen/entertainment/Destroy() + if(showing) + stop_showing() + vis_contents.Cut() + qdel_null(pinboard) + qdel_null(radio) + return ..() + +/obj/machinery/computer/security/telescreen/entertainment/Click(location, control, params) + attack_hand(usr) + +/obj/machinery/computer/security/telescreen/entertainment/update_icon() + return // NUH + +/obj/machinery/computer/security/telescreen/entertainment/proc/show_thing(atom/thing) + if(showing) + stop_showing() + if(stat & NOPOWER) + return + showing = weakref(thing) + pinboard.vis_contents = list(thing) + +/obj/machinery/computer/security/telescreen/entertainment/proc/stop_showing() + // Reverse of the above + pinboard.vis_contents = null + showing = null + +/obj/machinery/computer/security/telescreen/entertainment/proc/maybe_stop_showing(weakref/thingref) + if(showing == thingref) + stop_showing() + /obj/machinery/computer/security/telescreen/entertainment/power_change() ..() - if(radio) - if(stat & NOPOWER) - radio.on = FALSE - else - radio.on = TRUE + if(stat & NOPOWER) + radio?.on = FALSE + stop_showing() + else + radio?.on = TRUE /obj/machinery/computer/security/wooden_tv name = "security camera monitor" diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 51d97df592..8d5dd425e3 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -491,6 +491,19 @@ for(var/datum/data/record/G in data_core.general) if((G.fields["name"] == to_despawn.real_name)) qdel(G) + + // Also check the hidden version of each datacore, if they're an offmap role. + var/datum/job/J = SSjob.get_job(job) + if(J?.offmap_spawn) + for(var/datum/data/record/R in data_core.hidden_general) + if((R.fields["name"] == to_despawn.real_name)) + qdel(R) + for(var/datum/data/record/T in data_core.hidden_security) + if((T.fields["name"] == to_despawn.real_name)) + qdel(T) + for(var/datum/data/record/G in data_core.hidden_medical) + if((G.fields["name"] == to_despawn.real_name)) + qdel(G) icon_state = base_icon_state diff --git a/code/game/machinery/gear_dispenser.dm b/code/game/machinery/gear_dispenser.dm index a2723a2597..adb204e4d9 100644 --- a/code/game/machinery/gear_dispenser.dm +++ b/code/game/machinery/gear_dispenser.dm @@ -80,15 +80,16 @@ var/list/dispenser_presets = list() var/spawned = list() voidsuit = new voidsuit_type(T) - spawned += voidsuit + spawned += voidsuit // We only add the voidsuit so the game doesn't try to put the tank/helmet/boots etc into their hands + // If we're supposed to make a helmet if(voidhelmet_type) // The coder may not have realized this type spawns its own helmet if(voidsuit.helmet) error("[src] created a voidsuit [voidsuit] and wants to add a helmet but it already has one") else - voidsuit.attach_helmet(new voidhelmet_type()) - spawned += voidhelmet + voidhelmet = new voidhelmet_type() + voidsuit.attach_helmet(voidhelmet) // If we're supposed to make boots if(magboots_type) // The coder may not have realized thist ype spawns its own boots @@ -97,7 +98,6 @@ var/list/dispenser_presets = list() else magboots = new magboots_type(voidsuit) voidsuit.boots = magboots - spawned += magboots if(refit) voidsuit.refit_for_species(user.species?.get_bodytype()) // does helmet and boots if they're attached @@ -109,7 +109,6 @@ var/list/dispenser_presets = list() else var/obj/item/life_support = new /obj/item/device/suit_cooling_unit(voidsuit) voidsuit.cooler = life_support - spawned += life_support else if(user.species?.breath_type) if(voidsuit.tank) error("[src] created a voidsuit [voidsuit] and wants to add a tank but it already has one") @@ -121,7 +120,6 @@ var/list/dispenser_presets = list() if(tankpath) var/obj/item/life_support = new tankpath(voidsuit) voidsuit.tank = life_support - spawned += life_support else voidsuit.audible_message("Dispenser warning: Unable to locate suitable airtank for user.") @@ -567,6 +565,27 @@ var/list/dispenser_presets = list() one_setting = /datum/gear_disp/voidsuit/autolok special_frame = "frame_grey" +////////////////////////////// MOEBIUS SUIT DISPENSERS /////////////////////////// +/datum/gear_disp/voidsuit/aether + name = "Aether Voidsuit" + voidsuit_type = /obj/item/clothing/suit/space/void/aether + voidhelmet_type = /obj/item/clothing/head/helmet/space/void/aether + refit = FALSE // No animal sprites AAA! + +/obj/machinery/gear_dispenser/suit/aether + name = "\improper Aether Voidsuit Dispenser" + desc = "An industrial U-Tak-It Dispenser unit designed to fetch a specific Aether-produced high-end suit." + icon_state = "suitdispenserMB" + dispenser_flags = GD_ONEITEM|GD_NOGREED|GD_UNLIMITED + one_setting = /datum/gear_disp/voidsuit/aether + +/obj/machinery/gear_dispenser/suit_fancy/aether + name = "\improper Aether Voidsuit Dispenser" + desc = "A commercial U-Tak-It Dispenser unit designed to fetch a specific Aether-produced high-end suit." + dispenser_flags = GD_ONEITEM|GD_NOGREED|GD_UNLIMITED + one_setting = /datum/gear_disp/voidsuit/aether + special_frame = "frame_purple" + // Adminbuse /obj/machinery/gear_dispenser/vv_get_dropdown() . = ..() diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index acf4b7cc3a..b7d7933a88 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -8,6 +8,8 @@ var/channel = "NCS Northern Star News Feed" var/obj/machinery/camera/network/thunder/camera var/obj/item/device/radio/radio + var/weakref/showing + var/showing_name /obj/item/device/tvcamera/New() ..() @@ -45,9 +47,14 @@ /obj/item/device/tvcamera/attack_self(mob/user) add_fingerprint(user) user.set_machine(src) + show_ui(user) + +/obj/item/device/tvcamera/proc/show_ui(mob/user) var/dat = list() dat += "Channel name is: [channel ? channel : "unidentified broadcast"]
" dat += "Video streaming is [camera.status ? "on" : "off"]
" + if(camera.status && showing_name) + dat += "- You're showing [showing_name] to your viewers.
" dat += "Mic is [radio.broadcasting ? "on" : "off"]
" dat += "Sound is being broadcasted on frequency [format_frequency(radio.frequency)] ([get_frequency_name(radio.frequency)])
" var/datum/browser/popup = new(user, "Hovercamera", "Eye Buddy", 300, 390, src) @@ -67,8 +74,12 @@ camera.set_status(!camera.status) if(camera.status) to_chat(usr,"Video streaming activated. Broadcasting on channel '[channel]'") + show_tvs(loc) else to_chat(usr,"Video streaming deactivated.") + hide_tvs() + for(var/obj/machinery/computer/security/telescreen/entertainment/ES as anything in GLOB.entertainment_screens) + ES.stop_showing() update_icon() if(href_list["sound"]) radio.ToggleBroadcast() @@ -79,6 +90,50 @@ if(!href_list["close"]) attack_self(usr) +/obj/item/device/tvcamera/proc/show_tvs(atom/thing) + if(showing) + hide_tvs(showing) + + showing = weakref(thing) + showing_name = "[thing]" + for(var/obj/machinery/computer/security/telescreen/entertainment/ES as anything in GLOB.entertainment_screens) + ES.show_thing(thing) + + START_PROCESSING(SSobj, src) + +/obj/item/device/tvcamera/proc/hide_tvs() + if(!showing) + return + for(var/obj/machinery/computer/security/telescreen/entertainment/ES as anything in GLOB.entertainment_screens) + ES.maybe_stop_showing(showing) + STOP_PROCESSING(SSobj, src) + showing = null + showing_name = null + +/obj/item/device/tvcamera/Moved(atom/old_loc, direction, forced = FALSE, movetime) + . = ..() + if(camera.status && loc != old_loc) + show_tvs(loc) + +/obj/item/device/tvcamera/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(camera.status && !isturf(target)) + show_tvs(target) + user.visible_message("[user] aims [src] at [target].", "You aim [src] at [target].") + if(user.machine == src) + show_ui(user) // refresh the UI + +/obj/item/device/tvcamera/process() + if(!showing) + return PROCESS_KILL + + var/atom/A = showing.resolve() + if(!A || QDELETED(A)) + show_tvs(loc) + + if(get_dist(get_turf(src), get_turf(A)) > 5) + show_tvs(loc) + /obj/item/device/tvcamera/update_icon() ..() if(camera.status) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index f023f3e395..38e173e3ff 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -10,8 +10,8 @@ var/list/climbers var/block_turf_edges = FALSE // If true, turf edge icons will not be made on the turf this occupies. - var/list/connections = list("0", "0", "0", "0") - var/list/other_connections = list("0", "0", "0", "0") + var/list/connections + var/list/other_connections var/list/blend_objects = newlist() // Objects which to blend with var/list/noblend_objects = newlist() //Objects to avoid blending with (such as children of listed blend objects. diff --git a/code/game/objects/structures/barricades.dm b/code/game/objects/structures/barricades.dm index 34ab6025c7..c60c48375e 100644 --- a/code/game/objects/structures/barricades.dm +++ b/code/game/objects/structures/barricades.dm @@ -144,7 +144,8 @@ var/image/I for(var/i = 1 to 4) - I = image('icons/obj/sandbags.dmi', "sandbags[connections[i]]", dir = 1<<(i-1)) + var/connect = connections?[i] || 0 + I = image('icons/obj/sandbags.dmi', "sandbags[connect]", dir = 1<<(i-1)) I.color = material.icon_colour add_overlay(I) diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index 58674def1a..e77abbaa6f 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -51,7 +51,8 @@ var/image/I if(!hatch_open) for(var/i = 1 to 4) - I = image(icon, "catwalk[connections[i]]", dir = 1<<(i-1)) + var/connect = connections?[i] || 0 + I = image(icon, "catwalk[connect]", dir = 1<<(i-1)) add_overlay(I) if(plating_color) I = image(icon, "plated") diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index a89601cc0a..a1412ba7a9 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -33,6 +33,7 @@ /obj/item/clothing/under/rank/nurse, /obj/item/clothing/under/rank/orderly, /obj/item/clothing/suit/storage/toggle/labcoat, + /obj/item/clothing/suit/storage/toggle/labcoat/modern, /obj/item/clothing/suit/storage/toggle/fr_jacket, /obj/item/clothing/shoes/white, /obj/item/weapon/cartridge/medical, @@ -127,6 +128,7 @@ /obj/item/clothing/under/rank/chief_medical_officer/skirt, /obj/item/clothing/suit/storage/toggle/labcoat/cmo, /obj/item/clothing/suit/storage/toggle/labcoat/cmoalt, + /obj/item/clothing/suit/storage/toggle/labcoat/modern/cmo, /obj/item/weapon/cartridge/cmo, /obj/item/clothing/gloves/sterile/latex, /obj/item/clothing/shoes/brown, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 66383849f0..a3fdc31f24 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -33,6 +33,7 @@ /obj/item/clothing/under/rank/research_director/rdalt, /obj/item/clothing/under/rank/research_director/dress_rd, /obj/item/clothing/suit/storage/toggle/labcoat, + /obj/item/clothing/suit/storage/toggle/labcoat/modern, /obj/item/weapon/cartridge/rd, /obj/item/clothing/shoes/white, /obj/item/clothing/shoes/laceup/brown, @@ -54,6 +55,7 @@ starts_with = list( /obj/item/clothing/under/rank/scientist, /obj/item/clothing/suit/storage/toggle/labcoat, + /obj/item/clothing/suit/storage/toggle/labcoat/modern, /obj/item/clothing/shoes/white, /obj/item/weapon/melee/umbrella, // vorestation addition, /obj/item/clothing/glasses/science, diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 6c88090e40..12a1119792 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -220,6 +220,7 @@ /obj/item/clothing/under/rank/scientist/skirt = 2, /obj/item/clothing/under/rank/scientist/turtleneck = 3, /obj/item/clothing/suit/storage/toggle/labcoat = 3, + /obj/item/clothing/suit/storage/toggle/labcoat/modern = 3, /obj/item/clothing/shoes/white = 3, /obj/item/clothing/shoes/slippers = 3, /obj/item/clothing/suit/storage/hooded/wintercoat/science, diff --git a/code/modules/admin/view_variables/topic_list.dm b/code/modules/admin/view_variables/topic_list.dm index c437a58a17..1f535f2b42 100644 --- a/code/modules/admin/view_variables/topic_list.dm +++ b/code/modules/admin/view_variables/topic_list.dm @@ -10,7 +10,7 @@ mod_list(target, null, "list", "contents", target_index, autodetect_class = FALSE) if(href_list[VV_HK_LIST_REMOVE]) var/variable = target[target_index] - var/prompt = tgui_alert(usr, "Do you want to remove item number [target_index] from list?", "Confirm", "Yes", "No") + var/prompt = tgui_alert(usr, "Do you want to remove item number [target_index] from list?", "Confirm", list("Yes", "No")) if (prompt != "Yes") return target.Cut(target_index, target_index+1) diff --git a/code/modules/busy_space_vr/organizations.dm b/code/modules/busy_space_vr/organizations.dm index 05df67ce87..ec30b2a2a8 100644 --- a/code/modules/busy_space_vr/organizations.dm +++ b/code/modules/busy_space_vr/organizations.dm @@ -1402,7 +1402,7 @@ ////////////////////////////////////////////////////////////////////////////////// // Other -/datum/lore/organization/other/kitsuhana //sorry KHI, but you're not a coherent stellar government, and you're definitely not a TSC. you get to go in the Others pool. +/datum/lore/organization/other/kitsuhana //sorry KHI, but you're not a coherent stellar government, and you're definitely not a TSC. you get to go in the Others pool. //makes sense to me! name = "Kitsuhana Heavy Industries" short_name = "" //whitespace haaaack desc = "A large post-scarcity amalgamation of races, Kitsuhana is no longer a company but rather a loose association of 'members' \ diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 738ee9bce2..9553e6fab6 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -135,43 +135,39 @@ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(hoodies)) /datum/gear/suit/labcoat - display_name = "labcoat" + display_name = "labcoat selection, public" path = /obj/item/clothing/suit/storage/toggle/labcoat -/datum/gear/suit/labcoat/blue - display_name = "labcoat, blue" - path = /obj/item/clothing/suit/storage/toggle/labcoat/blue +/datum/gear/suit/labcoat/New() + ..() + var/list/labcoats = list( + "White labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat, + "Blue-edge labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat/blue_edge, + "Green labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat/green, + "Orange labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat/orange, + "Purple labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat/purple, + "Pink labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat/pink, + "Red labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat/red, + "Yellow labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat/yellow + ) + gear_tweaks += new/datum/gear_tweak/path(labcoats) -/datum/gear/suit/labcoat/blue_edge - display_name = "labcoat, blue-edged" - path = /obj/item/clothing/suit/storage/toggle/labcoat/blue_edge +/datum/gear/suit/labcoat_cmo + display_name = "labcoat selection, cmo" + path = /obj/item/clothing/suit/storage/toggle/labcoat/cmo + allowed_roles = list("Chief Medical Officer") -/datum/gear/suit/labcoat/green - display_name = "labcoat, green" - path = /obj/item/clothing/suit/storage/toggle/labcoat/green - -/datum/gear/suit/labcoat/orange - display_name = "labcoat, orange" - path = /obj/item/clothing/suit/storage/toggle/labcoat/orange - -/datum/gear/suit/labcoat/purple - display_name = "labcoat, purple" - path = /obj/item/clothing/suit/storage/toggle/labcoat/purple - -/datum/gear/suit/labcoat/pink - display_name = "labcoat, pink" - path = /obj/item/clothing/suit/storage/toggle/labcoat/pink - -/datum/gear/suit/labcoat/red - display_name = "labcoat, red" - path = /obj/item/clothing/suit/storage/toggle/labcoat/red - -/datum/gear/suit/labcoat/yellow - display_name = "labcoat, yellow" - path = /obj/item/clothing/suit/storage/toggle/labcoat/yellow +/datum/gear/suit/labcoat_cmo/New() + ..() + var/list/labcoats = list( + "CMO labcoat" = /obj/item/clothing/suit/storage/toggle/labcoat/cmo, + "CMO labcoat (alt)" = /obj/item/clothing/suit/storage/toggle/labcoat/cmoalt, + "CMO labcoat (modern)" = /obj/item/clothing/suit/storage/toggle/labcoat/modern/cmo + ) + gear_tweaks += new/datum/gear_tweak/path(labcoats) /datum/gear/suit/labcoat/emt - display_name = "labcoat, EMT (Medical)" + display_name = "labcoat, EMT" path = /obj/item/clothing/suit/storage/toggle/labcoat/emt allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist") @@ -189,6 +185,11 @@ path = /obj/item/clothing/suit/storage/apron/overalls cost = 1 +/datum/gear/suit/cyberpunk + display_name = "cyberpunk jacket" + path = /obj/item/clothing/suit/cyberpunk + cost = 2 + /datum/gear/suit/poncho display_name = "poncho selection" path = /obj/item/clothing/accessory/poncho @@ -203,96 +204,77 @@ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(ponchos)) /datum/gear/suit/roles/poncho - display_name = "poncho, cargo" + display_name = "poncho selection, departments" path = /obj/item/clothing/accessory/poncho/roles/cargo cost = 1 -/datum/gear/suit/roles/poncho/security - display_name = "poncho, security" - path = /obj/item/clothing/accessory/poncho/roles/security +/datum/gear/suit/roles/poncho/New() + ..() + var/list/ponchos = list( + "Cargo poncho" = /obj/item/clothing/accessory/poncho/roles/cargo, + "Security poncho" = /obj/item/clothing/accessory/poncho/roles/security, + "Medical poncho" = /obj/item/clothing/accessory/poncho/roles/medical, + "Engineering poncho" = /obj/item/clothing/accessory/poncho/roles/engineering, + "Science poncho" = /obj/item/clothing/accessory/poncho/roles/science + ) + gear_tweaks += new/datum/gear_tweak/path(ponchos) -/datum/gear/suit/roles/poncho/medical - display_name = "poncho, medical" - path = /obj/item/clothing/accessory/poncho/roles/medical -/datum/gear/suit/roles/poncho/engineering - display_name = "poncho, engineering" - path = /obj/item/clothing/accessory/poncho/roles/engineering +/datum/gear/suit/roles/cloak + display_name = "cloak selection, departments" + path = /obj/item/clothing/accessory/poncho/roles/cloak/cargo -/datum/gear/suit/roles/poncho/science - display_name = "poncho, science" - path = /obj/item/clothing/accessory/poncho/roles/science +/datum/gear/suit/roles/cloak/New() + ..() + var/list/cloaks = list( + "Cargo cloak" = /obj/item/clothing/accessory/poncho/roles/cloak/cargo, + "Mining cloak" = /obj/item/clothing/accessory/poncho/roles/cloak/mining, + "Security cloak" = /obj/item/clothing/accessory/poncho/roles/cloak/security, + "Service cloak" = /obj/item/clothing/accessory/poncho/roles/cloak/service, + "Engineer cloak" = /obj/item/clothing/accessory/poncho/roles/cloak/engineer, + "Atmos cloak" = /obj/item/clothing/accessory/poncho/roles/cloak/atmos, + "Research cloak" = /obj/item/clothing/accessory/poncho/roles/cloak/research, + "Medical cloak" = /obj/item/clothing/accessory/poncho/roles/cloak/medical + ) + gear_tweaks += new/datum/gear_tweak/path(cloaks) -/datum/gear/suit/roles/poncho/cloak/hos +/datum/gear/suit/roles/poncho/cloak_hos display_name = "cloak, head of security" path = /obj/item/clothing/accessory/poncho/roles/cloak/hos allowed_roles = list("Head of Security") -/datum/gear/suit/roles/poncho/cloak/cmo +/datum/gear/suit/roles/poncho/cloak_cmo display_name = "cloak, chief medical officer" path = /obj/item/clothing/accessory/poncho/roles/cloak/cmo allowed_roles = list("Chief Medical Officer") -/datum/gear/suit/roles/poncho/cloak/ce +/datum/gear/suit/roles/poncho/cloak_ce display_name = "cloak, chief engineer" path = /obj/item/clothing/accessory/poncho/roles/cloak/ce allowed_roles = list("Chief Engineer") -/datum/gear/suit/roles/poncho/cloak/rd +/datum/gear/suit/roles/poncho/cloak_rd display_name = "cloak, research director" path = /obj/item/clothing/accessory/poncho/roles/cloak/rd allowed_roles = list("Research Director") -/datum/gear/suit/roles/poncho/cloak/qm +/datum/gear/suit/roles/poncho/cloak_qm display_name = "cloak, quartermaster" path = /obj/item/clothing/accessory/poncho/roles/cloak/qm allowed_roles = list("Quartermaster") -/datum/gear/suit/roles/poncho/cloak/captain +/datum/gear/suit/roles/poncho/cloak_captain display_name = "cloak, site manager" path = /obj/item/clothing/accessory/poncho/roles/cloak/captain allowed_roles = list("Site Manager") -/datum/gear/suit/roles/poncho/cloak/hop +/datum/gear/suit/roles/poncho/cloak_hop display_name = "cloak, head of personnel" path = /obj/item/clothing/accessory/poncho/roles/cloak/hop allowed_roles = list("Head of Personnel") -/datum/gear/suit/roles/poncho/cloak/cargo - display_name = "cloak, cargo" - path = /obj/item/clothing/accessory/poncho/roles/cloak/cargo - -/datum/gear/suit/roles/poncho/cloak/mining - display_name = "cloak, mining" - path = /obj/item/clothing/accessory/poncho/roles/cloak/mining - -/datum/gear/suit/roles/poncho/cloak/security - display_name = "cloak, security" - path = /obj/item/clothing/accessory/poncho/roles/cloak/security - allowed_roles = list("Head of Security","Detective","Warden","Security Officer","Blueshield Guard","Security Pilot") //YW ADDITIONS - -/datum/gear/suit/roles/poncho/cloak/service - display_name = "cloak, service" - path = /obj/item/clothing/accessory/poncho/roles/cloak/service - -/datum/gear/suit/roles/poncho/cloak/engineer - display_name = "cloak, engineer" - path = /obj/item/clothing/accessory/poncho/roles/cloak/engineer - -/datum/gear/suit/roles/poncho/cloak/atmos - display_name = "cloak, atmos" - path = /obj/item/clothing/accessory/poncho/roles/cloak/atmos - -/datum/gear/suit/roles/poncho/cloak/research - display_name = "cloak, science" - path = /obj/item/clothing/accessory/poncho/roles/cloak/research - -/datum/gear/suit/roles/poncho/cloak/medical - display_name = "cloak, medical" - path = /obj/item/clothing/accessory/poncho/roles/cloak/medical - -/datum/gear/suit/roles/poncho/cloak/custom //A colorable cloak - display_name = "cloak (colorable)" +/datum/gear/suit/roles/poncho/cloak_custom //A colorable cloak + display_name = "cloak, colorable" path = /obj/item/clothing/accessory/poncho/roles/cloak/custom /datum/gear/suit/roles/poncho/cloak/custom/New() @@ -304,44 +286,51 @@ path = /obj/item/clothing/suit/unathi/robe cost = 1 -/datum/gear/suit/black_lawyer_jacket - display_name = "suit jacket, black" +/datum/gear/suit/lawyer_jackets + display_name = "suit jacket selection" path = /obj/item/clothing/suit/storage/toggle/internalaffairs -/datum/gear/suit/blue_lawyer_jacket - display_name = "suit jacket, blue" - path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket - -/datum/gear/suit/purple_lawyer_jacket - display_name = "suit jacket, purple" - path = /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket +/datum/gear/suit/lawyer_jackets/New() + ..() + var/list/jackets = list( + "Black suit jacket" = /obj/item/clothing/suit/storage/toggle/internalaffairs, + "Blue suit jacket" = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket, + "Purple suit jacket" = /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket + ) + gear_tweaks += new/datum/gear_tweak/path(jackets) /datum/gear/suit/suspenders display_name = "suspenders" path = /obj/item/clothing/suit/suspenders /datum/gear/suit/forensics - display_name = "forensics long, red" + display_name = "forensics uniform selection (Detective)" path = /obj/item/clothing/suit/storage/forensics/red/long allowed_roles = list("Detective") -/datum/gear/suit/forensics/blue - display_name = "forensics long, blue" - path = /obj/item/clothing/suit/storage/forensics/blue/long - allowed_roles = list("Detective") +/datum/gear/suit/forensics/New() + ..() + var/list/uniforms = list( + "Red, long uniform" = /obj/item/clothing/suit/storage/forensics/red/long, + "Blue, long uniform" = /obj/item/clothing/suit/storage/forensics/blue/long, + "Red, short uniform" = /obj/item/clothing/suit/storage/forensics/red, + "Blue, short uniform" = /obj/item/clothing/suit/storage/forensics/blue + ) + gear_tweaks += new/datum/gear_tweak/path(uniforms) -/datum/gear/suit/forensics/blue/short - display_name = "forensics, blue" - path = /obj/item/clothing/suit/storage/forensics/blue - allowed_roles = list("Detective") +/datum/gear/suit/qm_coat + display_name = "coat, quartermaster" + path = /obj/item/clothing/suit/storage/qm + allowed_roles = list("Quartermaster") -/datum/gear/suit/forensics/red/short - display_name = "forensics, red" - path = /obj/item/clothing/suit/storage/forensics/red - allowed_roles = list("Detective") +/datum/gear/suit/cargo_coat + display_name = "coat, cargo tech" + path = /obj/item/clothing/suit/storage/cargo + allowed_roles = list("Quartermaster","Shaft Miner","Cargo Technician","Head of Personnel") + +/obj/item/clothing/suit/storage/cargo // winter coats go here - /datum/gear/suit/wintercoat display_name = "winter coat" path = /obj/item/clothing/suit/storage/hooded/wintercoat @@ -406,7 +395,6 @@ path = /obj/item/clothing/suit/storage/hooded/wintercoat/science allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist", "Xenobotanist") - /datum/gear/suit/wintercoat/science/robotics display_name = "winter coat, robotics" path = /obj/item/clothing/suit/storage/hooded/wintercoat/science/robotics @@ -477,7 +465,6 @@ /datum/gear/suit/wintercoat/cosmic display_name = "winter coat, cosmic" path = /obj/item/clothing/suit/storage/hooded/wintercoat/cosmic - // winter coats end here /datum/gear/suit/varsity @@ -505,20 +492,18 @@ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(tracks)) /datum/gear/suit/flannel - display_name = "grey flannel" + display_name = "flannel jacket selection" path = /obj/item/clothing/suit/storage/flannel -/datum/gear/suit/flannel/red - display_name = "red flannel" - path = /obj/item/clothing/suit/storage/flannel/red - -/datum/gear/suit/flannel/aqua - display_name = "aqua flannel" - path = /obj/item/clothing/suit/storage/flannel/aqua - -/datum/gear/suit/flannel/brown - display_name = "brown flannel" - path = /obj/item/clothing/suit/storage/flannel/brown +/datum/gear/suit/flannel/New() + ..() + var/list/flannel = list( + "Grey flannel" = /obj/item/clothing/suit/storage/flannel, + "Red flannel" = /obj/item/clothing/suit/storage/flannel/red, + "Aqua flannel" = /obj/item/clothing/suit/storage/flannel/aqua, + "Brown flannel" = /obj/item/clothing/suit/storage/flannel/brown + ) + gear_tweaks += new/datum/gear_tweak/path(flannel) /datum/gear/suit/denim_jacket display_name = "denim jacket" @@ -544,25 +529,20 @@ ..() gear_tweaks += gear_tweak_free_color_choice -/datum/gear/suit/miscellaneous/sec_dep_jacket - display_name = "department jacket, security" +/datum/gear/suit/miscellaneous/dep_jacket + display_name = "department jacket selection" path = /obj/item/clothing/suit/storage/toggle/sec_dep_jacket -/datum/gear/suit/miscellaneous/engi_dep_jacket - display_name = "department jacket, engineering" - path = /obj/item/clothing/suit/storage/toggle/engi_dep_jacket - -/datum/gear/suit/miscellaneous/supply_dep_jacket - display_name = "department jacket, supply" - path = /obj/item/clothing/suit/storage/toggle/supply_dep_jacket - -/datum/gear/suit/miscellaneous/sci_dep_jacket - display_name = "department jacket, science" - path = /obj/item/clothing/suit/storage/toggle/sci_dep_jacket - -/datum/gear/suit/miscellaneous/med_dep_jacket - display_name = "department jacket, medical" - path = /obj/item/clothing/suit/storage/toggle/med_dep_jacket +/datum/gear/suit/miscellaneous/dep_jacket/New() + ..() + var/list/jacket = list( + "Security department jacket" = /obj/item/clothing/suit/storage/toggle/sec_dep_jacket, + "Engineering department jacket" = /obj/item/clothing/suit/storage/toggle/engi_dep_jacket, + "Cargo department jacket" = /obj/item/clothing/suit/storage/toggle/supply_dep_jacket, + "Science department jacket" = /obj/item/clothing/suit/storage/toggle/sci_dep_jacket, + "Medical department jacket" = /obj/item/clothing/suit/storage/toggle/med_dep_jacket + ) + gear_tweaks += new/datum/gear_tweak/path(jacket) /datum/gear/suit/miscellaneous/peacoat display_name = "peacoat" @@ -616,4 +596,4 @@ /datum/gear/suit/miscellaneous/cardigan/New() ..() - gear_tweaks += gear_tweak_free_color_choice \ No newline at end of file + gear_tweaks += gear_tweak_free_color_choice diff --git a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm index 2de9713198..f33118bce0 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm @@ -31,16 +31,20 @@ path = /obj/item/clothing/suit/poncho //Detective alternative -/datum/gear/uniform/detective_alt - display_name = "sleek modern coat, detective" +/datum/gear/suit/detective_alt + display_name = "sleek modern coat selection, detective" path = /obj/item/clothing/suit/storage/det_trench/alt allowed_roles = list("Head of Security", "Detective") -//Detective alternative -/datum/gear/uniform/detective_alt2 - display_name = "sleek modern coat (long), detective" - path = /obj/item/clothing/suit/storage/det_trench/alt2 - allowed_roles = list("Head of Security", "Detective") +/datum/gear/suit/detective_alt/New() + ..() + var/list/coats = list( + "Modern coat (tan)" = /obj/item/clothing/suit/storage/det_trench/alt, + "Modern coat (long, tan)" = /obj/item/clothing/suit/storage/det_trench/alt2, + "Modern coat (black)" = /obj/item/clothing/suit/storage/det_trench/alt/black, + "Modern coat (long, black)" = /obj/item/clothing/suit/storage/det_trench/alt2/black + ) + gear_tweaks += new/datum/gear_tweak/path(coats) //Emergency Responder jackets for Parameds & EMTs, but also general Medical Staff /datum/gear/suit/roles/medical/ems_jacket diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm index df63678531..7c6e9ca629 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm @@ -235,4 +235,18 @@ Talon jumpsuit /datum/gear/uniform/talonbasic display_name = "ITV Jumpsuit" description = "A jumpsuit that is usually issued to ITV contractors, however others can purchase it to show their support towards ITV." - path = /obj/item/clothing/under/rank/talon/basic \ No newline at end of file + path = /obj/item/clothing/under/rank/talon/basic + +// Summer dresses +/datum/gear/uniform/summerdress + display_name = "summer dress selection" + path = /obj/item/clothing/under/summerdress + +/datum/gear/uniform/summerdress/New() + ..() + var/list/dresses = list( + "black and white" = /obj/item/clothing/under/summerdress, + "blue and white" = /obj/item/clothing/under/summerdress/blue, + "red and white" = /obj/item/clothing/under/summerdress/red + ) + gear_tweaks += new/datum/gear_tweak/path(dresses) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index e64770f9ef..13816406cf 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -542,7 +542,7 @@ // Generate and cache the on-mob icon, which is used in update_inv_head(). var/body_type = (H && H.species.get_bodytype(H)) - var/cache_key = "[light_overlay][body_type && sprite_sheets[body_type] ? "_[body_type]" : ""]" + var/cache_key = "[light_overlay][body_type && sprite_sheets[body_type] ? body_type : ""]" if(!light_overlay_cache[cache_key]) var/use_icon = LAZYACCESS(sprite_sheets,body_type) || 'icons/mob/light_overlays.dmi' light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]") @@ -736,7 +736,7 @@ var/fire_resist = T0C+100 body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS allowed = list(/obj/item/weapon/tank/emergency/oxygen) - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) slot_flags = SLOT_OCLOTHING var/blood_overlay_type = "suit" blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood. diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index fe2176215a..0762fedeae 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -41,6 +41,7 @@ // Icons. var/suit_overlay + var/suit_overlay_icon = 'icons/mob/rig_modules.dmi' var/suit_overlay_active // If set, drawn over icon and mob when effect is active. var/suit_overlay_inactive // As above, inactive. var/suit_overlay_used // As above, when engaged. diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 43bcd583d2..4550eab088 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -8,7 +8,6 @@ * /obj/item/rig_module/device/arch_drill * /obj/item/rig_module/device/anomaly_scanner * /obj/item/rig_module/maneuvering_jets - * /obj/item/rig_module/foam_sprayer * /obj/item/rig_module/device/broadcaster * /obj/item/rig_module/chem_dispenser * /obj/item/rig_module/chem_dispenser/injector @@ -411,11 +410,7 @@ jets.holder = null jets.ion_trail.set_up(jets) -/obj/item/rig_module/foam_sprayer - - //Deployable Mop - /obj/item/rig_module/mounted/mop name = "mop projector" diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index aba67b11c7..5cfe6a9290 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -7,7 +7,6 @@ */ /obj/item/weapon/rig - name = "hardsuit control module" icon = 'icons/obj/rig_modules.dmi' desc = "A back-mounted hardsuit deployment and control mechanism." @@ -27,6 +26,8 @@ unacidable = 1 preserve_item = 1 + var/default_mob_icon = 'icons/mob/rig_back.dmi' + var/suit_state //The string used for the suit's icon_state. var/interface_path = "RIGSuit" @@ -98,22 +99,8 @@ var/datum/effect/effect/system/spark_spread/spark_system var/datum/mini_hud/rig/minihud -/obj/item/weapon/rig/examine() - . = ..() - if(wearer) - for(var/obj/item/piece in list(helmet,gloves,chest,boots)) - if(!piece || piece.loc != wearer) - continue - . += "[bicon(piece)] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed." - - if(src.loc == usr) - . += "The access panel is [locked? "locked" : "unlocked"]." - . += "The maintenance panel is [open ? "open" : "closed"]." - . += "Hardsuit systems are [offline ? "offline" : "online"]." - . += "The cooling stystem is [cooling_on ? "active" : "inactive"]." - - if(open) - . += "It's equipped with [english_list(installed_modules)]." + // Action button + action_button_name = "Hardsuit Interface" /obj/item/weapon/rig/New() ..() @@ -186,6 +173,23 @@ spark_system = null return ..() +/obj/item/weapon/rig/examine() + . = ..() + if(wearer) + for(var/obj/item/piece in list(helmet,gloves,chest,boots)) + if(!piece || piece.loc != wearer) + continue + . += "[bicon(piece)] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed." + + if(src.loc == usr) + . += "The access panel is [locked? "locked" : "unlocked"]." + . += "The maintenance panel is [open ? "open" : "closed"]." + . += "Hardsuit systems are [offline ? "offline" : "online"]." + . += "The cooling stystem is [cooling_on ? "active" : "inactive"]." + + if(open) + . += "It's equipped with [english_list(installed_modules)]." + // We only care about processing when we're on a mob /obj/item/weapon/rig/Moved(old_loc, direction, forced) if(ismob(loc)) @@ -589,7 +593,7 @@ cut_overlays() if(!mob_icon || update_mob_icon) - var/species_icon = 'icons/mob/rig_back.dmi' + var/species_icon = default_mob_icon // Since setting mob_icon will override the species checks in // update_inv_wear_suit(), handle species checks here. if(wearer && sprite_sheets && sprite_sheets[wearer.species.get_bodytype(wearer)]) @@ -599,7 +603,7 @@ if(installed_modules.len) for(var/obj/item/rig_module/module in installed_modules) if(module.suit_overlay) - chest.add_overlay(image('icons/mob/rig_modules.dmi', icon_state = "[module.suit_overlay]", dir = SOUTH)) + chest.add_overlay(image(module.suit_overlay_icon, icon_state = "[module.suit_overlay]", dir = SOUTH)) if(wearer) wearer.update_inv_shoes() diff --git a/code/modules/clothing/spacesuits/rig/rig_verbs.dm b/code/modules/clothing/spacesuits/rig/rig_verbs.dm index c1d2fe2c5b..b28d93bc55 100644 --- a/code/modules/clothing/spacesuits/rig/rig_verbs.dm +++ b/code/modules/clothing/spacesuits/rig/rig_verbs.dm @@ -9,6 +9,11 @@ if(wearer && (wearer.back == src || wearer.belt == src)) tgui_interact(usr) +// So the UI button clicks come here +/obj/item/weapon/rig/ui_action_click() + if(usr == wearer && (wearer.back == src || wearer.belt == src)) + tgui_interact(usr) + /obj/item/weapon/rig/verb/toggle_vision() set name = "Toggle Visor" diff --git a/code/modules/clothing/spacesuits/rig/suits/station_vr.dm b/code/modules/clothing/spacesuits/rig/suits/station_vr.dm index f543b95431..e0d14f189a 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station_vr.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station_vr.dm @@ -53,3 +53,128 @@ /obj/item/weapon/rig/robotics allowed = list(/obj/item/device/flashlight, /obj/item/weapon/storage/box, /obj/item/weapon/storage/belt, /obj/item/device/defib_kit/compact) + +// 'Technomancer' hardsuit +/obj/item/weapon/rig/focalpoint + name = "\improper F.P.E. hardsuit control module" + desc = "A high-end hardsuit produced by Focal Point Energistics, focused around repair and construction." + + icon = 'icons/obj/rig_modules_vr.dmi' // the item + default_mob_icon = 'icons/mob/rig_back_vr.dmi' // the onmob + icon_state = "techno_rig" + suit_type = "\improper F.P.E. hardsuit" + cell_type = /obj/item/weapon/cell/hyper + + // Copied from CE rig + slowdown = 0 + offline_slowdown = 0 + offline_vision_restriction = 0 + rigsuit_max_pressure = 20 * ONE_ATMOSPHERE // Max pressure the rig protects against when sealed + rigsuit_min_pressure = 0 // Min pressure the rig protects against when sealed + min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE + max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE // so it's like a rig firesuit + armor = list("melee" = 40, "bullet" = 10, "laser" = 30, "energy" = 55, "bomb" = 70, "bio" = 100, "rad" = 100) + + chest_type = /obj/item/clothing/suit/space/rig/focalpoint + helm_type = /obj/item/clothing/head/helmet/space/rig/focalpoint + boot_type = /obj/item/clothing/shoes/magboots/rig/focalpoint + glove_type = /obj/item/clothing/gloves/gauntlets/rig/focalpoint + +/obj/item/weapon/rig/focalpoint/equipped + initial_modules = list( + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/teleporter, // Try not to set yourself on fire + /obj/item/rig_module/device/rcd, + /obj/item/rig_module/grenade_launcher/metalfoam + ) + +/obj/item/clothing/head/helmet/space/rig/focalpoint + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "techno_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/suit/space/rig/focalpoint + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "techno_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/shoes/magboots/rig/focalpoint + icon = 'icons/inventory/feet/item_vr.dmi' + default_worn_icon = 'icons/inventory/feet/mob_vr.dmi' + icon_state = "techno_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/gloves/gauntlets/rig/focalpoint + icon = 'icons/inventory/hands/item_vr.dmi' + default_worn_icon = 'icons/inventory/hands/mob_vr.dmi' + icon_state = "techno_rig" + siemens_coefficient = 0 + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +// 'Ironhammer' hardsuit +/obj/item/weapon/rig/hephaestus + name = "\improper Hephaestus hardsuit control module" + desc = "A high-end hardsuit produced by Hephaestus Industries, focused on destroying the competition. Literally." + + icon = 'icons/obj/rig_modules_vr.dmi' // the item + default_mob_icon = 'icons/mob/rig_back_vr.dmi' // the onmob + icon_state = "ihs_rig" + suit_type = "\improper Hephaestus hardsuit" + cell_type = /obj/item/weapon/cell/super + + armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 50, "bomb" = 60, "bio" = 100, "rad" = 20) + + chest_type = /obj/item/clothing/suit/space/rig/hephaestus + helm_type = /obj/item/clothing/head/helmet/space/rig/hephaestus + boot_type = /obj/item/clothing/shoes/magboots/rig/hephaestus + glove_type = /obj/item/clothing/gloves/gauntlets/rig/hephaestus + +/obj/item/weapon/rig/hephaestus/equipped + initial_modules = list( + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/grenade_launcher, + /obj/item/rig_module/mounted/egun, + /obj/item/rig_module/mounted/energy_blade + ) + +/obj/item/clothing/head/helmet/space/rig/hephaestus + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "ihs_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/suit/space/rig/hephaestus + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "ihs_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/shoes/magboots/rig/hephaestus + icon = 'icons/inventory/feet/item_vr.dmi' + default_worn_icon = 'icons/inventory/feet/mob_vr.dmi' + icon_state = "ihs_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/gloves/gauntlets/rig/hephaestus + icon = 'icons/inventory/hands/item_vr.dmi' + default_worn_icon = 'icons/inventory/hands/mob_vr.dmi' + icon_state = "ihs_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() diff --git a/code/modules/clothing/spacesuits/void/event_vr.dm b/code/modules/clothing/spacesuits/void/event_vr.dm index 357a8ff772..6d947ce245 100644 --- a/code/modules/clothing/spacesuits/void/event_vr.dm +++ b/code/modules/clothing/spacesuits/void/event_vr.dm @@ -73,4 +73,161 @@ /obj/item/clothing/suit/space/void/refurb/mercenary/talon name = "talon mercenary's voidsuit" - desc = "A refurbished early contact era voidsuit of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. Many old-timer mercs swear by these old things, even if new powered hardsuits have more features and better armor. The red markings indicate this as the mercenary variant. \"ITV TALON\" has been stamped onto each pauldron and the right side of the breastplate." \ No newline at end of file + desc = "A refurbished early contact era voidsuit of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. Many old-timer mercs swear by these old things, even if new powered hardsuits have more features and better armor. The red markings indicate this as the mercenary variant. \"ITV TALON\" has been stamped onto each pauldron and the right side of the breastplate." + +// HEV Suits +/obj/item/clothing/suit/space/void/hev + name = "hazardous environment suit" + desc = "Has a strange smell to it, but you feel like it might be an old friend." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "hev_orange" + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/suit/space/void/hev/violet + icon_state = "hev_violet" + desc = "Has a strange smell to it, but you feel like it might be an old friend. This one has 'Dr. Coomer' engraved on the collar." + +/obj/item/clothing/head/helmet/space/void/hev + name = "hazardous environment helmet" + desc = "Has a strange smell to it, but you feel like it might be an old friend." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "hev_orange" + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/head/helmet/space/void/hev/violet + icon_state = "hev_violet" + desc = "Has a strange smell to it, but you feel like it might be an old friend. This one has 'Dr. Coomer' engraved on the collar." + +// Makeshift void suit +/obj/item/clothing/suit/space/void/makeshift + name = "makeshift voidsuit" + desc = "This is not something you should use if you have other options, but it's better than nothing!" + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "makeshift_void" + + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/head/helmet/space/void/makeshift + name = "makeshift voidsuit helmet" + desc = "This is not something you should use if you have other options, but it's better than nothing!" + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "makeshift_void" + + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +// 'Custodian' armor +/obj/item/clothing/suit/space/void/custodian + name = "custodian suit" + desc = "Vacuum-capable armor for a Custodian to do their duty." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "custodian" + + armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 50, "bomb" = 40, "bio" = 0, "rad" = 20) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/head/helmet/space/void/custodian + name = "custodian helmet" + desc = "Vacuum-capable helmet for a Custodian to do their duty." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "custodian" + + armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 50, "bomb" = 40, "bio" = 0, "rad" = 20) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +// 'Moebius' armor +/obj/item/clothing/suit/space/void/aether + name = "\improper Aether voidsuit" + desc = "This suit seems rather high-end for a standard voidsuit. The air in it has a hint of 'new car smell', courtesy of Aether Atmospherics." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "moebiussuit" + + armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 20, "bomb" = 20, "bio" = 100, "rad" = 20) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/head/helmet/space/void/aether + name = "\improper Aether voidsuit helmet" + desc = "Aether Atmospherics thought that giving this helmet selectable colored lighting would improve market penetration. Very comfortable, regardless." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "moebiushelm_White" + + armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 20, "bomb" = 20, "bio" = 100, "rad" = 20) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/head/helmet/space/void/aether/verb/select_color() + set name = "Helmet Color" + set desc = "Change the color of [src]" + set category = "Object" + + var/choice = tgui_input_list(usr, "Select a new color:", "[src] Color", list("White", "Blue", "Purple", "Yellow", "Red", "Green")) + if(!choice) + return + icon_state = "moebiushelm_[choice]" + update_clothing_icon() + to_chat(usr, "[src] color changed to: [choice]") + +// Excelsior suit +/obj/item/clothing/suit/space/void/excelsior + name = "\improper Excelsior voidsuit" + desc = "A space suit from a particular spaceship: Excelsior." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "excelsior" + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/head/helmet/space/void/excelsior + name = "\improper Excelsior voidsuit helmet" + desc = "A space helmet from a particular spaceship: Excelsior." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "excelsior" + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() diff --git a/code/modules/clothing/suits/armor_vr.dm b/code/modules/clothing/suits/armor_vr.dm index 409a63f834..1f9ccf2402 100644 --- a/code/modules/clothing/suits/armor_vr.dm +++ b/code/modules/clothing/suits/armor_vr.dm @@ -118,3 +118,24 @@ /obj/item/clothing/suit/armor/pcarrier/explorer/deluxe name = "modular explorer suit" desc = "A modification of the explorer suit with a modular armor system. Requires you to insert armor plates." + +// 'Crusader' armor +/obj/item/clothing/suit/armor/crusader + name = "crusader armor" + desc = "God will protect those who defend his faith." + + armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 25, "bomb" = 30, "bio" = 0, "rad" = 0) + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "crusader_suit" + +/obj/item/clothing/head/helmet/crusader + name = "crusader helmet" + desc = "God will protect those who defend his faith." + + armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 25, "bomb" = 30, "bio" = 0, "rad" = 0) + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "crusader_head" diff --git a/code/modules/clothing/suits/jobs_vr.dm b/code/modules/clothing/suits/jobs_vr.dm new file mode 100644 index 0000000000..9b34c18637 --- /dev/null +++ b/code/modules/clothing/suits/jobs_vr.dm @@ -0,0 +1,18 @@ +// Cargotech jacket +/obj/item/clothing/suit/storage/cargo + name = "cargo jacket" + desc = "A jacket typically assigned to cargo technicians when it's chilly in cargonia." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "cargo_jacket" + +// QM Coat +/obj/item/clothing/suit/storage/qm + name = "\improper QM coat" + desc = "A coat typically assigned to quartermasters when it's chilly in cargonia." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "qm_coat" + \ No newline at end of file diff --git a/code/modules/clothing/suits/labcoat_vr.dm b/code/modules/clothing/suits/labcoat_vr.dm new file mode 100644 index 0000000000..4f82afd2e3 --- /dev/null +++ b/code/modules/clothing/suits/labcoat_vr.dm @@ -0,0 +1,27 @@ +// 'Modern' labcoats +/obj/item/clothing/suit/storage/toggle/labcoat/modern + name = "modern labcoat" + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "labcoat_mod" + +/obj/item/clothing/suit/storage/toggle/labcoat/modern/cmo + name = "modern cmo's labcoat" + desc = "A suit that protects against minor chemical spills. This one has distinct markings on the arms." + icon_state = "labcoat_cmo_mod" + +// 'Modern' biosuits +/obj/item/clothing/suit/bio_suit/modern + name = "modern bio suit" + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "bio_mod" + +/obj/item/clothing/head/bio_hood/modern + name = "modern bio hood" + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "bio_mod" diff --git a/code/modules/clothing/suits/miscellaneous_vr.dm b/code/modules/clothing/suits/miscellaneous_vr.dm index 34d5d71ac9..8febb11143 100644 --- a/code/modules/clothing/suits/miscellaneous_vr.dm +++ b/code/modules/clothing/suits/miscellaneous_vr.dm @@ -88,18 +88,24 @@ /obj/item/clothing/suit/storage/det_trench/alt name = "sleek modern coat" desc = "A sleek overcoat made of neo-laminated fabric. Has a reasonably sized pocket on the inside." + icon = 'icons/inventory/suit/item_vr.dmi' - icon_override = 'icons/inventory/suit/mob_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' icon_state = "cyberpunksleek" - item_state = "cyberpunksleek" /obj/item/clothing/suit/storage/det_trench/alt2 name = "sleek modern coat (long)" desc = "A sleek long overcoat made of neo-laminated fabric. Has a reasonably sized pocket on the inside." + icon = 'icons/inventory/suit/item_vr.dmi' - icon_override = 'icons/inventory/suit/mob_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' icon_state = "cyberpunksleek_long" - item_state = "cyberpunksleek_long" + +/obj/item/clothing/suit/storage/det_trench/alt/black + icon_state = "cyberpunksleek_black" + +/obj/item/clothing/suit/storage/det_trench/alt2/black + icon_state = "cyberpunksleek_long_black" //Talon Hoodie /obj/item/clothing/suit/storage/toggle/hoodie/talon @@ -108,4 +114,24 @@ icon = 'icons/inventory/suit/item_vr.dmi' icon_override = 'icons/inventory/suit/mob_vr.dmi' icon_state = "talonhoodie" - item_state_slots = list(slot_r_hand_str = "suit_blue", slot_l_hand_str = "suit_blue") \ No newline at end of file + item_state_slots = list(slot_r_hand_str = "suit_blue", slot_l_hand_str = "suit_blue") + +// Bladerunner coat +/obj/item/clothing/suit/storage/bladerunner + name = "leather coat" + desc = "An old leather coat. Has probably seen things you wouldn't believe." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "bladerunner_coat" + +// Cyberpunk 'orange' vest +/obj/item/clothing/suit/cyberpunk + name = "cyberpunk vest" + desc = "A red vest with golden streaks. It's made out of tough materials, and can protect fairly well against bullets. Wake the fuck up, Samurai." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "cyberpunk" + armor = list("melee" = 10, "bullet" = 20, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) + diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index 744c2a55c2..87346c6741 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -122,6 +122,15 @@ rolled_sleeves = -1 /obj/item/clothing/under/rank/medical/paramedic + name = "paramedic uniform" + desc = "It's made of a special fiber that provides minor protection against biohazards. This one is the color scheme that designates a rapid first responder." + icon_state = "paramedic" + item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white") + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS + rolled_down = -1 + rolled_sleeves = -1 + +/obj/item/clothing/under/rank/medical/paramedic_alt name = "short sleeve medical jumpsuit" desc = "It's made of a special fiber that provides minor protection against biohazards. This one has a cross on the chest denoting that the wearer is trained medical personnel." icon_state = "medical_short" diff --git a/code/modules/clothing/under/miscellaneous_vr.dm b/code/modules/clothing/under/miscellaneous_vr.dm index 112f45f3ba..ef3c67103a 100644 --- a/code/modules/clothing/under/miscellaneous_vr.dm +++ b/code/modules/clothing/under/miscellaneous_vr.dm @@ -196,4 +196,32 @@ icon_override = 'icons/inventory/uniform/mob_vr.dmi' icon_state = "talon_captain" item_state = "talon_captain" - rolled_sleeves = 0 \ No newline at end of file + rolled_sleeves = 0 + +// Excelsior uniforms +/obj/item/clothing/under/excelsior + name = "\improper Excelsior uniform" + desc = "A uniform from a particular spaceship: Excelsior." + + icon = 'icons/inventory/uniform/item_vr.dmi' + default_worn_icon = 'icons/inventory/uniform/mob_vr.dmi' + icon_state = "excelsior_white" + +/obj/item/clothing/under/excelsior/mixed + icon_state = "excelsior_mixed" +/obj/item/clothing/under/excelsior/orange + icon_state = "excelsior_orange" + +// Summer dresses +/obj/item/clothing/under/summerdress + name = "summer dress" + desc = "A nice summer dress." + + icon = 'icons/inventory/uniform/item_vr.dmi' + default_worn_icon = 'icons/inventory/uniform/mob_vr.dmi' + icon_state = "summerdress" + +/obj/item/clothing/under/summerdress/red + icon_state = "summerdress3" +/obj/item/clothing/under/summerdress/blue + icon_state = "summerdress2" diff --git a/code/modules/economy/vending_machines.dm b/code/modules/economy/vending_machines.dm index 7d4d9270ea..dfd693afd2 100644 --- a/code/modules/economy/vending_machines.dm +++ b/code/modules/economy/vending_machines.dm @@ -1156,6 +1156,7 @@ /obj/item/clothing/head/surgery/black = 5, /obj/item/clothing/shoes/white = 5, /obj/item/clothing/suit/storage/toggle/labcoat = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/modern = 5, /obj/item/clothing/mask/surgical = 5, /obj/item/clothing/suit/storage/hooded/wintercoat/medical = 5, /obj/item/clothing/shoes/boots/winter/medical = 5 @@ -1227,6 +1228,7 @@ /obj/item/clothing/under/rank/scientist/skirt = 5, /obj/item/clothing/under/rank/scientist/turtleneck = 5, /obj/item/clothing/suit/storage/toggle/labcoat = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/modern = 5, /obj/item/clothing/shoes/white = 5, /obj/item/clothing/shoes/slippers = 5, /obj/item/clothing/suit/storage/hooded/wintercoat/science = 5, @@ -1348,6 +1350,7 @@ /obj/item/clothing/under/rank/cargotech/jeans = 5, /obj/item/clothing/under/rank/cargotech/jeans/female = 5, /obj/item/clothing/suit/storage/hooded/wintercoat/cargo = 5, + /obj/item/clothing/suit/storage/cargo = 5, /obj/item/clothing/shoes/boots/winter/supply = 5, /obj/item/clothing/shoes/black = 5, /obj/item/clothing/gloves/black = 5, diff --git a/code/modules/mob/dead/observer/observer_vr.dm b/code/modules/mob/dead/observer/observer_vr.dm index df68f41851..1fb9d913c9 100644 --- a/code/modules/mob/dead/observer/observer_vr.dm +++ b/code/modules/mob/dead/observer/observer_vr.dm @@ -73,7 +73,7 @@ else if((world.time - record.last_notification) < 5 MINUTES) to_chat(src, "Too little time has passed since your last notification.") else - db.notify(record.mindname) + db.notify(record) record.last_notification = world.time to_chat(src, "New notification has been sent.") else diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm index 3c6451fc99..29b8155366 100644 --- a/code/modules/mob/living/carbon/human/human_species.dm +++ b/code/modules/mob/living/carbon/human/human_species.dm @@ -22,6 +22,17 @@ . = ..() delete_inventory() +/mob/living/carbon/human/dummy/mannequin/autoequip + icon = 'icons/effects/species.dmi' + icon_state = "lizard_f_s_full" + +/mob/living/carbon/human/dummy/mannequin/autoequip/Initialize() + icon = null + icon_state = "" + . = ..() + for(var/obj/item/I in loc) + equip_to_appropriate_slot(I) + /mob/living/carbon/human/skrell/Initialize(var/new_loc) h_style = "Skrell Short Tentacles" return ..(new_loc, SPECIES_SKRELL) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index e4303081e3..8d2ca00ef5 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -129,6 +129,11 @@ message_data[2] = pick(M.say_verbs) . = 1 + if(CE_SPEEDBOOST in chem_effects || is_jittery) // motor mouth + for(var/datum/multilingual_say_piece/S in message_data[1]) + S.message = replacetext(S.message," ","") + S.message = replacetext(S.message,",","") + S.message = replacetext(S.message,";","") else . = ..(message_data) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index fba31251c7..d63681898d 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -110,7 +110,7 @@ var/alcohol_mod = 1 // Multiplier to alcohol strength; 0.5 = half, 0 = no effect at all, 2 = double, etc. var/pain_mod = 1 // Multiplier to pain effects; 0.5 = half, 0 = no effect (equal to NO_PAIN, really), 2 = double, etc. var/spice_mod = 1 // Multiplier to spice/capsaicin/frostoil effects; 0.5 = half, 0 = no effect (immunity), 2 = double, etc. - var/trauma_mod = 1 // Affects traumatic shock (how fast pain crit happens). 0 = no effect (immunity to pain crit), 2 = double etc.Overriden by "can_feel_pain" var + var/trauma_mod = 1 // Affects traumatic shock (how fast pain crit happens). 0 = no effect (immunity to pain crit), 2 = double etc.Overriden by "can_feel_pain" var // set below is EMP interactivity for nonsynth carbons var/emp_sensitivity = 0 // bitflag. valid flags are: EMP_PAIN, EMP_BLIND, EMP_DEAFEN, EMP_CONFUSE, EMP_STUN, and EMP_(BRUTE/BURN/TOX/OXY)_DMG var/emp_dmg_mod = 1 // Multiplier to all EMP damage sustained by the mob, if it's EMP-sensitive @@ -431,6 +431,8 @@ H.visible_message( \ "[H] boops [target]'s nose.", \ "You boop [target] on the nose.", ) + else if(H.zone_sel.selecting == BP_GROIN) //CHOMPEdit + H.vore_bellyrub(target) //VOREStation Edit End else H.visible_message("[H] hugs [target] to make [t_him] feel better!", \ diff --git a/code/modules/mob/living/carbon/human/species/station/alraune.dm b/code/modules/mob/living/carbon/human/species/station/alraune.dm index 77092eeccb..e7151b9608 100644 --- a/code/modules/mob/living/carbon/human/species/station/alraune.dm +++ b/code/modules/mob/living/carbon/human/species/station/alraune.dm @@ -49,8 +49,8 @@ flags = NO_SCAN | IS_PLANT | NO_MINOR_CUT appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR - inherent_verbs = list( - /mob/living/carbon/human/proc/alraune_fruit_select) //Give them the voremodes related to wrapping people in vines and sapping their fluids + inherent_verbs = list(/mob/living/carbon/human/proc/alraune_fruit_select, //Give them the voremodes related to wrapping people in vines and sapping their fluids + /mob/living/carbon/human/proc/tie_hair) color_mult = 1 icobase = 'icons/mob/human_races/r_human_vr.dmi' diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm index ed84be3121..af626ee68b 100644 --- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm @@ -25,6 +25,7 @@ health_hud_intensity = 2 num_alternate_languages = 3 assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) genders = list(MALE, FEMALE, PLURAL, NEUTER) diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 568196fd7d..1bd96fae47 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -633,7 +633,9 @@ if(isturf(H.loc)) //else, there's considered to be no light var/turf/T = H.loc light_amount = T.get_lumcount() * 10 - H.adjust_nutrition(light_amount) + // Don't overfeed, just make them full without going over. + if((H.nutrition + light_amount) < initial(H.nutrition)) + H.adjust_nutrition(light_amount) H.shock_stage -= light_amount if(light_amount >= 3) //if there's enough light, heal diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm index 0bb05f1af9..290bb6766a 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm @@ -27,7 +27,8 @@ /mob/living/carbon/human/proc/sonar_ping, /mob/living/carbon/human/proc/tie_hair, /mob/living/proc/flying_toggle, - /mob/living/proc/start_wings_hovering) //Xenochimera get all the special verbs since they can't select traits. + /mob/living/proc/start_wings_hovering, + /mob/living/carbon/human/proc/tie_hair) //Xenochimera get all the special verbs since they can't select traits. virus_immune = 1 // They practically ARE one. min_age = 18 @@ -337,7 +338,8 @@ /mob/living/carbon/human/proc/toggle_silk_production, /mob/living/carbon/human/proc/weave_structure, /mob/living/carbon/human/proc/weave_item, - /mob/living/carbon/human/proc/set_silk_color) + /mob/living/carbon/human/proc/set_silk_color, + /mob/living/carbon/human/proc/tie_hair) min_age = 18 max_age = 80 diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm index 42b93294f4..6b51d9db8a 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm @@ -15,6 +15,7 @@ secondary_langs = list(LANGUAGE_SAGARU) name_language = LANGUAGE_SAGARU color_mult = 1 + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) min_age = 18 max_age = 110 @@ -84,7 +85,7 @@ name_language = LANGUAGE_SKRELLIAN color_mult = 1 assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) - + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) min_age = 18 max_age = 110 @@ -135,8 +136,9 @@ secondary_langs = list(LANGUAGE_BIRDSONG) name_language = LANGUAGE_BIRDSONG color_mult = 1 - inherent_verbs = list(/mob/living/proc/flying_toggle,/mob/living/proc/start_wings_hovering) - + inherent_verbs = list(/mob/living/proc/flying_toggle, + /mob/living/proc/start_wings_hovering, + /mob/living/carbon/human/proc/tie_hair) min_age = 18 max_age = 110 @@ -181,7 +183,9 @@ num_alternate_languages = 3 secondary_langs = list(LANGUAGE_TERMINUS) name_language = LANGUAGE_TERMINUS - inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds) + inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds, + /mob/living/proc/shred_limb, + /mob/living/carbon/human/proc/tie_hair) assisted_langs = list(LANGUAGE_EAL, LANGUAGE_SKRELLIAN, LANGUAGE_SKRELLIANFAR, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) //AEIOU edit: Zorren can speak Terminus unassisted. min_age = 18 @@ -218,7 +222,6 @@ "You feel uncomfortably warm.", "Your overheated skin itches." ) - inherent_verbs = list(/mob/living/proc/shred_limb) /datum/species/vulpkanin name = SPECIES_VULPKANIN @@ -237,7 +240,8 @@ // gluttonous = 1 num_alternate_languages = 3 color_mult = 1 - inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds) + inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds, + /mob/living/carbon/human/proc/tie_hair) male_scream_sound = null //CHOMPedit female_scream_sound = null //CHOMPedit @@ -274,6 +278,7 @@ tail_animation = 'icons/mob/species/unathi/tail_vr.dmi' color_mult = 1 min_age = 18 + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) gluttonous = 0 inherent_verbs = list(/mob/living/proc/shred_limb) genders = list(MALE, FEMALE, PLURAL, NEUTER) @@ -289,6 +294,7 @@ tail_animation = 'icons/mob/species/tajaran/tail_vr.dmi' color_mult = 1 min_age = 18 + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) allergens = null gluttonous = 0 //Moving this here so I don't have to fix this conflict every time polaris glances at station.dm inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds) @@ -305,6 +311,7 @@ deform = 'icons/mob/human_races/r_def_skrell_vr.dmi' color_mult = 1 min_age = 18 + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) reagent_tag = null allergens = null assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) @@ -316,6 +323,7 @@ /datum/species/zaddat spawn_flags = SPECIES_CAN_JOIN min_age = 18 + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //I don't even know if Zaddat can HAVE hair, but here we are, I suppose gluttonous = 0 genders = list(MALE, FEMALE, PLURAL, NEUTER) descriptors = list() @@ -365,8 +373,9 @@ /datum/species/vox gluttonous = 0 - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE //CHOMPStation Edit TFF 20/1/20 - restore whitelist requirement - min_age = 18 + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE //CHOMPStation Edit + min_age = 18 + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //Get ya quills done did icobase = 'icons/mob/human_races/r_vox_old.dmi' deform = 'icons/mob/human_races/r_def_vox_old.dmi' descriptors = list( @@ -389,7 +398,7 @@ name_language = null color_mult = 1 genders = list(MALE, FEMALE, PLURAL, NEUTER) - inherent_verbs = list(/mob/living/proc/flying_toggle,/mob/living/proc/start_wings_hovering) + inherent_verbs = list(/mob/living/proc/flying_toggle,/mob/living/proc/start_wings_hovering,/mob/living/carbon/human/proc/tie_hair) min_age = 18 max_age = 80 @@ -544,7 +553,7 @@ num_alternate_languages = 3 secondary_langs = list(LANGUAGE_TERMINUS) name_language = LANGUAGE_TERMINUS - inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds) + inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds,/mob/living/proc/shred_limb,/mob/living/carbon/human/proc/tie_hair) min_age = 18 max_age = 80 @@ -561,7 +570,6 @@ base_color = "#333333" blood_color = "#240bc4" color_mult = 1 - inherent_verbs = list(/mob/living/proc/shred_limb) heat_discomfort_strings = list( "Your fur prickles in the heat.", diff --git a/code/modules/mob/living/simple_mob/defense.dm b/code/modules/mob/living/simple_mob/defense.dm index b0d622cb20..09d6fc7335 100644 --- a/code/modules/mob/living/simple_mob/defense.dm +++ b/code/modules/mob/living/simple_mob/defense.dm @@ -16,6 +16,9 @@ switch(L.a_intent) if(I_HELP) if(health > 0) + if(L.zone_sel.selecting == BP_GROIN) //CHOMPEdit + if(L.vore_bellyrub(src)) + return L.visible_message("\The [L] [response_help] \the [src].") if(I_DISARM) diff --git a/code/modules/mob/living/simple_mob/on_click.dm b/code/modules/mob/living/simple_mob/on_click.dm index 4b824c9580..74b0236c13 100644 --- a/code/modules/mob/living/simple_mob/on_click.dm +++ b/code/modules/mob/living/simple_mob/on_click.dm @@ -14,6 +14,9 @@ switch(a_intent) if(I_HELP) if(isliving(A)) + if(src.zone_sel.selecting == BP_GROIN) //CHOMPEdit + if(src.vore_bellyrub(A)) + return custom_emote(1,"[pick(friendly)] \the [A]!") if(I_HURT) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm index af2d00404e..04e995d7d1 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm @@ -274,11 +274,15 @@ switch(M.a_intent) if(I_HELP) if(health > 0) + if(M.zone_sel.selecting == BP_GROIN) //CHOMPEdit + if(M.vore_bellyrub(src)) + return M.visible_message("[M] [response_help] \the [src].") if(has_AI()) var/datum/ai_holder/AI = ai_holder AI.set_stance(STANCE_IDLE) if(prob(tame_chance)) + AI.violent_breakthrough = FALSE AI.hostile = FALSE friend = M AI.set_follow(friend) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 5392d53b62..c2f1d635af 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -169,6 +169,7 @@ // If dead and we try to move in our mob, it leaves our body if(my_mob.stat == DEAD && isliving(my_mob) && !my_mob.forbid_seeing_deadchat) + my_mob.setMoveCooldown(my_mob.movement_delay(n, direct)) my_mob.ghostize() return diff --git a/code/modules/mob/mob_planes.dm b/code/modules/mob/mob_planes.dm index 6d97835cc2..4235d7470a 100644 --- a/code/modules/mob/mob_planes.dm +++ b/code/modules/mob/mob_planes.dm @@ -215,6 +215,7 @@ render_target = O_LIGHTING_VISUAL_RENDER_TARGET blend_mode = BLEND_MULTIPLY alpha = 255 + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR // NO_CLIENT_COLOR because it has some naughty interactions with colorblindness that I can't figure out. Byond bug? /obj/screen/plane_master/emissive plane = PLANE_EMISSIVE diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 7111cd52d7..914c478e17 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -359,24 +359,27 @@ var/list/table_icon_cache = list() // Base frame shape. Mostly done for glass/diamond tables, where this is visible. for(var/i = 1 to 4) - var/image/I = get_table_image(icon, connections[i], 1<<(i-1)) + var/image/I = get_table_image(icon, connections?[i] || 0, 1<<(i-1)) add_overlay(I) // Standard table image if(material) for(var/i = 1 to 4) - var/image/I = get_table_image(icon, "[material.icon_base]_[connections[i]]", 1<<(i-1), material.icon_colour, 255 * material.opacity) + var/connect = connections?[i] || 0 + var/image/I = get_table_image(icon, "[material.icon_base]_[connect]", 1<<(i-1), material.icon_colour, 255 * material.opacity) add_overlay(I) // Reinforcements if(reinforced) for(var/i = 1 to 4) - var/image/I = get_table_image(icon, "[reinforced.icon_reinf]_[connections[i]]", 1<<(i-1), reinforced.icon_colour, 255 * reinforced.opacity) + var/connect = connections?[i] || 0 + var/image/I = get_table_image(icon, "[reinforced.icon_reinf]_[connect]", 1<<(i-1), reinforced.icon_colour, 255 * reinforced.opacity) add_overlay(I) if(carpeted) for(var/i = 1 to 4) - var/image/I = get_table_image(icon, "carpet_[connections[i]]", 1<<(i-1)) + var/connect = connections?[i] || 0 + var/image/I = get_table_image(icon, "carpet_[connect]", 1<<(i-1)) add_overlay(I) else cut_overlays() diff --git a/code/modules/telesci/quantum_pad.dm b/code/modules/telesci/quantum_pad.dm index 6232152d22..6f1381a191 100644 --- a/code/modules/telesci/quantum_pad.dm +++ b/code/modules/telesci/quantum_pad.dm @@ -245,6 +245,8 @@ var/list/gateway_zs = GetConnectedZlevels(GLOB.gateway_away.z) if(z in gateway_zs) return FALSE // It's not calibrated and we're in a connected z + + return TRUE /obj/machinery/power/quantumpad/proc/gateway_scatter(mob/user) var/obj/effect/landmark/dest = pick(awaydestinations) diff --git a/code/modules/tgui/modules/camera.dm b/code/modules/tgui/modules/camera.dm index 86eb923c1c..abfef14be1 100644 --- a/code/modules/tgui/modules/camera.dm +++ b/code/modules/tgui/modules/camera.dm @@ -296,3 +296,7 @@ /datum/tgui_module/camera/ntos/hacked/New(host) . = ..(host, using_map.station_networks.Copy()) + +/datum/tgui_module/camera/bigscreen/tgui_state(mob/user) + return GLOB.tgui_physical_state_bigscreen + \ No newline at end of file diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index 01b8ae1a84..5a66efc090 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -85,7 +85,7 @@ * * Check the distance for a living mob. * Really only used for checks outside the context of a mob. - * Otherwise, use shared_living_ui_distance(). + * Otherwise, use shared_living_tgui_distance(). * * required src_object The object which owns the UI. * required user mob The mob who opened/is using the UI. @@ -119,10 +119,26 @@ return STATUS_DISABLED return STATUS_CLOSE // Otherwise, we got nothing. -/mob/living/carbon/human/shared_living_tgui_distance(atom/movable/src_object, viewcheck = TRUE) - if((TK in mutations) && (get_dist(src, src_object) <= 2)) +/** + * public + * + * Distance versus interaction check, with max'd update range. + * + * required src_object atom/movable The object which owns the UI. + * + * return UI_state The state of the UI. + */ +/mob/living/proc/shared_living_tgui_distance_bigscreen(atom/movable/src_object, viewcheck = TRUE) + // If the object is obscured, close it. + if(viewcheck && !(src_object in view(src))) + return STATUS_CLOSE + + var/dist = get_dist(src_object, src) + if(dist <= 1) // Open and interact if 1-0 tiles away. return STATUS_INTERACTIVE - return ..() + else if(dist <= world.view) + return STATUS_UPDATE + return STATUS_CLOSE // Otherwise, we got nothing. // Topic Extensions for old UIs /datum/proc/CanUseTopic(var/mob/user, var/datum/tgui_state/state) diff --git a/code/modules/tgui/states/physical.dm b/code/modules/tgui/states/physical.dm index 30c67906ae..9712090b5d 100644 --- a/code/modules/tgui/states/physical.dm +++ b/code/modules/tgui/states/physical.dm @@ -47,3 +47,29 @@ GLOBAL_DATUM_INIT(tgui_physical_obscured_state, /datum/tgui_state/physical_obscu /mob/living/silicon/ai/physical_obscured_can_use_topic(src_object) return STATUS_UPDATE // AIs are not physical. + + /** + * tgui state: physical_state_bigscreen + * + * Short-circuits the default state to only check physical distance, + * but allows updates out to the full size of the screen. + **/ + +GLOBAL_DATUM_INIT(tgui_physical_state_bigscreen, /datum/tgui_state/physical_bigscreen, new) + +/datum/tgui_state/physical_bigscreen/can_use_topic(src_object, mob/user) + . = user.shared_tgui_interaction(src_object) + if(. > STATUS_CLOSE) + return min(., user.physical_can_use_tgui_topic_bigscreen(src_object)) + +/mob/proc/physical_can_use_tgui_topic_bigscreen(src_object) + return STATUS_CLOSE + +/mob/living/physical_can_use_tgui_topic_bigscreen(src_object) + return shared_living_tgui_distance_bigscreen(src_object) + +/mob/living/silicon/physical_can_use_tgui_topic_bigscreen(src_object) + return max(STATUS_UPDATE, shared_living_tgui_distance_bigscreen(src_object)) // Silicons can always see. + +/mob/living/silicon/ai/physical_can_use_tgui_topic(src_object) + return STATUS_UPDATE // AIs are not physical. \ No newline at end of file diff --git a/code/modules/ventcrawl/ventcrawl.dm b/code/modules/ventcrawl/ventcrawl.dm index dd96f40167..a1fd6af591 100644 --- a/code/modules/ventcrawl/ventcrawl.dm +++ b/code/modules/ventcrawl/ventcrawl.dm @@ -10,7 +10,8 @@ var/list/ventcrawl_machinery = list( /obj/item/weapon/holder, /obj/machinery/camera, /obj/belly, - /obj/screen + /obj/screen, + /atom/movable/emissive_blocker ) //VOREStation Edit : added /obj/belly, to this list, CI is complaining about this in his indentation check //mob/living/simple_mob/borer, //VORESTATION AI TEMPORARY REMOVAL REPLACE BACK IN LIST WHEN RESOLVED //VOREStation Edit diff --git a/code/modules/vore/eating/belly_obj_ch.dm b/code/modules/vore/eating/belly_obj_ch.dm index 60526436c4..5c5e09ac3a 100644 --- a/code/modules/vore/eating/belly_obj_ch.dm +++ b/code/modules/vore/eating/belly_obj_ch.dm @@ -1,4 +1,4 @@ -//CHOMP vore additions, currently only consists of reagent stuff - Jack +//CHOMP vore additions. /obj/belly //CHOMP - liquid bellies @@ -303,3 +303,50 @@ else // Didn't transfer, so wait before retrying addtimer(CALLBACK(src, /obj/belly/.proc/check_autotransfer, prey, autotransferlocation), autotransferwait) + +/////////////////////////// Process Cycle Lite /////////////////////////// CHOMP PCL +/obj/belly/proc/quick_cycle() //For manual belly cycling without straining the bellies subsystem. + HandleBellyReagents() //CHOMP reagent belly stuff. + // VERY early exit + if(!contents.len) + return + + var/to_update = FALSE //Did anything update worthy happen? + +/////////////////////////// Exit Early //////////////////////////// CHOMP PCL + var/list/touchable_atoms = contents - items_preserved + if(!length(touchable_atoms)) + return + + var/datum/digest_mode/DM = GLOB.digest_modes["[digest_mode]"] + if(!DM) + log_debug("Digest mode [digest_mode] didn't exist in the digest_modes list!!") + return FALSE + if(DM.handle_atoms(src, touchable_atoms)) + updateVRPanels() + return + + var/list/touchable_mobs = null + + var/list/hta_returns = handle_touchable_atoms(touchable_atoms) + if(islist(hta_returns)) + if(hta_returns["touchable_mobs"]) + touchable_mobs = hta_returns["touchable_mobs"] + if(hta_returns["to_update"]) + to_update = hta_returns["to_update"] + + if(!LAZYLEN(touchable_mobs)) + return + +///////////////////// Time to actually process mobs ///////////////////// CHOMP PCL + for(var/target in touchable_mobs) + var/mob/living/L = target + if(!istype(L)) + continue + var/list/returns = DM.process_mob(src, target) + if(istype(returns) && returns["to_update"]) + to_update = TRUE + + if(to_update) + updateVRPanels() +/////////////////////////// CHOMP PCL END /////////////////////////// \ No newline at end of file diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 7c195dac12..aec57913ee 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -17,8 +17,10 @@ var/play_sound //Potential sound to play at the end to avoid code duplication. var/to_update = FALSE //Did anything update worthy happen? -///////////////////// Prey Loop Refresh/hack ////////////////////// - prey_loop() +/////////////////////////// Exit Early //////////////////////////// + var/list/touchable_atoms = contents - items_preserved + if(!length(touchable_atoms)) + return /////////////////////////// Sound Selections /////////////////////////// var/digestion_noise_chance = 0 @@ -31,10 +33,7 @@ prey_digest = sound(get_sfx("fancy_digest_prey")) pred_digest = sound(get_sfx("fancy_digest_pred")) -/////////////////////////// Exit Early //////////////////////////// - var/list/touchable_atoms = contents - items_preserved - if(!length(touchable_atoms)) - return +///////////////////// Early Non-Mode Handling ///////////////////// var/datum/digest_mode/DM = GLOB.digest_modes["[digest_mode]"] if(!DM) @@ -55,10 +54,58 @@ if(hta_returns["to_update"]) to_update = hta_returns["to_update"] + if(!digestion_noise_chance) + digestion_noise_chance = DM.noise_chance + +/////////////////////////// Make any noise /////////////////////////// + if(digestion_noise_chance && prob(digestion_noise_chance)) + for(var/mob/M in contents) + if(M && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M, prey_digest) + play_sound = pred_digest + + if(to_update) + updateVRPanels() + if(!LAZYLEN(touchable_mobs)) + if(play_sound) + for(var/mob/M in hearers(VORE_SOUND_RANGE, get_turf(owner))) //so we don't fill the whole room with the sound effect + if(!M.is_preference_enabled(/datum/client_preference/digestion_noises)) + continue + if(isturf(M.loc) || (M.loc != src)) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check + if(fancy_vore) + M.playsound_local(get_turf(owner), play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF) + else + M.playsound_local(get_turf(owner), play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF) + //these are all external sound triggers now, so it's ok. return -///////////////////// Early Non-Mode Handling ///////////////////// +///////////////////// Prey Loop Refresh/hack ////////////////////// + prey_loop() + +///////////////////// Time to actually process mobs ///////////////////// + + for(var/target in touchable_mobs) + var/mob/living/L = target + if(!istype(L)) + continue + var/list/returns = DM.process_mob(src, target) + if(istype(returns) && returns["to_update"]) + to_update = TRUE + if(istype(returns) && returns["soundToPlay"] && !play_sound) + play_sound = returns["soundToPlay"] + + if(play_sound) + for(var/mob/M in hearers(VORE_SOUND_RANGE, get_turf(owner))) //so we don't fill the whole room with the sound effect + if(!M.is_preference_enabled(/datum/client_preference/digestion_noises)) + continue + if(isturf(M.loc) || (M.loc != src)) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check + if(fancy_vore) + M.playsound_local(get_turf(owner), play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF) + else + M.playsound_local(get_turf(owner), play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF) + //these are all external sound triggers now, so it's ok. + if(emote_active) var/list/EL = emote_lists[digest_mode] if(LAZYLEN(EL) && next_emote <= world.time) @@ -79,41 +126,6 @@ formatted_message = replacetext(formatted_message, "%countprey", living_count) to_chat(M, "[formatted_message]") - if(!digestion_noise_chance) - digestion_noise_chance = DM.noise_chance - - -///////////////////// Time to actually process mobs ///////////////////// - for(var/target in touchable_mobs) - var/mob/living/L = target - if(!istype(L)) - continue - var/list/returns = DM.process_mob(src, target) - if(istype(returns) && returns["to_update"]) - to_update = TRUE - if(istype(returns) && returns["soundToPlay"] && !play_sound) - play_sound = returns["soundToPlay"] - -/////////////////////////// Make any noise /////////////////////////// - if(digestion_noise_chance && prob(digestion_noise_chance)) - for(var/mob/M in contents) - if(M && M.is_preference_enabled(/datum/client_preference/digestion_noises)) - SEND_SOUND(M, prey_digest) - play_sound = pred_digest - - if(play_sound) - for(var/mob/M in hearers(VORE_SOUND_RANGE, get_turf(owner))) //so we don't fill the whole room with the sound effect - if(!M.is_preference_enabled(/datum/client_preference/digestion_noises)) - continue - if(isturf(M.loc) || (M.loc != src)) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check - if(fancy_vore) - M.playsound_local(get_turf(owner), play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF) - else - M.playsound_local(get_turf(owner), play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF) - //these are all external sound triggers now, so it's ok. - - if(to_update) - updateVRPanels() /obj/belly/proc/handle_touchable_atoms(list/touchable_atoms) var/did_an_item = FALSE // Only do one item per cycle. diff --git a/code/modules/vore/eating/living_ch.dm b/code/modules/vore/eating/living_ch.dm index f51bc265b1..58f4c656e3 100644 --- a/code/modules/vore/eating/living_ch.dm +++ b/code/modules/vore/eating/living_ch.dm @@ -219,3 +219,21 @@ mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) soundfile = fancy_release_sounds[RTB.release_sound] if(soundfile) playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises) + +/mob/living/proc/vore_bellyrub(var/mob/living/T) + set name = "Give Bellyrubs" + set category = "Abilities" + set desc = "Provide bellyrubs to either yourself or another mob with a belly." + + if(!T) + T = input("Choose whose belly to rub") as null| mob in view(src.loc,1) + if(!T) + return FALSE + if(T.vore_selected) + var/obj/belly/B = T.vore_selected + if(istype(B)) + custom_emote_vr(1, "gives some rubs over [T]'s [B].") + B.quick_cycle() + return TRUE + to_chat(src, "There is no suitable belly for rubs.") + return FALSE \ No newline at end of file diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 5d194781c7..d69ccb25b9 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -52,6 +52,7 @@ M.verbs += /mob/living/proc/insidePanel M.verbs += /mob/living/proc/vore_transfer_reagents //CHOMP If mob doesnt have bellies it cant use this verb for anything M.verbs += /mob/living/proc/vore_check_reagents //CHOMP If mob doesnt have bellies it cant use this verb for anything + M.verbs += /mob/living/proc/vore_bellyrub //CHOMP If mob doesnt have bellies it probably won't be needing this anyway //Tries to load prefs if a client is present otherwise gives freebie stomach spawn(2 SECONDS) @@ -544,7 +545,7 @@ // Their AI should get notified so they can stab us prey.ai_holder?.react_to_attack(user) - + //Timer and progress bar if(!do_after(user, swallow_time, prey, exclusive = TASK_USER_EXCLUSIVE)) return FALSE // Prey escpaed (or user disabled) before timer expired. diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 5bcd41de3f..2116cb6048 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -889,74 +889,56 @@ No. With a teleporter? Just *no*. - Hawk, YW //catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) sensor_mode = 3 - icon = 'icons/vore/custom_clothes_vr.dmi' - icon_state = "khi_uniform_i" - - icon_override = 'icons/vore/custom_clothes_vr.dmi' - item_state = "" + icon = 'icons/inventory/uniform/item_vr.dmi' + default_worn_icon = 'icons/inventory/uniform/mob_vr.dmi' + icon_state = "khi_uniform" /obj/item/clothing/under/rank/khi/cmd //Command version name = "GE command suit" //CHOMPedit: Change to GE desc = "Gilthari Exports uniform. An extra-comfortable command one, at that." //CHOMPedit - icon_state = "khi_uniform_cmd_i" - item_state = "khi_uniform_cmd" - worn_state = "khi_uniform_cmd" + icon_state = "khi_uniform_cmd" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/under/rank/khi/sec //Security version name = "GE security suit" //CHOMPedit: Change to GE desc = "Gilthari Exports uniform. This one has angry red security stripes. Keepin' the peace in style." //CHOMPedit - icon_state = "khi_uniform_sec_i" - item_state = "khi_uniform_sec" - worn_state = "khi_uniform_sec" + icon_state = "khi_uniform_sec" armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/under/rank/khi/med //Medical version name = "GE medical suit" //CHOMPedit: Change to GE desc = "Gilthari Exports uniform. The medical version. Why not just get a new body, anyway?"//CHOMPedit - icon_state = "khi_uniform_med_i" - item_state = "khi_uniform_med" - worn_state = "khi_uniform_med" + icon_state = "khi_uniform_med" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) /obj/item/clothing/under/rank/khi/eng //Engineering version name = "GE engineering suit" //CHOMPedit: Change to GE desc = "Gilthari Exports uniform. One fit for an engineer, by the looks of it. Building the future, one disaster at a time." //CHOMPedit - icon_state = "khi_uniform_eng_i" - item_state = "khi_uniform_eng" - worn_state = "khi_uniform_eng" + icon_state = "khi_uniform_eng" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10) /obj/item/clothing/under/rank/khi/sci //Science version name = "GE science suit" //CHOMPedit: Change to GE desc = "Gilthari Exports uniform. For performing science in, based on the color! Only SCIENCE can save us now." //CHOMPedit - icon_state = "khi_uniform_sci_i" - item_state = "khi_uniform_sci" - worn_state = "khi_uniform_sci" + icon_state = "khi_uniform_sci" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0) /obj/item/clothing/under/rank/khi/crg //Cargo version name = "GE cargo suit" //CHOMPedit: Change to GE desc = "A sleek cargo uniform from Gilthari Exports." //CHOMPedit - icon_state = "khi_uniform_crg_i" - item_state = "khi_uniform_crg" - worn_state = "khi_uniform_crg" + icon_state = "khi_uniform_crg" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/under/rank/khi/civ //Science version name = "GE civilian suit" //CHOMPedit: Change to GE desc = "A sleek civilian uniform from Gilthari Exports." //CHOMPedit - icon_state = "khi_uniform_civ_i" - item_state = "khi_uniform_civ" - worn_state = "khi_uniform_civ" + icon_state = "khi_uniform_civ" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/under/rank/khi/fluff/aronai //Aro fluff version name = "KHI meditech suit" - desc = "An outdated uniform of some sort. You get the sense that whoever wore this must've been very full of themselves" - icon_state = "khi_uniform_aro_i" - item_state = "khi_uniform_aro" - worn_state = "khi_uniform_aro" + desc = "An outdated uniform of some sort. You get the sense that whoever wore this must've been very full of themselves" //YW edit + icon_state = "khi_uniform_aro" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) //jacobdragon:Earthen Breath @@ -1189,30 +1171,26 @@ Departamental Swimsuits, for general use /obj/item/clothing/under/rank/trek name = "Section 31 Uniform" desc = "Oooh... right." - icon = 'icons/vore/custom_clothes_vr.dmi' - icon_override = 'icons/vore/custom_clothes_vr.dmi' - item_state = "" + icon = 'icons/inventory/uniform/item_vr.dmi' + default_worn_icon = 'icons/inventory/uniform/mob_vr.dmi' //TOS /obj/item/clothing/under/rank/trek/command name = "Command Uniform" desc = "The uniform worn by command officers in the mid 2260s." icon_state = "trek_command" - item_state = "trek_command" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) // Considering only staff heads get to pick it /obj/item/clothing/under/rank/trek/eng //CHOMPEdit: Engineering only name = "Operations Uniform" desc = "The uniform worn by operations officers of the mid 2260s. You feel strangely vulnerable just seeing this..." icon_state = "trek_engsec" - item_state = "trek_engsec" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) // since they're shared between jobs and kinda moot. //CHOMPEdit: I'll tell you what, the armor values are NOT shared. Removed melee bonus. /obj/item/clothing/under/rank/trek/medsci name = "MedSci Uniform" desc = "The uniform worn by medsci officers in the mid 2260s." icon_state = "trek_medsci" - item_state = "trek_medsci" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) // basically a copy of vanilla sci/med @@ -1220,59 +1198,48 @@ Departamental Swimsuits, for general use /obj/item/clothing/under/rank/trek/command/next desc = "The uniform worn by command officers. This one's from the mid 2360s." icon_state = "trek_next_command" - item_state = "trek_next_command" /obj/item/clothing/under/rank/trek/eng/next //CHOMPEdit: Engineering only desc = "The uniform worn by operation officers. This one's from the mid 2360s." icon_state = "trek_next_engsec" - item_state = "trek_next_engsec" /obj/item/clothing/under/rank/trek/medsci/next desc = "The uniform worn by medsci officers. This one's from the mid 2360s." icon_state = "trek_next_medsci" - item_state = "trek_next_medsci" //ENT /obj/item/clothing/under/rank/trek/command/ent desc = "The uniform worn by command officers of the 2140s." icon_state = "trek_ent_command" - item_state = "trek_ent_command" /obj/item/clothing/under/rank/trek/eng/ent //CHOMPEdit: Engineering only desc = "The uniform worn by operations officers of the 2140s." icon_state = "trek_ent_engsec" - item_state = "trek_ent_engsec" /obj/item/clothing/under/rank/trek/medsci/ent desc = "The uniform worn by medsci officers of the 2140s." icon_state = "trek_ent_medsci" - item_state = "trek_ent_medsci" //VOY /obj/item/clothing/under/rank/trek/command/voy desc = "The uniform worn by command officers of the 2370s." icon_state = "trek_voy_command" - item_state = "trek_voy_command" /obj/item/clothing/under/rank/trek/eng/voy //CHOMPEdit: Engineering only desc = "The uniform worn by operations officers of the 2370s." icon_state = "trek_voy_engsec" - item_state = "trek_voy_engsec" /obj/item/clothing/under/rank/trek/medsci/voy desc = "The uniform worn by medsci officers of the 2370s." icon_state = "trek_voy_medsci" - item_state = "trek_voy_medsci" //DS9 - /obj/item/clothing/suit/storage/trek/ds9 name = "Padded Overcoat" desc = "The overcoat worn by all officers of the 2380s." + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' icon_state = "trek_ds9_coat" - icon = 'icons/vore/custom_clothes_vr.dmi' - item_state = "trek_ds9_coat_mob" - icon_override = 'icons/vore/custom_clothes_vr.dmi' body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS permeability_coefficient = 0.50 allowed = list( @@ -1289,23 +1256,21 @@ Departamental Swimsuits, for general use name = "Admiral Overcoat" desc = "Admirality specialty coat to keep flag officers fashionable and protected." icon_state = "trek_ds9_coat_adm" - item_state = "trek_ds9_coat_adm_mob" armor = list(melee = 45, bullet = 35, laser = 35, energy = 20, bomb = 0, bio = 40, rad = 55) - /obj/item/clothing/under/rank/trek/command/ds9 desc = "The uniform worn by command officers of the 2380s." - icon_state = "trek_command" + icon_state = "trek_command" // no unique state for this one item_state = "trek_ds9_command" /obj/item/clothing/under/rank/trek/eng/ds9 //CHOMPEdit: Engineering only desc = "The uniform worn by operations officers of the 2380s." - icon_state = "trek_engsec" + icon_state = "trek_engsec" // no unique state for this one item_state = "trek_ds9_engsec" /obj/item/clothing/under/rank/trek/medsci/ds9 desc = "The uniform undershit worn by medsci officers of the 2380s." - icon_state = "trek_medsci" + icon_state = "trek_medsci" // no unique state for this one item_state = "trek_ds9_medsci" //For general use maybe @@ -1941,7 +1906,7 @@ Departamental Swimsuits, for general use item_icons = list() default_worn_icon = 'icons/vore/custom_clothes_vr.dmi' color = COLOR_NAVY - sprite_sheets = null + sprite_sheets = list() //SweetBlueSylveon:Pip Shyner /obj/item/clothing/accessory/poncho/roles/cloak/hop/fluff/pip diff --git a/icons/inventory/accessory/item.dmi b/icons/inventory/accessory/item.dmi index 21d8bbff1d..61e8c36841 100644 Binary files a/icons/inventory/accessory/item.dmi and b/icons/inventory/accessory/item.dmi differ diff --git a/icons/inventory/belt/item.dmi b/icons/inventory/belt/item.dmi index 4f97b40e27..9fd819307a 100644 Binary files a/icons/inventory/belt/item.dmi and b/icons/inventory/belt/item.dmi differ diff --git a/icons/inventory/feet/item_vr.dmi b/icons/inventory/feet/item_vr.dmi index 5b81be4b1f..cfba06c39b 100644 Binary files a/icons/inventory/feet/item_vr.dmi and b/icons/inventory/feet/item_vr.dmi differ diff --git a/icons/inventory/feet/mob_vr.dmi b/icons/inventory/feet/mob_vr.dmi index b1fbd831a1..c717e731fb 100644 Binary files a/icons/inventory/feet/mob_vr.dmi and b/icons/inventory/feet/mob_vr.dmi differ diff --git a/icons/inventory/hands/item_vr.dmi b/icons/inventory/hands/item_vr.dmi index c682016730..ba5e3bc134 100644 Binary files a/icons/inventory/hands/item_vr.dmi and b/icons/inventory/hands/item_vr.dmi differ diff --git a/icons/inventory/hands/mob_vr.dmi b/icons/inventory/hands/mob_vr.dmi index 36e4219289..c2a8db76f8 100644 Binary files a/icons/inventory/hands/mob_vr.dmi and b/icons/inventory/hands/mob_vr.dmi differ diff --git a/icons/inventory/head/item_vr.dmi b/icons/inventory/head/item_vr.dmi index d35d62e18e..929960272b 100644 Binary files a/icons/inventory/head/item_vr.dmi and b/icons/inventory/head/item_vr.dmi differ diff --git a/icons/inventory/head/mob_vr.dmi b/icons/inventory/head/mob_vr.dmi index 417faba92c..efde8d6aa5 100644 Binary files a/icons/inventory/head/mob_vr.dmi and b/icons/inventory/head/mob_vr.dmi differ diff --git a/icons/inventory/suit/item_vr.dmi b/icons/inventory/suit/item_vr.dmi index 31083070be..8357527923 100644 Binary files a/icons/inventory/suit/item_vr.dmi and b/icons/inventory/suit/item_vr.dmi differ diff --git a/icons/inventory/suit/mob_vr.dmi b/icons/inventory/suit/mob_vr.dmi index 35f233c1c3..24d7365930 100644 Binary files a/icons/inventory/suit/mob_vr.dmi and b/icons/inventory/suit/mob_vr.dmi differ diff --git a/icons/inventory/uniform/item.dmi b/icons/inventory/uniform/item.dmi index 5b7c197b03..08cc0cb815 100644 Binary files a/icons/inventory/uniform/item.dmi and b/icons/inventory/uniform/item.dmi differ diff --git a/icons/inventory/uniform/item_vr.dmi b/icons/inventory/uniform/item_vr.dmi index 2e97626d06..e3242dda79 100644 Binary files a/icons/inventory/uniform/item_vr.dmi and b/icons/inventory/uniform/item_vr.dmi differ diff --git a/icons/inventory/uniform/mob.dmi b/icons/inventory/uniform/mob.dmi index 71d8348cf6..87cee8aca9 100644 Binary files a/icons/inventory/uniform/mob.dmi and b/icons/inventory/uniform/mob.dmi differ diff --git a/icons/inventory/uniform/mob_vr.dmi b/icons/inventory/uniform/mob_vr.dmi index ad363e9706..3dc58ffd2c 100644 Binary files a/icons/inventory/uniform/mob_vr.dmi and b/icons/inventory/uniform/mob_vr.dmi differ diff --git a/icons/mob/rig_back_vr.dmi b/icons/mob/rig_back_vr.dmi new file mode 100644 index 0000000000..aa676c0e94 Binary files /dev/null and b/icons/mob/rig_back_vr.dmi differ diff --git a/icons/obj/64x64_ch.dmi b/icons/obj/64x64_ch.dmi index eba8710141..6f2493d610 100644 Binary files a/icons/obj/64x64_ch.dmi and b/icons/obj/64x64_ch.dmi differ diff --git a/icons/obj/entertainment_monitor.dmi b/icons/obj/entertainment_monitor.dmi new file mode 100644 index 0000000000..40250b33e0 Binary files /dev/null and b/icons/obj/entertainment_monitor.dmi differ diff --git a/icons/obj/rig_modules.dmi b/icons/obj/rig_modules.dmi index 5c81745fae..a63fcc23a8 100644 Binary files a/icons/obj/rig_modules.dmi and b/icons/obj/rig_modules.dmi differ diff --git a/icons/obj/rig_modules_vr.dmi b/icons/obj/rig_modules_vr.dmi index 1ee2c008aa..687ea5ba78 100644 Binary files a/icons/obj/rig_modules_vr.dmi and b/icons/obj/rig_modules_vr.dmi differ diff --git a/icons/obj/suitdispenser.dmi b/icons/obj/suitdispenser.dmi index 09723225a4..def549b9bb 100644 Binary files a/icons/obj/suitdispenser.dmi and b/icons/obj/suitdispenser.dmi differ diff --git a/icons/vore/custom_clothes_vr.dmi b/icons/vore/custom_clothes_vr.dmi index d9b172cd5a..595ce2da40 100644 Binary files a/icons/vore/custom_clothes_vr.dmi and b/icons/vore/custom_clothes_vr.dmi differ diff --git a/librust_g.so b/librust_g.so index 9d46da045f..239f12d713 100644 Binary files a/librust_g.so and b/librust_g.so differ diff --git a/maps/offmap_vr/om_ships/aro3.dmm b/maps/offmap_vr/om_ships/aro3.dmm index 095ca08b7a..f31d589f73 100644 --- a/maps/offmap_vr/om_ships/aro3.dmm +++ b/maps/offmap_vr/om_ships/aro3.dmm @@ -2589,6 +2589,10 @@ /obj/structure/table/marble, /turf/simulated/floor/tiled/eris/cafe, /area/aro3/kitchen) +"vP" = ( +/obj/machinery/gear_dispenser/suit_fancy/aether, +/turf/simulated/floor/tiled/eris/steel/panels, +/area/aro3/eva_hall) "vQ" = ( /obj/structure/table/steel, /obj/item/device/flashlight/lamp, @@ -3953,6 +3957,22 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, +<<<<<<< HEAD +||||||| parent of df7a88506f... Merge pull request #11032 from VOREStation/Arokha/megaport +/obj/machinery/light_switch{ + dir = 1; + pixel_y = -24 + }, +/obj/item/device/uav/loaded, +======= +/obj/machinery/light_switch{ + dir = 1; + pixel_y = -24 + }, +/obj/item/device/uav/loaded{ + nickname = "FoxBot Beta" + }, +>>>>>>> df7a88506f... Merge pull request #11032 from VOREStation/Arokha/megaport /turf/simulated/floor/tiled/eris/dark/gray_perforated, /area/aro3/repair_bay) "Gy" = ( @@ -42234,7 +42254,7 @@ el el vZ lu -DM +vP XF XF Nu diff --git a/maps/offmap_vr/talon/talon_v2.dm b/maps/offmap_vr/talon/talon_v2.dm index 2b2ede093c..1a8e79af15 100644 --- a/maps/offmap_vr/talon/talon_v2.dm +++ b/maps/offmap_vr/talon/talon_v2.dm @@ -343,7 +343,7 @@ speaking of, if some dumbass does take it and fly off solo then get themselves k /obj/item/clothing/under/rank/medical, /obj/item/clothing/under/rank/nurse, /obj/item/clothing/under/rank/orderly, - /obj/item/clothing/suit/storage/toggle/labcoat, + /obj/item/clothing/suit/storage/toggle/labcoat/modern, /obj/item/clothing/suit/storage/toggle/fr_jacket, /obj/item/clothing/shoes/white, /obj/item/device/radio/headset/talon, diff --git a/maps/southern_cross/southern_cross-casino.dmm b/maps/southern_cross/southern_cross-casino.dmm index 45e2d806da..a927ef7652 100644 --- a/maps/southern_cross/southern_cross-casino.dmm +++ b/maps/southern_cross/southern_cross-casino.dmm @@ -1,3 +1,4 @@ +"aa" = (/obj/effect/zone_divider,/mob/living/simple_mob/animal/passive/penguin{hovering = 1},/turf/simulated/floor/outdoors/ice,/area/surface/outside/plains/outpost) "ab" = (/turf/simulated/wall/golddiamond,/area/casino/casino_ship/wing_left) "ac" = (/turf/simulated/wall/golddiamond,/area/casino/casino_ship) "af" = (/obj/structure/reagent_dispensers/watertank/high,/turf/simulated/floor/wood/sif,/area/submap/lonehome) @@ -91,7 +92,6 @@ "cU" = (/obj/machinery/door/airlock/silver{name = "Sauna"},/obj/structure/fans/tiny,/turf/simulated/floor/wood,/area/casino/casino_ship) "cY" = (/obj/effect/decal/cleanable/dirt,/obj/random/junk,/turf/simulated/floor/wood/sif,/area/submap/lonehome) "cZ" = (/obj/structure/bed/chair/sofa/yellow/corner,/turf/simulated/floor/carpet/oracarpet,/area/casino/casino_ship) -"da" = (/obj/structure/wheel_of_fortune{pixel_y = 8},/obj/structure/table/fancyblack,/turf/simulated/floor/carpet/turcarpet,/area/casino/casino_ship) "db" = (/obj/structure/table/rack/shelf/steel,/obj/item/stack/material/log/sif{amount = 25},/obj/item/stack/material/log/sif{amount = 25},/turf/simulated/floor/plating,/area/submap/lonehome) "dc" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/outdoors/grass/heavy{outdoors = 0},/area/casino/casino_ship) "dd" = (/obj/machinery/light/small{dir = 1},/obj/machinery/recharge_station,/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship) @@ -1020,7 +1020,6 @@ "YV" = (/obj/structure/bed/chair/oldsofa/left{dir = 8},/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship) "YX" = (/obj/structure/bed/chair/sofa/yellow/right,/turf/simulated/floor/carpet/oracarpet,/area/casino/casino_ship) "Zc" = (/obj/structure/casino_table/roulette_chart,/turf/simulated/floor/carpet/oracarpet,/area/casino/casino_ship) -"Zi" = (/mob/living/simple_mob/animal/passive/penguin{hovering = 1},/obj/effect/zone_divider,/turf/simulated/floor/outdoors/ice,/area/surface/outside/plains/outpost) "Zj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/door/blast/shutters{dir = 2; id = "Casinodormshutters5"; layer = 3.5; name = "Casino Privacy shutters"},/turf/simulated/floor,/area/casino/casino_ship/dorms) "Zl" = (/obj/structure/bed/chair/comfy/red{dir = 4},/turf/simulated/floor/carpet/oracarpet,/area/casino/casino_ship) "Zn" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/brown/border{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) @@ -1151,7 +1150,7 @@ hPmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNfBwtmNmNmNwtmNmNmNeGmNmNcCmNeGmNmNmNhXmN hPmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNwtaFmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNcCmNmNmNmNcCmNmNcCmNmNfBmNmNcCfBmNfBmNmNfBfBcCmNmNmNfBcCcCmNmNmNmNcCmNmNmNmNmNmNmNmNmNmNfBmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNdqmNmNbKbKbKbKbKgabKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKmNmNmNmNhXmNmNfBmNmNmNmNmNmNmNmNeGmNmNmNmNmNblmNmNmNmNmNmNmNav hPmcmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNcCmNmNmNmNmNcjmNmNmNmNmNxrmNmNmNmNfBmNmNmNmNmNaFmNmNmNmNhYmNmNmNmNmNmNmNmNmNeGanmNmNmNmNmNgSmNmNmNmNmNmNmNmNmNmNmNmNmNmNKPmNmNcCmNmNmNmNmNaimNmNcCfBmNfBmNmNmNcCmNcCmNmNmNYhaFmNmNmNwtmNmNmNmNmNmNmNmNmNmNmNcChYmNmNmNmNmNmNbKbKbKbKbKbKbKbKgabKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKmNmNmNmNmNnfmNmNmNeGmNfBmNmNmNmNfBhXmNmNblmNmNmNwtmNmNmNav hPmcmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNmNcCmNmNmNmNmNmNmNmNcCmNmNmNmNmNmNeGmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNwtmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNeGmNmNmNmNmNhXmNmNmNmNmNmNmNmNcCaFmNmNmNmNfBmNcCmNfBmNcCmNmNmNmNmNfBmNmNmNmNmNmNmNmNmNmNeGmNmNmNmNmNmNmNmNmNmNmNmNbKbKbKbKbKbKbKbKbKgabKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKmNmNmNmNmNmNmNmNfBmNmNmNmNmNmNhXmNmNmNmNblmNmNmNmNmNmNmNav -ZLgrgrgrgrgrgrgrgrgrgrgrgrgrgrlFlFxplFlFlFlFlFlFfXlFlFlFlFlFlFlFlFlFlFlFlFlFlFwrlFlFlFlFyPlFlFlFlFpOlFlFlFlFlFlFlFlFlFPBUNlFlFlFlFlFlFlFlFlFlFlFlFlFlFyPlFlFlFlFlFlFlFlFPBlFlFlFlFlFPBlFyPlFlFlFlFlFlFyPlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFyPlFlFlFlFlFlFlFgagagagagagagagagagagagagagagagagagagaZigagagagagagagagagagalFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFDwXflFlFlFlFlFlFbG +ZLgrgrgrgrgrgrgrgrgrgrgrgrgrgrlFlFxplFlFlFlFlFlFfXlFlFlFlFlFlFlFlFlFlFlFlFlFlFwrlFlFlFlFyPlFlFlFlFpOlFlFlFlFlFlFlFlFlFPBUNlFlFlFlFlFlFlFlFlFlFlFlFlFlFyPlFlFlFlFlFlFlFlFPBlFlFlFlFlFPBlFyPlFlFlFlFlFlFyPlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFyPlFlFlFlFlFlFlFgagagagagagagagagagagagagagagagagagagaaagagagagagagagagagagalFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFDwXflFlFlFlFlFlFbG hPmcmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNcCmNmNmNmNmNaFmNmNmNmNmNcCaFmNmNmNmNmNmNwteGmNmNmNmNeGmNmNmNmNmNmNmNmNmNmNmNmNmNmNcCmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNfBmNmNmNfBmNmNcCmNmNcCcCfBmNmNmNmNcCmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNcCmNmNmNmNmNbKbKbKbKbKbKbKbKbKUdbKgabKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKmNmNmNmNmNhXmNmNmNmNmNmNmNmNmNmNmNmNmNblmNmNmNmNmNmNmNav hPmcmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNfBmNmNcCXPfBmNmNcCmNmNmNmNdqmNfBmNmNfBmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNhXmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNeGmNmNcncCmNmNmNmNmNmNmNmNcCmNmNmNfBfBOvmNfBmNmNmNmNmNmNmNmNaFmNmNwtmNmNmNmNmNmNmNmNmNmNmNeGmNmNmNmNmNbKbKbKbKbKbKbKbKbKbKbKgabKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKmNmNmNmNmNmNmNmNmNmNdqmNmNmNmNmNmNmNblmNmNmNmNmNmNmNav hPmcmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNmNaFmNmNmNmNmNmNmNmNmNmNfBmNmNmNmNmNmNaFmNmNmNmNmNmNmNmNeGmNmNfBmNmNmNmNmNeGmNmNmNmNmNmNmNmNcCmNmNmNmNmNmNhXmNmNcCmNmNmNmNmNmNmNmNmNmNmNmNmNmNfBmNfBfBmNmNmNmNmNmNfBmNmNmNmNcCaFmNmNmNmNmNmNmNmNmNmNhYmNmNmNmNmNmNmNdqbKbKbKbKbKbKbKbKbKbKbKgabKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKbKmNmNmNmNmNmNmNmNmNmNmNfBmNmNmNmNmNmNblmNmNmNmNmNdqmNav @@ -1167,7 +1166,7 @@ hPmcmcmcmcmcmcmcmcmcmcmcmcmNmNdqmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmN hPmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNmNmNmNmNcCmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNhYmNmNmNmNgNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNwtmNmNmNmNmNmNeGmNmNmNmNhYmNmNmNmNmNmNmNwtmNmNmNmNmNmNmNmNmNmNaFmNmNmNmNeGmNcCmNmNmNmNmNmNmNmNmNmNmNeGmNmNmNmNmNmNeGmNmNmNmNmNmNlFmNmNmNmNmNdqmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNfBdqmNfBmNmNblmNmNmNmNmNdqmNav hPmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNmNmNmNmNmNgNgNgNgNmNgNgNgNmNeGmNmNeGmNmNmNmNmNmNgNgNmNmNmNhYmNmNmNmNmNmNmNmNmNmNmNmNmNgNmNmNgNgNmNmNmNgNgNgNgNgNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNhYmNmNmNmNwtmNmNmNmNmNmNmNmNcCmNmNmNmNmNmNmNwtmNmNmNmNmNmNaFmNmNmNmNaFmNmNmNmNmNmNmNmNmNeGmNmNlFmNmNmNmNmNmNmNmNmNhYmNmNmNmNmNmNmNmNmNmNmNmNmNwtmNmNmNmNmNhXmNmNmNmNmNmNmNmNblmNhYmNmNmNmNmNav hPmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNmNmNgNababababababababababmNmNgNmNmNmNmNmNmNmNmNgNgNmNmNmNmNmNmNgNgNgNmNgNgNmNgNgNmNacbMbPbPbPbWacacacbMbPbPbPbWacmNgNgNgNgNgNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNaFmNmNmNmNmNmNmNhXmNmNmNmNeGmNmNmNeGcCmNmNmNfBmNmNmNmNmNmNmNlFmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNaFmNmNmNmNeGmNmNmNmNmNblmNmNmNmNmNmNmNav -hPmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNgNgNgNabababbZcfcgclcwabababababmNgNmNmNmNmNmNgNgNgNgNmNmNmNaccxcycycydKaccxcycycydKacdzfvcDfvfldgdadgflfvcDfvdzacbMbPbPbPbPbPbWacgNmNgNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNaFmNmNmNmNmNmNmNmNmNmNmNmNmNmNhXmNPchXmNmNmNmNcCmNmNlFmNmNcCmNmNmNmNmNmNmNmNmNmNmNdqmNmNmNmNmNmNmNmNmNmNmNhXmNmNfByfmNmNmNmNmNmNwtblmNmNmNmNmNmNmNav +hPmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNmNgNgNgNabababbZcfcgclcwabababababmNgNmNmNmNmNmNgNgNgNgNmNmNmNaccxcycycydKaccxcycycydKacdzfvcDfvfldgfpdgflfvcDfvdzacbMbPbPbPbPbPbWacgNmNgNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNaFmNmNmNmNmNmNmNmNmNmNmNmNmNmNhXmNPchXmNmNmNmNcCmNmNlFmNmNcCmNmNmNmNmNmNmNmNmNmNmNdqmNmNmNmNmNmNmNmNmNmNmNhXmNmNfByfmNmNmNmNmNmNwtblmNmNmNmNmNmNmNav hPmcmcmcmcmcmcmcmcmcmcmcmcmcgNmNmNgNgNgNgNdrcqabdAdJdJdJdRabdTdXabababababgNgNgNmNOuUgUggNgNmNmNacSWekekekkaeOyZyZffyZyZCLdzfvfvfvflfpfpfpflfvfvfvdzfCYjYjfIYjYjHheFacbMbWacmNmNmNgNmNgNmNmNmNgNgNmNgNgNgNgNgNgNmNgNgNgNgNgNgNmNgNgNgNmNmNmNmNmNmNwtmNmNhXmNmNmNfBmNmNmNmNaFhXmNmNfXmNmNmNmNmNmNhXmNmNmNmNcCmNmNmNmNmNmNmNeGmNmNmNmNmNhXmNmNhXmNmNmNmNdqmNmNmNmNblmNmNmNmNhXmNmNav hPmcmcmcmcmcmcmcmcmcmcmcmcmcmNgNgNgNgNgNgNdrcqabfQfYgbgcdJgmdJdJgogpgvgAababababababgDgGacacacacacgZqphbhDcMeFeZeZbNeZeZeZdzdzdzdzflflflflfldzdzdzdzIqIqIqbDIqIqeFeFiKgyzlaPjojpjpjpjvaPjwjHjHjHjIaPjJjWjWjWkgaPbMbPbPbPbPbPbPbPbPbPbWacacgNmNmNmNmNmNmNmNmNmNmNmNfBmNmNfBhYmNmNmNlFmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNhXmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNblmNmNwtmNmNmNmNav hPmcmcmcmcmcmcmcmcmcmcmcmcmcmNmNmNgNgNcpgNdrcqabababababababkDdJlRdJdJwHabababababablSlWacnAlXacJcmomvmwmycMeFbNbNbNbNbNbNeFeFeFdzdzdzdzdzdzdzeFeFeFbDbDbDbDbDbDeFeFMzfhNGaPmOKusuMIkTaPmOfGsuMIkTaPmOfGsuMIkTaPoZoZoZikoZqWxzMexexeTxacacacacmNmNgNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNlFaFmNmNmNmNmNmNmNmNmNmNmNmNhXmNmNmNmNmNmNmNmNwtmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNblmNmNmNmNmNeGmNav diff --git a/maps/southern_cross/structures/closets/medical.dm b/maps/southern_cross/structures/closets/medical.dm index f528c2a0f1..666b42d617 100644 --- a/maps/southern_cross/structures/closets/medical.dm +++ b/maps/southern_cross/structures/closets/medical.dm @@ -13,6 +13,7 @@ /obj/item/clothing/under/rank/chief_medical_officer/skirt, /obj/item/clothing/suit/storage/toggle/labcoat/cmo, /obj/item/clothing/suit/storage/toggle/labcoat/cmoalt, + /obj/item/clothing/suit/storage/toggle/labcoat/modern/cmo, /obj/item/weapon/cartridge/cmo, /obj/item/clothing/gloves/sterile/latex, /obj/item/clothing/shoes/brown, diff --git a/maps/virgo_minitest/virgo_minitest_defines.dm b/maps/virgo_minitest/virgo_minitest_defines.dm index abee28169d..716815b7b3 100644 --- a/maps/virgo_minitest/virgo_minitest_defines.dm +++ b/maps/virgo_minitest/virgo_minitest_defines.dm @@ -60,6 +60,10 @@ allowed_spawns = list("Arrivals Shuttle","Gateway","Cryogenic Storage","Cyborg Storage") +/datum/map/virgo_minitest/New() + ..() + SSticker.start_immediately = TRUE + /datum/map_z_level/minitest/station z = Z_LEVEL_MAIN_VIRGO_TESTING name = "Station Level" diff --git a/rust_g.dll b/rust_g.dll index 5e60ff2cd4..ebb6c9fd19 100644 Binary files a/rust_g.dll and b/rust_g.dll differ diff --git a/tgui/packages/common/string.js b/tgui/packages/common/string.js index 461f975b3a..4278a1fb3e 100644 --- a/tgui/packages/common/string.js +++ b/tgui/packages/common/string.js @@ -78,13 +78,21 @@ export const createSearch = (searchText, stringifier) => { }; }; +export const isUppercase = chr => { + return chr.toUpperCase() === chr; +}; + export const capitalize = str => { // Handle array if (Array.isArray(str)) { return str.map(capitalize); } // Handle string - return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); + let chr = str.charAt(0); + if (isUppercase(chr)) { + return str; // Already caps, might be an acronym, so don't mess it up by lowercasing the rest + } + return chr.toUpperCase() + str.slice(1).toLowerCase(); }; export const toTitleCase = str => { diff --git a/tgui/public/tgui-common.bundle.js b/tgui/public/tgui-common.bundle.js index 013a168d31..d363cbd6bb 100644 --- a/tgui/public/tgui-common.bundle.js +++ b/tgui/public/tgui-common.bundle.js @@ -1 +1 @@ -(self.webpackChunktgui_workspace=self.webpackChunktgui_workspace||[]).push([[962],{33407:function(e,t,n){"use strict";t.__esModule=!0,t.popperGenerator=v,t.createPopper=void 0;var r=d(n(98825)),o=d(n(52089)),i=d(n(66469)),a=d(n(54484)),u=(d(n(82020)),d(n(7183))),c=d(n(16936)),s=(d(n(11026)),d(n(20675)),d(n(78044)),d(n(5495))),l=d(n(45073));t.detectOverflow=l["default"];var f=n(31966);n(54945);function d(e){return e&&e.__esModule?e:{"default":e}}var p={placement:"bottom",modifiers:[],strategy:"absolute"};function h(){for(var e=arguments.length,t=new Array(e),n=0;n=0&&(0,l.isHTMLElement)(e)?(0,u["default"])(e):e;if(!(0,l.isElement)(n))return[];return t.filter((function(e){return(0,l.isElement)(e)&&(0,p["default"])(e,n)&&"body"!==(0,h["default"])(e)}))}(e):[].concat(t),o=[].concat(r,[n]),i=o[0],c=o.reduce((function(t,n){var r=y(e,n);return t.top=(0,m.max)(r.top,t.top),t.right=(0,m.min)(r.right,t.right),t.bottom=(0,m.min)(r.bottom,t.bottom),t.left=(0,m.max)(r.left,t.left),t}),y(e,i));return c.width=c.right-c.left,c.height=c.bottom-c.top,c.x=c.left,c.y=c.top,c};var r=n(54945),o=g(n(17488)),i=g(n(27175)),a=g(n(66469)),u=g(n(54484)),c=g(n(36e3)),s=g(n(82020)),l=n(31966),f=g(n(87916)),d=g(n(23470)),p=g(n(41858)),h=g(n(38012)),v=g(n(77276)),m=n(52209);function g(e){return e&&e.__esModule?e:{"default":e}}function y(e,t){return t===r.viewport?(0,v["default"])((0,o["default"])(e)):(0,l.isHTMLElement)(t)?function(e){var t=(0,f["default"])(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}(t):(0,v["default"])((0,i["default"])((0,c["default"])(e)))}},98825:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t,n){void 0===n&&(n=!1);var l=(0,c["default"])(t),f=(0,r["default"])(e),d=(0,a.isHTMLElement)(t),p={scrollLeft:0,scrollTop:0},h={x:0,y:0};(d||!d&&!n)&&(("body"!==(0,i["default"])(t)||(0,s["default"])(l))&&(p=(0,o["default"])(t)),(0,a.isHTMLElement)(t)?((h=(0,r["default"])(t)).x+=t.clientLeft,h.y+=t.clientTop):l&&(h.x=(0,u["default"])(l)));return{x:f.left+p.scrollLeft-h.x,y:f.top+p.scrollTop-h.y,width:f.width,height:f.height}};var r=l(n(87916)),o=l(n(38015)),i=l(n(38012)),a=n(31966),u=l(n(25880)),c=l(n(36e3)),s=l(n(42156));function l(e){return e&&e.__esModule?e:{"default":e}}},82020:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(0,o["default"])(e).getComputedStyle(e)};var r,o=(r=n(89778))&&r.__esModule?r:{"default":r}},36e3:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(((0,r.isElement)(e)?e.ownerDocument:e.document)||window.document).documentElement};var r=n(31966)},27175:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t,n=(0,r["default"])(e),c=(0,a["default"])(e),s=null==(t=e.ownerDocument)?void 0:t.body,l=(0,u.max)(n.scrollWidth,n.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),f=(0,u.max)(n.scrollHeight,n.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),d=-c.scrollLeft+(0,i["default"])(e),p=-c.scrollTop;"rtl"===(0,o["default"])(s||n).direction&&(d+=(0,u.max)(n.clientWidth,s?s.clientWidth:0)-l);return{width:l,height:f,x:d,y:p}};var r=c(n(36e3)),o=c(n(82020)),i=c(n(25880)),a=c(n(31348)),u=n(52209);function c(e){return e&&e.__esModule?e:{"default":e}}},13339:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}},52089:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,o["default"])(e),n=e.offsetWidth,r=e.offsetHeight;Math.abs(t.width-n)<=1&&(n=t.width);Math.abs(t.height-r)<=1&&(r=t.height);return{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}};var r,o=(r=n(87916))&&r.__esModule?r:{"default":r}},38012:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e?(e.nodeName||"").toLowerCase():null}},38015:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return e!==(0,o["default"])(e)&&(0,i.isHTMLElement)(e)?(0,a["default"])(e):(0,r["default"])(e)};var r=u(n(31348)),o=u(n(89778)),i=n(31966),a=u(n(13339));function u(e){return e&&e.__esModule?e:{"default":e}}},54484:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,r["default"])(e),n=l(e);for(;n&&(0,u["default"])(n)&&"static"===(0,i["default"])(n).position;)n=l(n);if(n&&("html"===(0,o["default"])(n)||"body"===(0,o["default"])(n)&&"static"===(0,i["default"])(n).position))return t;return n||function(e){var t=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&(0,a.isHTMLElement)(e)){if("fixed"===(0,i["default"])(e).position)return null}var n=(0,c["default"])(e);for(;(0,a.isHTMLElement)(n)&&["html","body"].indexOf((0,o["default"])(n))<0;){var r=(0,i["default"])(n);if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||t&&"filter"===r.willChange||t&&r.filter&&"none"!==r.filter)return n;n=n.parentNode}return null}(e)||t};var r=s(n(89778)),o=s(n(38012)),i=s(n(82020)),a=n(31966),u=s(n(69183)),c=s(n(23470));function s(e){return e&&e.__esModule?e:{"default":e}}function l(e){return(0,a.isHTMLElement)(e)&&"fixed"!==(0,i["default"])(e).position?e.offsetParent:null}},23470:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){if("html"===(0,r["default"])(e))return e;return e.assignedSlot||e.parentNode||((0,i.isShadowRoot)(e)?e.host:null)||(0,o["default"])(e)};var r=a(n(38012)),o=a(n(36e3)),i=n(31966);function a(e){return e&&e.__esModule?e:{"default":e}}},92098:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function c(e){if(["html","body","#document"].indexOf((0,i["default"])(e))>=0)return e.ownerDocument.body;if((0,a.isHTMLElement)(e)&&(0,o["default"])(e))return e;return c((0,r["default"])(e))};var r=u(n(23470)),o=u(n(42156)),i=u(n(38012)),a=n(31966);function u(e){return e&&e.__esModule?e:{"default":e}}},17488:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,r["default"])(e),n=(0,o["default"])(e),a=t.visualViewport,u=n.clientWidth,c=n.clientHeight,s=0,l=0;a&&(u=a.width,c=a.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(s=a.offsetLeft,l=a.offsetTop));return{width:u,height:c,x:s+(0,i["default"])(e),y:l}};var r=a(n(89778)),o=a(n(36e3)),i=a(n(25880));function a(e){return e&&e.__esModule?e:{"default":e}}},89778:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}},31348:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,o["default"])(e),n=t.pageXOffset,r=t.pageYOffset;return{scrollLeft:n,scrollTop:r}};var r,o=(r=n(89778))&&r.__esModule?r:{"default":r}},25880:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(0,r["default"])((0,o["default"])(e)).left+(0,i["default"])(e).scrollLeft};var r=a(n(87916)),o=a(n(36e3)),i=a(n(31348));function a(e){return e&&e.__esModule?e:{"default":e}}},31966:function(e,t,n){"use strict";t.__esModule=!0,t.isElement=function(e){var t=(0,o["default"])(e).Element;return e instanceof t||e instanceof Element},t.isHTMLElement=function(e){var t=(0,o["default"])(e).HTMLElement;return e instanceof t||e instanceof HTMLElement},t.isShadowRoot=function(e){if("undefined"==typeof ShadowRoot)return!1;var t=(0,o["default"])(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot};var r,o=(r=n(89778))&&r.__esModule?r:{"default":r}},42156:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,o["default"])(e),n=t.overflow,r=t.overflowX,i=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+i+r)};var r,o=(r=n(82020))&&r.__esModule?r:{"default":r}},69183:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return["table","td","th"].indexOf((0,o["default"])(e))>=0};var r,o=(r=n(38012))&&r.__esModule?r:{"default":r}},66469:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function c(e,t){var n;void 0===t&&(t=[]);var u=(0,r["default"])(e),s=u===(null==(n=e.ownerDocument)?void 0:n.body),l=(0,i["default"])(u),f=s?[l].concat(l.visualViewport||[],(0,a["default"])(u)?u:[]):u,d=t.concat(f);return s?d:d.concat(c((0,o["default"])(f)))};var r=u(n(92098)),o=u(n(23470)),i=u(n(89778)),a=u(n(42156));function u(e){return e&&e.__esModule?e:{"default":e}}},54945:function(e,t){"use strict";t.__esModule=!0,t.modifierPhases=t.afterWrite=t.write=t.beforeWrite=t.afterMain=t.main=t.beforeMain=t.afterRead=t.read=t.beforeRead=t.placements=t.variationPlacements=t.reference=t.popper=t.viewport=t.clippingParents=t.end=t.start=t.basePlacements=t.auto=t.left=t.right=t.bottom=t.top=void 0;t.top="top";var n="bottom";t.bottom=n;var r="right";t.right=r;var o="left";t.left=o;var i="auto";t.auto=i;var a=["top",n,r,o];t.basePlacements=a;var u="start";t.start=u;var c="end";t.end=c;t.clippingParents="clippingParents";t.viewport="viewport";t.popper="popper";t.reference="reference";var s=a.reduce((function(e,t){return e.concat([t+"-"+u,t+"-"+c])}),[]);t.variationPlacements=s;var l=[].concat(a,[i]).reduce((function(e,t){return e.concat([t,t+"-"+u,t+"-"+c])}),[]);t.placements=l;var f="beforeRead";t.beforeRead=f;var d="read";t.read=d;var p="afterRead";t.afterRead=p;var h="beforeMain";t.beforeMain=h;var v="main";t.main=v;var m="afterMain";t.afterMain=m;var g="beforeWrite";t.beforeWrite=g;var y="write";t.write=y;var b="afterWrite";t.afterWrite=b;var _=[f,d,p,h,v,m,g,y,b];t.modifierPhases=_},11613:function(e,t,n){"use strict";t.__esModule=!0;var r={popperGenerator:!0,detectOverflow:!0,createPopperBase:!0,createPopper:!0,createPopperLite:!0};t.createPopperLite=t.createPopper=t.createPopperBase=t.detectOverflow=t.popperGenerator=void 0;var o=n(54945);Object.keys(o).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(r,e)||e in t&&t[e]===o[e]||(t[e]=o[e]))}));var i=n(15461);Object.keys(i).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(r,e)||e in t&&t[e]===i[e]||(t[e]=i[e]))}));var a=n(33407);t.popperGenerator=a.popperGenerator,t.detectOverflow=a.detectOverflow,t.createPopperBase=a.createPopper;var u=n(15172);t.createPopper=u.createPopper;var c=n(15327);t.createPopperLite=c.createPopper},1803:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var r,o=(r=n(38012))&&r.__esModule?r:{"default":r},i=n(31966);var a={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},a=t.elements[e];(0,i.isHTMLElement)(a)&&(0,o["default"])(a)&&(Object.assign(a.style,n),Object.keys(r).forEach((function(e){var t=r[e];!1===t?a.removeAttribute(e):a.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var r=t.elements[e],a=t.attributes[e]||{},u=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});(0,i.isHTMLElement)(r)&&(0,o["default"])(r)&&(Object.assign(r.style,u),Object.keys(a).forEach((function(e){r.removeAttribute(e)})))}))}},requires:["computeStyles"]};t["default"]=a},35838:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var r=d(n(78044)),o=d(n(52089)),i=d(n(41858)),a=d(n(54484)),u=d(n(99840)),c=d(n(51520)),s=d(n(72882)),l=d(n(8415)),f=n(54945);n(31966);function d(e){return e&&e.__esModule?e:{"default":e}}var p=function(e,t){return e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e,(0,s["default"])("number"!=typeof e?e:(0,l["default"])(e,f.basePlacements))};var h={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,i=e.name,s=e.options,l=n.elements.arrow,d=n.modifiersData.popperOffsets,h=(0,r["default"])(n.placement),v=(0,u["default"])(h),m=[f.left,f.right].indexOf(h)>=0?"height":"width";if(l&&d){var g=p(s.padding,n),y=(0,o["default"])(l),b="y"===v?f.top:f.left,_="y"===v?f.bottom:f.right,w=n.rects.reference[m]+n.rects.reference[v]-d[v]-n.rects.popper[m],x=d[v]-n.rects.reference[v],E=(0,a["default"])(l),S=E?"y"===v?E.clientHeight||0:E.clientWidth||0:0,C=w/2-x/2,N=g[b],O=S-y[m]-g[_],k=S/2-y[m]/2+C,M=(0,c["default"])(N,k,O),A=v;n.modifiersData[i]=((t={})[A]=M,t.centerOffset=M-k,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&(0,i["default"])(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};t["default"]=h},42569:function(e,t,n){"use strict";t.__esModule=!0,t.mapToStyles=d,t["default"]=void 0;var r=n(54945),o=l(n(54484)),i=l(n(89778)),a=l(n(36e3)),u=l(n(82020)),c=l(n(78044)),s=n(52209);function l(e){return e&&e.__esModule?e:{"default":e}}var f={top:"auto",right:"auto",bottom:"auto",left:"auto"};function d(e){var t,n=e.popper,c=e.popperRect,l=e.placement,d=e.offsets,p=e.position,h=e.gpuAcceleration,v=e.adaptive,m=e.roundOffsets,g=!0===m?function(e){var t=e.x,n=e.y,r=window.devicePixelRatio||1;return{x:(0,s.round)((0,s.round)(t*r)/r)||0,y:(0,s.round)((0,s.round)(n*r)/r)||0}}(d):"function"==typeof m?m(d):d,y=g.x,b=void 0===y?0:y,_=g.y,w=void 0===_?0:_,x=d.hasOwnProperty("x"),E=d.hasOwnProperty("y"),S=r.left,C=r.top,N=window;if(v){var O=(0,o["default"])(n),k="clientHeight",M="clientWidth";O===(0,i["default"])(n)&&(O=(0,a["default"])(n),"static"!==(0,u["default"])(O).position&&(k="scrollHeight",M="scrollWidth")),O=O,l===r.top&&(C=r.bottom,w-=O[k]-c.height,w*=h?1:-1),l===r.left&&(S=r.right,b-=O[M]-c.width,b*=h?1:-1)}var A,T=Object.assign({position:p},v&&f);return h?Object.assign({},T,((A={})[C]=E?"0":"",A[S]=x?"0":"",A.transform=(N.devicePixelRatio||1)<2?"translate("+b+"px, "+w+"px)":"translate3d("+b+"px, "+w+"px, 0)",A)):Object.assign({},T,((t={})[C]=E?w+"px":"",t[S]=x?b+"px":"",t.transform="",t))}var p={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,r=n.gpuAcceleration,o=void 0===r||r,i=n.adaptive,a=void 0===i||i,u=n.roundOffsets,s=void 0===u||u,l={placement:(0,c["default"])(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:o};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,d(Object.assign({},l,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:a,roundOffsets:s})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,d(Object.assign({},l,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:s})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}};t["default"]=p},84886:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var r,o=(r=n(89778))&&r.__esModule?r:{"default":r};var i={passive:!0};var a={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,n=e.instance,r=e.options,a=r.scroll,u=void 0===a||a,c=r.resize,s=void 0===c||c,l=(0,o["default"])(t.elements.popper),f=[].concat(t.scrollParents.reference,t.scrollParents.popper);return u&&f.forEach((function(e){e.addEventListener("scroll",n.update,i)})),s&&l.addEventListener("resize",n.update,i),function(){u&&f.forEach((function(e){e.removeEventListener("scroll",n.update,i)})),s&&l.removeEventListener("resize",n.update,i)}},data:{}};t["default"]=a},75306:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var r=l(n(21784)),o=l(n(78044)),i=l(n(10333)),a=l(n(45073)),u=l(n(9118)),c=n(54945),s=l(n(7938));function l(e){return e&&e.__esModule?e:{"default":e}}var f={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,l=e.name;if(!t.modifiersData[l]._skip){for(var f=n.mainAxis,d=void 0===f||f,p=n.altAxis,h=void 0===p||p,v=n.fallbackPlacements,m=n.padding,g=n.boundary,y=n.rootBoundary,b=n.altBoundary,_=n.flipVariations,w=void 0===_||_,x=n.allowedAutoPlacements,E=t.options.placement,S=(0,o["default"])(E),C=v||(S===E||!w?[(0,r["default"])(E)]:function(e){if((0,o["default"])(e)===c.auto)return[];var t=(0,r["default"])(e);return[(0,i["default"])(e),t,(0,i["default"])(t)]}(E)),N=[E].concat(C).reduce((function(e,n){return e.concat((0,o["default"])(n)===c.auto?(0,u["default"])(t,{placement:n,boundary:g,rootBoundary:y,padding:m,flipVariations:w,allowedAutoPlacements:x}):n)}),[]),O=t.rects.reference,k=t.rects.popper,M=new Map,A=!0,T=N[0],I=0;I=0,j=B?"width":"height",R=(0,a["default"])(t,{placement:P,boundary:g,rootBoundary:y,altBoundary:b,padding:m}),D=B?L?c.right:c.left:L?c.bottom:c.top;O[j]>k[j]&&(D=(0,r["default"])(D));var F=(0,r["default"])(D),K=[];if(d&&K.push(R[V]<=0),h&&K.push(R[D]<=0,R[F]<=0),K.every((function(e){return e}))){T=P,A=!1;break}M.set(P,K)}if(A)for(var z=function(e){var t=N.find((function(t){var n=M.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return T=t,"break"},Y=w?3:1;Y>0;Y--){if("break"===z(Y))break}t.placement!==T&&(t.modifiersData[l]._skip=!0,t.placement=T,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};t["default"]=f},91263:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var r,o=n(54945),i=(r=n(45073))&&r.__esModule?r:{"default":r};function a(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function u(e){return[o.top,o.right,o.bottom,o.left].some((function(t){return e[t]>=0}))}var c={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,c=t.modifiersData.preventOverflow,s=(0,i["default"])(t,{elementContext:"reference"}),l=(0,i["default"])(t,{altBoundary:!0}),f=a(s,r),d=a(l,o,c),p=u(f),h=u(d);t.modifiersData[n]={referenceClippingOffsets:f,popperEscapeOffsets:d,isReferenceHidden:p,hasPopperEscaped:h},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":h})}};t["default"]=c},15461:function(e,t,n){"use strict";t.__esModule=!0,t.preventOverflow=t.popperOffsets=t.offset=t.hide=t.flip=t.eventListeners=t.computeStyles=t.arrow=t.applyStyles=void 0;var r=d(n(1803));t.applyStyles=r["default"];var o=d(n(35838));t.arrow=o["default"];var i=d(n(42569));t.computeStyles=i["default"];var a=d(n(84886));t.eventListeners=a["default"];var u=d(n(75306));t.flip=u["default"];var c=d(n(91263));t.hide=c["default"];var s=d(n(36777));t.offset=s["default"];var l=d(n(19860));t.popperOffsets=l["default"];var f=d(n(90992));function d(e){return e&&e.__esModule?e:{"default":e}}t.preventOverflow=f["default"]},36777:function(e,t,n){"use strict";t.__esModule=!0,t.distanceAndSkiddingToXY=a,t["default"]=void 0;var r,o=(r=n(78044))&&r.__esModule?r:{"default":r},i=n(54945);function a(e,t,n){var r=(0,o["default"])(e),a=[i.left,i.top].indexOf(r)>=0?-1:1,u="function"==typeof n?n(Object.assign({},t,{placement:e})):n,c=u[0],s=u[1];return c=c||0,s=(s||0)*a,[i.left,i.right].indexOf(r)>=0?{x:s,y:c}:{x:c,y:s}}var u={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.offset,u=void 0===o?[0,0]:o,c=i.placements.reduce((function(e,n){return e[n]=a(n,t.rects,u),e}),{}),s=c[t.placement],l=s.x,f=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=f),t.modifiersData[r]=c}};t["default"]=u},19860:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var r,o=(r=n(89731))&&r.__esModule?r:{"default":r};var i={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=(0,o["default"])({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}};t["default"]=i},90992:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var r=n(54945),o=h(n(78044)),i=h(n(99840)),a=h(n(80776)),u=h(n(51520)),c=h(n(52089)),s=h(n(54484)),l=h(n(45073)),f=h(n(7938)),d=h(n(9775)),p=n(52209);function h(e){return e&&e.__esModule?e:{"default":e}}var v={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,h=e.name,v=n.mainAxis,m=void 0===v||v,g=n.altAxis,y=void 0!==g&&g,b=n.boundary,_=n.rootBoundary,w=n.altBoundary,x=n.padding,E=n.tether,S=void 0===E||E,C=n.tetherOffset,N=void 0===C?0:C,O=(0,l["default"])(t,{boundary:b,rootBoundary:_,padding:x,altBoundary:w}),k=(0,o["default"])(t.placement),M=(0,f["default"])(t.placement),A=!M,T=(0,i["default"])(k),I=(0,a["default"])(T),P=t.modifiersData.popperOffsets,V=t.rects.reference,L=t.rects.popper,B="function"==typeof N?N(Object.assign({},t.rects,{placement:t.placement})):N,j={x:0,y:0};if(P){if(m||y){var R="y"===T?r.top:r.left,D="y"===T?r.bottom:r.right,F="y"===T?"height":"width",K=P[T],z=P[T]+O[R],Y=P[T]-O[D],U=S?-L[F]/2:0,H=M===r.start?V[F]:L[F],W=M===r.start?-L[F]:-V[F],$=t.elements.arrow,G=S&&$?(0,c["default"])($):{width:0,height:0},q=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:(0,d["default"])(),X=q[R],Q=q[D],Z=(0,u["default"])(0,V[F],G[F]),J=A?V[F]/2-U-Z-X-B:H-Z-X-B,ee=A?-V[F]/2+U+Z+Q+B:W+Z+Q+B,te=t.elements.arrow&&(0,s["default"])(t.elements.arrow),ne=te?"y"===T?te.clientTop||0:te.clientLeft||0:0,re=t.modifiersData.offset?t.modifiersData.offset[t.placement][T]:0,oe=P[T]+J-re-ne,ie=P[T]+ee-re;if(m){var ae=(0,u["default"])(S?(0,p.min)(z,oe):z,K,S?(0,p.max)(Y,ie):Y);P[T]=ae,j[T]=ae-K}if(y){var ue="x"===T?r.top:r.left,ce="x"===T?r.bottom:r.right,se=P[I],le=se+O[ue],fe=se-O[ce],de=(0,u["default"])(S?(0,p.min)(le,oe):le,se,S?(0,p.max)(fe,ie):fe);P[I]=de,j[I]=de-se}}t.modifiersData[h]=j}},requiresIfExists:["offset"]};t["default"]=v},15327:function(e,t,n){"use strict";t.__esModule=!0,t.defaultModifiers=t.createPopper=void 0;var r=n(33407);t.popperGenerator=r.popperGenerator,t.detectOverflow=r.detectOverflow;var o=c(n(84886)),i=c(n(19860)),a=c(n(42569)),u=c(n(1803));function c(e){return e&&e.__esModule?e:{"default":e}}var s=[o["default"],i["default"],a["default"],u["default"]];t.defaultModifiers=s;var l=(0,r.popperGenerator)({defaultModifiers:s});t.createPopper=l},15172:function(e,t,n){"use strict";t.__esModule=!0;var r={createPopper:!0,createPopperLite:!0,defaultModifiers:!0,popperGenerator:!0,detectOverflow:!0};t.defaultModifiers=t.createPopperLite=t.createPopper=void 0;var o=n(33407);t.popperGenerator=o.popperGenerator,t.detectOverflow=o.detectOverflow;var i=m(n(84886)),a=m(n(19860)),u=m(n(42569)),c=m(n(1803)),s=m(n(36777)),l=m(n(75306)),f=m(n(90992)),d=m(n(35838)),p=m(n(91263)),h=n(15327);t.createPopperLite=h.createPopper;var v=n(15461);function m(e){return e&&e.__esModule?e:{"default":e}}Object.keys(v).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(r,e)||e in t&&t[e]===v[e]||(t[e]=v[e]))}));var g=[i["default"],a["default"],u["default"],c["default"],s["default"],l["default"],f["default"],d["default"],p["default"]];t.defaultModifiers=g;var y=(0,o.popperGenerator)({defaultModifiers:g});t.createPopperLite=t.createPopper=y},9118:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t){void 0===t&&(t={});var n=t,u=n.placement,c=n.boundary,s=n.rootBoundary,l=n.padding,f=n.flipVariations,d=n.allowedAutoPlacements,p=void 0===d?o.placements:d,h=(0,r["default"])(u),v=h?f?o.variationPlacements:o.variationPlacements.filter((function(e){return(0,r["default"])(e)===h})):o.basePlacements,m=v.filter((function(e){return p.indexOf(e)>=0}));0===m.length&&(m=v);var g=m.reduce((function(t,n){return t[n]=(0,i["default"])(e,{placement:n,boundary:c,rootBoundary:s,padding:l})[(0,a["default"])(n)],t}),{});return Object.keys(g).sort((function(e,t){return g[e]-g[t]}))};var r=u(n(7938)),o=n(54945),i=u(n(45073)),a=u(n(78044));function u(e){return e&&e.__esModule?e:{"default":e}}},89731:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t,n=e.reference,u=e.element,c=e.placement,s=c?(0,r["default"])(c):null,l=c?(0,o["default"])(c):null,f=n.x+n.width/2-u.width/2,d=n.y+n.height/2-u.height/2;switch(s){case a.top:t={x:f,y:n.y-u.height};break;case a.bottom:t={x:f,y:n.y+n.height};break;case a.right:t={x:n.x+n.width,y:d};break;case a.left:t={x:n.x-u.width,y:d};break;default:t={x:n.x,y:n.y}}var p=s?(0,i["default"])(s):null;if(null!=p){var h="y"===p?"height":"width";switch(l){case a.start:t[p]=t[p]-(n[h]/2-u[h]/2);break;case a.end:t[p]=t[p]+(n[h]/2-u[h]/2)}}return t};var r=u(n(78044)),o=u(n(7938)),i=u(n(99840)),a=n(54945);function u(e){return e&&e.__esModule?e:{"default":e}}},16936:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){var t;return function(){return t||(t=new Promise((function(n){Promise.resolve().then((function(){t=undefined,n(e())}))}))),t}}},45073:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t){void 0===t&&(t={});var n=t,d=n.placement,p=void 0===d?e.placement:d,h=n.boundary,v=void 0===h?c.clippingParents:h,m=n.rootBoundary,g=void 0===m?c.viewport:m,y=n.elementContext,b=void 0===y?c.popper:y,_=n.altBoundary,w=void 0!==_&&_,x=n.padding,E=void 0===x?0:x,S=(0,l["default"])("number"!=typeof E?E:(0,f["default"])(E,c.basePlacements)),C=b===c.popper?c.reference:c.popper,N=e.elements.reference,O=e.rects.popper,k=e.elements[w?C:b],M=(0,o["default"])((0,s.isElement)(k)?k:k.contextElement||(0,i["default"])(e.elements.popper),v,g),A=(0,r["default"])(N),T=(0,a["default"])({reference:A,element:O,strategy:"absolute",placement:p}),I=(0,u["default"])(Object.assign({},O,T)),P=b===c.popper?I:A,V={top:M.top-P.top+S.top,bottom:P.bottom-M.bottom+S.bottom,left:M.left-P.left+S.left,right:P.right-M.right+S.right},L=e.modifiersData.offset;if(b===c.popper&&L){var B=L[p];Object.keys(V).forEach((function(e){var t=[c.right,c.bottom].indexOf(e)>=0?1:-1,n=[c.top,c.bottom].indexOf(e)>=0?"y":"x";V[e]+=B[n]*t}))}return V};var r=d(n(87916)),o=d(n(70846)),i=d(n(36e3)),a=d(n(89731)),u=d(n(77276)),c=n(54945),s=n(31966),l=d(n(72882)),f=d(n(8415));function d(e){return e&&e.__esModule?e:{"default":e}}},8415:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}},50121:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r=0?"x":"y"}},21784:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.replace(/left|right|bottom|top/g,(function(e){return n[e]}))};var n={left:"right",right:"left",bottom:"top",top:"bottom"}},10333:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.replace(/start|end/g,(function(e){return n[e]}))};var n={start:"end",end:"start"}},7938:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.split("-")[1]}},52209:function(e,t){"use strict";t.__esModule=!0,t.round=t.min=t.max=void 0;var n=Math.max;t.max=n;var r=Math.min;t.min=r;var o=Math.round;t.round=o},5495:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){var t=e.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{});return Object.keys(t).map((function(e){return t[e]}))}},72882:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return Object.assign({},(0,o["default"])(),e)};var r,o=(r=n(9775))&&r.__esModule?r:{"default":r}},7183:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=function(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}(e);return r.modifierPhases.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])};var r=n(54945)},77276:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}},20675:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e,t){var n=new Set;return e.filter((function(e){var r=t(e);if(!n.has(r))return n.add(r),!0}))}},11026:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){e.forEach((function(t){Object.keys(t).forEach((function(n){switch(n){case"name":t.name;break;case"enabled":t.enabled;case"phase":o.modifierPhases.indexOf(t.phase);break;case"fn":t.fn;break;case"effect":t.effect;break;case"requires":Array.isArray(t.requires);break;case"requiresIfExists":Array.isArray(t.requiresIfExists)}t.requires&&t.requires.forEach((function(t){e.find((function(e){return e.name===t}))}))}))}))};(r=n(50121))&&r.__esModule;var r,o=n(54945)},51520:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t,n){return(0,r.max)(e,(0,r.min)(t,n))};var r=n(52209)},13686:function(e){"use strict";e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},85369:function(e,t,n){"use strict";var r=n(88711);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},14281:function(e,t,n){"use strict";var r=n(53414),o=n(96093),i=n(96452),a=r("unscopables"),u=Array.prototype;u[a]==undefined&&i.f(u,a,{configurable:!0,value:o(null)}),e.exports=function(e){u[a][e]=!0}},47103:function(e,t,n){"use strict";var r=n(34444).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},2273:function(e){"use strict";e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},14860:function(e,t,n){"use strict";var r=n(88711);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},17811:function(e){"use strict";e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},73203:function(e,t,n){"use strict";var r,o=n(17811),i=n(67738),a=n(179),u=n(88711),c=n(18632),s=n(54781),l=n(21413),f=n(77219),d=n(96452).f,p=n(92608),h=n(77715),v=n(53414),m=n(88340),g=a.Int8Array,y=g&&g.prototype,b=a.Uint8ClampedArray,_=b&&b.prototype,w=g&&p(g),x=y&&p(y),E=Object.prototype,S=E.isPrototypeOf,C=v("toStringTag"),N=m("TYPED_ARRAY_TAG"),O=o&&!!h&&"Opera"!==s(a.opera),k=!1,M={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},A={BigInt64Array:8,BigUint64Array:8},T=function(e){if(!u(e))return!1;var t=s(e);return"DataView"===t||c(M,t)||c(A,t)},I=function(e){if(!u(e))return!1;var t=s(e);return c(M,t)||c(A,t)};for(r in M)a[r]||(O=!1);if((!O||"function"!=typeof w||w===Function.prototype)&&(w=function(){throw TypeError("Incorrect invocation")},O))for(r in M)a[r]&&h(a[r],w);if((!O||!x||x===E)&&(x=w.prototype,O))for(r in M)a[r]&&h(a[r].prototype,x);if(O&&p(_)!==x&&h(_,x),i&&!c(x,C))for(r in k=!0,d(x,C,{get:function(){return u(this)?this[N]:undefined}}),M)a[r]&&l(a[r],N,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:O,TYPED_ARRAY_TAG:k&&N,aTypedArray:function(e){if(I(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(h){if(S.call(w,e))return e}else for(var t in M)if(c(M,r)){var n=a[t];if(n&&(e===n||S.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(i){if(n)for(var r in M){var o=a[r];o&&c(o.prototype,e)&&delete o.prototype[e]}x[e]&&!n||f(x,e,n?t:O&&y[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var r,o;if(i){if(h){if(n)for(r in M)(o=a[r])&&c(o,e)&&delete o[e];if(w[e]&&!n)return;try{return f(w,e,n?t:O&&g[e]||t)}catch(u){}}for(r in M)!(o=a[r])||o[e]&&!n||f(o,e,t)}},isView:T,isTypedArray:I,TypedArray:w,TypedArrayPrototype:x}},93071:function(e,t,n){"use strict";var r=n(179),o=n(67738),i=n(17811),a=n(21413),u=n(5289),c=n(84921),s=n(2273),l=n(44028),f=n(27842),d=n(66659),p=n(63408),h=n(92608),v=n(77715),m=n(75604).f,g=n(96452).f,y=n(24115),b=n(81978),_=n(28076),w=_.get,x=_.set,E="ArrayBuffer",S="DataView",C="Wrong index",N=r.ArrayBuffer,O=N,k=r.DataView,M=k&&k.prototype,A=Object.prototype,T=r.RangeError,I=p.pack,P=p.unpack,V=function(e){return[255&e]},L=function(e){return[255&e,e>>8&255]},B=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},j=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},R=function(e){return I(e,23,4)},D=function(e){return I(e,52,8)},F=function(e,t){g(e.prototype,t,{get:function(){return w(this)[t]}})},K=function(e,t,n,r){var o=d(n),i=w(e);if(o+t>i.byteLength)throw T(C);var a=w(i.buffer).bytes,u=o+i.byteOffset,c=a.slice(u,u+t);return r?c:c.reverse()},z=function(e,t,n,r,o,i){var a=d(n),u=w(e);if(a+t>u.byteLength)throw T(C);for(var c=w(u.buffer).bytes,s=a+u.byteOffset,l=r(+o),f=0;fW;)(Y=H[W++])in O||a(O,Y,N[Y]);U.constructor=O}v&&h(M)!==A&&v(M,A);var $=new k(new O(2)),G=M.setInt8;$.setInt8(0,2147483648),$.setInt8(1,2147483649),!$.getInt8(0)&&$.getInt8(1)||u(M,{setInt8:function(e,t){G.call(this,e,t<<24>>24)},setUint8:function(e,t){G.call(this,e,t<<24>>24)}},{unsafe:!0})}else O=function(e){s(this,O,E);var t=d(e);x(this,{bytes:y.call(new Array(t),0),byteLength:t}),o||(this.byteLength=t)},k=function(e,t,n){s(this,k,S),s(e,O,S);var r=w(e).byteLength,i=l(t);if(i<0||i>r)throw T("Wrong offset");if(i+(n=n===undefined?r-i:f(n))>r)throw T("Wrong length");x(this,{buffer:e,byteLength:n,byteOffset:i}),o||(this.buffer=e,this.byteLength=n,this.byteOffset=i)},o&&(F(O,"byteLength"),F(k,"buffer"),F(k,"byteLength"),F(k,"byteOffset")),u(k.prototype,{getInt8:function(e){return K(this,1,e)[0]<<24>>24},getUint8:function(e){return K(this,1,e)[0]},getInt16:function(e){var t=K(this,2,e,arguments.length>1?arguments[1]:undefined);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=K(this,2,e,arguments.length>1?arguments[1]:undefined);return t[1]<<8|t[0]},getInt32:function(e){return j(K(this,4,e,arguments.length>1?arguments[1]:undefined))},getUint32:function(e){return j(K(this,4,e,arguments.length>1?arguments[1]:undefined))>>>0},getFloat32:function(e){return P(K(this,4,e,arguments.length>1?arguments[1]:undefined),23)},getFloat64:function(e){return P(K(this,8,e,arguments.length>1?arguments[1]:undefined),52)},setInt8:function(e,t){z(this,1,e,V,t)},setUint8:function(e,t){z(this,1,e,V,t)},setInt16:function(e,t){z(this,2,e,L,t,arguments.length>2?arguments[2]:undefined)},setUint16:function(e,t){z(this,2,e,L,t,arguments.length>2?arguments[2]:undefined)},setInt32:function(e,t){z(this,4,e,B,t,arguments.length>2?arguments[2]:undefined)},setUint32:function(e,t){z(this,4,e,B,t,arguments.length>2?arguments[2]:undefined)},setFloat32:function(e,t){z(this,4,e,R,t,arguments.length>2?arguments[2]:undefined)},setFloat64:function(e,t){z(this,8,e,D,t,arguments.length>2?arguments[2]:undefined)}});b(O,E),b(k,S),e.exports={ArrayBuffer:O,DataView:k}},92475:function(e,t,n){"use strict";var r=n(6289),o=n(13292),i=n(27842),a=Math.min;e.exports=[].copyWithin||function(e,t){var n=r(this),u=i(n.length),c=o(e,u),s=o(t,u),l=arguments.length>2?arguments[2]:undefined,f=a((l===undefined?u:o(l,u))-s,u-c),d=1;for(s0;)s in n?n[c]=n[s]:delete n[c],c+=d,s+=d;return n}},24115:function(e,t,n){"use strict";var r=n(6289),o=n(13292),i=n(27842);e.exports=function(e){for(var t=r(this),n=i(t.length),a=arguments.length,u=o(a>1?arguments[1]:undefined,n),c=a>2?arguments[2]:undefined,s=c===undefined?n:o(c,n);s>u;)t[u++]=e;return t}},70091:function(e,t,n){"use strict";var r=n(77118).forEach,o=n(45944)("forEach");e.exports=o?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}},75372:function(e,t,n){"use strict";var r=n(57386),o=n(6289),i=n(36288),a=n(76774),u=n(27842),c=n(79651),s=n(29863);e.exports=function(e){var t,n,l,f,d,p,h=o(e),v="function"==typeof this?this:Array,m=arguments.length,g=m>1?arguments[1]:undefined,y=g!==undefined,b=s(h),_=0;if(y&&(g=r(g,m>2?arguments[2]:undefined,2)),b==undefined||v==Array&&a(b))for(n=new v(t=u(h.length));t>_;_++)p=y?g(h[_],_):h[_],c(n,_,p);else for(d=(f=b.call(h)).next,n=new v;!(l=d.call(f)).done;_++)p=y?i(f,g,[l.value,_],!0):l.value,c(n,_,p);return n.length=_,n}},53454:function(e,t,n){"use strict";var r=n(94789),o=n(27842),i=n(13292),a=function(e){return function(t,n,a){var u,c=r(t),s=o(c.length),l=i(a,s);if(e&&n!=n){for(;s>l;)if((u=c[l++])!=u)return!0}else for(;s>l;l++)if((e||l in c)&&c[l]===n)return e||l||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},77118:function(e,t,n){"use strict";var r=n(57386),o=n(46317),i=n(6289),a=n(27842),u=n(12384),c=[].push,s=function(e){var t=1==e,n=2==e,s=3==e,l=4==e,f=6==e,d=7==e,p=5==e||f;return function(h,v,m,g){for(var y,b,_=i(h),w=o(_),x=r(v,m,3),E=a(w.length),S=0,C=g||u,N=t?C(h,E):n||d?C(h,0):undefined;E>S;S++)if((p||S in w)&&(b=x(y=w[S],S,_),e))if(t)N[S]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return S;case 2:c.call(N,y)}else switch(e){case 4:return!1;case 7:c.call(N,y)}return f?-1:s||l?l:N}};e.exports={forEach:s(0),map:s(1),filter:s(2),some:s(3),every:s(4),find:s(5),findIndex:s(6),filterOut:s(7)}},9819:function(e,t,n){"use strict";var r=n(94789),o=n(44028),i=n(27842),a=n(45944),u=Math.min,c=[].lastIndexOf,s=!!c&&1/[1].lastIndexOf(1,-0)<0,l=a("lastIndexOf"),f=s||!l;e.exports=f?function(e){if(s)return c.apply(this,arguments)||0;var t=r(this),n=i(t.length),a=n-1;for(arguments.length>1&&(a=u(a,o(arguments[1]))),a<0&&(a=n+a);a>=0;a--)if(a in t&&t[a]===e)return a||0;return-1}:c},16684:function(e,t,n){"use strict";var r=n(84921),o=n(53414),i=n(32728),a=o("species");e.exports=function(e){return i>=51||!r((function(){var t=[];return(t.constructor={})[a]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},45944:function(e,t,n){"use strict";var r=n(84921);e.exports=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))}},59878:function(e,t,n){"use strict";var r=n(13686),o=n(6289),i=n(46317),a=n(27842),u=function(e){return function(t,n,u,c){r(n);var s=o(t),l=i(s),f=a(s.length),d=e?f-1:0,p=e?-1:1;if(u<2)for(;;){if(d in l){c=l[d],d+=p;break}if(d+=p,e?d<0:f<=d)throw TypeError("Reduce of empty array with no initial value")}for(;e?d>=0:f>d;d+=p)d in l&&(c=n(c,l[d],d,s));return c}};e.exports={left:u(!1),right:u(!0)}},12384:function(e,t,n){"use strict";var r=n(88711),o=n(1897),i=n(53414)("species");e.exports=function(e,t){var n;return o(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!o(n.prototype)?r(n)&&null===(n=n[i])&&(n=undefined):n=undefined),new(n===undefined?Array:n)(0===t?0:t)}},36288:function(e,t,n){"use strict";var r=n(14860),o=n(16284);e.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(a){throw o(e),a}}},33652:function(e,t,n){"use strict";var r=n(53414)("iterator"),o=!1;try{var i=0,a={next:function(){return{done:!!i++}},"return":function(){o=!0}};a[r]=function(){return this},Array.from(a,(function(){throw 2}))}catch(u){}e.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var i={};i[r]=function(){return{next:function(){return{done:n=!0}}}},e(i)}catch(u){}return n}},90726:function(e){"use strict";var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},54781:function(e,t,n){"use strict";var r=n(97099),o=n(90726),i=n(53414)("toStringTag"),a="Arguments"==o(function(){return arguments}());e.exports=r?o:function(e){var t,n,r;return e===undefined?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(n){}}(t=Object(e),i))?n:a?o(t):"Object"==(r=o(t))&&"function"==typeof t.callee?"Arguments":r}},4721:function(e,t,n){"use strict";var r=n(96452).f,o=n(96093),i=n(5289),a=n(57386),u=n(2273),c=n(8362),s=n(54981),l=n(40548),f=n(67738),d=n(21419).fastKey,p=n(28076),h=p.set,v=p.getterFor;e.exports={getConstructor:function(e,t,n,s){var l=e((function(e,r){u(e,l,t),h(e,{type:t,index:o(null),first:undefined,last:undefined,size:0}),f||(e.size=0),r!=undefined&&c(r,e[s],{that:e,AS_ENTRIES:n})})),p=v(t),m=function(e,t,n){var r,o,i=p(e),a=g(e,t);return a?a.value=n:(i.last=a={index:o=d(t,!0),key:t,value:n,previous:r=i.last,next:undefined,removed:!1},i.first||(i.first=a),r&&(r.next=a),f?i.size++:e.size++,"F"!==o&&(i.index[o]=a)),e},g=function(e,t){var n,r=p(e),o=d(t);if("F"!==o)return r.index[o];for(n=r.first;n;n=n.next)if(n.key==t)return n};return i(l.prototype,{clear:function(){for(var e=p(this),t=e.index,n=e.first;n;)n.removed=!0,n.previous&&(n.previous=n.previous.next=undefined),delete t[n.index],n=n.next;e.first=e.last=undefined,f?e.size=0:this.size=0},"delete":function(e){var t=this,n=p(t),r=g(t,e);if(r){var o=r.next,i=r.previous;delete n.index[r.index],r.removed=!0,i&&(i.next=o),o&&(o.previous=i),n.first==r&&(n.first=o),n.last==r&&(n.last=i),f?n.size--:t.size--}return!!r},forEach:function(e){for(var t,n=p(this),r=a(e,arguments.length>1?arguments[1]:undefined,3);t=t?t.next:n.first;)for(r(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!g(this,e)}}),i(l.prototype,n?{get:function(e){var t=g(this,e);return t&&t.value},set:function(e,t){return m(this,0===e?0:e,t)}}:{add:function(e){return m(this,e=0===e?0:e,e)}}),f&&r(l.prototype,"size",{get:function(){return p(this).size}}),l},setStrong:function(e,t,n){var r=t+" Iterator",o=v(t),i=v(r);s(e,t,(function(e,t){h(this,{type:r,target:e,state:o(e),kind:t,last:undefined})}),(function(){for(var e=i(this),t=e.kind,n=e.last;n&&n.removed;)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?"keys"==t?{value:n.key,done:!1}:"values"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=undefined,{value:undefined,done:!0})}),n?"entries":"values",!n,!0),l(t)}}},76568:function(e,t,n){"use strict";var r=n(5289),o=n(21419).getWeakData,i=n(14860),a=n(88711),u=n(2273),c=n(8362),s=n(77118),l=n(18632),f=n(28076),d=f.set,p=f.getterFor,h=s.find,v=s.findIndex,m=0,g=function(e){return e.frozen||(e.frozen=new y)},y=function(){this.entries=[]},b=function(e,t){return h(e.entries,(function(e){return e[0]===t}))};y.prototype={get:function(e){var t=b(this,e);if(t)return t[1]},has:function(e){return!!b(this,e)},set:function(e,t){var n=b(this,e);n?n[1]=t:this.entries.push([e,t])},"delete":function(e){var t=v(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,s){var f=e((function(e,r){u(e,f,t),d(e,{type:t,id:m++,frozen:undefined}),r!=undefined&&c(r,e[s],{that:e,AS_ENTRIES:n})})),h=p(t),v=function(e,t,n){var r=h(e),a=o(i(t),!0);return!0===a?g(r).set(t,n):a[r.id]=n,e};return r(f.prototype,{"delete":function(e){var t=h(this);if(!a(e))return!1;var n=o(e);return!0===n?g(t)["delete"](e):n&&l(n,t.id)&&delete n[t.id]},has:function(e){var t=h(this);if(!a(e))return!1;var n=o(e);return!0===n?g(t).has(e):n&&l(n,t.id)}}),r(f.prototype,n?{get:function(e){var t=h(this);if(a(e)){var n=o(e);return!0===n?g(t).get(e):n?n[t.id]:undefined}},set:function(e,t){return v(this,e,t)}}:{add:function(e){return v(this,e,!0)}}),f}}},20991:function(e,t,n){"use strict";var r=n(99592),o=n(179),i=n(61287),a=n(77219),u=n(21419),c=n(8362),s=n(2273),l=n(88711),f=n(84921),d=n(33652),p=n(81978),h=n(69262);e.exports=function(e,t,n){var v=-1!==e.indexOf("Map"),m=-1!==e.indexOf("Weak"),g=v?"set":"add",y=o[e],b=y&&y.prototype,_=y,w={},x=function(e){var t=b[e];a(b,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(m&&!l(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return m&&!l(e)?undefined:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(m&&!l(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(i(e,"function"!=typeof y||!(m||b.forEach&&!f((function(){(new y).entries().next()})))))_=n.getConstructor(t,e,v,g),u.REQUIRED=!0;else if(i(e,!0)){var E=new _,S=E[g](m?{}:-0,1)!=E,C=f((function(){E.has(1)})),N=d((function(e){new y(e)})),O=!m&&f((function(){for(var e=new y,t=5;t--;)e[g](t,t);return!e.has(-0)}));N||((_=t((function(t,n){s(t,_,e);var r=h(new y,t,_);return n!=undefined&&c(n,r[g],{that:r,AS_ENTRIES:v}),r}))).prototype=b,b.constructor=_),(C||O)&&(x("delete"),x("has"),v&&x("get")),(O||S)&&x(g),m&&b.clear&&delete b.clear}return w[e]=_,r({global:!0,forced:_!=y},w),p(_,e),m||n.setStrong(_,e,v),_}},44121:function(e,t,n){"use strict";var r=n(18632),o=n(1051),i=n(8740),a=n(96452);e.exports=function(e,t){for(var n=o(t),u=a.f,c=i.f,s=0;s"+a+""}},97993:function(e,t,n){"use strict";var r=n(9392).IteratorPrototype,o=n(96093),i=n(28804),a=n(81978),u=n(36617),c=function(){return this};e.exports=function(e,t,n){var s=t+" Iterator";return e.prototype=o(r,{next:i(1,n)}),a(e,s,!1,!0),u[s]=c,e}},21413:function(e,t,n){"use strict";var r=n(67738),o=n(96452),i=n(28804);e.exports=r?function(e,t,n){return o.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},28804:function(e){"use strict";e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},79651:function(e,t,n){"use strict";var r=n(79165),o=n(96452),i=n(28804);e.exports=function(e,t,n){var a=r(t);a in e?o.f(e,a,i(0,n)):e[a]=n}},27051:function(e,t,n){"use strict";var r=n(84921),o=n(61514).start,i=Math.abs,a=Date.prototype,u=a.getTime,c=a.toISOString;e.exports=r((function(){return"0385-07-25T07:06:39.999Z"!=c.call(new Date(-50000000000001))}))||!r((function(){c.call(new Date(NaN))}))?function(){if(!isFinite(u.call(this)))throw RangeError("Invalid time value");var e=this,t=e.getUTCFullYear(),n=e.getUTCMilliseconds(),r=t<0?"-":t>9999?"+":"";return r+o(i(t),r?6:4,0)+"-"+o(e.getUTCMonth()+1,2,0)+"-"+o(e.getUTCDate(),2,0)+"T"+o(e.getUTCHours(),2,0)+":"+o(e.getUTCMinutes(),2,0)+":"+o(e.getUTCSeconds(),2,0)+"."+o(n,3,0)+"Z"}:c},92880:function(e,t,n){"use strict";var r=n(14860),o=n(79165);e.exports=function(e){if("string"!==e&&"number"!==e&&"default"!==e)throw TypeError("Incorrect hint");return o(r(this),"number"!==e)}},54981:function(e,t,n){"use strict";var r=n(99592),o=n(97993),i=n(92608),a=n(77715),u=n(81978),c=n(21413),s=n(77219),l=n(53414),f=n(51684),d=n(36617),p=n(9392),h=p.IteratorPrototype,v=p.BUGGY_SAFARI_ITERATORS,m=l("iterator"),g="keys",y="values",b="entries",_=function(){return this};e.exports=function(e,t,n,l,p,w,x){o(n,t,l);var E,S,C,N=function(e){if(e===p&&T)return T;if(!v&&e in M)return M[e];switch(e){case g:case y:case b:return function(){return new n(this,e)}}return function(){return new n(this)}},O=t+" Iterator",k=!1,M=e.prototype,A=M[m]||M["@@iterator"]||p&&M[p],T=!v&&A||N(p),I="Array"==t&&M.entries||A;if(I&&(E=i(I.call(new e)),h!==Object.prototype&&E.next&&(f||i(E)===h||(a?a(E,h):"function"!=typeof E[m]&&c(E,m,_)),u(E,O,!0,!0),f&&(d[O]=_))),p==y&&A&&A.name!==y&&(k=!0,T=function(){return A.call(this)}),f&&!x||M[m]===T||c(M,m,T),d[t]=T,p)if(S={values:N(y),keys:w?T:N(g),entries:N(b)},x)for(C in S)(v||k||!(C in M))&&s(M,C,S[C]);else r({target:t,proto:!0,forced:v||k},S);return S}},90209:function(e,t,n){"use strict";var r=n(91996),o=n(18632),i=n(42571),a=n(96452).f;e.exports=function(e){var t=r.Symbol||(r.Symbol={});o(t,e)||a(t,e,{value:i.f(e)})}},67738:function(e,t,n){"use strict";var r=n(84921);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},27383:function(e,t,n){"use strict";var r=n(179),o=n(88711),i=r.document,a=o(i)&&o(i.createElement);e.exports=function(e){return a?i.createElement(e):{}}},13745:function(e,t,n){"use strict";var r=n(97285);e.exports=/(?:iphone|ipod|ipad).*applewebkit/i.test(r)},23043:function(e,t,n){"use strict";var r=n(90726),o=n(179);e.exports="process"==r(o.process)},59137:function(e,t,n){"use strict";var r=n(97285);e.exports=/web0s(?!.*chrome)/i.test(r)},97285:function(e,t,n){"use strict";var r=n(44417);e.exports=r("navigator","userAgent")||""},32728:function(e,t,n){"use strict";var r,o,i=n(179),a=n(97285),u=i.process,c=u&&u.versions,s=c&&c.v8;s?o=(r=s.split("."))[0]+r[1]:a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=r[1]),e.exports=o&&+o},89807:function(e){"use strict";e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},99592:function(e,t,n){"use strict";var r=n(179),o=n(8740).f,i=n(21413),a=n(77219),u=n(53753),c=n(44121),s=n(61287);e.exports=function(e,t){var n,l,f,d,p,h=e.target,v=e.global,m=e.stat;if(n=v?r:m?r[h]||u(h,{}):(r[h]||{}).prototype)for(l in t){if(d=t[l],f=e.noTargetGet?(p=o(n,l))&&p.value:n[l],!s(v?l:h+(m?".":"#")+l,e.forced)&&f!==undefined){if(typeof d==typeof f)continue;c(d,f)}(e.sham||f&&f.sham)&&i(d,"sham",!0),a(n,l,d,e)}}},84921:function(e){"use strict";e.exports=function(e){try{return!!e()}catch(t){return!0}}},27167:function(e,t,n){"use strict";n(30660);var r=n(77219),o=n(84921),i=n(53414),a=n(21413),u=i("species"),c=!o((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")})),s="$0"==="a".replace(/./,"$0"),l=i("replace"),f=!!/./[l]&&""===/./[l]("a","$0"),d=!o((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));e.exports=function(e,t,n,l){var p=i(e),h=!o((function(){var t={};return t[p]=function(){return 7},7!=""[e](t)})),v=h&&!o((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[u]=function(){return n},n.flags="",n[p]=/./[p]),n.exec=function(){return t=!0,null},n[p](""),!t}));if(!h||!v||"replace"===e&&(!c||!s||f)||"split"===e&&!d){var m=/./[p],g=n(p,""[e],(function(e,t,n,r,o){return t.exec===RegExp.prototype.exec?h&&!o?{done:!0,value:m.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:s,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),y=g[0],b=g[1];r(String.prototype,e,y),r(RegExp.prototype,p,2==t?function(e,t){return b.call(e,this,t)}:function(e){return b.call(e,this)})}l&&a(RegExp.prototype[p],"sham",!0)}},83632:function(e,t,n){"use strict";var r=n(1897),o=n(27842),i=n(57386);e.exports=function a(e,t,n,u,c,s,l,f){for(var d,p=c,h=0,v=!!l&&i(l,f,3);h0&&r(d))p=a(e,t,d,o(d.length),p,s-1)-1;else{if(p>=9007199254740991)throw TypeError("Exceed the acceptable array length");e[p]=d}p++}h++}return p}},41e3:function(e,t,n){"use strict";var r=n(84921);e.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},57386:function(e,t,n){"use strict";var r=n(13686);e.exports=function(e,t,n){if(r(e),t===undefined)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},27314:function(e,t,n){"use strict";var r=n(13686),o=n(88711),i=[].slice,a={},u=function(e,t,n){if(!(t in a)){for(var r=[],o=0;o]*>)/g,u=/\$([$&'`]|\d{1,2})/g;e.exports=function(e,t,n,c,s,l){var f=n+e.length,d=c.length,p=u;return s!==undefined&&(s=r(s),p=a),i.call(l,p,(function(r,i){var a;switch(i.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(f);case"<":a=s[i.slice(1,-1)];break;default:var u=+i;if(0===u)return r;if(u>d){var l=o(u/10);return 0===l?r:l<=d?c[l-1]===undefined?i.charAt(1):c[l-1]+i.charAt(1):r}a=c[u-1]}return a===undefined?"":a}))}},179:function(e,t,n){"use strict";var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},18632:function(e){"use strict";var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},58825:function(e){"use strict";e.exports={}},63380:function(e,t,n){"use strict";var r=n(179);e.exports=function(e,t){var n=r.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},55780:function(e,t,n){"use strict";var r=n(44417);e.exports=r("document","documentElement")},59807:function(e,t,n){"use strict";var r=n(67738),o=n(84921),i=n(27383);e.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},63408:function(e){"use strict";var t=Math.abs,n=Math.pow,r=Math.floor,o=Math.log,i=Math.LN2;e.exports={pack:function(e,a,u){var c,s,l,f=new Array(u),d=8*u-a-1,p=(1<>1,v=23===a?n(2,-24)-n(2,-77):0,m=e<0||0===e&&1/e<0?1:0,g=0;for((e=t(e))!=e||e===Infinity?(s=e!=e?1:0,c=p):(c=r(o(e)/i),e*(l=n(2,-c))<1&&(c--,l*=2),(e+=c+h>=1?v/l:v*n(2,1-h))*l>=2&&(c++,l/=2),c+h>=p?(s=0,c=p):c+h>=1?(s=(e*l-1)*n(2,a),c+=h):(s=e*n(2,h-1)*n(2,a),c=0));a>=8;f[g++]=255&s,s/=256,a-=8);for(c=c<0;f[g++]=255&c,c/=256,d-=8);return f[--g]|=128*m,f},unpack:function(e,t){var r,o=e.length,i=8*o-t-1,a=(1<>1,c=i-7,s=o-1,l=e[s--],f=127&l;for(l>>=7;c>0;f=256*f+e[s],s--,c-=8);for(r=f&(1<<-c)-1,f>>=-c,c+=t;c>0;r=256*r+e[s],s--,c-=8);if(0===f)f=1-u;else{if(f===a)return r?NaN:l?-Infinity:Infinity;r+=n(2,t),f-=u}return(l?-1:1)*r*n(2,f-t)}}},46317:function(e,t,n){"use strict";var r=n(84921),o=n(90726),i="".split;e.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==o(e)?i.call(e,""):Object(e)}:Object},69262:function(e,t,n){"use strict";var r=n(88711),o=n(77715);e.exports=function(e,t,n){var i,a;return o&&"function"==typeof(i=t.constructor)&&i!==n&&r(a=i.prototype)&&a!==n.prototype&&o(e,a),e}},1306:function(e,t,n){"use strict";var r=n(53252),o=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return o.call(e)}),e.exports=r.inspectSource},21419:function(e,t,n){"use strict";var r=n(58825),o=n(88711),i=n(18632),a=n(96452).f,u=n(88340),c=n(41e3),s=u("meta"),l=0,f=Object.isExtensible||function(){return!0},d=function(e){a(e,s,{value:{objectID:"O"+ ++l,weakData:{}}})},p=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,s)){if(!f(e))return"F";if(!t)return"E";d(e)}return e[s].objectID},getWeakData:function(e,t){if(!i(e,s)){if(!f(e))return!0;if(!t)return!1;d(e)}return e[s].weakData},onFreeze:function(e){return c&&p.REQUIRED&&f(e)&&!i(e,s)&&d(e),e}};r[s]=!0},28076:function(e,t,n){"use strict";var r,o,i,a=n(2900),u=n(179),c=n(88711),s=n(21413),l=n(18632),f=n(53252),d=n(6839),p=n(58825),h=u.WeakMap;if(a){var v=f.state||(f.state=new h),m=v.get,g=v.has,y=v.set;r=function(e,t){return t.facade=e,y.call(v,e,t),t},o=function(e){return m.call(v,e)||{}},i=function(e){return g.call(v,e)}}else{var b=d("state");p[b]=!0,r=function(e,t){return t.facade=e,s(e,b,t),t},o=function(e){return l(e,b)?e[b]:{}},i=function(e){return l(e,b)}}e.exports={set:r,get:o,has:i,enforce:function(e){return i(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!c(t)||(n=o(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},76774:function(e,t,n){"use strict";var r=n(53414),o=n(36617),i=r("iterator"),a=Array.prototype;e.exports=function(e){return e!==undefined&&(o.Array===e||a[i]===e)}},1897:function(e,t,n){"use strict";var r=n(90726);e.exports=Array.isArray||function(e){return"Array"==r(e)}},61287:function(e,t,n){"use strict";var r=n(84921),o=/#|\.prototype\./,i=function(e,t){var n=u[a(e)];return n==s||n!=c&&("function"==typeof t?r(t):!!t)},a=i.normalize=function(e){return String(e).replace(o,".").toLowerCase()},u=i.data={},c=i.NATIVE="N",s=i.POLYFILL="P";e.exports=i},44616:function(e,t,n){"use strict";var r=n(88711),o=Math.floor;e.exports=function(e){return!r(e)&&isFinite(e)&&o(e)===e}},88711:function(e){"use strict";e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},51684:function(e){"use strict";e.exports=!1},45025:function(e,t,n){"use strict";var r=n(88711),o=n(90726),i=n(53414)("match");e.exports=function(e){var t;return r(e)&&((t=e[i])!==undefined?!!t:"RegExp"==o(e))}},8362:function(e,t,n){"use strict";var r=n(14860),o=n(76774),i=n(27842),a=n(57386),u=n(29863),c=n(16284),s=function(e,t){this.stopped=e,this.result=t};e.exports=function(e,t,n){var l,f,d,p,h,v,m,g=n&&n.that,y=!(!n||!n.AS_ENTRIES),b=!(!n||!n.IS_ITERATOR),_=!(!n||!n.INTERRUPTED),w=a(t,g,1+y+_),x=function(e){return l&&c(l),new s(!0,e)},E=function(e){return y?(r(e),_?w(e[0],e[1],x):w(e[0],e[1])):_?w(e,x):w(e)};if(b)l=e;else{if("function"!=typeof(f=u(e)))throw TypeError("Target is not iterable");if(o(f)){for(d=0,p=i(e.length);p>d;d++)if((h=E(e[d]))&&h instanceof s)return h;return new s(!1)}l=f.call(e)}for(v=l.next;!(m=v.call(l)).done;){try{h=E(m.value)}catch(S){throw c(l),S}if("object"==typeof h&&h&&h instanceof s)return h}return new s(!1)}},16284:function(e,t,n){"use strict";var r=n(14860);e.exports=function(e){var t=e["return"];if(t!==undefined)return r(t.call(e)).value}},9392:function(e,t,n){"use strict";var r,o,i,a=n(84921),u=n(92608),c=n(21413),s=n(18632),l=n(53414),f=n(51684),d=l("iterator"),p=!1;[].keys&&("next"in(i=[].keys())?(o=u(u(i)))!==Object.prototype&&(r=o):p=!0);var h=r==undefined||a((function(){var e={};return r[d].call(e)!==e}));h&&(r={}),f&&!h||s(r,d)||c(r,d,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},36617:function(e){"use strict";e.exports={}},64674:function(e){"use strict";var t=Math.expm1,n=Math.exp;e.exports=!t||t(10)>22025.465794806718||t(10)<22025.465794806718||-2e-17!=t(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:n(e)-1}:t},90702:function(e,t,n){"use strict";var r=n(53188),o=Math.abs,i=Math.pow,a=i(2,-52),u=i(2,-23),c=i(2,127)*(2-u),s=i(2,-126);e.exports=Math.fround||function(e){var t,n,i=o(e),l=r(e);return ic||n!=n?l*Infinity:l*n}},36535:function(e){"use strict";var t=Math.log;e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:t(1+e)}},53188:function(e){"use strict";e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},63785:function(e,t,n){"use strict";var r,o,i,a,u,c,s,l,f=n(179),d=n(8740).f,p=n(3350).set,h=n(13745),v=n(59137),m=n(23043),g=f.MutationObserver||f.WebKitMutationObserver,y=f.document,b=f.process,_=f.Promise,w=d(f,"queueMicrotask"),x=w&&w.value;x||(r=function(){var e,t;for(m&&(e=b.domain)&&e.exit();o;){t=o.fn,o=o.next;try{t()}catch(n){throw o?a():i=undefined,n}}i=undefined,e&&e.enter()},h||m||v||!g||!y?_&&_.resolve?(s=_.resolve(undefined),l=s.then,a=function(){l.call(s,r)}):a=m?function(){b.nextTick(r)}:function(){p.call(f,r)}:(u=!0,c=y.createTextNode(""),new g(r).observe(c,{characterData:!0}),a=function(){c.data=u=!u})),e.exports=x||function(e){var t={fn:e,next:undefined};i&&(i.next=t),o||(o=t,a()),i=t}},23287:function(e,t,n){"use strict";var r=n(179);e.exports=r.Promise},72974:function(e,t,n){"use strict";var r=n(23043),o=n(32728),i=n(84921);e.exports=!!Object.getOwnPropertySymbols&&!i((function(){return!Symbol.sham&&(r?38===o:o>37&&o<41)}))},2900:function(e,t,n){"use strict";var r=n(179),o=n(1306),i=r.WeakMap;e.exports="function"==typeof i&&/native code/.test(o(i))},15115:function(e,t,n){"use strict";var r=n(13686),o=function(e){var t,n;this.promise=new e((function(e,r){if(t!==undefined||n!==undefined)throw TypeError("Bad Promise constructor");t=e,n=r})),this.resolve=r(t),this.reject=r(n)};e.exports.f=function(e){return new o(e)}},42386:function(e,t,n){"use strict";var r=n(45025);e.exports=function(e){if(r(e))throw TypeError("The method doesn't accept regular expressions");return e}},87419:function(e,t,n){"use strict";var r=n(179).isFinite;e.exports=Number.isFinite||function(e){return"number"==typeof e&&r(e)}},86710:function(e,t,n){"use strict";var r=n(179),o=n(20017).trim,i=n(65094),a=r.parseFloat,u=1/a(i+"-0")!=-Infinity;e.exports=u?function(e){var t=o(String(e)),n=a(t);return 0===n&&"-"==t.charAt(0)?-0:n}:a},42619:function(e,t,n){"use strict";var r=n(179),o=n(20017).trim,i=n(65094),a=r.parseInt,u=/^[+-]?0[Xx]/,c=8!==a(i+"08")||22!==a(i+"0x16");e.exports=c?function(e,t){var n=o(String(e));return a(n,t>>>0||(u.test(n)?16:10))}:a},18174:function(e,t,n){"use strict";var r=n(67738),o=n(84921),i=n(75224),a=n(32645),u=n(32163),c=n(6289),s=n(46317),l=Object.assign,f=Object.defineProperty;e.exports=!l||o((function(){if(r&&1!==l({b:1},l(f({},"a",{enumerable:!0,get:function(){f(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),o="abcdefghijklmnopqrst";return e[n]=7,o.split("").forEach((function(e){t[e]=e})),7!=l({},e)[n]||i(l({},t)).join("")!=o}))?function(e,t){for(var n=c(e),o=arguments.length,l=1,f=a.f,d=u.f;o>l;)for(var p,h=s(arguments[l++]),v=f?i(h).concat(f(h)):i(h),m=v.length,g=0;m>g;)p=v[g++],r&&!d.call(h,p)||(n[p]=h[p]);return n}:l},96093:function(e,t,n){"use strict";var r,o=n(14860),i=n(79227),a=n(89807),u=n(58825),c=n(55780),s=n(27383),l=n(6839),f=l("IE_PROTO"),d=function(){},p=function(e){return"