From a8e4e7f88c4607b64b95fa43794eb95fe082866f Mon Sep 17 00:00:00 2001 From: Werner Date: Sat, 10 Aug 2019 23:57:49 +0200 Subject: [PATCH] Ghost Roles (#6706) --- aurorastation.dme | 12 +- code/__defines/items_clothing.dm | 1 + code/controllers/subsystems/ghostroles.dm | 176 ++++ code/datums/outfits/outfit.dm | 6 +- code/datums/outfits/outfit_admin.dm | 64 +- code/game/jobs/job/outsider/merchant.dm | 20 +- code/game/objects/items.dm | 8 + code/modules/admin/admin_verbs.dm | 4 +- code/modules/cciaa/cciaa.dm | 124 --- code/modules/cciaa/cciaa_items.dm | 11 + code/modules/cciaa/ert_cmd.dm | 109 --- code/modules/ghostroles/spawner/base.dm | 146 +++ .../modules/ghostroles/spawner/human/admin.dm | 115 +++ .../ghostroles/spawner/human/emergencypod.dm | 166 ++++ .../modules/ghostroles/spawner/human/human.dm | 113 +++ .../ghostroles/spawner/human/merchant.dm | 32 + .../ghostroles/spawner/human/visitor.dm | 27 + .../spawner/simplemob/maintdrone.dm | 41 + .../ghostroles/spawner/simplemob/rat.dm | 41 + .../ghostroles/spawnpoint/spawnpoint.dm | 124 +++ .../abstract/new_player/preferences_setup.dm | 7 +- .../modules/mob/abstract/observer/observer.dm | 56 +- .../mob/living/carbon/human/inventory.dm | 6 + .../carbon/human/species/species_hud.dm | 4 + .../silicon/robot/drone/drone_manufacturer.dm | 47 +- code/modules/mob/login.dm | 1 - code/modules/random_map/drop/droppod.dm | 1 + code/modules/random_map/random_map.dm | 3 + code/unit_tests/spawner_tests.dm | 38 + maps/aurora/aurora-1_centcomm.dmm | 70 +- vueui/babel.config.js | 10 +- vueui/package-lock.json | 874 ++++++++++++------ vueui/package.json | 11 +- .../src/components/view/misc/ghostspawner.vue | 78 ++ vueui/src/main.js | 1 - vueui/src/polyfills.js | 1 - 36 files changed, 1865 insertions(+), 683 deletions(-) create mode 100644 code/controllers/subsystems/ghostroles.dm delete mode 100644 code/modules/cciaa/ert_cmd.dm create mode 100644 code/modules/ghostroles/spawner/base.dm create mode 100644 code/modules/ghostroles/spawner/human/admin.dm create mode 100644 code/modules/ghostroles/spawner/human/emergencypod.dm create mode 100644 code/modules/ghostroles/spawner/human/human.dm create mode 100644 code/modules/ghostroles/spawner/human/merchant.dm create mode 100644 code/modules/ghostroles/spawner/human/visitor.dm create mode 100644 code/modules/ghostroles/spawner/simplemob/maintdrone.dm create mode 100644 code/modules/ghostroles/spawner/simplemob/rat.dm create mode 100644 code/modules/ghostroles/spawnpoint/spawnpoint.dm create mode 100644 code/unit_tests/spawner_tests.dm create mode 100644 vueui/src/components/view/misc/ghostspawner.vue delete mode 100644 vueui/src/polyfills.js diff --git a/aurorastation.dme b/aurorastation.dme index 6051bce61e3..d46a5f5670a 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -169,6 +169,7 @@ #include "code\controllers\subsystems\falling.dm" #include "code\controllers\subsystems\garbage-debug.dm" #include "code\controllers\subsystems\garbage.dm" +#include "code\controllers\subsystems\ghostroles.dm" #include "code\controllers\subsystems\global_listener.dm" #include "code\controllers\subsystems\icon_cache.dm" #include "code\controllers\subsystems\icon_smooth.dm" @@ -1231,7 +1232,6 @@ #include "code\modules\cargo\random_stock\~undefs.dm" #include "code\modules\cciaa\cciaa.dm" #include "code\modules\cciaa\cciaa_items.dm" -#include "code\modules\cciaa\ert_cmd.dm" #include "code\modules\client\asset_cache.dm" #include "code\modules\client\client defines.dm" #include "code\modules\client\client procs.dm" @@ -1473,6 +1473,15 @@ #include "code\modules\games\spaceball_cards.dm" #include "code\modules\games\tarot.dm" #include "code\modules\genetics\side_effects.dm" +#include "code\modules\ghostroles\spawner\base.dm" +#include "code\modules\ghostroles\spawner\human\admin.dm" +#include "code\modules\ghostroles\spawner\human\emergencypod.dm" +#include "code\modules\ghostroles\spawner\human\human.dm" +#include "code\modules\ghostroles\spawner\human\merchant.dm" +#include "code\modules\ghostroles\spawner\human\visitor.dm" +#include "code\modules\ghostroles\spawner\simplemob\maintdrone.dm" +#include "code\modules\ghostroles\spawner\simplemob\rat.dm" +#include "code\modules\ghostroles\spawnpoint\spawnpoint.dm" #include "code\modules\ghosttrap\trap.dm" #include "code\modules\global_listener\devices.dm" #include "code\modules\global_listener\interfaces.dm" @@ -2477,6 +2486,7 @@ #include "code\unit_tests\mob_tests.dm" #include "code\unit_tests\object_tests.dm" #include "code\unit_tests\observation_tests.dm" +#include "code\unit_tests\spawner_tests.dm" #include "code\unit_tests\sql_tests.dm" #include "code\unit_tests\ss_test.dm" #include "code\unit_tests\unit_test.dm" diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index ac0e34d4eb3..b5600289e52 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -91,6 +91,7 @@ #define slot_r_ear 20 #define slot_legs 21 #define slot_tie 22 +#define slot_in_belt 23 // Inventory slot strings. // since numbers cannot be used as associative list keys. diff --git a/code/controllers/subsystems/ghostroles.dm b/code/controllers/subsystems/ghostroles.dm new file mode 100644 index 00000000000..03a40de9d65 --- /dev/null +++ b/code/controllers/subsystems/ghostroles.dm @@ -0,0 +1,176 @@ +/var/datum/controller/subsystem/ghostroles/SSghostroles + +/datum/controller/subsystem/ghostroles + name = "Ghost Roles" + flags = SS_NO_FIRE + + var/list/spawnpoints = list() //List of the available spawnpoints by spawnpoint type + // -> type 1 -> spawnpoint 1 + // -> spawnpoint 2 + + var/list/spawners = list() //List of the available spawner datums + +/datum/controller/subsystem/ghostroles/Recover() + src.spawnpoints = SSghostroles.spawnpoints + src.spawners = SSghostroles.spawners + +/datum/controller/subsystem/ghostroles/New() + NEW_SS_GLOBAL(SSghostroles) + +/datum/controller/subsystem/ghostroles/Initialize(start_timeofday) + . = ..() + for(var/spawner in subtypesof(/datum/ghostspawner)) + CHECK_TICK + var/datum/ghostspawner/G = new spawner + //Check if we have name, short_name and desc set + if(!G.short_name || !G.name || !G.desc) + log_ss("ghostroles","Spawner [G.type] got removed from selection because of missing data") + continue + //Check if we have a spawnpoint on the current map + if(!G.select_spawnpoint(FALSE)) + log_debug("ghostroles","Spawner [G.type] got removed from selection because of missing spawnpoint") + continue + spawners[G.short_name] = G + + for (var/identifier in spawnpoints) + CHECK_TICK + update_spawnpoint_status_by_identifier(identifier) + +//Adds a spawnpoint to the spawnpoint list +/datum/controller/subsystem/ghostroles/proc/add_spawnpoints(var/obj/effect/ghostspawpoint/P) + if(!P.identifier) //If the spawnpoint has no identifier -> Abort + log_ss("ghostroles","Spawner [P] at [P.x],[P.y],[P.z] has no identifier set") + qdel(P) + return + + if(!spawnpoints[P.identifier]) + spawnpoints[P.identifier] = list() + + spawnpoints[P.identifier].Add(P) + //Only update the status if the round is started. During initialization that´s taken care of at the end of init. + if(ROUND_IS_STARTED) + update_spawnpoint_status(P) + +/datum/controller/subsystem/ghostroles/proc/update_spawnpoint_status(var/obj/effect/ghostspawpoint/P) + if(!P || !istype(P)) + return null + //If any of the spawners uses that spawnpoint and is active set the status to available + for(var/s in spawners) + var/datum/ghostspawner/G = spawners[s] + if(!G.is_enabled()) + continue + if(!(P.identifier in G.spawnpoints)) + continue + P.set_available() + return TRUE + P.set_unavailable() + return FALSE + +/datum/controller/subsystem/ghostroles/proc/update_spawnpoint_status_by_identifier(var/identifier) + if(!identifier) //If no identifier ist set, return false + return null + if(!length(spawnpoints[identifier])) //If we have no spawnpoints for that identifier, return false + return null + + for (var/spawnpoint in spawnpoints[identifier]) + CHECK_TICK + var/obj/effect/ghostspawpoint/P = spawnpoint + update_spawnpoint_status(P) + +/datum/controller/subsystem/ghostroles/proc/remove_spawnpoints(var/obj/effect/ghostspawpoint/G) + spawnpoints[G.identifier].Remove(G) + return + +//Returns the turf where the spawnpoint is located and updates the spawner to be used +/datum/controller/subsystem/ghostroles/proc/get_spawnpoint(var/identifier, var/use = TRUE) + if(!identifier) //If no identifier ist set, return false + return null + if(!length(spawnpoints[identifier])) //If we have no spawnpoints for that identifier, return false + return null + + for (var/spawnpoint in spawnpoints[identifier]) + var/obj/effect/ghostspawpoint/P = spawnpoint + if(P.is_available()) + if(use) + P.set_spawned() + return get_turf(P) + +/datum/controller/subsystem/ghostroles/proc/vui_interact(mob/user,var/spawnpoint=null) + var/datum/vueui/ui = SSvueui.get_open_ui(user,src) + if(!ui) + ui = new(user,src,"misc-ghostspawner",950,700,"Ghost Role Spawner", nstate = interactive_state) + ui.data = vueui_data_change(list("spawnpoint"=spawnpoint,"current_tag"="All"),user,ui) + ui.open() + +/datum/controller/subsystem/ghostroles/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui) + if(!data) + . = data = list("current_tag"="All") + LAZYINITLIST(data["spawners"]) + for(var/s in spawners) + var/datum/ghostspawner/G = spawners[s] + if(G.cant_see(user)) + //if we have this spawner in our data list, then remove it + if(data["spawners"][G.short_name]) + data["spawners"] -= G.short_name + continue + LAZYINITLIST(data["spawners"][G.short_name]) + VUEUI_SET_CHECK(data["spawners"][G.short_name]["name"], G.name, ., data) + VUEUI_SET_CHECK(data["spawners"][G.short_name]["desc"], G.desc, ., data) + VUEUI_SET_CHECK(data["spawners"][G.short_name]["cant_spawn"], G.cant_spawn(user), ., data) + VUEUI_SET_CHECK(data["spawners"][G.short_name]["can_edit"], G.can_edit(user), ., data) + VUEUI_SET_CHECK(data["spawners"][G.short_name]["enabled"], G.enabled, ., data) + VUEUI_SET_CHECK(data["spawners"][G.short_name]["count"], G.count, ., data) + VUEUI_SET_CHECK(data["spawners"][G.short_name]["max_count"], G.max_count, ., data) + VUEUI_SET_CHECK(data["spawners"][G.short_name]["tags"], G.tags, ., data) + VUEUI_SET_CHECK(data["spawners"][G.short_name]["spawnpoints"], G.spawnpoints, ., data) + +/datum/controller/subsystem/ghostroles/Topic(href, href_list) + var/datum/vueui/ui = href_list["vueui"] + if(!istype(ui)) + return + if(href_list["spawn"]) + var/spawner = href_list["spawn"] + var/datum/ghostspawner/S = spawners[spawner] + if(!S) + return + var/cant_spawn = S.cant_spawn(usr) + if(cant_spawn) + to_chat(usr, "Unable to spawn: [cant_spawn]") + return + if(!S.pre_spawn(usr)) + to_chat(usr, "Unable to spawn: pre_spawn failed. Report this on GitHub") + return + var/mob/M = S.spawn_mob(usr) + if(!M) + to_chat(usr, "Unable to spawn: spawn_mob failed. Report this on GitHub") + return + if(!S.post_spawn(M)) + to_chat(usr, "Unable to spawn: post_spawn failed. Report this on GitHub") + return + log_and_message_admins("joined as GhostRole: [S.name]", M) + SSvueui.check_uis_for_change(src) //Make sure to update all the UIs so the count is updated + if(href_list["enable"]) + var/datum/ghostspawner/S = spawners[href_list["enable"]] + if(!S) + return + if(!S.can_edit(usr)) + return + if(!S.enabled) + S.enable() + to_chat(usr, "Ghost spawner enabled: [S.name]") + SSvueui.check_uis_for_change(src) //Update all the UIs to update the status of the spawner + for(var/i in S.spawnpoints) + update_spawnpoint_status_by_identifier(i) + if(href_list["disable"]) + var/datum/ghostspawner/S = spawners[href_list["disable"]] + if(!S) + return + if(!S.can_edit(usr)) + return + if(S.enabled) + S.disable() + to_chat(usr, "Ghost spawner disabled: [S.name]") + SSvueui.check_uis_for_change(src) //Update all the UIs to update the status of the spawner + for(var/i in S.spawnpoints) + update_spawnpoint_status_by_identifier(i) + return diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index 913c2233146..4f7c59ded44 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -29,7 +29,7 @@ var/internals_slot = null //ID of slot containing a gas tank var/list/backpack_contents = list() //In the list(path=count,otherpath=count) format var/list/accessory_contents = list() - var/list/belt_contents = list() + var/list/belt_contents = list() //In the list(path=count,otherpath=count) format var/list/implants = null //A list of implants that should be implanted /datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -158,6 +158,10 @@ var/number = backpack_contents[path] for(var/i in 1 to number) H.equip_or_collect(new path(H), slot_in_backpack) + for(var/path in belt_contents) + var/number = belt_contents[path] + for(var/i in 1 to number) + H.equip_or_collect(new path(H), slot_in_belt) post_equip(H, visualsOnly) diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index 16f6ada1c5c..1da9c606d1e 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -313,8 +313,8 @@ uniform = /obj/item/clothing/under/rank/centcom_commander suit = /obj/item/clothing/suit/storage/vest/heavy/ert/commander - shoes = /obj/item/clothing/shoes/swat - gloves = /obj/item/clothing/gloves/swat + shoes = /obj/item/clothing/shoes/jackboots + gloves = /obj/item/clothing/gloves/white l_ear = /obj/item/device/radio/headset/ert glasses = /obj/item/clothing/glasses/sunglasses/sechud head = /obj/item/clothing/head/beret/centcom/commander @@ -329,6 +329,42 @@ /obj/item/weapon/implant/loyalty ) +/datum/outfit/admin/nt/tcfl_commander + name = "TCFL Commander" + + uniform = /obj/item/clothing/under/legion + shoes = /obj/item/clothing/shoes/jackboots + l_ear = /obj/item/device/radio/headset/legion + head = /obj/item/clothing/head/legion_beret + belt = /obj/item/weapon/storage/belt/security/tactical + + backpack_contents = list( + /obj/item/weapon/gun/projectile/revolver = 1, + /obj/item/clothing/accessory/holster/hip = 1, + /obj/item/clothing/accessory/legion = 1, + /obj/item/weapon/storage/box/flashbangs = 1 + ) + + belt_contents = list( + /obj/item/weapon/melee/baton/loaded = 1, + /obj/item/weapon/handcuffs = 2, + /obj/item/ammo_magazine/a357 = 2, + /obj/item/device/flash = 1 + ) + +/datum/outfit/admin/nt/cciaa + name = "CCIA Agent" + + uniform = /obj/item/clothing/under/rank/centcom_officer + suit = /obj/item/clothing/suit/storage/toggle/internalaffairs/cciaa + shoes = /obj/item/clothing/shoes/laceup + gloves = /obj/item/clothing/gloves/white + l_ear = /obj/item/device/radio/headset/ert/ccia + glasses = /obj/item/clothing/glasses/sunglasses/sechud + head = /obj/item/clothing/head/beret/centcom/officer + l_pocket = /obj/item/weapon/reagent_containers/spray/pepper + r_pocket = /obj/item/device/taperecorder/cciaa + l_hand = /obj/item/weapon/storage/lockbox/cciaa /datum/outfit/admin/nt/odinsec name = "NTCC Odin Security Specialist" @@ -349,6 +385,14 @@ backpack_contents = null + belt_contents = list( + /obj/item/weapon/reagent_containers/spray/pepper = 1, + /obj/item/weapon/melee/baton/loaded = 1, + /obj/item/weapon/grenade/chem_grenade/gas = 1, + /obj/item/device/flash = 1, + /obj/item/ammo_magazine/c45x = 2 + ) + implants = list( /obj/item/weapon/implant/loyalty ) @@ -364,22 +408,6 @@ var/obj/item/clothing/under/rank/U = H.w_uniform U.attach_accessory(null, holster) - if(H && H.belt) - - var/obj/item/weapon/reagent_containers/spray/pepper/pepperspray = new(H) - var/obj/item/weapon/melee/baton/loaded/baton = new(H) - var/obj/item/weapon/grenade/chem_grenade/gas/gasgrenade = new(H) - var/obj/item/device/flash/flash = new(H) - var/obj/item/ammo_magazine/c45x/mag1 = new(H) - var/obj/item/ammo_magazine/c45x/mag2 = new(H) - - H.belt.contents += mag1 - H.belt.contents += mag2 - H.belt.contents += gasgrenade - H.belt.contents += pepperspray - H.belt.contents += flash - H.belt.contents += baton - /datum/outfit/admin/nt/specops name = "Special Operations Officer" diff --git a/code/game/jobs/job/outsider/merchant.dm b/code/game/jobs/job/outsider/merchant.dm index 3bf7d79ae3b..650cef9c67a 100644 --- a/code/game/jobs/job/outsider/merchant.dm +++ b/code/game/jobs/job/outsider/merchant.dm @@ -21,6 +21,15 @@ outfit = /datum/outfit/job/merchant +/datum/job/merchant/announce(mob/living/carbon/human/H) + to_chat(H,"You are a merchant heading to the [station_name()] to make profit, your main objective is to sell and trade with the crew.") + +/datum/job/merchant/New() + ..() + if(prob(config.merchant_chance)) + spawn_positions = 1 + total_positions = 1 + /datum/outfit/job/merchant name = "Merchant" jobtype = /datum/job/merchant @@ -31,11 +40,8 @@ pda = /obj/item/device/pda/merchant r_pocket = /obj/item/device/price_scanner -/datum/job/merchant/announce(mob/living/carbon/human/H) - to_chat(H,"You are a merchant heading to the [station_name()] to make profit, your main objective is to sell and trade with the crew.") +/datum/outfit/job/merchant/assistant + name = "Merchant's Assistant" -/datum/job/merchant/New() - ..() - if(prob(config.merchant_chance)) - spawn_positions = 1 - total_positions = 1 +/datum/outfit/job/merchant/assistant/get_id_rank(mob/living/carbon/human/H) + return "Merchant's Assistant" \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index b7e588c0881..14231706f2c 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -385,6 +385,14 @@ var/list/global/slot_flags_enumeration = list( allow = 1 if(!allow) return 0 + if(slot_in_belt) + var/allow = 0 + if(istype(H.belt, /obj/item/weapon/storage/belt)) + var/obj/item/weapon/storage/belt/B = H.belt + if(B.can_be_inserted(src,1)) + allow = 1 + if(!allow) + return 0 if(slot_tie) if(!H.w_uniform && (slot_w_uniform in mob_equip)) if(!disable_warning) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index aeb90e4df37..d34e46540fe 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -381,15 +381,13 @@ var/list/admin_verbs_dev = list( //will need to be altered - Ryan784 ) var/list/admin_verbs_cciaa = list( /client/proc/cmd_admin_pm_panel, /*admin-pm list*/ - /client/proc/spawn_duty_officer, /client/proc/cmd_admin_create_centcom_report, /client/proc/cmd_cciaa_say, /client/proc/returntobody, /datum/admins/proc/create_admin_fax, /client/proc/check_fax_history, /client/proc/aooc, - /client/proc/check_antagonists, - /client/proc/spawn_ert_commander + /client/proc/check_antagonists ) /client/proc/add_admin_verbs() diff --git a/code/modules/cciaa/cciaa.dm b/code/modules/cciaa/cciaa.dm index d8292a8e138..bff4f2a5d49 100644 --- a/code/modules/cciaa/cciaa.dm +++ b/code/modules/cciaa/cciaa.dm @@ -1,127 +1,3 @@ -/client/proc/spawn_duty_officer() - set category = "Special Verbs" - set name = "Spawn CCIA Agent" - set desc = "Spawns a CCIA Agent to agent around." - - if(!check_rights(R_CCIAA)) return - - if(!holder) - return //how did they get here? - - if(!ROUND_IS_STARTED) - to_chat(src,"The game hasn't started yet!") - return - - if(istype(mob, /mob/abstract/new_player)) - to_chat(src,"You can't be in the lobby to join as a duty officer.") - return - - if (alert(usr, "Do you want to cancel or proceed?", "Are you sure?", "Proceed", "Cancel") == "Cancel") - to_chat(src,"Cancelled.") - return - - if(mob.mind && mob.mind.special_role == "CCIA Agent") - to_chat(src,"You are already a CCIA Agent.") - verbs += /client/proc/returntobody - return - - var/wasLiving = 0 - if(istype(mob, /mob/living)) - holder.original_mob = mob - wasLiving = 1 - - var/obj/effect/landmark/L - for (var/obj/effect/landmark/landmark in landmarks_list) - if(landmark.name == "CCIAAgent") - L = landmark - break - - if (!L) - return - - var/new_name = input(usr, "Pick a name","Name") as text - var/mob/living/carbon/human/M = new(null) - - M.check_dna(M) - - M.real_name = new_name - M.name = new_name - M.age = input("Enter your characters age:","Num") as num - if(!M.age) - M.age = rand(35,50) - if(M.age < 33 || M.age > 60) - to_chat(src,"The age you selected was not in a valid range for a Duty Officer.") - if(M.age < 33) - M.age = 33 - else - M.age = 60 - to_chat(src,"Your age has been set to [M.age].") - - M.dna.ready_dna(M) - - M.mind = new - M.mind.current = M - M.mind.original = M - if(wasLiving) - M.mind.admin_mob_placeholder = mob - M.mind.assigned_role = "Central Command Internal Affairs Agent" - M.mind.special_role = "CCIA Agent" - M.forceMove(L.loc) - M.key = key - - M.change_appearance(APPEARANCE_ALL, M.loc, check_species_whitelist = 1) - - if(wasLiving) - clear_cciaa_job(holder.original_mob) - addtimer(CALLBACK(holder.original_mob, /mob/.proc/invalidate_key_tmr), 1) - - M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/white(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/ccia(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/spray/pepper(M), slot_l_store) - M.equip_to_slot_or_del(new /obj/item/device/taperecorder/cciaa(M), slot_r_store) - - var/obj/item/clothing/suit/storage/toggle/liaison/suit = new(M) - suit.name = "central command internal affairs jacket" - M.equip_to_slot_or_del(suit, slot_wear_suit) - - var/obj/item/weapon/storage/backpack/satchel/bag = new(M) - bag.name = "officer's leather satchel" - bag.desc = "A well cared for leather satchel for Nanotrasen officers." - M.equip_to_slot_or_del(bag, slot_back) - if(M.backbag == 1) - M.equip_to_slot_or_del(new /obj/item/weapon/stamp/centcomm(M), slot_in_backpack) - - var /obj/item/weapon/storage/lockbox/lockbox = new(M) - lockbox.req_access = list(access_cent_captain) - lockbox.name = "CCIA agent briefcase" - lockbox.desc = "A smart looking briefcase with a NT logo on the side" - lockbox.storage_slots = 8 - lockbox.max_storage_space = 16 - M.equip_to_slot_or_del(lockbox, slot_l_hand) - - var/obj/item/device/pda/central/pda = new(M) - pda.owner = M.real_name - pda.ownjob = "Central Command Internal Affairs Agent" - pda.name = "PDA-[M.real_name] ([pda.ownjob])" - - M.equip_to_slot_or_del(pda, slot_belt) - - M.implant_loyalty(M, 1) - - var/obj/item/weapon/card/id/centcom/W = new(M) - W.name = "[M.real_name]'s ID Card" - W.item_state = "id_inv" - W.access = get_all_accesses() | get_centcom_access("CCIA Agent") - W.assignment = "Central Command Internal Affairs Agent" - W.registered_name = M.real_name - M.equip_to_slot_or_del(W, slot_wear_id) - - verbs += /client/proc/returntobody - /client/proc/returntobody() set name = "Return to mob" set desc = "The Agent's work is done, return to your original mob" diff --git a/code/modules/cciaa/cciaa_items.dm b/code/modules/cciaa/cciaa_items.dm index 3e6746e01d4..039792ff7fc 100644 --- a/code/modules/cciaa/cciaa_items.dm +++ b/code/modules/cciaa/cciaa_items.dm @@ -266,3 +266,14 @@ /obj/item/device/encryptionkey/ccia name = "\improper CCIA radio encryption key" channels = list("Response Team" = 1, "Science" = 0, "Command" = 1, "Medical" = 0, "Engineering" = 0, "Security" = 0, "Supply" = 0, "Service" = 0) + +/obj/item/clothing/suit/storage/toggle/internalaffairs/cciaa + name = "central command internal affairs jacket" + +/obj/item/weapon/storage/lockbox/cciaa + req_access = list(access_cent_captain) + name = "CCIA agent briefcase" + desc = "A smart looking briefcase with a NT logo on the side" + storage_slots = 8 + max_storage_space = 16 + diff --git a/code/modules/cciaa/ert_cmd.dm b/code/modules/cciaa/ert_cmd.dm deleted file mode 100644 index c5b731dc9cb..00000000000 --- a/code/modules/cciaa/ert_cmd.dm +++ /dev/null @@ -1,109 +0,0 @@ -/client/proc/spawn_ert_commander() - set category = "Special Verbs" - set name = "Spawn ERT Commander" - set desc = "Spawns an ERT Commander." - - if(!check_rights(R_CCIAA)) return - - if(!holder) - return //how did they get here? - - if(!ROUND_IS_STARTED) - to_chat(src,"The game hasn't started yet!") - return - - if(istype(mob, /mob/abstract/new_player)) - to_chat(src,"You can't be in the lobby to join as a commander.") - return - - if (alert(usr, "Do you want to cancel or proceed?", "Are you sure?", "Proceed", "Cancel") == "Cancel") - to_chat(src,"Cancelled.") - return - - if(mob.mind && mob.mind.special_role == "ERT Commander") - to_chat(src,"You are already an ERT Commander.") - verbs += /client/proc/returntobody - return - - var/wasLiving = 0 - if(istype(mob, /mob/living)) - holder.original_mob = mob - wasLiving = 1 - - var/obj/effect/landmark/L - for (var/obj/effect/landmark/landmark in landmarks_list) - if(landmark.name == "ERTCommander") - L = landmark - break - - if (!L) - return - - var/new_name = input(usr, "Pick a name","Name") as text - var/mob/living/carbon/human/M = new(null) - - M.check_dna(M) - - M.real_name = new_name - M.name = new_name - M.age = input("Enter your characters age:","Num") as num - if(!M.age) - M.age = rand(35,50) - if(M.age < 33 || M.age > 60) - to_chat(src,"The age you selected was not in a valid range for a Commander.") - if(M.age < 33) - M.age = 33 - else - M.age = 60 - to_chat(src,"Your age has been set to [M.age].") - - M.dna.ready_dna(M) - - M.mind = new - M.mind.current = M - M.mind.original = M - if(wasLiving) - M.mind.admin_mob_placeholder = mob - M.mind.assigned_role = "Emergency Response Team Commander" - M.mind.special_role = "ERT Commander" - M.forceMove(L.loc) - M.key = key - - M.change_appearance(APPEARANCE_ALL, M.loc, check_species_whitelist = 1) - - if(wasLiving) - clear_cciaa_job(holder.original_mob) - addtimer(CALLBACK(holder.original_mob, /mob/.proc/invalidate_key_tmr), 1) - - M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_commander(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/white(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/clothing/head/beret/centcom/commander(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/vest/heavy/ert/commander(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel, slot_back) - - - - var/obj/item/device/pda/central/pda = new(M) - pda.owner = M.real_name - pda.ownjob = "Emergency Response Team Commander" - pda.name = "PDA-[M.real_name] ([pda.ownjob])" - - M.equip_to_slot_or_del(pda, slot_belt) - - M.implant_loyalty(M, 1) - - var/obj/item/weapon/card/id/centcom/W = new(M) - W.name = "[M.real_name]'s ID Card" - W.item_state = "id_inv" - W.access = get_all_accesses() | get_centcom_access("BlackOps Commander") - W.assignment = "Emergency Response Team Commander" - W.registered_name = M.real_name - M.equip_to_slot_or_del(W, slot_wear_id) - - verbs += /client/proc/returntobody - -/mob/proc/invalidate_key_tmr() - key = "@[key]" \ No newline at end of file diff --git a/code/modules/ghostroles/spawner/base.dm b/code/modules/ghostroles/spawner/base.dm new file mode 100644 index 00000000000..0e30848500e --- /dev/null +++ b/code/modules/ghostroles/spawner/base.dm @@ -0,0 +1,146 @@ +/datum/ghostspawner + var/short_name = null + var/name = null + var/desc = null + var/welcome_message = null + var/list/tags = list() //Tags associated with that spawner + + //Vars regarding the spawnpoints and conditions of the spawner + var/list/spawnpoints = null //List of the applicable spawnpoints (by name) + var/landmark_name = null //Alternatively you can specify a landmark name + var/max_count = 0 //How often can this spawner be used + var/count = 0 //How ofen has this spawner been used + var/req_perms = null //What permission flags are required to use this spawner + var/req_perms_edit = R_ADMIN + var/req_head_whitelist = FALSE //If a head of staff whitelist is required + var/req_species_whitelist = null //Name/Datum of the species whitelist that is required, or null + var/enabled = TRUE //If the spawnpoint is enabled + var/enable_chance = null //If set to a value other than null, has the set chance to become enabled + var/enable_dmessage = TRUE //The message to send to deadchat if the ghostspawner is enabled or TRUE for a default message + var/respawn_flag = null //Flag to check for when trying to spawn someone of that type (CREW, ANIMAL, MINISYNTH) + var/jobban_job = null //If this is set, then it will check if the user is jobbanned from a specific job. Otherwise it will check for the name of the spawner + + //Vars regarding the mob to use + var/mob/spawn_mob = null //The mob that should be spawned + var/list/variables = list() //Variables of that mob + var/mob_name = FALSE //The name of that mob; If null prompts for it + var/mob_name_prefix = null //The prefix that should be applied to the mob (i.e. CCIAA, Tpr., Cmdr.) + var/mob_name_suffix = null //The suffix that should be applied to the mob name + +/datum/ghostspawner/New() + . = ..() + if(!jobban_job) + jobban_job = name + if(!isnull(enable_chance)) + enabled = prob(enable_chance) + +//Return a error message if the user CANT see the ghost spawner. Otherwise FALSE +/datum/ghostspawner/proc/cant_see(mob/user) //If the user can see the spawner in the menu + if(req_perms) //Only those with the correct flags can see restricted roles + if(check_rights(req_perms, show_msg=FALSE, user=user)) + return FALSE //Return early and dont perform whitelist checks if staff flags are met + else + return "Missing Permissions" + + if(req_head_whitelist && !check_whitelist(user)) + return "Missing Head of Staff Whitelist" + + if(req_species_whitelist && !is_alien_whitelisted(user, req_species_whitelist)) + return "Missing Species Whitelist" + + if(jobban_job && jobban_isbanned(user,jobban_job)) + return "Job Banned" + + if(!enabled && !can_edit(user)) //If its not enabled and the user cant edit it, dont show it + return "Currently Disabled" + + return FALSE + +//Return a error message if the user CANT spawn. Otherwise FALSE +/datum/ghostspawner/proc/cant_spawn(mob/user) //If the user can spawn using the spawner + if(!ROUND_IS_STARTED) + return "The round is not started yet." + var/cant_see = cant_see() + if(cant_see) //If we cant see it, we cant spawn it + return cant_see + if(!istype(user, /mob/abstract/observer)) + return "You are not a ghost." + if(!enabled) //If the spawner id disabled, we cant spawn in + return "This spawner is not enabled." + if(respawn_flag && !user.MayRespawn(0,respawn_flag)) + return "You can not respawn at this time." + if(!config.enter_allowed) + return "There is an administrative lock on entering the game." + if(SSticker.mode?.explosion_in_progress) + return "The station is currently exploding." + if(max_count && count > max_count) + return "No more slots are available." + //Check if a spawnpoint is available + var/T = select_spawnpoint(FALSE) + if(!T) + return "No spawnpoint available." + return FALSE + +//Proc executed before someone is spawned in +/datum/ghostspawner/proc/pre_spawn(mob/user) + count++ //Increment the spawned in mob count + if(count >= max_count) + disable() + return TRUE + +//This proc selects the spawnpoint to use. +/datum/ghostspawner/proc/select_spawnpoint(var/use=TRUE) + if(!isnull(spawnpoints)) + for(var/spawnpoint in spawnpoints) //Loop through the applicable spawnpoints + var/turf/T = SSghostroles.get_spawnpoint(spawnpoint, use) //Gets the first matching spawnpoint or null if none are available + if(T) //If we have a spawnpoint, return it + return T + if(!isnull(landmark_name)) + var/obj/effect/landmark/L + for(var/obj/effect/landmark/landmark in landmarks_list) + if(landmark.name == landmark_name) + L = landmark + return get_turf(L) + + log_debug("Ghostspawner: Spawner [short_name] has neither spawnpoints nor landmarks or a matching spawnpoint/landmark could not be found") + + return null //If we dont have anything return null + +//The proc to actually spawn in the user +/datum/ghostspawner/proc/spawn_mob(mob/user) + //OVERWRITE THIS IN THE CHILD IMPLEMENTATIONS to return the spawned in mob !!! + return null + +//Proc executed after someone is spawned in +/datum/ghostspawner/proc/post_spawn(mob/user) + if(welcome_message) + to_chat(user, welcome_message) + return TRUE + +//Proc to check if a specific user can edit this spawner (open/close/...) +/datum/ghostspawner/proc/can_edit(mob/user) + if(check_rights(req_perms_edit, show_msg=FALSE, user=user)) + return TRUE + return FALSE + +/datum/ghostspawner/proc/is_enabled() + if(max_count) + return enabled && count < max_count + return enabled + +//Proc to enable the ghostspawner +/datum/ghostspawner/proc/enable() + enabled = TRUE + if(enable_dmessage) + for(var/mob/abstract/observer/O in player_list) + if(O.client && !cant_see(O)) + if(enable_dmessage == TRUE) + to_chat(O, "A ghostspawner for a \"[src.name]\" has been enabled.") + else + to_chat(O, "[enable_dmessage]") + return TRUE + +//Proc to disable the ghostspawner +/datum/ghostspawner/proc/disable() + enabled = FALSE + return TRUE diff --git a/code/modules/ghostroles/spawner/human/admin.dm b/code/modules/ghostroles/spawner/human/admin.dm new file mode 100644 index 00000000000..ac8ccc32985 --- /dev/null +++ b/code/modules/ghostroles/spawner/human/admin.dm @@ -0,0 +1,115 @@ +/datum/ghostspawner/human/admin + tags = list("Admin") + +/datum/ghostspawner/human/admin/ert_commander + short_name = "ertcommander" + name = "ERT Commander" + desc = "Command the response team from Central Command" + + landmark_name = "ERTCommander" + req_perms = R_CCIAA + + //Vars related to human mobs + outfit = /datum/outfit/admin/nt/ert_commander + possible_species = list("Human") + possible_genders = list(MALE,FEMALE) + allow_appearance_change = TRUE + + assigned_role = "Emergency Response Team Commander" + special_role = "ERT Commander" + respawn_flag = null + + mob_name = null + mob_name_prefix = "Cmdr. " + +/datum/ghostspawner/human/admin/legion_commander + short_name = "legioncommander" + name = "TCFL Commander" + desc = "Command the TCFL, a walking and talking joke, whos members regularly die before they even arrive at their target." + + landmark_name = "TCFLCommander" + req_perms = R_CCIAA + + //Vars related to human mobs + outfit = /datum/outfit/admin/nt/tcfl_commander + possible_species = list("Human") + possible_genders = list(MALE,FEMALE) + allow_appearance_change = TRUE + + assigned_role = "Tau Ceti Foreign Legion Commander" + special_role = "TCFL Commander" + respawn_flag = null + + mob_name = null + mob_name_prefix = "Cmdr. " + +/datum/ghostspawner/human/admin/cciaagent + short_name = "cciaagent" + name = "CCIA Agent" + desc = "Board the Aurora, annoy crew with your interviews and get squashed by your own shuttle." + + landmark_name = "CCIAAgent" + req_perms = R_CCIAA + + //Vars related to human mobs + outfit = /datum/outfit/admin/nt/cciaa + possible_species = list("Human") + possible_genders = list(MALE,FEMALE) + allow_appearance_change = TRUE + + assigned_role = "Emergency Response Team Commander" + special_role = "ERT Commander" + respawn_flag = null + + mob_name = null + mob_name_prefix = "CCIAA " + + +/datum/ghostspawner/human/admin/cciaescort + short_name = "cciaescort" + name = "CCIA Escort" + desc = "Escort a CCIA Agent to the station, watch them annoy the crew and prevent them from throwing themselvs under their own shuttle." + + enabled = FALSE + landmark_name = "CCIAEscort" + req_perms = null + req_perms_edit = R_CCIAA + max_count = 1 + + //Vars related to human mobs + outfit = /datum/outfit/admin/nt/protection_detail + possible_species = list("Human") + possible_genders = list(MALE,FEMALE) + allow_appearance_change = TRUE + + assigned_role = "Civil Protection Officer" + special_role = "Civil Protection Officer" + respawn_flag = null + + mob_name = null + mob_name_prefix = "Ofc. " + + +/datum/ghostspawner/human/admin/checkpointsec + short_name = "checkpointsec" + name = "Odin Checkpoint Security" + desc = "Secure the Odin checkpoint. Verify the identity of everyone passing through, perform random searches on \"suspicious\" crew." + + enabled = FALSE + spawnpoints = list("OdinCheckpoint") + req_perms = null + req_perms_edit = R_CCIAA + max_count = 4 + + //Vars related to human mobs + outfit = /datum/outfit/admin/nt/protection_detail + possible_species = list("Human","Skrell","Tajara","Unathi") + possible_genders = list(MALE,FEMALE) + allow_appearance_change = TRUE + + assigned_role = "Odin Security Officer" + special_role = "Odin Security Officer" + respawn_flag = null + + mob_name = null + mob_name_prefix = "Spec. " \ No newline at end of file diff --git a/code/modules/ghostroles/spawner/human/emergencypod.dm b/code/modules/ghostroles/spawner/human/emergencypod.dm new file mode 100644 index 00000000000..ad78f6b54ee --- /dev/null +++ b/code/modules/ghostroles/spawner/human/emergencypod.dm @@ -0,0 +1,166 @@ +/datum/ghostspawner/human/rescuepodsurv + short_name = "rescuepodsurv" + name = "Rescue Pod Survivor" + desc = "You managed to get into a rescue pod and landed somewhere on a asteroid." + tags = list("External") + + enabled = FALSE + req_perms = null + max_count = 1 + + //Vars related to human mobs + outfit = /datum/outfit/admin/random/visitor + possible_species = list("Human","Skrell","Tajara","Unathi") + possible_genders = list(MALE,FEMALE) + allow_appearance_change = TRUE + + assigned_role = "Pod Survivor" + special_role = "Pod Survivor" + respawn_flag = CREW + + mob_name = FALSE + + enable_chance = 10 + +/datum/ghostspawner/human/rescuepodsurv/New() + . = ..() + var/t = pick(list("star","priest","rep","smuggler")) + if(t == "star") + welcome_message = "You are a stranded starlet!
You were relaxing comfortably in your cryo pod as tragedy struck - the pilot of your luxury yacht fell asleep under some mysterious circumstances. You were unceremoniously stuffed into an escape pod, and left to wander in space. What a despicable, low-quality plot to get rid of you. Should've chosen murder instead - you certainly know you'll convince someone nice to lend you a shuttle." + outfit = /datum/outfit/admin/pod/star + possible_genders = list(FEMALE) + possible_species = list("Human","Skrell","Tajara") + else if(t == "priest") + welcome_message = "You are a stranded Trinary Perfection priest!
You were traveling around space on your small shuttle, preaching peacefully of the future divinity of the synthetics, and the grand purpose of mankind as the ones to help them achieve that goal. Unfortunately, Dominians don't seem to be as peaceful in disagreeing with your views - and had to evacuate your shot-down ship. Have your prayers to the Divines helped you now?" + outfit = /datum/outfit/admin/pod/priest + possible_species = list("Human") + else if(t == "rep") + welcome_message = "You are a stranded Idris Incorporated representative!
You were traveling back from your business in Sol to the Mendell City HQ. Unfortunately, after a very unusual set of circumstances, the engine broke down just almost as you got back. You're stranded somewhere nearby - perhaps your excellent customer service and negotiation skills might get you a ride back to Mendell?" + outfit = /datum/outfit/admin/pod/rep + possible_species = list("Human") + else + welcome_message = "You are a stranded drugs smuggler!
You shouldn't have had the fucking Tajara pilot your ship. Of course we crashed into a rock. Good thing you've got some of the stuff with you while evacuating - maybe you'll crash somewhere you could sell it for a ticket back?" + outfit = /datum/outfit/admin/pod/smuggler + possible_species = list("Human","Skrell","Unathi") + +/datum/ghostspawner/human/rescuepodsurv/select_spawnpoint(var/use=TRUE) + //Randomly select a Turf on the asteroid. + var/turf/T = pick_area_turf(/area/mine/unexplored) + if(!use) //If we are just checking if we can get one, return the turf we found + return T + + if(!T) //If we didnt find a turn, return now + return null + + //Otherwise spawn a droppod at that location + var/x = T.x + var/y = T.y + var/z = T.z + + new /datum/random_map/droppod(null,x,y,z,supplied_drop="custom",do_not_announce=TRUE,automated=FALSE) + return get_turf(locate(x+1,y+1,z)) //Get the turf again, so we end up inside of the pod - There is probs a better way to do this + + +//Base equipment for the pod (softsuit + emergency oxygen) +/datum/outfit/admin/pod + head = /obj/item/clothing/head/helmet/space/emergency + mask = /obj/item/clothing/mask/breath + suit = /obj/item/clothing/suit/space/emergency + suit_store = /obj/item/weapon/tank/emergency_oxygen/double + l_ear = /obj/item/device/radio/headset + back = /obj/item/weapon/storage/backpack + +/datum/outfit/admin/pod/post_equip(mob/living/carbon/human/H, visualsOnly) + . = ..() + //Turn on the oxygen tank + H.internal = H.s_store + if(istype(H.internal,/obj/item/weapon/tank) && H.internals) + H.internals.icon_state = "internal1" + +/datum/outfit/admin/pod/star + name = "RescuePod - Star" + + uniform = "dress selection" + shoes = "flats selection" + id = /obj/item/weapon/card/id + + backpack_contents = list( + /obj/item/weapon/lipstick/random = 2, + /obj/item/weapon/haircomb/random = 1, + /obj/item/weapon/spacecash/c1000 = 2, + /obj/item/device/oxycandle = 1, + /obj/item/airbubble = 1 + ) + +/datum/outfit/admin/pod/star/get_id_assignment() + return "Visitor" + +/datum/outfit/admin/pod/star/get_id_rank() + return "Visitor" + + +/datum/outfit/admin/pod/priest + name = "RescuePod - Priest" + + uniform = /obj/item/clothing/under/rank/chaplain + shoes = /obj/item/clothing/shoes/black + id = /obj/item/weapon/card/id + pda = /obj/item/device/pda/chaplain + + backpack_contents = list( + /obj/item/weapon/storage/bible/fluff/oscar_bible = 1, + /obj/item/device/oxycandle = 1, + /obj/item/airbubble = 1 + ) + +/datum/outfit/admin/pod/priest/get_id_assignment() + return "Priest" + +/datum/outfit/admin/pod/priest/get_id_rank() + return "Priest" + + +/datum/outfit/admin/pod/rep + name = "RescuePod - IdrisRep" + + uniform = /obj/item/clothing/under/rank/idris + id = /obj/item/weapon/card/id/idris + pda = /obj/item/device/pda/lawyer + shoes = /obj/item/clothing/shoes/laceup + glasses = /obj/item/clothing/glasses/sunglasses/big + l_hand = /obj/item/weapon/storage/briefcase + backpack_contents = list( + /obj/item/clothing/head/beret/liaison = 1, + /obj/item/device/camera = 1, + /obj/item/weapon/gun/energy/pistol = 1, + /obj/item/device/oxycandle = 1, + /obj/item/airbubble = 1 + ) + +/datum/outfit/admin/pod/rep/get_id_assignment() + return "Corporate Liaison (Idris)" + +/datum/outfit/admin/pod/rep/get_id_rank() + return "Corporate Liaison" + + +/datum/outfit/admin/pod/smuggler + name = "RescuePod - Smuggler" + + shoes = "shoe selection" + uniform = "pants selection" + + backpack_contents = list( + /obj/item/weapon/reagent_containers/inhaler/space_drugs = 3, + /obj/item/weapon/reagent_containers/inhaler/hyperzine = 2, + /obj/item/weapon/reagent_containers/inhaler/soporific = 1, + /obj/item/weapon/gun/projectile/leyon = 1, + /obj/item/device/oxycandle = 1, + /obj/item/airbubble = 1 + ) + +/datum/outfit/admin/pod/smuggler/get_id_assignment() + return "Merchant" + +/datum/outfit/admin/pod/smuggler/get_id_rank() + return "Merchant" \ No newline at end of file diff --git a/code/modules/ghostroles/spawner/human/human.dm b/code/modules/ghostroles/spawner/human/human.dm new file mode 100644 index 00000000000..62e7283d087 --- /dev/null +++ b/code/modules/ghostroles/spawner/human/human.dm @@ -0,0 +1,113 @@ +/datum/ghostspawner/human + short_name = null + name = null + desc = null + + respawn_flag = CREW //Flag to check for when trying to spawn someone of that type (CREW, ANIMAL, MINISYNTH) + + //Vars regarding the mob to use + spawn_mob = /mob/living/carbon/human //The mob that should be spawned + variables = list() //Variables of that mob + + //Vars related to human mobs + var/datum/outfit/outfit = null //Outfit to equip + var/possible_species = list("Human") + var/possible_genders = list(MALE,FEMALE) + var/allow_appearance_change = FALSE + + var/assigned_role = null + var/special_role = null + var/faction = null + + mob_name = null + + +//Proc executed before someone is spawned in +/datum/ghostspawner/human/pre_spawn(mob/user) + . = ..() + +/datum/ghostspawner/human/proc/get_mob_name(mob/user) + var/mname = mob_name + if(isnull(mname)) + var/pick_message = "Pick a name." + if(mob_name_prefix) + pick_message = "[pick_message] Automatic Prefix: \"[mob_name_prefix]\" " + if(mob_name_suffix) + pick_message = "[pick_message] Automatic Suffix: \"[mob_name_suffix]\" " + mname = sanitizeSafe(input(user, pick_message, "Name (without prefix/suffix")) + + if(mob_name_prefix) + mname = "[mob_name_prefix][mname]" + if(mob_name_suffix) + mname = "[mname][mob_name_suffix]" + return mname + +//The proc to actually spawn in the user +/datum/ghostspawner/human/spawn_mob(mob/user) + //Select a spawnpoint (if available) + var/turf/T = select_spawnpoint() + if(!T) + log_debug("GhostSpawner: Unable to select spawnpoint for [short_name]") + return FALSE + + //Get the name / age from them first + var/mname = get_mob_name(user) + var/age = input(user, "Enter your characters age:","Num") as num + + //Spawn in the mob + var/mob/living/carbon/human/M = new spawn_mob(null) + + M.change_gender(pick(possible_genders)) + M.set_species(pick(possible_species)) + + //Prepare the mob + M.check_dna(M) + M.dna.ready_dna(M) + + //Move the mob inside and initialize the mind + M.key = user.ckey //!! After that USER is invalid, so we have to use M + + M.mind_initialize() + + if(assigned_role) + M.mind.assigned_role = assigned_role + if(special_role) + M.mind.special_role = special_role + if(faction) + M.faction = faction + + //Move the mob + M.forceMove(T) + M.lastarea = get_area(M.loc) //So gravity doesnt fuck them. + M.megavend = TRUE //So the autodrobe ignores them + + //Setup the appearance + if(allow_appearance_change) + M.change_appearance(APPEARANCE_ALL, M.loc, check_species_whitelist = 1) + else //otherwise randomize + M.client.prefs.randomize_appearance_for(M, FALSE) + + //Setup the mob age and name + if(!mname) + mname = random_name(M.gender, M.species.name) + + M.fully_replace_character_name(M.real_name, mname) + + if(!age) + age = rand(35, 50) + M.age = Clamp(age, 21, 65) + + //Setup the outfit + if(outfit) + M.preEquipOutfit(outfit, FALSE) + M.equipOutfit(outfit, FALSE) + + M.force_update_limbs() + M.update_eyes() + M.regenerate_icons() + + return M + +//Proc executed after someone is spawned in +/datum/ghostspawner/human/post_spawn(mob/user) + . = ..() diff --git a/code/modules/ghostroles/spawner/human/merchant.dm b/code/modules/ghostroles/spawner/human/merchant.dm new file mode 100644 index 00000000000..63bbbaca2d5 --- /dev/null +++ b/code/modules/ghostroles/spawner/human/merchant.dm @@ -0,0 +1,32 @@ +/datum/ghostspawner/human/merchantass + short_name = "merchantass" + name = "Merchants Assistant" + desc = "Assist the Merchant with their duties." + tags = list("External") + + enabled = FALSE + spawnpoints = list("MerchantAss") + req_perms = null + max_count = 1 + + //Vars related to human mobs + outfit = /datum/outfit/job/merchant/assistant + possible_species = list("Human","Skrell","Tajara","Unathi") + possible_genders = list(MALE,FEMALE) + allow_appearance_change = TRUE + + assigned_role = "Merchants Assistant" + special_role = "Merchants Assistant" + respawn_flag = null + + mob_name = null + +/datum/ghostspawner/human/merchantass/can_edit(mob/user) + . = ..() + var/is_merchant = FALSE + + if(ishuman(user)) + var/mob/living/carbon/human/H = user + is_merchant = (H.job == "Merchant") + + return . || is_merchant \ No newline at end of file diff --git a/code/modules/ghostroles/spawner/human/visitor.dm b/code/modules/ghostroles/spawner/human/visitor.dm new file mode 100644 index 00000000000..e48537e5625 --- /dev/null +++ b/code/modules/ghostroles/spawner/human/visitor.dm @@ -0,0 +1,27 @@ +/datum/ghostspawner/human/visitorerror + short_name = "visitorerror" + name = "Visitor" + desc = "You are a Visitor, but noone told them." + tags = list("External") + + enabled = FALSE + landmark_name = "JoinLate" + req_perms = null + max_count = 1 + + //Vars related to human mobs + outfit = /datum/outfit/admin/random/visitor + possible_species = list("Human","Skrell","Tajara","Unathi") + possible_genders = list(MALE,FEMALE) + allow_appearance_change = TRUE + + assigned_role = "Visitor" + special_role = "Visitor" + respawn_flag = CREW + + mob_name = null + + enable_chance = 10 + +/datum/ghostspawner/human/visitorerror/select_spawnpoint(var/use=TRUE) + return pick(latejoin) \ No newline at end of file diff --git a/code/modules/ghostroles/spawner/simplemob/maintdrone.dm b/code/modules/ghostroles/spawner/simplemob/maintdrone.dm new file mode 100644 index 00000000000..bc3ba7578a0 --- /dev/null +++ b/code/modules/ghostroles/spawner/simplemob/maintdrone.dm @@ -0,0 +1,41 @@ +/datum/ghostspawner/simplemob/maintdrone + short_name = "maintdrone" + name = "Maintenence Drone" + desc = "Maintain and Improve the Systems on the Aurora" + tags = list("Simple Mobs") + + respawn_flag = MINISYNTH //Flag to check for when trying to spawn someone of that type (CREW, ANIMAL, MINISYNTH) + jobban_job = "Cyborg" + + //Vars regarding the mob to use + spawn_mob = /mob/living/simple_animal/rat //The mob that should be spawned + +/datum/ghostspawner/simplemob/maintdrone/cant_see() + if(!config.allow_drone_spawn) + return "Spawning as drone is disabled" + return ..() + +/datum/ghostspawner/simplemob/maintdrone/select_spawnpoint(var/use) + return TRUE //We just fake it here, since the spawnpoint is selected if someone is spawned in. + +//The proc to actually spawn in the user +/datum/ghostspawner/simplemob/maintdrone/spawn_mob(mob/user) + var/obj/machinery/drone_fabricator/fabricator + var/list/all_fabricators = list() + for(var/obj/machinery/drone_fabricator/DF in SSmachinery.all_machines) + if((DF.stat & NOPOWER) || !DF.produce_drones || DF.drone_progress < 100) + continue + all_fabricators[DF.fabricator_tag] = DF + + if(!all_fabricators.len) + to_chat(user, "There are no available drone spawn points, sorry.") + return FALSE + + var/choice = input(user, "Which fabricator do you wish to use?") as null|anything in all_fabricators + if(!choice || !all_fabricators[choice]) + return FALSE + fabricator = all_fabricators[choice] + + if(user && fabricator && !((fabricator.stat & NOPOWER) || !fabricator.produce_drones || fabricator.drone_progress < 100)) + return fabricator.create_drone(user.client) + return FALSE \ No newline at end of file diff --git a/code/modules/ghostroles/spawner/simplemob/rat.dm b/code/modules/ghostroles/spawner/simplemob/rat.dm new file mode 100644 index 00000000000..c6d61c029fa --- /dev/null +++ b/code/modules/ghostroles/spawner/simplemob/rat.dm @@ -0,0 +1,41 @@ +/datum/ghostspawner/simplemob/rat + short_name = "rat" + name = "Rat" + desc = "Join as a Rat on the aurora, a common nuciance to the crew." + welcome_message = "You are now a rat. Though you may interact with players, do not give any hints away that you are more than a simple rodent. Find food, avoid cats, and try to survive!" + tags = list("Simple Mobs") + + respawn_flag = ANIMAL //Flag to check for when trying to spawn someone of that type (CREW, ANIMAL, MINISYNTH) + + //Vars regarding the mob to use + spawn_mob = /mob/living/simple_animal/rat //The mob that should be spawned + + +//This proc selects the spawnpoint to use. +/datum/ghostspawner/simplemob/rat/select_spawnpoint() + //find a viable mouse candidate + var/obj/machinery/atmospherics/unary/vent_pump/spawnpoint = find_mouse_spawnpoint(pick(current_map.station_levels)) + return get_turf(spawnpoint) + +/datum/ghostspawner/simplemob/rat/cant_see() + if(config.disable_player_rats) + return "Spawning as Rat is disabled" + return ..() + +//The proc to actually spawn in the user +/datum/ghostspawner/simplemob/rat/spawn_mob(mob/user) + //Select a spawnpoint (if available) + var/turf/T = select_spawnpoint() + var/mob/living/simple_animal/S + if (T) + S = new spawn_mob(T) + else + to_chat(user, "Unable to find any safe, unwelded vents to spawn rats at. The station must be quite a mess! Trying again might work, if you think there's still a safe place. ") + + if(S) + if(config.uneducated_rats) + S.universal_understand = 0 + announce_ghost_joinleave(user, 0, "They are now a [name].") + S.ckey = user.ckey + + return S \ No newline at end of file diff --git a/code/modules/ghostroles/spawnpoint/spawnpoint.dm b/code/modules/ghostroles/spawnpoint/spawnpoint.dm new file mode 100644 index 00000000000..0ef1b0848cd --- /dev/null +++ b/code/modules/ghostroles/spawnpoint/spawnpoint.dm @@ -0,0 +1,124 @@ +#define STATE_UNAVAILABLE 1 +#define STATE_AVAILABLE 2 +#define STATE_RECHARGING 3 +#define STATE_USED 4 + +/obj/effect/ghostspawpoint + name = "invisible ghost spawner - single" + desc = "A Invisible ghost spawner" + icon = 'icons/mob/screen/generic.dmi' + icon_state = "x2" + + anchored = 1 + unacidable = 1 + simulated = 0 + invisibility = 101 + + var/identifier = null //identifier of this spawnpoint + + var/recharge_time = 0 //Time it takes until the ghostspawner can be used again + var/unavailable_time = null //Time when the ghost spawner became unavailable + var/icon_unavailable = "x2" + var/icon_available = "x2" //Icon to use when available + var/icon_recharging = "x2" //Icon to use when recharging + var/icon_used = "x2" //Icon to use when spwanpoint has been used + + var/state = STATE_AVAILABLE + +/obj/effect/ghostspawpoint/Initialize(mapload) + . = ..() + SSghostroles.add_spawnpoints(src) + +/obj/effect/ghostspawpoint/update_icon() + if(state == STATE_UNAVAILABLE) + icon_state = icon_unavailable + else if(state == STATE_AVAILABLE) + icon_state = icon_available + else if (state == STATE_RECHARGING) + icon_state = icon_recharging + else if (state == STATE_USED) + icon_state = icon_used + else + icon_state = initial(icon_state) + +/obj/effect/ghostspawpoint/process() + if(recharge_time && (recharge_time * 10) > (world.time - unavailable_time)) + STOP_PROCESSING(SSprocessing, src) + state = STATE_AVAILABLE + update_icon() + +/obj/effect/ghostspawpoint/attack_ghost(mob/user) + if(!ROUND_IS_STARTED) + to_chat(usr, "The round hasn't started yet!") + return + SSghostroles.vui_interact(user,identifier) + +/obj/effect/ghostspawpoint/attack_hand(mob/user) + if(!ROUND_IS_STARTED) + to_chat(usr, "The round hasn't started yet!") + return + SSghostroles.vui_interact(user,identifier) + +/obj/effect/ghostspawpoint/proc/is_available() + return state == STATE_AVAILABLE + +/obj/effect/ghostspawpoint/proc/set_spawned() + if(recharge_time) //If we are available again after a certain time -> being processing + state = STATE_RECHARGING + unavailable_time = world.time + START_PROCESSING(SSprocessing, src) + else + state = STATE_USED + update_icon() + +/obj/effect/ghostspawpoint/proc/set_available() + if(state == STATE_USED) + return //if its a one-use spawner and it got used already, dont reset it + state = STATE_AVAILABLE + update_icon() + +/obj/effect/ghostspawpoint/proc/set_unavailable() + if(state == STATE_USED) + return //if its a one-use spawner and it got used already, dont reset it + else if(state == STATE_RECHARGING) + STOP_PROCESSING(SSprocessing, src) + + state = STATE_UNAVAILABLE + update_icon() + +#undef STATE_UNAVAILABLE +#undef STATE_AVAILABLE +#undef STATE_RECHARGING +#undef STATE_USED + +/obj/effect/ghostspawpoint/repeat + name = "invisible ghost spawner - repeat" + desc = "A Invisible ghost spawner" + icon = 'icons/mob/screen/generic.dmi' + icon_state = "x3" + + icon_unavailable = "x3" //Icon to use when unavailable + icon_available = "x3" //Icon to use when available + icon_recharging = "x3" //Icon to use when recharging + icon_used = "x3" //Icon to use when spwanpoint has been used + + recharge_time = 1 + + +/obj/effect/ghostspawpoint/cryo + name = "cryogenic storage pod" + desc = "A pod used to store individual in suspended animation" + icon = 'icons/obj/sleeper.dmi' + icon_state = "sleeper-closed" + + identifier = null //identifier of this spawnpoint + + icon_unavailable = "sleeper-closed" //Icon to use when unavailable + icon_available = "sleeper-closed" //Icon to use when available + icon_recharging = "sleeper" //Icon to use when recharging + icon_used = "sleeper" //Icon to use when spwanpoint has been used + + anchored = 1 + unacidable = 1 + simulated = 1 + invisibility = 0 \ No newline at end of file diff --git a/code/modules/mob/abstract/new_player/preferences_setup.dm b/code/modules/mob/abstract/new_player/preferences_setup.dm index 52543d76c4d..18f0e7a327e 100644 --- a/code/modules/mob/abstract/new_player/preferences_setup.dm +++ b/code/modules/mob/abstract/new_player/preferences_setup.dm @@ -1,7 +1,10 @@ datum/preferences //The mob should have a gender you want before running this proc. Will run fine without H - proc/randomize_appearance_for(var/mob/living/carbon/human/H) - gender = pick(MALE, FEMALE) + proc/randomize_appearance_for(var/mob/living/carbon/human/H,var/random_gender=TRUE) + if(random_gender) + gender = pick(MALE, FEMALE) + else + gender = H.gender var/datum/species/current_species = all_species[species] if(current_species) diff --git a/code/modules/mob/abstract/observer/observer.dm b/code/modules/mob/abstract/observer/observer.dm index a53cdf8fdfa..d19c30bdef2 100644 --- a/code/modules/mob/abstract/observer/observer.dm +++ b/code/modules/mob/abstract/observer/observer.dm @@ -487,46 +487,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") -/mob/abstract/observer/verb/become_mouse() - set name = "Become Rat" - set category = "Ghost" - - if(config.disable_player_rats) - to_chat(src, "Spawning as a rat is currently disabled.") - return - - if(!ROUND_IS_STARTED) - to_chat(src, "You can not spawn as a rat before round start!") - return - - if(!MayRespawn(1, ANIMAL)) - return - - var/turf/T = get_turf(src) - if(!T || (T.z in current_map.admin_levels)) - to_chat(src, "You may not spawn as a rat on this Z-level.") - return - - var/response = alert(src, "Are you -sure- you want to become a rat?","Are you sure you want to squeek?","Squeek!","Nope!") - if(response != "Squeek!") return //Hit the wrong key...again. - - - //find a viable mouse candidate - var/mob/living/simple_animal/rat/host - var/obj/machinery/atmospherics/unary/vent_pump/spawnpoint = find_mouse_spawnpoint(T.z) - - if (spawnpoint) - host = new /mob/living/simple_animal/rat(spawnpoint.loc) - else - to_chat(src, "Unable to find any safe, unwelded vents to spawn rats at. The station must be quite a mess! Trying again might work, if you think there's still a safe place. ") - - if(host) - if(config.uneducated_rats) - host.universal_understand = 0 - announce_ghost_joinleave(src, 0, "They are now a rat.") - host.ckey = src.ckey - to_chat(host, "You are now a rat. Though you may interact with players, do not give any hints away that you are more than a simple rodent. Find food, avoid cats, and try to survive!") - /proc/find_mouse_spawnpoint(var/ZLevel) //This function will attempt to find a good spawnpoint for rats, and prevent them from spawning in closed vent systems with no escape //It does this by bruteforce: Picks a random vent, tests if it has enough connections, if not, repeat @@ -643,7 +603,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(usr == src && try_possession(M)) return if(istype(over, /obj/machinery/drone_fabricator)) - if(try_drone_spawn(src, over)) + var/obj/machinery/drone_fabricator/fab = over + if(fab.create_drone(src)) return return ..() @@ -658,7 +619,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp //Used for drawing on walls with blood puddles as a spooky ghost. /mob/abstract/observer/verb/bloody_doodle() - set category = "Ghost" set name = "Write in blood" set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." @@ -959,3 +919,15 @@ mob/abstract/observer/MayRespawn(var/feedback = 0, var/respawn_type = null) if((!target) || (!ghost)) return . = "\[F\]" . += target.extra_ghost_link(ghost) + + +//Opens the Ghost Spawner Menu +/mob/abstract/observer/verb/ghost_spawner() + set category = "Ghost" + set name = "Ghost Spawner" + + if(!ROUND_IS_STARTED) + to_chat(usr, "The round hasn't started yet!") + return + + SSghostroles.vui_interact(src) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index a7f9dc87b93..21a3bd46b33 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -80,6 +80,8 @@ This saves us from having to call add_fingerprint() any time something is put in return 1 if(slot_tie) return 1 + if(slot_in_belt) + return 1 /mob/living/carbon/human/u_equip(obj/W as obj) if(!W) return 0 @@ -291,6 +293,10 @@ This saves us from having to call add_fingerprint() any time something is put in if(src.get_active_hand() == W) src.remove_from_mob(W) W.forceMove(src.back) + if(slot_in_belt) + if(src.get_active_hand() == W) + src.remove_from_mob(W) + W.forceMove(src.belt) if(slot_tie) var/obj/item/clothing/under/uniform = src.w_uniform uniform.attackby(W,src) diff --git a/code/modules/mob/living/carbon/human/species/species_hud.dm b/code/modules/mob/living/carbon/human/species/species_hud.dm index ba0252168cf..ec0001d2a73 100644 --- a/code/modules/mob/living/carbon/human/species/species_hud.dm +++ b/code/modules/mob/living/carbon/human/species/species_hud.dm @@ -52,6 +52,10 @@ if(slot_w_uniform in equip_slots) equip_slots |= slot_tie + + if(slot_belt in equip_slots) + equip_slots |= slot_in_belt + equip_slots |= slot_legcuffed /datum/hud_data/diona diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 35330782ee7..4d8961c2eeb 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -57,7 +57,7 @@ /obj/machinery/drone_fabricator/examine(mob/user) ..(user) if(produce_drones && drone_progress >= 100 && istype(user,/mob/abstract) && config.allow_drone_spawn && count_drones() < config.max_maint_drones) - to_chat(user, "
A drone is prepared. Select 'Join As Drone' from the Ghost tab to spawn as a maintenance drone.") + to_chat(user, "
A drone is prepared. use 'Ghost Roles' from the Ghost tab to spawn as a maintenance drone.") /obj/machinery/drone_fabricator/proc/create_drone(var/client/player) @@ -84,47 +84,4 @@ drone_progress = 0 -/mob/abstract/observer/verb/join_as_drone() - set category = "Ghost" - set name = "Join As Drone" - set desc = "If there is a powered, enabled fabricator in the game world with a prepared chassis, join as a maintenance drone." - try_drone_spawn(src) - -/proc/try_drone_spawn(var/mob/user, var/obj/machinery/drone_fabricator/fabricator) - - if(!ROUND_IS_STARTED) - to_chat(user, "The game hasn't started yet!") - return - - if(!(config.allow_drone_spawn)) - to_chat(user, "That verb is not currently permitted.") - return - - if(jobban_isbanned(user,"Cyborg")) - to_chat(user, "You are banned from playing synthetics and cannot spawn as a drone.") - return - - if(!user.MayRespawn(1, MINISYNTH)) - return - - if(!fabricator) - - var/list/all_fabricators = list() - for(var/obj/machinery/drone_fabricator/DF in SSmachinery.all_machines) - if((DF.stat & NOPOWER) || !DF.produce_drones || DF.drone_progress < 100) - continue - all_fabricators[DF.fabricator_tag] = DF - - if(!all_fabricators.len) - to_chat(user, "There are no available drone spawn points, sorry.") - return - - var/choice = input(user,"Which fabricator do you wish to use?") as null|anything in all_fabricators - if(!choice || !all_fabricators[choice]) - return - fabricator = all_fabricators[choice] - - if(user && fabricator && !((fabricator.stat & NOPOWER) || !fabricator.produce_drones || fabricator.drone_progress < 100)) - fabricator.create_drone(user.client) - return 1 - return + return new_drone \ No newline at end of file diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 0e907da449c..720f8fcae63 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -54,4 +54,3 @@ MOB_STOP_THINKING(src) update_client_color() - testing("mob_login - end") diff --git a/code/modules/random_map/drop/droppod.dm b/code/modules/random_map/drop/droppod.dm index a67f54c4dbc..d361cbe40fa 100644 --- a/code/modules/random_map/drop/droppod.dm +++ b/code/modules/random_map/drop/droppod.dm @@ -13,6 +13,7 @@ wall_type = /turf/simulated/wall/titanium floor_type = /turf/simulated/floor/reinforced + spawn_roof = TRUE var/list/supplied_drop_types = list() var/door_type = /obj/structure/droppod_door var/drop_type = /mob/living/simple_animal/parrot diff --git a/code/modules/random_map/random_map.dm b/code/modules/random_map/random_map.dm index 5d63b059fb9..48d3b077731 100644 --- a/code/modules/random_map/random_map.dm +++ b/code/modules/random_map/random_map.dm @@ -23,6 +23,7 @@ var/global/list/map_count = list() var/wall_type = /turf/simulated/wall var/floor_type = /turf/simulated/floor var/target_turf_type + var/spawn_roof = FALSE //Set to TRUE if a roof should be spawned based. // Storage for the final iteration of the map. var/list/map = list() // Actual map. @@ -179,6 +180,8 @@ var/global/list/map_count = list() var/newpath = get_appropriate_path(map[tmp_cell]) if(newpath) T.ChangeTurf(newpath) + if(spawn_roof) + T.spawn_roof() get_additional_spawns(map[tmp_cell],T,get_spawn_dir(x, y)) return T diff --git a/code/unit_tests/spawner_tests.dm b/code/unit_tests/spawner_tests.dm new file mode 100644 index 00000000000..cce608f912f --- /dev/null +++ b/code/unit_tests/spawner_tests.dm @@ -0,0 +1,38 @@ +/* + * + * Unit Test Template + * This file is not used. + * + */ + +datum/unit_test/template + name = "Ghost Spawner Tests" // If it's a template leave the word "template" in it's name so it's not ran. + + +datum/unit_test/template/start_test() + var/list/ignore_spawners = list( + /datum/ghostspawner/human, + /datum/ghostspawner/human/admin, + /datum/ghostspawner/simplemob + ) + var/failed_checks = 0 + var/checks = 0 + + for(var/spawner in subtypesof(/datum/ghostspawner)) + checks++ + var/datum/ghostspawner/G = new spawner + if(instances_of_type_in_list(G,ignore_spawners, strict = TRUE)) + continue + //Check if we hae name, short_name and desc set + if(!G.short_name || !G.name || !G.desc) + log_unit_test("[ascii_red]--------------- Invalid Spawner: Type:[G.type], Short-Name:[G.short_name], Name:[G.name]") + failed_checks++ + + if(failed_checks) + fail("\[[failed_checks] / [checks]\] Ghost Spawners are invalid") + else + pass("All Ghost Spawners are valid.") + + + return 1 +// ============================================================================ diff --git a/maps/aurora/aurora-1_centcomm.dmm b/maps/aurora/aurora-1_centcomm.dmm index a32e9dc2da9..6427f061223 100644 --- a/maps/aurora/aurora-1_centcomm.dmm +++ b/maps/aurora/aurora-1_centcomm.dmm @@ -6507,15 +6507,6 @@ }, /turf/simulated/floor/tiled, /area/merchant_station) -"apk" = ( -/obj/machinery/computer/cryopod{ - pixel_y = 32 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/merchant_station) "apl" = ( /obj/machinery/sleeper{ icon_state = "sleeper_0"; @@ -6608,8 +6599,6 @@ /area/merchant_station) "apy" = ( /obj/structure/table/reinforced, -/obj/item/weapon/storage/firstaid/fire, -/obj/item/weapon/storage/firstaid/o2, /obj/item/weapon/storage/firstaid/toxin, /obj/item/weapon/storage/firstaid/regular, /turf/simulated/floor/tiled, @@ -23760,7 +23749,9 @@ /turf/simulated/floor/tiled/dark, /area/centcom/legion) "bbm" = ( -/obj/structure/bed/chair/comfy/black, +/obj/effect/landmark{ + name = "TCFLCommander" + }, /turf/simulated/floor/carpet/blue, /area/centcom/legion) "bbn" = ( @@ -24430,6 +24421,12 @@ icon_state = "floor" }, /area/centcom/ferry) +"gVd" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/storage/firstaid/fire, +/obj/item/weapon/storage/firstaid/o2, +/turf/simulated/floor/tiled, +/area/merchant_station) "haj" = ( /obj/machinery/chem_master, /turf/simulated/floor/tiled/dark, @@ -24438,6 +24435,10 @@ /obj/structure/bed/chair/office/dark{ dir = 1 }, +/obj/effect/ghostspawpoint{ + identifier = "OdinCheckpoint"; + name = "igs - OdinCheckpoint" + }, /turf/unsimulated/floor{ icon_state = "floor" }, @@ -24811,6 +24812,13 @@ /obj/effect/wingrille_spawn/reinforced/crescent, /turf/template_noop, /area/centcom/evac) +"mrx" = ( +/obj/effect/ghostspawpoint/cryo{ + dir = 4; + identifier = "MerchantAss" + }, +/turf/simulated/floor/tiled, +/area/merchant_station) "mQj" = ( /turf/unsimulated/floor{ dir = 10; @@ -25101,6 +25109,10 @@ /area/centcom/living) "sQk" = ( /obj/structure/bed/chair/office/dark, +/obj/effect/ghostspawpoint{ + identifier = "OdinCheckpoint"; + name = "igs - OdinCheckpoint" + }, /turf/unsimulated/floor{ icon_state = "floor" }, @@ -25151,6 +25163,15 @@ dir = 4 }, /area/centcom/living) +"tou" = ( +/obj/effect/landmark{ + name = "CCIAEscort" + }, +/turf/unsimulated/floor{ + icon_state = "vault"; + dir = 5 + }, +/area/centcom/ferry) "tAQ" = ( /obj/machinery/door/blast/odin{ density = 0; @@ -25181,6 +25202,15 @@ icon_state = "floor" }, /area/centcom/checkpoint/fore) +"uQh" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/computer/cryopod{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled, +/area/merchant_station) "vdZ" = ( /obj/effect/decal/warning_stripes, /obj/machinery/porta_turret/crescent, @@ -29863,7 +29893,7 @@ ahM ahM aaP ahV -ahV +aoY aoY aoY aoY @@ -30120,10 +30150,10 @@ ahM aaP aaP ahV -ahV aoY api api +api aoY apN aXW @@ -30377,8 +30407,8 @@ ahM aaP ahV ahV -ahV aoY +mrx apj apj aoY @@ -30634,9 +30664,9 @@ ahM aaP ahV ahV -ahV aoY -apk +uQh +apt apt apK apt @@ -30891,8 +30921,8 @@ ahM aaP ahV ahV -ahV aoY +gVd apl apy aoY @@ -31148,7 +31178,7 @@ ahM aaP ahV ahV -ahV +aoY aoY aoY aoY @@ -60765,7 +60795,7 @@ aDm aDm aDM aDY -aDY +tou aDY aDM aEN diff --git a/vueui/babel.config.js b/vueui/babel.config.js index 2131e9279e8..8b93f7325e5 100644 --- a/vueui/babel.config.js +++ b/vueui/babel.config.js @@ -1,5 +1,13 @@ module.exports = { presets: [ - ['@vue/app', { useBuiltIns: 'entry' }] + ['@babel/preset-env', + { + useBuiltIns: 'usage', + corejs: 3, + targets: { + ie: 9 + } + } + ] ] } \ No newline at end of file diff --git a/vueui/package-lock.json b/vueui/package-lock.json index d13341c88a6..2bcc3caaf75 100644 --- a/vueui/package-lock.json +++ b/vueui/package-lock.json @@ -5,31 +5,31 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, "@babel/core": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.4.tgz", - "integrity": "sha512-+DaeBEpYq6b2+ZmHx3tHspC+ZRflrvLqwfv8E3hNr5LVQoyBnL8RPKSBCg+rK2W2My9PWlujBiqd0ZPsR9Q6zQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.5.0", - "@babel/helpers": "^7.5.4", - "@babel/parser": "^7.5.0", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.0", - "@babel/types": "^7.5.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", "convert-source-map": "^1.1.0", "debug": "^4.1.0", "json5": "^2.1.0", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" @@ -43,20 +43,34 @@ "requires": { "minimist": "^1.2.0" } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true } } }, "@babel/generator": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.0.tgz", - "integrity": "sha512-1TTVrt7J9rcG5PMjvO7VEG3FrEoEJNHxumRq66GemPmzboLWtIjjcJgk8rokuAS7IiRSpgVSu5Vb9lc99iJkOA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", "dev": true, "requires": { - "@babel/types": "^7.5.0", + "@babel/types": "^7.5.5", "jsesc": "^2.5.1", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "source-map": "^0.5.0", "trim-right": "^1.0.1" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/helper-annotate-as-pure": { @@ -90,28 +104,36 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.0.tgz", - "integrity": "sha512-EAoMc3hE5vE5LNhMqDOwB1usHvmRjCDAnH8CD4PVkX9/Yr3W/tcz8xE8QvdZxfsFBDICwZnF2UTHIqslRpvxmA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz", + "integrity": "sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg==", "dev": true, "requires": { "@babel/helper-function-name": "^7.1.0", - "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-member-expression-to-functions": "^7.5.5", "@babel/helper-optimise-call-expression": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.4.4", + "@babel/helper-replace-supers": "^7.5.5", "@babel/helper-split-export-declaration": "^7.4.4" } }, "@babel/helper-define-map": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz", - "integrity": "sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", + "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", "dev": true, "requires": { "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.4.4", - "lodash": "^4.17.11" + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/helper-explode-assignable-expression": { @@ -154,12 +176,12 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", - "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.5.5" } }, "@babel/helper-module-imports": { @@ -172,17 +194,25 @@ } }, "@babel/helper-module-transforms": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz", - "integrity": "sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", + "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-simple-access": "^7.1.0", "@babel/helper-split-export-declaration": "^7.4.4", "@babel/template": "^7.4.4", - "@babel/types": "^7.4.4", - "lodash": "^4.17.11" + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/helper-optimise-call-expression": { @@ -201,12 +231,20 @@ "dev": true }, "@babel/helper-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.4.tgz", - "integrity": "sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", "dev": true, "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/helper-remap-async-to-generator": { @@ -223,15 +261,15 @@ } }, "@babel/helper-replace-supers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz", - "integrity": "sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-member-expression-to-functions": "^7.5.5", "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } }, "@babel/helper-simple-access": { @@ -266,14 +304,14 @@ } }, "@babel/helpers": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.4.tgz", - "integrity": "sha512-6LJ6xwUEJP51w0sIgKyfvFMJvIb9mWAfohJp0+m6eHJigkFdcH8duZ1sfhn0ltJRzwUIT/yqqhdSfRpCpL7oow==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", "dev": true, "requires": { "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.0", - "@babel/types": "^7.5.0" + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } }, "@babel/highlight": { @@ -288,9 +326,9 @@ } }, "@babel/parser": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.0.tgz", - "integrity": "sha512-I5nW8AhGpOXGCCNYGc+p7ExQIBxRFnS2fd/d862bNOKvmoEPjYPcfIjsfdy0ujagYOIYPczKgD9l3FsgTkAzKA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -305,12 +343,12 @@ } }, "@babel/plugin-proposal-class-properties": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.0.tgz", - "integrity": "sha512-9L/JfPCT+kShiiTTzcnBJ8cOwdKVmlC1RcCf9F0F9tERVrM4iWtWnXtjWCRqNm2la2BxO1MPArWNsU9zsSJWSQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", + "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.5.0", + "@babel/helper-create-class-features-plugin": "^7.5.5", "@babel/helper-plugin-utils": "^7.0.0" } }, @@ -325,6 +363,16 @@ "@babel/plugin-syntax-decorators": "^7.2.0" } }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", + "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, "@babel/plugin-proposal-json-strings": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", @@ -336,9 +384,9 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.4.tgz", - "integrity": "sha512-KCx0z3y7y8ipZUMAEEJOyNi11lMb/FOPUjjB113tfowgw0c16EGYos7worCKBcUAh2oG+OBnoUhsnTSoLpV9uA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", + "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -459,27 +507,35 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz", - "integrity": "sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz", + "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/plugin-transform-classes": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz", - "integrity": "sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.4.4", + "@babel/helper-define-map": "^7.5.5", "@babel/helper-function-name": "^7.1.0", "@babel/helper-optimise-call-expression": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.4.4", + "@babel/helper-replace-supers": "^7.5.5", "@babel/helper-split-export-declaration": "^7.4.4", "globals": "^11.1.0" } @@ -560,6 +616,15 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-transform-modules-amd": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", @@ -623,13 +688,13 @@ } }, "@babel/plugin-transform-object-super": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", - "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0" + "@babel/helper-replace-supers": "^7.5.5" } }, "@babel/plugin-transform-parameters": { @@ -643,6 +708,15 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-transform-regenerator": { "version": "7.4.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", @@ -652,10 +726,19 @@ "regenerator-transform": "^0.14.0" } }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-transform-runtime": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.0.tgz", - "integrity": "sha512-LmPIZOAgTLl+86gR9KjLXex6P/lRz1fWEjTz6V6QZMmKie51ja3tvzdwORqhHc4RWR8TcZ5pClpRWs0mlaA2ng==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.5.tgz", + "integrity": "sha512-6Xmeidsun5rkwnGfMOp6/z9nSzWpHFNVr2Jx7kwoq4mVatQfQx5S56drBgEHF+XQbKOdIaOiMIINvp/kAwMN+w==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -731,69 +814,76 @@ } }, "@babel/preset-env": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.4.tgz", - "integrity": "sha512-2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz", + "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.3.4", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-json-strings": "^7.2.0", "@babel/plugin-syntax-object-rest-spread": "^7.2.0", "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.3.4", + "@babel/plugin-transform-async-to-generator": "^7.5.0", "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.3.4", - "@babel/plugin-transform-classes": "^7.3.4", + "@babel/plugin-transform-block-scoping": "^7.5.5", + "@babel/plugin-transform-classes": "^7.5.5", "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.2.0", - "@babel/plugin-transform-dotall-regex": "^7.2.0", - "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.5.0", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.2.0", - "@babel/plugin-transform-function-name": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.2.0", - "@babel/plugin-transform-modules-commonjs": "^7.2.0", - "@babel/plugin-transform-modules-systemjs": "^7.3.4", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.5.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.3.0", - "@babel/plugin-transform-new-target": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.2.0", - "@babel/plugin-transform-parameters": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.3.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", "@babel/plugin-transform-shorthand-properties": "^7.2.0", "@babel/plugin-transform-spread": "^7.2.0", "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.2.0", - "browserslist": "^4.3.4", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.5.5", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", "invariant": "^2.2.2", "js-levenshtein": "^1.1.3", - "semver": "^5.3.0" + "semver": "^5.5.0" } }, "@babel/runtime": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.4.tgz", - "integrity": "sha512-Na84uwyImZZc3FKf4aUF1tysApzwf3p2yuFBIyBfbzT5glzKTdvYI4KVW4kcgjrzoGUjC7w3YyCHcJKaRxsr2Q==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", "dev": true, "requires": { "regenerator-runtime": "^0.13.2" } }, "@babel/runtime-corejs2": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.5.4.tgz", - "integrity": "sha512-sHv74OzyZ18d6tjHU0HmlVES3+l+lydkOMTiKsJSTGWcTBpIMfXLEgduahlJrQjknW9RCQAqLIEdLOHjBmq/hg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.5.5.tgz", + "integrity": "sha512-FYATQVR00NSNi7mUfpPDp7E8RYMXDuO8gaix7u/w3GekfUinKgX1AcTxs7SoiEmoEW9mbpjrwqWSW6zCmw5h8A==", "dev": true, "requires": { "core-js": "^2.6.5", @@ -820,37 +910,53 @@ } }, "@babel/traverse": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.0.tgz", - "integrity": "sha512-SnA9aLbyOCcnnbQEGwdfBggnc142h/rbqqsXcaATj2hZcegCl903pUD/lfpsNBlBSuWow/YDfRyJuWi2EPR5cg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.5.0", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", "@babel/helper-function-name": "^7.1.0", "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.5.0", - "@babel/types": "^7.5.0", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/types": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.0.tgz", - "integrity": "sha512-UFpDVqRABKsW01bvw7/wSUe56uy6RXM5+VJibVVAybDGxEW25jdwiFJEf7ASvSaC7sN7rbE/l3cLp2izav+CtQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", "dev": true, "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@fortawesome/fontawesome-free": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.9.0.tgz", - "integrity": "sha512-g795BBEzM/Hq2SYNPm/NQTIp3IWd4eXSH0ds87Na2jnrAUFX3wkyZAI4Gwj9DOaWMuz2/01i8oWI7P7T/XLkhg==" + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.10.1.tgz", + "integrity": "sha512-PYncBhgN1l02mwHmczukexmu4yRTjRDAAdcK62jdWSAW8epcnZ9K2win/7rMrffiv/c7XLVDA8vD+yi6WyvbGQ==" }, "@hapi/address": { "version": "2.0.0", @@ -892,9 +998,9 @@ }, "dependencies": { "@hapi/hoek": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.0.2.tgz", - "integrity": "sha512-O6o6mrV4P65vVccxymuruucb+GhP2zl9NLCG8OdoFRS8BEGw3vwpPp20wpAtpbQQxz1CEUtmxJGgWhjq1XA3qw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.1.0.tgz", + "integrity": "sha512-b1J4jxYnW+n6lC91V6Pqg9imP9BZq0HNCeM+3sbXg05rQsE9cGYrKFpZjyztVesGmNRE6R+QaEoWGATeIiUVjA==", "dev": true } } @@ -1003,9 +1109,9 @@ "dev": true }, "@types/node": { - "version": "12.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.2.tgz", - "integrity": "sha512-gojym4tX0FWeV2gsW4Xmzo5wxGjXGm550oVUII7f7G5o4BV6c7DBdiG1RRQd+y1bvqRyYtPfMK85UM95vsapqQ==", + "version": "12.6.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.9.tgz", + "integrity": "sha512-+YB9FtyxXGyD54p8rXwWaN1EWEyar5L58GlGWgtH2I9rGmLGBQcw63+0jw+ujqVavNuO47S1ByAjm9zdHMnskw==", "dev": true }, "@types/normalize-package-data": { @@ -1041,9 +1147,9 @@ } }, "@vue/babel-preset-app": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-3.9.2.tgz", - "integrity": "sha512-0suuCbu4jkVcVYBjPmuKxeDbrhwThYZHu3DUmtsVuOzFEGeXmco60VmXveniL/bnDUdZyknSuYP4FxgS34gw9w==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-3.10.0.tgz", + "integrity": "sha512-NzJLI4Qe0SYm9gVHQC9RXyP0YcPjI28TmZ0ds2RJa9NO96LXHLES2U1HqiMDN4+CVjOQFrWUNd7wWeaETRPXbg==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -1061,6 +1167,57 @@ "core-js": "^2.6.5" }, "dependencies": { + "@babel/preset-env": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.4.tgz", + "integrity": "sha512-2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.3.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.3.4", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.3.4", + "@babel/plugin-transform-classes": "^7.3.4", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.2.0", + "@babel/plugin-transform-dotall-regex": "^7.2.0", + "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.2.0", + "@babel/plugin-transform-function-name": "^7.2.0", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.2.0", + "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "@babel/plugin-transform-modules-systemjs": "^7.3.4", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.3.0", + "@babel/plugin-transform-new-target": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-parameters": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.3.4", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.2.0", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.2.0", + "browserslist": "^4.3.4", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.3.0" + } + }, "core-js": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", @@ -1070,9 +1227,9 @@ } }, "@vue/babel-preset-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.0.0.tgz", - "integrity": "sha512-5CbDu/QHS+TtQNw5aYAffiMxBBB2Eo9+RJpS8X+6FJbdG5Rvc4TVipEqkrg0pJviWadNg7TEy0Uz4o7VNXeIZw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.1.0.tgz", + "integrity": "sha512-EeZ9gwEmu79B4A6LMLAw5cPCVYIcbKWgJgJafWtLzh1S+SgERUmTkVQ9Vx4k8zYBiCuxHK3XziZ3VJIMau7THA==", "dev": true, "requires": { "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", @@ -1080,7 +1237,7 @@ "@vue/babel-sugar-functional-vue": "^1.0.0", "@vue/babel-sugar-inject-h": "^1.0.0", "@vue/babel-sugar-v-model": "^1.0.0", - "@vue/babel-sugar-v-on": "^1.0.0" + "@vue/babel-sugar-v-on": "^1.1.0" } }, "@vue/babel-sugar-functional-vue": { @@ -1116,9 +1273,9 @@ } }, "@vue/babel-sugar-v-on": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.0.0.tgz", - "integrity": "sha512-2aqJaDLKdSSGlxZU+GjFERaSNUaa6DQreV+V/K4W/6Lxj8520/r1lChWEa/zuAoPD2Vhy0D2QrqqO+I0D6CkKw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.1.0.tgz", + "integrity": "sha512-8DwAj/RLpmrDP4eZ3erJcKcyuLArLUYagNODTsSQrMdG5zmLJoFFtEjODfYRh/XxM2wXv9Wxe+HAB41FQxxwQA==", "dev": true, "requires": { "@babel/plugin-syntax-jsx": "^7.2.0", @@ -1127,20 +1284,20 @@ } }, "@vue/cli-overlay": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-3.9.0.tgz", - "integrity": "sha512-QfyvpJl2ChehBT2qzb5EvW921JxW94uFL3+lHa6VT42ImH8awrvkTGZmxTQWhHvATa7r0LKy7M7ZRMyo547esg==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-3.10.0.tgz", + "integrity": "sha512-DQCY6WIl1UN1nOuPirW63CcYWSBdIn6s4zdGfFodCfV+0PAEXGcrfNStygG+IKUsydQaJGTneV7SFxcS+9gyzA==", "dev": true }, "@vue/cli-plugin-babel": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-3.9.2.tgz", - "integrity": "sha512-XqfmGjUGnnJ3NA+HC31F6nkBvB9pFDhk4Lxeao8ZNJcEjKNEBYjlmHunJQdIe/jEXXum6U+U/ZE6DjDStHTIMw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-3.10.0.tgz", + "integrity": "sha512-NHrg6ZYN2fh5ZiMMzCNRuDlH9mcTOu+GIti1Va/zPnG3qMkX2iZ0zZGFaOCltIFoVSXdyOfa0sMtJGDoP9Q7ZA==", "dev": true, "requires": { "@babel/core": "^7.0.0", - "@vue/babel-preset-app": "^3.9.2", - "@vue/cli-shared-utils": "^3.9.0", + "@vue/babel-preset-app": "^3.10.0", + "@vue/cli-shared-utils": "^3.10.0", "babel-loader": "^8.0.5", "webpack": ">=4 < 4.29" }, @@ -1180,12 +1337,12 @@ } }, "@vue/cli-plugin-eslint": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-3.9.2.tgz", - "integrity": "sha512-AdvWJN+4Px2r3hbTDM2/rCtTcS6VyI7XuRljbfr2V9nF9cJiH4qsXFrTCRj3OgupbXJ14fUGKrLxmznLZIm1jA==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-3.10.0.tgz", + "integrity": "sha512-grM3Z4je8XlPomhYqTC4ILB26rTrJKZhEkCwbXdduMrWtpn2Ggotl2nYayplOzDgoZ4Cx3ykJMkRulla2Zi47g==", "dev": true, "requires": { - "@vue/cli-shared-utils": "^3.9.0", + "@vue/cli-shared-utils": "^3.10.0", "babel-eslint": "^10.0.1", "eslint": "^4.19.1", "eslint-loader": "^2.1.2", @@ -1230,15 +1387,15 @@ } }, "@vue/cli-service": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-3.9.2.tgz", - "integrity": "sha512-R4L9tCMpJ4DzLgu/aU9CEtl5QYsj/FXRrtEgXSKm+71OVtA/o2rkLTC8SLB2Bu7wHP/HCYbaoy4NZqSEQzTuLw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-3.10.0.tgz", + "integrity": "sha512-aQaAjtkpSl4XFBM7Di9doh4GvHp1H8/H1QJKRK8bPJ5MVbt8Lt4tBo+YgK9Qs/9x0mrxCAa5UrR9+8ZWIQs2Zw==", "dev": true, "requires": { "@intervolga/optimize-cssnano-plugin": "^1.0.5", "@soda/friendly-errors-webpack-plugin": "^1.7.1", - "@vue/cli-overlay": "^3.9.0", - "@vue/cli-shared-utils": "^3.9.0", + "@vue/cli-overlay": "^3.10.0", + "@vue/cli-shared-utils": "^3.10.0", "@vue/component-compiler-utils": "^2.6.0", "@vue/preload-webpack-plugin": "^1.1.0", "@vue/web-component-wrapper": "^1.2.0", @@ -1268,7 +1425,7 @@ "hash-sum": "^1.0.2", "html-webpack-plugin": "^3.2.0", "launch-editor-middleware": "^2.2.1", - "lodash.defaultsdeep": "^4.6.0", + "lodash.defaultsdeep": "^4.6.1", "lodash.mapvalues": "^4.6.0", "lodash.transform": "^4.6.0", "mini-css-extract-plugin": "^0.6.0", @@ -1294,15 +1451,15 @@ }, "dependencies": { "acorn": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", - "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", + "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==", "dev": true }, "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "webpack": { @@ -1348,9 +1505,9 @@ } }, "@vue/cli-shared-utils": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-3.9.0.tgz", - "integrity": "sha512-wumeMZTz5aQ+1Y6uxTKegIsgOXEWT3hT8f9sW2mj5SwNDVyQ+AHZTgSynYExTUJg3dH81uKgFDUpPdAvGxzh8g==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-3.10.0.tgz", + "integrity": "sha512-i96XBUtLdWeKFCC/ot12ngqnVikN/dXpelGdyxvNZczCkX7Je0FUdrZkiw0+uTYTu1RmuYWpLs+vb/YQerjiWg==", "dev": true, "requires": { "@hapi/joi": "^15.0.1", @@ -1368,9 +1525,9 @@ }, "dependencies": { "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -1417,9 +1574,9 @@ } }, "@vue/preload-webpack-plugin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.0.tgz", - "integrity": "sha512-rcn2KhSHESBFMPj5vc5X2pI9bcBNQQixvJXhD5gZ4rN2iym/uH2qfDSQfUS5+qwiz0a85TCkeUs6w6jxFDudbw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.1.tgz", + "integrity": "sha512-8VCoJeeH8tCkzhkpfOkt+abALQkS11OIHhte5MBzYaKMTqK0A3ZAKEUVAffsOklhEv7t0yrQt696Opnu9oAx+w==", "dev": true }, "@vue/web-component-wrapper": { @@ -2021,9 +2178,9 @@ "dev": true }, "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, "asynckit": { @@ -2289,7 +2446,8 @@ "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true }, "binary-extensions": { "version": "1.13.1", @@ -2561,15 +2719,16 @@ "dev": true }, "cacache": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", - "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.2.tgz", + "integrity": "sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg==", "requires": { "bluebird": "^3.5.5", "chownr": "^1.1.1", "figgy-pudding": "^3.5.1", "glob": "^7.1.4", "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", @@ -2994,7 +3153,8 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true + "dev": true, + "optional": true }, "coa": { "version": "2.0.2", @@ -4094,13 +4254,21 @@ } }, "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz", + "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", "dev": true, "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } } }, "domain-browser": { @@ -4260,9 +4428,9 @@ } }, "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", "dev": true }, "errno": { @@ -4583,9 +4751,9 @@ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "etag": { @@ -5172,7 +5340,8 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -5190,11 +5359,13 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5207,15 +5378,18 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -5318,7 +5492,8 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -5328,6 +5503,7 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5340,17 +5516,20 @@ "minimatch": { "version": "3.0.4", "bundled": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -5367,6 +5546,7 @@ "mkdirp": { "version": "0.5.1", "bundled": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -5439,7 +5619,8 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "bundled": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -5449,6 +5630,7 @@ "once": { "version": "1.4.0", "bundled": true, + "optional": true, "requires": { "wrappy": "1" } @@ -5524,7 +5706,8 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true + "bundled": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -5554,6 +5737,7 @@ "string-width": { "version": "1.0.2", "bundled": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5571,6 +5755,7 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5609,11 +5794,13 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "bundled": true, + "optional": true }, "yallist": { "version": "3.0.3", - "bundled": true + "bundled": true, + "optional": true } } }, @@ -6020,9 +6207,9 @@ "dev": true }, "highlight.js": { - "version": "9.15.8", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.8.tgz", - "integrity": "sha512-RrapkKQWwE+wKdF73VsOa2RQdIoO3mxwJ4P8mhbI6KYJUraUHRKM5w5zQQKXNk0xNL4UVRdulV9SBJcmzJNzVA==", + "version": "9.15.9", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.9.tgz", + "integrity": "sha512-M0zZvfLr5p0keDMCAhNBp03XJbKBxUx5AfyfufMdFMEP4N/Xj6dh0IqC75ys7BAzceR34NgcvXjupRVaHBPPVQ==", "dev": true }, "hmac-drbg": { @@ -6155,6 +6342,12 @@ "readable-stream": "^3.1.1" }, "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, "readable-stream": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", @@ -6386,6 +6579,11 @@ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6958,7 +7156,8 @@ "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true }, "jsonfile": { "version": "4.0.0", @@ -7040,6 +7239,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, + "optional": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -7141,6 +7341,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, "requires": { "big.js": "^3.1.3", "emojis-list": "^2.0.0", @@ -7430,9 +7631,9 @@ } }, "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.4.tgz", + "integrity": "sha512-FYE8xI+6pjFOhokZu0We3S5NKCirLbCzSh2Usf3qEyr4X8U+0jNg9P8RZ4qz+V2UoECLVwSyzU3LxXBaLGtD3A==", "dev": true }, "methods": { @@ -9110,7 +9311,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "dev": true, + "optional": true }, "prepend-http": { "version": "2.0.0", @@ -9481,15 +9683,15 @@ } }, "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", "dev": true }, "regenerator-transform": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.0.tgz", - "integrity": "sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", "dev": true, "requires": { "private": "^0.1.6" @@ -9848,7 +10050,8 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true + "dev": true, + "optional": true }, "rx-lite-aggregates": { "version": "4.0.8", @@ -10534,9 +10737,9 @@ } }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -10587,9 +10790,9 @@ "dev": true }, "spdy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", - "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", "dev": true, "requires": { "debug": "^4.1.0", @@ -11038,9 +11241,9 @@ } }, "terser": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.2.tgz", - "integrity": "sha512-jvNoEQSPXJdssFwqPSgWjsOrb+ELoE+ILpHPKXC83tIxOlh2U75F1KuB2luLD/3a6/7K3Vw5pDn+hvu0C4AzSw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.3.tgz", + "integrity": "sha512-on13d+cnpn5bMouZu+J8tPYQecsdRJCJuxFJ+FVoPBoLJgk5bCBkp+Uen2hWyi0KIUm6eDarnlAlH+KgIx/PuQ==", "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -11055,45 +11258,21 @@ } }, "terser-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", "requires": { - "cacache": "^11.3.2", - "find-cache-dir": "^2.0.0", + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", - "loader-utils": "^1.2.3", "schema-utils": "^1.0.0", "serialize-javascript": "^1.7.0", "source-map": "^0.6.1", - "terser": "^4.0.0", - "webpack-sources": "^1.3.0", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", "worker-farm": "^1.7.0" }, "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -11348,6 +11527,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, + "optional": true, "requires": { "prelude-ls": "~1.1.2" } @@ -11782,16 +11962,57 @@ "dev": true }, "vue-loader": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.7.0.tgz", - "integrity": "sha512-x+NZ4RIthQOxcFclEcs8sXGEWqnZHodL2J9Vq+hUz+TDZzBaDIh1j3d9M2IUlTjtrHTZy4uMuRdTi8BGws7jLA==", + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.7.1.tgz", + "integrity": "sha512-fwIKtA23Pl/rqfYP5TSGK7gkEuLhoTvRYW+TU7ER3q9GpNLt/PjG5NLv3XHRDiTg7OPM1JcckBgds+VnAc+HbA==", "dev": true, "requires": { - "@vue/component-compiler-utils": "^2.5.1", + "@vue/component-compiler-utils": "^3.0.0", "hash-sum": "^1.0.2", "loader-utils": "^1.1.0", "vue-hot-reload-api": "^2.3.0", "vue-style-loader": "^4.1.0" + }, + "dependencies": { + "@vue/component-compiler-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.0.0.tgz", + "integrity": "sha512-am+04/0UX7ektcmvhYmrf84BDVAD8afFOf4asZjN84q8xzxFclbk5x0MtxuKGfp+zjN5WWPJn3fjFAWtDdIGSw==", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.14", + "postcss-selector-parser": "^5.0.0", + "prettier": "1.16.3", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } } }, "vue-style-loader": { @@ -11849,33 +12070,33 @@ } }, "webpack": { - "version": "4.35.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.35.3.tgz", - "integrity": "sha512-xggQPwr9ILlXzz61lHzjvgoqGU08v5+Wnut19Uv3GaTtzN4xBTcwnobodrXE142EL1tOiS5WVEButooGzcQzTA==", + "version": "4.39.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.1.tgz", + "integrity": "sha512-/LAb2TJ2z+eVwisldp3dqTEoNhzp/TLCZlmZm3GGGAlnfIWDgOEE758j/9atklNLfRyhKbZTCOIoPqLJXeBLbQ==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-module-context": "1.8.5", "@webassemblyjs/wasm-edit": "1.8.5", "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", + "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" }, "dependencies": { "@webassemblyjs/ast": { @@ -12042,9 +12263,53 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "acorn": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", - "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==" + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", + "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==" + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" }, "schema-utils": { "version": "1.0.0", @@ -12059,9 +12324,9 @@ } }, "webpack-bundle-analyzer": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz", - "integrity": "sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.4.1.tgz", + "integrity": "sha512-Bs8D/1zF+17lhqj2OYmzi7HEVYqEVxu7lCO9Ff8BwajenOU0vAwEoV8e4ICCPNZAcqR1PCR/7o2SkW+cnCmF0A==", "dev": true, "requires": { "acorn": "^6.0.7", @@ -12073,16 +12338,22 @@ "express": "^4.16.3", "filesize": "^3.6.1", "gzip-size": "^5.0.0", - "lodash": "^4.17.10", + "lodash": "^4.17.15", "mkdirp": "^0.5.1", "opener": "^1.5.1", "ws": "^6.0.0" }, "dependencies": { "acorn": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", - "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", + "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==", + "dev": true + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true } } @@ -12490,9 +12761,9 @@ } }, "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "strip-ansi": { @@ -12565,9 +12836,9 @@ } }, "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.1.tgz", + "integrity": "sha512-XSz38193PTo/1csJabKaV4b53uRVotlMgqJXm3s3eje0Bu6gQTxYDqpD38CmQfDBA+gN+QqaGjasuC8I/7eW3Q==", "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -12754,22 +13025,21 @@ "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" }, "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" + "yargs-parser": "^13.1.1" }, "dependencies": { "find-up": { diff --git a/vueui/package.json b/vueui/package.json index 9e24f80e921..a3552fd597a 100644 --- a/vueui/package.json +++ b/vueui/package.json @@ -9,17 +9,18 @@ "dev": "vue-cli-service build --watch" }, "dependencies": { - "@fortawesome/fontawesome-free": "^5.9.0", + "@fortawesome/fontawesome-free": "^5.10.1", "core-js": "^3.1.4", "core-js-compat": "^3.1.4", "fuse.js": "^3.4.5", "vue": "^2.6.10", - "webpack": "^4.35.3" + "webpack": "^4.39.1" }, "devDependencies": { - "@vue/cli-plugin-babel": "^3.9.2", - "@vue/cli-plugin-eslint": "^3.9.2", - "@vue/cli-service": "^3.9.2", + "@babel/preset-env": "^7.5.5", + "@vue/cli-plugin-babel": "^3.10.0", + "@vue/cli-plugin-eslint": "^3.10.0", + "@vue/cli-service": "^3.10.0", "node-sass": "^4.12.0", "sass-loader": "^7.1.0", "vue-template-compiler": "^2.6.10", diff --git a/vueui/src/components/view/misc/ghostspawner.vue b/vueui/src/components/view/misc/ghostspawner.vue new file mode 100644 index 00000000000..46d7b270736 --- /dev/null +++ b/vueui/src/components/view/misc/ghostspawner.vue @@ -0,0 +1,78 @@ + + + + + + diff --git a/vueui/src/main.js b/vueui/src/main.js index fd6f4351e37..17190f2431b 100644 --- a/vueui/src/main.js +++ b/vueui/src/main.js @@ -8,7 +8,6 @@ import camelCase from 'lodash/camelCase' import Store from './store.js' import './assets/global.scss' -import './polyfills.js' const requireComponent = require.context( './components', // The relative path of the components folder diff --git a/vueui/src/polyfills.js b/vueui/src/polyfills.js deleted file mode 100644 index b71d4ce2d92..00000000000 --- a/vueui/src/polyfills.js +++ /dev/null @@ -1 +0,0 @@ -import 'core-js/es/object/values' \ No newline at end of file