diff --git a/README.md b/README.md
index 51ceb23af65..130dddb98df 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,8 @@
Going to make a Pull Request? Make sure you read the [CONTRIBUTING.md](.github/CONTRIBUTING.md) first!
+Want to make a test server or your own private server? Read our [GitHub Wiki!](https://github.com/VOREStation/VOREStation/wiki)
+
VOREStation is a fork of the Polaris code branch, itself a fork of the Baystation12 code branch, for the game Space Station 13.

diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm
index 145381146fd..4b8970fd94d 100644
--- a/code/ATMOSPHERICS/components/unary/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm
@@ -94,6 +94,13 @@
assign_uid()
id_tag = num2text(uid)
+/obj/machinery/atmospherics/unary/vent_pump/proc/update_area()
+ initial_loc = get_area(loc)
+ area_uid = "\ref[initial_loc]"
+ assign_uid()
+ id_tag = num2text(uid)
+
+
/obj/machinery/atmospherics/unary/vent_pump/Destroy()
unregister_radio(src, frequency)
if(initial_loc)
diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
index 64a57a744e0..fe3e68130fa 100644
--- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
@@ -43,6 +43,12 @@
assign_uid()
id_tag = num2text(uid)
+/obj/machinery/atmospherics/unary/vent_scrubber/proc/update_area()
+ initial_loc = get_area(loc)
+ area_uid = "\ref[initial_loc]"
+ assign_uid()
+ id_tag = num2text(uid)
+
/obj/machinery/atmospherics/unary/vent_scrubber/Destroy()
unregister_radio(src, frequency)
if(initial_loc)
diff --git a/code/__defines/turfs.dm b/code/__defines/turfs.dm
index 1c4b228b63c..fe327cd6327 100644
--- a/code/__defines/turfs.dm
+++ b/code/__defines/turfs.dm
@@ -28,3 +28,12 @@
#define OUTDOORS_NO 0 // Ditto.
#define OUTDOORS_AREA -1 // If a turf has this, it will defer to the area's settings on init.
// Note that after init, it will be either YES or NO.
+
+//supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a
+///Returns a list of turf in a square
+
+#define RECT_TURFS(H_RADIUS, V_RADIUS, CENTER) \
+ block( \
+ locate(max(CENTER.x-(H_RADIUS),1), max(CENTER.y-(V_RADIUS),1), CENTER.z), \
+ locate(min(CENTER.x+(H_RADIUS),world.maxx), min(CENTER.y+(V_RADIUS),world.maxy), CENTER.z) \
+ )
\ No newline at end of file
diff --git a/code/__defines/spaceman_dmm.dm b/code/__spaceman_dmm.dm
similarity index 85%
rename from code/__defines/spaceman_dmm.dm
rename to code/__spaceman_dmm.dm
index 94f17433774..51b09cd036e 100644
--- a/code/__defines/spaceman_dmm.dm
+++ b/code/__spaceman_dmm.dm
@@ -1,7 +1,8 @@
-// Interfaces for the SpacemanDMM linter, define'd to nothing when the linter
-// is not in use.
+/**
+* SpacemanDMM dreamchecker extensions for suite 1.7
+*
+*/
-// The SPACEMAN_DMM define is set by the linter and other tooling when it runs.
#ifdef SPACEMAN_DMM
#define RETURN_TYPE(X) set SpacemanDMM_return_type = X
#define SHOULD_CALL_PARENT(X) set SpacemanDMM_should_call_parent = X
diff --git a/code/_global_vars/lists/misc.dm b/code/_global_vars/lists/misc.dm
index a16573905e0..97cc3753a1e 100644
--- a/code/_global_vars/lists/misc.dm
+++ b/code/_global_vars/lists/misc.dm
@@ -2,7 +2,8 @@ GLOBAL_LIST_INIT(speech_toppings, list("|" = "i", "+" = "b", "_" = "u"))
GLOBAL_LIST_EMPTY(meteor_list)
/// List of wire colors for each object type of that round. One for airlocks, one for vendors, etc.
-GLOBAL_LIST_EMPTY(wire_color_directory) // This is an associative list with the `holder_type` as the key, and a list of colors as the value.
+GLOBAL_LIST_EMPTY(wire_color_directory) // This is an associative list with the `holder_type` as the key, and a list of colors as the value.
+GLOBAL_LIST_EMPTY(wire_name_directory) // This is an associative list
// Reference list for disposal sort junctions. Filled up by sorting junction's New()
GLOBAL_LIST_EMPTY(tagger_locations)
diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm
index d7d180d4dfa..513154dafdb 100644
--- a/code/_helpers/global_lists_vr.dm
+++ b/code/_helpers/global_lists_vr.dm
@@ -43,7 +43,7 @@ var/global/list/item_vore_blacklist = list(
/obj/item/weapon/gun,
/obj/item/weapon/pinpointer,
/obj/item/clothing/shoes/magboots,
- /obj/item/blueprints,
+ /obj/item/areaeditor/blueprints,
/obj/item/clothing/head/helmet/space,
/obj/item/weapon/disk/nuclear,
/obj/item/clothing/suit/storage/hooded/wintercoat/roiz)
@@ -825,4 +825,96 @@ var/global/list/xenobio_rainbow_extracts = list(
/obj/item/slime_extract/ruby = 3,
/obj/item/slime_extract/emerald = 3,
/obj/item/slime_extract/light_pink = 1,
- /obj/item/slime_extract/rainbow = 1)
\ No newline at end of file
+ /obj/item/slime_extract/rainbow = 1)
+
+
+// AREA GENERATION AND BLUEPRINT STUFF BELOW HERE
+// typecacheof(list) and list() are two completely separate things, don't break!
+
+// WHATEVER YOU DO, DO NOT LEAVE THE LAST THING IN THE LIST BELOW HAVE A COMMA OR EVERYTHING EVER WILL BREAK
+// ENSURE THE LAST AREA OR TURF LISTED IS SIMPLY "/area/clownhideout" AND NOT "/area/clownhideout," OR YOU WILL IMMEDIATELY DIE
+
+// These lists are, obviously, unfinished.
+
+// ALLOWING BUILDING IN AN AREA:
+// If you want someone to be able to build a new area in a place, add the area to the 'BUILDABLE_AREA_TYPES' and 'blacklisted_areas'
+// BUILDABLE_AREA_TYPES means they can build an area there. The blacklisted_areas means they CAN NOT EXPAND that area. No making space bigger!
+
+// DISALLOW BUILDING/AREA MANIPULATION IN AN AREA (OR A TURF TYPE):
+// Likewise, if you want someone to never ever EVER be able to do anything area generation/expansion related to an area
+// Then add it to SPECIALS and area_or_turf_fail_types
+
+// If you want someone to
+var/global/list/BUILDABLE_AREA_TYPES = list(
+ /area/space,
+ /area/mine,
+// /area/surface/outside, //SC
+// /area/surface/cave, //SC
+ /area/tether/surfacebase/outside,
+ /area/groundbase/unexplored/outdoors,
+ /area/maintenance/groundbase/level1,
+ /area/submap/groundbase/wilderness,
+ /area/groundbase/mining,
+ /area/offmap/aerostat/surface,
+ /area/tether_away/beach,
+ /area/tether_away/cave,
+)
+
+var/static/list/blacklisted_areas = typecacheof(list(
+ /area/space,
+ /area/mine,
+// /area/surface/outside, //SC
+// /area/surface/cave, //SC
+ //TETHER STUFF BELOW THIS
+ /area/tether/surfacebase/outside,
+ //GROUNDBASE STUFF BELOW THIS
+ /area/groundbase/unexplored/outdoors,
+ /area/maintenance/groundbase/level1,
+ /area/submap/groundbase/wilderness,
+ /area/groundbase/mining,
+ /area/offmap/aerostat/surface,
+ /area/tether_away/beach,
+ /area/tether_away/cave
+ ))
+
+var/global/list/SPECIALS = list(
+ /turf/space,
+ /area/shuttle,
+ /area/admin,
+ /area/arrival,
+ /area/centcom,
+ /area/asteroid,
+ /area/tdome,
+ /area/syndicate_station,
+ /area/wizard_station,
+ /area/prison,
+ /area/holodeck,
+ /area/turbolift,
+ /area/tether/elevator,
+ /turf/unsimulated/wall/planetary,
+ /area/submap/virgo2,
+ /area/submap/event,
+ /area/submap/casino_event
+ // /area/derelict //commented out, all hail derelict-rebuilders!
+)
+
+var/global/list/area_or_turf_fail_types = typecacheof(list(
+ /turf/space,
+ /area/shuttle,
+ /area/admin,
+ /area/arrival,
+ /area/centcom,
+ /area/asteroid,
+ /area/tdome,
+ /area/syndicate_station,
+ /area/wizard_station,
+ /area/prison,
+ /area/holodeck,
+ /turf/simulated/wall/elevator,
+ /area/turbolift,
+ /area/tether/elevator,
+ /turf/unsimulated/wall/planetary,
+ /area/submap/virgo2,
+ /area/submap/event,
+ /area/submap/casino_event
+ ))
diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index 84844936c4f..d0a7bff2e0e 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -643,6 +643,20 @@ Turf and target are seperate in case you want to teleport some distance from a t
for(var/turf/T in N) turfs += T
return turfs
+
+//Takes: An instance of the area.
+//Returns: A list of all turfs in that area.
+//Side note: I don't know why this was never a thing. Did everyone just ignore the Blueprint item?! - C.L.
+/proc/get_current_area_turfs(var/area/checked_area)
+ if(!checked_area)
+ return null
+
+ var/list/turfs = new/list()
+ for(var/turf/counted_turfs in checked_area.contents) //Cheap. Efficient. Lovely.
+ turfs += counted_turfs
+ return turfs
+
+
//Takes: Area type as text string or as typepath OR an instance of the area.
//Returns: A list of all atoms (objs, turfs, mobs) in areas of that type of that type in the world.
/proc/get_area_all_atoms(var/areatype)
@@ -659,6 +673,18 @@ Turf and target are seperate in case you want to teleport some distance from a t
atoms += A
return atoms
+
+//Takes: Area as an instance of the area.
+//Returns: A list of all atoms (objs, turfs, mobs) in the selected area.
+/proc/get_current_area_atoms(var/area/checked_area)
+ if(!checked_area)
+ return null
+
+ var/list/atoms = new/list()
+ for(var/atom/A in checked_area.contents)
+ atoms += A
+ return atoms
+
/datum/coords //Simple datum for storing coordinates.
var/x_pos = null
var/y_pos = null
diff --git a/code/controllers/subsystems/ai.dm b/code/controllers/subsystems/ai.dm
index 41fb3a7e29b..eb29e2fec2f 100644
--- a/code/controllers/subsystems/ai.dm
+++ b/code/controllers/subsystems/ai.dm
@@ -39,7 +39,7 @@ SUBSYSTEM_DEF(ai)
if(!L?.loc)
continue
- if(process_z[get_z(L)] || !L.low_priority) //VOREStation Edit End
+ if((get_z(L) && process_z[get_z(L)]) || !L.low_priority) //VOREStation Edit End
A.handle_strategicals()
else
slept_mobs++
diff --git a/code/controllers/subsystems/mobs.dm b/code/controllers/subsystems/mobs.dm
index 1c804979838..c124b5573ef 100644
--- a/code/controllers/subsystems/mobs.dm
+++ b/code/controllers/subsystems/mobs.dm
@@ -15,7 +15,7 @@ SUBSYSTEM_DEF(mobs)
var/list/currentrun = list()
var/log_extensively = FALSE
var/list/timelog = list()
-
+
var/slept_mobs = 0
var/list/process_z = list()
@@ -40,10 +40,10 @@ SUBSYSTEM_DEF(mobs)
if(!M || QDELETED(M))
mob_list -= M
continue
- else if(M.low_priority && !(M.loc && process_z[get_z(M)]))
+ else if(M.low_priority && !(M.loc && get_z(M) && process_z[get_z(M)]))
slept_mobs++
continue
-
+
M.Life(times_fired)
if (MC_TICK_CHECK)
@@ -58,14 +58,14 @@ SUBSYSTEM_DEF(mobs)
log_world(msg)
return
msg += "Lists: currentrun: [currentrun.len], mob_list: [mob_list.len]\n"
-
+
if(!currentrun.len)
msg += "!!The subsystem just finished the mob_list list, and currentrun is empty (or has never run).\n"
msg += "!!The info below is the tail of mob_list instead of currentrun.\n"
-
+
var/datum/D = currentrun.len ? currentrun[currentrun.len] : mob_list[mob_list.len]
msg += "Tail entry: [describeThis(D)] (this is likely the item AFTER the problem item)\n"
-
+
var/position = mob_list.Find(D)
if(!position)
msg += "Unable to find context of tail entry in mob_list list.\n"
diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm
index 83ebb65fa8f..9a411c60ee3 100644
--- a/code/datums/wires/wires.dm
+++ b/code/datums/wires/wires.dm
@@ -43,6 +43,7 @@
if(!GLOB.wire_color_directory[holder_type])
randomize()
GLOB.wire_color_directory[holder_type] = colors
+ GLOB.wire_name_directory[holder_type] = proper_name
else
colors = GLOB.wire_color_directory[holder_type]
diff --git a/code/game/area/areas_vr.dm b/code/game/area/areas_vr.dm
index e356063e2ab..f9326745660 100644
--- a/code/game/area/areas_vr.dm
+++ b/code/game/area/areas_vr.dm
@@ -5,6 +5,9 @@
var/block_suit_sensors = FALSE //If mob size is limited in the area.
var/turf/ceiling_type
+ // Size of the area in open turfs, only calculated for indoors areas.
+ var/areasize = 0
+
/area/Entered(var/atom/movable/AM, oldLoc)
. = ..()
if(enter_message && isliving(AM))
@@ -29,3 +32,41 @@
var/turf/TA = GetAbove(T)
if(isopenspace(TA))
TA.ChangeTurf(ceiling_type, TRUE, TRUE, TRUE)
+
+/**
+ * Setup an area (with the given name)
+ *
+ * Sets the area name, sets all status var's to false and adds the area to the sorted area list
+ * //NOTE: Virgo does not have a sorted area list.
+ */
+/area/proc/setup(a_name)
+ name = a_name
+ power_equip = FALSE
+ power_light = FALSE
+ power_environ = FALSE
+ always_unpowered = FALSE
+ update_areasize()
+
+/area/proc/update_areasize()
+ if(outdoors)
+ return FALSE
+ areasize = 0
+ for(var/turf/simulated/floor/T in contents)
+ areasize++
+
+/proc/rename_area(a, new_name)
+ var/area/A = get_area(a)
+ var/prevname = "[A.name]"
+ set_area_machinery(A, new_name, prevname)
+ A.name = new_name
+ A.update_areasize()
+ return TRUE
+
+/area/proc/power_check()
+ if(!requires_power || !apc)
+ power_light = 0
+ power_equip = 0
+ power_environ = 0
+ power_change() // all machines set to current power level, also updates lighting icon
+ if(no_spoilers)
+ set_spoiler_obfuscation(TRUE)
\ No newline at end of file
diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm
index c52e51d5b53..1b3a1147a1e 100644
--- a/code/game/gamemodes/newobjective.dm
+++ b/code/game/gamemodes/newobjective.dm
@@ -749,7 +749,7 @@ datum
blueprints
- steal_target = /obj/item/blueprints
+ steal_target = /obj/item/areaeditor/blueprints
explanation_text = "Steal the station's blueprints."
weight = 20
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 9b6b532f964..2818e3e7b4d 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -431,7 +431,7 @@ var/global/list/all_objectives = list()
"a site manager's jumpsuit" = /obj/item/clothing/under/rank/captain,
"a functional AI" = /obj/item/device/aicard,
"a pair of magboots" = /obj/item/clothing/shoes/magboots,
- "the station blueprints" = /obj/item/blueprints,
+ "the station blueprints" = /obj/item/areaeditor/blueprints,
"a nasa voidsuit" = /obj/item/clothing/suit/space/void,
"28 moles of phoron (full tank)" = /obj/item/weapon/tank,
"a sample of slime extract" = /obj/item/slime_extract,
diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm
index ca40f0dc530..82d6fa0f6f4 100644
--- a/code/game/machinery/air_alarm.dm
+++ b/code/game/machinery/air_alarm.dm
@@ -154,6 +154,12 @@
update_icon()
+/obj/machinery/alarm/proc/update_area()
+ alarm_area = get_area(src)
+ area_uid = "\ref[alarm_area]"
+ if(name == "alarm")
+ name = "[alarm_area.name] Air Alarm"
+
/obj/machinery/alarm/Initialize()
. = ..()
set_frequency(frequency)
@@ -540,9 +546,9 @@
var/list/list/environment_data = list()
data["environment_data"] = environment_data
-
+
DECLARE_TLV_VALUES
-
+
var/pressure = environment.return_pressure()
LOAD_TLV_VALUES(TLV["pressure"], pressure)
environment_data.Add(list(list(
@@ -551,7 +557,7 @@
"unit" = "kPa",
"danger_level" = TEST_TLV_VALUES
)))
-
+
var/temperature = environment.temperature
LOAD_TLV_VALUES(TLV["temperature"], temperature)
environment_data.Add(list(list(
@@ -573,7 +579,7 @@
"unit" = "%",
"danger_level" = TEST_TLV_VALUES
)))
-
+
if(!locked || issilicon(user) || data["remoteUser"])
var/list/list/vents = list()
data["vents"] = vents
@@ -595,7 +601,7 @@
"extdefault"= (info["external"] == ONE_ATMOSPHERE),
"intdefault"= (info["internal"] == 0),
)))
-
+
var/list/list/scrubbers = list()
data["scrubbers"] = scrubbers
@@ -622,7 +628,7 @@
data["scrubbers"] = scrubbers
data["mode"] = mode
-
+
var/list/list/modes = list()
data["modes"] = modes
modes[++modes.len] = list("name" = "Filtering - Scrubs out contaminants", "mode" = AALARM_MODE_SCRUBBING, "selected" = mode == AALARM_MODE_SCRUBBING, "danger" = 0)
@@ -682,7 +688,7 @@
else
target_temperature = input_temperature + T0C
return TRUE
-
+
// Account for remote users here.
// Yes, this is kinda snowflaky; however, I would argue it would be far more snowflakey
// to include "custom hrefs" and all the other bullshit that nano states have just for the
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index 1e1fff180ed..be37e988b86 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -150,7 +150,7 @@ Transponder Codes:"}
usr.set_machine(src)
if(href_list["locedit"])
- var/newloc = sanitize(tgui_input_text(usr, "Enter New Location", "Navigation Beacon", location))
+ var/newloc = sanitize(tgui_input_text(usr, "Enter New Location", "Navigation Beacon", location, MAX_NAME_LEN))
if(newloc)
location = newloc
updateDialog()
@@ -158,12 +158,14 @@ Transponder Codes:"}
else if(href_list["edit"])
var/codekey = href_list["code"]
- var/newkey = tgui_input_text(usr, "Enter Transponder Code Key", "Navigation Beacon", codekey)
+ var/newkey = tgui_input_text(usr, "Enter Transponder Code Key", "Navigation Beacon", codekey, MAX_NAME_LEN)
+ newkey = sanitize(newkey,MAX_NAME_LEN)
if(!newkey)
return
var/codeval = codes[codekey]
- var/newval = tgui_input_text(usr, "Enter Transponder Code Value", "Navigation Beacon", codeval)
+ var/newval = tgui_input_text(usr, "Enter Transponder Code Value", "Navigation Beacon", codeval, MAX_NAME_LEN)
+ newval = sanitize(newval,MAX_NAME_LEN)
if(!newval)
newval = codekey
return
@@ -180,11 +182,13 @@ Transponder Codes:"}
else if(href_list["add"])
- var/newkey = tgui_input_text(usr, "Enter New Transponder Code Key", "Navigation Beacon")
+ var/newkey = tgui_input_text(usr, "Enter New Transponder Code Key", "Navigation Beacon", null, MAX_NAME_LEN)
+ newkey = sanitize(newkey,MAX_NAME_LEN)
if(!newkey)
return
- var/newval = tgui_input_text(usr, "Enter New Transponder Code Value", "Navigation Beacon")
+ var/newval = tgui_input_text(usr, "Enter New Transponder Code Value", "Navigation Beacon", null, MAX_NAME_LEN)
+ newval = sanitize(newval,MAX_NAME_LEN)
if(!newval)
newval = "1"
return
diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm
index f19b80befc7..33c485a36e6 100644
--- a/code/game/machinery/pointdefense.dm
+++ b/code/game/machinery/pointdefense.dm
@@ -94,7 +94,8 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
/obj/machinery/pointdefense_control/attackby(var/obj/item/W, var/mob/user)
if(W?.is_multitool())
- var/new_ident = tgui_input_text(user, "Enter a new ident tag.", "[src]", id_tag)
+ var/new_ident = tgui_input_text(user, "Enter a new ident tag.", "[src]", id_tag, MAX_NAME_LEN)
+ new_ident = sanitize(new_ident,MAX_NAME_LEN)
if(new_ident && new_ident != id_tag && user.Adjacent(src) && CanInteract(user, GLOB.tgui_physical_state))
// Check for duplicate controllers with this ID
for(var/obj/machinery/pointdefense_control/PC as anything in pointdefense_controllers)
@@ -211,7 +212,8 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
/obj/machinery/power/pointdefense/attackby(var/obj/item/W, var/mob/user)
if(W?.is_multitool())
- var/new_ident = tgui_input_text(user, "Enter a new ident tag.", "[src]", id_tag)
+ var/new_ident = tgui_input_text(user, "Enter a new ident tag.", "[src]", id_tag, MAX_NAME_LEN)
+ new_ident = sanitize(new_ident,MAX_NAME_LEN)
if(new_ident && new_ident != id_tag && user.Adjacent(src) && CanInteract(user, GLOB.tgui_physical_state))
to_chat(user, "You register [src] with the [new_ident] network.")
id_tag = new_ident
@@ -295,7 +297,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
var/obj/machinery/pointdefense_control/PC = get_controller()
if(!istype(PC))
return
-
+
// Compile list of known targets
var/list/existing_targets = list()
for(var/weakref/WR in PC.targets)
@@ -319,7 +321,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
engaging = target
Shoot(target)
return
-
+
/obj/machinery/power/pointdefense/proc/targeting_check(var/obj/effect/meteor/M)
// Target in range
var/list/connected_z_levels = GetConnectedZlevels(get_z(src))
@@ -330,7 +332,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
// If we can shoot it, then shoot
if(emagged || !space_los(M))
return FALSE
-
+
return TRUE
/obj/machinery/power/pointdefense/RefreshParts()
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index 461a2004817..2de8d04a492 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -46,7 +46,7 @@
for(var/c in SelectedServer.log_entries)
i++
var/datum/comm_log_entry/C = c
-
+
// This is necessary to prevent leaking information to the clientside
var/static/list/acceptable_params = list("uspeech", "intelligible", "message", "name", "race", "job", "timecode")
var/list/parameters = list()
@@ -74,7 +74,7 @@
if(!ui)
ui = new(user, src, "TelecommsLogBrowser", name)
ui.open()
-
+
/obj/machinery/computer/telecomms/server/tgui_act(action, params)
if(..())
return TRUE
@@ -128,7 +128,8 @@
. = TRUE
if("network")
- var/newnet = tgui_input_text(usr, "Which network do you want to view?", "Comm Monitor", network)
+ var/newnet = tgui_input_text(usr, "Which network do you want to view?", "Comm Monitor", network, 15)
+ newnet = sanitize(newnet,15)
if(newnet && ((usr in range(1, src) || issilicon(usr))))
if(length(newnet) > 15)
@@ -139,7 +140,7 @@
set_temp("NEW NETWORK TAG SET IN ADDRESS \[[network]\]", "good")
. = TRUE
-
+
if("cleartemp")
temp = null
. = TRUE
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index 1a9fc2246e1..ca8a74312aa 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -41,7 +41,7 @@
/obj/machinery/telecomms/tgui_data(mob/user)
var/list/data = list()
-
+
data["temp"] = temp
data["on"] = on
@@ -81,7 +81,7 @@
"index" = i,
)))
data["linked"] = linked
-
+
var/list/filter = list()
for(var/x in freq_listening)
filter.Add(list(list(
@@ -213,7 +213,7 @@
/obj/machinery/telecomms/bus/Options_Act(action, params)
if(..())
return TRUE
-
+
switch(action)
if("change_freq")
. = TRUE
@@ -267,7 +267,7 @@
/obj/machinery/telecomms/receiver/Options_Act(action, params)
if(..())
return TRUE
-
+
switch(action)
if("range")
var/new_range = params["range"]
@@ -296,6 +296,7 @@
if("network")
var/newnet = tgui_input_text(usr, "Specify the new network for this machine. This will break all current links.", src, network)
+ newnet = sanitize(newnet,15)
if(newnet && canAccess(usr))
if(length(newnet) > 15)
diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm
index 3014474b8ea..cf9ab2096dc 100644
--- a/code/game/machinery/telecomms/telemonitor.dm
+++ b/code/game/machinery/telecomms/telemonitor.dm
@@ -100,7 +100,8 @@
. = TRUE
if("network")
- var/newnet = tgui_input_text(usr, "Which network do you want to view?", "Comm Monitor", network)
+ var/newnet = tgui_input_text(usr, "Which network do you want to view?", "Comm Monitor", network, 15)
+ newnet = sanitize(newnet,15) //Honestly, I'd be amazed if someone managed to do HTML in 15 chars.
if(newnet && ((usr in range(1, src) || issilicon(usr))))
if(length(newnet) > 15)
set_temp("FAILED: NETWORK TAG STRING TOO LENGTHY", "bad")
@@ -108,7 +109,7 @@
network = newnet
machinelist = list()
set_temp("NEW NETWORK TAG SET IN ADDRESS \[[network]\]", "good")
-
+
. = TRUE
if("cleartemp")
diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm
index cf7f9946aae..17dbed4e2cc 100644
--- a/code/game/machinery/telecomms/traffic_control.dm
+++ b/code/game/machinery/telecomms/traffic_control.dm
@@ -192,7 +192,8 @@
if(href_list["network"])
- var/newnet = tgui_input_text(usr, "Which network do you want to view?", "Comm Monitor", network)
+ var/newnet = tgui_input_text(usr, "Which network do you want to view?", "Comm Monitor", network, 15)
+ newnet = sanitize(newnet,15)
if(newnet && ((usr in range(1, src) || issilicon(usr))))
if(length(newnet) > 15)
diff --git a/code/game/mecha/equipment/tools/drill.dm b/code/game/mecha/equipment/tools/drill.dm
index 2b64f93616b..a7038eaa628 100644
--- a/code/game/mecha/equipment/tools/drill.dm
+++ b/code/game/mecha/equipment/tools/drill.dm
@@ -48,7 +48,8 @@
if(ore_box)
for(var/obj/item/weapon/ore/ore in range(chassis,1))
if(get_dir(chassis,ore)&chassis.dir)
- ore.forceMove(ore_box)
+ ore_box.stored_ore[ore.material]++
+ qdel(ore)
else if(isliving(target))
drill_mob(target, chassis.occupant)
return 1
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index ce54008c451..61b4d90183d 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -38,7 +38,8 @@
if(ore_box)
for(var/obj/item/weapon/ore/ore in range(1, src))
if(ore.Adjacent(src) && ((get_dir(src, ore) & dir) || ore.loc == loc)) //we can reach it and it's in front of us? grab it!
- ore.forceMove(ore_box)
+ ore_box.stored_ore[ore.material]++
+ qdel(ore)
/obj/mecha/working/ripley/Destroy()
for(var/atom/movable/A in src.cargo)
diff --git a/code/game/objects/items/blueprints_vr.dm b/code/game/objects/items/blueprints_vr.dm
new file mode 100644
index 00000000000..accae37f6b1
--- /dev/null
+++ b/code/game/objects/items/blueprints_vr.dm
@@ -0,0 +1,940 @@
+#define BP_MAX_ROOM_SIZE 300
+
+// WARNING: ESOTERIC BULLSHIT INSIDE OF THIS FILE.
+// This is a port of /tg/'s blueprints that also have Virgo modifications as well.
+// However it is heavily modified and lacking the 't-ray' scanner functionality that /TG/ has. We have our own t-rays after all.
+// This works and uses a bunch of really odd hacks and trickery to get it to all function.
+// If you're looking at this a few years from now and going 'What the hell were they thinking' just know that this was the best we had at the time.
+
+// Now that I've scared away half the people looking at this file, here's the relevant info:
+
+// Banning areas: Go to global_lists_vr, jump to the BUILDABLE_AREA_TYPES and read the comments left there.
+
+
+
+
+// These areas are defined here so they can be blacklisted in global_lists_vr
+/area/tether/elevator
+
+ name = "Tether Elevator"
+
+/area/tether/surfacebase/outside
+ name = "Outside - Surface"
+
+/area/groundbase/unexplored/outdoors
+ name = "\improper Rascal's Pass"
+
+/area/groundbase/mining
+ name = "Mining"
+
+/area/groundbase/unexplored/rock
+ name = "\improper Rascal's Pass"
+
+/area/maintenance/groundbase/level1
+ name = "Groundbase Level One Maint"
+
+/area/submap/groundbase/wilderness
+ name = "Groundbase Wilderness"
+
+/area/offmap/aerostat/surface
+ name = "Aerostat Surface"
+
+/area/tether_away/beach
+ name = "\improper Away Mission - Virgo 4 Beach"
+
+/area/tether_away/cave
+ name = "Tether Away Cave"
+
+/area/offmap/aerostat/surface
+
+ name = "Aerostat Surface"
+
+/area/submap/virgo2
+ name = "Submap Area"
+
+/area/submap/casino_event
+ name = "\improper Space Casino"
+
+
+
+//TG blueprints.
+#define AREA_ERRNONE 0
+#define AREA_STATION 1
+#define AREA_SPACE 2
+#define AREA_SPECIAL 3
+
+/obj/item/areaeditor
+ name = "area modification item"
+ icon = 'icons/obj/items.dmi'
+ icon_state = "blueprints"
+ attack_verb = list("attacked", "bapped", "hit")
+ in_use = FALSE
+ preserve_item = 1
+ var/uses_charges = 0 // If the area editor has limited uses.
+ var/initial_charges = 10
+ var/charges = 10 // The amount of uses the area editor has.
+ var/station_master = 1 // If the areaeditor can add charges to others.
+ var/wire_schematics = 0 // If the areaeditor can see wires.
+ var/can_override = 0 // If you want the areaeditor to override the 'Don't make a new area where one already exists' logic. Only given to CE blueprints.
+
+ var/can_create_areas_in = AREA_SPACE // Must be standing in space to create
+ var/can_create_areas_into = AREA_SPACE // New areas will only overwrite space area turfs.
+ var/can_expand_areas_in = AREA_STATION // Must be standing in station to expand
+ var/can_expand_areas_into = AREA_SPACE // Can expand station areas only into space.
+ var/can_rename_areas_in = AREA_STATION // Only station areas can be reanamed
+
+
+ var/const/ROOM_ERR_LOLWAT = 0 // Don't touch these three consts or BYOND will literally tear out your throat
+ var/const/ROOM_ERR_SPACE = -1
+ var/const/ROOM_ERR_TOOLARGE = -2
+ var/const/ROOM_ERR_FORBIDDEN = -3
+
+ var/list/areaColor_turfs = list()
+ var/legend = 0 //If viewing wires or not.
+
+/obj/item/areaeditor/examine(mob/user)
+ . =..()
+ if(uses_charges && !isnull(charges))
+ . += "There appears to be enough space for a total of [charges] more changes!"
+ if(!charges)
+ . += "There seems to be no more room for any more edits!"
+
+/obj/item/areaeditor/attackby(obj/item/W, mob/user, params)
+ if(uses_charges && (charges < initial_charges) && istype(W, /obj/item/areaeditor)) //Do we have a reason to add charges? And is it something that COULD add charges?
+ var/missing_charges = initial_charges-charges
+ var/obj/item/areaeditor/blueprint = W
+ if(blueprint.station_master) //Master can refill.
+ charges = initial_charges
+ to_chat(user, span_notice("You add some more writing material to the [src] with the [blueprint]!"))
+ return
+ else if(blueprint.uses_charges && blueprint.charges) //Getting from another with limited charges.
+ var/to_add = tgui_input_number(user, "How many charges do you want to add to the [src]?", "[blueprint]", missing_charges)
+ if(!isnull(to_add) && blueprint.charges >= to_add)
+ to_chat(user, span_notice("You add some more writing material to the [src] with the [blueprint]!"))
+ blueprint.charges -= to_add
+ charges += to_add
+ return
+
+ else
+ to_chat(user, span_notice("You decide not to add any more material to the [src]"))
+ return
+ else if(!blueprint.uses_charges || !blueprint.charges) // The item it's being hit by doesn't use charges OR doesn't have any charges.
+ to_chat(user, span_warning("You can't add find any suitable material to add from the [blueprint]!"))
+ else
+ ..()
+
+/obj/item/areaeditor/attack_self(mob/user) //Convert this to TGUI some time.
+ add_fingerprint(user)
+ . = "[src] \
+ [station_name()] [src.name]
"
+ switch(get_area_type())
+ if(AREA_SPACE)
+ . += "According to the [src.name], you are now in an unclaimed territory.
"
+ if(AREA_SPECIAL)
+ . += "This place is not noted on the [src.name].
"
+ return //If we're in a special area, no modifying.
+ if(!uses_charges || (uses_charges && charges)) //No charges OR it has charges available.
+ . += "Create or modify an existing area (3x3 space) (1 Charge)
"
+ . += "Create new area or merge two areas. (Whole Room.) (5 Charges)
"
+ . += "There is a note on the corner of the [src.name]: Use 3x3 for fine-tuning and including walls into your area!"
+ if(uses_charges)
+ if(!charges) //We're out!
+ . += "Your [src.name] has been completely filled! You would need to get some extra blueprint paper from the CE's blueprints to expand further!"
+ else
+ . += "Your [src.name] seems like it has enough room for [charges] more edits!"
+
+
+/obj/item/areaeditor/Topic(href, href_list)
+ if(..())
+ return TRUE
+ if ((usr.restrained() || usr.stat || usr.get_active_hand() != src))
+ return
+ if(href_list["create_area"])
+ if(in_use)
+ return
+ var/area/A = get_area(usr)
+ if(A.flags & BLUE_SHIELDED)
+ to_chat(usr, span_warning("You cannot edit restricted areas."))
+ return
+ in_use = TRUE
+ create_area(usr, src)
+ in_use = FALSE
+ if(href_list["create_area_whole"])
+ if(in_use)
+ return
+ in_use = TRUE
+ var/area/A = create_area_whole(usr, src)
+ if(A && (A.flags & BLUE_SHIELDED))
+ to_chat(usr, span_warning("You cannot edit restricted areas."))
+ in_use = FALSE
+ return
+ in_use = FALSE
+ updateUsrDialog()
+
+
+
+
+//Station Wire Tool.
+/obj/item/wire_reader //Not really a blueprint, but it's included here as such.
+ name = "wire schematics"
+ desc = "A blueprint detailing the various internal wiring of machinery around the station."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "blueprints"
+ attack_verb = list("attacked", "bapped", "hit")
+ preserve_item = 1
+ var/legend = 1
+
+/obj/item/wire_reader/attack_self(mob/user) //Convert this to TGUI some time.
+ add_fingerprint(user)
+ . = "[src] \
+ [station_name()] [src.name]
"
+ if(legend == TRUE)
+ . += view_station_wire_devices(user);
+ else
+ //legend is a wireset
+ . += "<< Back"
+ . += view_station_wire_set(user, legend)
+
+ var/datum/browser/popup = new(user, "blueprints", "[src]", 700, 500)
+ popup.set_content(.)
+ popup.open()
+ onclose(user, "blueprints")
+
+/obj/item/wire_reader/Topic(href, href_list)
+ if(..())
+ return
+ if(href_list["view_wireset"])
+ legend = href_list["view_wireset"];
+ if(href_list["view_legend"])
+ legend = TRUE
+ attack_self(usr)
+
+/obj/item/wire_reader/proc/view_station_wire_devices(mob/user)
+ var/message = "
You examine the wire legend.
"
+ for(var/wireset in GLOB.wire_color_directory)
+ //if(istype(wireset,/datum/wires/grid_checker))//Uncomment this in if you want the grid checker minigame to not be revealed here.
+ // continue
+ message += "
[GLOB.wire_name_directory[wireset]]"
+ message += "
"
+ return message
+
+/obj/item/wire_reader/proc/view_station_wire_set(mob/user, wireset)
+ //for some reason you can't use wireset directly as a derefencer so this is the next best :/
+ for(var/device in GLOB.wire_color_directory)
+ if("[device]" == wireset) //I know... don't change it...
+ var/message = "[GLOB.wire_name_directory[device]]:"
+ for(var/Col in GLOB.wire_color_directory[device])
+ var/wire_name = GLOB.wire_color_directory[device][Col]
+ if(!findtext(wire_name, WIRE_DUD_PREFIX)) //don't show duds
+ message += "
[Col]: [wire_name]
"
+ message += ""
+ return message
+ return ""
+
+//Station blueprints!!!
+/obj/item/areaeditor/blueprints
+ name = "station blueprints"
+ desc = "Blueprints of the station. There is a \"Classified\" stamp and several coffee stains on it."
+ //var/list/image/showing = list() //For viewing pipes. Unused.
+ //var/client/viewing //For viewing pipes. Unused.
+ can_override = 1 //In case there is a reason for building in a non-blacklisted, non-buildable area.
+
+/obj/item/areaeditor/blueprints/engineers
+ name = "writing blueprints"
+ desc = "A piece of paper that allows for expansion of the station and creaiton of new areas. There is a \"For Official Use Only\" stamp on it. NOT to be mistaken with the staion blueprints."
+ station_master = 0
+ uses_charges = 1
+ can_override = 0
+
+
+
+
+/obj/item/areaeditor/blueprints/Destroy()
+ //clear_viewer()
+ return ..()
+
+
+/obj/item/areaeditor/blueprints/attack_self(mob/user)
+ . = ..()
+ var/area/A = get_area(user)
+ if(!legend)
+ if(get_area_type() == AREA_STATION)
+ . += "According to \the [src], you are now in \"[html_encode(A.name)]\".
"
+ . += "Change area name
" //You can change the name without charges.
+ if(wire_schematics)
+ . += "View wire colour legend
"
+ else
+ if(legend == TRUE)
+ . += "<< Back"
+ . += view_wire_devices(user);
+ else
+ //legend is a wireset
+ . += "<< Back"
+ . += view_wire_set(user, legend)
+ var/datum/browser/popup = new(user, "blueprints", "[src]", 700, 500)
+ popup.set_content(.)
+ popup.open()
+ onclose(user, "blueprints")
+
+
+/obj/item/areaeditor/blueprints/Topic(href, href_list)
+ if(..())
+ return
+ if(href_list["edit_area"])
+ if(get_area_type()!=AREA_STATION)
+ return
+ if(in_use)
+ return
+ in_use = TRUE
+ edit_area()
+ in_use = FALSE
+ if(href_list["exit_legend"])
+ legend = FALSE;
+ if(href_list["view_legend"])
+ if(wire_schematics) //No href hacks allow for you, my friend!
+ legend = TRUE;
+ if(href_list["view_wireset"])
+ if(wire_schematics) //No href hacks allow for you, my friend!
+ legend = href_list["view_wireset"];
+ attack_self(usr)
+
+
+//Code for viewing pipes or whatnot. Think t-ray scanner.
+//Code for viewing pipes or whatnot. Think t-ray scanner.
+//Code for viewing pipes or whatnot. Think t-ray scanner.
+/*
+/obj/item/areaeditor/blueprints/proc/get_images(turf/central_turf, viewsize)
+ . = list()
+ var/list/dimensions = getviewsize(viewsize)
+ var/horizontal_radius = dimensions[1] / 2
+ var/vertical_radius = dimensions[2] / 2
+ for(var/turf/nearby_turf as anything in RECT_TURFS(horizontal_radius, vertical_radius, central_turf))
+ if(nearby_turf.blueprint_data)
+ . += nearby_turf.blueprint_data
+*/
+/*
+/obj/item/areaeditor/blueprints/proc/set_viewer(mob/user, message = "")
+ if(user?.client)
+ if(viewing)
+ clear_viewer()
+ viewing = user.client
+ showing = get_images(get_turf(viewing.eye || user), viewing.view)
+ viewing.images |= showing
+ if(message)
+ to_chat(user, message)
+*/
+/*
+/obj/item/areaeditor/blueprints/proc/clear_viewer(mob/user, message = "")
+ if(viewing)
+ viewing.images -= showing
+ viewing = null
+ showing.Cut()
+ if(message)
+ to_chat(user, message)
+*/
+/obj/item/areaeditor/blueprints/dropped(mob/user)
+ ..()
+ //clear_viewer()
+ if(areaColor_turfs.len)
+ seeAreaColors_remove()
+ legend = FALSE
+
+
+
+/obj/item/areaeditor/proc/get_area_type(area/A)
+ if (!A)
+ A = get_area(usr)
+ if(A.outdoors)
+ return AREA_SPACE
+
+ for (var/type in BUILDABLE_AREA_TYPES)
+ if ( istype(A,type) )
+ return AREA_SPACE
+
+ for (var/type in SPECIALS)
+ if ( istype(A,type) )
+ return AREA_SPECIAL
+ return AREA_STATION
+
+
+/obj/item/areaeditor/blueprints/proc/view_wire_devices(mob/user)
+ var/message = "
You examine the wire legend.
"
+ for(var/wireset in GLOB.wire_color_directory)
+ //if(istype(wireset,/datum/wires/grid_checker))//Uncomment this in if you want the grid checker minigame to not be revealed here.
+ // continue
+ message += "
[GLOB.wire_name_directory[wireset]]"
+ message += ""
+ return message
+
+/obj/item/areaeditor/blueprints/proc/view_wire_set(mob/user, wireset)
+ //for some reason you can't use wireset directly as a derefencer so this is the next best :/
+ for(var/device in GLOB.wire_color_directory)
+ if("[device]" == wireset) //I know... don't change it...
+ var/message = "[GLOB.wire_name_directory[device]]:"
+ for(var/Col in GLOB.wire_color_directory[device])
+ var/wire_name = GLOB.wire_color_directory[device][Col]
+ if(!findtext(wire_name, WIRE_DUD_PREFIX)) //don't show duds
+ message += "
[Col]: [wire_name]
"
+ message += ""
+ return message
+ return ""
+
+
+/obj/item/areaeditor/proc/edit_area()
+ var/area/A = get_area(usr)
+ var/prevname = "[A.name]"
+ var/str = tgui_input_text(usr, "New area name", "Area Creation", max_length = MAX_NAME_LEN)
+ str = sanitize(str,MAX_NAME_LEN)
+ if(!str || !length(str) || str==prevname) //cancel
+ return
+ if(length(str) > 50)
+ to_chat(usr, span_warning("The given name is too long. The area's name is unchanged."))
+ return
+
+ rename_area(A, str)
+
+ to_chat(usr, span_notice("You rename the '[prevname]' to '[str]'."))
+ log_and_message_admins("has changed the area '[prevname]' title to '[str]'.")
+ A.update_areasize()
+ interact()
+ return TRUE
+
+//Blueprint Subtypes
+
+/obj/item/areaeditor/blueprints/cyborg
+ name = "station schematics"
+ desc = "A digital copy of the station blueprints stored in your memory."
+
+
+/proc/set_area_machinery(area/area, title, oldtitle)
+ if(!oldtitle) // or replacetext goes to infinite loop
+ return
+ for(var/obj/machinery/alarm/airpanel in area)
+ airpanel.name = replacetext(airpanel.name,oldtitle,title)
+ airpanel.update_area()
+ for(var/obj/machinery/power/apc/apcpanel in area)
+ apcpanel.name = replacetext(apcpanel.name,oldtitle,title)
+ apcpanel.update_area() //DECIDE IF THIS IS WANTED OR NOT. This can mean that the APC will overwrite the current APC the area being expanded has since areas cant have multiple APCs.
+ for(var/obj/machinery/atmospherics/unary/vent_scrubber/scrubber in area)
+ scrubber.name = replacetext(scrubber.name,oldtitle,title)
+ scrubber.update_area()
+ for(var/obj/machinery/atmospherics/unary/vent_pump/vent in area)
+ vent.name = replacetext(vent.name,oldtitle,title)
+ vent.update_area()
+ for(var/obj/machinery/door/door in area)
+ door.name = replacetext(door.name,oldtitle,title)
+ for(var/obj/machinery/firealarm/firepanel in area)
+ firepanel.name = replacetext(firepanel.name,oldtitle,title)
+ area.update_areasize()
+ //TODO: much much more. Unnamed airlocks, cameras, etc.
+
+/proc/detect_room(turf/origin, list/break_if_found, max_size=INFINITY)
+ if(origin.blocks_air)
+ return list(origin)
+
+ . = list()
+ var/list/checked_turfs = list()
+ var/list/found_turfs = list(origin)
+ while(length(found_turfs))
+ var/turf/sourceT = found_turfs[1]
+ found_turfs.Cut(1, 2)
+ var/dir_flags = checked_turfs[sourceT]
+ for(var/dir in GLOB.alldirs)
+ if(length(.) > max_size)
+ return
+ if(dir_flags & dir) // This means we've checked this dir before, probably from the other turf
+ continue
+ var/turf/checkT = get_step(sourceT, dir)
+ if(!checkT)
+ continue
+
+ checked_turfs[sourceT] |= dir
+ checked_turfs[checkT] |= turn(dir, 180)
+ .[sourceT] |= dir
+ .[checkT] |= turn(dir, 180)
+ if(break_if_found[checkT.type] || break_if_found[checkT.loc.type])
+ return FALSE
+
+ //The below checks to make sure air can pass between the two turfs. If not, it can't be added to the area.
+ //This means walls can not be added to an area. The turf must first be added and then the wall.
+ //UNCOMMENT THIS IF YOU WANT THE BLUEPRINTS TO NOT ADD WALLS TO AN AREA.
+ //I personally think adding walls to an area is a big deal, so this is commented out.
+
+ //BEGIN ESOTERIC BULLSHIT
+ //log_debug("Origin: [origin.c_airblock(checkT)] SourceT: [sourceT.c_airblock(checkT)] 0=NB 1=AB 2=ZB, 3=B")
+ /*
+ if(origin.c_airblock(checkT)) //If everything breaks and it doesn't want to work, turn on the above debug and check this line. C.L. 0 = not blocked.
+ continue
+ */
+ //END ESOTERIC BULLSHIT
+
+ found_turfs += checkT // Since checkT is connected, add it to the list to be processed
+ if(found_turfs.len)
+ found_turfs += origin //If this isn't done, it just adds the 8 tiles around the user.
+ return found_turfs
+
+/proc/create_area(mob/creator, var/obj/item/areaeditor/AO)
+ if(AO && istype(AO,/obj/item/areaeditor))
+ if(AO.uses_charges && AO.charges < 1)
+ to_chat(creator, span_warning("You need more paper before you can even think of editing this area!"))
+ return
+
+ var/list/turfs = detect_room(get_turf(creator), area_or_turf_fail_types, BP_MAX_ROOM_SIZE*2)
+ if(!turfs)
+ to_chat(creator, span_warning("The new area must have a floor and not a part of a shuttle."))
+ return
+ if(length(turfs) > BP_MAX_ROOM_SIZE)
+ to_chat(creator, span_warning("The room you're in is too big. It is [length(turfs) >= BP_MAX_ROOM_SIZE *2 ? "more than 100" : ((length(turfs) / BP_MAX_ROOM_SIZE)-1)*100]% larger than allowed."))
+ return
+ var/list/areas = list("New Area" = /area)
+ var/annoy_admins = 0
+
+ for(var/i in 1 to length(turfs))
+ var/area/place = get_area(turfs[i])
+ if(blacklisted_areas[place.type])
+ continue
+ if(!place.requires_power || (place.flags & BLUE_SHIELDED))
+ continue // No expanding powerless rooms etc
+ areas[place.name] = place
+
+ var/area_choice = tgui_input_list(creator, "Choose an area to expand or make a new area", "Area Expansion", areas)
+ if(isnull(area_choice))
+ to_chat(creator, span_warning("No choice selected. No adjustments made."))
+ return
+ area_choice = areas[area_choice]
+
+ var/area/newA
+ var/area/oldA = get_area(get_turf(creator))
+ if(!isarea(area_choice))
+ var/str = tgui_input_text(creator, "New area name", "Blueprint Editing", max_length = MAX_NAME_LEN)
+ str = sanitize(str,MAX_NAME_LEN)
+ if(!str || !length(str)) //cancel
+ return
+ if(length(str) > 50)
+ to_chat(creator, "Name too long.")
+ return
+ for(var/area/A in world) //Check to make sure we're not making a duplicate name. Sanity.
+ if(A.name == str)
+ to_chat(creator, "An area in the world alreay has this name.")
+ return
+ annoy_admins = 1 //They just made a new area entirely.
+ newA = new area_choice
+ newA.setup(str)
+ newA.has_gravity = oldA.has_gravity
+ else
+ newA = area_choice
+
+ for(var/i in 1 to length(turfs)) //Fix lighting. Praise the lord.
+ var/turf/thing = turfs[i]
+ newA.contents += thing
+ thing.change_area(oldA, newA)
+
+
+ set_area_machinery(newA, newA.name, oldA.name)// Change the name and area defines of all the machinery to the correct area.
+ oldA.power_check() //Simply makes the area turn the power off if you nicked an APC from it.
+ to_chat(creator, span_notice("You have created a new area, named [newA.name]. It is now weather proof, and constructing an APC will allow it to be powered."))
+ if(annoy_admins)
+ message_admins("[key_name(creator, creator.client)] just made a new area called [newA.name] ](?) at ([creator.x],[creator.y],[creator.z] - JMP)",0,1)
+ log_game("[key_name(creator, creator.client)] just made a new area called [newA.name]")
+ if(AO && istype(AO,/obj/item/areaeditor))
+ if(AO.uses_charges)
+ AO.charges -= 1
+ return TRUE
+
+
+
+// USED FOR VARIANT ROOM CREATION.
+// OLD CODE. DON'T TOUCH OR 100 RABID SQUIRRELS WILL DEVOUR YOU.
+// I say old code, but it truly isn't. It's a bastardization of the new create_area code and the old create_area code.
+// In essence, it does a few things: Ensure no blacklisted areas are nearby, get the nearby areas (to allow merging), and allow you to make a whole near area.
+/obj/item/areaeditor/proc/create_area_whole(mob/creator, var/override = 0) //Gets the entire enclosed space and makes a new area out of it. Can overwrite old areas.
+ if(uses_charges && charges < 5)
+ to_chat(creator, span_warning("You need more paper before you can even think of editing this area!"))
+ return
+
+ var/res = detect_room_ex(get_turf(creator), can_create_areas_into, area_or_turf_fail_types)
+ if(!res)
+ to_chat(creator, span_warning("There is an area forbidden from being edited here! Use the fine-tune area creator! (3x3)"))
+ return
+
+ if(!istype(res,/list))
+ switch(res)
+ if(ROOM_ERR_SPACE)
+ to_chat(creator, "The new area must be completely airtight!")
+ return
+ if(ROOM_ERR_TOOLARGE)
+ to_chat(creator, "The new area too large!")
+ return
+ if(ROOM_ERR_FORBIDDEN)
+ to_chat(creator, "There is an area forbidden from being edited here!")
+ return
+ else
+ to_chat(creator, "Error! Please notify administration!")
+ return
+ var/list/turf/turfs = res
+
+ var/list/areas = list("New Area" = /area) //The list of areas surrounding the user.
+ var/area/newA //The new area
+ var/area/oldA = get_area(get_turf(creator)) //The old area (area currently standing in)
+ var/str //What the new area is named.
+ var/can_make_new_area = 1 //If they can make a new area here or not.
+
+ var/list/nearby_turfs_to_check = detect_room(get_turf(creator), area_or_turf_fail_types, BP_MAX_ROOM_SIZE*2) //Get the nearby areas.
+
+ if(!nearby_turfs_to_check)
+ to_chat(creator, span_warning("The new area must have a floor and not a part of a shuttle."))
+ return
+ if(length(turfs) > BP_MAX_ROOM_SIZE)
+ to_chat(creator, span_warning("The room you're in is too big. It is [length(turfs) >= BP_MAX_ROOM_SIZE *2 ? "more than 100" : ((length(turfs) / BP_MAX_ROOM_SIZE)-1)*100]% larger than allowed."))
+ return
+
+ for(var/i in 1 to length(nearby_turfs_to_check))
+ var/area/place = get_area(nearby_turfs_to_check[i])
+ if(blacklisted_areas[place.type])
+ if(!creator.lastarea != place) //Stops them from merging a blacklisted area to make it larger. Allows them to merge a blacklisted area into an allowed area. (Expansion!)
+ continue
+ if(!BUILDABLE_AREA_TYPES[place.type]) //TODOTODOTODO
+ can_make_new_area = 0
+ if(!place.requires_power || (place.flags & BLUE_SHIELDED))
+ continue // No expanding powerless rooms etc
+ areas[place.name] = place
+
+ //They can select an area they want to turn their current area into.
+ var/area_choice = tgui_input_list(creator, "What area do you want to turn the area YOU ARE CURRENTLY STANDING IN to? Or do you want to make a new area?", "Area Expansion", areas)
+ if(isnull(area_choice)) //They pressed cancel.
+ to_chat(creator, "No changes made.")
+ return
+
+ area_choice = areas[area_choice]
+
+
+ if(!isarea(area_choice)) //They chose "New Area"
+ if(!can_make_new_area && !can_override)
+ to_chat(creator, "Making a new area here would be meaningless. Renaming it would be a better option.")
+ return
+ str = tgui_input_text(creator, "New area name", "Blueprint Editing", max_length = MAX_NAME_LEN)
+ str = sanitize(str,MAX_NAME_LEN)
+ if(!str || !length(str)) //cancel
+ return
+ if(length(str) > 50)
+ to_chat(creator, "Name too long.")
+ return
+ for(var/area/A in world) //Check to make sure we're not making a duplicate name. Sanity.
+ if(A.name == str)
+ to_chat(creator, "An area in the world alreay has this name.")
+ return
+
+ var/confirm = tgui_alert(creator, "Are you sure you want to change [oldA.name] into a new area named [str]?", "READ CAREFULLY", list("No", "Yes"))
+ if(confirm == "No")
+ to_chat(creator, "No changes made.")
+ return
+
+ newA = new area_choice
+ newA.setup(str)
+ newA.has_gravity = oldA.has_gravity
+ else
+ var/confirm = tgui_alert(creator, "Are you sure you want to change [oldA.name] into [area_choice]?", "READ CAREFULLY", list("No", "Yes"))
+ if(confirm == "No")
+ to_chat(creator, "No changes made.")
+ return
+ newA = area_choice //They selected to turn the area they're standing on into the selected area.
+
+ if(str) //New area, new name.
+ newA.setup(str)
+ else
+ newA.setup(newA.name)
+
+ for(var/i in 1 to length(turfs)) //Fix lighting. Praise the lord.
+ var/turf/thing = turfs[i]
+ newA.contents += thing
+ thing.change_area(oldA, newA)
+
+ move_turfs_to_area(turfs, newA)
+ newA.has_gravity = oldA.has_gravity
+ set_area_machinery(newA, newA.name, oldA.name)
+ oldA.power_check() //Simply makes the area turn the power off if you nicked an APC from it.
+ to_chat(creator, span_notice("You have created a new area, named [newA.name]. It is now weather proof, and constructing an APC will allow it to be powered."))
+ message_admins("[key_name(creator, creator.client)] just made a new area called [newA.name] ](?) at ([creator.x],[creator.y],[creator.z] - JMP)",0,1)
+ log_game("[key_name(creator, creator.client)] just made a new area called [newA.name]")
+ charges -= 5
+
+ spawn(5)
+ interact()
+ return
+
+/proc/move_turfs_to_area(var/list/turf/turfs, var/area/A)
+ for(var/T in turfs)
+ ChangeArea(T, A)
+
+
+/obj/item/areaeditor/proc/detect_room_ex(var/turf/first, var/allowedAreas = AREA_SPACE, var/list/forbiddenAreas = list(), var/visual)
+ if(!istype(first))
+ return ROOM_ERR_LOLWAT
+ if(!visual && forbiddenAreas[first.loc.type] || forbiddenAreas[first.type]) //Is the area of the starting turf a banned area? Is the turf a banned area?
+ return ROOM_ERR_FORBIDDEN
+ var/list/turf/found = new
+ var/list/turf/pending = list(first)
+ while(pending.len)
+ if (found.len+pending.len > BP_MAX_ROOM_SIZE)
+ return ROOM_ERR_TOOLARGE
+ var/turf/T = pending[1] //why byond havent list::pop()?
+ pending -= T
+ for (var/dir in cardinal)
+ var/turf/NT = get_step(T,dir)
+ if (!isturf(NT) || (NT in found) || (NT in pending))
+ continue
+ if(!visual && forbiddenAreas[NT.loc.type])
+ return ROOM_ERR_FORBIDDEN
+ // We ask ZAS to determine if its airtight. Thats what matters anyway right?
+ if(air_master.air_blocked(T, NT))
+ // Okay thats the edge of the room
+ if(get_area_type(NT.loc) == AREA_SPACE && air_master.air_blocked(NT, NT))
+ found += NT // So we include walls/doors not already in any area
+ continue
+ if (istype(NT, /turf/space))
+ return ROOM_ERR_SPACE //omg hull breach we all going to die here
+ if (istype(NT, /turf/simulated/shuttle))
+ return ROOM_ERR_SPACE // Unsure why this, but was in old code. Trusting for now.
+ if (NT.loc != first.loc && !(get_area_type(NT.loc) & allowedAreas))
+ // Edge of a protected area. Lets stop here...
+ continue
+ if (!istype(NT, /turf/simulated))
+ // Great, unsimulated... eh, just stop searching here
+ continue
+ // Okay, NT looks promising, lets continue the search there!
+ pending += NT
+ found += T
+ // end while
+ return found
+
+
+
+
+
+
+
+//Nice verbs for the engineer to see where areas start/end.
+
+/obj/item/areaeditor/verb/seeRoomColors()
+ set src in usr
+ set category = "Blueprints"
+ set name = "Show Room Colors"
+
+ // If standing somewhere we can expand from, use expand perms, otherwise create
+ var/canOverwrite = (get_area_type() & can_expand_areas_in) ? can_expand_areas_into : can_create_areas_into
+ var/res = detect_room_ex(get_turf(usr), canOverwrite, visual = 1)
+ if(!istype(res, /list))
+ switch(res)
+ if(ROOM_ERR_SPACE)
+ to_chat(usr, "The new area must be completely airtight!")
+ return
+ if(ROOM_ERR_TOOLARGE)
+ to_chat(usr, "The new area too large!")
+ return
+ else
+ to_chat(usr, "Error! Please notify administration!")
+ return
+ // Okay we got a room, lets color it
+ seeAreaColors_remove()
+ var/icon/green = new('icons/misc/debug_group.dmi', "green")
+ for(var/turf/T in res)
+ usr << image(green, T, "blueprints", TURF_LAYER)
+ areaColor_turfs += T
+ to_chat(usr, "The space covered by the new area is highlighted in green.")
+
+/obj/item/areaeditor/verb/seeAreaColors()
+ set src in usr
+ set category = "Blueprints"
+ set name = "Show Area Colors"
+
+ // Remove any existing
+ seeAreaColors_remove()
+
+ to_chat(usr, "\The [src] shows nearby areas in different colors.")
+ var/i = 0
+ for(var/area/A in range(usr))
+ if(get_area_type(A) == AREA_SPACE)
+ continue // Don't overlay all of space!
+ var/icon/areaColor = new('icons/misc/debug_rebuild.dmi', "[++i]")
+ to_chat(usr, "- [A] as [i]")
+ for(var/turf/T in A.contents)
+ usr << image(areaColor, T, "blueprints", TURF_LAYER)
+ areaColor_turfs += T
+
+/obj/item/areaeditor/verb/seeAreaColors_remove()
+ set src in usr
+ set category = "Blueprints"
+ set name = "Remove Area Colors"
+
+ areaColor_turfs.Cut()
+ if(usr.client.images.len)
+ for(var/image/i in usr.client.images)
+ if(i.icon_state == "blueprints")
+ usr.client.images.Remove(i)
+
+
+
+
+
+
+
+
+
+
+
+//GLOBAL VERB FOR PAPER TO ENABLE ANYONE TO MAKE AN AREA IN BUILDABLE AREAS.
+//THIS IS 70 TILES. ANYTHING LARGER SHOULD USE ACTUAL BLUEPRINTS.
+
+/obj/item/weapon/paper
+ var/created_area = 0
+ var/area_cooldown = 0
+
+/obj/item/weapon/paper/verb/create_area()
+ set name = "Create Area"
+ set category = "Object"
+ set src in usr
+
+ if(created_area)
+ to_chat(usr, "This paper has already been used to create an area.")
+ return
+
+ if(usr.stat || world.time < area_cooldown)
+ to_chat(usr, "You recently used this paper to try to create an area. Wait one minute before using it again.")
+ return
+
+ area_cooldown = world.time + 600 //Anti spam.
+
+ create_new_area(usr)
+ add_fingerprint(usr)
+ return
+
+/proc/get_new_area_type(area/A) //1 = can build in. 0 = can not build in.
+ if (!A)
+ A = get_area(usr)
+ if(A.outdoors) //ALWAYS able to build outdoors. This means if it's missed in BUILDABLE_AREA_TYPES it's fine.
+ return 1
+
+ for (var/type in BUILDABLE_AREA_TYPES) //This works well.
+ if ( istype(A,type) )
+ return 1
+
+ for (var/type in SPECIALS)
+ if ( istype(A,type) )
+ return 0
+ return 0 //If it's not a buildable area, don't let them build in it.
+
+
+/proc/detect_new_area(var/turf/first, var/user) //Heavily simplified version for creating an area yourself.
+ if(!istype(first)) //Not on a turf.
+ to_chat(usr, "")
+ return
+ if(get_new_area_type(first.loc) == 1) //Are they in an area they can build? I tried to do this BUILDABLE_AREA_TYPES[first.loc.type] but it refused.
+ var/list/turf/found = new
+ var/list/turf/pending = list(first)
+ while(pending.len)
+ if (found.len+pending.len > 70)
+ return 1 //TOOLARGE
+ var/turf/T = pending[1]
+ pending -= T
+ for (var/dir in cardinal)
+ var/turf/NT = get_step(T,dir)
+ if (!isturf(NT) || (NT in found) || (NT in pending))
+ continue
+ if(!get_new_area_type(NT.loc) == 1) //The contains somewhere that is NOT a buildable area.
+ return 3 //NOT A BUILDABLE AREA
+
+ if(air_master.air_blocked(T, NT)) //Is the room airtight?
+ // Okay thats the edge of the room
+ if(get_new_area_type(NT.loc) == 1 && air_master.air_blocked(NT, NT))
+ found += NT // So we include walls/doors not already in any area
+ continue
+ if (istype(NT, /turf/space))
+ return 2 //SPACE
+ if (istype(NT, /turf/simulated/shuttle))
+ return 2 //SPACE
+ if (NT.loc != first.loc && !(get_new_area_type(NT.loc) & 1))
+ // Edge of a protected area. Lets stop here...
+ continue
+ if (!istype(NT, /turf/simulated))
+ // Great, unsimulated... eh, just stop searching here
+ continue
+ // Okay, NT looks promising, lets continue the search there!
+ pending += NT
+ found += T
+ // end while
+ return found
+ else
+ return 3
+
+/proc/create_new_area(mob/creator) //Heavily simplified version of the blueprint version.
+ var/res = detect_new_area(get_turf(creator), creator)
+ if(!res)
+ to_chat(creator, span_warning("Something went wrong."))
+ return
+
+ if(!istype(res,/list))
+ switch(res)
+ if(1)
+ to_chat(creator, "The new area too large! You can only have an area that is up to 70 tiles.")
+ return
+ if(2)
+ to_chat(creator, "The new area must be completely airtight and not be part of a shuttle!")
+ return
+ if(3)
+ to_chat(creator, "There is an area not permitted to be built in somewhere in the room!")
+ return
+ else
+ to_chat(creator, "Error! Please notify administration!")
+ return
+ var/list/turf/turfs = res
+
+ var/area/newA //The new area
+ var/area/oldA = get_area(get_turf(creator)) //The old area (area currently standing in)
+ var/str //What the new area is named.
+
+ var/list/nearby_turfs_to_check = detect_room(get_turf(creator), area_or_turf_fail_types, 70) //Get the nearby areas.
+
+ if(!nearby_turfs_to_check)
+ to_chat(creator, span_warning("The new area must have a floor and not a part of a shuttle."))
+ return
+ if(length(turfs) > 70) //Sanity
+ to_chat(creator, span_warning("The room you're in is too big. It can only be 70 tiles in size, excluding walls."))
+ return
+
+ //They can select an area they want to turn their current area into.
+ str = sanitizeSafe(tgui_input_text(usr, "What would you like to name the area?", "Area Name", null, MAX_NAME_LEN), MAX_NAME_LEN)
+ if(isnull(str)) //They pressed cancel.
+ to_chat(creator, "No new area made. Cancelling.")
+ return
+ if(!str || !length(str)) //sanity
+ to_chat(creator, "No new area made. Cancelling.")
+ return
+ if(length(str) > MAX_NAME_LEN)
+ to_chat(creator, "Name too long.")
+ return
+ for(var/area/A in world) //Check to make sure we're not making a duplicate name. Sanity.
+ if(A.name == str)
+ to_chat(creator, "An area in the world alreay has this name.")
+ return
+ newA = new /area
+ newA.setup(str)
+ newA.has_gravity = oldA.has_gravity
+ newA.setup(str)
+
+ for(var/i in 1 to length(turfs)) //Fix lighting. Praise the lord.
+ var/turf/thing = turfs[i]
+ newA.contents += thing
+ thing.change_area(oldA, newA)
+
+ move_turfs_to_area(turfs, newA)
+ newA.has_gravity = oldA.has_gravity
+ set_area_machinery(newA, newA.name, oldA.name)
+ oldA.power_check() //Simply makes the area turn the power off if you nicked an APC from it.
+ to_chat(creator, span_notice("You have created a new area, named [newA.name]. It is now weather proof, and constructing an APC will allow it to be powered."))
+ message_admins("[key_name(creator, creator.client)] just made a new area called [newA.name] ](?) at ([creator.x],[creator.y],[creator.z] - JMP)",0,1)
+ log_game("[key_name(creator, creator.client)] just made a new area called [newA.name]")
+
+ return
+
+
+#undef BP_MAX_ROOM_SIZE
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index 862d4e6cdaf..94a24c9ee8b 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -33,7 +33,7 @@
/obj/structure/closet/body_bag/attackby(var/obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/pen))
- var/t = tgui_input_text(user, "What would you like the label to be?", text("[]", src.name), null)
+ var/t = tgui_input_text(user, "What would you like the label to be?", text("[]", src.name), null, MAX_NAME_LEN )
if (user.get_active_hand() != W)
return
if (!in_range(src, user) && src.loc != user)
diff --git a/code/game/objects/items/contraband_vr.dm b/code/game/objects/items/contraband_vr.dm
index 79a19b7794e..67377884864 100644
--- a/code/game/objects/items/contraband_vr.dm
+++ b/code/game/objects/items/contraband_vr.dm
@@ -51,6 +51,7 @@
/obj/item/device/perfect_tele,
/obj/item/device/sleevemate,
/obj/item/weapon/disk/nifsoft/compliance,
+ /obj/item/weapon/implanter/compliance,
/obj/item/seeds/ambrosiadeusseed,
/obj/item/seeds/ambrosiavulgarisseed,
/obj/item/seeds/libertymycelium,
diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm
index 21ec2ea3b66..980685f1241 100644
--- a/code/game/objects/items/devices/gps.dm
+++ b/code/game/objects/items/devices/gps.dm
@@ -137,7 +137,7 @@ var/list/GPS_list = list()
if(emped)
to_chat(user, "It's busted!")
return
-
+
toggle_tracking()
if(tracking)
to_chat(user, "[src] is no longer tracking, or visible to other GPS devices.")
@@ -194,7 +194,7 @@ var/list/GPS_list = list()
dat["curr_z"] = curr.z
dat["curr_z_name"] = strip_improper(using_map.get_zlevel_name(curr.z))
dat["z_level_detection"] = using_map.get_map_levels(curr.z, long_range)
-
+
var/list/gps_list = list()
for(var/obj/item/device/gps/G in GPS_list - src)
@@ -250,7 +250,7 @@ var/list/GPS_list = list()
dat += ""
var/gps_ref = "\ref[gps["ref"]]"
dat += "| [gps["gps_tag"]] | [gps["area_name"]] | "
-
+
if(istype(gps_data["ref"], /obj/item/device/gps/internal/poi))
dat += "[gps["local"] ? "[gps["direction"]] Dist: [round(gps["distance"], 10)]m" : "[gps["z_name"]]"] | "
else
@@ -323,7 +323,7 @@ var/list/GPS_list = list()
. = TRUE
if(href_list["tag"])
- var/a = tgui_input_text(usr, "Please enter desired tag.", name, gps_tag)
+ var/a = tgui_input_text(usr, "Please enter desired tag.", name, gps_tag, 10)
a = uppertext(copytext(sanitize(a), 1, 11))
if(in_range(src, usr))
gps_tag = a
diff --git a/code/game/objects/items/devices/personal_shield_generator_vr.dm b/code/game/objects/items/devices/personal_shield_generator_vr.dm
index d6b63c4c41a..6d105b7b542 100644
--- a/code/game/objects/items/devices/personal_shield_generator_vr.dm
+++ b/code/game/objects/items/devices/personal_shield_generator_vr.dm
@@ -29,6 +29,7 @@
action_button_name = "Toggle Shield"
var/obj/item/weapon/gun/energy/gun/generator/active_weapon
var/obj/item/weapon/cell/device/bcell = null
+ var/upgraded = 0 // If the PSG has been upgraded by some method or not. Only used for the mining belt ATM.
var/generator_hit_cost = 100 // Power used when a special effect (such as a bullet being blocked) is performed! Could also be expanded to other things.
@@ -78,6 +79,8 @@
/obj/item/device/personal_shield_generator/examine(mob/user)
. = ..()
if(Adjacent(user))
+ if(upgraded)
+ . += "The unit appears to be upgraded."
if(bcell)
. += "The internal cell is [round(bcell.percent() )]% charged."
else
@@ -504,11 +507,12 @@
w_class = ITEMSIZE_SMALL
/obj/item/device/personal_shield_generator/belt/mining/attackby(obj/item/weapon/W, mob/user, params)
- if(modifier_type == /datum/modifier/shield_projection/mining/strong)
- to_chat(user, "This shield generator is already upgraded!")
- return
if(istype(W, /obj/item/borg/upgrade/shield_upgrade))
+ if(modifier_type == /datum/modifier/shield_projection/mining/strong)
+ to_chat(user, "This shield generator is already upgraded!")
+ return
modifier_type = /datum/modifier/shield_projection/mining/strong
+ upgraded = 1
to_chat(user, "You upgrade the [src] with the [W]!")
user.drop_from_inventory(W)
qdel(W)
diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm
index 849a649894f..a9e5613a926 100644
--- a/code/game/objects/items/devices/tvcamera.dm
+++ b/code/game/objects/items/devices/tvcamera.dm
@@ -65,7 +65,8 @@
if(..())
return 1
if(href_list["channel"])
- var/nc = tgui_input_text(usr, "Channel name", "Select new channel name", channel)
+ var/nc = tgui_input_text(usr, "Channel name", "Select new channel name", channel, MAX_NAME_LEN)
+ nc = sanitize(nc,MAX_NAME_LEN)
if(nc)
channel = nc
camera.c_tag = channel
diff --git a/code/game/objects/items/weapons/implants/implant_vr.dm b/code/game/objects/items/weapons/implants/implant_vr.dm
index a2f22438bdf..bfb7f595315 100644
--- a/code/game/objects/items/weapons/implants/implant_vr.dm
+++ b/code/game/objects/items/weapons/implants/implant_vr.dm
@@ -132,4 +132,76 @@
src.imp = new /obj/item/weapon/implant/sizecontrol( src )
..()
update()
- return
\ No newline at end of file
+ return
+
+
+//////////////////////////////
+// Compliance Implant
+//////////////////////////////
+/obj/item/weapon/implanter/compliance
+ name = "compliance implant"
+ desc = "Implant which allows for implanting 'laws' or 'commands' in the host. Has a minature keyboard for typing laws into."
+ description_info = {"An implant that allows for a 'law' or 'command' to be uploaded in the implanted host.
+In un-modified organics, this is performed through manipulation of the nervous system and release of chemicals to ensure continued compliance.
+In synthetics or modified organics, this implant uploads a virus to any compatable hardware.
+Due to the small chemical capacity of the implant, the life of the implant is relatively small, wearing off within 24 hours or sooner."}
+
+ description_fluff = "Due to the illegality of these types of implants, they are often made in clandestine facilities with a complete lack of quality control \
+ and as such, may malfunction or simply not work whatsoever. After loyalty implants were outlawed in many civilized areas of space, an abundance of readily \
+ available implanters and implants became available for purchase on the black market, with some deciding to modify them. Now, they are often used by illegal \
+ entities to perform espionage and in some parts of space are used off the books for interrogation. Most of the makers of these modified implants have put in \
+ safeties to prevent lethal or actively harmful commands from being input to lessen the severity of the crime if they are caught. This one has a golden stamp \
+ with the shape of a star on it, the letters 'KE' in black text on it."
+
+/obj/item/weapon/implanter/compliance/New()
+ src.imp = new /obj/item/weapon/implant/compliance( src )
+ ..()
+ update()
+ return
+
+/obj/item/weapon/implanter/compliance/attack_self(mob/user)
+ if(istype(imp,/obj/item/weapon/implant/compliance))
+ var/obj/item/weapon/implant/compliance/implant = imp
+ var/newlaws = tgui_input_text(user, "Please Input Laws", "Compliance Laws", "", multiline = TRUE, prevent_enter = TRUE)
+ newlaws = sanitize(newlaws,2048)
+ if(newlaws)
+ to_chat(user,"You set the laws to:
[newlaws]")
+ implant.laws = newlaws //Organic
+ else //No using other implants.
+ to_chat(user,"A red warning pops up on the implanter's micro-screen: 'INVALID IMPLANT DETECTED.'")
+
+
+/obj/item/weapon/implant/compliance
+ name = "compliance implant"
+ desc = "Implant which allows for forcing obedience in the host."
+ icon_state = "implant_evil"
+ var/active = TRUE
+ var/laws = "CHANGE BEFORE IMPLANTATION"
+ var/nif_payload = /datum/nifsoft/compliance
+
+/obj/item/weapon/implant/compliance/get_data()
+ var/dat = {"
+Implant Specifications:
+Name:Compliance Implant
+Life:24 Hours
+
+Function: Forces a subject to follow a set of laws.
+
+Set Laws:[laws]"}
+ return dat
+
+/obj/item/weapon/implant/compliance/post_implant(mob/source, mob/living/user = usr)
+ if(!ishuman(source)) //No compliance implanting non-humans.
+ return
+
+ var/mob/living/carbon/human/target = source
+ if(!target.nif || target.nif.stat != NIF_WORKING) //No nif or their NIF is broken.
+ to_chat(target, "You suddenly feel compelled to follow the following commands: [laws]")
+ to_chat(target, "((OOC NOTE: Commands that go against server rules should be disregarded and ahelped.))")
+ to_chat(target, "((OOC NOTE: Your new commands can be checked at any time by using the 'notes' command in chat. Additionally, if you did not agree to this, you are not compelled to follow the implant.))")
+ target.add_memory(laws)
+ return
+ else //You got a nif...Upload time.
+ new nif_payload(target.nif,laws)
+ to_chat(target, "((OOC NOTE: Commands that go against server rules should be disregarded and ahelped.))")
+ to_chat(target, "((OOC NOTE: If you did not agree to this, you are not compelled to follow the laws.))")
diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm
index 1517e2ada31..5e81318ac6b 100644
--- a/code/game/objects/items/weapons/implants/implantcase.dm
+++ b/code/game/objects/items/weapons/implants/implantcase.dm
@@ -21,7 +21,7 @@
/obj/item/weapon/implantcase/attackby(obj/item/weapon/I as obj, mob/user as mob)
..()
if (istype(I, /obj/item/weapon/pen))
- var/t = tgui_input_text(user, "What would you like the label to be?", text("[]", src.name), null)
+ var/t = tgui_input_text(user, "What would you like the label to be?", text("[]", src.name), null, MAX_NAME_LEN)
if (user.get_active_hand() != I)
return
if((!in_range(src, usr) && src.loc != user))
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 1c60a1b5c52..7aa869ac15f 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -5,7 +5,8 @@
starts_with = list(
/obj/item/clothing/accessory/storage/brown_vest,
- /obj/item/blueprints,
+ /obj/item/areaeditor/blueprints,
+ /obj/item/wire_reader,
///obj/item/clamp, //VOREStation Removal: without leaks those are pointless,
///obj/item/clamp, //VOREStation Removal: without leaks those are pointless,
/obj/item/clothing/under/rank/chief_engineer,
@@ -99,7 +100,8 @@
/obj/item/clothing/shoes/boots/winter/engineering,
/obj/item/weapon/tank/emergency/oxygen/engi,
/obj/item/weapon/storage/belt/utility, //VOREStation Add
- /obj/item/weapon/reagent_containers/spray/windowsealant) //VOREStation Add
+ /obj/item/weapon/reagent_containers/spray/windowsealant, //VOREStation Add
+ /obj/item/areaeditor/blueprints/engineers) //VOREStation Add
/obj/structure/closet/secure_closet/engineering_personal/Initialize()
if(prob(50))
diff --git a/code/game/objects/structures/trash_pile_vr.dm b/code/game/objects/structures/trash_pile_vr.dm
index d1e9a0593e2..ccd069386bf 100644
--- a/code/game/objects/structures/trash_pile_vr.dm
+++ b/code/game/objects/structures/trash_pile_vr.dm
@@ -302,6 +302,7 @@
prob(1);/obj/item/weapon/beartrap,
prob(1);/obj/item/weapon/cell/hyper/empty,
prob(1);/obj/item/weapon/disk/nifsoft/compliance,
+ prob(1);/obj/item/weapon/implanter/compliance,
prob(1);/obj/item/weapon/material/knife/tacknife,
prob(1);/obj/item/weapon/storage/box/survival/space,
prob(1);/obj/item/weapon/storage/secure/briefcase/trashmoney,
diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm
index 485cc88e226..962888dc94a 100644
--- a/code/modules/admin/verbs/buildmode.dm
+++ b/code/modules/admin/verbs/buildmode.dm
@@ -128,7 +128,7 @@
to_chat(usr, "***********************************************************
\
Left Mouse Button on turf = Select as point A
\
Right Mouse Button on turf = Select as point B
\
- Right Mouse Button on buildmode button = Change floor/wall type
\
+ Right Mouse Button on buildmode button = Change floor/wall type/area name
\
***********************************************************")
if(BUILDMODE_LADDER)
@@ -189,6 +189,7 @@
var/atom/movable/throw_atom = null
var/list/selected_mobs = list()
var/copied_faction = null
+ var/warned = 0
/obj/effect/bmode/buildholder/Destroy()
qdel(builddir)
@@ -219,13 +220,15 @@
screen_loc = "NORTH,WEST+2"
var/varholder = "name"
var/valueholder = "derp"
- var/objholder = /obj/structure/closet
+ var/objholder = null
var/objsay = 1
var/wall_holder = /turf/simulated/wall
var/floor_holder = /turf/simulated/floor/plating
var/turf/coordA = null
var/turf/coordB = null
+ var/area_enabled = 0
+ var/area_name = "New Area"
var/new_light_color = "#FFFFFF"
var/new_light_range = 3
@@ -252,7 +255,7 @@
return 1
if(BUILDMODE_ADVANCED)
- objholder = get_path_from_partial_text(/obj/structure/closet)
+ objholder = get_path_from_partial_text()
if(BUILDMODE_EDIT)
var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine")
@@ -275,6 +278,18 @@
master.buildmode.valueholder = tgui_input_list(usr,"Enter variable value:", "Value", world)
if(BUILDMODE_ROOM)
+ var/area_choice = tgui_alert(usr, "Would you like to generate a new area as well?","Room Builder", list("No", "Yes"))
+ switch(area_choice)
+ if("No")
+ area_enabled = 0
+ if("Yes")
+ area_enabled = 1
+ area_name = tgui_input_text(usr, "New area name", "Room Buildmode", max_length = MAX_NAME_LEN)
+ if(isnull(area_name))
+ to_chat(usr, "You must enter a non-null name.")
+ area_enabled = 0
+ return
+ area_name = sanitize(area_name,MAX_NAME_LEN)
var/choice = tgui_alert(usr, "Would you like to change the floor or wall holders?","Room Builder", list("Floor", "Wall"))
switch(choice)
if("Floor")
@@ -330,7 +345,13 @@
return
else if(istype(object,/turf/simulated/floor))
var/turf/T = object
- T.ChangeTurf(/turf/space)
+ if(!holder.warned)
+ var/warning = tgui_alert(user, "Are you -sure- you want to delete this turf and make it the base turf for this Z level?", "GRIEF ALERT", list("No", "Yes"))
+ if(warning == "Yes")
+ holder.warned = 1
+ else
+ return
+ T.ChangeTurf(get_base_turf_by_area(T)) //Defaults to Z if area does not have a special base turf.
return
else if(istype(object,/turf/simulated/wall/r_wall))
var/turf/T = object
@@ -358,6 +379,13 @@
if(NORTHWEST)
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object))
WIN.set_dir(NORTHWEST)
+ else if(istype(object,/turf) && pa.Find("ctrl") && pa.Find("alt") && pa.Find("middle"))
+ var/turf/T = object
+ var/obj/item/toy/plushie/teshari/easter_egg = new /obj/item/toy/plushie/teshari(T)
+ easter_egg.name = "coding teshari plushie"
+ easter_egg.desc = "A small purple teshari with a plush keyboard attached to it. Where did this come from?"
+ easter_egg.color = "#a418c7"
+
if(BUILDMODE_ADVANCED)
if(pa.Find("left") && !pa.Find("ctrl"))
@@ -411,13 +439,19 @@
to_chat(user, "Defined [object] ([object.type]) as point B.")
if(holder.buildmode.coordA && holder.buildmode.coordB)
+ if(isnull(holder.buildmode.area_name))
+ to_chat(user, "ERROR: Insert area name before use.")
+ holder.buildmode.coordA = null
+ holder.buildmode.coordB = null
+ return
to_chat(user, "A and B set, creating rectangle.")
holder.buildmode.make_rectangle(
holder.buildmode.coordA,
holder.buildmode.coordB,
holder.buildmode.wall_holder,
- holder.buildmode.floor_holder
- )
+ holder.buildmode.floor_holder,
+ holder.buildmode.area_enabled,
+ holder.buildmode.area_name)
holder.buildmode.coordA = null
holder.buildmode.coordB = null
@@ -647,11 +681,9 @@
result = matches[1]
else
result = tgui_input_list(usr, "Select an atom type", "Spawn Atom", matches, strict_modern = TRUE)
- if(!objholder)
- result = default_path
return result
-/obj/effect/bmode/buildmode/proc/make_rectangle(var/turf/A, var/turf/B, var/turf/wall_type, var/turf/floor_type)
+/obj/effect/bmode/buildmode/proc/make_rectangle(var/turf/A, var/turf/B, var/turf/wall_type, var/turf/floor_type, var/area_enabled, var/area_name)
if(!A || !B) // No coords
return
if(A.z != B.z) // Not same z-level
@@ -685,6 +717,10 @@
var/high_bound_x = lower_left_corner.x + abs(width)
var/high_bound_y = lower_left_corner.y + abs(height)
+ var/origin_x = lower_left_corner.x + round((abs(width)/2))
+ var/origin_y = lower_left_corner.y + round((abs(height)/2))
+ var/turf/origin
+
for(var/i = low_bound_x, i <= high_bound_x, i++)
for(var/j = low_bound_y, j <= high_bound_y, j++)
var/turf/T = locate(i, j, z_level)
@@ -693,11 +729,91 @@
T.ChangeTurf(wall_type)
else
new wall_type(T)
+
else
+ if(T.x == origin_x && T.y == origin_y) //Get the middle of the square.
+ origin = T
if(isturf(floor_type))
T.ChangeTurf(floor_type)
else
new floor_type(T)
+ if(area_enabled) //Let's try not to make a new area unless you got walls and a floor.
+ create_buildmode_area(area_name, origin) //Generates a new area.
+
+/proc/create_buildmode_area(var/area_name, var/turf/origin)
+ var/turfs = detect_room_buildmode(origin)
+
+ var/area/newA
+ var/area/oldA = get_area(origin)
+ var/str = area_name
+ str = sanitize(str,MAX_NAME_LEN)
+ if(!str || !length(str)) //cancel
+ return
+ newA = new /area/buildmode
+ newA.dynamic_lighting = FALSE // Without this it's pitch black if you build anywhere but space.
+ newA.luminosity = TRUE // Without this it's pitch black if you build anywhere but space.
+ newA.setup(str)
+ newA.has_gravity = oldA.has_gravity
+
+ for(var/i in 1 to length(turfs)) //Fix lighting. Praise the lord.
+ var/turf/thing = turfs[i]
+ newA.contents += thing
+ thing.change_area(oldA, newA)
+
+ set_area_machinery(newA, newA.name, oldA.name)// Change the name and area defines of all the machinery to the correct area.
+ oldA.power_check() //Simply makes the area turn the power off if you nicked an APC from it.
+ return TRUE
+
+/proc/detect_room_buildmode(var/turf/first, var/allowedAreas = AREA_SPACE)
+ if(!istype(first))
+ return
+ var/list/turf/found = new
+ var/list/turf/pending = list(first)
+ while(pending.len)
+ var/turf/T = pending[1]
+ pending -= T
+ for (var/dir in cardinal)
+ var/turf/NT = get_step(T,dir)
+ if (!isturf(NT) || (NT in found) || (NT in pending))
+ continue
+ // We ask ZAS to determine if its airtight. Thats what matters anyway right?
+ if(air_master.air_blocked(T, NT))
+ // Okay thats the edge of the room
+ if(get_area_type_buildmode(NT.loc) == AREA_SPACE && air_master.air_blocked(NT, NT))
+ found += NT // So we include walls/doors not already in any area
+ continue
+ if (istype(NT, /turf/space))
+ return //omg hull breach we all going to die here
+ if (istype(NT, /turf/simulated/shuttle))
+ return // Unsure why this, but was in old code. Trusting for now.
+ if (NT.loc != first.loc && !(get_area_type_buildmode(NT.loc) & allowedAreas))
+ // Edge of a protected area. Lets stop here...
+ continue
+ if (!istype(NT, /turf/simulated))
+ // Great, unsimulated... eh, just stop searching here
+ continue
+ // Okay, NT looks promising, lets continue the search there!
+ pending += NT
+ found += T
+ // end while
+ return found
+
+/proc/get_area_type_buildmode(area/A)
+ if(A.outdoors)
+ return AREA_SPACE
+
+ for (var/type in BUILDABLE_AREA_TYPES)
+ if ( istype(A,type) )
+ return AREA_SPACE
+
+ for (var/type in SPECIALS)
+ if ( istype(A,type) )
+ return AREA_SPECIAL
+ return AREA_STATION
+
+/area/buildmode
+ dynamic_lighting = FALSE
+ luminosity = FALSE
#undef BUILDMODE_BASIC
#undef BUILDMODE_ADVANCED
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 4ae6532daf6..5133728ac0c 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -86,10 +86,14 @@
if (!holder)
return
- var/msg = sanitize(tgui_input_text(usr, "Message:", text("Subtle PM to [M.key]")))
+ var/msg = tgui_input_text(usr, "Message:", text("Subtle PM to [M.key]"))
if (!msg)
return
+
+ if(!(msg[1] == "<" && msg[length(msg)] == ">")) //You can use HTML but only if the whole thing is HTML. Tries to prevent admin 'accidents'.
+ msg = sanitize(msg)
+
if(usr)
if (usr.client)
if(usr.client.holder)
diff --git a/code/modules/economy/vending_machines_vr.dm b/code/modules/economy/vending_machines_vr.dm
index e7479d1823a..76ca60a1506 100644
--- a/code/modules/economy/vending_machines_vr.dm
+++ b/code/modules/economy/vending_machines_vr.dm
@@ -7,6 +7,7 @@
products += list(/obj/item/weapon/gun/energy/taser = 8,/obj/item/weapon/gun/energy/stunrevolver = 4,
/obj/item/weapon/reagent_containers/spray/pepper = 6,/obj/item/taperoll/police = 6,
/obj/item/clothing/glasses/omnihud/sec = 6)
+ contraband += list(/obj/item/weapon/implanter/compliance = 1)
..()
/obj/machinery/vending/tool/New()
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 963b869439e..e4fc9ac89ca 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -347,7 +347,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
/obj/item/toy/syndicateballoon, /obj/item/weapon/gun/energy/captain,\
/obj/item/weapon/hand_tele, /obj/item/weapon/rcd, /obj/item/weapon/tank/jetpack,\
/obj/item/clothing/under/rank/captain, /obj/item/device/aicard,\
- /obj/item/clothing/shoes/magboots, /obj/item/blueprints, /obj/item/weapon/disk/nuclear,\
+ /obj/item/clothing/shoes/magboots, /obj/item/areaeditor/blueprints, /obj/item/weapon/disk/nuclear,\
/obj/item/clothing/suit/space/void, /obj/item/weapon/tank)
/proc/fake_attack(var/mob/living/target)
diff --git a/code/modules/integrated_electronics/core/pins.dm b/code/modules/integrated_electronics/core/pins.dm
index c402cf022d2..1d972fa0d72 100644
--- a/code/modules/integrated_electronics/core/pins.dm
+++ b/code/modules/integrated_electronics/core/pins.dm
@@ -154,12 +154,13 @@ list[](
var/new_data = null
switch(type_to_use)
if("string")
- new_data = tgui_input_text(usr, "Now type in a string.","[src] string writing", istext(default) ? default : null)
+ new_data = tgui_input_text(usr, "Now type in a string.","[src] string writing", istext(default) ? default : null, MAX_NAME_LEN)
+ new_data = sanitize(new_data,MAX_NAME_LEN)
if(istext(new_data) && holder.check_interactivity(user) )
to_chat(user, "You input [new_data] into the pin.")
return new_data
if("number")
- new_data = tgui_input_number(usr, "Now type in a number.","[src] number writing", isnum(default) ? default : null)
+ new_data = tgui_input_number(usr, "Now type in a number.","[src] number writing", isnum(default) ? default : null, MAX_NAME_LEN)
if(isnum(new_data) && holder.check_interactivity(user) )
to_chat(user, "You input [new_data] into the pin.")
return new_data
diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm
index dcaaf58057a..bc3b9493e26 100644
--- a/code/modules/integrated_electronics/core/tools.dm
+++ b/code/modules/integrated_electronics/core/tools.dm
@@ -122,7 +122,7 @@
switch(type_to_use)
if("string")
accepting_refs = 0
- new_data = tgui_input_text(usr, "Now type in a string.","[src] string writing")
+ new_data = tgui_input_text(usr, "Now type in a string.","[src] string writing", null, MAX_MESSAGE_LEN)
new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
if(istext(new_data) && CanInteract(user, GLOB.tgui_physical_state))
data_to_write = new_data
diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm
index 332b7bb580c..914a20a70d2 100644
--- a/code/modules/integrated_electronics/subtypes/input.dm
+++ b/code/modules/integrated_electronics/subtypes/input.dm
@@ -72,7 +72,8 @@
power_draw_per_use = 4
/obj/item/integrated_circuit/input/textpad/ask_for_input(mob/user)
- var/new_input = tgui_input_text(user, "Enter some words, please.","Number pad", get_pin_data(IC_OUTPUT, 1))
+ var/new_input = tgui_input_text(user, "Enter some words, please.","Number pad", get_pin_data(IC_OUTPUT, 1),MAX_NAME_LEN)
+ new_input = sanitize(new_input,MAX_NAME_LEN)
if(istext(new_input) && CanInteract(user, GLOB.tgui_physical_state))
set_pin_data(IC_OUTPUT, 1, new_input)
push_data()
diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm
index 0148c01c05e..022eeb3da95 100644
--- a/code/modules/integrated_electronics/subtypes/memory.dm
+++ b/code/modules/integrated_electronics/subtypes/memory.dm
@@ -96,13 +96,14 @@
switch(type_to_use)
if("string")
accepting_refs = 0
- new_data = tgui_input_text(usr, "Now type in a string.","[src] string writing")
+ new_data = tgui_input_text(usr, "Now type in a string.","[src] string writing", MAX_NAME_LEN)
+ new_data = sanitize(new_data,MAX_NAME_LEN)
if(istext(new_data) && CanInteract(user, GLOB.tgui_physical_state))
O.data = new_data
to_chat(user, "You set \the [src]'s memory to [O.display_data(O.data)].")
if("number")
accepting_refs = 0
- new_data = tgui_input_number(usr, "Now type in a number.","[src] number writing")
+ new_data = tgui_input_number(usr, "Now type in a number.","[src] number writing", MAX_NAME_LEN)
if(isnum(new_data) && CanInteract(user, GLOB.tgui_physical_state))
O.data = new_data
to_chat(user, "You set \the [src]'s memory to [O.display_data(O.data)].")
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index fd2c9b5258d..0a774d72959 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -224,13 +224,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
else
var/response
if(src.client && src.client.holder)
- response = tgui_alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", list("Ghost", "Admin Ghost", "Stay in body"))
+ response = tgui_alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", list("Admin Ghost", "Ghost", "Stay in body"))
if(response == "Admin Ghost")
if(!src.client)
return
src.client.admin_ghost()
else
- response = tgui_alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", list("Ghost", "Stay in body")) // VOREStation edit because we don't make players stay dead for 30 minutes.
+ response = tgui_alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", list("Stay in body", "Ghost"))
if(response != "Ghost")
return
resting = 1
diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm
index f8d49b046ad..39ecfba3878 100644
--- a/code/modules/mob/living/carbon/human/human_powers.dm
+++ b/code/modules/mob/living/carbon/human/human_powers.dm
@@ -94,9 +94,9 @@
if(!target) return
- text = tgui_input_text(usr, "What would you like to say?", "Speak to creature", null, null)
+ text = tgui_input_text(usr, "What would you like to say?", "Speak to creature", null, MAX_MESSAGE_LEN)
- text = sanitize(text)
+ text = sanitize(text, MAX_MESSAGE_LEN)
if(!text) return
@@ -217,7 +217,7 @@
if(isSynthetic())
output += "Current Battery Charge: [nutrition]\n"
-
+
var/toxDam = getToxLoss()
if(toxDam)
output += "System Instability: [toxDam > 25 ? "Severe" : "Moderate"]. Seek charging station for cleanup.\n"
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
index 6900fd5afb6..7e3e1370af9 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
@@ -142,14 +142,14 @@
cause = "jittery"
//check to see if they go feral if they weren't before
- if(!feral)
+ if(!feral && !isbelly(H.loc))
// if stress is below 15, no chance of snapping. Also if they weren't feral before, they won't suddenly become feral unless they get MORE stressed
if((currentstress > laststress) && prob(clamp(currentstress-15, 0, 100)) )
go_feral(H, currentstress, cause)
feral = currentstress //update the local var
//they didn't go feral, give 'em a chance of hunger messages
- else if(H.nutrition <= 200 && prob(0.5) && !isbelly(H.loc))
+ else if(H.nutrition <= 200 && prob(0.5))
switch(H.nutrition)
if(150 to 200)
to_chat(H,"You feel rather hungry. It might be a good idea to find some some food...")
@@ -158,7 +158,8 @@
danger = TRUE
//now the check's done, update their brain so it remembers how stressed they were
- B.laststress = currentstress
+ if(B && !isbelly(H.loc)) //another sanity check for brain implant shenanigans, also no you don't get to hide in a belly and get your laststress set to a huge amount to skip rolls
+ B.laststress = currentstress
// Handle being feral
if(feral)
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm b/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm
index c3053586341..2972d33b184 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm
@@ -20,6 +20,7 @@
icon_dead = "pakkun-dead"
icon_living = "pakkun"
icon_state = "pakkun"
+ icon_rest = "pakkun-rest"
icon = 'icons/mob/vore.dmi'
faction = "pakkun"
@@ -46,8 +47,51 @@
projectilesound = 'sound/effects/slime_squish.ogg'
ai_holder_type = /datum/ai_holder/simple_mob/ranged/pakkun
+ vore_default_mode = DM_SELECT
var/extra_posessive = FALSE // Enable if you want their tummy hugs to be inescapable
+ var/autorest_cooldown = 100
+
+/mob/living/simple_mob/vore/pakkun/Life()
+ . = ..()
+ if(client)
+ return
+ if(!ai_holder)
+ return
+
+ if(autorest_cooldown)
+ autorest_cooldown --
+ else if(prob(5) && ai_holder.stance == STANCE_IDLE)
+ autorest_cooldown = rand(50,200)
+ lay_down()
+
+/mob/living/simple_mob/vore/pakkun/lay_down()
+ . = ..()
+ if(client)
+ return
+ if(!ai_holder)
+ return
+
+ if(resting)
+ vore_selected.digest_mode = DM_UNABSORB
+ ai_holder.go_sleep()
+
+ else
+ vore_selected.digest_mode = vore_default_mode
+ ai_holder.go_wake()
+
+/mob/living/simple_mob/vore/pakkun/attack_hand(mob/user)
+ if(stat == DEAD)
+ return ..()
+ if(user.a_intent != I_HELP)
+ return ..()
+ if(resting)
+ playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ user.visible_message("\The [user] shakes \the [src] awake.","You shake \the [src] awake!")
+ lay_down()
+ return
+ else
+ return ..()
/datum/ai_holder/simple_mob/ranged/pakkun
pointblank = TRUE
@@ -121,6 +165,7 @@
icon_dead = "snapdragon-dead"
icon_living = "snapdragon"
icon_state = "snapdragon"
+ icon_rest = "snapdragon-rest"
extra_posessive = TRUE //you're gonna get KEPT, at least the first time you go in
maxHealth = 100
@@ -138,8 +183,10 @@
icon_dead = "snappy-dead"
icon_living = "snappy"
icon_state = "snappy"
+ icon_rest = "snappy-rest"
ai_holder_type = /datum/ai_holder/simple_mob/ranged/pakkun/snappy
+ vore_default_mode = DM_HOLD
var/list/petters = list()
/datum/ai_holder/simple_mob/ranged/pakkun/snappy/list_targets()
@@ -172,4 +219,3 @@
most of her girth. Your movements are rewarded only with squeezing from outside, the skin of the reptile easily stretching out to match your movements no matter how hard you try to push. If anything, \
wriggling about just seems to prompt the playful creature to mess with you more, mooshing her paws into the bulges you make, wrapping both arms around you and squeezing you tight, making it absolutely \
plain that she's more than happy to just keep you in there - and is more than capable of doing so if she so chooses."
-
diff --git a/code/modules/mob/new_player/sprite_accessories_extra.dm b/code/modules/mob/new_player/sprite_accessories_extra.dm
index 555c8e460f3..e410bd2eb24 100644
--- a/code/modules/mob/new_player/sprite_accessories_extra.dm
+++ b/code/modules/mob/new_player/sprite_accessories_extra.dm
@@ -581,7 +581,7 @@ shadekin_snoot
name = "Belly Spiral"
icon_state = "bellyspiral"
color_blend_mode = ICON_MULTIPLY
- body_parts = list(BP_TORSO)
+ body_parts = list(BP_TORSO,BP_GROIN)
/datum/sprite_accessory/marking/vr/fluffy_cuffs
name = "Wrist Fluff"
diff --git a/code/modules/overmap/champagne.dm b/code/modules/overmap/champagne.dm
index 0d36766535b..593be7f2a6d 100644
--- a/code/modules/overmap/champagne.dm
+++ b/code/modules/overmap/champagne.dm
@@ -47,7 +47,7 @@
to_chat(user, "[comp] is already in a shuttle.")
return
// Count turfs in the area
- var/list/turfs = get_area_turfs(my_area)
+ var/list/turfs = get_current_area_turfs(my_area)
if(turfs.len > max_area_turfs)
to_chat(user, "The new shuttle area is too large.")
return
diff --git a/code/modules/overmap/ships/computers/helm.dm b/code/modules/overmap/ships/computers/helm.dm
index 64212fd3601..37c625dc895 100644
--- a/code/modules/overmap/ships/computers/helm.dm
+++ b/code/modules/overmap/ships/computers/helm.dm
@@ -157,7 +157,8 @@ GLOBAL_LIST_EMPTY(all_waypoints)
switch(action)
if("add")
var/datum/computer_file/data/waypoint/R = new()
- var/sec_name = tgui_input_text(usr, "Input navigation entry name", "New navigation entry", "Sector #[known_sectors.len]")
+ var/sec_name = tgui_input_text(usr, "Input navigation entry name", "New navigation entry", "Sector #[known_sectors.len]", MAX_NAME_LEN)
+ sec_name = sanitize(sec_name,MAX_NAME_LEN)
if(tgui_status(usr, state) != STATUS_INTERACTIVE)
return FALSE
if(!sec_name)
@@ -244,7 +245,7 @@ GLOBAL_LIST_EMPTY(all_waypoints)
else
autopilot = !autopilot
. = TRUE
-
+
if("apilot_lock")
autopilot_disabled = !autopilot_disabled
autopilot = FALSE
diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm
index e666ba6f578..2dffe3c228f 100644
--- a/code/modules/power/breaker_box.dm
+++ b/code/modules/power/breaker_box.dm
@@ -40,7 +40,7 @@
/obj/machinery/power/breakerbox/activated/Initialize()
. = ..()
return INITIALIZE_HINT_LATELOAD
-
+
/obj/machinery/power/breakerbox/activated/LateInitialize()
set_state(1)
@@ -96,7 +96,8 @@
/obj/machinery/power/breakerbox/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if(istype(W, /obj/item/device/multitool))
- var/newtag = tgui_input_text(user, "Enter new RCON tag. Use \"NO_TAG\" to disable RCON or leave empty to cancel.", "SMES RCON system")
+ var/newtag = tgui_input_text(user, "Enter new RCON tag. Use \"NO_TAG\" to disable RCON or leave empty to cancel.", "SMES RCON system", "", MAX_NAME_LEN)
+ newtag = sanitize(newtag,MAX_NAME_LEN)
if(newtag)
RCon_tag = newtag
to_chat(user, "You changed the RCON tag to: [newtag]")
diff --git a/code/modules/power/fusion/core/_core.dm b/code/modules/power/fusion/core/_core.dm
index 308c9307839..dfcf908107a 100644
--- a/code/modules/power/fusion/core/_core.dm
+++ b/code/modules/power/fusion/core/_core.dm
@@ -149,7 +149,8 @@ GLOBAL_LIST_EMPTY(fusion_cores)
return
if(istype(W, /obj/item/device/multitool))
- var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", "Fusion Core", id_tag)
+ var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", "Fusion Core", id_tag, MAX_NAME_LEN)
+ new_ident = sanitize(new_ident,MAX_NAME_LEN)
if(new_ident && user.Adjacent(src))
id_tag = new_ident
return
diff --git a/code/modules/power/fusion/fuel_assembly/fuel_control.dm b/code/modules/power/fusion/fuel_assembly/fuel_control.dm
index 24394b79733..621847f79b6 100644
--- a/code/modules/power/fusion/fuel_assembly/fuel_control.dm
+++ b/code/modules/power/fusion/fuel_assembly/fuel_control.dm
@@ -117,7 +117,8 @@
/obj/machinery/computer/fusion_fuel_control/attackby(var/obj/item/W, var/mob/user)
..()
if(istype(W, /obj/item/device/multitool))
- var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", "Fuel Control", monitor.fuel_tag)
+ var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", "Fuel Control", monitor.fuel_tag, MAX_NAME_LEN)
+ new_ident = sanitize(new_ident,MAX_NAME_LEN)
if(new_ident && user.Adjacent(src))
monitor.fuel_tag = new_ident
return
diff --git a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm
index 77b703e85e7..08c413cd021 100644
--- a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm
+++ b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm
@@ -43,7 +43,8 @@ GLOBAL_LIST_EMPTY(fuel_injectors)
/obj/machinery/fusion_fuel_injector/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/device/multitool))
- var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", "Fuel Injector", id_tag)
+ var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", "Fuel Injector", id_tag, MAX_NAME_LEN)
+ new_ident = sanitize(new_ident,MAX_NAME_LEN)
if(new_ident && user.Adjacent(src))
id_tag = new_ident
return
diff --git a/code/modules/power/fusion/gyrotron/gyrotron.dm b/code/modules/power/fusion/gyrotron/gyrotron.dm
index b2b33ef96bd..b84d04871e4 100644
--- a/code/modules/power/fusion/gyrotron/gyrotron.dm
+++ b/code/modules/power/fusion/gyrotron/gyrotron.dm
@@ -53,7 +53,8 @@ GLOBAL_LIST_EMPTY(gyrotrons)
/obj/machinery/power/emitter/gyrotron/attackby(var/obj/item/W, var/mob/user)
if(istype(W, /obj/item/device/multitool))
- var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", "Gyrotron", id_tag)
+ var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", "Gyrotron", id_tag, MAX_NAME_LEN)
+ new_ident = sanitize(new_ident,MAX_NAME_LEN)
if(new_ident && user.Adjacent(src))
id_tag = new_ident
return
diff --git a/code/modules/power/fusion/gyrotron/gyrotron_control.dm b/code/modules/power/fusion/gyrotron/gyrotron_control.dm
index 9ff359fd290..1979e091ad8 100644
--- a/code/modules/power/fusion/gyrotron/gyrotron_control.dm
+++ b/code/modules/power/fusion/gyrotron/gyrotron_control.dm
@@ -119,7 +119,8 @@
/obj/machinery/computer/gyrotron_control/attackby(var/obj/item/W, var/mob/user)
..()
if(istype(W, /obj/item/device/multitool))
- var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", "Gyrotron Control", monitor.gyro_tag)
+ var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", "Gyrotron Control", monitor.gyro_tag, MAX_NAME_LEN)
+ new_ident = sanitize(new_ident,MAX_NAME_LEN)
if(new_ident && user.Adjacent(src))
monitor.gyro_tag = new_ident
return
diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm
index 381f6b09f69..15c2f61f0da 100644
--- a/code/modules/power/smes_construction.dm
+++ b/code/modules/power/smes_construction.dm
@@ -312,7 +312,8 @@
// Multitool - change RCON tag
if(istype(W, /obj/item/device/multitool))
- var/newtag = tgui_input_text(user, "Enter new RCON tag. Use \"NO_TAG\" to disable RCON or leave empty to cancel.", "SMES RCON system")
+ var/newtag = tgui_input_text(user, "Enter new RCON tag. Use \"NO_TAG\" to disable RCON or leave empty to cancel.", "SMES RCON system", "", MAX_NAME_LEN)
+ newtag = sanitize(newtag,MAX_NAME_LEN)
if(newtag)
RCon_tag = newtag
to_chat(user, "You changed the RCON tag to: [newtag]")
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index 77a5659cdda..9f542db4cc7 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -124,7 +124,8 @@
if(default_deconstruction_crowbar(user, W))
return
if(istype(W, /obj/item/device/multitool))
- var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", name, comp_id)
+ var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", name, comp_id, MAX_NAME_LEN)
+ new_ident = sanitize(new_ident,MAX_NAME_LEN)
if(new_ident && user.Adjacent(src))
comp_id = new_ident
return
@@ -337,7 +338,8 @@
/obj/machinery/computer/turbine_computer/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/device/multitool))
- var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", name, id)
+ var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", name, id, MAX_NAME_LEN)
+ new_ident = sanitize(new_ident,MAX_NAME_LEN)
if(new_ident && user.Adjacent(src))
id = new_ident
return
diff --git a/code/modules/random_map/noise/ore.dm b/code/modules/random_map/noise/ore.dm
index 8a0b014303b..1ad91538668 100644
--- a/code/modules/random_map/noise/ore.dm
+++ b/code/modules/random_map/noise/ore.dm
@@ -76,10 +76,10 @@
T.resources["silver"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
T.resources["uranium"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
T.resources["phoron"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
- T.resources["osmium"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
+ T.resources["platinum"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
T.resources["verdantium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
T.resources["lead"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX)
- T.resources["hydrogen"] = 0
+ T.resources["mhydrogen"] = 0
T.resources["diamond"] = 0
T.resources["hematite"] = 0
T.resources["marble"] = 0
@@ -95,8 +95,8 @@
T.resources["diamond"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
T.resources["verdantium"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX)
T.resources["phoron"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX)
- T.resources["osmium"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX)
- T.resources["hydrogen"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
+ T.resources["platinum"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX)
+ T.resources["mhydrogen"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
T.resources["marble"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX)
T.resources["lead"] = rand(RESOURCE_LOW_MIN, RESOURCE_HIGH_MAX)
T.resources["hematite"] = 0
@@ -117,4 +117,4 @@
else if(value < deep_val)
return "R"
else
- return "D"
\ No newline at end of file
+ return "D"
diff --git a/code/modules/reagents/reagents/drugs.dm b/code/modules/reagents/reagents/drugs.dm
index 3dba29d6f73..28a42a5b48f 100644
--- a/code/modules/reagents/reagents/drugs.dm
+++ b/code/modules/reagents/reagents/drugs.dm
@@ -143,6 +143,7 @@
M.druggy = max(M.druggy, 30)
+ var/drug_strength = 20
var/effective_dose = dose
if(issmall(M)) effective_dose *= 2
if(effective_dose < 1 * threshold)
@@ -156,6 +157,7 @@
M.make_jittery(5)
M.make_dizzy(5)
M.druggy = max(M.druggy, 35)
+ M.hallucination = max(M.hallucination, drug_strength * threshold)
if(prob(5) && prob_proc == TRUE)
M.emote(pick("twitch", "giggle"))
prob_proc = FALSE
@@ -164,6 +166,7 @@
M.make_jittery(10)
M.make_dizzy(10)
M.druggy = max(M.druggy, 40)
+ M.hallucination = max(M.hallucination, drug_strength * threshold)
if(prob(10) && prob_proc == TRUE)
M.emote(pick("twitch", "giggle"))
prob_proc = FALSE
diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm
index ce64593b9da..f3731ba2eb3 100644
--- a/code/modules/shuttles/shuttle_console.dm
+++ b/code/modules/shuttles/shuttle_console.dm
@@ -111,7 +111,8 @@
return TRUE
if("set_codes")
- var/newcode = tgui_input_text(usr, "Input new docking codes", "Docking codes", shuttle.docking_codes)
+ var/newcode = tgui_input_text(usr, "Input new docking codes", "Docking codes", shuttle.docking_codes, MAX_NAME_LEN)
+ newcode = sanitize(newcode,MAX_NAME_LEN)
if(newcode && !..())
shuttle.set_docking_codes(uppertext(newcode))
return TRUE
diff --git a/code/modules/tgui/modules/overmap.dm b/code/modules/tgui/modules/overmap.dm
index a9fff0e6d40..13d80d9f93a 100644
--- a/code/modules/tgui/modules/overmap.dm
+++ b/code/modules/tgui/modules/overmap.dm
@@ -307,7 +307,8 @@
/* HELM */
if("add")
var/datum/computer_file/data/waypoint/R = new()
- var/sec_name = tgui_input_text(usr, "Input navigation entry name", "New navigation entry", "Sector #[known_sectors.len]")
+ var/sec_name = tgui_input_text(usr, "Input navigation entry name", "New navigation entry", "Sector #[known_sectors.len]", MAX_NAME_LEN)
+ sec_name = sanitize(sec_name,MAX_NAME_LEN)
if(!sec_name)
sec_name = "Sector #[known_sectors.len]"
R.fields["name"] = sec_name
@@ -383,7 +384,7 @@
else
autopilot = !autopilot
. = TRUE
-
+
if("apilot_lock")
autopilot_disabled = !autopilot_disabled
autopilot = FALSE
diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm
index 9e8851bdfb0..1979fc925c2 100644
--- a/code/modules/vore/eating/digest_act_vr.dm
+++ b/code/modules/vore/eating/digest_act_vr.dm
@@ -82,7 +82,7 @@
return FALSE
/obj/item/weapon/pinpointer/digest_act(var/atom/movable/item_storage = null)
return FALSE
-/obj/item/blueprints/digest_act(var/atom/movable/item_storage = null)
+/obj/item/areaeditor/blueprints/digest_act(var/atom/movable/item_storage = null)
return FALSE
/obj/item/weapon/disk/nuclear/digest_act(var/atom/movable/item_storage = null)
return FALSE
diff --git a/code/modules/xenoarcheaology/effects/vampire.dm b/code/modules/xenoarcheaology/effects/vampire.dm
index 7c6ed91a5f4..29cabc5b2a3 100644
--- a/code/modules/xenoarcheaology/effects/vampire.dm
+++ b/code/modules/xenoarcheaology/effects/vampire.dm
@@ -24,7 +24,7 @@
var/obj/effect/decal/cleanable/blood/splatter/animated/B = new(M.loc)
B.basecolor = M.species.get_blood_colour(M)
B.color = M.species.get_blood_colour(M)
- B.target_turf = pick(range(1, get_turf(holder)))
+ B.target_turf = pick(RANGE_TURFS(1, holder))
B.blood_DNA = list()
B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
M.vessel.remove_reagent("blood",rand(10,30))
diff --git a/code/modules/xenoarcheaology/finds/special.dm b/code/modules/xenoarcheaology/finds/special.dm
index f2dcfc5183e..e7c66148d54 100644
--- a/code/modules/xenoarcheaology/finds/special.dm
+++ b/code/modules/xenoarcheaology/finds/special.dm
@@ -82,13 +82,13 @@
//use up stored charges
if(charges >= 10)
charges -= 10
- new /obj/effect/spider/eggcluster(pick(view(1,src)))
+ new /obj/effect/spider/eggcluster(pick(RANGE_TURFS(1,src)))
if(charges >= 3)
if(prob(5))
charges -= 1
var/spawn_type = pick(/mob/living/simple_mob/creature)
- new spawn_type(pick(view(1,src)))
+ new spawn_type(pick(RANGE_TURFS(1,src)))
playsound(src, pick('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg'), 50, 1, -3)
if(charges >= 1)
diff --git a/html/changelogs/cameron - drugfix.yml b/html/changelogs/cameron - drugfix.yml
new file mode 100644
index 00000000000..bd7f032f5d0
--- /dev/null
+++ b/html/changelogs/cameron - drugfix.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Cameron
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "psilocybin now makes you hallucinate."
diff --git a/icons/mob/human_races/markings_alt.dmi b/icons/mob/human_races/markings_alt.dmi
index b041524bd1b..5543599989f 100644
Binary files a/icons/mob/human_races/markings_alt.dmi and b/icons/mob/human_races/markings_alt.dmi differ
diff --git a/maps/expedition_vr/aerostat/_aerostat.dm b/maps/expedition_vr/aerostat/_aerostat.dm
index f2404f2f7e2..629e995f958 100644
--- a/maps/expedition_vr/aerostat/_aerostat.dm
+++ b/maps/expedition_vr/aerostat/_aerostat.dm
@@ -76,10 +76,10 @@
T.resources["silver"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
T.resources["uranium"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
T.resources["phoron"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
- T.resources["osmium"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
+ T.resources["platinum"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
T.resources["verdantium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
T.resources["lead"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX)
- T.resources["hydrogen"] = 0
+ T.resources["mhydrogen"] = 0
T.resources["diamond"] = 0
T.resources["hematite"] = 0
T.resources["marble"] = 0
@@ -95,8 +95,8 @@
T.resources["diamond"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
T.resources["verdantium"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX)
T.resources["phoron"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX)
- T.resources["osmium"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX)
- T.resources["hydrogen"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
+ T.resources["platinum"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX)
+ T.resources["mhydrogen"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
T.resources["marble"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX)
T.resources["lead"] = rand(RESOURCE_LOW_MIN, RESOURCE_HIGH_MAX)
T.resources["hematite"] = 0
diff --git a/tgui/packages/tgui/interfaces/RapidPipeDispenser.js b/tgui/packages/tgui/interfaces/RapidPipeDispenser.js
index a4f4086ae20..2f2578ebc8e 100644
--- a/tgui/packages/tgui/interfaces/RapidPipeDispenser.js
+++ b/tgui/packages/tgui/interfaces/RapidPipeDispenser.js
@@ -101,20 +101,20 @@ const SelectionSection = (props, context) => {
const LayerSection = (props, context) => {
const { act, data } = useBackend(context);
- const { category: rootCategoryIndex, piping_layer } = data;
+ const { category: rootCategoryIndex, piping_layer, pipe_layers } = data;
const previews = data.preview_rows.flatMap((row) => row.previews);
return (
{rootCategoryIndex === 0 && (
- {[1, 2, 3, 4, 5].map((layer) => (
+ {Object.keys(pipe_layers).map((layer) => (
act('piping_layer', {
- piping_layer: layer,
+ piping_layer: pipe_layers[layer],
})
}
/>
diff --git a/tgui/public/tgui.bundle.js b/tgui/public/tgui.bundle.js
index 257cb3c320f..f1148154309 100644
--- a/tgui/public/tgui.bundle.js
+++ b/tgui/public/tgui.bundle.js
@@ -1 +1 @@
-!function(){var e={21926:function(e,t,n){"use strict";t.__esModule=!0,t.createPopper=void 0,t.popperGenerator=h;var o=m(n(48764)),r=m(n(68349)),a=m(n(3671)),i=m(n(55490)),c=(m(n(40755)),m(n(69282))),l=m(n(27672)),d=(m(n(30752)),m(n(12459)),m(n(27629)),m(n(54220))),s=m(n(75949));t.detectOverflow=s["default"];var u=n(79388);n(15954);function m(e){return e&&e.__esModule?e:{"default":e}}var p={placement:"bottom",modifiers:[],strategy:"absolute"};function f(){for(var e=arguments.length,t=new Array(e),n=0;n0&&(a=(0,r.round)(n.width)/l||1),c>0&&(i=(0,r.round)(n.height)/c||1)}return{width:n.width/a,height:n.height/i,top:n.top/i,right:n.right/a,bottom:n.bottom/i,left:n.left/a,x:n.left/a,y:n.top/i}};var o=n(79388),r=n(36291)},65647:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t,n){var o="clippingParents"===t?function(e){var t=(0,i["default"])((0,m["default"])(e)),n=["absolute","fixed"].indexOf((0,d["default"])(e).position)>=0&&(0,s.isHTMLElement)(e)?(0,c["default"])(e):e;if(!(0,s.isElement)(n))return[];return t.filter((function(e){return(0,s.isElement)(e)&&(0,p["default"])(e,n)&&"body"!==(0,f["default"])(e)}))}(e):[].concat(t),r=[].concat(o,[n]),a=r[0],l=r.reduce((function(t,n){var o=N(e,n);return t.top=(0,C.max)(o.top,t.top),t.right=(0,C.min)(o.right,t.right),t.bottom=(0,C.min)(o.bottom,t.bottom),t.left=(0,C.max)(o.left,t.left),t}),N(e,a));return l.width=l.right-l.left,l.height=l.bottom-l.top,l.x=l.left,l.y=l.top,l};var o=n(15954),r=b(n(8204)),a=b(n(40015)),i=b(n(3671)),c=b(n(55490)),l=b(n(25890)),d=b(n(40755)),s=n(79388),u=b(n(11100)),m=b(n(95136)),p=b(n(62215)),f=b(n(38569)),h=b(n(73060)),C=n(36291);function b(e){return e&&e.__esModule?e:{"default":e}}function N(e,t){return t===o.viewport?(0,h["default"])((0,r["default"])(e)):(0,s.isElement)(t)?function(e){var t=(0,u["default"])(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}(t):(0,h["default"])((0,a["default"])((0,l["default"])(e)))}},48764:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t,n){void 0===n&&(n=!1);var u=(0,i.isHTMLElement)(t),m=(0,i.isHTMLElement)(t)&&function(e){var t=e.getBoundingClientRect(),n=(0,s.round)(t.width)/e.offsetWidth||1,o=(0,s.round)(t.height)/e.offsetHeight||1;return 1!==n||1!==o}(t),p=(0,l["default"])(t),f=(0,o["default"])(e,m),h={scrollLeft:0,scrollTop:0},C={x:0,y:0};(u||!u&&!n)&&(("body"!==(0,a["default"])(t)||(0,d["default"])(p))&&(h=(0,r["default"])(t)),(0,i.isHTMLElement)(t)?((C=(0,o["default"])(t,!0)).x+=t.clientLeft,C.y+=t.clientTop):p&&(C.x=(0,c["default"])(p)));return{x:f.left+h.scrollLeft-C.x,y:f.top+h.scrollTop-C.y,width:f.width,height:f.height}};var o=u(n(11100)),r=u(n(3514)),a=u(n(38569)),i=n(79388),c=u(n(36056)),l=u(n(25890)),d=u(n(57360)),s=n(36291);function u(e){return e&&e.__esModule?e:{"default":e}}},40755:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(0,r["default"])(e).getComputedStyle(e)};var o,r=(o=n(96904))&&o.__esModule?o:{"default":o}},25890:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(((0,o.isElement)(e)?e.ownerDocument:e.document)||window.document).documentElement};var o=n(79388)},40015:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t,n=(0,o["default"])(e),l=(0,i["default"])(e),d=null==(t=e.ownerDocument)?void 0:t.body,s=(0,c.max)(n.scrollWidth,n.clientWidth,d?d.scrollWidth:0,d?d.clientWidth:0),u=(0,c.max)(n.scrollHeight,n.clientHeight,d?d.scrollHeight:0,d?d.clientHeight:0),m=-l.scrollLeft+(0,a["default"])(e),p=-l.scrollTop;"rtl"===(0,r["default"])(d||n).direction&&(m+=(0,c.max)(n.clientWidth,d?d.clientWidth:0)-s);return{width:s,height:u,x:m,y:p}};var o=l(n(25890)),r=l(n(40755)),a=l(n(36056)),i=l(n(69211)),c=n(36291);function l(e){return e&&e.__esModule?e:{"default":e}}},41829:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}},68349:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,r["default"])(e),n=e.offsetWidth,o=e.offsetHeight;Math.abs(t.width-n)<=1&&(n=t.width);Math.abs(t.height-o)<=1&&(o=t.height);return{x:e.offsetLeft,y:e.offsetTop,width:n,height:o}};var o,r=(o=n(11100))&&o.__esModule?o:{"default":o}},38569:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e?(e.nodeName||"").toLowerCase():null}},3514:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return e!==(0,r["default"])(e)&&(0,a.isHTMLElement)(e)?(0,i["default"])(e):(0,o["default"])(e)};var o=c(n(69211)),r=c(n(96904)),a=n(79388),i=c(n(41829));function c(e){return e&&e.__esModule?e:{"default":e}}},55490:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,o["default"])(e),n=s(e);for(;n&&(0,c["default"])(n)&&"static"===(0,a["default"])(n).position;)n=s(n);if(n&&("html"===(0,r["default"])(n)||"body"===(0,r["default"])(n)&&"static"===(0,a["default"])(n).position))return t;return n||function(e){var t=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&(0,i.isHTMLElement)(e)){if("fixed"===(0,a["default"])(e).position)return null}var n=(0,l["default"])(e);(0,i.isShadowRoot)(n)&&(n=n.host);for(;(0,i.isHTMLElement)(n)&&["html","body"].indexOf((0,r["default"])(n))<0;){var o=(0,a["default"])(n);if("none"!==o.transform||"none"!==o.perspective||"paint"===o.contain||-1!==["transform","perspective"].indexOf(o.willChange)||t&&"filter"===o.willChange||t&&o.filter&&"none"!==o.filter)return n;n=n.parentNode}return null}(e)||t};var o=d(n(96904)),r=d(n(38569)),a=d(n(40755)),i=n(79388),c=d(n(94437)),l=d(n(95136));function d(e){return e&&e.__esModule?e:{"default":e}}function s(e){return(0,i.isHTMLElement)(e)&&"fixed"!==(0,a["default"])(e).position?e.offsetParent:null}},95136:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){if("html"===(0,o["default"])(e))return e;return e.assignedSlot||e.parentNode||((0,a.isShadowRoot)(e)?e.host:null)||(0,r["default"])(e)};var o=i(n(38569)),r=i(n(25890)),a=n(79388);function i(e){return e&&e.__esModule?e:{"default":e}}},43367:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function l(e){if(["html","body","#document"].indexOf((0,a["default"])(e))>=0)return e.ownerDocument.body;if((0,i.isHTMLElement)(e)&&(0,r["default"])(e))return e;return l((0,o["default"])(e))};var o=c(n(95136)),r=c(n(57360)),a=c(n(38569)),i=n(79388);function c(e){return e&&e.__esModule?e:{"default":e}}},8204:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,o["default"])(e),n=(0,r["default"])(e),i=t.visualViewport,c=n.clientWidth,l=n.clientHeight,d=0,s=0;i&&(c=i.width,l=i.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(d=i.offsetLeft,s=i.offsetTop));return{width:c,height:l,x:d+(0,a["default"])(e),y:s}};var o=i(n(96904)),r=i(n(25890)),a=i(n(36056));function i(e){return e&&e.__esModule?e:{"default":e}}},96904:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}},69211:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,r["default"])(e),n=t.pageXOffset,o=t.pageYOffset;return{scrollLeft:n,scrollTop:o}};var o,r=(o=n(96904))&&o.__esModule?o:{"default":o}},36056:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(0,o["default"])((0,r["default"])(e)).left+(0,a["default"])(e).scrollLeft};var o=i(n(11100)),r=i(n(25890)),a=i(n(69211));function i(e){return e&&e.__esModule?e:{"default":e}}},79388:function(e,t,n){"use strict";t.__esModule=!0,t.isElement=function(e){var t=(0,r["default"])(e).Element;return e instanceof t||e instanceof Element},t.isHTMLElement=function(e){var t=(0,r["default"])(e).HTMLElement;return e instanceof t||e instanceof HTMLElement},t.isShadowRoot=function(e){if("undefined"==typeof ShadowRoot)return!1;var t=(0,r["default"])(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot};var o,r=(o=n(96904))&&o.__esModule?o:{"default":o}},57360:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,r["default"])(e),n=t.overflow,o=t.overflowX,a=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+a+o)};var o,r=(o=n(40755))&&o.__esModule?o:{"default":o}},94437:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return["table","td","th"].indexOf((0,r["default"])(e))>=0};var o,r=(o=n(38569))&&o.__esModule?o:{"default":o}},3671:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function l(e,t){var n;void 0===t&&(t=[]);var c=(0,o["default"])(e),d=c===(null==(n=e.ownerDocument)?void 0:n.body),s=(0,a["default"])(c),u=d?[s].concat(s.visualViewport||[],(0,i["default"])(c)?c:[]):c,m=t.concat(u);return d?m:m.concat(l((0,r["default"])(u)))};var o=c(n(43367)),r=c(n(95136)),a=c(n(96904)),i=c(n(57360));function c(e){return e&&e.__esModule?e:{"default":e}}},15954:function(e,t){"use strict";t.__esModule=!0,t.write=t.viewport=t.variationPlacements=t.top=t.start=t.right=t.reference=t.read=t.popper=t.placements=t.modifierPhases=t.main=t.left=t.end=t.clippingParents=t.bottom=t.beforeWrite=t.beforeRead=t.beforeMain=t.basePlacements=t.auto=t.afterWrite=t.afterRead=t.afterMain=void 0;t.top="top";var n="bottom";t.bottom=n;var o="right";t.right=o;var r="left";t.left=r;var a="auto";t.auto=a;var i=["top",n,o,r];t.basePlacements=i;var c="start";t.start=c;var l="end";t.end=l;t.clippingParents="clippingParents";t.viewport="viewport";t.popper="popper";t.reference="reference";var d=i.reduce((function(e,t){return e.concat([t+"-"+c,t+"-"+l])}),[]);t.variationPlacements=d;var s=[].concat(i,[a]).reduce((function(e,t){return e.concat([t,t+"-"+c,t+"-"+l])}),[]);t.placements=s;var u="beforeRead";t.beforeRead=u;var m="read";t.read=m;var p="afterRead";t.afterRead=p;var f="beforeMain";t.beforeMain=f;var h="main";t.main=h;var C="afterMain";t.afterMain=C;var b="beforeWrite";t.beforeWrite=b;var N="write";t.write=N;var g="afterWrite";t.afterWrite=g;var V=[u,m,p,f,h,C,b,N,g];t.modifierPhases=V},37809:function(e,t,n){"use strict";t.__esModule=!0;var o={popperGenerator:!0,detectOverflow:!0,createPopperBase:!0,createPopper:!0,createPopperLite:!0};t.popperGenerator=t.detectOverflow=t.createPopperLite=t.createPopperBase=t.createPopper=void 0;var r=n(15954);Object.keys(r).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===r[e]||(t[e]=r[e]))}));var a=n(4207);Object.keys(a).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===a[e]||(t[e]=a[e]))}));var i=n(21926);t.popperGenerator=i.popperGenerator,t.detectOverflow=i.detectOverflow,t.createPopperBase=i.createPopper;var c=n(17827);t.createPopper=c.createPopper;var l=n(47952);t.createPopperLite=l.createPopper},89290:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o,r=(o=n(38569))&&o.__esModule?o:{"default":o},a=n(79388);var i={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},o=t.attributes[e]||{},i=t.elements[e];(0,a.isHTMLElement)(i)&&(0,r["default"])(i)&&(Object.assign(i.style,n),Object.keys(o).forEach((function(e){var t=o[e];!1===t?i.removeAttribute(e):i.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var o=t.elements[e],i=t.attributes[e]||{},c=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});(0,a.isHTMLElement)(o)&&(0,r["default"])(o)&&(Object.assign(o.style,c),Object.keys(i).forEach((function(e){o.removeAttribute(e)})))}))}},requires:["computeStyles"]};t["default"]=i},71313:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=m(n(27629)),r=m(n(68349)),a=m(n(62215)),i=m(n(55490)),c=m(n(78772)),l=n(54444),d=m(n(11277)),s=m(n(45674)),u=n(15954);n(79388);function m(e){return e&&e.__esModule?e:{"default":e}}var p=function(e,t){return e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e,(0,d["default"])("number"!=typeof e?e:(0,s["default"])(e,u.basePlacements))};var f={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,a=e.name,d=e.options,s=n.elements.arrow,m=n.modifiersData.popperOffsets,f=(0,o["default"])(n.placement),h=(0,c["default"])(f),C=[u.left,u.right].indexOf(f)>=0?"height":"width";if(s&&m){var b=p(d.padding,n),N=(0,r["default"])(s),g="y"===h?u.top:u.left,V="y"===h?u.bottom:u.right,v=n.rects.reference[C]+n.rects.reference[h]-m[h]-n.rects.popper[C],_=m[h]-n.rects.reference[h],y=(0,i["default"])(s),k=y?"y"===h?y.clientHeight||0:y.clientWidth||0:0,x=v/2-_/2,w=b[g],B=k-N[C]-b[V],L=k/2-N[C]/2+x,S=(0,l.within)(w,L,B),I=h;n.modifiersData[a]=((t={})[I]=S,t.centerOffset=S-L,t)}},effect:function(e){var t=e.state,n=e.options.element,o=void 0===n?"[data-popper-arrow]":n;null!=o&&("string"!=typeof o||(o=t.elements.popper.querySelector(o)))&&(0,a["default"])(t.elements.popper,o)&&(t.elements.arrow=o)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};t["default"]=f},54680:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0,t.mapToStyles=p;var o=n(15954),r=u(n(55490)),a=u(n(96904)),i=u(n(25890)),c=u(n(40755)),l=u(n(27629)),d=u(n(31686)),s=n(36291);function u(e){return e&&e.__esModule?e:{"default":e}}var m={top:"auto",right:"auto",bottom:"auto",left:"auto"};function p(e){var t,n=e.popper,l=e.popperRect,d=e.placement,u=e.variation,p=e.offsets,f=e.position,h=e.gpuAcceleration,C=e.adaptive,b=e.roundOffsets,N=e.isFixed,g=p.x,V=void 0===g?0:g,v=p.y,_=void 0===v?0:v,y="function"==typeof b?b({x:V,y:_}):{x:V,y:_};V=y.x,_=y.y;var k=p.hasOwnProperty("x"),x=p.hasOwnProperty("y"),w=o.left,B=o.top,L=window;if(C){var S=(0,r["default"])(n),I="clientHeight",T="clientWidth";if(S===(0,a["default"])(n)&&(S=(0,i["default"])(n),"static"!==(0,c["default"])(S).position&&"absolute"===f&&(I="scrollHeight",T="scrollWidth")),d===o.top||(d===o.left||d===o.right)&&u===o.end)B=o.bottom,_-=(N&&S===L&&L.visualViewport?L.visualViewport.height:S[I])-l.height,_*=h?1:-1;if(d===o.left||(d===o.top||d===o.bottom)&&u===o.end)w=o.right,V-=(N&&S===L&&L.visualViewport?L.visualViewport.width:S[T])-l.width,V*=h?1:-1}var A,M=Object.assign({position:f},C&&m),E=!0===b?function(e){var t=e.x,n=e.y,o=window.devicePixelRatio||1;return{x:(0,s.round)(t*o)/o||0,y:(0,s.round)(n*o)/o||0}}({x:V,y:_}):{x:V,y:_};return V=E.x,_=E.y,h?Object.assign({},M,((A={})[B]=x?"0":"",A[w]=k?"0":"",A.transform=(L.devicePixelRatio||1)<=1?"translate("+V+"px, "+_+"px)":"translate3d("+V+"px, "+_+"px, 0)",A)):Object.assign({},M,((t={})[B]=x?_+"px":"",t[w]=k?V+"px":"",t.transform="",t))}var f={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,o=n.gpuAcceleration,r=void 0===o||o,a=n.adaptive,i=void 0===a||a,c=n.roundOffsets,s=void 0===c||c,u={placement:(0,l["default"])(t.placement),variation:(0,d["default"])(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:r,isFixed:"fixed"===t.options.strategy};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,p(Object.assign({},u,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:i,roundOffsets:s})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,p(Object.assign({},u,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:s})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}};t["default"]=f},53887:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o,r=(o=n(96904))&&o.__esModule?o:{"default":o};var a={passive:!0};var i={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,n=e.instance,o=e.options,i=o.scroll,c=void 0===i||i,l=o.resize,d=void 0===l||l,s=(0,r["default"])(t.elements.popper),u=[].concat(t.scrollParents.reference,t.scrollParents.popper);return c&&u.forEach((function(e){e.addEventListener("scroll",n.update,a)})),d&&s.addEventListener("resize",n.update,a),function(){c&&u.forEach((function(e){e.removeEventListener("scroll",n.update,a)})),d&&s.removeEventListener("resize",n.update,a)}},data:{}};t["default"]=i},82566:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=s(n(31477)),r=s(n(27629)),a=s(n(44214)),i=s(n(75949)),c=s(n(2894)),l=n(15954),d=s(n(31686));function s(e){return e&&e.__esModule?e:{"default":e}}var u={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,s=e.name;if(!t.modifiersData[s]._skip){for(var u=n.mainAxis,m=void 0===u||u,p=n.altAxis,f=void 0===p||p,h=n.fallbackPlacements,C=n.padding,b=n.boundary,N=n.rootBoundary,g=n.altBoundary,V=n.flipVariations,v=void 0===V||V,_=n.allowedAutoPlacements,y=t.options.placement,k=(0,r["default"])(y),x=h||(k===y||!v?[(0,o["default"])(y)]:function(e){if((0,r["default"])(e)===l.auto)return[];var t=(0,o["default"])(e);return[(0,a["default"])(e),t,(0,a["default"])(t)]}(y)),w=[y].concat(x).reduce((function(e,n){return e.concat((0,r["default"])(n)===l.auto?(0,c["default"])(t,{placement:n,boundary:b,rootBoundary:N,padding:C,flipVariations:v,allowedAutoPlacements:_}):n)}),[]),B=t.rects.reference,L=t.rects.popper,S=new Map,I=!0,T=w[0],A=0;A=0,D=O?"width":"height",F=(0,i["default"])(t,{placement:M,boundary:b,rootBoundary:N,altBoundary:g,padding:C}),R=O?P?l.right:l.left:P?l.bottom:l.top;B[D]>L[D]&&(R=(0,o["default"])(R));var j=(0,o["default"])(R),W=[];if(m&&W.push(F[E]<=0),f&&W.push(F[R]<=0,F[j]<=0),W.every((function(e){return e}))){T=M,I=!1;break}S.set(M,W)}if(I)for(var z=function(e){var t=w.find((function(t){var n=S.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return T=t,"break"},U=v?3:1;U>0;U--){if("break"===z(U))break}t.placement!==T&&(t.modifiersData[s]._skip=!0,t.placement=T,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};t["default"]=u},27353:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o,r=n(15954),a=(o=n(75949))&&o.__esModule?o:{"default":o};function i(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function c(e){return[r.top,r.right,r.bottom,r.left].some((function(t){return e[t]>=0}))}var l={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,o=t.rects.reference,r=t.rects.popper,l=t.modifiersData.preventOverflow,d=(0,a["default"])(t,{elementContext:"reference"}),s=(0,a["default"])(t,{altBoundary:!0}),u=i(d,o),m=i(s,r,l),p=c(u),f=c(m);t.modifiersData[n]={referenceClippingOffsets:u,popperEscapeOffsets:m,isReferenceHidden:p,hasPopperEscaped:f},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":f})}};t["default"]=l},4207:function(e,t,n){"use strict";t.__esModule=!0,t.preventOverflow=t.popperOffsets=t.offset=t.hide=t.flip=t.eventListeners=t.computeStyles=t.arrow=t.applyStyles=void 0;var o=m(n(89290));t.applyStyles=o["default"];var r=m(n(71313));t.arrow=r["default"];var a=m(n(54680));t.computeStyles=a["default"];var i=m(n(53887));t.eventListeners=i["default"];var c=m(n(82566));t.flip=c["default"];var l=m(n(27353));t.hide=l["default"];var d=m(n(99873));t.offset=d["default"];var s=m(n(83662));t.popperOffsets=s["default"];var u=m(n(21031));function m(e){return e&&e.__esModule?e:{"default":e}}t.preventOverflow=u["default"]},99873:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0,t.distanceAndSkiddingToXY=i;var o,r=(o=n(27629))&&o.__esModule?o:{"default":o},a=n(15954);function i(e,t,n){var o=(0,r["default"])(e),i=[a.left,a.top].indexOf(o)>=0?-1:1,c="function"==typeof n?n(Object.assign({},t,{placement:e})):n,l=c[0],d=c[1];return l=l||0,d=(d||0)*i,[a.left,a.right].indexOf(o)>=0?{x:d,y:l}:{x:l,y:d}}var c={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,o=e.name,r=n.offset,c=void 0===r?[0,0]:r,l=a.placements.reduce((function(e,n){return e[n]=i(n,t.rects,c),e}),{}),d=l[t.placement],s=d.x,u=d.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=s,t.modifiersData.popperOffsets.y+=u),t.modifiersData[o]=l}};t["default"]=c},83662:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o,r=(o=n(2002))&&o.__esModule?o:{"default":o};var a={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=(0,r["default"])({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}};t["default"]=a},21031:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=n(15954),r=f(n(27629)),a=f(n(78772)),i=f(n(16696)),c=n(54444),l=f(n(68349)),d=f(n(55490)),s=f(n(75949)),u=f(n(31686)),m=f(n(22710)),p=n(36291);function f(e){return e&&e.__esModule?e:{"default":e}}var h={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,f=e.name,h=n.mainAxis,C=void 0===h||h,b=n.altAxis,N=void 0!==b&&b,g=n.boundary,V=n.rootBoundary,v=n.altBoundary,_=n.padding,y=n.tether,k=void 0===y||y,x=n.tetherOffset,w=void 0===x?0:x,B=(0,s["default"])(t,{boundary:g,rootBoundary:V,padding:_,altBoundary:v}),L=(0,r["default"])(t.placement),S=(0,u["default"])(t.placement),I=!S,T=(0,a["default"])(L),A=(0,i["default"])(T),M=t.modifiersData.popperOffsets,E=t.rects.reference,P=t.rects.popper,O="function"==typeof w?w(Object.assign({},t.rects,{placement:t.placement})):w,D="number"==typeof O?{mainAxis:O,altAxis:O}:Object.assign({mainAxis:0,altAxis:0},O),F=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,R={x:0,y:0};if(M){if(C){var j,W="y"===T?o.top:o.left,z="y"===T?o.bottom:o.right,U="y"===T?"height":"width",H=M[T],G=H+B[W],K=H-B[z],Y=k?-P[U]/2:0,q=S===o.start?E[U]:P[U],$=S===o.start?-P[U]:-E[U],X=t.elements.arrow,Q=k&&X?(0,l["default"])(X):{width:0,height:0},J=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:(0,m["default"])(),Z=J[W],ee=J[z],te=(0,c.within)(0,E[U],Q[U]),ne=I?E[U]/2-Y-te-Z-D.mainAxis:q-te-Z-D.mainAxis,oe=I?-E[U]/2+Y+te+ee+D.mainAxis:$+te+ee+D.mainAxis,re=t.elements.arrow&&(0,d["default"])(t.elements.arrow),ae=re?"y"===T?re.clientTop||0:re.clientLeft||0:0,ie=null!=(j=null==F?void 0:F[T])?j:0,ce=H+ne-ie-ae,le=H+oe-ie,de=(0,c.within)(k?(0,p.min)(G,ce):G,H,k?(0,p.max)(K,le):K);M[T]=de,R[T]=de-H}if(N){var se,ue="x"===T?o.top:o.left,me="x"===T?o.bottom:o.right,pe=M[A],fe="y"===A?"height":"width",he=pe+B[ue],Ce=pe-B[me],be=-1!==[o.top,o.left].indexOf(L),Ne=null!=(se=null==F?void 0:F[A])?se:0,ge=be?he:pe-E[fe]-P[fe]-Ne+D.altAxis,Ve=be?pe+E[fe]+P[fe]-Ne-D.altAxis:Ce,ve=k&&be?(0,c.withinMaxClamp)(ge,pe,Ve):(0,c.within)(k?ge:he,pe,k?Ve:Ce);M[A]=ve,R[A]=ve-pe}t.modifiersData[f]=R}},requiresIfExists:["offset"]};t["default"]=h},47952:function(e,t,n){"use strict";t.__esModule=!0,t.defaultModifiers=t.createPopper=void 0;var o=n(21926);t.popperGenerator=o.popperGenerator,t.detectOverflow=o.detectOverflow;var r=l(n(53887)),a=l(n(83662)),i=l(n(54680)),c=l(n(89290));function l(e){return e&&e.__esModule?e:{"default":e}}var d=[r["default"],a["default"],i["default"],c["default"]];t.defaultModifiers=d;var s=(0,o.popperGenerator)({defaultModifiers:d});t.createPopper=s},17827:function(e,t,n){"use strict";t.__esModule=!0;var o={createPopper:!0,createPopperLite:!0,defaultModifiers:!0,popperGenerator:!0,detectOverflow:!0};t.defaultModifiers=t.createPopperLite=t.createPopper=void 0;var r=n(21926);t.popperGenerator=r.popperGenerator,t.detectOverflow=r.detectOverflow;var a=C(n(53887)),i=C(n(83662)),c=C(n(54680)),l=C(n(89290)),d=C(n(99873)),s=C(n(82566)),u=C(n(21031)),m=C(n(71313)),p=C(n(27353)),f=n(47952);t.createPopperLite=f.createPopper;var h=n(4207);function C(e){return e&&e.__esModule?e:{"default":e}}Object.keys(h).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===h[e]||(t[e]=h[e]))}));var b=[a["default"],i["default"],c["default"],l["default"],d["default"],s["default"],u["default"],m["default"],p["default"]];t.defaultModifiers=b;var N=(0,r.popperGenerator)({defaultModifiers:b});t.createPopperLite=t.createPopper=N},2894:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t){void 0===t&&(t={});var n=t,c=n.placement,l=n.boundary,d=n.rootBoundary,s=n.padding,u=n.flipVariations,m=n.allowedAutoPlacements,p=void 0===m?r.placements:m,f=(0,o["default"])(c),h=f?u?r.variationPlacements:r.variationPlacements.filter((function(e){return(0,o["default"])(e)===f})):r.basePlacements,C=h.filter((function(e){return p.indexOf(e)>=0}));0===C.length&&(C=h);var b=C.reduce((function(t,n){return t[n]=(0,a["default"])(e,{placement:n,boundary:l,rootBoundary:d,padding:s})[(0,i["default"])(n)],t}),{});return Object.keys(b).sort((function(e,t){return b[e]-b[t]}))};var o=c(n(31686)),r=n(15954),a=c(n(75949)),i=c(n(27629));function c(e){return e&&e.__esModule?e:{"default":e}}},2002:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t,n=e.reference,c=e.element,l=e.placement,d=l?(0,o["default"])(l):null,s=l?(0,r["default"])(l):null,u=n.x+n.width/2-c.width/2,m=n.y+n.height/2-c.height/2;switch(d){case i.top:t={x:u,y:n.y-c.height};break;case i.bottom:t={x:u,y:n.y+n.height};break;case i.right:t={x:n.x+n.width,y:m};break;case i.left:t={x:n.x-c.width,y:m};break;default:t={x:n.x,y:n.y}}var p=d?(0,a["default"])(d):null;if(null!=p){var f="y"===p?"height":"width";switch(s){case i.start:t[p]=t[p]-(n[f]/2-c[f]/2);break;case i.end:t[p]=t[p]+(n[f]/2-c[f]/2)}}return t};var o=c(n(27629)),r=c(n(31686)),a=c(n(78772)),i=n(15954);function c(e){return e&&e.__esModule?e:{"default":e}}},27672:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){var t;return function(){return t||(t=new Promise((function(n){Promise.resolve().then((function(){t=undefined,n(e())}))}))),t}}},75949:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t){void 0===t&&(t={});var n=t,m=n.placement,p=void 0===m?e.placement:m,f=n.boundary,h=void 0===f?l.clippingParents:f,C=n.rootBoundary,b=void 0===C?l.viewport:C,N=n.elementContext,g=void 0===N?l.popper:N,V=n.altBoundary,v=void 0!==V&&V,_=n.padding,y=void 0===_?0:_,k=(0,s["default"])("number"!=typeof y?y:(0,u["default"])(y,l.basePlacements)),x=g===l.popper?l.reference:l.popper,w=e.rects.popper,B=e.elements[v?x:g],L=(0,o["default"])((0,d.isElement)(B)?B:B.contextElement||(0,r["default"])(e.elements.popper),h,b),S=(0,a["default"])(e.elements.reference),I=(0,i["default"])({reference:S,element:w,strategy:"absolute",placement:p}),T=(0,c["default"])(Object.assign({},w,I)),A=g===l.popper?T:S,M={top:L.top-A.top+k.top,bottom:A.bottom-L.bottom+k.bottom,left:L.left-A.left+k.left,right:A.right-L.right+k.right},E=e.modifiersData.offset;if(g===l.popper&&E){var P=E[p];Object.keys(M).forEach((function(e){var t=[l.right,l.bottom].indexOf(e)>=0?1:-1,n=[l.top,l.bottom].indexOf(e)>=0?"y":"x";M[e]+=P[n]*t}))}return M};var o=m(n(65647)),r=m(n(25890)),a=m(n(11100)),i=m(n(2002)),c=m(n(73060)),l=n(15954),d=n(79388),s=m(n(11277)),u=m(n(45674));function m(e){return e&&e.__esModule?e:{"default":e}}},45674:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}},80885:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o=0?"x":"y"}},31477:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.replace(/left|right|bottom|top/g,(function(e){return n[e]}))};var n={left:"right",right:"left",bottom:"top",top:"bottom"}},44214:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.replace(/start|end/g,(function(e){return n[e]}))};var n={start:"end",end:"start"}},31686:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.split("-")[1]}},36291:function(e,t){"use strict";t.__esModule=!0,t.round=t.min=t.max=void 0;var n=Math.max;t.max=n;var o=Math.min;t.min=o;var r=Math.round;t.round=r},54220:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){var t=e.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{});return Object.keys(t).map((function(e){return t[e]}))}},11277:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return Object.assign({},(0,r["default"])(),e)};var o,r=(o=n(22710))&&o.__esModule?o:{"default":o}},69282:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=function(e){var t=new Map,n=new Set,o=[];function r(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var o=t.get(e);o&&r(o)}})),o.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||r(e)})),o}(e);return o.modifierPhases.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])};var o=n(15954)},73060:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}},12459:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e,t){var n=new Set;return e.filter((function(e){var o=t(e);if(!n.has(o))return n.add(o),!0}))}},30752:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){e.forEach((function(t){[].concat(Object.keys(t),a).filter((function(e,t,n){return n.indexOf(e)===t})).forEach((function(n){switch(n){case"name":t.name;break;case"enabled":t.enabled;break;case"phase":r.modifierPhases.indexOf(t.phase);break;case"fn":t.fn;break;case"effect":null!=t.effect&&t.effect;break;case"requires":null!=t.requires&&Array.isArray(t.requires);break;case"requiresIfExists":Array.isArray(t.requiresIfExists)}t.requires&&t.requires.forEach((function(t){e.find((function(e){return e.name===t}))}))}))}))};(o=n(80885))&&o.__esModule;var o,r=n(15954);var a=["name","enabled","phase","fn","effect","requires","options"]},54444:function(e,t,n){"use strict";t.__esModule=!0,t.within=r,t.withinMaxClamp=function(e,t,n){var o=r(e,t,n);return o>n?n:o};var o=n(36291);function r(e,t,n){return(0,o.max)(e,(0,o.min)(t,n))}},7696:function(e,t,n){"use strict";var o=n(45744),r=n(56279),a=TypeError;e.exports=function(e){if(o(e))return e;throw a(r(e)+" is not a function")}},99079:function(e,t,n){"use strict";var o=n(49332),r=n(56279),a=TypeError;e.exports=function(e){if(o(e))return e;throw a(r(e)+" is not a constructor")}},3760:function(e,t,n){"use strict";var o=n(45744),r=String,a=TypeError;e.exports=function(e){if("object"==typeof e||o(e))return e;throw a("Can't set "+r(e)+" as a prototype")}},48144:function(e,t,n){"use strict";var o=n(43741),r=n(48525),a=n(92723).f,i=o("unscopables"),c=Array.prototype;c[i]==undefined&&a(c,i,{configurable:!0,value:r(null)}),e.exports=function(e){c[i][e]=!0}},21679:function(e,t,n){"use strict";var o=n(59529).charAt;e.exports=function(e,t,n){return t+(n?o(e,t).length:1)}},41706:function(e,t,n){"use strict";var o=n(76469),r=TypeError;e.exports=function(e,t){if(o(t,e))return e;throw r("Incorrect invocation")}},65522:function(e,t,n){"use strict";var o=n(5484),r=String,a=TypeError;e.exports=function(e){if(o(e))return e;throw a(r(e)+" is not an object")}},65167:function(e){"use strict";e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},26974:function(e,t,n){"use strict";var o=n(39125);e.exports=o((function(){if("function"==typeof ArrayBuffer){var e=new ArrayBuffer(8);Object.isExtensible(e)&&Object.defineProperty(e,"a",{value:8})}}))},92574:function(e,t,n){"use strict";var o,r,a,i=n(65167),c=n(77849),l=n(61770),d=n(45744),s=n(5484),u=n(77807),m=n(10374),p=n(56279),f=n(87229),h=n(73e3),C=n(92723).f,b=n(76469),N=n(56997),g=n(44958),V=n(43741),v=n(8220),_=n(48797),y=_.enforce,k=_.get,x=l.Int8Array,w=x&&x.prototype,B=l.Uint8ClampedArray,L=B&&B.prototype,S=x&&N(x),I=w&&N(w),T=Object.prototype,A=l.TypeError,M=V("toStringTag"),E=v("TYPED_ARRAY_TAG"),P="TypedArrayConstructor",O=i&&!!g&&"Opera"!==m(l.opera),D=!1,F={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},R={BigInt64Array:8,BigUint64Array:8},j=function(e){if(!s(e))return!1;var t=m(e);return"DataView"===t||u(F,t)||u(R,t)},W=function(e){if(!s(e))return!1;var t=m(e);return u(F,t)||u(R,t)};for(o in F)(a=(r=l[o])&&r.prototype)?y(a).TypedArrayConstructor=r:O=!1;for(o in R)(a=(r=l[o])&&r.prototype)&&(y(a).TypedArrayConstructor=r);if((!O||!d(S)||S===Function.prototype)&&(S=function(){throw A("Incorrect invocation")},O))for(o in F)l[o]&&g(l[o],S);if((!O||!I||I===T)&&(I=S.prototype,O))for(o in F)l[o]&&g(l[o].prototype,I);if(O&&N(L)!==I&&g(L,I),c&&!u(I,M))for(o in D=!0,C(I,M,{get:function(){return s(this)?this[E]:undefined}}),F)l[o]&&f(l[o],E,o);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:O,TYPED_ARRAY_TAG:D&&E,aTypedArray:function(e){if(W(e))return e;throw A("Target is not a typed array")},aTypedArrayConstructor:function(e){if(d(e)&&(!g||b(S,e)))return e;throw A(p(e)+" is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n,o){if(c){if(n)for(var r in F){var a=l[r];if(a&&u(a.prototype,e))try{delete a.prototype[e]}catch(i){try{a.prototype[e]=t}catch(d){}}}I[e]&&!n||h(I,e,n?t:O&&w[e]||t,o)}},exportTypedArrayStaticMethod:function(e,t,n){var o,r;if(c){if(g){if(n)for(o in F)if((r=l[o])&&u(r,e))try{delete r[e]}catch(a){}if(S[e]&&!n)return;try{return h(S,e,n?t:O&&S[e]||t)}catch(a){}}for(o in F)!(r=l[o])||r[e]&&!n||h(r,e,t)}},getTypedArrayConstructor:function z(e){var t=N(e);if(s(t)){var n=k(t);return n&&u(n,P)?n.TypedArrayConstructor:z(t)}},isView:j,isTypedArray:W,TypedArray:S,TypedArrayPrototype:I}},10377:function(e,t,n){"use strict";var o=n(61770),r=n(90655),a=n(77849),i=n(65167),c=n(82429),l=n(87229),d=n(60495),s=n(39125),u=n(41706),m=n(94868),p=n(87543),f=n(76124),h=n(29209),C=n(56997),b=n(44958),N=n(94600).f,g=n(92723).f,V=n(8093),v=n(74337),_=n(93182),y=n(48797),k=c.PROPER,x=c.CONFIGURABLE,w=y.get,B=y.set,L="ArrayBuffer",S="DataView",I="Wrong index",T=o.ArrayBuffer,A=T,M=A&&A.prototype,E=o.DataView,P=E&&E.prototype,O=Object.prototype,D=o.Array,F=o.RangeError,R=r(V),j=r([].reverse),W=h.pack,z=h.unpack,U=function(e){return[255&e]},H=function(e){return[255&e,e>>8&255]},G=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},K=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},Y=function(e){return W(e,23,4)},q=function(e){return W(e,52,8)},$=function(e,t){g(e.prototype,t,{get:function(){return w(this)[t]}})},X=function(e,t,n,o){var r=f(n),a=w(e);if(r+t>a.byteLength)throw F(I);var i=w(a.buffer).bytes,c=r+a.byteOffset,l=v(i,c,c+t);return o?l:j(l)},Q=function(e,t,n,o,r,a){var i=f(n),c=w(e);if(i+t>c.byteLength)throw F(I);for(var l=w(c.buffer).bytes,d=i+c.byteOffset,s=o(+r),u=0;ute;)(Z=ee[te++])in A||l(A,Z,T[Z]);M.constructor=A}b&&C(P)!==O&&b(P,O);var ne=new E(new A(2)),oe=r(P.setInt8);ne.setInt8(0,2147483648),ne.setInt8(1,2147483649),!ne.getInt8(0)&&ne.getInt8(1)||d(P,{setInt8:function(e,t){oe(this,e,t<<24>>24)},setUint8:function(e,t){oe(this,e,t<<24>>24)}},{unsafe:!0})}else M=(A=function(e){u(this,M);var t=f(e);B(this,{bytes:R(D(t),0),byteLength:t}),a||(this.byteLength=t)}).prototype,P=(E=function(e,t,n){u(this,P),u(e,M);var o=w(e).byteLength,r=m(t);if(r<0||r>o)throw F("Wrong offset");if(r+(n=n===undefined?o-r:p(n))>o)throw F("Wrong length");B(this,{buffer:e,byteLength:n,byteOffset:r}),a||(this.buffer=e,this.byteLength=n,this.byteOffset=r)}).prototype,a&&($(A,"byteLength"),$(E,"buffer"),$(E,"byteLength"),$(E,"byteOffset")),d(P,{getInt8:function(e){return X(this,1,e)[0]<<24>>24},getUint8:function(e){return X(this,1,e)[0]},getInt16:function(e){var t=X(this,2,e,arguments.length>1?arguments[1]:undefined);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=X(this,2,e,arguments.length>1?arguments[1]:undefined);return t[1]<<8|t[0]},getInt32:function(e){return K(X(this,4,e,arguments.length>1?arguments[1]:undefined))},getUint32:function(e){return K(X(this,4,e,arguments.length>1?arguments[1]:undefined))>>>0},getFloat32:function(e){return z(X(this,4,e,arguments.length>1?arguments[1]:undefined),23)},getFloat64:function(e){return z(X(this,8,e,arguments.length>1?arguments[1]:undefined),52)},setInt8:function(e,t){Q(this,1,e,U,t)},setUint8:function(e,t){Q(this,1,e,U,t)},setInt16:function(e,t){Q(this,2,e,H,t,arguments.length>2?arguments[2]:undefined)},setUint16:function(e,t){Q(this,2,e,H,t,arguments.length>2?arguments[2]:undefined)},setInt32:function(e,t){Q(this,4,e,G,t,arguments.length>2?arguments[2]:undefined)},setUint32:function(e,t){Q(this,4,e,G,t,arguments.length>2?arguments[2]:undefined)},setFloat32:function(e,t){Q(this,4,e,Y,t,arguments.length>2?arguments[2]:undefined)},setFloat64:function(e,t){Q(this,8,e,q,t,arguments.length>2?arguments[2]:undefined)}});_(A,L),_(E,S),e.exports={ArrayBuffer:A,DataView:E}},21497:function(e,t,n){"use strict";var o=n(73502),r=n(312),a=n(10950),i=n(33099),c=Math.min;e.exports=[].copyWithin||function(e,t){var n=o(this),l=a(n),d=r(e,l),s=r(t,l),u=arguments.length>2?arguments[2]:undefined,m=c((u===undefined?l:r(u,l))-s,l-d),p=1;for(s0;)s in n?n[d]=n[s]:i(n,d),d+=p,s+=p;return n}},8093:function(e,t,n){"use strict";var o=n(73502),r=n(312),a=n(10950);e.exports=function(e){for(var t=o(this),n=a(t),i=arguments.length,c=r(i>1?arguments[1]:undefined,n),l=i>2?arguments[2]:undefined,d=l===undefined?n:r(l,n);d>c;)t[c++]=e;return t}},29074:function(e,t,n){"use strict";var o=n(36249).forEach,r=n(74640)("forEach");e.exports=r?[].forEach:function(e){return o(this,e,arguments.length>1?arguments[1]:undefined)}},15993:function(e,t,n){"use strict";var o=n(10950);e.exports=function(e,t){for(var n=0,r=o(t),a=new e(r);r>n;)a[n]=t[n++];return a}},49981:function(e,t,n){"use strict";var o=n(9341),r=n(76348),a=n(73502),i=n(63635),c=n(94535),l=n(49332),d=n(10950),s=n(61154),u=n(93247),m=n(52522),p=Array;e.exports=function(e){var t=a(e),n=l(this),f=arguments.length,h=f>1?arguments[1]:undefined,C=h!==undefined;C&&(h=o(h,f>2?arguments[2]:undefined));var b,N,g,V,v,_,y=m(t),k=0;if(!y||this===p&&c(y))for(b=d(t),N=n?new this(b):p(b);b>k;k++)_=C?h(t[k],k):t[k],s(N,k,_);else for(v=(V=u(t,y)).next,N=n?new this:[];!(g=r(v,V)).done;k++)_=C?i(V,h,[g.value,k],!0):g.value,s(N,k,_);return N.length=k,N}},89344:function(e,t,n){"use strict";var o=n(4254),r=n(312),a=n(10950),i=function(e){return function(t,n,i){var c,l=o(t),d=a(l),s=r(i,d);if(e&&n!=n){for(;d>s;)if((c=l[s++])!=c)return!0}else for(;d>s;s++)if((e||s in l)&&l[s]===n)return e||s||0;return!e&&-1}};e.exports={includes:i(!0),indexOf:i(!1)}},36249:function(e,t,n){"use strict";var o=n(9341),r=n(90655),a=n(83609),i=n(73502),c=n(10950),l=n(64711),d=r([].push),s=function(e){var t=1==e,n=2==e,r=3==e,s=4==e,u=6==e,m=7==e,p=5==e||u;return function(f,h,C,b){for(var N,g,V=i(f),v=a(V),_=o(h,C),y=c(v),k=0,x=b||l,w=t?x(f,y):n||m?x(f,0):undefined;y>k;k++)if((p||k in v)&&(g=_(N=v[k],k,V),e))if(t)w[k]=g;else if(g)switch(e){case 3:return!0;case 5:return N;case 6:return k;case 2:d(w,N)}else switch(e){case 4:return!1;case 7:d(w,N)}return u?-1:r||s?s:w}};e.exports={forEach:s(0),map:s(1),filter:s(2),some:s(3),every:s(4),find:s(5),findIndex:s(6),filterReject:s(7)}},93881:function(e,t,n){"use strict";var o=n(10261),r=n(4254),a=n(94868),i=n(10950),c=n(74640),l=Math.min,d=[].lastIndexOf,s=!!d&&1/[1].lastIndexOf(1,-0)<0,u=c("lastIndexOf"),m=s||!u;e.exports=m?function(e){if(s)return o(d,this,arguments)||0;var t=r(this),n=i(t),c=n-1;for(arguments.length>1&&(c=l(c,a(arguments[1]))),c<0&&(c=n+c);c>=0;c--)if(c in t&&t[c]===e)return c||0;return-1}:d},10112:function(e,t,n){"use strict";var o=n(39125),r=n(43741),a=n(64279),i=r("species");e.exports=function(e){return a>=51||!o((function(){var t=[];return(t.constructor={})[i]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},74640:function(e,t,n){"use strict";var o=n(39125);e.exports=function(e,t){var n=[][e];return!!n&&o((function(){n.call(null,t||function(){return 1},1)}))}},21038:function(e,t,n){"use strict";var o=n(7696),r=n(73502),a=n(83609),i=n(10950),c=TypeError,l=function(e){return function(t,n,l,d){o(n);var s=r(t),u=a(s),m=i(s),p=e?m-1:0,f=e?-1:1;if(l<2)for(;;){if(p in u){d=u[p],p+=f;break}if(p+=f,e?p<0:m<=p)throw c("Reduce of empty array with no initial value")}for(;e?p>=0:m>p;p+=f)p in u&&(d=n(d,u[p],p,s));return d}};e.exports={left:l(!1),right:l(!0)}},74337:function(e,t,n){"use strict";var o=n(312),r=n(10950),a=n(61154),i=Array,c=Math.max;e.exports=function(e,t,n){for(var l=r(e),d=o(t,l),s=o(n===undefined?l:n,l),u=i(c(s-d,0)),m=0;d0;)e[o]=e[--o];o!==a++&&(e[o]=n)}return e},i=function(e,t,n,o){for(var r=t.length,a=n.length,i=0,c=0;i1?arguments[1]:undefined);t=t?t.next:n.first;)for(o(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!N(this,e)}}),a(p,n?{get:function(e){var t=N(this,e);return t&&t.value},set:function(e,t){return b(this,0===e?0:e,t)}}:{add:function(e){return b(this,e=0===e?0:e,e)}}),u&&o(p,"size",{get:function(){return C(this).size}}),s},setStrong:function(e,t,n){var o=t+" Iterator",r=h(t),a=h(o);d(e,t,(function(e,t){f(this,{type:o,target:e,state:r(e),kind:t,last:undefined})}),(function(){for(var e=a(this),t=e.kind,n=e.last;n&&n.removed;)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?"keys"==t?{value:n.key,done:!1}:"values"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=undefined,{value:undefined,done:!0})}),n?"entries":"values",!n,!0),s(t)}}},81995:function(e,t,n){"use strict";var o=n(90655),r=n(60495),a=n(49632).getWeakData,i=n(65522),c=n(5484),l=n(41706),d=n(47916),s=n(36249),u=n(77807),m=n(48797),p=m.set,f=m.getterFor,h=s.find,C=s.findIndex,b=o([].splice),N=0,g=function(e){return e.frozen||(e.frozen=new V)},V=function(){this.entries=[]},v=function(e,t){return h(e.entries,(function(e){return e[0]===t}))};V.prototype={get:function(e){var t=v(this,e);if(t)return t[1]},has:function(e){return!!v(this,e)},set:function(e,t){var n=v(this,e);n?n[1]=t:this.entries.push([e,t])},"delete":function(e){var t=C(this.entries,(function(t){return t[0]===e}));return~t&&b(this.entries,t,1),!!~t}},e.exports={getConstructor:function(e,t,n,o){var s=e((function(e,r){l(e,m),p(e,{type:t,id:N++,frozen:undefined}),r!=undefined&&d(r,e[o],{that:e,AS_ENTRIES:n})})),m=s.prototype,h=f(t),C=function(e,t,n){var o=h(e),r=a(i(t),!0);return!0===r?g(o).set(t,n):r[o.id]=n,e};return r(m,{"delete":function(e){var t=h(this);if(!c(e))return!1;var n=a(e);return!0===n?g(t)["delete"](e):n&&u(n,t.id)&&delete n[t.id]},has:function(e){var t=h(this);if(!c(e))return!1;var n=a(e);return!0===n?g(t).has(e):n&&u(n,t.id)}}),r(m,n?{get:function(e){var t=h(this);if(c(e)){var n=a(e);return!0===n?g(t).get(e):n?n[t.id]:undefined}},set:function(e,t){return C(this,e,t)}}:{add:function(e){return C(this,e,!0)}}),s}}},18291:function(e,t,n){"use strict";var o=n(59450),r=n(61770),a=n(90655),i=n(16851),c=n(73e3),l=n(49632),d=n(47916),s=n(41706),u=n(45744),m=n(5484),p=n(39125),f=n(98994),h=n(93182),C=n(75121);e.exports=function(e,t,n){var b=-1!==e.indexOf("Map"),N=-1!==e.indexOf("Weak"),g=b?"set":"add",V=r[e],v=V&&V.prototype,_=V,y={},k=function(e){var t=a(v[e]);c(v,e,"add"==e?function(e){return t(this,0===e?0:e),this}:"delete"==e?function(e){return!(N&&!m(e))&&t(this,0===e?0:e)}:"get"==e?function(e){return N&&!m(e)?undefined:t(this,0===e?0:e)}:"has"==e?function(e){return!(N&&!m(e))&&t(this,0===e?0:e)}:function(e,n){return t(this,0===e?0:e,n),this})};if(i(e,!u(V)||!(N||v.forEach&&!p((function(){(new V).entries().next()})))))_=n.getConstructor(t,e,b,g),l.enable();else if(i(e,!0)){var x=new _,w=x[g](N?{}:-0,1)!=x,B=p((function(){x.has(1)})),L=f((function(e){new V(e)})),S=!N&&p((function(){for(var e=new V,t=5;t--;)e[g](t,t);return!e.has(-0)}));L||((_=t((function(e,t){s(e,v);var n=C(new V,e,_);return t!=undefined&&d(t,n[g],{that:n,AS_ENTRIES:b}),n}))).prototype=v,v.constructor=_),(B||S)&&(k("delete"),k("has"),b&&k("get")),(S||w)&&k(g),N&&v.clear&&delete v.clear}return y[e]=_,o({global:!0,constructor:!0,forced:_!=V},y),h(_,e),N||n.setStrong(_,e,b),_}},35155:function(e,t,n){"use strict";var o=n(77807),r=n(75379),a=n(12488),i=n(92723);e.exports=function(e,t,n){for(var c=r(t),l=i.f,d=a.f,s=0;s"+l+""+t+">"}},92413:function(e,t,n){"use strict";var o=n(80936).IteratorPrototype,r=n(48525),a=n(20471),i=n(93182),c=n(53481),l=function(){return this};e.exports=function(e,t,n,d){var s=t+" Iterator";return e.prototype=r(o,{next:a(+!d,n)}),i(e,s,!1,!0),c[s]=l,e}},87229:function(e,t,n){"use strict";var o=n(77849),r=n(92723),a=n(20471);e.exports=o?function(e,t,n){return r.f(e,t,a(1,n))}:function(e,t,n){return e[t]=n,e}},20471:function(e){"use strict";e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},61154:function(e,t,n){"use strict";var o=n(23986),r=n(92723),a=n(20471);e.exports=function(e,t,n){var i=o(t);i in e?r.f(e,i,a(0,n)):e[i]=n}},36849:function(e,t,n){"use strict";var o=n(90655),r=n(39125),a=n(79408).start,i=RangeError,c=Math.abs,l=Date.prototype,d=l.toISOString,s=o(l.getTime),u=o(l.getUTCDate),m=o(l.getUTCFullYear),p=o(l.getUTCHours),f=o(l.getUTCMilliseconds),h=o(l.getUTCMinutes),C=o(l.getUTCMonth),b=o(l.getUTCSeconds);e.exports=r((function(){return"0385-07-25T07:06:39.999Z"!=d.call(new Date(-50000000000001))}))||!r((function(){d.call(new Date(NaN))}))?function(){if(!isFinite(s(this)))throw i("Invalid time value");var e=this,t=m(e),n=f(e),o=t<0?"-":t>9999?"+":"";return o+a(c(t),o?6:4,0)+"-"+a(C(e)+1,2,0)+"-"+a(u(e),2,0)+"T"+a(p(e),2,0)+":"+a(h(e),2,0)+":"+a(b(e),2,0)+"."+a(n,3,0)+"Z"}:d},81990:function(e,t,n){"use strict";var o=n(65522),r=n(2118),a=TypeError;e.exports=function(e){if(o(this),"string"===e||"default"===e)e="string";else if("number"!==e)throw a("Incorrect hint");return r(this,e)}},66384:function(e,t,n){"use strict";var o=n(28859),r=n(92723);e.exports=function(e,t,n){return n.get&&o(n.get,t,{getter:!0}),n.set&&o(n.set,t,{setter:!0}),r.f(e,t,n)}},73e3:function(e,t,n){"use strict";var o=n(45744),r=n(92723),a=n(28859),i=n(58962);e.exports=function(e,t,n,c){c||(c={});var l=c.enumerable,d=c.name!==undefined?c.name:t;return o(n)&&a(n,d,c),c.global?l?e[t]=n:i(t,n):(c.unsafe?e[t]&&(l=!0):delete e[t],l?e[t]=n:r.f(e,t,{value:n,enumerable:!1,configurable:!c.nonConfigurable,writable:!c.nonWritable})),e}},60495:function(e,t,n){"use strict";var o=n(73e3);e.exports=function(e,t,n){for(var r in t)o(e,r,t[r],n);return e}},58962:function(e,t,n){"use strict";var o=n(61770),r=Object.defineProperty;e.exports=function(e,t){try{r(o,e,{value:t,configurable:!0,writable:!0})}catch(n){o[e]=t}return t}},11335:function(e,t,n){"use strict";var o=n(59450),r=n(76348),a=n(37249),i=n(82429),c=n(45744),l=n(92413),d=n(56997),s=n(44958),u=n(93182),m=n(87229),p=n(73e3),f=n(43741),h=n(53481),C=n(80936),b=i.PROPER,N=i.CONFIGURABLE,g=C.IteratorPrototype,V=C.BUGGY_SAFARI_ITERATORS,v=f("iterator"),_="keys",y="values",k="entries",x=function(){return this};e.exports=function(e,t,n,i,f,C,w){l(n,t,i);var B,L,S,I=function(e){if(e===f&&P)return P;if(!V&&e in M)return M[e];switch(e){case _:case y:case k:return function(){return new n(this,e)}}return function(){return new n(this)}},T=t+" Iterator",A=!1,M=e.prototype,E=M[v]||M["@@iterator"]||f&&M[f],P=!V&&E||I(f),O="Array"==t&&M.entries||E;if(O&&(B=d(O.call(new e)))!==Object.prototype&&B.next&&(a||d(B)===g||(s?s(B,g):c(B[v])||p(B,v,x)),u(B,T,!0,!0),a&&(h[T]=x)),b&&f==y&&E&&E.name!==y&&(!a&&N?m(M,"name",y):(A=!0,P=function(){return r(E,this)})),f)if(L={values:I(y),keys:C?P:I(_),entries:I(k)},w)for(S in L)(V||A||!(S in M))&&p(M,S,L[S]);else o({target:t,proto:!0,forced:V||A},L);return a&&!w||M[v]===P||p(M,v,P,{name:f}),h[t]=P,L}},89604:function(e,t,n){"use strict";var o=n(62660),r=n(77807),a=n(68438),i=n(92723).f;e.exports=function(e){var t=o.Symbol||(o.Symbol={});r(t,e)||i(t,e,{value:a.f(e)})}},33099:function(e,t,n){"use strict";var o=n(56279),r=TypeError;e.exports=function(e,t){if(!delete e[t])throw r("Cannot delete property "+o(t)+" of "+o(e))}},77849:function(e,t,n){"use strict";var o=n(39125);e.exports=!o((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},50842:function(e,t,n){"use strict";var o=n(61770),r=n(5484),a=o.document,i=r(a)&&r(a.createElement);e.exports=function(e){return i?a.createElement(e):{}}},97989:function(e){"use strict";var t=TypeError;e.exports=function(e){if(e>9007199254740991)throw t("Maximum allowed index exceeded");return e}},13811:function(e,t,n){"use strict";var o=n(42630).match(/firefox\/(\d+)/i);e.exports=!!o&&+o[1]},15904:function(e){"use strict";e.exports="object"==typeof window&&"object"!=typeof Deno},86936:function(e,t,n){"use strict";var o=n(42630);e.exports=/MSIE|Trident/.test(o)},48715:function(e,t,n){"use strict";var o=n(42630),r=n(61770);e.exports=/ipad|iphone|ipod/i.test(o)&&r.Pebble!==undefined},25515:function(e,t,n){"use strict";var o=n(42630);e.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(o)},67745:function(e,t,n){"use strict";var o=n(61496),r=n(61770);e.exports="process"==o(r.process)},35016:function(e,t,n){"use strict";var o=n(42630);e.exports=/web0s(?!.*chrome)/i.test(o)},42630:function(e,t,n){"use strict";var o=n(54965);e.exports=o("navigator","userAgent")||""},64279:function(e,t,n){"use strict";var o,r,a=n(61770),i=n(42630),c=a.process,l=a.Deno,d=c&&c.versions||l&&l.version,s=d&&d.v8;s&&(r=(o=s.split("."))[0]>0&&o[0]<4?1:+(o[0]+o[1])),!r&&i&&(!(o=i.match(/Edge\/(\d+)/))||o[1]>=74)&&(o=i.match(/Chrome\/(\d+)/))&&(r=+o[1]),e.exports=r},86778:function(e,t,n){"use strict";var o=n(42630).match(/AppleWebKit\/(\d+)\./);e.exports=!!o&&+o[1]},59096:function(e){"use strict";e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},59450:function(e,t,n){"use strict";var o=n(61770),r=n(12488).f,a=n(87229),i=n(73e3),c=n(58962),l=n(35155),d=n(16851);e.exports=function(e,t){var n,s,u,m,p,f=e.target,h=e.global,C=e.stat;if(n=h?o:C?o[f]||c(f,{}):(o[f]||{}).prototype)for(s in t){if(m=t[s],u=e.dontCallGetSet?(p=r(n,s))&&p.value:n[s],!d(h?s:f+(C?".":"#")+s,e.forced)&&u!==undefined){if(typeof m==typeof u)continue;l(m,u)}(e.sham||u&&u.sham)&&a(m,"sham",!0),i(n,s,m,e)}}},39125:function(e){"use strict";e.exports=function(e){try{return!!e()}catch(t){return!0}}},6531:function(e,t,n){"use strict";n(50044);var o=n(90655),r=n(73e3),a=n(50174),i=n(39125),c=n(43741),l=n(87229),d=c("species"),s=RegExp.prototype;e.exports=function(e,t,n,u){var m=c(e),p=!i((function(){var t={};return t[m]=function(){return 7},7!=""[e](t)})),f=p&&!i((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[d]=function(){return n},n.flags="",n[m]=/./[m]),n.exec=function(){return t=!0,null},n[m](""),!t}));if(!p||!f||n){var h=o(/./[m]),C=t(m,""[e],(function(e,t,n,r,i){var c=o(e),l=t.exec;return l===a||l===s.exec?p&&!i?{done:!0,value:h(t,n,r)}:{done:!0,value:c(n,t,r)}:{done:!1}}));r(String.prototype,e,C[0]),r(s,m,C[1])}u&&l(s[m],"sham",!0)}},23507:function(e,t,n){"use strict";var o=n(98037),r=n(10950),a=n(97989),i=n(9341);e.exports=function c(e,t,n,l,d,s,u,m){for(var p,f=d,h=0,C=!!u&&i(u,m);h0&&o(p)?f=c(e,t,p,r(p),f,s-1)-1:(a(f+1),e[f]=p),f++),h++;return f}},57724:function(e,t,n){"use strict";var o=n(39125);e.exports=!o((function(){return Object.isExtensible(Object.preventExtensions({}))}))},10261:function(e,t,n){"use strict";var o=n(14687),r=Function.prototype,a=r.apply,i=r.call;e.exports="object"==typeof Reflect&&Reflect.apply||(o?i.bind(a):function(){return i.apply(a,arguments)})},9341:function(e,t,n){"use strict";var o=n(90655),r=n(7696),a=n(14687),i=o(o.bind);e.exports=function(e,t){return r(e),t===undefined?e:a?i(e,t):function(){return e.apply(t,arguments)}}},14687:function(e,t,n){"use strict";var o=n(39125);e.exports=!o((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")}))},38349:function(e,t,n){"use strict";var o=n(90655),r=n(7696),a=n(5484),i=n(77807),c=n(53898),l=n(14687),d=Function,s=o([].concat),u=o([].join),m={},p=function(e,t,n){if(!i(m,t)){for(var o=[],r=0;r]*>)/g,s=/\$([$&'`]|\d{1,2})/g;e.exports=function(e,t,n,o,u,m){var p=n+e.length,f=o.length,h=s;return u!==undefined&&(u=r(u),h=d),c(m,h,(function(r,c){var d;switch(i(c,0)){case"$":return"$";case"&":return e;case"`":return l(t,0,n);case"'":return l(t,p);case"<":d=u[l(c,1,-1)];break;default:var s=+c;if(0===s)return r;if(s>f){var m=a(s/10);return 0===m?r:m<=f?o[m-1]===undefined?i(c,1):o[m-1]+i(c,1):r}d=o[s-1]}return d===undefined?"":d}))}},61770:function(e,t,n){"use strict";var o=function(e){return e&&e.Math==Math&&e};e.exports=o("object"==typeof globalThis&&globalThis)||o("object"==typeof window&&window)||o("object"==typeof self&&self)||o("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},77807:function(e,t,n){"use strict";var o=n(90655),r=n(73502),a=o({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return a(r(e),t)}},31645:function(e){"use strict";e.exports={}},66791:function(e,t,n){"use strict";var o=n(61770);e.exports=function(e,t){var n=o.console;n&&n.error&&(1==arguments.length?n.error(e):n.error(e,t))}},29093:function(e,t,n){"use strict";var o=n(54965);e.exports=o("document","documentElement")},17041:function(e,t,n){"use strict";var o=n(77849),r=n(39125),a=n(50842);e.exports=!o&&!r((function(){return 7!=Object.defineProperty(a("div"),"a",{get:function(){return 7}}).a}))},29209:function(e){"use strict";var t=Array,n=Math.abs,o=Math.pow,r=Math.floor,a=Math.log,i=Math.LN2;e.exports={pack:function(e,c,l){var d,s,u,m=t(l),p=8*l-c-1,f=(1<>1,C=23===c?o(2,-24)-o(2,-77):0,b=e<0||0===e&&1/e<0?1:0,N=0;for((e=n(e))!=e||e===Infinity?(s=e!=e?1:0,d=f):(d=r(a(e)/i),e*(u=o(2,-d))<1&&(d--,u*=2),(e+=d+h>=1?C/u:C*o(2,1-h))*u>=2&&(d++,u/=2),d+h>=f?(s=0,d=f):d+h>=1?(s=(e*u-1)*o(2,c),d+=h):(s=e*o(2,h-1)*o(2,c),d=0));c>=8;)m[N++]=255&s,s/=256,c-=8;for(d=d<0;)m[N++]=255&d,d/=256,p-=8;return m[--N]|=128*b,m},unpack:function(e,t){var n,r=e.length,a=8*r-t-1,i=(1<>1,l=a-7,d=r-1,s=e[d--],u=127&s;for(s>>=7;l>0;)u=256*u+e[d--],l-=8;for(n=u&(1<<-l)-1,u>>=-l,l+=t;l>0;)n=256*n+e[d--],l-=8;if(0===u)u=1-c;else{if(u===i)return n?NaN:s?-Infinity:Infinity;n+=o(2,t),u-=c}return(s?-1:1)*n*o(2,u-t)}}},83609:function(e,t,n){"use strict";var o=n(90655),r=n(39125),a=n(61496),i=Object,c=o("".split);e.exports=r((function(){return!i("z").propertyIsEnumerable(0)}))?function(e){return"String"==a(e)?c(e,""):i(e)}:i},75121:function(e,t,n){"use strict";var o=n(45744),r=n(5484),a=n(44958);e.exports=function(e,t,n){var i,c;return a&&o(i=t.constructor)&&i!==n&&r(c=i.prototype)&&c!==n.prototype&&a(e,c),e}},44790:function(e,t,n){"use strict";var o=n(90655),r=n(45744),a=n(42878),i=o(Function.toString);r(a.inspectSource)||(a.inspectSource=function(e){return i(e)}),e.exports=a.inspectSource},49632:function(e,t,n){"use strict";var o=n(59450),r=n(90655),a=n(31645),i=n(5484),c=n(77807),l=n(92723).f,d=n(94600),s=n(25586),u=n(65067),m=n(8220),p=n(57724),f=!1,h=m("meta"),C=0,b=function(e){l(e,h,{value:{objectID:"O"+C++,weakData:{}}})},N=e.exports={enable:function(){N.enable=function(){},f=!0;var e=d.f,t=r([].splice),n={};n[h]=1,e(n).length&&(d.f=function(n){for(var o=e(n),r=0,a=o.length;rN;N++)if((V=S(e[N]))&&d(h,V))return V;return new f(!1)}C=s(e,b)}for(v=C.next;!(_=r(v,C)).done;){try{V=S(_.value)}catch(I){m(C,"throw",I)}if("object"==typeof V&&V&&d(h,V))return V}return new f(!1)}},80261:function(e,t,n){"use strict";var o=n(76348),r=n(65522),a=n(36750);e.exports=function(e,t,n){var i,c;r(e);try{if(!(i=a(e,"return"))){if("throw"===t)throw n;return n}i=o(i,e)}catch(l){c=!0,i=l}if("throw"===t)throw n;if(c)throw i;return r(i),n}},80936:function(e,t,n){"use strict";var o,r,a,i=n(39125),c=n(45744),l=n(48525),d=n(56997),s=n(73e3),u=n(43741),m=n(37249),p=u("iterator"),f=!1;[].keys&&("next"in(a=[].keys())?(r=d(d(a)))!==Object.prototype&&(o=r):f=!0),o==undefined||i((function(){var e={};return o[p].call(e)!==e}))?o={}:m&&(o=l(o)),c(o[p])||s(o,p,(function(){return this})),e.exports={IteratorPrototype:o,BUGGY_SAFARI_ITERATORS:f}},53481:function(e){"use strict";e.exports={}},10950:function(e,t,n){"use strict";var o=n(87543);e.exports=function(e){return o(e.length)}},28859:function(e,t,n){"use strict";var o=n(39125),r=n(45744),a=n(77807),i=n(77849),c=n(82429).CONFIGURABLE,l=n(44790),d=n(48797),s=d.enforce,u=d.get,m=Object.defineProperty,p=i&&!o((function(){return 8!==m((function(){}),"length",{value:8}).length})),f=String(String).split("String"),h=e.exports=function(e,t,n){"Symbol("===String(t).slice(0,7)&&(t="["+String(t).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),n&&n.getter&&(t="get "+t),n&&n.setter&&(t="set "+t),(!a(e,"name")||c&&e.name!==t)&&m(e,"name",{value:t,configurable:!0}),p&&n&&a(n,"arity")&&e.length!==n.arity&&m(e,"length",{value:n.arity});try{n&&a(n,"constructor")&&n.constructor?i&&m(e,"prototype",{writable:!1}):e.prototype&&(e.prototype=undefined)}catch(r){}var o=s(e);return a(o,"source")||(o.source=f.join("string"==typeof t?t:"")),e};Function.prototype.toString=h((function(){return r(this)&&u(this).source||l(this)}),"toString")},73346:function(e){"use strict";var t=Math.expm1,n=Math.exp;e.exports=!t||t(10)>22025.465794806718||t(10)<22025.465794806718||-2e-17!=t(-2e-17)?function(e){var t=+e;return 0==t?t:t>-1e-6&&t<1e-6?t+t*t/2:n(t)-1}:t},92647:function(e,t,n){"use strict";var o=n(61303),r=Math.abs,a=Math.pow,i=a(2,-52),c=a(2,-23),l=a(2,127)*(2-c),d=a(2,-126);e.exports=Math.fround||function(e){var t,n,a=+e,s=r(a),u=o(a);return sl||n!=n?u*Infinity:u*n}},12153:function(e){"use strict";var t=Math.log,n=Math.LOG10E;e.exports=Math.log10||function(e){return t(e)*n}},28010:function(e){"use strict";var t=Math.log;e.exports=Math.log1p||function(e){var n=+e;return n>-1e-8&&n<1e-8?n-n*n/2:t(1+n)}},61303:function(e){"use strict";e.exports=Math.sign||function(e){var t=+e;return 0==t||t!=t?t:t<0?-1:1}},9275:function(e){"use strict";var t=Math.ceil,n=Math.floor;e.exports=Math.trunc||function(e){var o=+e;return(o>0?n:t)(o)}},34063:function(e,t,n){"use strict";var o,r,a,i,c,l,d,s,u=n(61770),m=n(9341),p=n(12488).f,f=n(61777).set,h=n(25515),C=n(48715),b=n(35016),N=n(67745),g=u.MutationObserver||u.WebKitMutationObserver,V=u.document,v=u.process,_=u.Promise,y=p(u,"queueMicrotask"),k=y&&y.value;k||(o=function(){var e,t;for(N&&(e=v.domain)&&e.exit();r;){t=r.fn,r=r.next;try{t()}catch(n){throw r?i():a=undefined,n}}a=undefined,e&&e.enter()},h||N||b||!g||!V?!C&&_&&_.resolve?((d=_.resolve(undefined)).constructor=_,s=m(d.then,d),i=function(){s(o)}):N?i=function(){v.nextTick(o)}:(f=m(f,u),i=function(){f(o)}):(c=!0,l=V.createTextNode(""),new g(o).observe(l,{characterData:!0}),i=function(){l.data=c=!c})),e.exports=k||function(e){var t={fn:e,next:undefined};a&&(a.next=t),r||(r=t,i()),a=t}},58822:function(e,t,n){"use strict";var o=n(67581);e.exports=o&&!!Symbol["for"]&&!!Symbol.keyFor},67581:function(e,t,n){"use strict";var o=n(64279),r=n(39125);e.exports=!!Object.getOwnPropertySymbols&&!r((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&o&&o<41}))},37494:function(e,t,n){"use strict";var o=n(61770),r=n(45744),a=n(44790),i=o.WeakMap;e.exports=r(i)&&/native code/.test(a(i))},16002:function(e,t,n){"use strict";var o=n(7696),r=function(e){var t,n;this.promise=new e((function(e,o){if(t!==undefined||n!==undefined)throw TypeError("Bad Promise constructor");t=e,n=o})),this.resolve=o(t),this.reject=o(n)};e.exports.f=function(e){return new r(e)}},96794:function(e,t,n){"use strict";var o=n(71857),r=TypeError;e.exports=function(e){if(o(e))throw r("The method doesn't accept regular expressions");return e}},46329:function(e,t,n){"use strict";var o=n(61770).isFinite;e.exports=Number.isFinite||function(e){return"number"==typeof e&&o(e)}},90119:function(e,t,n){"use strict";var o=n(61770),r=n(39125),a=n(90655),i=n(95372),c=n(56404).trim,l=n(93966),d=a("".charAt),s=o.parseFloat,u=o.Symbol,m=u&&u.iterator,p=1/s(l+"-0")!=-Infinity||m&&!r((function(){s(Object(m))}));e.exports=p?function(e){var t=c(i(e)),n=s(t);return 0===n&&"-"==d(t,0)?-0:n}:s},80280:function(e,t,n){"use strict";var o=n(61770),r=n(39125),a=n(90655),i=n(95372),c=n(56404).trim,l=n(93966),d=o.parseInt,s=o.Symbol,u=s&&s.iterator,m=/^[+-]?0x/i,p=a(m.exec),f=8!==d(l+"08")||22!==d(l+"0x16")||u&&!r((function(){d(Object(u))}));e.exports=f?function(e,t){var n=c(i(e));return d(n,t>>>0||(p(m,n)?16:10))}:d},35350:function(e,t,n){"use strict";var o=n(77849),r=n(90655),a=n(76348),i=n(39125),c=n(21417),l=n(41543),d=n(89328),s=n(73502),u=n(83609),m=Object.assign,p=Object.defineProperty,f=r([].concat);e.exports=!m||i((function(){if(o&&1!==m({b:1},m(p({},"a",{enumerable:!0,get:function(){p(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach((function(e){t[e]=e})),7!=m({},e)[n]||c(m({},t)).join("")!=r}))?function(e,t){for(var n=s(e),r=arguments.length,i=1,m=l.f,p=d.f;r>i;)for(var h,C=u(arguments[i++]),b=m?f(c(C),m(C)):c(C),N=b.length,g=0;N>g;)h=b[g++],o&&!a(p,C,h)||(n[h]=C[h]);return n}:m},48525:function(e,t,n){"use strict";var o,r=n(65522),a=n(86328),i=n(59096),c=n(31645),l=n(29093),d=n(50842),s=n(95541),u=s("IE_PROTO"),m=function(){},p=function(e){return"