diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index f50c765385a6..a6b4289fe7db 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -6295,27 +6295,6 @@
},
/turf/open/floor/plasteel,
/area/commons/dorms)
-"auS" = (
-/obj/machinery/requests_console{
- announcementConsole = 1;
- department = "Cargo Bay";
- departmentType = 2;
- pixel_x = -30
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/machinery/keycard_auth{
- pixel_y = 25
- },
-/turf/open/floor/plasteel,
-/area/cargo/qm)
"auT" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -31646,13 +31625,6 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
-"bUv" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
"bUx" = (
/obj/structure/disposalpipe/junction/yjunction{
dir = 1
@@ -34769,13 +34741,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall,
/area/maintenance/starboard/aft)
-"ccV" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
"ccW" = (
/obj/effect/decal/cleanable/blood/old,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -37852,12 +37817,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/maintenance/aft)
-"cln" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
"clo" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
@@ -45837,6 +45796,14 @@
},
/turf/open/floor/carpet,
/area/medical/psychology)
+"eRu" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"eRz" = (
/obj/structure/lattice,
/obj/structure/grille,
@@ -47612,6 +47579,13 @@
},
/turf/open/floor/plating,
/area/service/kitchen)
+"gop" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port)
"got" = (
/obj/structure/closet,
/obj/item/poster/random_contraband,
@@ -49881,6 +49855,10 @@
},
/turf/open/floor/plasteel/dark,
/area/security/prison)
+"isC" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/wood/wood_large,
+/area/service/abandoned_gambling_den)
"itD" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -50424,6 +50402,11 @@
},
/turf/open/floor/plasteel,
/area/security/prison/upper)
+"iVB" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
"iVH" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -51430,6 +51413,14 @@
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"jJq" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"jJC" = (
/obj/machinery/computer/arcade/battle,
/obj/structure/window{
@@ -51772,6 +51763,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"kai" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating{
+ icon_state = "platingdmg1"
+ },
+/area/maintenance/starboard/aft)
"kaq" = (
/turf/closed/wall/mineral/titanium,
/area/space/nearstation)
@@ -52446,6 +52443,10 @@
},
/turf/open/floor/wood,
/area/service/theater)
+"kEe" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/aft)
"kEm" = (
/mob/living/simple_animal/opossum/poppy,
/turf/open/floor/plating,
@@ -52562,6 +52563,12 @@
},
/turf/open/floor/plating,
/area/maintenance/fore)
+"kJl" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/maintenance/starboard/fore)
"kJE" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
@@ -54347,6 +54354,30 @@
},
/turf/open/floor/plasteel,
/area/security/prison/upper)
+"mlG" = (
+/obj/machinery/requests_console{
+ announcementConsole = 1;
+ department = "Cargo Bay";
+ departmentType = 2;
+ pixel_x = -30
+ },
+/obj/effect/turf_decal/tile/brown{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/brown{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/brown{
+ dir = 8
+ },
+/obj/machinery/keycard_auth{
+ pixel_y = 25
+ },
+/obj/machinery/computer/bounty{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/cargo/qm)
"mml" = (
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -58126,6 +58157,13 @@
},
/turf/open/floor/plasteel/dark,
/area/security/prison)
+"pJP" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/aft)
"pKV" = (
/turf/closed/wall/r_wall,
/area/science/research)
@@ -58713,6 +58751,10 @@
/obj/item/toy/plush/random,
/turf/open/floor/carpet/blue,
/area/medical/psychology)
+"qlD" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
"qlV" = (
/obj/item/mop{
name = "Ain't Much"
@@ -62909,6 +62951,10 @@
/obj/item/smithing/stundild,
/turf/open/floor/plasteel/dark,
/area/security/warden)
+"tZZ" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"uaw" = (
/obj/machinery/power/apc{
areastring = "/area/maintenance/bar";
@@ -62935,6 +62981,15 @@
},
/turf/open/floor/wood/wood_large,
/area/service/chapel/main)
+"ubP" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/computer/bounty{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/cargo/office)
"udT" = (
/obj/machinery/atmospherics/pipe/manifold/purple/visible,
/turf/open/floor/plasteel,
@@ -66422,6 +66477,10 @@
/obj/structure/lattice,
/turf/open/space,
/area/space)
+"xdq" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"xdQ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -81223,7 +81282,7 @@ lPA
alU
ugq
rMh
-ayy
+iVB
aAe
aBJ
aCs
@@ -81983,7 +82042,7 @@ aaf
aaf
alU
arO
-amC
+qlD
aom
ank
auT
@@ -83304,7 +83363,7 @@ bbI
bcK
aPz
bdB
-aWv
+gop
bfh
aPz
aPz
@@ -86620,7 +86679,7 @@ amC
uBf
amC
aKY
-amC
+qlD
aAY
aBQ
aDp
@@ -87445,7 +87504,7 @@ aaa
bCq
bHE
bHE
-bHE
+xdq
bHE
bCq
bVy
@@ -87943,7 +88002,7 @@ bjr
bjr
bub
bxu
-auS
+mlG
bzP
bAS
bxu
@@ -88490,7 +88549,7 @@ bCq
cqn
cAh
chT
-bHE
+xdq
bHE
ckv
bHE
@@ -90014,7 +90073,7 @@ aoV
aoV
bLv
bPZ
-bHE
+xdq
bHE
cTF
bHE
@@ -90509,7 +90568,7 @@ bnG
bnz
bpA
bbR
-bkM
+ubP
jlm
bud
eyM
@@ -91816,7 +91875,7 @@ bLv
aaa
aaa
bTB
-bUv
+eRu
bES
bES
bES
@@ -105953,7 +106012,7 @@ bMa
bTZ
bKH
bzs
-bAw
+kEe
bXZ
bHX
bZN
@@ -108024,7 +108083,7 @@ cbK
ciG
bLS
ckm
-cln
+pJP
cmh
cnd
cnE
@@ -109744,7 +109803,7 @@ apC
aqy
anf
anf
-aty
+kJl
auF
alP
aAt
@@ -113853,7 +113912,7 @@ wKe
hda
hda
hda
-hda
+isC
qbq
asB
atD
@@ -114709,7 +114768,7 @@ diq
clr
bnt
cOe
-cOe
+tZZ
bMB
cOT
aaa
@@ -118809,7 +118868,7 @@ cNW
rSf
cNW
wly
-ccV
+jJq
noa
iQg
ccU
@@ -119053,7 +119112,7 @@ vHY
bEs
rmX
xIa
-vxh
+kai
cOe
bPP
bPP
diff --git a/_maps/map_files/BoxedInStation/BoxedInStation.dmm b/_maps/map_files/BoxedInStation/BoxedInStation.dmm
index 8a2762bbe761..ef3fdc288418 100644
--- a/_maps/map_files/BoxedInStation/BoxedInStation.dmm
+++ b/_maps/map_files/BoxedInStation/BoxedInStation.dmm
@@ -10914,7 +10914,7 @@
/area/service/kitchen)
"fGo" = (
/obj/machinery/vending/dinnerware{
- contraband = list(/obj/item/kitchen/rollingpin = 2, /obj/item/kitchen/knife/butcher = 2, /obj/item/reagent_containers/food/condiment/flour = 4)
+ contraband = list(/obj/item/kitchen/rollingpin=2,/obj/item/kitchen/knife/butcher=2,/obj/item/reagent_containers/food/condiment/flour=4)
},
/obj/machinery/power/apc{
areastring = "/area/service/kitchen";
@@ -13326,11 +13326,11 @@
/area/service/bar)
"gUI" = (
/obj/machinery/vending/dinnerware{
- contraband = list(/obj/item/reagent_containers/food/condiment/flour = 4);
+ contraband = list(/obj/item/reagent_containers/food/condiment/flour=4);
desc = "This vendor is full of condiments to put on food.";
name = "\improper Condiments Vendor";
product_ads = "Get your sauces here!;No slave labour was used to make these products!;Nanotrasen Approved?!";
- products = list(/obj/item/storage/bag/tray = 8, /obj/item/reagent_containers/food/drinks/drinkingglass = 10, /obj/item/storage/box/cups = 5, /obj/item/reagent_containers/food/condiment/pack/ketchup = 20, /obj/item/reagent_containers/food/condiment/pack/mustard = 20, /obj/item/reagent_containers/food/condiment/pack/hotsauce = 20, /obj/item/reagent_containers/food/condiment/pack/astrotame = 20, /obj/item/reagent_containers/food/condiment/saltshaker = 20, /obj/item/reagent_containers/food/condiment/peppermill = 20)
+ products = list(/obj/item/storage/bag/tray=8,/obj/item/reagent_containers/food/drinks/drinkingglass=10,/obj/item/storage/box/cups=5,/obj/item/reagent_containers/food/condiment/pack/ketchup=20,/obj/item/reagent_containers/food/condiment/pack/mustard=20,/obj/item/reagent_containers/food/condiment/pack/hotsauce=20,/obj/item/reagent_containers/food/condiment/pack/astrotame=20,/obj/item/reagent_containers/food/condiment/saltshaker=20,/obj/item/reagent_containers/food/condiment/peppermill=20)
},
/turf/open/floor/plasteel/cafeteria,
/area/service/kitchen)
@@ -18857,6 +18857,10 @@
},
/turf/open/floor/plating,
/area/hallway/secondary/exit)
+"jMk" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
"jMy" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -31800,6 +31804,10 @@
},
/turf/open/floor/plasteel,
/area/engineering/main)
+"qyg" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/central/secondary)
"qyp" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -46274,6 +46282,13 @@
dir = 4
},
/area/service/theater)
+"xIk" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
"xIu" = (
/obj/effect/spawner/structure/window,
/obj/machinery/door/firedoor,
@@ -66642,7 +66657,7 @@ kED
kED
gXk
dQv
-lRs
+jMk
gXk
kED
cwy
@@ -68912,7 +68927,7 @@ oCD
mhf
nzv
lRs
-dQv
+xIk
lRs
seE
qaQ
@@ -70455,7 +70470,7 @@ vBu
vBu
cTZ
aye
-mjY
+qyg
mjY
jzy
mjY
@@ -73255,7 +73270,7 @@ nOA
pAn
mjY
kZA
-mjY
+qyg
mjY
rTW
aye
diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm
index cf2c4a53bab5..f85f83092bbc 100644
--- a/_maps/map_files/CogStation/CogStation.dmm
+++ b/_maps/map_files/CogStation/CogStation.dmm
@@ -1678,12 +1678,6 @@
},
/turf/open/floor/plasteel,
/area/commons/lounge)
-"aen" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/fore)
"aeo" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/circuitboard/machine/sleeper,
@@ -5124,20 +5118,6 @@
},
/turf/open/floor/carpet/arcade,
/area/commons/arcade)
-"ani" = (
-/obj/machinery/disposal/bin,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/structure/sign/poster/official/bless_this_spess{
- pixel_y = -32
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"anj" = (
/obj/machinery/holopad,
/obj/effect/turf_decal/bot,
@@ -68150,6 +68130,13 @@
/obj/machinery/atmospherics/pipe/layer_manifold,
/turf/open/floor/plating,
/area/engineering/atmos)
+"dXW" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"dYm" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/obj/effect/turf_decal/stripes/line{
@@ -68888,6 +68875,10 @@
/obj/structure/chair/stool,
/turf/open/floor/plasteel,
/area/cargo/office)
+"iEf" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/central)
"iLw" = (
/obj/machinery/door/airlock/security/glass{
name = "Advanced Interrogation"
@@ -69175,6 +69166,16 @@
},
/turf/open/floor/plating,
/area/cargo/storage)
+"kPi" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"kTm" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/landmark/start/prisoner,
@@ -69337,6 +69338,20 @@
},
/turf/closed/wall/mineral/wood,
/area/commons/fitness/cogpool)
+"maU" = (
+/obj/machinery/disposal/bin,
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/obj/structure/sign/poster/official/bless_this_spess{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"mfj" = (
/obj/machinery/firealarm{
pixel_y = 26
@@ -70601,6 +70616,15 @@
},
/turf/open/floor/plasteel,
/area/cargo/storage)
+"ulg" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
"unW" = (
/obj/effect/landmark/navigate_destination/med,
/turf/open/floor/plasteel/white,
@@ -70978,6 +71002,13 @@
/obj/structure/filingcabinet,
/turf/open/floor/carpet,
/area/medical/psychology)
+"wUe" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 9
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"wUI" = (
/obj/effect/turf_decal/tile/neutral,
/obj/structure/table,
@@ -71172,6 +71203,16 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
+"xWP" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"xXs" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -95231,7 +95272,7 @@ adb
anU
aeQ
aeM
-ani
+maU
aew
aeJ
aeJ
@@ -98104,7 +98145,7 @@ aQL
aQL
aQL
aTS
-aRW
+iEf
bcR
bjG
blk
@@ -98581,7 +98622,7 @@ amS
amS
aDE
amS
-amS
+ulg
aKR
apY
bRa
@@ -103448,7 +103489,7 @@ hzz
aaa
acb
acS
-aen
+wUe
afi
agg
ahj
@@ -107053,7 +107094,7 @@ ajw
ajw
ajw
awN
-bGc
+xWP
bGl
ahA
aiQ
@@ -111936,7 +111977,7 @@ ahP
ahP
akj
ahP
-aif
+kPi
aiB
afK
ahU
@@ -113319,7 +113360,7 @@ bqM
btL
bBm
btC
-bPm
+dXW
bta
btV
cfG
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 9913253ba6be..8c11405f4151 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -70379,6 +70379,20 @@
/obj/effect/turf_decal/caution/stand_clear,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
+"ehA" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plasteel,
+/area/maintenance/starboard/aft)
"ehG" = (
/obj/item/radio/intercom{
name = "Station Intercom";
@@ -77296,27 +77310,6 @@
},
/turf/open/floor/plasteel,
/area/cargo/storage)
-"gFF" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/newscaster{
- pixel_y = -32
- },
-/obj/item/radio/intercom{
- dir = 8;
- name = "Station Intercom (General)";
- pixel_x = 28
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/cargo/office)
"gFG" = (
/obj/machinery/door/airlock/maintenance_hatch{
name = "Maintenance Hatch";
@@ -82289,6 +82282,12 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/service/abandoned_gambling_den)
+"ijo" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"ijN" = (
/obj/structure/table/wood,
/obj/machinery/computer/med_data/laptop,
@@ -91624,25 +91623,6 @@
/obj/effect/turf_decal/vg_decals/atmos/plasma,
/turf/open/floor/engine/plasma,
/area/engineering/atmos)
-"lkx" = (
-/obj/machinery/requests_console{
- department = "Quartermaster's Desk";
- name = "Quartermaster RC";
- pixel_x = 32;
- pixel_y = -32
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/light_switch{
- pixel_x = 23
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/cargo/qm)
"lkF" = (
/obj/structure/closet/secure_closet/engineering_electrical,
/obj/machinery/light_switch{
@@ -109280,6 +109260,30 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/service/hydroponics/garden/abandoned)
+"rpU" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/newscaster{
+ pixel_y = -32
+ },
+/obj/item/radio/intercom{
+ dir = 8;
+ name = "Station Intercom (General)";
+ pixel_x = 28
+ },
+/obj/effect/turf_decal/tile/brown,
+/obj/effect/turf_decal/tile/brown{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/brown{
+ dir = 8
+ },
+/obj/machinery/computer/bounty{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/cargo/office)
"rpV" = (
/obj/machinery/status_display/evac,
/turf/closed/wall,
@@ -112599,6 +112603,28 @@
/obj/structure/lattice/catwalk,
/turf/open/space,
/area/solars/starboard/aft)
+"stl" = (
+/obj/machinery/requests_console{
+ department = "Quartermaster's Desk";
+ name = "Quartermaster RC";
+ pixel_x = 32;
+ pixel_y = -32
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/light_switch{
+ pixel_x = 23
+ },
+/obj/effect/turf_decal/tile/brown,
+/obj/effect/turf_decal/tile/brown{
+ dir = 4
+ },
+/obj/machinery/computer/bounty{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/cargo/qm)
"sts" = (
/obj/structure/table/wood,
/obj/item/folder,
@@ -114990,6 +115016,20 @@
},
/turf/open/floor/plasteel,
/area/maintenance/port/fore)
+"til" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plasteel,
+/area/maintenance/starboard)
"tin" = (
/obj/machinery/light{
dir = 1
@@ -123172,6 +123212,15 @@
},
/turf/open/floor/plasteel,
/area/commons/dorms)
+"whu" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"whB" = (
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
@@ -171324,7 +171373,7 @@ nOU
tnL
xRR
hbT
-gFF
+rpU
vhK
bdV
bdU
@@ -173658,7 +173707,7 @@ aaa
aad
aaa
bHq
-bJb
+til
bHq
rNA
poQ
@@ -175948,7 +175997,7 @@ sOq
keW
fJF
lgx
-lkx
+stl
vdx
sOq
aad
@@ -178850,7 +178899,7 @@ dkG
dmf
dnL
dpE
-dpE
+ehA
dsS
dtV
dvK
@@ -179091,13 +179140,13 @@ gTM
vrH
fzU
cPP
-cRr
+ijo
cRr
cUU
cWB
cYf
cZR
-dbB
+whu
dbB
deM
dfN
diff --git a/_maps/map_files/FestiveBall/FestiveStation.dmm b/_maps/map_files/FestiveBall/FestiveStation.dmm
index be7263f8c4a5..feb2ee2f1373 100644
--- a/_maps/map_files/FestiveBall/FestiveStation.dmm
+++ b/_maps/map_files/FestiveBall/FestiveStation.dmm
@@ -2634,36 +2634,11 @@
/obj/machinery/light/floor,
/turf/open/floor/festive/wooden/wooden1,
/area/command/corporate_showroom)
-"agT" = (
-/obj/structure/table/wood/fancy/green,
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/item/clothing/under/syndicate/baseball,
-/obj/item/clothing/head/beret/sec{
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0);
- desc = "A replica beret resembling that of a special operations officer under Nanotrasen.";
- name = "replica officer's beret"
- },
-/turf/open/floor/festive/wooden/wooden1,
-/area/command/corporate_showroom)
"agU" = (
/obj/structure/showcase/mecha/marauder,
/obj/machinery/light/floor,
/turf/open/floor/festive/wooden/wooden1,
/area/command/corporate_showroom)
-"agV" = (
-/obj/structure/table/wood/fancy/red,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/item/clothing/head/centhat{
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0);
- desc = "A replica hat of a Central Commander's attire. It has a small tag on it saying, 'It's good to be emperor.'";
- name = "Replica CentCom hat"
- },
-/turf/open/floor/festive/wooden/wooden1,
-/area/command/corporate_showroom)
"agW" = (
/obj/structure/table/wood/fancy/green,
/obj/item/folder/blue,
@@ -20379,13 +20354,6 @@
},
/turf/open/floor/festive/alleyway,
/area/edina/street/secondary/command)
-"baX" = (
-/obj/machinery/computer/prisoner/management,
-/obj/structure/sign/poster/official/bless_this_spess{
- pixel_y = 32
- },
-/turf/open/floor/wood,
-/area/security/warden)
"baY" = (
/obj/effect/landmark/start/botanist,
/turf/open/floor/plasteel,
@@ -35552,14 +35520,6 @@
},
/turf/open/floor/wood,
/area/service/bar/atrium)
-"bKt" = (
-/obj/machinery/vending/dinnerware{
- desc = "A vending machine stocked full of condiments to put on food.";
- name = "\improper Condiments Dispenser";
- products = list(/obj/item/storage/bag/tray = 10, /obj/item/kitchen/fork = 6, /obj/item/kitchen/knife = 6, /obj/item/reagent_containers/food/drinks/drinkingglass = 20, /obj/item/clothing/suit/apron/chef = 2, /obj/item/storage/box/cups = 10, /obj/item/reagent_containers/food/condiment/pack/ketchup = 20, /obj/item/reagent_containers/food/condiment/pack/mustard = 20, /obj/item/reagent_containers/food/condiment/pack/hotsauce = 20, /obj/item/reagent_containers/food/condiment/pack/astrotame = 20, /obj/item/reagent_containers/food/condiment/saltshaker = 20, /obj/item/reagent_containers/food/condiment/peppermill = 20, /obj/item/reagent_containers/glass/bowl = 30)
- },
-/turf/open/floor/wood,
-/area/service/bar/atrium)
"bKu" = (
/obj/structure/chair/sofa/right{
dir = 4
@@ -35852,10 +35812,6 @@
/obj/structure/fence,
/turf/open/floor/plating/dirt/space,
/area/edina)
-"bKZ" = (
-/obj/effect/festive/street/sidewalke,
-/turf/open/floor/festive/cobblestone,
-/area/edina/street/primary/progress)
"bLa" = (
/obj/effect/turf_decal/weather/snow/corner{
dir = 1
@@ -43300,53 +43256,6 @@
/obj/structure/reagent_dispensers/keg/milk,
/turf/open/floor/plasteel/freezer,
/area/service/kitchen/coldroom)
-"cbt" = (
-/obj/structure/closet/crate/freezer{
- desc = "A small crate with a cooling system, keeps fresh produce chilled.";
- name = "Food Chiller"
- },
-/obj/item/reagent_containers/food/condiment/flour{
- desc = "A large sack of flour for restaurants, not the home-baker!";
- list_reagents = list(/datum/reagent/consumable/flour = 90);
- name = "Large Flour Sack"
- },
-/obj/item/reagent_containers/food/condiment/flour{
- desc = "A large sack of flour for restaurants, not the home-baker!";
- list_reagents = list(/datum/reagent/consumable/flour = 90);
- name = "Large Flour Sack"
- },
-/obj/item/reagent_containers/food/condiment/flour{
- desc = "A large sack of flour for restaurants, not the home-baker!";
- list_reagents = list(/datum/reagent/consumable/flour = 90);
- name = "Large Flour Sack"
- },
-/obj/item/reagent_containers/food/condiment/flour{
- desc = "A large sack of flour for restaurants, not the home-baker!";
- list_reagents = list(/datum/reagent/consumable/flour = 90);
- name = "Large Flour Sack"
- },
-/obj/item/reagent_containers/food/condiment/rice{
- desc = "A huge sack of rice. Probably for restaurants that actually go through such a huge volume of it easily, not for the home cook.";
- list_reagents = list(/datum/reagent/consumable/rice = 90);
- name = "Large Rice Sack"
- },
-/obj/item/reagent_containers/food/condiment/rice{
- desc = "A huge sack of rice. Probably for restaurants that actually go through such a huge volume of it easily, not for the home cook.";
- list_reagents = list(/datum/reagent/consumable/rice = 90);
- name = "Large Rice Sack"
- },
-/obj/item/reagent_containers/food/condiment/rice{
- desc = "A huge sack of rice. Probably for restaurants that actually go through such a huge volume of it easily, not for the home cook.";
- list_reagents = list(/datum/reagent/consumable/rice = 90);
- name = "Large Rice Sack"
- },
-/obj/item/reagent_containers/food/condiment/rice{
- desc = "A huge sack of rice. Probably for restaurants that actually go through such a huge volume of it easily, not for the home cook.";
- list_reagents = list(/datum/reagent/consumable/rice = 90);
- name = "Large Rice Sack"
- },
-/turf/open/floor/plasteel/freezer,
-/area/service/kitchen/coldroom)
"cbu" = (
/obj/structure/sign/poster/official/twelve_gauge{
pixel_y = 32
@@ -53426,6 +53335,13 @@
},
/turf/open/floor/wood,
/area/maintenance/bar)
+"dny" = (
+/obj/machinery/computer/prisoner/management,
+/obj/structure/sign/poster/official/bless_this_spess{
+ pixel_y = 32
+ },
+/turf/open/floor/wood,
+/area/security/warden)
"dnQ" = (
/mob/living/simple_animal/pet/penguin/emperor/shamebrero,
/turf/open/floor/holofloor/ice,
@@ -54049,6 +53965,53 @@
/obj/effect/decal/festive/christmas_ivy_string,
/turf/open/floor/circuit/off,
/area/science)
+"hGn" = (
+/obj/structure/closet/crate/freezer{
+ desc = "A small crate with a cooling system, keeps fresh produce chilled.";
+ name = "Food Chiller"
+ },
+/obj/item/reagent_containers/food/condiment/flour{
+ desc = "A large sack of flour for restaurants, not the home-baker!";
+ list_reagents = list(/datum/reagent/consumable/flour=90);
+ name = "Large Flour Sack"
+ },
+/obj/item/reagent_containers/food/condiment/flour{
+ desc = "A large sack of flour for restaurants, not the home-baker!";
+ list_reagents = list(/datum/reagent/consumable/flour=90);
+ name = "Large Flour Sack"
+ },
+/obj/item/reagent_containers/food/condiment/flour{
+ desc = "A large sack of flour for restaurants, not the home-baker!";
+ list_reagents = list(/datum/reagent/consumable/flour=90);
+ name = "Large Flour Sack"
+ },
+/obj/item/reagent_containers/food/condiment/flour{
+ desc = "A large sack of flour for restaurants, not the home-baker!";
+ list_reagents = list(/datum/reagent/consumable/flour=90);
+ name = "Large Flour Sack"
+ },
+/obj/item/reagent_containers/food/condiment/rice{
+ desc = "A huge sack of rice. Probably for restaurants that actually go through such a huge volume of it easily, not for the home cook.";
+ list_reagents = list(/datum/reagent/consumable/rice=90);
+ name = "Large Rice Sack"
+ },
+/obj/item/reagent_containers/food/condiment/rice{
+ desc = "A huge sack of rice. Probably for restaurants that actually go through such a huge volume of it easily, not for the home cook.";
+ list_reagents = list(/datum/reagent/consumable/rice=90);
+ name = "Large Rice Sack"
+ },
+/obj/item/reagent_containers/food/condiment/rice{
+ desc = "A huge sack of rice. Probably for restaurants that actually go through such a huge volume of it easily, not for the home cook.";
+ list_reagents = list(/datum/reagent/consumable/rice=90);
+ name = "Large Rice Sack"
+ },
+/obj/item/reagent_containers/food/condiment/rice{
+ desc = "A huge sack of rice. Probably for restaurants that actually go through such a huge volume of it easily, not for the home cook.";
+ list_reagents = list(/datum/reagent/consumable/rice=90);
+ name = "Large Rice Sack"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/service/kitchen/coldroom)
"hHy" = (
/obj/structure/closet/crate,
/obj/item/storage/fancy/candle_box,
@@ -54105,6 +54068,10 @@
/obj/effect/turf_decal/weather/snow/corner,
/turf/open/floor/festive/sidewalk,
/area/edina)
+"hVw" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/festive/cobblestone,
+/area/edina/street/primary/progress)
"hXd" = (
/obj/vehicle/ridden/janicart,
/obj/item/key/janitor,
@@ -54927,6 +54894,19 @@
/mob/living/simple_animal/pet/fox,
/turf/open/floor/grass,
/area/edina)
+"nNk" = (
+/obj/structure/table/wood/fancy/green,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/item/clothing/under/syndicate/baseball,
+/obj/item/clothing/head/beret/sec{
+ armor = list("melee"=0,"bullet"=0,"laser"=0,"energy"=0,"bomb"=0,"bio"=0,"rad"=0);
+ desc = "A replica beret resembling that of a special operations officer under Nanotrasen.";
+ name = "replica officer's beret"
+ },
+/turf/open/floor/festive/wooden/wooden1,
+/area/command/corporate_showroom)
"nOZ" = (
/turf/closed/wall/r_wall,
/area/engineering/engine_smes)
@@ -55019,6 +54999,14 @@
/obj/structure/fireplace,
/turf/open/floor/wood,
/area/commons/dorms)
+"ooy" = (
+/obj/machinery/vending/dinnerware{
+ desc = "A vending machine stocked full of condiments to put on food.";
+ name = "\improper Condiments Dispenser";
+ products = list(/obj/item/storage/bag/tray=10,/obj/item/kitchen/fork=6,/obj/item/kitchen/knife=6,/obj/item/reagent_containers/food/drinks/drinkingglass=20,/obj/item/clothing/suit/apron/chef=2,/obj/item/storage/box/cups=10,/obj/item/reagent_containers/food/condiment/pack/ketchup=20,/obj/item/reagent_containers/food/condiment/pack/mustard=20,/obj/item/reagent_containers/food/condiment/pack/hotsauce=20,/obj/item/reagent_containers/food/condiment/pack/astrotame=20,/obj/item/reagent_containers/food/condiment/saltshaker=20,/obj/item/reagent_containers/food/condiment/peppermill=20,/obj/item/reagent_containers/glass/bowl=30)
+ },
+/turf/open/floor/wood,
+/area/service/bar/atrium)
"orN" = (
/obj/machinery/light/small,
/turf/open/floor/mineral/titanium/blue,
@@ -55219,6 +55207,11 @@
},
/turf/open/floor/wood,
/area/commons/dorms)
+"ptw" = (
+/obj/effect/festive/street/sidewalke,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/festive/cobblestone,
+/area/edina/street/primary/progress)
"pwQ" = (
/obj/structure/table/wood,
/obj/item/phone,
@@ -55289,6 +55282,10 @@
/obj/machinery/light/small,
/turf/open/floor/plasteel/dark,
/area/service/hydroponics)
+"pPZ" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/festive/alleyway,
+/area/science)
"pQk" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -56245,6 +56242,10 @@
/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plasteel,
/area/edina)
+"wjE" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/festive/sidewalk,
+/area/edina/street/primary/progress)
"wlp" = (
/obj/machinery/door/window/westleft{
dir = 2;
@@ -56570,6 +56571,18 @@
},
/turf/open/floor/grass/snow/edina,
/area/edina/backstreet/supply)
+"xOm" = (
+/obj/structure/table/wood/fancy/red,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/item/clothing/head/centhat{
+ armor = list("melee"=0,"bullet"=0,"laser"=0,"energy"=0,"bomb"=0,"bio"=0,"rad"=0);
+ desc = "A replica hat of a Central Commander's attire. It has a small tag on it saying, 'It's good to be emperor.'";
+ name = "Replica CentCom hat"
+ },
+/turf/open/floor/festive/wooden/wooden1,
+/area/command/corporate_showroom)
"xQh" = (
/obj/structure/table,
/obj/machinery/reagentgrinder{
@@ -86380,7 +86393,7 @@ cuQ
cuT
cuV
hya
-aKT
+pPZ
pqA
aLX
aLX
@@ -87079,7 +87092,7 @@ aeJ
afl
afl
ago
-agT
+nNk
ahu
afl
afl
@@ -87593,7 +87606,7 @@ aeJ
afl
afl
agq
-agV
+xOm
ahw
afl
afl
@@ -88691,7 +88704,7 @@ aOl
aQL
aMG
cuU
-bFg
+wjE
bQz
bTV
bVm
@@ -99240,7 +99253,7 @@ ccI
bFS
bHi
bIR
-bKt
+ooy
aqp
aqp
bFS
@@ -100723,7 +100736,7 @@ aoR
aLE
anQ
anl
-baX
+dny
arE
asS
atG
@@ -104140,7 +104153,7 @@ bWF
bWH
bWH
cdK
-cbt
+hGn
bTM
bKV
bWy
@@ -105914,7 +105927,7 @@ bAF
bAF
bAF
bAF
-bAF
+hVw
bAF
bWE
bFg
@@ -106166,7 +106179,7 @@ aPA
aQj
bAJ
bGa
-bKZ
+ptw
bAJ
bAJ
bAJ
@@ -107201,7 +107214,7 @@ bAF
bAF
bAF
bAF
-bAF
+hVw
bFg
ccD
bzs
@@ -107712,7 +107725,7 @@ bBU
bFg
bAF
bAF
-bAF
+hVw
bAF
bAF
bAF
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index 398bd92c8f99..1d316f8ad54b 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -8113,6 +8113,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
+/obj/effect/landmark/start/stowaway,
/turf/open/floor/plating{
icon_state = "platingdmg1"
},
@@ -10039,6 +10040,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/effect/landmark/start/stowaway,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"aqZ" = (
@@ -33122,6 +33124,7 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/landmark/start/stowaway,
/turf/open/floor/plating{
icon_state = "platingdmg1"
},
@@ -33229,6 +33232,7 @@
/obj/structure/cable{
icon_state = "1-4"
},
+/obj/effect/landmark/start/stowaway,
/turf/open/floor/plating{
icon_state = "platingdmg1"
},
@@ -51993,6 +51997,7 @@
pixel_y = -32
},
/obj/effect/decal/cleanable/dirt,
+/obj/effect/landmark/start/stowaway,
/turf/open/floor/plating{
icon_state = "panelscorched"
},
@@ -70940,6 +70945,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/effect/landmark/start/stowaway,
/turf/open/floor/plating{
icon_state = "panelscorched"
},
@@ -76941,6 +76947,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 6
},
+/obj/effect/landmark/start/stowaway,
/turf/open/floor/plating{
icon_state = "platingdmg1"
},
@@ -84438,6 +84445,13 @@
},
/turf/open/floor/plasteel/showroomfloor,
/area/ai_monitored/security/armory)
+"jIi" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/maintenance/port)
"jNK" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -84646,6 +84660,13 @@
icon_state = "wood-broken7"
},
/area/maintenance/port/fore)
+"kQV" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating{
+ icon_state = "platingdmg3"
+ },
+/area/maintenance/starboard/aft)
"kRh" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -85554,6 +85575,21 @@
/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
/turf/open/space/basic,
/area/space/nearstation)
+"tpQ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating{
+ icon_state = "platingdmg1"
+ },
+/area/maintenance/fore)
"tCi" = (
/obj/effect/decal/cleanable/glass,
/turf/open/floor/wood{
@@ -100308,7 +100344,7 @@ bhU
aEw
bxq
cux
-cnL
+jIi
awD
agp
bHg
@@ -116722,7 +116758,7 @@ alg
alU
cEX
apb
-cFf
+tpQ
cEh
ahh
ccU
@@ -122175,7 +122211,7 @@ bNU
bQE
bSz
bUU
-bGH
+kQV
bNh
awX
awO
diff --git a/_maps/map_files/LambdaStation/lambda.dmm b/_maps/map_files/LambdaStation/lambda.dmm
index 100f99b8a9e7..d843cd2eb1f2 100644
--- a/_maps/map_files/LambdaStation/lambda.dmm
+++ b/_maps/map_files/LambdaStation/lambda.dmm
@@ -67046,6 +67046,10 @@
},
/turf/open/floor/plasteel,
/area/science/mixing)
+"kGJ" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"kJN" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1,
/obj/structure/table,
@@ -70940,6 +70944,16 @@
},
/turf/open/floor/plasteel,
/area/maintenance/disposal/incinerator)
+"sdE" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"sfN" = (
/obj/machinery/light/small{
dir = 4
@@ -72146,6 +72160,13 @@
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
+"uKy" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"uKJ" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -91039,7 +91060,7 @@ aiI
avs
ahd
acw
-acw
+kGJ
acw
cUe
abY
@@ -96161,7 +96182,7 @@ aaA
aaA
aaA
abY
-acw
+kGJ
bJa
abY
ahd
@@ -99523,7 +99544,7 @@ cMf
atH
acw
acw
-acw
+kGJ
acw
acw
aeG
@@ -101584,7 +101605,7 @@ aaQ
aaQ
aaQ
aaQ
-acw
+kGJ
aeG
abY
aaA
@@ -102839,7 +102860,7 @@ aaA
aaA
aaA
abY
-acD
+sdE
acw
adu
aec
@@ -103129,7 +103150,7 @@ aaQ
aDg
aDg
aDg
-aeG
+uKy
acw
abY
aaA
@@ -104159,7 +104180,7 @@ bfS
aDg
aUL
cOb
-acw
+kGJ
aeH
adr
adr
@@ -108487,7 +108508,7 @@ abh
bjq
acw
afB
-acw
+kGJ
acw
acw
aoT
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 9d86501872ef..d96866553e84 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -3965,11 +3965,6 @@
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
/area/maintenance/fore)
-"amu" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"amv" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -18273,6 +18268,30 @@
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"buy" = (
+/obj/structure/noticeboard{
+ desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests.";
+ name = "requests board";
+ pixel_x = 32;
+ pixel_y = 32
+ },
+/obj/machinery/requests_console{
+ department = "Cargo Bay";
+ departmentType = 2;
+ pixel_y = 30
+ },
+/obj/effect/turf_decal/tile/brown{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/brown{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/brown{
+ dir = 8
+ },
+/obj/machinery/computer/bounty,
+/turf/open/floor/plasteel,
+/area/cargo/office)
"buK" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/disposalpipe/segment,
@@ -18629,16 +18648,6 @@
/obj/machinery/light/small,
/turf/open/floor/plasteel,
/area/security/prison/upper)
-"bvY" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
"bwh" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/extinguisher_cabinet{
@@ -23732,18 +23741,6 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard)
-"bYu" = (
-/obj/item/cigbutt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
"bYC" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -49914,6 +49911,14 @@
},
/turf/open/floor/plasteel/dark,
/area/engineering/storage/tech)
+"eAg" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port)
"eAn" = (
/obj/structure/cable/yellow{
icon_state = "1-8"
@@ -55002,29 +55007,6 @@
/obj/effect/landmark/start/peacekeeper,
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
-"hvk" = (
-/obj/structure/noticeboard{
- desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests.";
- name = "requests board";
- pixel_x = 32;
- pixel_y = 32
- },
-/obj/machinery/requests_console{
- department = "Cargo Bay";
- departmentType = 2;
- pixel_y = 30
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/cargo/office)
"hvn" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -58102,6 +58084,19 @@
},
/turf/open/floor/plating,
/area/engineering/atmos)
+"jcr" = (
+/obj/item/cigbutt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard)
"jcA" = (
/turf/open/floor/plating,
/area/engineering/break_room)
@@ -63951,21 +63946,6 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"mjR" = (
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/cargo/qm)
"mjX" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -65663,6 +65643,10 @@
dir = 1
},
/area/engineering/main)
+"nis" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"nix" = (
/obj/machinery/light/small{
dir = 8
@@ -66577,15 +66561,6 @@
/obj/structure/lattice/catwalk,
/turf/open/space,
/area/solars/starboard/fore)
-"nLT" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
"nMV" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
@@ -74551,6 +74526,17 @@
},
/turf/open/floor/plasteel/dark,
/area/command/teleporter)
+"rRh" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port)
"rRz" = (
/obj/item/storage/box/beakers{
pixel_x = 2;
@@ -78347,6 +78333,16 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/service/kitchen)
+"tWL" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard)
"tXp" = (
/obj/machinery/status_display/evac{
pixel_y = 32
@@ -79208,6 +79204,10 @@
},
/turf/open/floor/plating,
/area/engineering/main)
+"uum" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard)
"uun" = (
/obj/machinery/vending/assist,
/turf/open/floor/plasteel,
@@ -80800,6 +80800,19 @@
},
/turf/open/floor/plasteel/dark,
/area/engineering/atmos)
+"vtm" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"vtn" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -81630,6 +81643,22 @@
},
/turf/open/floor/plasteel,
/area/security/checkpoint/science/research)
+"vUG" = (
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/brown{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/brown{
+ dir = 4
+ },
+/obj/machinery/computer/bounty,
+/turf/open/floor/plasteel,
+/area/cargo/qm)
"vWf" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -85006,6 +85035,12 @@
},
/turf/open/floor/carpet,
/area/service/theater)
+"xCA" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"xCC" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/effect/decal/cleanable/dirt,
@@ -104884,7 +104919,7 @@ bnW
bqp
bsC
pzt
-bvY
+rRh
bxT
bzC
bzC
@@ -104897,7 +104932,7 @@ bzC
bzC
bzC
bPM
-bzC
+eAg
bzC
bSp
alC
@@ -106414,7 +106449,7 @@ aUj
aVN
aXn
aSX
-hvk
+buy
jSM
ikm
xhk
@@ -106919,7 +106954,7 @@ vwK
dne
aLc
dne
-mjR
+vUG
hDb
hMN
lYW
@@ -118785,7 +118820,7 @@ bZq
caG
abt
bSS
-ceZ
+vtm
cgo
cgo
cgo
@@ -120518,7 +120553,7 @@ ahS
aje
ajP
ald
-amu
+xCA
anE
aoQ
agq
@@ -123669,7 +123704,7 @@ caU
ccD
cdV
cfj
-apc
+uum
chC
dvY
dvY
@@ -124930,7 +124965,7 @@ bpc
dhQ
btw
buX
-nLT
+tWL
bGp
btw
dCV
@@ -125668,7 +125703,7 @@ bai
ate
dDL
axP
-dnS
+nis
ocS
pUr
lmt
@@ -126233,7 +126268,7 @@ apc
alq
alq
bXb
-bYu
+jcr
bZD
caY
ccI
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index da7fe90c31a3..0d44c8f23bc9 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -11905,17 +11905,6 @@
/obj/item/taperecorder,
/turf/open/floor/wood,
/area/security/detectives_office)
-"avI" = (
-/obj/structure/cable/white{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/turf/open/floor/plating{
- icon_state = "platingdmg1"
- },
-/area/maintenance/port/fore)
"avJ" = (
/obj/structure/cable/white{
icon_state = "4-8"
@@ -27894,15 +27883,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
/area/science/robotics/lab)
-"bai" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/turf/open/floor/plating{
- icon_state = "platingdmg1"
- },
-/area/maintenance/starboard)
"baj" = (
/obj/structure/sign/warning/vacuum{
pixel_x = -32;
@@ -29465,15 +29445,6 @@
},
/turf/open/floor/plating,
/area/security/checkpoint)
-"bdi" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
"bdj" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -34978,6 +34949,16 @@
dir = 4
},
/area/maintenance/starboard/aft)
+"dUm" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"dXv" = (
/obj/item/transfer_valve{
pixel_x = -5
@@ -35210,6 +35191,18 @@
/obj/item/pipe_dispenser,
/turf/open/floor/plasteel,
/area/engineering/atmos)
+"eTB" = (
+/obj/structure/cable/white{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating{
+ icon_state = "platingdmg1"
+ },
+/area/maintenance/port/fore)
"eUz" = (
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -35911,6 +35904,19 @@
},
/turf/open/floor/plasteel,
/area/service/bar/atrium)
+"huF" = (
+/obj/effect/turf_decal/tile/brown{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/brown,
+/obj/effect/turf_decal/tile/brown{
+ dir = 8
+ },
+/obj/machinery/computer/bounty{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/cargo/storage)
"hvC" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -37465,6 +37471,19 @@
},
/turf/open/floor/plasteel,
/area/science/mixing)
+"nud" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/green/line{
+ dir = 1
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"nvk" = (
/obj/structure/table/wood,
/turf/open/floor/wood,
@@ -37598,6 +37617,10 @@
},
/turf/open/floor/plating,
/area/science/mixing)
+"ohb" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
"ohM" = (
/obj/machinery/door/poddoor{
id = "toxinsdriver";
@@ -38226,16 +38249,6 @@
},
/turf/open/floor/plasteel,
/area/science/mixing)
-"qAY" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/cargo/storage)
"qEl" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
dir = 4
@@ -38314,6 +38327,18 @@
/obj/machinery/photocopier,
/turf/open/floor/wood,
/area/service/lawoffice)
+"qSk" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating{
+ icon_state = "platingdmg3"
+ },
+/area/maintenance/starboard/aft)
"qSs" = (
/turf/open/floor/plasteel/dark/side{
dir = 6
@@ -38423,6 +38448,16 @@
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
+"rzP" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating{
+ icon_state = "platingdmg1"
+ },
+/area/maintenance/starboard)
"rCw" = (
/obj/effect/turf_decal/tile/purple{
dir = 4
@@ -41901,6 +41936,14 @@
dir = 8
},
/area/engineering/atmos)
+"xbD" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"xdr" = (
/obj/effect/turf_decal/sand/plating,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -42084,6 +42127,16 @@
},
/turf/open/floor/plasteel/dark/corner,
/area/engineering/atmos)
+"xyZ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"xAj" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/effect/decal/cleanable/dirt,
@@ -75081,7 +75134,7 @@ ars
asI
atK
auD
-avI
+eTB
awM
axr
ayk
@@ -75836,7 +75889,7 @@ aAc
aAm
acH
acH
-ars
+ohb
swZ
ain
aqG
@@ -75881,7 +75934,7 @@ aKl
aKl
aFM
aFM
-aFM
+xbD
aKl
aFM
bbn
@@ -77426,7 +77479,7 @@ aDo
aKn
aLy
aFM
-aFM
+xbD
aPP
lFj
aSm
@@ -79745,7 +79798,7 @@ bcd
bcU
bdQ
aSh
-hIu
+nud
bfA
bfV
bgG
@@ -87909,7 +87962,7 @@ bcG
bcM
bcT
bym
-bdi
+dUm
bdF
bxw
aQU
@@ -88211,7 +88264,7 @@ aPy
aQA
sOM
sOU
-sOV
+xyZ
sKa
aVC
aWt
@@ -88435,7 +88488,7 @@ aiI
ajI
akL
alA
-qAY
+huF
ado
aoc
apc
@@ -88483,7 +88536,7 @@ bxW
bdw
bep
aZl
-sPI
+qSk
bfP
pej
bhi
@@ -88708,7 +88761,7 @@ oyD
sEl
sEL
aXb
-bai
+rzP
aSC
aYt
aRz
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 8ead601af43f..4c4d336cb273 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -36547,12 +36547,6 @@
},
/turf/open/floor/plasteel,
/area/science/mixing)
-"bIO" = (
-/obj/machinery/status_display/supply{
- pixel_x = -32
- },
-/turf/open/floor/plasteel,
-/area/cargo/office)
"bIP" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -48209,6 +48203,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
+"cqr" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/department/cargo)
"cqs" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -49672,6 +49670,13 @@
},
/turf/open/floor/plating,
/area/maintenance/department/chapel/monastery)
+"cvQ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/department/engine)
"cvR" = (
/obj/machinery/meter,
/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{
@@ -50066,6 +50071,15 @@
},
/turf/closed/wall,
/area/service/library/lounge)
+"cyF" = (
+/obj/machinery/status_display/supply{
+ pixel_x = -32
+ },
+/obj/machinery/computer/bounty{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/cargo/office)
"cyQ" = (
/obj/machinery/vending/games,
/turf/open/floor/plasteel/dark,
@@ -53157,6 +53171,16 @@
},
/turf/open/floor/plasteel/dark/telecomms,
/area/tcommsat/server)
+"gpX" = (
+/obj/effect/turf_decal/tile/brown,
+/obj/effect/turf_decal/tile/brown{
+ dir = 4
+ },
+/obj/machinery/computer/bounty{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/cargo/qm)
"gqi" = (
/obj/structure/bookcase/random/religion,
/turf/open/floor/plasteel/dark,
@@ -55830,13 +55854,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
-"kFy" = (
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/cargo/qm)
"kFD" = (
/obj/structure/closet/l3closet,
/obj/machinery/light{
@@ -56619,6 +56636,19 @@
},
/turf/open/floor/carpet,
/area/command/blueshielquarters)
+"lUl" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/department/cargo)
"lUz" = (
/obj/structure/girder,
/turf/open/floor/plating,
@@ -56941,6 +56971,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
+"mqu" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/department/crew_quarters/bar)
"mqS" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -58322,6 +58356,14 @@
/obj/structure/window/reinforced,
/turf/open/floor/plasteel,
/area/science/xenobiology)
+"osz" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/department/engine)
"osC" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -58540,6 +58582,14 @@
},
/turf/open/floor/plating,
/area/commons/storage/emergency/starboard)
+"oFy" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/department/cargo)
"oFI" = (
/obj/structure/closet,
/obj/effect/decal/cleanable/blood/old,
@@ -59839,13 +59889,6 @@
},
/turf/open/floor/plating,
/area/tcommsat/computer)
-"qyF" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
"qAk" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
@@ -64986,6 +65029,14 @@
},
/turf/open/floor/plasteel,
/area/science/xenobiology)
+"xXh" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/department/engine)
"xYV" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/on{
dir = 1
@@ -86813,7 +86864,7 @@ bva
aaa
bIZ
cbb
-bSq
+cvQ
ccO
bva
xgh
@@ -87546,7 +87597,7 @@ bmd
bwt
bvb
bpu
-bvb
+osz
bvb
btQ
bvb
@@ -88852,7 +88903,7 @@ npE
nSj
cXW
bPt
-qyF
+xXh
bQU
bva
bva
@@ -94715,7 +94766,7 @@ aKT
aKT
aKT
aOy
-aLL
+mqu
aLL
aRP
aSM
@@ -101406,7 +101457,7 @@ aVp
aWs
aPW
aYn
-bIO
+cyF
bas
aLf
bcx
@@ -105008,7 +105059,7 @@ aZo
baB
bbH
bcC
-kFy
+gpX
beL
bfD
bbE
@@ -108844,7 +108895,7 @@ hUt
aFi
aFi
aFi
-aJs
+lUl
aFi
aFi
bHI
@@ -110144,7 +110195,7 @@ aEj
aEj
aEj
aTx
-aFi
+cqr
aGO
bcI
aFi
@@ -111436,7 +111487,7 @@ rWE
baG
eZA
tDn
-aFi
+cqr
nZw
aFi
gfi
@@ -114271,7 +114322,7 @@ fwI
eCK
wQU
xah
-fwI
+oFy
fwI
bqO
btB
diff --git a/_maps/map_files/SmolStation/SmolStation.dmm b/_maps/map_files/SmolStation/SmolStation.dmm
index 7533233b12c7..38aaa19c8f47 100644
--- a/_maps/map_files/SmolStation/SmolStation.dmm
+++ b/_maps/map_files/SmolStation/SmolStation.dmm
@@ -538,7 +538,7 @@
/area/security/brig)
"auc" = (
/obj/machinery/vending/dinnerware{
- contraband = list(/obj/item/kitchen/rollingpin = 2, /obj/item/kitchen/knife/butcher = 2, /obj/item/reagent_containers/food/condiment/flour = 4)
+ contraband = list(/obj/item/kitchen/rollingpin=2,/obj/item/kitchen/knife/butcher=2,/obj/item/reagent_containers/food/condiment/flour=4)
},
/obj/machinery/camera{
c_tag = "Kitchen";
@@ -4995,6 +4995,10 @@
},
/turf/open/floor/plasteel,
/area/commons/storage/primary)
+"dsH" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/central)
"dsJ" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -6894,6 +6898,10 @@
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plasteel,
/area/commons/storage/tools)
+"eTA" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"eTM" = (
/obj/effect/turf_decal/tile/blue{
dir = 8
@@ -7134,6 +7142,19 @@
/obj/machinery/power/tracker,
/turf/open/floor/plasteel/airless/solarpanel,
/area/space/nearstation)
+"fhi" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{
+ dir = 4
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/central)
"fjd" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -14964,6 +14985,15 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/security/brig)
+"kOh" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"kOz" = (
/obj/machinery/computer/rdconsole/core{
dir = 4
@@ -17898,6 +17928,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
dir = 4
},
+/obj/effect/landmark/start/stowaway,
/turf/open/floor/plating,
/area/maintenance/central)
"mXP" = (
@@ -24431,6 +24462,10 @@
},
/turf/open/space/basic,
/area/space)
+"siQ" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"sjb" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{
dir = 6
@@ -27505,6 +27540,10 @@
/obj/effect/turf_decal/tile/brown,
/turf/open/floor/plasteel,
/area/cargo/qm)
+"uuT" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"uuY" = (
/obj/machinery/light/small,
/obj/machinery/camera{
@@ -61569,7 +61608,7 @@ lOA
lOA
lOA
lOA
-lOA
+uuT
kQV
blb
nPv
@@ -64197,7 +64236,7 @@ tZL
fOl
erD
hJA
-wmr
+fhi
kea
kea
kea
@@ -64471,7 +64510,7 @@ inK
inK
kea
iQG
-iQG
+siQ
hMW
sew
hLz
@@ -66992,7 +67031,7 @@ sHB
oqW
jhl
wGd
-tgK
+dsH
jhl
saE
wyw
@@ -69277,7 +69316,7 @@ eNc
jEc
ceL
jpY
-eNc
+eTA
eNc
eNc
qas
@@ -69548,7 +69587,7 @@ nSL
nSL
nSL
nSL
-nSL
+kOh
nSL
nSL
nSL
diff --git a/_maps/map_files/SpookyStation/SpookyStation.dmm b/_maps/map_files/SpookyStation/SpookyStation.dmm
index 0db822f4f7c6..406c42a2499b 100644
--- a/_maps/map_files/SpookyStation/SpookyStation.dmm
+++ b/_maps/map_files/SpookyStation/SpookyStation.dmm
@@ -16726,6 +16726,14 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/eventmap/inside)
+"oWI" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/spooktime/cobble/roadmid,
+/area/eventmap/outside)
+"phL" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/spooktime/cobble/roadsideS,
+/area/eventmap/outside)
"sDL" = (
/obj/structure/sign/poster/contraband/yes_erp,
/turf/closed/wall/mineral/wood,
@@ -38243,8 +38251,8 @@ aRd
aGM
aRo
aRD
-aWA
-aKq
+oWI
+phL
aaN
aaN
aaN
@@ -38500,8 +38508,8 @@ apR
ayO
aWA
aRt
-aWA
-aKq
+oWI
+phL
aaN
aaN
aaN
@@ -38757,8 +38765,8 @@ apR
ayO
aWA
aRt
-aWA
-aKq
+oWI
+phL
aaN
aaN
aaN
@@ -39014,8 +39022,8 @@ awm
ayO
aWA
aRt
-aWA
-aKq
+oWI
+phL
aaN
aaN
aYI
@@ -39271,8 +39279,8 @@ apR
ayO
aWA
aRt
-aWA
-aKq
+oWI
+phL
aaN
aaN
aaN
@@ -39528,8 +39536,8 @@ apR
ayO
aWA
aRt
-aWA
-aKq
+oWI
+phL
aaN
aaN
aaN
diff --git a/_maps/map_files/SyndicateStation/SyndicateBoxStation.dmm b/_maps/map_files/SyndicateStation/SyndicateBoxStation.dmm
index ea70d19af761..53198a774044 100644
--- a/_maps/map_files/SyndicateStation/SyndicateBoxStation.dmm
+++ b/_maps/map_files/SyndicateStation/SyndicateBoxStation.dmm
@@ -38700,6 +38700,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
+/obj/effect/landmark/start/stowaway,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"bUv" = (
@@ -41781,6 +41782,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
+/obj/effect/landmark/start/stowaway,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"ccq" = (
@@ -46505,6 +46507,7 @@
/area/maintenance/disposal/incinerator)
"cqv" = (
/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/effect/landmark/start/stowaway,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"cqw" = (
@@ -52217,6 +52220,14 @@
/obj/structure/alien/weeds,
/turf/open/floor/mineral/plastitanium,
/area/commons/dorms)
+"eYX" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"eZa" = (
/obj/effect/landmark/start/paramedic,
/turf/open/floor/mineral/plastitanium,
@@ -52983,6 +52994,18 @@
/obj/structure/lattice,
/turf/open/space/basic,
/area/space/nearstation)
+"fSu" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"fSO" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/machinery/atmospherics/pipe/simple/orange/visible{
@@ -54460,6 +54483,10 @@
/obj/effect/turf_decal/tile/green,
/turf/open/floor/mineral/plastitanium,
/area/hallway/primary/starboard)
+"ivb" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
"ivD" = (
/turf/open/floor/plating,
/area/space)
@@ -55501,6 +55528,10 @@
},
/turf/open/floor/mineral/plastitanium,
/area/engineering/atmos)
+"jZP" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"jZT" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -62943,6 +62974,12 @@
},
/turf/open/floor/plating,
/area/maintenance/fore)
+"vgM" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/fore/secondary)
"vhy" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -64668,6 +64705,10 @@
},
/turf/open/floor/mineral/plastitanium/red,
/area/security/brig)
+"xHS" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"xJC" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
@@ -84646,7 +84687,7 @@ fmJ
ygb
kiW
qlV
-amC
+ivb
ntt
nBI
qlV
@@ -85750,7 +85791,7 @@ cqn
cAh
chT
bHE
-bHE
+xHS
ckv
bHE
bCq
@@ -86764,7 +86805,7 @@ bRg
bCq
bHE
bVG
-bHE
+xHS
bHE
bCq
mqZ
@@ -89580,7 +89621,7 @@ bCn
bGq
bGq
bGq
-rGq
+fSu
bLw
bGq
bGq
@@ -89603,7 +89644,7 @@ bVI
bVI
aJq
xgk
-bHE
+xHS
kEm
bHE
bHE
@@ -99282,7 +99323,7 @@ ahT
ahT
ahT
ahT
-ahT
+vgM
ahT
alL
ahT
@@ -106489,7 +106530,7 @@ apB
aqx
art
anf
-anf
+jZP
auF
apC
awH
@@ -110092,7 +110133,7 @@ aFn
aBB
awM
ayg
-ayg
+eYX
ayg
ayg
aCl
diff --git a/_maps/map_files/TauStation/TauStation.dmm b/_maps/map_files/TauStation/TauStation.dmm
index 4d10f2a5f49e..7d378ae1b3bc 100644
--- a/_maps/map_files/TauStation/TauStation.dmm
+++ b/_maps/map_files/TauStation/TauStation.dmm
@@ -9301,6 +9301,19 @@
/obj/structure/lattice/catwalk,
/turf/open/space/basic,
/area/space/nearstation)
+"dlX" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/department/science)
"dmd" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/neutral{
@@ -24862,6 +24875,15 @@
},
/turf/open/floor/engine,
/area/science/xenobiology)
+"izV" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/department/medical)
"iAi" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -26676,6 +26698,16 @@
},
/turf/closed/wall,
/area/maintenance/department/engine)
+"jju" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"jjE" = (
/obj/effect/spawner/structure/window,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -35201,6 +35233,13 @@
},
/turf/open/floor/plasteel/dark,
/area/hallway/primary/port)
+"miK" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"miN" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -51663,6 +51702,7 @@
/obj/structure/cable{
icon_state = "2-8"
},
+/obj/effect/landmark/start/stowaway,
/turf/open/floor/plating,
/area/maintenance/department/science)
"rXk" = (
@@ -57062,6 +57102,10 @@
},
/turf/open/floor/plating/beach/sand,
/area/service/library/artgallery/museum)
+"tND" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"tNF" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -61184,6 +61228,19 @@
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
+"vja" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/department/medical)
"vjp" = (
/obj/structure/window/reinforced,
/obj/machinery/aug_manipulator,
@@ -65490,6 +65547,13 @@
},
/turf/open/floor/plating,
/area/maintenance/department/medical)
+"wAu" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"wAv" = (
/obj/machinery/power/apc{
areastring = "/area/security/checkpoint/medical";
@@ -69362,6 +69426,10 @@
"xNa" = (
/turf/closed/wall/r_wall,
/area/science/lab)
+"xNf" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/department/science)
"xNy" = (
/obj/item/sharpener{
pixel_x = 6
@@ -92986,7 +93054,7 @@ ycW
qkf
wLl
wLl
-ycW
+izV
ycW
ycW
wfF
@@ -94534,7 +94602,7 @@ ybK
ybK
ybK
ybK
-ygg
+vja
vmP
aBv
ocO
@@ -98400,7 +98468,7 @@ yde
trt
owJ
uTQ
-ygg
+vja
xXs
evJ
xXs
@@ -106920,7 +106988,7 @@ dvp
fph
sdb
aYi
-wBz
+tND
uiQ
uiQ
uiQ
@@ -107901,7 +107969,7 @@ hce
hce
xYK
fLy
-wim
+dlX
mxU
xhN
jGo
@@ -107939,7 +108007,7 @@ qEt
oCl
wBP
tpI
-aib
+miK
sdb
nhq
dvp
@@ -110999,7 +111067,7 @@ yji
bQB
mxU
mMc
-xUV
+xNf
xUV
fOc
whY
@@ -111712,7 +111780,7 @@ vmU
eBz
thT
eBz
-vfB
+jju
eBz
vyq
wbQ
@@ -117842,7 +117910,7 @@ hpl
qJe
fbk
pkR
-ptR
+wAu
ptR
ptR
ptR
diff --git a/_maps/splurt_maps/map_files/Smexistation/Snaxi_Splurt.dmm b/_maps/splurt_maps/map_files/Smexistation/Snaxi_Splurt.dmm
index 9e3065d6a0da..bbdc64980427 100644
--- a/_maps/splurt_maps/map_files/Smexistation/Snaxi_Splurt.dmm
+++ b/_maps/splurt_maps/map_files/Smexistation/Snaxi_Splurt.dmm
@@ -289,13 +289,13 @@
"abk" = (
/obj/structure/closet/secure_closet/freezer/fridge,
/obj/item/reagent_containers/food/condiment/flour{
- list_reagents = list(/datum/reagent/consumable/flour = 90);
+ list_reagents = list(/datum/reagent/consumable/flour=90);
name = "large flour sack";
possible_transfer_amounts = list(1,5,10,15,30,60,90);
volume = 90
},
/obj/item/reagent_containers/food/condiment/flour{
- list_reagents = list(/datum/reagent/consumable/flour = 90);
+ list_reagents = list(/datum/reagent/consumable/flour=90);
name = "large flour sack";
possible_transfer_amounts = list(1,5,10,15,30,60,90);
volume = 90
@@ -303,7 +303,7 @@
/obj/item/reagent_containers/food/condiment/mayonnaise,
/obj/item/reagent_containers/food/condiment/milk,
/obj/item/reagent_containers/food/condiment/rice{
- list_reagents = list(/datum/reagent/consumable/rice = 90);
+ list_reagents = list(/datum/reagent/consumable/rice=90);
name = "large rice sack";
possible_transfer_amounts = list(1,5,10,15,20,25,30,50,60,90)
},
@@ -556,6 +556,11 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
+"adG" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"adH" = (
/obj/structure/transit_tube/curved/flipped,
/turf/open/floor/plating/snowed/smoothed/icemoon,
@@ -4909,6 +4914,10 @@
},
/turf/open/floor/plasteel,
/area/cargo/miningdock)
+"brv" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/aft)
"brB" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/preopen{
@@ -8936,6 +8945,7 @@
/obj/structure/cable{
icon_state = "1-8"
},
+/obj/effect/landmark/start/stowaway,
/turf/open/floor/plating,
/area/maintenance/aft/secondary)
"crw" = (
@@ -8944,7 +8954,7 @@
req_access_txt = "3"
},
/obj/effect/spawner/lootdrop/armory_contraband{
- loot = list(/obj/item/gun/ballistic/automatic/pistol = 5, /obj/item/gun/ballistic/shotgun/automatic/combat = 5, /obj/item/gun/ballistic/revolver/mateba, /obj/item/gun/ballistic/automatic/pistol/deagle, /obj/item/storage/box/syndie_kit/throwing_weapons = 3)
+ loot = list(/obj/item/gun/ballistic/automatic/pistol=5,/obj/item/gun/ballistic/shotgun/automatic/combat=5,/obj/item/gun/ballistic/revolver/mateba,/obj/item/gun/ballistic/automatic/pistol/deagle,/obj/item/storage/box/syndie_kit/throwing_weapons=3)
},
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plasteel/dark,
@@ -18523,7 +18533,7 @@
input_tag = "mix_in2";
name = "Aux Gas Mix Tank Control";
output_tag = "mix_out2";
- sensors = list("mix_sensor2" = "Aux Gas Mix Tank ")
+ sensors = list("mix_sensor2"="Aux Gas Mix Tank ")
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
@@ -28123,6 +28133,10 @@
/obj/structure/girder/displaced,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
+"kKU" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/engineering/storage)
"kKY" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -28362,7 +28376,7 @@
/area/engineering/main)
"kPA" = (
/obj/effect/spawner/lootdrop{
- loot = list(/obj/item/gun/ballistic/revolver/russian = 5, /obj/item/storage/box/syndie_kit/throwing_weapons, /obj/item/toy/cards/deck/syndicate = 2);
+ loot = list(/obj/item/gun/ballistic/revolver/russian=5,/obj/item/storage/box/syndie_kit/throwing_weapons,/obj/item/toy/cards/deck/syndicate=2);
name = "gambling valuables spawner"
},
/obj/structure/table/wood/poker,
@@ -41504,7 +41518,7 @@
/area/engineering/break_room)
"qzP" = (
/obj/machinery/vending/dinnerware{
- contraband = list(/obj/item/kitchen/rollingpin = 2, /obj/item/kitchen/knife/butcher = 2, /obj/item/reagent_containers/food/condiment/flour = 4)
+ contraband = list(/obj/item/kitchen/rollingpin=2,/obj/item/kitchen/knife/butcher=2,/obj/item/reagent_containers/food/condiment/flour=4)
},
/turf/open/floor/plasteel/freezer,
/area/service/kitchen/coldroom)
@@ -44091,6 +44105,10 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel,
/area/hallway/primary/starboard/aft)
+"rGN" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/central)
"rGP" = (
/obj/machinery/turnstile{
dir = 8;
@@ -50728,6 +50746,10 @@
},
/turf/open/floor/plating,
/area/hallway/secondary/exit/departure_lounge)
+"uFI" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"uFT" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
dir = 10
@@ -52569,6 +52591,7 @@
dir = 1;
light_color = "#ffc1c1"
},
+/obj/effect/landmark/start/stowaway,
/turf/open/floor/plating,
/area/maintenance/aft)
"vvH" = (
@@ -55129,6 +55152,10 @@
},
/turf/open/floor/plating,
/area/security/checkpoint/supply)
+"wvA" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/aft/secondary)
"wvL" = (
/obj/machinery/cryopod{
dir = 1
@@ -56498,7 +56525,7 @@
"xcL" = (
/obj/structure/table,
/obj/effect/spawner/lootdrop{
- loot = list(/obj/item/gun/ballistic/revolver/russian = 5, /obj/item/storage/box/syndie_kit/throwing_weapons, /obj/item/toy/cards/deck/syndicate = 2);
+ loot = list(/obj/item/gun/ballistic/revolver/russian=5,/obj/item/storage/box/syndie_kit/throwing_weapons,/obj/item/toy/cards/deck/syndicate=2);
name = "gambling valuables spawner"
},
/turf/open/floor/plasteel,
@@ -57148,6 +57175,13 @@
},
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
+"xqY" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/aft/secondary)
"xrL" = (
/obj/machinery/light{
dir = 1
@@ -59058,6 +59092,13 @@
},
/turf/open/floor/circuit/telecomms/mainframe,
/area/tcommsat/server)
+"yle" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/central)
"ylx" = (
/obj/effect/turf_decal/tile/red{
dir = 8
@@ -82324,7 +82365,7 @@ nLS
nLS
nLS
xJp
-xJp
+yle
nLS
nLS
jOq
@@ -83351,7 +83392,7 @@ wje
nLS
cpX
dGu
-gdQ
+rGN
qel
rRU
nLS
@@ -91384,7 +91425,7 @@ bfa
rRa
cey
wlV
-wlV
+brv
ucZ
eTv
iIS
@@ -97042,7 +97083,7 @@ sAC
iBd
jpS
wTK
-wGq
+wvA
wTK
wGq
kSv
@@ -98584,7 +98625,7 @@ tJJ
tJJ
tnV
wTK
-jxp
+xqY
fJr
wTK
avT
@@ -108519,7 +108560,7 @@ eDt
mKy
qDt
qDt
-xJU
+adG
uoz
xLQ
vcm
@@ -110826,7 +110867,7 @@ oUQ
qRF
lnH
pwC
-fBS
+kKU
wFO
mZp
wwi
@@ -113913,7 +113954,7 @@ avT
qDt
lKk
rUk
-rUk
+uFI
qDt
qDt
qDt
diff --git a/code/__DEFINES/_flags/_flags.dm b/code/__DEFINES/_flags/_flags.dm
index c86659d49094..ca026edbf273 100644
--- a/code/__DEFINES/_flags/_flags.dm
+++ b/code/__DEFINES/_flags/_flags.dm
@@ -68,6 +68,8 @@ GLOBAL_LIST_INIT(bitflags, list(
#define NO_RUINS_1 (1<<10)
/// Should this tile be cleaned up and reinserted into an excited group?
#define EXCITED_CLEANUP_1 (1 << 13)
+/// Whether or not this atom has contextual screentips when hovered OVER
+#define HAS_CONTEXTUAL_SCREENTIPS_1 (1 << 14)
////////////////Area flags\\\\\\\\\\\\\\
/// If it's a valid territory for cult summoning or the CRAB-17 phone to spawn
diff --git a/code/__DEFINES/_flags/obj_flags.dm b/code/__DEFINES/_flags/obj_flags.dm
index 5f5ea12aaa3b..c3c48c7d7431 100644
--- a/code/__DEFINES/_flags/obj_flags.dm
+++ b/code/__DEFINES/_flags/obj_flags.dm
@@ -17,6 +17,8 @@
#define EXAMINE_SKIP (1<<14) /// Makes the Examine proc not read out this item.
#define IN_STORAGE (1<<15) //is this item in the storage item, such as backpack? used for tooltips
#define HAND_ITEM (1<<16) // If an item is just your hand (circled hand, slapper) and shouldn't block things like riding
+/// Has contextual screentips when HOVERING OVER OTHER objects
+#define ITEM_HAS_CONTEXTUAL_SCREENTIPS (1 << 17)
/// Integrity defines for clothing (not flags but close enough)
#define CLOTHING_PRISTINE 0 // We have no damage on the clothing
diff --git a/code/__DEFINES/dcs/signals/signals_painting.dm b/code/__DEFINES/dcs/signals/signals_painting.dm
new file mode 100644
index 000000000000..4f9201ec8f2e
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_painting.dm
@@ -0,0 +1,7 @@
+// signals for painting canvases, tools and the /datum/component/palette component
+
+///from base of /item/proc/set_painting_tool_color(): (chosen_color)
+#define COMSIG_PAINTING_TOOL_SET_COLOR "painting_tool_set_color"
+
+/// from base of /item/canvas/ui_data(): (data)
+#define COMSIG_PAINTING_TOOL_GET_ADDITIONAL_DATA "painting_tool_get_data"
diff --git a/code/__DEFINES/dcs/signals/signals_screentips.dm b/code/__DEFINES/dcs/signals/signals_screentips.dm
new file mode 100644
index 000000000000..8f7326ee2ee7
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_screentips.dm
@@ -0,0 +1,23 @@
+/// A "Type-A" contextual screentip interaction.
+/// These are used for items that are defined by their behavior. They define their contextual text within *themselves*,
+/// not in their targets.
+/// Examples include syringes (LMB to inject, RMB to draw) and health analyzers (LMB to scan health/wounds, RMB for chems)
+/// Items can override `add_item_context()`, and call `register_item_context()` in order to easily connect to this.
+/// Called on /obj/item with a mutable screentip context list, the hovered target, and the mob hovering.
+/// A screentip context list is a list that has context keys (SCREENTIP_CONTEXT_*, from __DEFINES/screentips.dm)
+/// that map to the action as text.
+/// If you mutate the list in this signal, you must return CONTEXTUAL_SCREENTIP_SET.
+#define COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET "item_requesting_context_for_target"
+
+/// A "Type-B" contextual screentip interaction.
+/// These are atoms that are defined by what happens *to* them. These should define contextual text within themselves, and
+/// not in their operating tools.
+/// Examples include construction objects (LMB with glass to put in screen for computers).
+/// Called on /atom with a mutable screentip context list, the item being used, and the mob hovering.
+/// A screentip context list is a list that has context keys (SCREENTIP_CONTEXT_*, from __DEFINES/screentips.dm)
+/// that map to the action as text.
+/// If you mutate the list in this signal, you must return CONTEXTUAL_SCREENTIP_SET.
+#define COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM "atom_requesting_context_from_item"
+
+/// Tells the contextual screentips system that the list context was mutated.
+#define CONTEXTUAL_SCREENTIP_SET (1 << 0)
diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
index 681a4f9059ae..6d7df3e93f6e 100644
--- a/code/__DEFINES/inventory.dm
+++ b/code/__DEFINES/inventory.dm
@@ -58,9 +58,11 @@
#define ITEM_SLOT_HANDCUFFED (1<<23)
/// Legcuff slot (bolas, beartraps)
#define ITEM_SLOT_LEGCUFFED (1<<24)
+/// To attach to a jumpsuit
+#define ITEM_SLOT_ACCESSORY (1<<25)
/// Total amount of slots
-#define SLOTS_AMT 25 // Keep this up to date!
+#define SLOTS_AMT 26 // Keep this up to date!
//SLOT GROUP HELPERS
#define ITEM_SLOT_POCKETS (ITEM_SLOT_LPOCKET|ITEM_SLOT_RPOCKET)
diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm
index 49daf4147f45..032ae9ded04c 100644
--- a/code/__DEFINES/jobs.dm
+++ b/code/__DEFINES/jobs.dm
@@ -48,6 +48,7 @@
#define MIME (1<<12)
#define ASSISTANT (1<<13)
#define PRISONER (1<<14)
+#define STOWAWAY (1<<15)
#define JOB_AVAILABLE 0
#define JOB_UNAVAILABLE_GENERIC 1
@@ -101,3 +102,4 @@
#define JOB_DISPLAY_ORDER_BLUESHIELD 37
#define JOB_DISPLAY_ORDER_BO 38
#define JOB_DISPLAY_ORDER_PRISONER 39
+#define JOB_DISPLAY_ORDER_STOWAWAY 40
diff --git a/code/__DEFINES/loadout.dm b/code/__DEFINES/loadout.dm
index 182e58c1f738..9f771df663de 100644
--- a/code/__DEFINES/loadout.dm
+++ b/code/__DEFINES/loadout.dm
@@ -4,10 +4,12 @@
#define LOADOUT_SUBCATEGORY_NONE "Miscellaneous"
#define LOADOUT_SUBCATEGORIES_NONE list("Miscellaneous")
+//accessory
+#define LOADOUT_CATEGORY_ACCESSORY "Accessory"
+
//backpack
#define LOADOUT_CATEGORY_BACKPACK "In backpack"
#define LOADOUT_SUBCATEGORY_BACKPACK_GENERAL "General" //basically anything that there's not enough of to have its own subcategory
-#define LOADOUT_SUBCATEGORY_BACKPACK_ACCESSORIES "Accessories" //maybe one day someone will make loadouts have accessory compatibility
#define LOADOUT_SUBCATEGORY_BACKPACK_TOYS "Toys"
//neck
#define LOADOUT_CATEGORY_NECK "Neck"
@@ -84,7 +86,7 @@
#define LOADOUT_CAN_DESCRIPTION (1<<1) //adding a custom description to items
#define LOADOUT_CAN_COLOR_POLYCHROMIC (1<<2)
-//the names of the customization tabs
+/* the names of the customization tabs
#define SETTINGS_TAB 0
#define GAME_PREFERENCES_TAB 1
#define APPEARANCE_TAB 2
@@ -92,6 +94,7 @@
#define LOADOUT_TAB 4
#define CONTENT_PREFERENCES_TAB 5
#define KEYBINDINGS_TAB 6
+*/
//quirks
#define QUIRK_POSITIVE "Positive"
diff --git a/code/__DEFINES/screentips.dm b/code/__DEFINES/screentips.dm
new file mode 100644
index 000000000000..a3b101835251
--- /dev/null
+++ b/code/__DEFINES/screentips.dm
@@ -0,0 +1,35 @@
+/// Context applied to LMB actions
+#define SCREENTIP_CONTEXT_LMB "LMB"
+
+/// Context applied to RMB actions
+#define SCREENTIP_CONTEXT_RMB "RMB"
+
+/// Context applied to Shift-LMB actions
+#define SCREENTIP_CONTEXT_SHIFT_LMB "Shift-LMB"
+
+/// Context applied to Ctrl-LMB actions
+#define SCREENTIP_CONTEXT_CTRL_LMB "Ctrl-LMB"
+
+/// Context applied to Ctrl-RMB actions
+#define SCREENTIP_CONTEXT_CTRL_RMB "Ctrl-RMB"
+
+/// Context applied to Alt-LMB actions
+#define SCREENTIP_CONTEXT_ALT_LMB "Alt-LMB"
+
+/// Context applied to Alt-RMB actions
+#define SCREENTIP_CONTEXT_ALT_RMB "Alt-RMB"
+
+/// Context applied to Ctrl-Shift-LMB actions
+#define SCREENTIP_CONTEXT_CTRL_SHIFT_LMB "Ctrl-Shift-LMB"
+
+/// Screentips are always disabled
+#define SCREENTIP_PREFERENCE_DISABLED "Disabled"
+
+/// Screentips are always enabled
+#define SCREENTIP_PREFERENCE_ENABLED "Enabled"
+
+/// Screentips are only enabled when they have context
+#define SCREENTIP_PREFERENCE_CONTEXT_ONLY "Only with tips"
+
+/// Regardless of intent
+#define INTENT_ANY "intent_any"
diff --git a/code/__HELPERS/custom_holoforms.dm b/code/__HELPERS/custom_holoforms.dm
index 8aa8d279ec42..87f3bfbe8bbb 100644
--- a/code/__HELPERS/custom_holoforms.dm
+++ b/code/__HELPERS/custom_holoforms.dm
@@ -6,6 +6,7 @@
prefs.copy_to(mannequin)
if(apply_loadout && prefs.parent)
SSjob.equip_loadout(prefs.parent.mob, mannequin, bypass_prereqs = TRUE)
+ SSjob.post_equip_loadout(prefs.parent.mob, mannequin, bypass_prereqs = TRUE)
if(copy_job)
var/datum/job/highest = prefs.get_highest_job()
if(highest && !istype(highest, /datum/job/ai) && !istype(highest, /datum/job/cyborg))
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index fc220e60c63d..38b8bdfb2497 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -578,7 +578,7 @@
deadchat_broadcast(" has arrived at the station at [player_area.name] . ", "[character.real_name] ([rank]) ", follow_target = character, message_type=DEADCHAT_ARRIVALRATTLE)
if((!GLOB.announcement_systems.len) || (!character.mind))
return
- if((character.mind.assigned_role == "Cyborg") || (character.mind.assigned_role == character.mind.special_role))
+ if((character.mind.assigned_role == "Cyborg") || (character.mind.assigned_role == character.mind.special_role) || (character.mind.assigned_role == "Stowaway"))
return
//Skyrat changes
diff --git a/code/__HELPERS/screentips.dm b/code/__HELPERS/screentips.dm
new file mode 100644
index 000000000000..967e1c3bb64f
--- /dev/null
+++ b/code/__HELPERS/screentips.dm
@@ -0,0 +1,31 @@
+// Generate intent icons
+/// Help intent icon for screentip context
+GLOBAL_DATUM_INIT(icon_intent_help, /image, image('icons/emoji.dmi', icon_state = INTENT_HELP))
+/// Disarm intent icon for screentip context
+GLOBAL_DATUM_INIT(icon_intent_disarm, /image, image('icons/emoji.dmi', icon_state = INTENT_DISARM))
+/// Grab intent icon for screentip context
+GLOBAL_DATUM_INIT(icon_intent_grab, /image, image('icons/emoji.dmi', icon_state = INTENT_GRAB))
+/// Harm intent icon for screentip context
+GLOBAL_DATUM_INIT(icon_intent_harm, /image, image('icons/emoji.dmi', icon_state = INTENT_HARM))
+
+/*
+ * # Builds context with each intent for this key
+ * Args:
+ * - context = list (REQUIRED)
+ * - key = string (REQUIRED)
+*/
+/proc/build_context(list/context, key)
+ var/list/to_add
+ for(var/intent in context[key])
+ switch(intent)
+ if(INTENT_HELP)
+ LAZYADD(to_add, "\icon[GLOB.icon_intent_help] [key]: [context[key][INTENT_HELP]]")
+ if(INTENT_DISARM)
+ LAZYADD(to_add, "\icon[GLOB.icon_intent_disarm] [key]: [context[key][INTENT_DISARM]]")
+ if(INTENT_GRAB)
+ LAZYADD(to_add, "\icon[GLOB.icon_intent_grab] [key]: [context[key][INTENT_GRAB]]")
+ if(INTENT_HARM)
+ LAZYADD(to_add, "\icon[GLOB.icon_intent_harm] [key]: [context[key][INTENT_HARM]]")
+ else // If you're adding intent-less YOU BETTER ADD IT FIRST IN THE LIST
+ LAZYADD(to_add, "[key]: [context[key][intent]]")
+ return english_list(to_add, "", " ", " ")
diff --git a/code/__SANDCODE/DEFINES/DNA.dm b/code/__SANDCODE/DEFINES/DNA.dm
new file mode 100644
index 000000000000..547ab21071e6
--- /dev/null
+++ b/code/__SANDCODE/DEFINES/DNA.dm
@@ -0,0 +1,3 @@
+#define PREVIEW_PREF_JOB "Job"
+#define PREVIEW_PREF_LOADOUT "Loadout"
+#define PREVIEW_PREF_NAKED "Naked"
diff --git a/code/__SANDCODE/DEFINES/dcs/signals/signals_mob_main.dm b/code/__SANDCODE/DEFINES/dcs/signals/signals_mob_main.dm
new file mode 100644
index 000000000000..9eaa655bf202
--- /dev/null
+++ b/code/__SANDCODE/DEFINES/dcs/signals/signals_mob_main.dm
@@ -0,0 +1 @@
+#define COMSIG_MOB_CTRLSHIFTCLICKON "mob_ctrlshiftclickon"
diff --git a/code/__SANDCODE/DEFINES/loadout.dm b/code/__SANDCODE/DEFINES/loadout.dm
index 3e87fca92711..3d3a130334e2 100644
--- a/code/__SANDCODE/DEFINES/loadout.dm
+++ b/code/__SANDCODE/DEFINES/loadout.dm
@@ -13,3 +13,21 @@
#define LOADOUT_CATEGORY_WRISTS "Wrists"
/// Subcategory for watches
#define LOADOUT_SUBCATEGORY_WATCHES "Watches"
+
+//the names of the customization tabs
+#define SETTINGS_TAB 0
+#define PREFERENCES_TAB 1
+#define KEYBINDINGS_TAB 2
+
+//subtabs for the character settings tab
+#define GENERAL_CHAR_TAB 0
+#define APPEARANCE_CHAR_TAB 1
+#define MARKINGS_CHAR_TAB 2
+#define SPEECH_CHAR_TAB 3
+#define BACKGROUND_CHAR_TAB 4
+#define LOADOUT_CHAR_TAB 5
+
+//subtabs for preferences tab
+#define GAME_PREFS_TAB 0
+#define OOC_PREFS_TAB 1
+#define CONTENT_PREFS_TAB 2
diff --git a/code/__SANDCODE/HELPERS/sizecode.dm b/code/__SANDCODE/HELPERS/sizecode.dm
index b312b8fcc96b..41c17a0ef0d8 100644
--- a/code/__SANDCODE/HELPERS/sizecode.dm
+++ b/code/__SANDCODE/HELPERS/sizecode.dm
@@ -14,3 +14,15 @@
return has_dna.features["body_size"]
else
return target.size_multiplier
+
+/*
+ * # COMPARE_SIZES(mob/living/user, mob/living/target)
+ * Returns how bigger or smaller the target is in comparison to user
+ * Example:
+ * - user = 2, target = 1, result = 0.5
+ * - user = 1, target = 2, result = 2
+ * Args:
+ * - user = /mob/living
+ * - target = /mob/living
+*/
+#define COMPARE_SIZES(user, target) abs((get_size(user) / get_size(target)))
diff --git a/code/__SPLURTCODE/DEFINES/preferences.dm b/code/__SPLURTCODE/DEFINES/preferences.dm
new file mode 100644
index 000000000000..ba74e8762e81
--- /dev/null
+++ b/code/__SPLURTCODE/DEFINES/preferences.dm
@@ -0,0 +1 @@
+#define DEFAULT_SAVE_SLOTS 24
diff --git a/code/__SPLURTCODE/DEFINES/quirks.dm b/code/__SPLURTCODE/DEFINES/quirks.dm
index 9353f87dc789..041d47311755 100644
--- a/code/__SPLURTCODE/DEFINES/quirks.dm
+++ b/code/__SPLURTCODE/DEFINES/quirks.dm
@@ -1,3 +1,9 @@
//Dominant/Well-trained quirks
#define DOMINANT_DETECT_RANGE 5
#define DOMINANT_SNAP_COOLDOWN 10 SECONDS
+
+// Quirk mood types
+#define QMOOD_NUDIST "mood_nudist"
+#define QMOOD_MASKED_MOOK "mood_masked_mook"
+#define QMOOD_HIDE_BAG "mood_storage_concealment"
+#define QMOOD_WELL_TRAINED "mood_dom_trained"
diff --git a/code/__SPLURTCODE/DEFINES/species.dm b/code/__SPLURTCODE/DEFINES/species.dm
index d9d5642ce874..3248d840c85a 100644
--- a/code/__SPLURTCODE/DEFINES/species.dm
+++ b/code/__SPLURTCODE/DEFINES/species.dm
@@ -1,2 +1,4 @@
-#define SPECIES_SPECBOT "spectre_bot"
-#define SPECIES_SHADEKIN "shadekin"
+#define SPECIES_SPECBOT "spectre_bot"
+#define SPECIES_SHADEKIN "shadekin"
+#define SPECIES_ASHWALKER_WEST "ashlizard_west"
+#define SPECIES_ASHWALKER_EAST "ashlizard_east"
diff --git a/code/__SPLURTCODE/DEFINES/traits.dm b/code/__SPLURTCODE/DEFINES/traits.dm
index 121772f7e171..ad5c15198c59 100644
--- a/code/__SPLURTCODE/DEFINES/traits.dm
+++ b/code/__SPLURTCODE/DEFINES/traits.dm
@@ -1,28 +1,32 @@
-#define SLAVER_TRAIT "slaver"
-#define PREGNANCY_TRAIT "pregnancy"
-
-#define TRAIT_HYPNOTIC_GAZE "Hypnotic Gaze"
-#define TRAIT_PREGNANT "pregnant"
-
-#define TRAIT_FLOORED "floored"
-#define IGNORE_FAKE_Z_AXIS "ignore_fake_z_axis"
-
-#define TRAIT_GFLUID_DETECT "genital_fluid_detect"
-
-#define TRAIT_ASHRESISTANCE "TRAIT_ASHRESISTANCE"
-
-#define TRAIT_TONGUELESS_SPEECH "tongueless-speech" //for dephelm stuff
-
-// Hyperstation traits
-#define TRAIT_PHARMA "hepatic_pharmacokinesis"
+// General traits
+#define TRAIT_PREGNANT "pregnant"
+#define TRAIT_FLOORED "floored"
+#define IGNORE_FAKE_Z_AXIS "ignore_fake_z_axis"
+#define TRAIT_TONGUELESS_SPEECH "tongueless_speech"
+
+// Trait types
+#define SLAVER_TRAIT "slaver"
+#define PREGNANCY_TRAIT "pregnancy"
+
+// Quirk traits
+#define TRAIT_HYPNOTIC_GAZE "hypnotic_gaze"
+#define TRAIT_GFLUID_DETECT "genital_fluid_detect"
+#define TRAIT_ASHRESISTANCE "ash_resistance"
+#define TRAIT_PHARMA "hepatic_pharmacokinesis"
#define TRAIT_CHOKE_SLUT "choke_slut"
-
-#define TRAIT_BLOODFLEDGE "BloodFledge"
-
-#define TRAIT_INCUBUS "Incubus"
-#define TRAIT_SUCCUBUS "Succubus"
-
-#define TRAIT_ARACHNID "Arachnid"
+#define TRAIT_BLOODFLEDGE "bloodfledge"
+#define TRAIT_INCUBUS "incubus"
+#define TRAIT_SUCCUBUS "succubus"
+#define TRAIT_ARACHNID "arachnid"
#define TRAIT_FLUTTER "flutter"
-#define TRAIT_NUDIST "Nudist"
+#define TRAIT_NUDIST "nudist"
#define TRAIT_CLOTH_EATER "cloth_eater"
+#define TRAIT_WEREWOLF "werewolf"
+#define TRAIT_PRIMITIVE "primitive"
+#define TRAIT_STEEL_ASS "steel_ass"
+#define TRAIT_CURSED_BLOOD "cursed_blood"
+#define TRAIT_HEADPAT_SLUT "headpat_slut"
+#define TRAIT_DISTANT "headpat_hater"
+#define TRAIT_ILLITERATE "illiterate"
+#define TRAIT_HIDE_BACKPACK "hide_backpack"
+#define TRAIT_DUMB4CUM "dumb4cum"
diff --git a/code/__SPLURTCODE/DEFINES/zeros/species.dm b/code/__SPLURTCODE/DEFINES/zeros/species.dm
deleted file mode 100644
index e24d77ca0ff1..000000000000
--- a/code/__SPLURTCODE/DEFINES/zeros/species.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-#define SPECIES_ASHWALKER_WEST "ashlizard_west"
-#define SPECIES_ASHWALKER_EAST "ashlizard_east"
diff --git a/code/__SPLURTCODE/DEFINES/zeros/traits.dm b/code/__SPLURTCODE/DEFINES/zeros/traits.dm
deleted file mode 100644
index 199962dbfd07..000000000000
--- a/code/__SPLURTCODE/DEFINES/zeros/traits.dm
+++ /dev/null
@@ -1,9 +0,0 @@
-#define TRAIT_PRIMITIVE "primitive"
-#define TRAIT_STEEL_ASS "steel_ass"
-#define TRAIT_CURSED_BLOOD "cursed_blood" //Yo dawg I heard you like bloodborne references so I put a
-#define TRAIT_HEADPAT_SLUT "headpat_slut"
-#define TRAIT_DISTANT "headpat_hater"
-#define TRAIT_ILLITERATE "illiterate"
-#define TRAIT_HIDE_BACKPACK "hide_backpack"
-
-#define TRAIT_DUMB4CUM "dumb4cum"
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index f412f31e9ced..d16c24be44c8 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -155,6 +155,7 @@ DEFINE_BITFIELD(flags_1, list(
"CAN_BE_DIRTY_1" = CAN_BE_DIRTY_1,
"CONDUCT_1" = CONDUCT_1,
"DEFAULT_RICOCHET_1" = DEFAULT_RICOCHET_1,
+ "HAS_CONTEXTUAL_SCREENTIPS_1" = HAS_CONTEXTUAL_SCREENTIPS_1,
"HEAR_1" = HEAR_1,
"HOLOGRAM_1" = HOLOGRAM_1,
"INITIALIZED_1" = INITIALIZED_1,
@@ -246,6 +247,7 @@ DEFINE_BITFIELD(item_flags, list(
"IN_STORAGE" = IN_STORAGE,
"ITEM_CAN_BLOCK" = ITEM_CAN_BLOCK,
"ITEM_CAN_PARRY" = ITEM_CAN_PARRY,
+ "ITEM_HAS_CONTEXTUAL_SCREENTIPS" = ITEM_HAS_CONTEXTUAL_SCREENTIPS,
"NEEDS_PERMIT" = NEEDS_PERMIT,
"NOBLUDGEON" = NOBLUDGEON,
"NO_MAT_REDEMPTION" = NO_MAT_REDEMPTION,
@@ -412,6 +414,7 @@ DEFINE_BITFIELD(sight, list(
))
DEFINE_BITFIELD(slot_flags, list(
+ "ITEM_SLOT_ACCESSORY" = ITEM_SLOT_ACCESSORY,
"ITEM_SLOT_BACK" = ITEM_SLOT_BACK,
"ITEM_SLOT_BACKPACK" = ITEM_SLOT_BACKPACK,
"ITEM_SLOT_BELT" = ITEM_SLOT_BELT,
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index e2996ecd7ecd..44d507891c02 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -338,7 +338,7 @@ GLOBAL_LIST_INIT(colored_mutant_parts, list("insect_wings" = "wings_color", "dec
GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant","jelly","slime","golem","slimelumi","stargazer","mush","ethereal","snail","c_golem","b_golem","mammal","xeno","ipc","insect","synthliz","avian","aquatic", "shadekin"))
//body ids that have prosthetic sprites
-GLOBAL_LIST_INIT(prosthetic_limb_types, list("xion","bishop","cybersolutions","grayson","hephaestus","nanotrasen","talon"))
+GLOBAL_LIST_INIT(prosthetic_limb_types, list("xion","bishop","cybersolutions","grayson","hephaestus","nanotrasen","talon","veymed")) //I don't know if i can module this to splurt
//body ids that have non-gendered bodyparts
GLOBAL_LIST_INIT(nongendered_limb_types, list("fly", "zombie" ,"synth", "shadow", "cultgolem", "agent", "plasmaman", "clockgolem", "clothgolem"))
diff --git a/code/_globalvars/lists/loadout_categories.dm b/code/_globalvars/lists/loadout_categories.dm
index 371e09392bdc..428e5b0e3234 100644
--- a/code/_globalvars/lists/loadout_categories.dm
+++ b/code/_globalvars/lists/loadout_categories.dm
@@ -1,5 +1,6 @@
GLOBAL_LIST_INIT(loadout_categories, list(
- LOADOUT_CATEGORY_BACKPACK = list(LOADOUT_SUBCATEGORY_BACKPACK_GENERAL, LOADOUT_SUBCATEGORY_BACKPACK_ACCESSORIES, LOADOUT_SUBCATEGORY_BACKPACK_TOYS),
+ LOADOUT_CATEGORY_ACCESSORY = LOADOUT_SUBCATEGORIES_NONE,
+ LOADOUT_CATEGORY_BACKPACK = list(LOADOUT_SUBCATEGORY_BACKPACK_GENERAL, LOADOUT_SUBCATEGORY_BACKPACK_TOYS),
LOADOUT_CATEGORY_NECK = list(LOADOUT_SUBCATEGORY_NECK_GENERAL, LOADOUT_SUBCATEGORY_NECK_TIE, LOADOUT_SUBCATEGORY_NECK_SCARVES),
LOADOUT_CATEGORY_MASK = LOADOUT_SUBCATEGORIES_NONE,
LOADOUT_CATEGORY_HANDS = LOADOUT_SUBCATEGORIES_NONE,
diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm
index b41b7356a8b7..cec25c0047cf 100644
--- a/code/_globalvars/lists/maintenance_loot.dm
+++ b/code/_globalvars/lists/maintenance_loot.dm
@@ -49,6 +49,8 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/radio/off = 2,
/obj/item/t_scanner = 5,
/obj/item/airlock_painter = 1,
+ /obj/item/airlock_painter/decal = 1,
+ /obj/item/airlock_painter/decal/tile = 1,
/obj/item/stack/cable_coil/random = 4,
/obj/item/stack/cable_coil/random/five = 6,
/obj/item/stack/medical/suture = 1,
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 6e8d1de95513..b3a75c024c77 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -397,8 +397,10 @@
Unused except for AI
*/
/mob/proc/CtrlShiftClickOn(atom/A)
+ . = SEND_SIGNAL(src, COMSIG_MOB_CTRLSHIFTCLICKON, A)
+ if(. & COMSIG_MOB_CANCEL_CLICKON)
+ return
A.CtrlShiftClick(src)
- return
/mob/proc/ShiftMiddleClickOn(atom/A)
src.pointed(A)
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index cd8fb4b30cf8..593fa1a41138 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -64,13 +64,15 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
/// This is updated by the preference for cheaper reads than would be
/// had with a proc call, especially on one of the hottest procs in the
/// game (MouseEntered).
- var/screentips_enabled = TRUE
+ // var/screentips_enabled = SCREENTIP_PREFERENCE_ENABLED
/// The color to use for the screentips.
/// This is updated by the preference for cheaper reads than would be
/// had with a proc call, especially on one of the hottest procs in the
/// game (MouseEntered).
- var/screentip_color
+ // var/screentip_color
+
+ // We don't actually do proccalls really yet, so let's grab at prefs
var/atom/movable/screen/movable/action_button/hide_toggle/hide_actions_toggle
var/action_buttons_hidden = FALSE
diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm
index b426db1aac45..2e9ed3211fbe 100644
--- a/code/_onclick/hud/new_player.dm
+++ b/code/_onclick/hud/new_player.dm
@@ -241,7 +241,7 @@
if(!.)
return
- hud.mymob.client.prefs.current_tab = GAME_PREFERENCES_TAB
+ hud.mymob.client.prefs.current_tab = PREFERENCES_TAB
hud.mymob.client.prefs.ShowChoices(hud.mymob)
/atom/movable/screen/lobby/button/changelog_button
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index 02c8afdfc79a..01393ed0d194 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -487,7 +487,7 @@ SUBSYSTEM_DEF(job)
if(job.dresscodecompliant)// CIT CHANGE - dress code compliance
equip_loadout(N, H) // CIT CHANGE - allows players to spawn with loadout items
job.after_spawn(H, M.client, joined_late) // note: this happens before the mob has a key! M will always have a client, H might not.
- equip_loadout(N, H, TRUE)//CIT CHANGE - makes players spawn with in-backpack loadout items properly. A little hacky but it works
+ post_equip_loadout(N, H)//CIT CHANGE - makes players spawn with in-backpack loadout items properly. A little hacky but it works
handle_roundstart_items(H, M.ckey, H.mind.assigned_role, H.mind.special_role)
@@ -691,7 +691,7 @@ SUBSYSTEM_DEF(job)
message_admins(msg)
CRASH(msg)
-/datum/controller/subsystem/job/proc/equip_loadout(mob/dead/new_player/N, mob/living/M, equipbackpackstuff, bypass_prereqs = FALSE, can_drop = TRUE)
+/datum/controller/subsystem/job/proc/equip_loadout(mob/dead/new_player/N, mob/living/M, bypass_prereqs = FALSE, can_drop = TRUE)
var/mob/the_mob = N
if(!the_mob)
the_mob = M // cause this doesn't get assigned if player is a latejoiner
@@ -709,9 +709,68 @@ SUBSYSTEM_DEF(job)
permitted = FALSE
if(G.donoritem && !G.donator_ckey_check(the_mob.client.ckey))
permitted = FALSE
- if(!equipbackpackstuff && G.slot == ITEM_SLOT_BACKPACK)//snowflake check since plopping stuff in the backpack doesnt work for pre-job equip loadout stuffs
+ if(G.handle_post_equip)
permitted = FALSE
- if(equipbackpackstuff && G.slot != ITEM_SLOT_BACKPACK)//ditto
+ if(!permitted)
+ continue
+ var/obj/item/I = new G.path
+ if(I)
+ if(length(i[LOADOUT_COLOR])) //handle loadout colors
+ //handle polychromic items
+ if((G.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC) && length(G.loadout_initial_colors))
+ var/datum/element/polychromic/polychromic = LAZYACCESS(I.comp_lookup, "item_worn_overlays") //stupid way to do it but GetElement does not work for this
+ if(polychromic && istype(polychromic))
+ var/list/polychromic_entry = polychromic.colors_by_atom[I]
+ if(polychromic_entry)
+ if(polychromic.suits_with_helmet_typecache[I.type]) //is this one of those toggleable hood/helmet things?
+ polychromic.connect_helmet(I,i[LOADOUT_COLOR])
+ polychromic.colors_by_atom[I] = i[LOADOUT_COLOR]
+ I.update_icon()
+ else
+ //handle non-polychromic items (they only have one color)
+ I.add_atom_colour(i[LOADOUT_COLOR][1], FIXED_COLOUR_PRIORITY)
+ I.update_icon()
+ //when inputting the data it's already sanitized
+ if(i[LOADOUT_CUSTOM_NAME])
+ var/custom_name = i[LOADOUT_CUSTOM_NAME]
+ I.name = custom_name
+ if(i[LOADOUT_CUSTOM_DESCRIPTION])
+ var/custom_description = i[LOADOUT_CUSTOM_DESCRIPTION]
+ I.desc = custom_description
+ if(!M.equip_to_slot_if_possible(I, G.slot, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // If the job's dresscode compliant, try to put it in its slot, first
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ var/obj/item/storage/backpack/B = C.back
+ if(!B || !SEND_SIGNAL(B, COMSIG_TRY_STORAGE_INSERT, I, null, TRUE, TRUE)) // Otherwise, try to put it in the backpack, for carbons.
+ if(can_drop)
+ I.forceMove(get_turf(C))
+ else
+ qdel(I)
+ else if(!M.equip_to_slot_if_possible(I, ITEM_SLOT_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // Otherwise, try to put it in the backpack
+ if(can_drop)
+ I.forceMove(get_turf(M)) // If everything fails, just put it on the floor under the mob.
+ else
+ qdel(I)
+
+/datum/controller/subsystem/job/proc/post_equip_loadout(mob/dead/new_player/N, mob/living/M, bypass_prereqs = FALSE, can_drop = TRUE)
+ var/mob/the_mob = N
+ if(!the_mob)
+ the_mob = M // cause this doesn't get assigned if player is a latejoiner
+ var/list/chosen_gear = the_mob.client.prefs.loadout_data["SAVE_[the_mob.client.prefs.loadout_slot]"]
+ if(the_mob.client && the_mob.client.prefs && (chosen_gear && chosen_gear.len))
+ if(!ishuman(M))//no silicons allowed
+ return
+ for(var/i in chosen_gear)
+ var/datum/gear/G = istext(i[LOADOUT_ITEM]) ? text2path(i[LOADOUT_ITEM]) : i[LOADOUT_ITEM]
+ G = GLOB.loadout_items[initial(G.category)][initial(G.subcategory)][initial(G.name)]
+ if(!G)
+ continue
+ var/permitted = TRUE
+ if(!bypass_prereqs && G.restricted_roles && G.restricted_roles.len && !(M.mind.assigned_role in G.restricted_roles))
+ permitted = FALSE
+ if(G.donoritem && !G.donator_ckey_check(the_mob.client.ckey))
+ permitted = FALSE
+ if(!G.handle_post_equip)
permitted = FALSE
if(!permitted)
continue
diff --git a/code/datums/components/dullahan.dm b/code/datums/components/dullahan.dm
index 973f06a61e4a..94733636c753 100644
--- a/code/datums/components/dullahan.dm
+++ b/code/datums/components/dullahan.dm
@@ -114,17 +114,17 @@
cut_overlays()
/obj/item/dullahan_head/proc/add_head_overlay(var/overlay)
- overlays_standing += overlay
+ LAZYADD(overlays_standing, overlay) //SPLURT edit
add_overlay(overlay)
/obj/item/dullahan_head/update_appearance()
if(owner && !HAS_TRAIT(owner, TRAIT_HUMAN_NO_RENDER))
- remove_head_overlays()
+ //remove_head_overlays() //SPLURT edit
// to do this without duplicating large amounts of code
// it's best to regenerate the head, then remove it once we have the overlays we want
owner.regenerate_limb(BODY_ZONE_HEAD, TRUE) // don't heal them
- owner.cut_overlays()
- owner.regenerate_icons(TRUE) // yes i know it's expensive but do you want me to rewrite our entire overlay system, also block recursive calls here by passing in TRUE (it wont go back to call update_appearance this way)
+ //owner.cut_overlays() //SPLURT edit
+ //owner.regenerate_icons(TRUE) // yes i know it's expensive but do you want me to rewrite our entire overlay system, also block recursive calls here by passing in TRUE (it wont go back to call update_appearance this way) //SPLURT edit
var/obj/item/bodypart/head/head = owner.get_bodypart(BODY_ZONE_HEAD)
if(head)
add_overlay(head.get_limb_icon(FALSE, TRUE, TRUE))
@@ -154,12 +154,8 @@
/datum/action/item_action/organ_action/dullahan/Trigger()
. = ..()
var/mob/living/carbon/human/H = owner
- var/obj/item/organ/eyes/E = owner.getorganslot(ORGAN_SLOT_EYES)
- if(E)
- if(E.tint)
- E.tint = 0
- else
- E.tint = INFINITY
+
+ toggle_monochromacy() //SPLURT edit
var/datum/component/dullahan/D = H.GetComponent(/datum/component/dullahan)
if(D)
@@ -171,8 +167,7 @@
return .
var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
if(eyes)
- H.update_tint()
- if(eyes.tint)
+ if(eyes.monochromacy_on) //SPLURT edit
H.reset_perspective(H)
else
H.reset_perspective(dullahan_head)
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 2351b7b4ba5d..0ca8f07c413a 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -240,7 +240,7 @@
/datum/datacore/proc/manifest_inject(mob/living/carbon/human/H, client/C, datum/preferences/prefs)
set waitfor = FALSE
var/static/list/show_directions = list(SOUTH, WEST)
- if(H.mind && (H.mind.assigned_role != H.mind.special_role))
+ if(H.mind && (H.mind.assigned_role != H.mind.special_role) && (H.mind.assigned_role != "Stowaway"))
var/assignment
if(H.mind.assigned_role)
assignment = H.mind.assigned_role
diff --git a/code/datums/elements/object_reskinning.dm b/code/datums/elements/object_reskinning.dm
index 8b5d905e723c..a75a818fc3da 100644
--- a/code/datums/elements/object_reskinning.dm
+++ b/code/datums/elements/object_reskinning.dm
@@ -18,21 +18,20 @@
/datum/element/object_reskinning
element_flags = ELEMENT_DETACH
-/datum/element/object_reskinning/Attach(datum/target)
+/datum/element/object_reskinning/Attach(obj/target)
. = ..()
- var/obj/the_obj = target
- if(!istype(the_obj))
+ if(!istype(target))
return ELEMENT_INCOMPATIBLE
- if(!islist(the_obj.unique_reskin) || !length(the_obj.unique_reskin))
+ if(!islist(target.unique_reskin) || !length(target.unique_reskin))
message_admins("[src] was given to an object without any unique reskins, if you really need to, give it a couple skins first.")
return ELEMENT_INCOMPATIBLE
- RegisterSignal(the_obj, COMSIG_PARENT_EXAMINE, .proc/on_examine)
- RegisterSignal(the_obj, the_obj.reskin_binding, .proc/reskin)
+ RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/on_examine)
+ RegisterSignal(target, target.reskin_binding, .proc/reskin)
+ RegisterSignal(target, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, .proc/on_requesting_context_from_item)
-/datum/element/object_reskinning/Detach(datum/source, force)
- var/obj/being_deleted = source
- UnregisterSignal(source, list(COMSIG_PARENT_EXAMINE, being_deleted.reskin_binding))
+/datum/element/object_reskinning/Detach(obj/source, force)
+ UnregisterSignal(source, list(COMSIG_PARENT_EXAMINE, source.reskin_binding, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM))
return ..()
/datum/element/object_reskinning/proc/on_examine(obj/obj, mob/user, list/examine_list)
@@ -102,3 +101,19 @@
if(user.incapacitated())
return FALSE
return TRUE
+
+/datum/element/object_reskinning/proc/on_requesting_context_from_item(
+ obj/source,
+ list/context,
+ obj/item/held_item,
+ mob/living/user,
+)
+ SIGNAL_HANDLER
+
+ if(isnull(held_item))
+ switch(source.reskin_binding)
+ if(COMSIG_CLICK_CTRL_SHIFT)
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB], INTENT_ANY, "Reskin PDA")
+ else
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, "Reskin [source]")
+ return CONTEXTUAL_SCREENTIP_SET
diff --git a/code/datums/elements/screentips/README.md b/code/datums/elements/screentips/README.md
new file mode 100644
index 000000000000..5b4ee4fd1852
--- /dev/null
+++ b/code/datums/elements/screentips/README.md
@@ -0,0 +1,136 @@
+# Contextual screentips (and when to not use this folder)
+
+Contextual screentips provide information in the form of text at the top of your screen to inform you of the possibilities of an item. The "contextual" here refers to this being handled entirely through code, what it displays and when is completely up to you.
+
+## The elements (and this folder)
+
+This folder provides several useful shortcuts to be able to handle 95% of situations.
+
+### `/datum/element/contextual_screentip_bare_hands`
+
+This element is used to display screentips **when the user hovers over the object with nothing in their active hand.**
+
+It takes parameters in the form of both non-combat mode and, optionally, combat mode.
+
+Example:
+
+```dm
+/obj/machinery/firealarm/Initialize(mapload)
+ . = ..()
+
+ AddElement( \
+ /datum/element/contextual_screentip_bare_hands, \
+ lmb_text = list(INTENT_HELP = "Turn on"), \
+ rmb_text = list(INTENT_HELP = "Turn off"), \
+ )
+```
+
+This will display "LMB: Turn on | RMB: Turn off" when the user hovers over a fire alarm with an empty active hand.
+
+### `/datum/element/contextual_screentip_tools`
+
+This element takes a map of tool behaviors to [context lists](#context-lists). These will be displayed **when the user hovers over the object with an item that has the tool behavior.**
+
+Example:
+
+```dm
+/obj/structure/table/Initialize(mapload)
+ if (!(flags_1 & NODECONSTRUCT_1))
+ var/static/list/tool_behaviors = list(
+ TOOL_SCREWDRIVER = list(
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Disassemble"),
+ ),
+
+ TOOL_WRENCH = list(
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Deconstruct"),
+ ),
+ )
+
+ AddElement(/datum/element/contextual_screentip_tools, tool_behaviors)
+```
+
+This will display "LMB: Deconstruct" when the user hovers over a table with a wrench.
+
+### `/datum/element/contextual_screentip_item_typechecks`
+
+This element takes a map of item typepaths to [context lists](#context-lists). These will be displayed **when the user hovers over the object with the selected item.**
+
+Example:
+
+```dm
+/obj/item/restraints/handcuffs/cable/Initialize(mapload)
+ . = ..()
+
+ var/static/list/hovering_item_typechecks = list(
+ /obj/item/stack/rods = list(
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Craft wired rod"),
+ ),
+
+ /obj/item/stack/sheet/iron = list(
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Craft bola"),
+ ),
+ )
+
+ AddElement(/datum/element/contextual_screentip_item_typechecks, hovering_item_typechecks)
+```
+
+This will display "LMB: Craft bola" when the user hovers over cable restraints with metal in their hand.
+
+## The basic system (and when to not use this folder)
+
+The basic system acknowledges the following two interactions:
+
+### Self-defining items (Type A)
+These are items that are defined by their behavior. These should define their contextual text within themselves, and not in their targets.
+
+- Stun batons (LMB to stun, RMB to harm)
+- Syringes (LMB to inject, RMB to draw)
+- Health analyzers (LMB to scan for health/wounds [another piece of context], RMB to scans for chemicals)
+
+### Receiving action defining objects (Type B)
+These are objects (not necessarily items) that are defined by what happens *to* them. These should define their contextual text within themselves, and not in their operating tools.
+
+- Tables (RMB with wrench to deconstruct)
+- Construction objects (LMB with glass to put in screen for computers)
+- Carbon copies (RMB to take a copy)
+
+---
+
+Both of these are supported, and can be hooked to through several means.
+
+Note that you **must return `CONTEXTUAL_SCREENTIP_SET` if you change the contextual screentip at all**, otherwise you may not see it.
+
+### `COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET`
+
+This signal is registered on **items**, and receives **the hovering object**, provided in the form of `obj/item/source, list/context, atom/target, mob/living/user`.
+
+### `/atom/proc/register_item_context()`, and `/atom/proc/add_item_context()`
+`/atom/proc/add_item_context()` is a proc intended to be overridden to easily create Type-B interactions (ones where atoms are hovered over by items). It receives the exact same arguments as `COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET`: `obj/item/source, list/context, atom/target, mob/living/user`.
+
+In order for your `add_item_context()` method to be run, you **must** call `register_item_context()`.
+
+### `COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM`
+
+This signal is registered on **atoms**, and receives **what the user is hovering with**, provided in the form of `atom/source, list/context, obj/item/held_item, mob/living/user`.
+
+### `/atom/proc/register_context()`, and `/atom/proc/add_context()`
+`/atom/proc/add_context()` is a proc intended to be overridden to easily create Type-B interactions (ones where atoms are hovered over by items). It receives the exact same arguments as `COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM`: `atom/source, list/context, obj/item/held_item, mob/living/user`.
+
+In order for your `add_context()` method to be run, you **must** call `register_context()`.
+
+---
+
+When using any of these methods, you will receive a mutable context list.
+
+### Context lists
+
+Context lists are lists with keys mapping from `SCREENTIP_CONTEXT_*` to a string. You can find these keys in `code/__DEFINES/screentips.dm`.
+
+The signals and `add_context()` variants mutate the list directly, while shortcut elements will just have you pass them in directly.
+
+For example:
+
+```dm
+context[SCREENTIP_CONTEXT_LMB] = "Open"
+context[SCREENTIP_CONTEXT_RMB] = "Destroy"
+```
diff --git a/code/datums/elements/screentips/contextual_screentip_bare_hands.dm b/code/datums/elements/screentips/contextual_screentip_bare_hands.dm
new file mode 100644
index 000000000000..98ef45af3ff3
--- /dev/null
+++ b/code/datums/elements/screentips/contextual_screentip_bare_hands.dm
@@ -0,0 +1,92 @@
+/// Apply basic contextual screentips when the user hovers over this item with an empty hand.
+/// A "Type B" interaction.
+/// This stacks with other contextual screentip elements, though you may want to register the signal/flag manually at that point for performance.
+/datum/element/contextual_screentip_bare_hands
+ element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH
+ id_arg_index = 3
+
+ /* How to use SandPoot's version of this:
+ *
+ * Combat mode will be checked first, then the intents for it, if the
+ * current intent has not been set it defaults to the first item of the list.
+ *
+ * Otherwise if not in combat mode or no messages for it
+ * will also try to get messages for the current intent
+ * if failing to, will try to get the first item of the list.
+ */
+
+ /// If set, the text to show for LMB
+ var/list/lmb_text
+
+ /// If set, the text to show for RMB
+ var/list/rmb_text
+
+ /// If set, the text to show for LMB when in combat mode. Otherwise, defaults to lmb_text.
+ var/list/lmb_text_combat_mode
+
+ /// If set, the text to show for RMB when in combat mode. Otherwise, defaults to rmb_text.
+ var/list/rmb_text_combat_mode
+
+// If you're curious about `use_named_parameters`, it's because you should use named parameters!
+// AddElement(/datum/element/contextual_screentip_bare_hands, lmb_text = list(INTENT_HELP = "Do the thing"))
+/datum/element/contextual_screentip_bare_hands/Attach(
+ datum/target,
+ use_named_parameters,
+ lmb_text,
+ rmb_text,
+ lmb_text_combat_mode,
+ rmb_text_combat_mode,
+)
+ . = ..()
+ if (!isatom(target))
+ return ELEMENT_INCOMPATIBLE
+
+ if (!isnull(use_named_parameters))
+ CRASH("Use named parameters instead of positional ones.")
+
+ src.lmb_text = lmb_text
+ src.rmb_text = rmb_text
+ src.lmb_text_combat_mode = lmb_text_combat_mode || lmb_text
+ src.rmb_text_combat_mode = rmb_text_combat_mode || rmb_text
+
+ var/atom/atom_target = target
+ atom_target.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1
+ RegisterSignal(atom_target, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, .proc/on_requesting_context_from_item)
+
+/datum/element/contextual_screentip_bare_hands/Detach(datum/source, ...)
+ UnregisterSignal(source, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM)
+
+ // We don't remove HAS_CONTEXTUAL_SCREENTIPS_1, since there could be other stuff still hooked to it,
+ // and being set without signals is not dangerous, just less performant.
+ // A lot of things don't do this, perhaps make a proc that checks if any signals are still set, and if not,
+ // remove the flag.
+
+ return ..()
+
+/datum/element/contextual_screentip_bare_hands/proc/on_requesting_context_from_item(
+ datum/source,
+ list/context,
+ obj/item/held_item,
+ mob/living/user,
+)
+ SIGNAL_HANDLER
+
+ if (!isnull(held_item))
+ return NONE
+
+ var/combat_mode = SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)
+
+ // Combat lmb
+ if(combat_mode && length(lmb_text_combat_mode))
+ context[SCREENTIP_CONTEXT_LMB] = lmb_text_combat_mode
+ // LMB
+ else if(length(lmb_text))
+ context[SCREENTIP_CONTEXT_LMB] = lmb_text
+ // Combat rmb
+ if(combat_mode && length(rmb_text_combat_mode))
+ context[SCREENTIP_CONTEXT_RMB] = rmb_text_combat_mode
+ // RMB
+ else if(length(rmb_text))
+ context[SCREENTIP_CONTEXT_RMB] = rmb_text
+
+ return CONTEXTUAL_SCREENTIP_SET
diff --git a/code/datums/elements/screentips/contextual_screentip_item_typechecks.dm b/code/datums/elements/screentips/contextual_screentip_item_typechecks.dm
new file mode 100644
index 000000000000..44ff1f3190f6
--- /dev/null
+++ b/code/datums/elements/screentips/contextual_screentip_item_typechecks.dm
@@ -0,0 +1,47 @@
+/// Apply basic contextual screentips when the user hovers over this item with a provided item.
+/// A "Type B" interaction.
+/// This stacks with other contextual screentip elements, though you may want to register the signal/flag manually at that point for performance.
+/datum/element/contextual_screentip_item_typechecks
+ element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH
+ id_arg_index = 2
+
+ /// Map of item paths to contexts to usages
+ var/list/item_paths_to_contexts
+
+/datum/element/contextual_screentip_item_typechecks/Attach(datum/target, item_paths_to_contexts)
+ . = ..()
+ if (!isatom(target))
+ return ELEMENT_INCOMPATIBLE
+
+ src.item_paths_to_contexts = item_paths_to_contexts
+
+ var/atom/atom_target = target
+ atom_target.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1
+ RegisterSignal(atom_target, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, .proc/on_requesting_context_from_item)
+
+/datum/element/contextual_screentip_item_typechecks/Detach(datum/source, ...)
+ UnregisterSignal(source, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM)
+
+ // We don't remove HAS_CONTEXTUAL_SCREENTIPS_1, since there could be other stuff still hooked to it,
+ // and being set without signals is not dangerous, just less performant.
+ // A lot of things don't do this, perhaps make a proc that checks if any signals are still set, and if not,
+ // remove the flag.
+
+ return ..()
+
+/datum/element/contextual_screentip_item_typechecks/proc/on_requesting_context_from_item(
+ datum/source,
+ list/context,
+ obj/item/held_item,
+)
+ SIGNAL_HANDLER
+
+ if (isnull(held_item))
+ return NONE
+
+ for (var/item_path in item_paths_to_contexts)
+ if (istype(held_item, item_path))
+ context += item_paths_to_contexts[item_path]
+ return CONTEXTUAL_SCREENTIP_SET
+
+ return NONE
diff --git a/code/datums/elements/screentips/contextual_screentip_sharpness.dm b/code/datums/elements/screentips/contextual_screentip_sharpness.dm
new file mode 100644
index 000000000000..0ee89f2fd77c
--- /dev/null
+++ b/code/datums/elements/screentips/contextual_screentip_sharpness.dm
@@ -0,0 +1,57 @@
+/// Apply basic contextual screentips when the user hovers over this item with an item of the given tool behavior.
+/// A "Type B" interaction.
+/// This stacks with other contextual screentip elements, though you may want to register the signal/flag manually at that point for performance.
+/datum/element/contextual_screentip_sharpness
+ element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH
+ id_arg_index = 2
+
+ /// If set, the text to show for LMB
+ var/list/lmb_text
+
+ /// If set, the text to show for RMB
+ var/list/rmb_text
+
+/datum/element/contextual_screentip_sharpness/Attach(datum/target, lmb_text, rmb_text)
+ . = ..()
+ if (!isatom(target))
+ return ELEMENT_INCOMPATIBLE
+
+ src.lmb_text = lmb_text
+ src.rmb_text = rmb_text
+
+ var/atom/atom_target = target
+ atom_target.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1
+ RegisterSignal(atom_target, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, .proc/on_requesting_context_from_item)
+
+/datum/element/contextual_screentip_sharpness/Detach(datum/source, ...)
+ UnregisterSignal(source, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM)
+
+ // We don't remove HAS_CONTEXTUAL_SCREENTIPS_1, since there could be other stuff still hooked to it,
+ // and being set without signals is not dangerous, just less performant.
+ // A lot of things don't do this, perhaps make a proc that checks if any signals are still set, and if not,
+ // remove the flag.
+
+ return ..()
+
+/datum/element/contextual_screentip_sharpness/proc/on_requesting_context_from_item(
+ datum/source,
+ list/context,
+ obj/item/held_item,
+)
+ SIGNAL_HANDLER
+
+ if (isnull(held_item))
+ return NONE
+
+ var/sharpness = held_item.get_sharpness()
+ if (!sharpness)
+ return NONE
+
+ if (length(lmb_text))
+ context[SCREENTIP_CONTEXT_LMB] = lmb_text
+
+ if (length(rmb_text))
+ context[SCREENTIP_CONTEXT_RMB] = rmb_text
+
+ return CONTEXTUAL_SCREENTIP_SET
+
diff --git a/code/datums/elements/screentips/contextual_screentip_tools.dm b/code/datums/elements/screentips/contextual_screentip_tools.dm
new file mode 100644
index 000000000000..a0850f8742b8
--- /dev/null
+++ b/code/datums/elements/screentips/contextual_screentip_tools.dm
@@ -0,0 +1,48 @@
+/// Apply basic contextual screentips when the user hovers over this item with an item of the given tool behavior.
+/// A "Type B" interaction.
+/// This stacks with other contextual screentip elements, though you may want to register the signal/flag manually at that point for performance.
+/datum/element/contextual_screentip_tools
+ element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH
+ id_arg_index = 2
+
+ /// Map of tool behaviors to contexts to usages
+ var/list/tool_behaviors
+
+/datum/element/contextual_screentip_tools/Attach(datum/target, tool_behaviors)
+ . = ..()
+ if (!isatom(target))
+ return ELEMENT_INCOMPATIBLE
+
+ src.tool_behaviors = tool_behaviors
+
+ var/atom/atom_target = target
+ atom_target.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1
+ RegisterSignal(atom_target, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, .proc/on_requesting_context_from_item)
+
+/datum/element/contextual_screentip_tools/Detach(datum/source, ...)
+ UnregisterSignal(source, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM)
+
+ // We don't remove HAS_CONTEXTUAL_SCREENTIPS_1, since there could be other stuff still hooked to it,
+ // and being set without signals is not dangerous, just less performant.
+ // A lot of things don't do this, perhaps make a proc that checks if any signals are still set, and if not,
+ // remove the flag.
+
+ return ..()
+
+/datum/element/contextual_screentip_tools/proc/on_requesting_context_from_item(
+ datum/source,
+ list/context,
+ obj/item/held_item,
+)
+ SIGNAL_HANDLER
+
+ if (isnull(held_item))
+ return NONE
+
+ var/tool_behavior = held_item.tool_behaviour
+ if (!(tool_behavior in tool_behaviors))
+ return NONE
+
+ context += tool_behaviors[tool_behavior]
+
+ return CONTEXTUAL_SCREENTIP_SET
diff --git a/code/datums/screentips/atom_context.dm b/code/datums/screentips/atom_context.dm
new file mode 100644
index 000000000000..ebab6b155adc
--- /dev/null
+++ b/code/datums/screentips/atom_context.dm
@@ -0,0 +1,25 @@
+/// Create a "Type-B" contextual screentip interaction, registering to `add_context()`.
+/// This will run `add_context()` when the atom is hovered over by an item for context.
+/// `add_context()` will *not* be called unless this is run.
+/// This is not necessary for Type-B interactions, as you can just apply the flag and register to the signal yourself.
+/atom/proc/register_context()
+ flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1
+ RegisterSignal(src, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, .proc/add_context, override = TRUE)
+
+/// Creates a "Type-B" contextual screentip interaction.
+/// When a user hovers over this, this proc will be called in order
+/// to provide context for contextual screentips.
+/// You must call `register_context()` in order for this to be registered.
+/// A screentip context list is a list that has context keys (SCREENTIP_CONTEXT_*, from __DEFINES/screentips.dm)
+/// that map to the action as text.
+/// If you mutate the list in this signal, you must return CONTEXTUAL_SCREENTIP_SET.
+/// `source` can, in all cases, be replaced with `src`, and only exists because this proc directly connects to a signal.
+/atom/proc/add_context(
+ atom/source,
+ list/context,
+ obj/item/held_item,
+ mob/living/user,
+)
+ SIGNAL_HANDLER
+
+ return NONE
diff --git a/code/datums/screentips/item_context.dm b/code/datums/screentips/item_context.dm
new file mode 100644
index 000000000000..239cd1868364
--- /dev/null
+++ b/code/datums/screentips/item_context.dm
@@ -0,0 +1,29 @@
+/// Create a "Type-A" contextual screentip interaction, registering to `add_item_context()`.
+/// This will run `add_item_context()` when the item hovers over another object for context.
+/// `add_item_context()` will *not* be called unless this is run.
+/// This is not necessary for Type-A interactions, as you can just apply the flag and register to the signal yourself.
+/obj/item/proc/register_item_context()
+ item_flags |= ITEM_HAS_CONTEXTUAL_SCREENTIPS
+ RegisterSignal(
+ src,
+ COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET,
+ .proc/add_item_context,
+ )
+
+/// Creates a "Type-A" contextual screentip interaction.
+/// When a user hovers over something with this item in hand, this proc will be called in order
+/// to provide context for contextual screentips.
+/// You must call `register_item_context()` in order for this to be registered.
+/// A screentip context list is a list that has context keys (SCREENTIP_CONTEXT_*, from __DEFINES/screentips.dm)
+/// that map to the action as text.
+/// If you mutate the list in this signal, you must return CONTEXTUAL_SCREENTIP_SET.
+/// `source` can, in all cases, be replaced with `src`, and only exists because this proc directly connects to a signal.
+/obj/item/proc/add_item_context(
+ obj/item/source,
+ list/context,
+ atom/target,
+ mob/living/user,
+)
+ SIGNAL_HANDLER
+
+ return NONE
diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm
index 5b00d2e71e29..26bc6746add3 100644
--- a/code/datums/traits/good.dm
+++ b/code/datums/traits/good.dm
@@ -128,7 +128,7 @@
var/mob/living/carbon/human/H = quirk_holder
var/obj/item/camera/camera = new(get_turf(H))
H.put_in_hands(camera)
- H.equip_to_slot(camera, ITEM_SLOT_NECK)
+ H.equip_to_slot(camera, ITEM_SLOT_BACKPACK) //SPLURT Edit
H.regenerate_icons()
/datum/quirk/selfaware
@@ -190,7 +190,7 @@
// Get targets
var/obj/item/organ/eyes/old_eyes = quirk_holder.getorganslot(ORGAN_SLOT_EYES)
var/obj/item/organ/eyes/robotic/glow/new_eyes = new
-
+
// Replace eyes
qdel(old_eyes)
new_eyes.Insert(quirk_holder)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 5b26a67caeb5..08d879645505 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1467,11 +1467,97 @@
/atom/MouseEntered(location, control, params)
. = ..()
// Screentips
- var/client/client = usr?.client
- var/datum/hud/active_hud = client?.mob?.hud_used
+ var/mob/user = usr
+ if(isnull(user) && !user.client)
+ return
+
+ var/datum/hud/active_hud = user.hud_used
if(active_hud)
- if(!client.prefs.screentip_pref || (flags_1 & NO_SCREENTIPS_1))
+ var/screentips_enabled = user.client.prefs.screentip_pref
+ if(screentips_enabled == SCREENTIP_PREFERENCE_DISABLED || (flags_1 & NO_SCREENTIPS_1))
active_hud.screentip_text.maptext = ""
else
- //We inline a MAPTEXT() here, because there's no good way to statically add to a string like this
- active_hud.screentip_text.maptext = MAPTEXT("[name] ")
+ active_hud.screentip_text.maptext_y = 0
+ var/lmb_rmb_line = ""
+ var/ctrl_lmb_ctrl_rmb_line = ""
+ var/alt_lmb_alt_rmb_line = ""
+ var/shift_lmb_ctrl_shift_lmb_line = ""
+ var/extra_lines = 0
+ var/extra_context = ""
+
+ if (isliving(user) || isovermind(user) || isaicamera(user))
+ var/obj/item/held_item = user.get_active_held_item()
+
+ if (flags_1 & HAS_CONTEXTUAL_SCREENTIPS_1 || held_item?.item_flags & ITEM_HAS_CONTEXTUAL_SCREENTIPS)
+ var/list/context = list()
+
+ var/contextual_screentip_returns = \
+ SEND_SIGNAL(src, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, context, held_item, user) \
+ | (held_item && SEND_SIGNAL(held_item, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET, context, src, user))
+
+ if (contextual_screentip_returns & CONTEXTUAL_SCREENTIP_SET)
+ // LMB and RMB on one line...
+ var/lmb_text = ""
+ if((SCREENTIP_CONTEXT_LMB in context) && (length(context[SCREENTIP_CONTEXT_LMB]) > 0))
+ lmb_text = build_context(context, SCREENTIP_CONTEXT_LMB)
+ var/rmb_text = ""
+ if((SCREENTIP_CONTEXT_RMB in context) && (length(context[SCREENTIP_CONTEXT_RMB]) > 0))
+ rmb_text = build_context(context, SCREENTIP_CONTEXT_RMB)
+
+ if (lmb_text)
+ lmb_rmb_line = lmb_text
+ if (rmb_text)
+ lmb_rmb_line += " | [rmb_text]"
+ else if (rmb_text)
+ lmb_rmb_line = rmb_text
+
+ // Ctrl-LMB, Ctrl-RMB on one line...
+ if (lmb_rmb_line != "")
+ lmb_rmb_line += " "
+ extra_lines++
+ if((SCREENTIP_CONTEXT_CTRL_LMB in context) && (length(context[SCREENTIP_CONTEXT_CTRL_LMB]) > 0))
+ ctrl_lmb_ctrl_rmb_line = build_context(context, SCREENTIP_CONTEXT_CTRL_LMB)
+
+ if((SCREENTIP_CONTEXT_CTRL_RMB in context) && (length(context[SCREENTIP_CONTEXT_CTRL_RMB]) > 0))
+ if (ctrl_lmb_ctrl_rmb_line != "")
+ ctrl_lmb_ctrl_rmb_line += " | "
+ ctrl_lmb_ctrl_rmb_line += "[SCREENTIP_CONTEXT_CTRL_RMB]: [context[SCREENTIP_CONTEXT_CTRL_RMB]]"
+ ctrl_lmb_ctrl_rmb_line = build_context(context, SCREENTIP_CONTEXT_CTRL_RMB)
+
+ // Alt-LMB, Alt-RMB on one line...
+ if (ctrl_lmb_ctrl_rmb_line != "")
+ ctrl_lmb_ctrl_rmb_line += " "
+ extra_lines++
+ if((SCREENTIP_CONTEXT_ALT_LMB in context) && (length(context[SCREENTIP_CONTEXT_ALT_LMB]) > 0))
+ alt_lmb_alt_rmb_line = build_context(context, SCREENTIP_CONTEXT_ALT_LMB)
+ if((SCREENTIP_CONTEXT_ALT_RMB in context) && (length(context[SCREENTIP_CONTEXT_ALT_RMB]) > 0))
+ if (alt_lmb_alt_rmb_line != "")
+ alt_lmb_alt_rmb_line += " | "
+ alt_lmb_alt_rmb_line = build_context(context, SCREENTIP_CONTEXT_ALT_RMB)
+
+ // Shift-LMB, Ctrl-Shift-LMB on one line...
+ if (alt_lmb_alt_rmb_line != "")
+ alt_lmb_alt_rmb_line += " "
+ extra_lines++
+ if((SCREENTIP_CONTEXT_SHIFT_LMB in context) && (length(context[SCREENTIP_CONTEXT_SHIFT_LMB]) > 0))
+ shift_lmb_ctrl_shift_lmb_line = build_context(context, SCREENTIP_CONTEXT_SHIFT_LMB)
+
+ if((SCREENTIP_CONTEXT_CTRL_SHIFT_LMB in context) && (length(context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]) > 0))
+ if (shift_lmb_ctrl_shift_lmb_line != "")
+ shift_lmb_ctrl_shift_lmb_line += " | "
+ shift_lmb_ctrl_shift_lmb_line += "[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]]"
+ shift_lmb_ctrl_shift_lmb_line = build_context(context, SCREENTIP_CONTEXT_CTRL_SHIFT_LMB)
+
+ if (shift_lmb_ctrl_shift_lmb_line != "")
+ extra_lines++
+
+ if(extra_lines)
+ extra_context = "[lmb_rmb_line][ctrl_lmb_ctrl_rmb_line][alt_lmb_alt_rmb_line][shift_lmb_ctrl_shift_lmb_line] "
+ //first extra line pushes atom name line up 10px, subsequent lines push it up 9px, this offsets that and keeps the first line in the same place
+ active_hud.screentip_text.maptext_y = -10 + (extra_lines - 1) * -9
+
+ if (screentips_enabled == SCREENTIP_PREFERENCE_CONTEXT_ONLY && extra_context == "")
+ active_hud.screentip_text.maptext = ""
+ else
+ //We inline a MAPTEXT() here, because there's no good way to statically add to a string like this
+ active_hud.screentip_text.maptext = "[name][extra_context] "
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 30363e6c0109..6c6b31fbfd1c 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -606,6 +606,16 @@
animate(time = 1)
animate(alpha = 0, time = 3, easing = CIRCULAR_EASING|EASE_OUT)
+/// Common proc used by painting tools like spraycans and palettes that can access the entire 24 bits color space.
+/obj/item/proc/pick_painting_tool_color(mob/user, default_color)
+ var/chosen_color = input(user,"Pick new color", "[src]", default_color) as color|null
+ if(!chosen_color || QDELETED(src) || IS_DEAD_OR_INCAP(user) || !user.is_holding(src))
+ return
+ set_painting_tool_color(chosen_color)
+
+/obj/item/proc/set_painting_tool_color(chosen_color)
+ SEND_SIGNAL(src, COMSIG_PAINTING_TOOL_SET_COLOR, chosen_color)
+
/atom/movable/vv_get_dropdown()
. = ..()
. += "Follow "
diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm
index c34e0a2d4f3e..cbece7626e10 100644
--- a/code/game/machinery/aug_manipulator.dm
+++ b/code/game/machinery/aug_manipulator.dm
@@ -15,6 +15,7 @@
"Talon" = 'icons/mob/augmentation/cosmetic_prosthetic/talon.dmi',
"Nanotrasen" = 'icons/mob/augmentation/cosmetic_prosthetic/nanotrasen.dmi',
"Hephaesthus" = 'icons/mob/augmentation/cosmetic_prosthetic/hephaestus.dmi',
+ "Veymed" = 'icons/mob/augmentation/cosmetic_prosthetic/veymed.dmi', //i don't know if i can module this either
"Bishop" = 'icons/mob/augmentation/cosmetic_prosthetic/bishop.dmi',
"Xion" = 'icons/mob/augmentation/cosmetic_prosthetic/xion.dmi',
"Grayson" = 'icons/mob/augmentation/cosmetic_prosthetic/grayson.dmi',
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index a16e70155f13..50ad14d0fc2c 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -28,6 +28,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
var/list/blacklisted = list(
"AI",
"Assistant",
+ "Stowaway",
"Cyborg",
"Captain",
"Head of Personnel",
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index eca5fc4ce370..8921232c069c 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -158,7 +158,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
if (I)
name = I.registered_name
assignment = I.assignment
- ijob = jobs[I.assignment]
+ ijob = jobs[GetJobName(I.assignment)]
else
name = "Unknown"
assignment = ""
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 45bb9bd327b5..d5b47d45f69c 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -18,6 +18,8 @@
var/sortBy = "name"
var/order = 1 // -1 = Descending - 1 = Ascending
+ var/list/logged_access
+
light_color = LIGHT_COLOR_RED
/obj/machinery/computer/secure_data/syndie
@@ -295,6 +297,9 @@ What a mess.*/
screen = null
active1 = null
active2 = null
+
+ logged_access = null
+
playsound(src, 'sound/machines/terminal_off.ogg', 50, FALSE)
if("Log In")
@@ -307,18 +312,27 @@ What a mess.*/
authenticated = borg.name
rank = "AI"
screen = 1
+
+ logged_access = get_all_accesses()
+
else if(IsAdminGhost(M))
active1 = null
active2 = null
authenticated = M.client.holder.admin_signature
rank = "Central Command"
screen = 1
+
+ logged_access = get_centcom_access("CentCom Commander")
+
else if(I && check_access(I))
active1 = null
active2 = null
authenticated = I.registered_name
rank = I.assignment
screen = 1
+
+ logged_access = I.access
+
else
to_chat(usr, "Unauthorized Access. ")
playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE)
@@ -583,7 +597,7 @@ What a mess.*/
active1.fields["age"] = t1
if("species")
if(istype(active1, /datum/data/record))
- var/t1 = input("Select a species", "Species Selection") as null|anything in GLOB.roundstart_races
+ var/t1 = stripped_input("Please input species name", "Sec. records", active1.fields["species"], null)
if(!canUseSecurityRecordsConsole(usr, t1, a1))
return
active1.fields["species"] = t1
@@ -678,9 +692,7 @@ What a mess.*/
temp += "
Discharged "
temp += ""
if("rank")
- var/list/L = list( "Head of Personnel", "Captain", "AI", "Central Command" )
- //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
- if((istype(active1, /datum/data/record) && L.Find(rank)))
+ if(istype(active1, /datum/data/record) && ((ACCESS_CAPTAIN in logged_access) || (ACCESS_HOP in logged_access)))
temp = "Rank: "
temp += ""
for(var/rank in get_all_jobs())
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 84e7b93e1ba9..0b31ecdf9f49 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -697,6 +697,42 @@
. += "Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it. "
. += "Ctrl-Shift-click [src] to [ emergency ? "disable" : "enable"] emergency access. "
+/obj/machinery/door/airlock/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+
+ if(istype(held_item, /obj/item/stack/sheet/plasteel))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Reinforce")
+ return CONTEXTUAL_SCREENTIP_SET
+
+ switch (held_item?.tool_behaviour)
+ if (TOOL_CROWBAR)
+ if (panel_open)
+ if (security_level == AIRLOCK_SECURITY_PLASTEEL_O_S || security_level == AIRLOCK_SECURITY_PLASTEEL_I_S)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Remove shielding")
+ return CONTEXTUAL_SCREENTIP_SET
+ else if (should_try_removing_electronics())
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Remove electronics")
+ return CONTEXTUAL_SCREENTIP_SET
+
+ // Not always contextually true, but is contextually false in ways that make gameplay interesting.
+ // For example, trying to pry open an airlock, only for the bolts to be down and the lights off.
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Pry open")
+
+ return CONTEXTUAL_SCREENTIP_SET
+ if (TOOL_WELDER)
+ LAZYSET(context[SCREENTIP_CONTEXT_RMB], INTENT_ANY, "Weld shut")
+
+ if (panel_open)
+ switch (security_level)
+ if (AIRLOCK_SECURITY_METAL, AIRLOCK_SECURITY_PLASTEEL_I, AIRLOCK_SECURITY_PLASTEEL_O)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Cut shielding")
+ return CONTEXTUAL_SCREENTIP_SET
+
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Repair")
+ return CONTEXTUAL_SCREENTIP_SET
+
+ return .
+
/obj/machinery/door/airlock/attack_ai(mob/user)
if(!src.canAIControl(user))
if(src.canAIHack())
@@ -1024,6 +1060,31 @@
return
return !operating && density
+/// Returns if a crowbar would remove the airlock electronics
+/obj/machinery/door/airlock/proc/should_try_removing_electronics()
+ if (security_level != 0)
+ return FALSE
+
+ if (!panel_open)
+ return FALSE
+
+ if (obj_flags & EMAGGED)
+ return TRUE
+
+ if (!density)
+ return FALSE
+
+ if (!welded)
+ return FALSE
+
+ if (hasPower())
+ return FALSE
+
+ if (locked)
+ return FALSE
+
+ return TRUE
+
/obj/machinery/door/airlock/try_to_crowbar(obj/item/I, mob/living/user)
var/beingcrowbarred = null
if(I.tool_behaviour == TOOL_CROWBAR)
@@ -1042,9 +1103,9 @@
charge.forceMove(get_turf(user))
charge = null
return
- if(beingcrowbarred && panel_open && ((obj_flags & EMAGGED) || (density && welded && !operating && !hasPower() && !locked)))
- user.visible_message("[user] removes the electronics from the airlock assembly.", \
- "You start to remove electronics from the airlock assembly... ")
+ if(beingcrowbarred && should_try_removing_electronics() && !operating)
+ user.visible_message(span_notice("[user] removes the electronics from the airlock assembly."), \
+ span_notice("You start to remove electronics from the airlock assembly..."))
if(I.use_tool(src, user, 40, volume=100))
deconstruct(TRUE, user)
return
@@ -1201,81 +1262,29 @@
locked = TRUE
return
+// gets called when a player uses an airlock painter on this airlock
+/obj/machinery/door/airlock/proc/change_paintjob(obj/item/airlock_painter/painter, mob/user)
+ if((!in_range(src, user) && loc != user) || !painter.can_use(user)) // user should be adjacent to the airlock, and the painter should have a toner cartridge that isn't empty
+ return
-/obj/machinery/door/airlock/proc/change_paintjob(obj/item/airlock_painter/W, mob/user)
- if(!W.can_use(user))
+ // reads from the airlock painter's `available paintjob` list. lets the player choose a paint option, or cancel painting
+ var/current_paintjob = tgui_input_list(user, "Paintjob for this airlock", "Customize", sortList(painter.available_paint_jobs))
+ if(isnull(current_paintjob)) // if the user clicked cancel on the popup, return
return
- var/list/optionlist
- if(airlock_material == "glass")
- optionlist = list("Standard", "Public", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Science", "Virology", "Mining", "Maintenance", "External", "External Maintenance")
- else
- optionlist = list("Standard", "Public", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Freezer", "Science", "Virology", "Mining", "Maintenance", "External", "External Maintenance")
+ var/airlock_type = painter.available_paint_jobs["[current_paintjob]"] // get the airlock type path associated with the airlock name the user just chose
+ var/obj/machinery/door/airlock/airlock = airlock_type // we need to create a new instance of the airlock and assembly to read vars from them
+ var/obj/structure/door_assembly/assembly = initial(airlock.assemblytype)
- var/paintjob = input(user, "Please select a paintjob for this airlock.") in optionlist
- if((!in_range(src, usr) && src.loc != usr) || !W.use_paint(user))
+ if(airlock_material == "glass" && initial(assembly.noglass)) // prevents painting glass airlocks with a paint job that doesn't have a glass version, such as the freezer
+ to_chat(user, span_warning("This paint job can only be applied to non-glass airlocks."))
return
- switch(paintjob)
- if("Standard")
- icon = 'icons/obj/doors/airlocks/station/public.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly
- if("Public")
- icon = 'icons/obj/doors/airlocks/station2/glass.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_public
- if("Engineering")
- icon = 'icons/obj/doors/airlocks/station/engineering.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_eng
- if("Atmospherics")
- icon = 'icons/obj/doors/airlocks/station/atmos.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_atmo
- if("Security")
- icon = 'icons/obj/doors/airlocks/station/security.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_sec
- if("Command")
- icon = 'icons/obj/doors/airlocks/station/command.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_com
- if("Medical")
- icon = 'icons/obj/doors/airlocks/station/medical.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_med
- if("Research")
- icon = 'icons/obj/doors/airlocks/station/research.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_research
- if("Freezer")
- icon = 'icons/obj/doors/airlocks/station/freezer.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_fre
- if("Science")
- icon = 'icons/obj/doors/airlocks/station/science.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_science
- if("Virology")
- icon = 'icons/obj/doors/airlocks/station/virology.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_viro
- if("Mining")
- icon = 'icons/obj/doors/airlocks/station/mining.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_min
- if("Maintenance")
- icon = 'icons/obj/doors/airlocks/station/maintenance.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_mai
- if("External")
- icon = 'icons/obj/doors/airlocks/external/external.dmi'
- overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_ext
- if("External Maintenance")
- icon = 'icons/obj/doors/airlocks/station/maintenanceexternal.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_extmai
+
+ // applies the user-chosen airlock's icon, overlays and assemblytype to the src airlock
+ painter.use_paint(user)
+ icon = initial(airlock.icon)
+ overlays_file = initial(airlock.overlays_file)
+ assemblytype = initial(airlock.assemblytype)
update_icon()
/obj/machinery/door/airlock/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index ef47a0e7f6de..d565984bf0c0 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -55,6 +55,13 @@
if(!poddoor)
. += "Its maintenance panel is screwed in place. "
+/obj/machinery/door/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+
+ if (isnull(held_item) && !istype(src, /obj/machinery/door/firedoor)) // You cannot open/close with your hands
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, (density ? "Open" : "Close"))
+ return CONTEXTUAL_SCREENTIP_SET
+
/obj/machinery/door/check_access_list(list/access_list)
if(red_alert_access && GLOB.security_level >= SEC_LEVEL_RED)
return TRUE
@@ -65,6 +72,7 @@
set_init_door_layer()
update_freelook_sight()
air_update_turf(1)
+ register_context()
GLOB.airlocks += src
spark_system = new /datum/effect_system/spark_spread
spark_system.set_up(2, 1, src)
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index c0866ce16596..b094f5c28a4c 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -46,6 +46,34 @@
else
. += "The bolt locks have been unscrewed , but the bolts themselves are still wrenched to the floor. "
+/obj/machinery/door/firedoor/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+
+ if (isnull(held_item))
+ if (density)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Knock")
+ return CONTEXTUAL_SCREENTIP_SET
+ else
+ return .
+
+ switch (held_item.tool_behaviour)
+ if (TOOL_CROWBAR)
+ if(!welded)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, (density ? "Open" : "Close"))
+ return CONTEXTUAL_SCREENTIP_SET
+ if (TOOL_WELDER)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, (welded ? "Unweld shut" : "Weld shut"))
+ return CONTEXTUAL_SCREENTIP_SET
+ if (TOOL_WRENCH)
+ if (welded && !boltslocked)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Unfasten bolts")
+ return CONTEXTUAL_SCREENTIP_SET
+ if (TOOL_SCREWDRIVER)
+ if (welded)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, (boltslocked ? "Unlock bolts" : "Lock bolts"))
+ return CONTEXTUAL_SCREENTIP_SET
+ return .
+
/obj/machinery/door/firedoor/proc/CalculateAffectingAreas()
remove_from_areas()
affecting_areas = get_adjacent_open_areas(src) | get_base_area(src)
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index fe756b4022c3..1fbab1f75d9f 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -56,6 +56,15 @@
LAZYADD(myarea.firealarms, src)
wires = new /datum/wires/firealarm(src)
+ register_context()
+
+/obj/machinery/firealarm/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+
+ if(isnull(held_item))
+ var/area/location = get_area(src)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, (location.fire ? "Turn off" : "Turn on"))
+ return CONTEXTUAL_SCREENTIP_SET
/obj/machinery/firealarm/Destroy()
myarea.firereset(src)
diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm
index 5bd8ecc85e29..b239033dca47 100644
--- a/code/game/objects/items/airlock_painter.dm
+++ b/code/game/objects/items/airlock_painter.dm
@@ -1,10 +1,11 @@
/obj/item/airlock_painter
name = "airlock painter"
desc = "An advanced autopainter preprogrammed with several paintjobs for airlocks. Use it on an airlock during or after construction to change the paintjob."
+// desc_controls = "Alt-Click to remove the ink cartridge."
icon = 'icons/obj/objects.dmi'
- icon_state = "paint sprayer"
- item_state = "paint sprayer"
-
+ icon_state = "paint_sprayer"
+ item_state = "paint_sprayer" // inhand_icon_state = "paint_sprayer"
+ // worn_icon_state = "painter"
w_class = WEIGHT_CLASS_SMALL
custom_materials = list(/datum/material/iron=50, /datum/material/glass=50)
@@ -14,40 +15,66 @@
slot_flags = ITEM_SLOT_BELT
usesound = 'sound/effects/spray2.ogg'
+ /// The ink cartridge to pull charges from.
var/obj/item/toner/ink = null
+ /// The type path to instantiate for the ink cartridge the device initially comes with, eg. /obj/item/toner
+ var/initial_ink_type = /obj/item/toner
+ /// Associate list of all paint jobs the airlock painter can apply. The key is the name of the airlock the user will see. The value is the type path of the airlock
+ var/list/available_paint_jobs = list(
+ "Public" = /obj/machinery/door/airlock/public,
+ "Engineering" = /obj/machinery/door/airlock/engineering,
+ "Atmospherics" = /obj/machinery/door/airlock/atmos,
+ "Security" = /obj/machinery/door/airlock/security,
+ "Command" = /obj/machinery/door/airlock/command,
+ "Medical" = /obj/machinery/door/airlock/medical,
+ "Virology" = /obj/machinery/door/airlock/virology,
+ "Research" = /obj/machinery/door/airlock/research,
+// "Hydroponics" = /obj/machinery/door/airlock/hydroponics,
+ "Freezer" = /obj/machinery/door/airlock/freezer,
+ "Science" = /obj/machinery/door/airlock/science,
+ "Mining" = /obj/machinery/door/airlock/mining,
+ "Maintenance" = /obj/machinery/door/airlock/maintenance,
+ "External" = /obj/machinery/door/airlock/external,
+ "External Maintenance"= /obj/machinery/door/airlock/maintenance/external,
+ "Standard" = /obj/machinery/door/airlock
+ )
/obj/item/airlock_painter/Initialize(mapload)
. = ..()
- ink = new /obj/item/toner(src)
+ ink = new initial_ink_type(src)
+
+/obj/item/airlock_painter/examine(mob/user)
+ . = ..()
+ . += span_notice("Alt-Click to remove the ink cartridge.")
//This proc doesn't just check if the painter can be used, but also uses it.
//Only call this if you are certain that the painter will be used right after this check!
/obj/item/airlock_painter/proc/use_paint(mob/user)
if(can_use(user))
ink.charges--
- playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1)
- return 1
+ playsound(src.loc, 'sound/effects/spray2.ogg', 50, TRUE)
+ return TRUE
else
- return 0
+ return FALSE
//This proc only checks if the painter can be used.
//Call this if you don't want the painter to be used right after this check, for example
//because you're expecting user input.
/obj/item/airlock_painter/proc/can_use(mob/user)
if(!ink)
- to_chat(user, "There is no toner cartridge installed in [src]! ")
- return 0
+ balloon_alert(user, "no cartridge!")
+ return FALSE
else if(ink.charges < 1)
- to_chat(user, "[src] is out of ink! ")
- return 0
+ balloon_alert(user, "out of ink!")
+ return FALSE
else
- return 1
+ return TRUE
-/obj/item/airlock_painter/suicide_act(mob/user)
+/obj/item/airlock_painter/suicide_act(mob/living/user)
var/obj/item/organ/lungs/L = user.getorganslot(ORGAN_SLOT_LUNGS)
if(can_use(user) && L)
- user.visible_message("[user] is inhaling toner from [src]! It looks like [user.p_theyre()] trying to commit suicide! ")
+ user.visible_message(span_suicide("[user] is inhaling toner from [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
use(user)
// Once you've inhaled the toner, you throw up your lungs
@@ -64,7 +91,7 @@
if(!L)
return OXYLOSS
- L.Remove()
+ L.Remove(user)
// make some colorful reagent, and apply it to the lungs
L.create_reagents(10, NONE, NO_REAGENTS_VALUE)
@@ -73,27 +100,27 @@
// TODO maybe add some colorful vomit?
- user.visible_message("[user] vomits out [user.p_their()] [L]! ")
- playsound(user.loc, 'sound/effects/splat.ogg', 50, 1)
+ user.visible_message(span_suicide("[user] vomits out [user.p_their()] [L]!"))
+ playsound(user.loc, 'sound/effects/splat.ogg', 50, TRUE)
L.forceMove(T)
return (TOXLOSS|OXYLOSS)
else if(can_use(user) && !L)
- user.visible_message("[user] is spraying toner on [user.p_them()]self from [src]! It looks like [user.p_theyre()] trying to commit suicide. ")
+ user.visible_message(span_suicide("[user] is spraying toner on [user.p_them()]self from [src]! It looks like [user.p_theyre()] trying to commit suicide."))
user.reagents.add_reagent(/datum/reagent/colorful_reagent, 1)
user.reagents.reaction(user, TOUCH, 1)
return TOXLOSS
else
- user.visible_message("[user] is trying to inhale toner from [src]! It might be a suicide attempt if [src] had any toner. ")
+ user.visible_message(span_suicide("[user] is trying to inhale toner from [src]! It might be a suicide attempt if [src] had any toner."))
return SHAME
/obj/item/airlock_painter/examine(mob/user)
. = ..()
if(!ink)
- . += "It doesn't have a toner cartridge installed. "
+ . += span_notice("It doesn't have a toner cartridge installed.")
return
var/ink_level = "high"
if(ink.charges < 1)
@@ -102,89 +129,129 @@
ink_level = "low"
else if((ink.charges/ink.max_charges) > 1) //Over 100% (admin var edit)
ink_level = "dangerously high"
- . += "Its ink levels look [ink_level]. "
+ . += span_notice("Its ink levels look [ink_level].")
/obj/item/airlock_painter/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/toner))
if(ink)
- to_chat(user, "[src] already contains \a [ink]. ")
+ to_chat(user, span_warning("[src] already contains \a [ink]!"))
return
if(!user.transferItemToLoc(W, src))
return
- to_chat(user, "You install [W] into [src]. ")
+ to_chat(user, span_notice("You install [W] into [src]."))
ink = W
- playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
+ playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
else
return ..()
-/obj/item/airlock_painter/attack_self(mob/user)
+/obj/item/airlock_painter/AltClick(mob/user)
+ . = ..()
if(ink)
- playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
+ playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
ink.forceMove(user.drop_location())
user.put_in_hands(ink)
- to_chat(user, "You remove [ink] from [src]. ")
+ to_chat(user, span_notice("You remove [ink] from [src]."))
ink = null
-
/obj/item/airlock_painter/decal
name = "decal painter"
- desc = "An airlock painter, reprogramed to use a different style of paint in order to apply decals for floor tiles as well, in addition to repainting doors. Decals break when the floor tiles are removed. Alt-Click to change design."
+ desc = "An airlock painter, reprogramed to use a different style of paint in order to apply decals for floor tiles as well, in addition to repainting doors. Decals break when the floor tiles are removed."
+// desc_controls = "Alt-Click to remove the ink cartridge."
icon = 'icons/obj/objects.dmi'
icon_state = "decal_sprayer"
- item_state = "decalsprayer"
- custom_materials = list(/datum/material/iron=2000, /datum/material/glass=500)
+ item_state = "decal_sprayer" // inhand_icon_state = "decal_sprayer"
+ custom_materials = list(/datum/material/iron=50, /datum/material/glass=50)
+ initial_ink_type = /obj/item/toner/large
+ /// The current direction of the decal being printed
var/stored_dir = 2
- var/stored_color = ""
+ /// The current color of the decal being printed.
+ var/stored_color = "yellow"
+ /// The current base icon state of the decal being printed.
var/stored_decal = "warningline"
+ /// The full icon state of the decal being printed.
var/stored_decal_total = "warningline"
- var/color_list = list("","red","white")
- var/dir_list = list(1,2,4,8)
+ /// The type path of the spritesheet being used for the frontend.
+ var/spritesheet_type = /datum/asset/spritesheet/decals // spritesheet containing previews
+ /// Does this printer implementation support custom colors?
+ var/supports_custom_color = FALSE
+ /// Current custom color
+ var/stored_custom_color
+ /// List of color options as list(user-friendly label, color value to return)
+ var/color_list = list(
+ list("Yellow", "yellow"),
+ list("Red", "red"),
+ list("White", "white"),
+ )
+ /// List of direction options as list(user-friendly label, dir value to return)
+ var/dir_list = list(
+ list("North", NORTH),
+ list("South", SOUTH),
+ list("East", EAST),
+ list("West", WEST),
+ )
+ /// List of decal options as list(user-friendly label, icon state base value to return)
var/decal_list = list(
- list("Warning Line","warningline"),
- list("Warning Line Corner","warninglinecorner"),
- list("Caution Label","caution"),
- list("Directional Arrows","arrows"),
- list("Stand Clear Label","stand_clear"),
- list("Box","box"),
- list("Box Corner","box_corners"),
- list("Delivery Marker","delivery"),
- list("Warning Box","warn_full"))
+ list("Warning Line", "warningline"),
+ list("Warning Line Corner", "warninglinecorner"),
+ list("Caution Label", "caution"),
+ list("Directional Arrows", "arrows"),
+ list("Stand Clear Label", "stand_clear"),
+ list("Bot", "bot"),
+ list("Box", "box"),
+ list("Box Corner", "box_corners"),
+ list("Delivery Marker", "delivery"),
+ list("Warning Box", "warn_full"),
+ )
+ // These decals only have a south sprite.
+ var/nondirectional_decals = list(
+ "bot",
+ "box",
+ "delivery",
+ "warn_full",
+ )
+
+/obj/item/airlock_painter/decal/Initialize(mapload)
+ . = ..()
+ stored_custom_color = stored_color
/obj/item/airlock_painter/decal/afterattack(atom/target, mob/user, proximity)
. = ..()
- var/turf/open/floor/F = target
if(!proximity)
- to_chat(user, "You need to get closer! ")
+ balloon_alert(user, "get closer!")
return
- if(use_paint(user) && isturf(F))
- F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, CLEAN_STRONG, color, null, null, alpha)
-/obj/item/airlock_painter/decal/attack_self(mob/user)
- if((ink) && (ink.charges >= 1))
- to_chat(user, "[src] beeps to prevent you from removing the toner until out of charges. ")
- return
- . = ..()
-
-/obj/item/airlock_painter/decal/AltClick(mob/user)
- . = ..()
- ui_interact(user)
-
-/obj/item/airlock_painter/decal/Initialize(mapload)
- . = ..()
- ink = new /obj/item/toner/large(src)
+ if(isfloorturf(target) && use_paint(user))
+ paint_floor(target)
+
+/**
+ * Actually add current decal to the floor.
+ *
+ * Responsible for actually adding the element to the turf for maximum flexibility.area
+ * Can be overriden for different decal behaviors.
+ * Arguments:
+ * * target - The turf being painted to
+*/
+/obj/item/airlock_painter/decal/proc/paint_floor(turf/open/floor/target)
+ target.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, CLEAN_STRONG, color, null, null, alpha)
+
+/**
+ * Return the final icon_state for the given decal options
+ *
+ * Arguments:
+ * * decal - the selected decal base icon state
+ * * color - the selected color
+ * * dir - the selected dir
+ */
+/obj/item/airlock_painter/decal/proc/get_decal_path(decal, color, dir)
+ // Special case due to icon_state names
+ if(color == "yellow")
+ color = ""
+
+ return "[decal][color ? "_" : ""][color]"
/obj/item/airlock_painter/decal/proc/update_decal_path()
- var/yellow_fix = "" //This will have to do until someone refactor's markings.dm
- if (stored_color)
- yellow_fix = "_"
- stored_decal_total = "[stored_decal][yellow_fix][stored_color]"
- return
-
-/obj/item/airlock_painter/decal/ui_assets(mob/user)
- return list(
- get_asset_datum(/datum/asset/spritesheet/decals)
- )
+ stored_decal_total = get_decal_path(stored_decal, stored_color, stored_dir)
/obj/item/airlock_painter/decal/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
@@ -192,52 +259,215 @@
ui = new(user, src, "DecalPainter", name)
ui.open()
-/obj/item/airlock_painter/decal/ui_data(mob/user)
- var/list/data = list()
- data["decal_direction"] = stored_dir
- data["decal_dir_text"] = dir2text(stored_dir)
- data["decal_color"] = stored_color
- data["decal_style"] = stored_decal
- data["decal_list"] = list()
- data["color_list"] = list()
- data["dir_list"] = list()
-
- for(var/i in decal_list)
- data["decal_list"] += list(list(
- "name" = i[1],
- "decal" = i[2]
+/obj/item/airlock_painter/decal/ui_assets(mob/user)
+ . = ..()
+ . += get_asset_datum(spritesheet_type)
+
+/obj/item/airlock_painter/decal/ui_static_data(mob/user)
+ . = ..()
+ var/datum/asset/spritesheet/icon_assets = get_asset_datum(spritesheet_type)
+
+ .["icon_prefix"] = "[icon_assets.name]32x32"
+ .["supports_custom_color"] = supports_custom_color
+ .["decal_list"] = list()
+ .["color_list"] = list()
+ .["dir_list"] = list()
+ .["nondirectional_decals"] = nondirectional_decals
+
+ for(var/decal in decal_list)
+ .["decal_list"] += list(list(
+ "name" = decal[1],
+ "decal" = decal[2],
))
- for(var/j in color_list)
- data["color_list"] += list(list(
- "colors" = j
+ for(var/color in color_list)
+ .["color_list"] += list(list(
+ "name" = color[1],
+ "color" = color[2],
))
- for(var/k in dir_list)
- data["dir_list"] += list(list(
- "dirs" = k
+ for(var/dir in dir_list)
+ .["dir_list"] += list(list(
+ "name" = dir[1],
+ "dir" = dir[2],
))
- return data
-/obj/item/airlock_painter/decal/ui_act(action,list/params)
- if(..())
+/obj/item/airlock_painter/decal/ui_data(mob/user)
+ . = ..()
+ .["current_decal"] = stored_decal
+ .["current_color"] = stored_color
+ .["current_dir"] = stored_dir
+ .["current_custom_color"] = stored_custom_color
+
+/obj/item/airlock_painter/decal/ui_act(action, list/params)
+ . = ..()
+ if(.)
return
+
switch(action)
//Lists of decals and designs
if("select decal")
- var/selected_decal = params["decals"]
+ var/selected_decal = params["decal"]
+ var/selected_dir = text2num(params["dir"])
stored_decal = selected_decal
+ stored_dir = selected_dir
if("select color")
- var/selected_color = params["colors"]
+ var/selected_color = params["color"]
stored_color = selected_color
- if("selected direction")
- var/selected_direction = text2num(params["dirs"])
- stored_dir = selected_direction
+ if("pick custom color")
+ if(supports_custom_color)
+ pick_painting_tool_color(usr, stored_custom_color)
update_decal_path()
. = TRUE
+/obj/item/airlock_painter/decal/set_painting_tool_color(chosen_color)
+ . = ..()
+ stored_custom_color = chosen_color
+ stored_color = chosen_color
+
+/datum/asset/spritesheet/decals
+ name = "floor_decals"
+// cross_round_cachable = TRUE
+
+ /// The floor icon used for blend_preview_floor()
+ var/preview_floor_icon = 'icons/turf/floors.dmi'
+ /// The floor icon state used for blend_preview_floor()
+ var/preview_floor_state = "floor"
+ /// The associated decal painter type to grab decals, colors, etc from.
+ var/obj/item/airlock_painter/decal/painter_type = /obj/item/airlock_painter/decal
+
+/**
+ * Underlay an example floor for preview purposes, and return the new icon.
+ *
+ * Arguments:
+ * * decal - the decal to place over the example floor tile
+ */
+/datum/asset/spritesheet/decals/proc/blend_preview_floor(icon/decal)
+ var/icon/final = icon(preview_floor_icon, preview_floor_state)
+ final.Blend(decal, ICON_OVERLAY)
+ return final
+
+/**
+ * Insert a specific state into the spritesheet.
+ *
+ * Arguments:
+ * * decal - the given decal base state.
+ * * dir - the given direction.
+ * * color - the given color.
+ */
+/datum/asset/spritesheet/decals/proc/insert_state(decal, dir, color)
+ // Special case due to icon_state names
+ var/icon_state_color = color == "yellow" ? "" : color
+
+ var/icon/final = blend_preview_floor(icon('icons/turf/decals.dmi', "[decal][icon_state_color ? "_" : ""][icon_state_color]", dir))
+ Insert("[decal]_[dir]_[color]", final)
+
+/datum/asset/spritesheet/decals/register()
+ // Must actually create because initial(type) doesn't work for /lists for some reason.
+ var/obj/item/airlock_painter/decal/painter = new painter_type()
+
+ for(var/list/decal in painter.decal_list)
+ for(var/list/dir in painter.dir_list)
+ for(var/list/color in painter.color_list)
+ insert_state(decal[2], dir[2], color[2])
+ if(painter.supports_custom_color)
+ insert_state(decal[2], dir[2], "custom")
+
+ qdel(painter)
+ . = ..()
+
/obj/item/airlock_painter/decal/debug
name = "extreme decal painter"
icon_state = "decal_sprayer_ex"
+ initial_ink_type = /obj/item/toner/extreme
+
+/obj/item/airlock_painter/decal/tile
+ name = "tile sprayer"
+ desc = "An airlock painter, reprogramed to use a different style of paint in order to spray colors on floor tiles as well, in addition to repainting doors. Decals break when the floor tiles are removed."
+// desc_controls = "Alt-Click to remove the ink cartridge."
+ icon_state = "tile_sprayer"
+ stored_dir = 2
+ stored_color = "#D4D4D432"
+ stored_decal = "tile_corner"
+ spritesheet_type = /datum/asset/spritesheet/decals/tiles
+ supports_custom_color = TRUE
+ // Colors can have a an alpha component as RGBA, or just be RGB and use default alpha
+ color_list = list(
+ list("Neutral", "#D4D4D432"),
+ list("Dark", "#0e0f0f"),
+ list("Bar Burgundy", "#79150082"),
+ list("Sec Red", "#DE3A3A"),
+ list("Cargo Brown", "#A46106"),
+ list("Engi Yellow", "#EFB341"),
+ list("Service Green", "#9FED58"),
+ list("Med Blue", "#52B4E9"),
+ list("R&D Purple", "#D381C9"),
+ )
+ decal_list = list(
+ list("Corner", "tile_corner"),
+ list("Half", "tile_half_contrasted"),
+ list("Opposing Corners", "tile_opposing_corners"),
+ list("3 Corners", "tile_anticorner_contrasted"),
+ list("4 Corners", "tile_fourcorners"),
+ list("Trimline Corner", "trimline_corner_fill"),
+ list("Trimline Fill", "trimline_fill"),
+ list("Trimline Fill L", "trimline_fill__8"), // This is a hack that lives in the spritesheet builder and paint_floor
+ list("Trimline End", "trimline_end_fill"),
+ list("Trimline Box", "trimline_box_fill"),
+ )
+ nondirectional_decals = list(
+ "tile_fourcorners",
+ "trimline_box_fill",
+ )
-/obj/item/airlock_painter/decal/debug/Initialize(mapload)
- . = ..()
- ink = new /obj/item/toner/extreme(src)
+ /// Regex to split alpha out.
+ var/static/regex/rgba_regex = new(@"(#[0-9a-fA-F]{6})([0-9a-fA-F]{2})")
+
+ /// Default alpha for /obj/effect/turf_decal/tile
+ var/default_alpha = 110
+
+/obj/item/airlock_painter/decal/tile/paint_floor(turf/open/floor/target)
+ // Account for 8-sided decals.
+ var/source_decal = stored_decal
+ var/source_dir = stored_dir
+ if(copytext(stored_decal, -3) == "__8")
+ source_decal = splicetext(stored_decal, -3, 0, "")
+ source_dir = turn(stored_dir, 45)
+
+ var/decal_color = stored_color
+ var/decal_alpha = default_alpha
+ // Handle the RGBA case.
+ if(rgba_regex.Find(decal_color))
+ decal_color = rgba_regex.group[1]
+ decal_alpha = text2num(rgba_regex.group[2], 16)
+
+ target.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', source_decal, source_dir, CLEAN_STRONG, decal_color, null, null, decal_alpha)
+
+/datum/asset/spritesheet/decals/tiles
+ name = "floor_tile_decals"
+ painter_type = /obj/item/airlock_painter/decal/tile
+
+/datum/asset/spritesheet/decals/tiles/insert_state(decal, dir, color)
+ // Account for 8-sided decals.
+ var/source_decal = decal
+ var/source_dir = dir
+ if(copytext(decal, -3) == "__8")
+ source_decal = splicetext(decal, -3, 0, "")
+ source_dir = turn(dir, 45)
+
+ // Handle the RGBA case.
+ var/obj/item/airlock_painter/decal/tile/tile_type = painter_type
+ var/render_color = color
+ var/render_alpha = initial(tile_type.default_alpha)
+ if(tile_type.rgba_regex.Find(color))
+ render_color = tile_type.rgba_regex.group[1]
+ render_alpha = text2num(tile_type.rgba_regex.group[2], 16)
+
+ var/icon/colored_icon = icon('icons/turf/decals.dmi', source_decal, dir=source_dir)
+ colored_icon.ChangeOpacity(render_alpha * 0.008)
+ if(color == "custom")
+ // Do a fun rainbow pattern to stand out while still being static.
+ colored_icon.Blend(icon('icons/effects/random_spawners.dmi', "rainbow"), ICON_MULTIPLY)
+ else
+ colored_icon.Blend(render_color, ICON_MULTIPLY)
+
+ colored_icon = blend_preview_floor(colored_icon)
+ Insert("[decal]_[dir]_[replacetext(color, "#", "")]", colored_icon)
diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm
index 382764c58693..58d9627476ef 100644
--- a/code/game/objects/items/circuitboards/computer_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm
@@ -581,6 +581,10 @@
name = "Supply Request Console (Computer Board)"
build_path = /obj/machinery/computer/cargo/request
+/obj/item/circuitboard/computer/bounty
+ name = "Nanotrasen Bounty Console (Computer Board)"
+ build_path = /obj/machinery/computer/bounty
+
/obj/item/circuitboard/computer/ferry
name = "Transport Ferry (Computer Board)"
icon_state = "supply"
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index b7ac29562c10..8e5f58f40c7b 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -116,6 +116,38 @@ GLOBAL_LIST_EMPTY(PDAs)
if(inserted_item && (!isturf(loc)))
. += "Ctrl-click to remove [inserted_item]. "
+/obj/item/pda/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+
+ if(held_item)
+ if(istype(held_item, /obj/item/cartridge) && !cartridge)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Insert Cartridge")
+ . = CONTEXTUAL_SCREENTIP_SET
+ else if(istype(held_item, /obj/item/card/id) && !id)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Insert ID")
+ . = CONTEXTUAL_SCREENTIP_SET
+ else if(istype(held_item, /obj/item/paicard) && !pai)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Insert pAI")
+ . = CONTEXTUAL_SCREENTIP_SET
+ else if(is_type_in_list(held_item, contained_item) && !inserted_item)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Insert [held_item]")
+ . = CONTEXTUAL_SCREENTIP_SET
+ else if(istype(held_item, /obj/item/photo))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Scan photo")
+ . = CONTEXTUAL_SCREENTIP_SET
+
+ if(id) // ID gets removed before inserted_item
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, "Remove ID")
+ . = CONTEXTUAL_SCREENTIP_SET
+ else if(inserted_item)
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, "Remove [inserted_item]")
+ . = CONTEXTUAL_SCREENTIP_SET
+
+ if(inserted_item)
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_LMB], INTENT_ANY, "Remove [inserted_item]")
+ . = CONTEXTUAL_SCREENTIP_SET
+ return . || NONE
+
/obj/item/pda/Initialize(mapload)
if(GLOB.pda_reskins)
unique_reskin = GLOB.pda_reskins
@@ -133,6 +165,8 @@ GLOBAL_LIST_EMPTY(PDAs)
new_overlays = TRUE
update_icon()
+ register_context()
+
/obj/item/pda/reskin_obj(mob/M)
. = ..()
new_overlays = TRUE
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 10bb6c9dc597..913ebeca91de 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -91,6 +91,11 @@ GENETICS SCANNER
var/scanmode = SCANMODE_HEALTH
var/advanced = FALSE
+/obj/item/healthanalyzer/Initialize(mapload)
+ . = ..()
+
+ register_item_context()
+
/obj/item/healthanalyzer/suicide_act(mob/living/carbon/user)
user.visible_message("[user] begins to analyze [user.p_them()]self with [src]! The display shows that [user.p_theyre()] dead! ")
return BRUTELOSS
@@ -130,6 +135,24 @@ GENETICS SCANNER
add_fingerprint(user)
+/obj/item/healthanalyzer/add_item_context(
+ obj/item/source,
+ list/context,
+ atom/target,
+)
+ if (!isliving(target))
+ return NONE
+
+ switch (scanmode)
+ if (SCANMODE_HEALTH)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Scan health")
+ if (SCANMODE_CHEMICAL)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Scan chemicals")
+ if (SCANMODE_WOUND)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Scan wounds")
+
+ return CONTEXTUAL_SCREENTIP_SET
+
// Used by the PDA medical scanner too
/proc/healthscan(mob/user, mob/living/M, mode = 1, advanced = FALSE)
if(isliving(user) && (user.incapacitated() || user.eye_blind))
@@ -562,6 +585,7 @@ GENETICS SCANNER
name = "first aid analyzer"
icon_state = "adv_spectrometer"
desc = "A prototype MeLo-Tech medical scanner used to diagnose injuries and recommend treatment for serious wounds, but offers no further insight into the patient's health. You hope the final version is less annoying to read!"
+ scanmode = SCANMODE_WOUND // Forces context to give correct tip.
var/next_encouragement
var/greedy
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index 163119800f9d..f0cd0fc1e7cc 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -122,6 +122,21 @@
breakouttime = 300 //Deciseconds = 30s
cuffsound = 'sound/weapons/cablecuff.ogg'
+/obj/item/restraints/handcuffs/cable/Initialize(mapload)
+ . = ..()
+
+ var/static/list/hovering_item_typechecks = list(
+ /obj/item/stack/rods = list(
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Craft wired rod"),
+ ),
+
+ /obj/item/stack/sheet/metal = list(
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Craft bola"),
+ ),
+ )
+
+ AddElement(/datum/element/contextual_screentip_item_typechecks, hovering_item_typechecks)
+
/obj/item/restraints/handcuffs/cable/attack_self(mob/user)
to_chat(user, "You start unwinding the cable restraints back into coil ")
if(!do_after(user, 25, TRUE, user))
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index efd20fdd9e13..7d84d38624b1 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -54,6 +54,8 @@
cell = new preload_cell_type(src)
update_icon()
+ register_item_context()
+
/obj/item/melee/baton/DoRevenantThrowEffects(atom/target)
switch_status()
@@ -155,6 +157,26 @@
if(!interrupt)
return ..()
+/obj/item/melee/baton/add_item_context(datum/source, list/context, atom/target, mob/living/user)
+ if (isturf(target))
+ return NONE
+
+ if (isobj(target))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Attack")
+ else
+ if (turned_on)
+ LAZYSET(context[SCREENTIP_CONTEXT_RMB], INTENT_ANY, "Knockdown")
+
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Stun")
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_HARM, "Harmful stun")
+ else
+ LAZYSET(context[SCREENTIP_CONTEXT_RMB], INTENT_ANY, "Knockdown") // DON'T TELL EM, PRANKED.
+
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Stun") // STILL DO NOT DARE TELLING THEM
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_HARM, "Attack") // It's fine i guess...?
+
+ return CONTEXTUAL_SCREENTIP_SET
+
/obj/item/melee/baton/alt_pre_attack(atom/A, mob/living/user, params)
if(!user.CheckActionCooldown(CLICK_CD_MELEE))
return
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 7d26c2f38ea7..e2d60fd7d111 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -583,6 +583,21 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
attack_verb = list("hit", "bludgeoned", "whacked", "bonked")
wound_bonus = -10
+/obj/item/wirerod/Initialize(mapload)
+ . = ..()
+
+ var/static/list/hovering_item_typechecks = list(
+ /obj/item/shard = list(
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Craft spear"),
+ ),
+
+ /obj/item/assembly/igniter = list(
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Craft stunprod"),
+ ),
+ )
+
+ AddElement(/datum/element/contextual_screentip_item_typechecks, hovering_item_typechecks)
+
/obj/item/wirerod/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/shard))
var/obj/item/spear/S = new /obj/item/spear
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 084e2fefd82c..4ed55e61a60f 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -846,7 +846,8 @@
var/area/A = get_area(src)
var/datum/outfit/O = new /datum/outfit/ghostcafe()
O.equip(new_spawn, FALSE, new_spawn.client)
- SSjob.equip_loadout(null, new_spawn, FALSE)
+ SSjob.equip_loadout(null, new_spawn)
+ SSjob.post_equip_loadout(null, new_spawn)
SSquirks.AssignQuirks(new_spawn, new_spawn.client, TRUE, TRUE, null, FALSE, new_spawn)
new_spawn.AddElement(/datum/element/ghost_role_eligibility, free_ghosting = TRUE)
new_spawn.AddElement(/datum/element/dusts_on_catatonia)
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 3858bd71fb58..331b45eb18ba 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -37,6 +37,16 @@
smooth = SMOOTH_TRUE
canSmoothWith = list(/obj/structure/table, /obj/structure/table/reinforced, /obj/structure/table/greyscale)
+/obj/structure/table/Initialize(mapload)
+ . = ..()
+
+ var/static/list/barehanded_interactions = list(
+ INTENT_ANY = "Slap",
+ INTENT_HARM = "Slam"
+ )
+
+ AddElement(/datum/element/contextual_screentip_bare_hands, rmb_text_combat_mode = barehanded_interactions)
+
/obj/structure/table/examine(mob/user)
. = ..()
. += deconstruction_hints(user)
@@ -490,6 +500,19 @@
// the sprites in the editor to see why.
icon = smooth_icon
+ if (!(flags_1 & NODECONSTRUCT_1))
+ var/static/list/tool_behaviors = list(
+ TOOL_SCREWDRIVER = list(
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Disassemble"),
+ ),
+
+ TOOL_WRENCH = list(
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Deconstruct"),
+ ),
+ )
+
+ AddElement(/datum/element/contextual_screentip_tools, tool_behaviors)
+
/obj/structure/table/wood/fancy/black
icon_state = "fancy_table_black"
buildstack = /obj/item/stack/tile/carpet/black
@@ -704,7 +727,7 @@
. = !density
if(istype(caller))
. = . || (caller.pass_flags & PASSTABLE)
-
+
/obj/structure/rack/MouseDrop_T(obj/O, mob/user)
. = ..()
if ((!( istype(O, /obj/item) ) || user.get_active_held_item() != O))
diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_objectives.dm b/code/modules/antagonists/bloodsucker/bloodsucker_objectives.dm
index 7043c2f429f7..c079e00342fa 100644
--- a/code/modules/antagonists/bloodsucker/bloodsucker_objectives.dm
+++ b/code/modules/antagonists/bloodsucker/bloodsucker_objectives.dm
@@ -157,7 +157,8 @@
else if (V.owner.current && ishuman(V.owner.current))
var/mob/living/carbon/human/H = V.owner.current
var/obj/item/card/id/I = H.wear_id ? H.wear_id.GetID() : null
- if (I && (I.assignment in valid_jobs) && !(I.assignment in counted_roles))
+ var/assign = GetJobName(I.assignment)
+ if (I && (assign in valid_jobs) && !(assign in counted_roles))
//to_chat(owner, "PROTEGE OBJECTIVE: (GET ID) ")
thisRole = I.assignment
diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm
index 1178df4ce63f..4c74405389d3 100644
--- a/code/modules/asset_cache/asset_list_items.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -311,14 +311,6 @@
InsertAll("", each, GLOB.alldirs)
..()
-/datum/asset/spritesheet/decals
- name = "decals"
-
-/datum/asset/spritesheet/decals/register()
- for(var/each in list('icons/turf/decals.dmi'))
- InsertAll("", each, GLOB.alldirs)
- ..()
-
/datum/asset/spritesheet/supplypods
name = "supplypods"
diff --git a/code/modules/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm
new file mode 100644
index 000000000000..4158327c3c64
--- /dev/null
+++ b/code/modules/cargo/bounty_console.dm
@@ -0,0 +1,67 @@
+#define PRINTER_TIMEOUT 10
+
+/obj/machinery/computer/bounty
+ name = "\improper Nanotrasen bounty console"
+ desc = "Used to check and claim bounties offered by Nanotrasen"
+ icon_screen = "bounty"
+ circuit = /obj/item/circuitboard/computer/bounty
+ light_color = "#E2853D"//orange
+ var/printer_ready = 0 //cooldown var
+ var/static/datum/bank_account/cargocash
+
+/obj/machinery/computer/bounty/Initialize(mapload)
+ . = ..()
+ printer_ready = world.time + PRINTER_TIMEOUT
+ cargocash = SSeconomy.get_dep_account(ACCOUNT_CAR)
+
+/obj/machinery/computer/bounty/proc/print_paper()
+ new /obj/item/paper/bounty_printout(loc)
+
+/obj/item/paper/bounty_printout
+ name = "paper - Bounties"
+
+/obj/item/paper/bounty_printout/Initialize(mapload)
+ . = ..()
+ info = "Nanotrasen Cargo Bounties "
+ update_icon()
+
+ for(var/datum/bounty/B in GLOB.bounties_list)
+ if(B.claimed)
+ continue
+ info += {"[B.name]
+ Reward: [B.reward_string()]
+ Completed: [B.completion_string()] "}
+
+/obj/machinery/computer/bounty/ui_interact(mob/user, datum/tgui/ui)
+ if(!GLOB.bounties_list.len)
+ setup_bounties()
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "CargoBountyConsole", name)
+ ui.open()
+
+/obj/machinery/computer/bounty/ui_data(mob/user)
+ var/list/data = list()
+ var/list/bountyinfo = list()
+ for(var/datum/bounty/B in GLOB.bounties_list)
+ bountyinfo += list(list("name" = B.name, "description" = B.description, "reward_string" = B.reward_string(), "completion_string" = B.completion_string() , "claimed" = B.claimed, "can_claim" = B.can_claim(), "priority" = B.high_priority, "bounty_ref" = REF(B)))
+ data["stored_cash"] = cargocash.account_balance
+ data["bountydata"] = bountyinfo
+ return data
+
+/obj/machinery/computer/bounty/ui_act(action,params)
+ if(..())
+ return
+ switch(action)
+ if("ClaimBounty")
+ var/datum/bounty/cashmoney = locate(params["bounty"]) in GLOB.bounties_list
+ if(cashmoney)
+ cashmoney.claim()
+ return TRUE
+ if("Print")
+ if(printer_ready < world.time)
+ printer_ready = world.time + PRINTER_TIMEOUT
+ print_paper()
+ return
+
+
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index c769ddeb3c08..7a5f4a0e3e08 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -62,7 +62,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/UI_style = null
var/outline_enabled = TRUE
var/outline_color = COLOR_THEME_MIDNIGHT
- var/screentip_pref = TRUE
+ var/screentip_pref = SCREENTIP_PREFERENCE_ENABLED
var/screentip_color = "#ffd391"
var/buttons_locked = FALSE
var/hotkeys = FALSE
@@ -335,6 +335,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/show_mismatched_markings = FALSE //determines whether or not the markings lists should show markings that don't match the currently selected species. Intentionally left unsaved.
+ var/character_settings_tab = GENERAL_CHAR_TAB
+ var/preferences_tab = GAME_PREFS_TAB
+ var/preview_pref = PREVIEW_PREF_JOB
+
var/no_tetris_storage = FALSE
///loadout stuff
@@ -401,7 +405,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
load_path(C.ckey)
unlock_content = C.IsByondMember()
if(unlock_content)
- max_save_slots = 32
+ max_save_slots += 8 //SPLURT EDIT
var/loaded_preferences_successfully = load_preferences()
if(loaded_preferences_successfully)
if(load_character())
@@ -427,11 +431,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/list/dat = list("")
dat += "Character Settings "
- dat += "Character Appearance "
- dat += "Character Speech "
- dat += "Loadout "
- dat += "Game Preferences "
- dat += "Content Preferences "
+ dat += "Preferences "
dat += "Keybindings "
if(!path)
@@ -461,996 +461,1066 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "[name] "
dat += " "
- dat += "Occupation Choices "
- dat += "Set Occupation Preferences "
- if(CONFIG_GET(flag/roundstart_traits))
- dat += "Quirk Setup "
- dat += "Configure Quirks "
- dat += "Current Quirks: [all_quirks.len ? all_quirks.Join(", ") : "None"] "
- dat += "Identity "
- dat += ""
+ dat += ""
+ dat += " "
+ switch(character_settings_tab)
+ //General
+ if(GENERAL_CHAR_TAB)
+ dat += "Occupation Choices "
+ dat += "Set Occupation Preferences "
+ if(CONFIG_GET(flag/roundstart_traits))
+ dat += "Quirk Setup "
+ dat += "Configure Quirks "
+ dat += "Current Quirks: [all_quirks.len ? all_quirks.Join(", ") : "None"] "
+ dat += "Identity "
+ dat += ""
+
+ //Character Appearance
+ if(APPEARANCE_CHAR_TAB)
+ dat += ""
+ dat += "Flavor Text "
+ dat += "Set Examine Text "
+ if(length(features["flavor_text"]) <= MAX_FLAVOR_PREVIEW_LEN)
+ if(!length(features["flavor_text"]))
+ dat += "\[...\] " //skyrat - adds //come to brazil or brazil comes to you
+ else
+ dat += "[html_encode(features["flavor_text"])] " //skyrat - adds and uses html_encode
+ else
+ dat += "[TextPreview(html_encode(features["flavor_text"]))]... " //skyrat edit, uses html_encode
+ //SPLURT edit - naked flavor text
+ dat += "Naked Flavor Text "
+ dat += "Set Naked Examine Text "
+ if(length(features["naked_flavor_text"]) <= 40)
+ if(!length(features["naked_flavor_text"]))
+ dat += "\[...\] "
+ else
+ dat += "[html_encode(features["naked_flavor_text"])] "
+ else
+ dat += "[TextPreview(html_encode(features["naked_flavor_text"]))]... "
+ //SPLURT edit end
+ dat += "Silicon Flavor Text "
+ dat += "Set Silicon Examine Text "
+ if(length(features["silicon_flavor_text"]) <= MAX_FLAVOR_PREVIEW_LEN)
+ if(!length(features["silicon_flavor_text"]))
+ dat += "\[...\] "
+ else
+ dat += "[features["silicon_flavor_text"]] "
+ else
+ dat += "[TextPreview(features["silicon_flavor_text"])]... "
+ dat += "OOC notes "
+ dat += "Set OOC notes "
+ var/ooc_notes_len = length(features["ooc_notes"])
+ if(ooc_notes_len <= MAX_FLAVOR_PREVIEW_LEN)
+ if(!ooc_notes_len)
+ dat += "\[...\] "
+ else
+ dat += "[features["ooc_notes"]] "
+ else
+ dat += "[TextPreview(features["ooc_notes"])]... "
+ //SPLURT EDIT
+ dat += "Headshot Image "
+ dat += "Set Headshot Image "
+ if(features["headshot_link"])
+ dat += " "
+ dat += " "
+ //SPLURT EDIT END
+ //SKYRAT EDIT
+ dat += "Consent preferences "
+ dat += "ERP : [erppref] "
+ dat += "Non-Con : [nonconpref] "
+ dat += "Vore : [vorepref] "
+ //END OF SKYRAT EDIT
+
+ dat += APPEARANCE_CATEGORY_COLUMN //body moves right sandstorm change
+
+ dat += "Body "
+ dat += "Gender: [gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))] "
+ if(gender != NEUTER && pref_species.sexes)
+ dat += "Body Model: [features["body_model"] == MALE ? "Masculine" : "Feminine"] "
+ dat += "Limb Modification: "
+ dat += "Modify Limbs "
+ for(var/modification in modified_limbs)
+ if(modified_limbs[modification][1] == LOADOUT_LIMB_PROSTHETIC)
+ dat += "[modification]: [modified_limbs[modification][2]] "
+ else
+ dat += "[modification]: [modified_limbs[modification][1]] "
+ dat += " "
+ dat += "Species: [pref_species.name] "
+ dat += "Custom Species Name: [custom_species ? custom_species : "None"] "
+ dat += "Random Body: Randomize! "
+ dat += "Always Random Body: [be_random_body ? "Yes" : "No"] "
+ dat += "Cycle background: [bgstate] "
+
+ dat += " " //body moves right sandstorm change
+
+ var/use_skintones = pref_species.use_skintones
+ if(use_skintones)
+ dat += APPEARANCE_CATEGORY_COLUMN
- dat += ""
- dat += "Flavor Text "
- dat += "Set Examine Text "
- if(length(features["flavor_text"]) <= MAX_FLAVOR_PREVIEW_LEN)
- if(!length(features["flavor_text"]))
- dat += "\[...\] " //skyrat - adds //come to brazil or brazil comes to you
- else
- dat += "[html_encode(features["flavor_text"])] " //skyrat - adds and uses html_encode
- else
- dat += "[TextPreview(html_encode(features["flavor_text"]))]... " //skyrat edit, uses html_encode
- //SPLURT edit - naked flavor text
- dat += "Naked Flavor Text "
- dat += "Set Naked Examine Text "
- if(length(features["naked_flavor_text"]) <= 40)
- if(!length(features["naked_flavor_text"]))
- dat += "\[...\] "
- else
- dat += "[html_encode(features["naked_flavor_text"])] "
- else
- dat += "[TextPreview(html_encode(features["naked_flavor_text"]))]... "
- //SPLURT edit end
- dat += "Silicon Flavor Text "
- dat += "Set Silicon Examine Text "
- if(length(features["silicon_flavor_text"]) <= MAX_FLAVOR_PREVIEW_LEN)
- if(!length(features["silicon_flavor_text"]))
- dat += "\[...\] "
- else
- dat += "[features["silicon_flavor_text"]] "
- else
- dat += "[TextPreview(features["silicon_flavor_text"])]... "
- dat += "OOC notes "
- dat += "Set OOC notes "
- var/ooc_notes_len = length(features["ooc_notes"])
- if(ooc_notes_len <= MAX_FLAVOR_PREVIEW_LEN)
- if(!ooc_notes_len)
- dat += "\[...\] "
- else
- dat += "[features["ooc_notes"]] "
- else
- dat += "[TextPreview(features["ooc_notes"])]... "
- //SPLURT EDIT
- dat += "Headshot Image "
- dat += "Set Headshot Image "
- if(features["headshot_link"])
- dat += " "
- dat += " "
- //SPLURT EDIT END
- //SKYRAT EDIT
- dat += "ERP : [erppref] "
- dat += "Non-Con : [nonconpref] "
- dat += "Vore : [vorepref] "
- //END OF SKYRAT EDIT
-
- dat += "Records "
- dat += "Security Records "
- if(length_char(security_records) <= 40)
- if(!length(security_records))
- dat += "\[...\]"
- else
- dat += "[security_records]"
- else
- dat += "[TextPreview(security_records)]... "
+ dat += "Skin Tone "
- dat += "Medical Records "
- if(length_char(medical_records) <= 40)
- if(!length(medical_records))
- dat += "\[...\] "
- else
- dat += "[medical_records]"
- else
- dat += "[TextPreview(medical_records)]... "
-
- dat += APPEARANCE_CATEGORY_COLUMN //body moves right sandstorm change
-
- dat += "Body "
- dat += "Gender: [gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))] "
- if(gender != NEUTER && pref_species.sexes)
- dat += "Body Model: [features["body_model"] == MALE ? "Masculine" : "Feminine"] "
- dat += "Limb Modification: "
- dat += "Modify Limbs "
- for(var/modification in modified_limbs)
- if(modified_limbs[modification][1] == LOADOUT_LIMB_PROSTHETIC)
- dat += "[modification]: [modified_limbs[modification][2]] "
- else
- dat += "[modification]: [modified_limbs[modification][1]] "
- dat += " "
- dat += "Species: [pref_species.name] "
- dat += "Custom Species Name: [custom_species ? custom_species : "None"] "
- dat += "Random Body: Randomize! "
- dat += "Always Random Body: [be_random_body ? "Yes" : "No"] "
- dat += "Cycle background: [bgstate] "
+ dat += "[use_custom_skin_tone ? "custom: [skin_tone] " : skin_tone] "
- dat += " " //body moves right sandstorm change
+ var/mutant_colors
+ if((MUTCOLORS in pref_species.species_traits) || (MUTCOLORS_PARTSONLY in pref_species.species_traits))
+ if(!use_skintones)
+ dat += APPEARANCE_CATEGORY_COLUMN
- var/use_skintones = pref_species.use_skintones
- if(use_skintones)
- dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "Body Colors "
- dat += "Skin Tone "
+ dat += "Primary Color: "
+ dat += "#[features["mcolor"]] Change "
- dat += "[use_custom_skin_tone ? "custom: [skin_tone] " : skin_tone] "
+ dat += "Secondary Color: "
+ dat += "#[features["mcolor2"]] Change "
- var/mutant_colors
- if((MUTCOLORS in pref_species.species_traits) || (MUTCOLORS_PARTSONLY in pref_species.species_traits))
- if(!use_skintones)
- dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "Tertiary Color: "
+ dat += "#[features["mcolor3"]] Change "
+ mutant_colors = TRUE
- dat += "Advanced Coloring "
- dat += "[(features["color_scheme"] == ADVANCED_CHARACTER_COLORING) ? "Enabled" : "Disabled"] "
+ dat += "Sprite Size: [features["body_size"]*100]% "
- dat += "Body Colors "
+ if(!(NOEYES in pref_species.species_traits))
+ dat += "Eye Type "
+ dat += "[eye_type] "
+ if((EYECOLOR in pref_species.species_traits))
+ if(!use_skintones && !mutant_colors)
+ dat += APPEARANCE_CATEGORY_COLUMN
+ if(left_eye_color != right_eye_color)
+ split_eye_colors = TRUE
+ dat += "Heterochromia "
+ dat += "[split_eye_colors ? "Enabled" : "Disabled"] "
+ if(!split_eye_colors)
+ dat += "Eye Color "
+ dat += "#[left_eye_color] Change "
+ else
+ dat += "Left Eye Color "
+ dat += "#[left_eye_color] Change "
+ dat += "Right Eye Color "
+ dat += "#[right_eye_color] Change "
- dat += "Primary Color: "
- dat += "#[features["mcolor"]] Change "
+ if(HAIR in pref_species.species_traits)
- dat += "Secondary Color: "
- dat += "#[features["mcolor2"]] Change "
+ dat += APPEARANCE_CATEGORY_COLUMN
- dat += "Tertiary Color: "
- dat += "#[features["mcolor3"]] Change "
- mutant_colors = TRUE
+ dat += "Hair Style "
- dat += "Sprite Size: [features["body_size"]*100]% "
+ dat += "[hair_style] "
+ dat += "< > "
+ dat += "#[hair_color] Change "
- if(!(NOEYES in pref_species.species_traits))
- dat += "Eye Type "
- dat += "[eye_type] "
- if((EYECOLOR in pref_species.species_traits))
- if(!use_skintones && !mutant_colors)
- dat += APPEARANCE_CATEGORY_COLUMN
- if(left_eye_color != right_eye_color)
- split_eye_colors = TRUE
- dat += "Heterochromia "
- dat += "[split_eye_colors ? "Enabled" : "Disabled"] "
- if(!split_eye_colors)
- dat += "Eye Color "
- dat += "#[left_eye_color] Change "
- else
- dat += "Left Eye Color "
- dat += "#[left_eye_color] Change "
- dat += "Right Eye Color "
- dat += "#[right_eye_color] Change "
+ dat += "Facial Hair Style "
- if(HAIR in pref_species.species_traits)
+ dat += "[facial_hair_style] "
+ dat += "< > "
+ dat += "#[facial_hair_color] Change "
- dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "Hair Gradient "
- dat += "Hair Style "
+ dat += "[grad_style] "
+ dat += "< > "
+ dat += "#[grad_color] Change "
- dat += "[hair_style] "
- dat += "< > "
- dat += "#[hair_color] Change "
+ dat += ""
- dat += "Facial Hair Style "
+ //Mutant stuff
+ var/mutant_category = 0
- dat += "[facial_hair_style] "
- dat += "< > "
- dat += "#[facial_hair_color] Change "
+ for(var/mutant_part in GLOB.all_mutant_parts)
+ if(mutant_part == "mam_body_markings")
+ continue
+ if(parent.can_have_part(mutant_part))
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "[GLOB.all_mutant_parts[mutant_part]] "
+ dat += "[features[mutant_part]] "
+ var/color_type = GLOB.colored_mutant_parts[mutant_part] //if it can be coloured, show the appropriate button
+ if(color_type)
+ dat += "#[features[color_type]] Change "
+ else
+ if(features["color_scheme"] == ADVANCED_CHARACTER_COLORING) //advanced individual part colouring system
+ //is it matrixed or does it have extra parts to be coloured?
+ var/find_part = features[mutant_part] || pref_species.mutant_bodyparts[mutant_part]
+ var/find_part_list = GLOB.mutant_reference_list[mutant_part]
+ if(find_part && find_part != "None" && find_part_list)
+ var/datum/sprite_accessory/accessory = find_part_list[find_part]
+ if(accessory)
+ if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future
+ var/mutant_string = accessory.mutant_part_string
+ var/primary_feature = "[mutant_string]_primary"
+ var/secondary_feature = "[mutant_string]_secondary"
+ var/tertiary_feature = "[mutant_string]_tertiary"
+ if(!features[primary_feature])
+ features[primary_feature] = features["mcolor"]
+ if(!features[secondary_feature])
+ features[secondary_feature] = features["mcolor2"]
+ if(!features[tertiary_feature])
+ features[tertiary_feature] = features["mcolor3"]
+
+ var/matrixed_sections = accessory.matrixed_sections
+ if(accessory.color_src == MATRIXED && !matrixed_sections)
+ message_admins("Sprite Accessory Failure (customization): Accessory [accessory.type] is a matrixed item without any matrixed sections set!")
+ continue
+ else if(accessory.color_src == MATRIXED)
+ switch(matrixed_sections)
+ if(MATRIX_GREEN) //only composed of a green section
+ primary_feature = secondary_feature //swap primary for secondary, so it properly assigns the second colour, reserved for the green section
+ if(MATRIX_BLUE)
+ primary_feature = tertiary_feature //same as above, but the tertiary feature is for the blue section
+ if(MATRIX_RED_BLUE) //composed of a red and blue section
+ secondary_feature = tertiary_feature //swap secondary for tertiary, as blue should always be tertiary
+ if(MATRIX_GREEN_BLUE) //composed of a green and blue section
+ primary_feature = secondary_feature //swap primary for secondary, as first option is green, which is linked to the secondary
+ secondary_feature = tertiary_feature //swap secondary for tertiary, as second option is blue, which is linked to the tertiary
+ dat += "Primary Color "
+ dat += "#[features[primary_feature]] Change "
+ if((accessory.color_src == MATRIXED && (matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL)) || (accessory.extra && (accessory.extra_color_src == MUTCOLORS || accessory.extra_color_src == MUTCOLORS2 || accessory.extra_color_src == MUTCOLORS3)))
+ dat += "Secondary Color "
+ dat += "#[features[secondary_feature]] Change "
+ if((accessory.color_src == MATRIXED && matrixed_sections == MATRIX_ALL) || (accessory.extra2 && (accessory.extra2_color_src == MUTCOLORS || accessory.extra2_color_src == MUTCOLORS2 || accessory.extra2_color_src == MUTCOLORS3)))
+ dat += "Tertiary Color "
+ dat += "#[features[tertiary_feature]] Change "
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
+
+ if(length(pref_species.allowed_limb_ids))
+ if(!chosen_limb_id || !(chosen_limb_id in pref_species.allowed_limb_ids))
+ chosen_limb_id = pref_species.limbs_id || pref_species.id
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "Body sprite "
+ dat += "[chosen_limb_id] "
+
+ if(mutant_category)
+ dat += ""
+ mutant_category = 0
- dat += "Hair Gradient "
+ dat += "
"
- dat += "[grad_style] "
- dat += "< > "
- dat += "#[grad_color] Change "
+ dat += ""
+ dat += ""
+ dat += "Clothing & Equipment "
+ /* skyrat change
+ dat += "Underwear: [underwear] "
+ if(GLOB.underwear_list[underwear]?.has_color)
+ dat += "Underwear Color: #[undie_color] Change "
+ dat += "Undershirt: [undershirt] "
+ if(GLOB.undershirt_list[undershirt]?.has_color)
+ dat += "Undershirt Color: #[shirt_color] Change "
+ dat += "Socks: [socks] "
+ if(GLOB.socks_list[socks]?.has_color)
+ dat += "Socks Color: #[socks_color] Change "
+ */
+ dat += "Backpack: [backbag] "
+ dat += "Jumpsuit: [jumpsuit_style] "
+ if((HAS_FLESH in pref_species.species_traits) || (HAS_BONE in pref_species.species_traits))
+ dat += "Temporal Scarring: [(persistent_scars) ? "Enabled" : "Disabled"] "
+ dat += "Clear scar slots "
+ dat += "Uplink Location: [uplink_spawn_loc] "
+ dat += " "
- dat += ""
- //Mutant stuff
- var/mutant_category = 0
-
- dat += APPEARANCE_CATEGORY_COLUMN
- dat += "Show mismatched markings "
- dat += "[show_mismatched_markings ? "Yes" : "No"] "
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS) //just in case someone sets the max rows to 1 or something dumb like that
- dat += ""
- mutant_category = 0
-
- // rp marking selection
- // assume you can only have mam markings or regular markings or none, never both
- var/marking_type
- if(parent.can_have_part("mam_body_markings"))
- marking_type = "mam_body_markings"
- if(marking_type)
- dat += APPEARANCE_CATEGORY_COLUMN
- dat += "[GLOB.all_mutant_parts[marking_type]] " // give it the appropriate title for the type of marking
- dat += "Add marking "
- // list out the current markings you have
- if(length(features[marking_type]))
- dat += ""
- var/list/markings = features[marking_type]
- if(!islist(markings))
- // something went terribly wrong
- markings = list()
- var/list/reverse_markings = reverseList(markings)
- for(var/list/marking_list in reverse_markings)
- var/marking_index = markings.Find(marking_list) // consider changing loop to go through indexes over lists instead of using Find here
- var/limb_value = marking_list[1]
- var/actual_name = GLOB.bodypart_names[num2text(limb_value)] // get the actual name from the bitflag representing the part the marking is applied to
- var/color_marking_dat = ""
- var/number_colors = 1
- var/datum/sprite_accessory/mam_body_markings/S = GLOB.mam_body_markings_list[marking_list[2]]
- var/matrixed_sections = S.covered_limbs[actual_name]
- if(S && matrixed_sections)
- // if it has nothing initialize it to white
- if(length(marking_list) == 2)
- var/first = "#FFFFFF"
- var/second = "#FFFFFF"
- var/third = "#FFFFFF"
- if(features["mcolor"])
- first = "#[features["mcolor"]]"
- if(features["mcolor2"])
- second = "#[features["mcolor2"]]"
- if(features["mcolor3"])
- third = "#[features["mcolor3"]]"
- marking_list += list(list(first, second, third)) // just assume its 3 colours if it isnt it doesnt matter we just wont use the other values
- // index magic
- var/primary_index = 1
- var/secondary_index = 2
- var/tertiary_index = 3
- switch(matrixed_sections)
- if(MATRIX_GREEN)
- primary_index = 2
- if(MATRIX_BLUE)
- primary_index = 3
- if(MATRIX_RED_BLUE)
- secondary_index = 2
- if(MATRIX_GREEN_BLUE)
- primary_index = 2
- secondary_index = 3
-
- // we know it has one matrixed section at minimum
- color_marking_dat += "[marking_list[3][primary_index]] "
- // if it has a second section, add it
- if(matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL)
- color_marking_dat += "[marking_list[3][secondary_index]] "
- number_colors = 2
- // if it has a third section, add it
- if(matrixed_sections == MATRIX_ALL)
- color_marking_dat += "[marking_list[3][tertiary_index]] "
- number_colors = 3
- color_marking_dat += " Change "
- dat += "[marking_list[2]] - [actual_name] ˄ ˅ X [color_marking_dat] "
- dat += "
"
+ dat += ""
+ dat += "Lewd preferences "
+ dat += "Lust tolerance: [lust_tolerance] "
+ dat += "Sexual potency: [sexual_potency] "
+ dat += " "
- for(var/mutant_part in GLOB.all_mutant_parts)
- if(mutant_part == "mam_body_markings")
- continue
- if(parent.can_have_part(mutant_part))
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
- dat += "[GLOB.all_mutant_parts[mutant_part]] "
- dat += "[features[mutant_part]] "
- var/color_type = GLOB.colored_mutant_parts[mutant_part] //if it can be coloured, show the appropriate button
- if(color_type)
- dat += "#[features[color_type]] Change "
+ //SPLURT EDIT BEGIN - gregnancy preferences
+ dat += ""
+ dat += "Pregnancy preferences "
+ dat += "Chance of impregnation: [virility ? virility : "Disabled"] "
+ dat += "Chance of getting pregnant: [fertility ? fertility : "Disabled"] "
+ dat += "Lay inert eggs: [features["inert_eggs"] == TRUE ? "Enabled" : "Disabled"] "
+ if(fertility)
+ dat += "Pregnancy inflation: [pregnancy_inflation ? "Enabled" : "Disabled"] "
+ dat += "Pregnancy breast growth: [pregnancy_breast_growth ? "Enabled" : "Disabled"] "
+ if(fertility || features["inert_eggs"])
+ dat += "Egg shell: [egg_shell] "
+ dat += " "
+ //SPLURT EDIT END
+ dat += APPEARANCE_CATEGORY_COLUMN
+ if(NOGENITALS in pref_species.species_traits)
+ dat += "Your species ([pref_species.name]) does not support genitals! "
else
- if(features["color_scheme"] == ADVANCED_CHARACTER_COLORING) //advanced individual part colouring system
- //is it matrixed or does it have extra parts to be coloured?
- var/find_part = features[mutant_part] || pref_species.mutant_bodyparts[mutant_part]
- var/find_part_list = GLOB.mutant_reference_list[mutant_part]
- if(find_part && find_part != "None" && find_part_list)
- var/datum/sprite_accessory/accessory = find_part_list[find_part]
- if(accessory)
- if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future
- var/mutant_string = accessory.mutant_part_string
- var/primary_feature = "[mutant_string]_primary"
- var/secondary_feature = "[mutant_string]_secondary"
- var/tertiary_feature = "[mutant_string]_tertiary"
- if(!features[primary_feature])
- features[primary_feature] = features["mcolor"]
- if(!features[secondary_feature])
- features[secondary_feature] = features["mcolor2"]
- if(!features[tertiary_feature])
- features[tertiary_feature] = features["mcolor3"]
-
- var/matrixed_sections = accessory.matrixed_sections
- if(accessory.color_src == MATRIXED && !matrixed_sections)
- message_admins("Sprite Accessory Failure (customization): Accessory [accessory.type] is a matrixed item without any matrixed sections set!")
- continue
- else if(accessory.color_src == MATRIXED)
- switch(matrixed_sections)
- if(MATRIX_GREEN) //only composed of a green section
- primary_feature = secondary_feature //swap primary for secondary, so it properly assigns the second colour, reserved for the green section
- if(MATRIX_BLUE)
- primary_feature = tertiary_feature //same as above, but the tertiary feature is for the blue section
- if(MATRIX_RED_BLUE) //composed of a red and blue section
- secondary_feature = tertiary_feature //swap secondary for tertiary, as blue should always be tertiary
- if(MATRIX_GREEN_BLUE) //composed of a green and blue section
- primary_feature = secondary_feature //swap primary for secondary, as first option is green, which is linked to the secondary
- secondary_feature = tertiary_feature //swap secondary for tertiary, as second option is blue, which is linked to the tertiary
- dat += "Primary Color "
- dat += "#[features[primary_feature]] Change "
- if((accessory.color_src == MATRIXED && (matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL)) || (accessory.extra && (accessory.extra_color_src == MUTCOLORS || accessory.extra_color_src == MUTCOLORS2 || accessory.extra_color_src == MUTCOLORS3)))
- dat += "Secondary Color "
- dat += "#[features[secondary_feature]] Change "
- if((accessory.color_src == MATRIXED && matrixed_sections == MATRIX_ALL) || (accessory.extra2 && (accessory.extra2_color_src == MUTCOLORS || accessory.extra2_color_src == MUTCOLORS2 || accessory.extra2_color_src == MUTCOLORS3)))
- dat += "Tertiary Color "
- dat += "#[features[tertiary_feature]] Change "
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
+ if(pref_species.use_skintones)
+ dat += "Genitals use skintone: [features["genitals_use_skintone"] == TRUE ? "Yes" : "No"] "
+ dat += "Penis "
+ dat += "[features["has_cock"] == TRUE ? "Yes" : "No"] "
+ if(features["has_cock"])
+ if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
+ dat += "Penis Color: "
+ dat += "[SKINTONE2HEX(skin_tone)] (Skin tone overriding) "
+ else
+ dat += "Penis Color: "
+ dat += "#[features["cock_color"]] Change "
+ var/tauric_shape = FALSE
+ if(features["cock_taur"])
+ var/datum/sprite_accessory/penis/P = GLOB.cock_shapes_list[features["cock_shape"]]
+ if(P.taur_icon && parent.can_have_part("taur"))
+ var/datum/sprite_accessory/taur/T = GLOB.taur_list[features["taur"]]
+ if(T.taur_mode & P.accepted_taurs)
+ tauric_shape = TRUE
+ dat += "Penis Shape: [features["cock_shape"]][tauric_shape ? " (Taur)" : ""] "
+ dat += "Penis Length: [features["cock_length"]] inch(es) "
+ dat += "Diameter Ratio: [features["cock_diameter_ratio"]] " //SPLURT Edit
+ dat += "Penis Visibility: [features["cock_visibility"]] "
+ dat += "Egg Stuffing: [features["cock_stuffing"] == TRUE ? "Yes" : "No"] " //SPLURT Edit
+ dat += "Has Testicles: [features["has_balls"] == TRUE ? "Yes" : "No"] "
+ if(features["has_balls"])
+ if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
+ dat += "Testicles Color: "
+ dat += "[SKINTONE2HEX(skin_tone)] (Skin tone overriding) "
+ else
+ dat += "Testicles Color: "
+ dat += "#[features["balls_color"]] Change "
+ dat += "Testicles Shape: [features["balls_shape"]] "
+ dat += "Testicles Visibility: [features["balls_visibility"]] "
+ //SPLURT Edit
+ dat += "Egg Stuffing: [features["balls_stuffing"] == TRUE ? "Yes" : "No"] "
+ dat += "Produces: "
+ var/datum/reagent/balls_fluid = find_reagent_object_from_type(features["balls_fluid"])
+ if(balls_fluid && (balls_fluid in GLOB.genital_fluids_list))
+ dat += "[balls_fluid.name] "
+ else
+ dat += "Nothing? "
+ //SPLURT Edit end
dat += ""
- mutant_category = 0
+ dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "Vagina "
+ dat += "[features["has_vag"] == TRUE ? "Yes" : "No"] "
+ if(features["has_vag"])
+ dat += "Vagina Type: [features["vag_shape"]] "
+ if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
+ dat += "Vagina Color: "
+ dat += "[SKINTONE2HEX(skin_tone)] (Skin tone overriding) "
+ else
+ dat += "Vagina Color: "
+ dat += "#[features["vag_color"]] Change "
+ dat += "Vagina Visibility: [features["vag_visibility"]] "
+ dat += "Egg Stuffing: [features["vag_stuffing"] == TRUE ? "Yes" : "No"] " //SPLURT Edit
+ dat += "Has Womb: [features["has_womb"] == TRUE ? "Yes" : "No"] "
+ //SPLURT Edit
+ if(features["has_womb"] == TRUE)
+ dat += "Produces: "
+ var/datum/reagent/womb_fluid = find_reagent_object_from_type(features["womb_fluid"])
+ if(womb_fluid && (womb_fluid in GLOB.genital_fluids_list))
+ dat += "[womb_fluid.name] "
+ else
+ dat += "Nothing? "
+ //SPLURT Edit end
+ dat += ""
+ dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "Breasts "
+ dat += "[features["has_breasts"] == TRUE ? "Yes" : "No"] "
+ if(features["has_breasts"])
+ if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
+ dat += "Color: "
+ dat += "[SKINTONE2HEX(skin_tone)] (Skin tone overriding) "
+ else
+ dat += "Color: "
+ dat += "#[features["breasts_color"]] Change "
+ dat += "Cup Size: [features["breasts_size"]] "
+ dat += "Breasts Shape: [features["breasts_shape"]] "
+ dat += "Breasts Visibility: [features["breasts_visibility"]] "
+ dat += "Lactates: [features["breasts_producing"] == TRUE ? "Yes" : "No"] "
+ //SPLURT Edit
+ dat += "Egg Stuffing: [features["breasts_stuffing"] == TRUE ? "Yes" : "No"] "
+ if(features["breasts_producing"] == TRUE)
+ dat += "Produces: "
+ var/datum/reagent/breasts_fluid = find_reagent_object_from_type(features["breasts_fluid"])
+ if(breasts_fluid && (breasts_fluid in GLOB.genital_fluids_list))
+ dat += "[breasts_fluid.name] "
+ else
+ dat += "Nothing? "
+ //SPLURT Edit end
+ dat += ""
+ dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "Butt "
+ dat += "[features["has_butt"] == TRUE ? "Yes" : "No"] "
+ if(features["has_butt"])
+ if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
+ dat += "Color: "
+ dat += "[SKINTONE2HEX(skin_tone)] (Skin tone overriding) "
+ else
+ dat += "Color: "
+ dat += "#[features["butt_color"]] Change "
+ dat += "Butt Size: [features["butt_size"]] "
+ dat += "Butt Visibility: [features["butt_visibility"]] "
+ //SPLURT Edit
+ dat += "Egg Stuffing: [features["butt_stuffing"] == TRUE ? "Yes" : "No"] "
+ dat += "Butthole Sprite: [features["has_anus"] == TRUE ? "Yes" : "No"] "
+ if(features["has_anus"])
+ dat += "Butthole Color: "
+ if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
+ dat += "[SKINTONE2HEX(skin_tone)] (Skin tone overriding) "
+ else
+ dat += "#[features["anus_color"]] Change "
+ dat += "Butthole Shape: [features["anus_shape"]] "
+ dat += "Butthole Visibility: [features["anus_visibility"]] "
+ dat += "Egg Stuffing: [features["anus_stuffing"] == TRUE ? "Yes" : "No"] "
- if(length(pref_species.allowed_limb_ids))
- if(!chosen_limb_id || !(chosen_limb_id in pref_species.allowed_limb_ids))
- chosen_limb_id = pref_species.limbs_id || pref_species.id
- dat += "Body sprite "
- dat += "[chosen_limb_id] "
+ dat += ""
+ dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "Belly "
+ dat += "[features["has_belly"] == TRUE ? "Yes" : "No"] "
+ if(features["has_belly"])
+ if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
+ dat += "Color: "
+ dat += "[SKINTONE2HEX(skin_tone)] (Skin tone overriding) "
+ else
+ dat += "Color: "
+ dat += "#[features["belly_color"]] Change "
+ dat += "Belly Size: [features["belly_size"]] "
+ dat += "Belly Visibility: [features["belly_visibility"]] "
+ dat += "Egg Stuffing: [features["belly_stuffing"] == TRUE ? "Yes" : "No"] "
+ dat += ""
+ if(all_quirks.Find("Dullahan"))
+ dat += APPEARANCE_CATEGORY_COLUMN
- if(mutant_category)
- dat += ""
- mutant_category = 0
+ dat += "Neckfire "
+ dat += "[features["neckfire"] ? "Yes" : "No"] "
+ if(features["neckfire"])
+ dat += "Color: "
+ dat += "#[features["neckfire_color"]] Change "
- dat += "
"
+ dat += ""
+ //SPLURT Edit end
+ dat += ""
+ dat += "
"
+ //Markings
+ if(MARKINGS_CHAR_TAB)
+ var/iterated_markings = 0
+ var/total_pages = 0
+ // rp marking selection
+ // assume you can only have mam markings or regular markings or none, never both
+ var/marking_type
+ if(parent.can_have_part("mam_body_markings"))
+ marking_type = "mam_body_markings"
+ if(marking_type)
+ dat += APPEARANCE_CATEGORY_COLUMN
+ dat += ""
+ dat += "[GLOB.all_mutant_parts[marking_type]] " // give it the appropriate title for the type of marking
+ dat += "Add marking "
+ dat += " "
- dat += ""
- dat += ""
- dat += "Clothing & Equipment "
- /* skyrat change
- dat += "Underwear: [underwear] "
- if(GLOB.underwear_list[underwear]?.has_color)
- dat += "Underwear Color: #[undie_color] Change "
- dat += "Undershirt: [undershirt] "
- if(GLOB.undershirt_list[undershirt]?.has_color)
- dat += "Undershirt Color: #[shirt_color] Change "
- dat += "Socks: [socks] "
- if(GLOB.socks_list[socks]?.has_color)
- dat += "Socks Color: #[socks_color] Change "
- */
- dat += "Backpack: [backbag] "
- dat += "Jumpsuit: [jumpsuit_style] "
- if((HAS_FLESH in pref_species.species_traits) || (HAS_BONE in pref_species.species_traits))
- dat += "Temporal Scarring: [(persistent_scars) ? "Enabled" : "Disabled"] "
- dat += "Clear scar slots "
- dat += "Uplink Location: [uplink_spawn_loc] "
- dat += " "
+ dat += ""
- dat += ""
- dat += "Lewd preferences "
- dat += "Lust tolerance: [lust_tolerance] "
- dat += "Sexual potency: [sexual_potency] "
- dat += " "
+ for(var/limb in GLOB.bodypart_values)
+ if(length(GLOB.bodypart_values) % 3 != 0)
+ continue
+ total_pages++
+
+ for(var/limb in GLOB.bodypart_values)
+ if(!iterated_markings)
+ dat += ""
+ dat += "[limb] "
+ dat += ""
+ dat += " "
+ dat += " "
+ dat += " "
+ dat += " "
+ dat += " "
+ dat += " "
+ dat += ""
+
+ // list out the current markings you have
+ if(length(features[marking_type]))
+ var/list/markings = features[marking_type]
+ if(!islist(markings))
+ // something went terribly wrong
+ markings = list()
+
+ for(var/list/marking_list in markings)
+ var/marking_index = markings.Find(marking_list) // consider changing loop to go through indexes over lists instead of using Find here
+ var/limb_value = marking_list[1]
+ var/actual_name = GLOB.bodypart_names[num2text(limb_value)] // get the actual name from the bitflag representing the part the marking is applied to
+ if(actual_name != limb)
+ continue
+ var/color_marking_dat = ""
+ var/number_colors = 1
+ var/datum/sprite_accessory/mam_body_markings/S = GLOB.mam_body_markings_list[marking_list[2]]
+ var/matrixed_sections = S.covered_limbs[actual_name]
+ if(S && matrixed_sections)
+ // if it has nothing initialize it to white
+ if(length(marking_list) == 2)
+ var/first = "#FFFFFF"
+ var/second = "#FFFFFF"
+ var/third = "#FFFFFF"
+ if(features["mcolor"])
+ first = "#[features["mcolor"]]"
+ if(features["mcolor2"])
+ second = "#[features["mcolor2"]]"
+ if(features["mcolor3"])
+ third = "#[features["mcolor3"]]"
+ marking_list += list(list(first, second, third)) // just assume its 3 colours if it isnt it doesnt matter we just wont use the other values
+ // index magic
+ var/primary_index = 1
+ var/secondary_index = 2
+ var/tertiary_index = 3
+ switch(matrixed_sections)
+ if(MATRIX_GREEN)
+ primary_index = 2
+ if(MATRIX_BLUE)
+ primary_index = 3
+ if(MATRIX_RED_BLUE)
+ secondary_index = 2
+ if(MATRIX_GREEN_BLUE)
+ primary_index = 2
+ secondary_index = 3
+
+ // we know it has one matrixed section at minimum
+ color_marking_dat += "[marking_list[3][primary_index]] "
+ // if it has a second section, add it
+ if(matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL)
+ number_colors = 2
+ color_marking_dat += "[marking_list[3][secondary_index]] "
+ // if it has a third section, add it
+ if(matrixed_sections == MATRIX_ALL)
+ number_colors = 3
+ color_marking_dat += "[marking_list[3][tertiary_index]] "
+ dat += ""
+ dat += "[marking_index] "
+ dat += "˅ "
+ dat += "˄ "
+ dat += "[marking_list[2]] "
+ dat += "[color_marking_dat] "
+ dat += "X "
+ dat += " "
- //SPLURT EDIT BEGIN - gregnancy preferences
- dat += ""
- dat += "Pregnancy preferences "
- dat += "Chance of impregnation: [virility ? virility : "Disabled"] "
- dat += "Chance of getting pregnant: [fertility ? fertility : "Disabled"] "
- dat += "Lay inert eggs: [features["inert_eggs"] == TRUE ? "Enabled" : "Disabled"] "
- if(fertility)
- dat += "Pregnancy inflation: [pregnancy_inflation ? "Enabled" : "Disabled"] "
- dat += "Pregnancy breast growth: [pregnancy_breast_growth ? "Enabled" : "Disabled"] "
- if(fertility || features["inert_eggs"])
- dat += "Egg shell: [egg_shell] "
- dat += " "
- //SPLURT EDIT END
- dat += APPEARANCE_CATEGORY_COLUMN
- if(NOGENITALS in pref_species.species_traits)
- dat += "Your species ([pref_species.name]) does not support genitals! "
- else
- if(pref_species.use_skintones)
- dat += "Genitals use skintone: [features["genitals_use_skintone"] == TRUE ? "Yes" : "No"] "
- dat += "Penis "
- dat += "[features["has_cock"] == TRUE ? "Yes" : "No"] "
- if(features["has_cock"])
- if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
- dat += "Penis Color: "
- dat += "[SKINTONE2HEX(skin_tone)] (Skin tone overriding) "
- else
- dat += "Penis Color: "
- dat += "#[features["cock_color"]] Change "
- var/tauric_shape = FALSE
- if(features["cock_taur"])
- var/datum/sprite_accessory/penis/P = GLOB.cock_shapes_list[features["cock_shape"]]
- if(P.taur_icon && parent.can_have_part("taur"))
- var/datum/sprite_accessory/taur/T = GLOB.taur_list[features["taur"]]
- if(T.taur_mode & P.accepted_taurs)
- tauric_shape = TRUE
- dat += "Penis Shape: [features["cock_shape"]][tauric_shape ? " (Taur)" : ""] "
- dat += "Penis Length: [features["cock_length"]] inch(es) "
- dat += "Diameter Ratio: [features["cock_diameter_ratio"]] "
- dat += "Penis Visibility: [features["cock_visibility"]] "
- dat += "Egg Stuffing: [features["cock_stuffing"] == TRUE ? "Yes" : "No"] "
- dat += "Has Testicles: [features["has_balls"] == TRUE ? "Yes" : "No"] "
- if(features["has_balls"])
- if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
- dat += "Testicles Color: "
- dat += "[SKINTONE2HEX(skin_tone)] (Skin tone overriding) "
- else
- dat += "Testicles Color: "
- dat += "#[features["balls_color"]] Change "
- dat += "Testicles Shape: [features["balls_shape"]] "
- dat += "Testicles Visibility: [features["balls_visibility"]] "
- dat += "Egg Stuffing: [features["balls_stuffing"] == TRUE ? "Yes" : "No"] "
- dat += "Produces: "
- var/datum/reagent/balls_fluid = find_reagent_object_from_type(features["balls_fluid"])
- if(balls_fluid && (balls_fluid in GLOB.genital_fluids_list))
- dat += "[balls_fluid.name] "
- else
- dat += "Nothing? "
- dat += ""
- dat += APPEARANCE_CATEGORY_COLUMN
- dat += "Vagina "
- dat += "[features["has_vag"] == TRUE ? "Yes" : "No"] "
- if(features["has_vag"])
- dat += "Vagina Type: [features["vag_shape"]] "
- if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
- dat += "Vagina Color: "
- dat += "[SKINTONE2HEX(skin_tone)] (Skin tone overriding) "
- else
- dat += "Vagina Color: "
- dat += "#[features["vag_color"]] Change "
- dat += "Vagina Visibility: [features["vag_visibility"]] "
- dat += "Egg Stuffing: [features["vag_stuffing"] == TRUE ? "Yes" : "No"] "
- dat += "Has Womb: [features["has_womb"] == TRUE ? "Yes" : "No"] "
- if(features["has_womb"] == TRUE)
- dat += "Produces: "
- var/datum/reagent/womb_fluid = find_reagent_object_from_type(features["womb_fluid"])
- if(womb_fluid && (womb_fluid in GLOB.genital_fluids_list))
- dat += "[womb_fluid.name] "
+ else
+ dat += ""
+ dat += " "
+ dat += " "
+ dat += " "
+ dat += " "
+ dat += " "
+ dat += " "
+ dat += " "
+
+ dat += "
"
+
+ iterated_markings++
+ if(iterated_markings >= 3)
+ dat += " "
+ iterated_markings = 0
+ dat += "
"
+
+ if(SPEECH_CHAR_TAB)
+ dat += ""
+ if(BACKGROUND_CHAR_TAB)
+ dat += ""
+ if(LOADOUT_CHAR_TAB)
+ dat += ""
+ dat += "You can only choose one item per category, unless it's an item that spawns in your backpack or hands. "
+ dat += ""
+
+ if(!length(GLOB.loadout_items))
+ dat += " ERROR: No loadout categories - something is horribly wrong!"
else
- dat += "Color: "
- dat += "#[features["belly_color"]] Change "
- dat += "Belly Size: [features["belly_size"]] "
- dat += "Belly Visibility: [features["belly_visibility"]] "
- dat += "Egg Stuffing: [features["belly_stuffing"] == TRUE ? "Yes" : "No"] "
- dat += " "
- if(all_quirks.Find("Dullahan"))
- dat += APPEARANCE_CATEGORY_COLUMN
+ if(!GLOB.loadout_categories[gear_category])
+ gear_category = GLOB.loadout_categories[1]
+ var/firstcat = TRUE
+ for(var/category in GLOB.loadout_categories)
+ if(firstcat)
+ firstcat = FALSE
+ else
+ dat += " |"
+ if(category == gear_category)
+ dat += " [category] "
+ else
+ dat += " [category] "
- dat += "Neckfire "
- dat += "[features["neckfire"] ? "Yes" : "No"] "
- if(features["neckfire"])
- dat += "Color: "
- dat += "#[features["neckfire_color"]] Change "
+ dat += " "
+ dat += " "
- dat += ""
- dat += ""
- dat += "
"
+ dat += ""
- if(SPEECH_TAB)
- if(path)
- var/savefile/S = new /savefile(path)
- if(S)
- dat += " "
- var/name
- var/unspaced_slots = 0
- for(var/i=1, i<=max_save_slots, i++)
- unspaced_slots++
- if(unspaced_slots > 4)
- dat += " "
- unspaced_slots = 0
- S.cd = "/character[i]"
- S["real_name"] >> name
- if(!name)
- name = "Character[i]"
- dat += "[name] "
- dat += " "
-
- dat += ""
-
- if(GAME_PREFERENCES_TAB) // Game Preferences
- dat += ""
- dat += "General Settings "
- dat += "UI Style: [UI_style] "
- dat += "Outline: [outline_enabled ? "Enabled" : "Disabled"] "
- dat += "Outline Color: [outline_color ? "" : "Theme-based (null)"][outline_color] Change "
- dat += "Screentip: [screentip_pref ? "Enabled" : "Disabled"] "
- dat += "Screentip Color: [screentip_color] Change "
- dat += "tgui Monitors: [(tgui_lock) ? "Primary" : "All"] "
- dat += "tgui Style: [(tgui_fancy) ? "Fancy" : "No Frills"] "
- dat += "Input Framework: [(tgui_input_mode) ? "tgui" : "BYOND"] "
- dat += "tgui Button Size: [(tgui_large_buttons) ? "Large" : "Small"] "
- dat += "tgui Buttons Swapped: [(tgui_swapped_buttons) ? "Yes" : "No"] "
- dat += "Show Runechat Chat Bubbles: [chat_on_map ? "Enabled" : "Disabled"] "
- dat += "Runechat message char limit: [max_chat_length] "
- dat += "See Runechat for non-mobs: [see_chat_non_mob ? "Enabled" : "Disabled"] "
- //SKYRAT CHANGES BEGIN
- dat += "See Runechat for emotes: [see_chat_emotes ? "Enabled" : "Disabled"] "
- //SKYRAT CHANGES END
- dat += " "
- dat += "Action Buttons: [(buttons_locked) ? "Locked In Place" : "Unlocked"] "
- dat += " "
- dat += "PDA Color: [pda_color] Change "
- dat += "PDA Style: [pda_style] "
- dat += "PDA Reskin: [pda_skin] "
- dat += " "
- dat += "Ghost Ears: [(chat_toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"] "
- dat += "Ghost Radio: [(chat_toggles & CHAT_GHOSTRADIO) ? "All Messages":"No Messages"] "
- dat += "Ghost Sight: [(chat_toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"] "
- dat += "Ghost Whispers: [(chat_toggles & CHAT_GHOSTWHISPER) ? "All Speech" : "Nearest Creatures"] "
- dat += "Ghost PDA: [(chat_toggles & CHAT_GHOSTPDA) ? "All Messages" : "Nearest Creatures"] "
- dat += "Window Flashing: [(windowflashing) ? "Enabled":"Disabled"] "
- dat += " "
- dat += "Play Admin MIDIs: [(toggles & SOUND_MIDI) ? "Enabled":"Disabled"] "
- dat += "Play Lobby Music: [(toggles & SOUND_LOBBY) ? "Enabled":"Disabled"] "
- dat += "See Pull Requests: [(chat_toggles & CHAT_PULLR) ? "Enabled":"Disabled"] "
- dat += " "
- if(user.client)
- if(unlock_content)
- dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"] "
- if(unlock_content || check_rights_for(user.client, R_ADMIN))
- dat += "OOC Color: [ooccolor ? ooccolor : GLOB.normal_ooc_colour] Change "
- dat += "Antag OOC Color: [aooccolor ? aooccolor : GLOB.normal_aooc_colour] Change "
+ if(!length(GLOB.loadout_categories[gear_category]))
+ dat += "No subcategories detected. Something is horribly wrong!"
+ else
+ var/list/subcategories = GLOB.loadout_categories[gear_category]
+ if(!subcategories.Find(gear_subcategory))
+ gear_subcategory = subcategories[1]
+
+ var/firstsubcat = TRUE
+ for(var/subcategory in subcategories)
+ if(firstsubcat)
+ firstsubcat = FALSE
+ else
+ dat += " |"
+ if(gear_subcategory == subcategory)
+ dat += " [subcategory] "
+ else
+ dat += " [subcategory] "
+ dat += " "
+
+ dat += ""
+ dat += ""
+ dat += "Name "
+ dat += "Cost "
+ dat += "Restrictions "
+ dat += "Description "
+ dat += " "
+
+ var/even = FALSE
+ for(var/name in GLOB.loadout_items[gear_category][gear_subcategory])
+ var/datum/gear/gear = GLOB.loadout_items[gear_category][gear_subcategory][name]
+ var/donoritem = gear.donoritem
+ if(donoritem && !gear.donator_ckey_check(user.ckey))
+ continue
+ var/background_cl = "#23273C"
+ if(even)
+ background_cl = "#17191C"
+ even = !even
+ var/class_link = ""
+ var/list/loadout_item = has_loadout_gear(loadout_slot, "[gear.type]")
+ var/extra_loadout_data = ""
+ if(loadout_item)
+ class_link = "style='white-space:normal;' class='linkOn' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=0'"
+ if(gear.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC)
+ extra_loadout_data += "Color "
+ for(var/loadout_color in loadout_item[LOADOUT_COLOR])
+ extra_loadout_data += "[loadout_color] "
+ else
+ var/loadout_color_non_poly = "#FFFFFF"
+ if(length(loadout_item[LOADOUT_COLOR]))
+ loadout_color_non_poly = loadout_item[LOADOUT_COLOR][1]
+ extra_loadout_data += "Color "
+ extra_loadout_data += "[loadout_color_non_poly] "
+ if(gear.loadout_flags & LOADOUT_CAN_NAME)
+ extra_loadout_data += "Name [loadout_item[LOADOUT_CUSTOM_NAME] ? loadout_item[LOADOUT_CUSTOM_NAME] : "N/A"]"
+ if(gear.loadout_flags & LOADOUT_CAN_DESCRIPTION)
+ extra_loadout_data += "Description "
+ else if((gear_points - gear.cost) < 0)
+ class_link = "style='white-space:normal;' class='linkOff'"
+ else if(donoritem)
+ class_link = "style='white-space:normal;background:#ebc42e;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'"
+ else if(!istype(gear, /datum/gear/unlockable) || can_use_unlockable(gear))
+ class_link = "style='white-space:normal;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'"
+ else
+ class_link = "style='white-space:normal;background:#eb2e2e;' class='linkOff'"
+ dat += "[name] [extra_loadout_data] "
+ dat += "[gear.cost] "
+ if(islist(gear.restricted_roles))
+ if(gear.restricted_roles.len)
+ if(gear.restricted_desc)
+ dat += ""
+ dat += gear.restricted_desc
+ dat += " "
+ else
+ dat += ""
+ dat += gear.restricted_roles.Join(";")
+ dat += " "
+ if(!istype(gear, /datum/gear/unlockable))
+ // the below line essentially means "if the loadout item is picked by the user and has a custom description, give it the custom description, otherwise give it the default description"
+ dat += " [loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description] "
+ else
+ //we add the user's progress to the description assuming they have progress
+ var/datum/gear/unlockable/unlockable = gear
+ var/progress_made = unlockable_loadout_data[unlockable.progress_key]
+ if(!progress_made)
+ progress_made = 0
+ dat += "[loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description] Progress: [min(progress_made, unlockable.progress_required)]/[unlockable.progress_required] "
+ dat += "
"
+ dat += "
"
+ if(PREFERENCES_TAB) // Game Preferences
+ dat += ""
+ dat += "General "
+ dat += "OOC "
+ dat += "Content "
+ dat += " "
+
+ dat += " "
+
+ switch(preferences_tab)
+ if(GAME_PREFS_TAB)
+ dat += ""
+
+ if(OOC_PREFS_TAB)
+ dat += ""
- if(unlock_content)
- dat += "Ghost Form: [ghost_form] "
- dat += "Ghost Orbit: [ghost_orbit] "
- var/button_name = "If you see this something went wrong."
- switch(ghost_accs)
- if(GHOST_ACCS_FULL)
- button_name = GHOST_ACCS_FULL_NAME
- if(GHOST_ACCS_DIR)
- button_name = GHOST_ACCS_DIR_NAME
- if(GHOST_ACCS_NONE)
- button_name = GHOST_ACCS_NONE_NAME
-
- dat += "Ghost Accessories: [button_name] "
- switch(ghost_others)
- if(GHOST_OTHERS_THEIR_SETTING)
- button_name = GHOST_OTHERS_THEIR_SETTING_NAME
- if(GHOST_OTHERS_DEFAULT_SPRITE)
- button_name = GHOST_OTHERS_DEFAULT_SPRITE_NAME
- if(GHOST_OTHERS_SIMPLE)
- button_name = GHOST_OTHERS_SIMPLE_NAME
-
- dat += "Ghosts of Others: [button_name] "
- dat += " "
-
- dat += "FPS: [clientfps] "
-
- dat += "Income Updates: [(chat_toggles & CHAT_BANKCARD) ? "Allowed" : "Muted"] "
- dat += " "
-
- dat += "Parallax (Fancy Space): "
- switch (parallax)
- if (PARALLAX_LOW)
- dat += "Low"
- if (PARALLAX_MED)
- dat += "Medium"
- if (PARALLAX_INSANE)
- dat += "Insane"
- if (PARALLAX_DISABLE)
- dat += "Disabled"
- else
- dat += "High"
- dat += " "
- dat += "Ambient Occlusion: [ambientocclusion ? "Enabled" : "Disabled"] "
- dat += "Fit Viewport: [auto_fit_viewport ? "Auto" : "Manual"] "
- dat += "HUD Button Flashes: [hud_toggle_flash ? "Enabled" : "Disabled"] "
- dat += "HUD Button Flash Color: [hud_toggle_color] Change "
-
-/* CITADEL EDIT - We're using top menu instead
- button_name = pixel_size
- dat += "Pixel Scaling: [(button_name) ? "Pixel Perfect [button_name]x" : "Stretch to fit"] "
-
- switch(scaling_method)
- if(SCALING_METHOD_NORMAL)
- button_name = "Nearest Neighbor"
- if(SCALING_METHOD_DISTORT)
- button_name = "Point Sampling"
- if(SCALING_METHOD_BLUR)
- button_name = "Bilinear"
- dat += "Scaling Method: [button_name] "
-*/
-
- if (CONFIG_GET(flag/maprotation) && CONFIG_GET(flag/tgstyle_maprotation))
- var/p_map = preferred_map
- if (!p_map)
- p_map = "Default"
- if (config.defaultmap)
- p_map += " ([config.defaultmap.map_name])"
- else
- if (p_map in config.maplist)
- var/datum/map_config/VM = config.maplist[p_map]
- if (!VM)
- p_map += " (No longer exists)"
- else
- p_map = VM.map_name
- else
- p_map += " (No longer exists)"
- if(CONFIG_GET(flag/allow_map_voting))
- dat += "Preferred Map: [p_map] "
+ dat += " "
- dat += ""
+ dat += ""
+
+ dat += "Citadel Preferences " //Because fuck me if preferences can't be fucking modularized and expected to update in a reasonable timeframe.
+ dat += "Widescreen: [widescreenpref ? "Enabled ([CONFIG_GET(string/default_view)])" : "Disabled (15x15)"] "
+ dat += "Long strip menu: [long_strip_menu ? "Enabled" : "Disabled"] "
+ dat += "Auto stand: [autostand ? "Enabled" : "Disabled"] "
+ dat += "Auto OOC: [auto_ooc ? "Enabled" : "Disabled"] "
+ dat += "Force Slot Storage HUD: [no_tetris_storage ? "Enabled" : "Disabled"] "
+ dat += "Screen Shake: [(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")] "
+ if (user && user.client && !user.client.prefs.screenshake==0)
+ dat += "Damage Screen Shake: [(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")] "
+ dat += "Recoil Screen Push: [(recoil_screenshake==100) ? "Full" : ((recoil_screenshake==0) ? "None" : "[screenshake]")] "
+ var/p_chaos
+ if (!preferred_chaos)
+ p_chaos = "No preference"
+ else
+ p_chaos = preferred_chaos
+ dat += "Preferred Chaos Amount: [p_chaos] "
- if(LOADOUT_TAB)
- //calculate your gear points from the chosen item
- gear_points = CONFIG_GET(number/initial_gear_points)
- var/list/chosen_gear = loadout_data["SAVE_[loadout_slot]"]
- if(chosen_gear)
- for(var/loadout_item in chosen_gear)
- var/loadout_item_path = loadout_item[LOADOUT_ITEM]
- if(loadout_item_path)
- var/datum/gear/loadout_gear = text2path(loadout_item_path)
- if(loadout_gear)
- gear_points -= initial(loadout_gear.cost)
- else
- chosen_gear = list()
+ //SPLURT Edit
+ dat += "S.P.L.U.R.T. Preferences "
+ dat += "Be Antagonist Victim: [be_victim ? be_victim : BEVICTIM_ASK] "
+ dat += "Disable combat mode cursor: [disable_combat_cursor?"Yes":"No"] "
+ dat += "Splashscreen Player Panel Style: [(toggles & TG_PLAYER_PANEL)?"TG":"Old"] "
+ //SPLURT Edit end
- dat += ""
- dat += "[gear_points] loadout points remaining. \[Clear Loadout \] "
- dat += "You can only choose one item per category, unless it's an item that spawns in your backpack or hands. "
- dat += ""
+ dat += " "
- if(!length(GLOB.loadout_items))
- dat += " ERROR: No loadout categories - something is horribly wrong!"
- else
- if(!GLOB.loadout_categories[gear_category])
- gear_category = GLOB.loadout_categories[1]
- var/firstcat = TRUE
- for(var/category in GLOB.loadout_categories)
- if(firstcat)
- firstcat = FALSE
- else
- dat += " |"
- if(category == gear_category)
- dat += " [category] "
- else
- dat += " [category] "
+ if(unlock_content)
+ dat += "Ghost Form: [ghost_form] "
+ dat += "Ghost Orbit: [ghost_orbit] "
+ var/button_name = "If you see this something went wrong."
+ switch(ghost_accs)
+ if(GHOST_ACCS_FULL)
+ button_name = GHOST_ACCS_FULL_NAME
+ if(GHOST_ACCS_DIR)
+ button_name = GHOST_ACCS_DIR_NAME
+ if(GHOST_ACCS_NONE)
+ button_name = GHOST_ACCS_NONE_NAME
+
+ dat += "Ghost Accessories: [button_name] "
+ switch(ghost_others)
+ if(GHOST_OTHERS_THEIR_SETTING)
+ button_name = GHOST_OTHERS_THEIR_SETTING_NAME
+ if(GHOST_OTHERS_DEFAULT_SPRITE)
+ button_name = GHOST_OTHERS_DEFAULT_SPRITE_NAME
+ if(GHOST_OTHERS_SIMPLE)
+ button_name = GHOST_OTHERS_SIMPLE_NAME
+
+ dat += "Ghosts of Others: [button_name] "
+ dat += " "
- dat += " "
- dat += " "
+ dat += "FPS: [clientfps] "
- dat += ""
+ dat += "Income Updates: [(chat_toggles & CHAT_BANKCARD) ? "Allowed" : "Muted"] "
+ dat += " "
- if(!length(GLOB.loadout_categories[gear_category]))
- dat += "No subcategories detected. Something is horribly wrong!"
- else
- var/list/subcategories = GLOB.loadout_categories[gear_category]
- if(!subcategories.Find(gear_subcategory))
- gear_subcategory = subcategories[1]
-
- var/firstsubcat = TRUE
- for(var/subcategory in subcategories)
- if(firstsubcat)
- firstsubcat = FALSE
+ dat += "Parallax (Fancy Space): "
+ switch (parallax)
+ if (PARALLAX_LOW)
+ dat += "Low"
+ if (PARALLAX_MED)
+ dat += "Medium"
+ if (PARALLAX_INSANE)
+ dat += "Insane"
+ if (PARALLAX_DISABLE)
+ dat += "Disabled"
else
- dat += " |"
- if(gear_subcategory == subcategory)
- dat += " [subcategory] "
+ dat += "High"
+ dat += " "
+ dat += "Ambient Occlusion: [ambientocclusion ? "Enabled" : "Disabled"] "
+ dat += "Fit Viewport: [auto_fit_viewport ? "Auto" : "Manual"] "
+ dat += "HUD Button Flashes: [hud_toggle_flash ? "Enabled" : "Disabled"] "
+ dat += "HUD Button Flash Color: [hud_toggle_color] Change "
+
+
+ if (CONFIG_GET(flag/maprotation) && CONFIG_GET(flag/tgstyle_maprotation))
+ var/p_map = preferred_map
+ if (!p_map)
+ p_map = "Default"
+ if (config.defaultmap)
+ p_map += " ([config.defaultmap.map_name])"
else
- dat += " [subcategory] "
- dat += " "
-
- dat += "Name "
- dat += "Cost "
- dat += "Restrictions "
- dat += "Description "
- for(var/name in GLOB.loadout_items[gear_category][gear_subcategory])
- var/datum/gear/gear = GLOB.loadout_items[gear_category][gear_subcategory][name]
- var/donoritem = gear.donoritem
- if(donoritem && !gear.donator_ckey_check(user.ckey))
- continue
- var/class_link = ""
- var/list/loadout_item = has_loadout_gear(loadout_slot, "[gear.type]")
- var/extra_loadout_data = ""
- if(loadout_item)
- class_link = "style='white-space:normal;' class='linkOn' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=0'"
- if(gear.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC)
- extra_loadout_data += "Color "
- for(var/loadout_color in loadout_item[LOADOUT_COLOR])
- extra_loadout_data += "[loadout_color] "
- else
- var/loadout_color_non_poly = "#FFFFFF"
- if(length(loadout_item[LOADOUT_COLOR]))
- loadout_color_non_poly = loadout_item[LOADOUT_COLOR][1]
- extra_loadout_data += "Color "
- extra_loadout_data += "[loadout_color_non_poly] "
- if(gear.loadout_flags & LOADOUT_CAN_NAME)
- extra_loadout_data += "Name [loadout_item[LOADOUT_CUSTOM_NAME] ? loadout_item[LOADOUT_CUSTOM_NAME] : "N/A"]"
- if(gear.loadout_flags & LOADOUT_CAN_DESCRIPTION)
- extra_loadout_data += "Description "
- else if((gear_points - gear.cost) < 0)
- class_link = "style='white-space:normal;' class='linkOff'"
- else if(donoritem)
- class_link = "style='white-space:normal;background:#ebc42e;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'"
- else if(!istype(gear, /datum/gear/unlockable) || can_use_unlockable(gear))
- class_link = "style='white-space:normal;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'"
- else
- class_link = "style='white-space:normal;background:#eb2e2e;' class='linkOff'"
- dat += "[name] [extra_loadout_data] "
- dat += "[gear.cost] "
- if(islist(gear.restricted_roles))
- if(gear.restricted_roles.len)
- if(gear.restricted_desc)
- dat += ""
- dat += gear.restricted_desc
- dat += " "
+ if (p_map in config.maplist)
+ var/datum/map_config/VM = config.maplist[p_map]
+ if (!VM)
+ p_map += " (No longer exists)"
else
- dat += ""
- dat += gear.restricted_roles.Join(";")
- dat += " "
- if(!istype(gear, /datum/gear/unlockable))
- // the below line essentially means "if the loadout item is picked by the user and has a custom description, give it the custom description, otherwise give it the default description"
- dat += " [loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description] "
- else
- //we add the user's progress to the description assuming they have progress
- var/datum/gear/unlockable/unlockable = gear
- var/progress_made = unlockable_loadout_data[unlockable.progress_key]
- if(!progress_made)
- progress_made = 0
- dat += "[loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description] Progress: [min(progress_made, unlockable.progress_required)]/[unlockable.progress_required] "
+ p_map = VM.map_name
+ else
+ p_map += " (No longer exists)"
+ if(CONFIG_GET(flag/allow_map_voting))
+ dat += "Preferred Map: [p_map] "
+
+ dat += "
"
+
+ if(CONTENT_PREFS_TAB)
+ dat += ""
- dat += "
"
- if(CONTENT_PREFERENCES_TAB) // Content preferences
- dat += ""
- dat += " "
if(KEYBINDINGS_TAB) // Custom keybindings
dat += "Keybindings: [(hotkeys) ? "Hotkeys" : "Input"] "
dat += "Keybindings mode controls how the game behaves with tab and map/input focus. If it is on Hotkeys , the game will always attempt to force you to map focus, meaning keypresses are sent \
@@ -3148,47 +3218,37 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/limb_value = text2num(GLOB.bodypart_values[limb])
features[marking_type] += list(list(limb_value, selected_marking))
- if("marking_color")
+ if("marking_color_specific")
var/index = text2num(href_list["marking_index"])
var/marking_type = href_list["marking_type"]
- if(index && marking_type && features[marking_type])
- // work out the input options to show the user
- var/list/options = list("Primary")
- var/number_colors = text2num(href_list["number_colors"])
- var/color_number = 1 // 1-3 which color are we editing
- if(number_colors >= 2)
- options += "Secondary"
- if(number_colors == 3)
- options += "Tertiary"
- var/color_option = input(user, "Select the colour you wish to edit") as null|anything in options
- if(color_option)
- if(color_option == "Secondary") color_number = 2
- if(color_option == "Tertiary") color_number = 3
- // perform some magic on the color number
- var/list/marking_list = features[marking_type][index]
- var/datum/sprite_accessory/mam_body_markings/S = GLOB.mam_body_markings_list[marking_list[2]]
- var/matrixed_sections = S.covered_limbs[GLOB.bodypart_names[num2text(marking_list[1])]]
- if(color_number == 1)
- switch(matrixed_sections)
- if(MATRIX_GREEN)
- color_number = 2
- if(MATRIX_BLUE)
- color_number = 3
- else if(color_number == 2)
- switch(matrixed_sections)
- if(MATRIX_RED_BLUE)
- color_number = 3
- if(MATRIX_GREEN_BLUE)
- color_number = 3
-
- var/color_list = features[marking_type][index][3]
- var/new_marking_color = input(user, "Choose your character's marking color:", "Character Preference","#"+color_list[color_number]) as color|null
- if(new_marking_color)
- var/temp_hsv = RGBtoHSV(new_marking_color)
- if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV(MINIMUM_MUTANT_COLOR)[3]) // mutantcolors must be bright, but only if they affect the skin
- color_list[color_number] = "#[sanitize_hexcolor(new_marking_color, 6)]"
- else
- to_chat(user, "Invalid color. Your color is not bright enough. ")
+ var/color_number = text2num(href_list["number_color"])
+ if(index && marking_type && color_number && features[marking_type])
+ // perform some magic on the color number
+ var/list/marking_list = features[marking_type][index]
+ var/datum/sprite_accessory/mam_body_markings/S = GLOB.mam_body_markings_list[marking_list[2]]
+ var/matrixed_sections = S.covered_limbs[GLOB.bodypart_names[num2text(marking_list[1])]]
+ if(color_number == 1)
+ switch(matrixed_sections)
+ if(MATRIX_GREEN)
+ color_number = 2
+ if(MATRIX_BLUE)
+ color_number = 3
+ else if(color_number == 2)
+ switch(matrixed_sections)
+ if(MATRIX_RED_BLUE)
+ color_number = 3
+ if(MATRIX_GREEN_BLUE)
+ color_number = 3
+
+ var/color_list = features[marking_type][index][3]
+ var/new_marking_color = input(user, "Choose your character's marking color:", "Character Preference","#"+color_list[color_number]) as color|null
+ if(new_marking_color)
+ var/temp_hsv = RGBtoHSV(new_marking_color)
+ if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV(MINIMUM_MUTANT_COLOR)[3]) // mutantcolors must be bright, but only if they affect the skin
+ color_list[color_number] = "#[sanitize_hexcolor(new_marking_color, 6)]"
+ else
+ to_chat(user, "Invalid color. Your color is not bright enough. ")
+ //SPLURT Edit
if("gfluid_black")
var/list/datum/reagent/fluid_list = GLOB.genital_fluids_list.Copy()
var/list/blacklisted = list()
@@ -3208,6 +3268,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
LAZYREMOVE(gfluid_blacklist, selected.type)
else
to_chat(user, span_warning("You do not have blacklisted reagents!"))
+ //SPLURT Edit end
else
switch(href_list["preference"])
if("disable_combat_cursor")
@@ -3488,7 +3549,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(pickedOutlineColor != pickedOutlineColor)
outline_color = pickedOutlineColor // nullable
if("screentip_pref")
- screentip_pref = !screentip_pref
+ var/choice = tgalert(user, "Choose your screentip preference", "Screentipping?", "Yes", "Context Only", "No")
+ switch(choice)
+ if("Yes")
+ screentip_pref = SCREENTIP_PREFERENCE_ENABLED
+ if("Context Only")
+ screentip_pref = SCREENTIP_PREFERENCE_CONTEXT_ONLY
+ else
+ screentip_pref = SCREENTIP_PREFERENCE_DISABLED
if("screentip_color")
var/pickedScreentipColor = input(user, "Choose your screentip color.", "General Preference", screentip_color) as color|null
if(pickedScreentipColor)
@@ -3732,6 +3800,17 @@ GLOBAL_LIST_EMPTY(preferences_datums)
to_chat(usr, span_notice("Keep in mind that the photo will be downsized to 250x250 pixels, so the more square the photo, the better it will look."))
features["headshot_link"] = usr_input
+ if("character_preview")
+ preview_pref = href_list["tab"]
+
+ if("character_tab")
+ if(href_list["tab"])
+ character_settings_tab = text2num(href_list["tab"])
+
+ if("preferences_tab")
+ if(href_list["tab"])
+ preferences_tab = text2num(href_list["tab"])
+
if(href_list["preference"] == "gear")
if(href_list["clear_loadout"])
loadout_data["SAVE_[loadout_slot]"] = list()
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 4754a87e3cd8..c265604f8169 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -5,7 +5,7 @@
// You do not need to raise this if you are adding new values that have sane defaults.
// Only raise this value when changing the meaning/format/name/layout of an existing value
// where you would want the updater procs below to run
-#define SAVEFILE_VERSION_MAX 56
+#define SAVEFILE_VERSION_MAX 57
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
@@ -56,6 +56,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
be_special -= "NO_ANTAGS"
for(var/be_special_type in be_special)
be_special[be_special_type] = 1
+ if(current_version < 57)
+ if(screentip_pref)
+ screentip_pref = SCREENTIP_PREFERENCE_ENABLED
+ else
+ // Let's give it a little chance okay, change if you don't like still.
+ screentip_pref = SCREENTIP_PREFERENCE_CONTEXT_ONLY
/datum/preferences/proc/update_character(current_version, savefile/S)
if(current_version < 19)
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index 1cd09097f418..598136acfb55 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -361,7 +361,7 @@
head = /obj/item/clothing/head/helmet/space/plasmaman
uniform = /obj/item/clothing/under/plasmaman
- r_hand= /obj/item/tank/internals/plasmaman/belt/full
+ r_hand = /obj/item/tank/internals/plasmaman/belt/full
mask = /obj/item/clothing/mask/breath
/datum/outfit/death_commando
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index 1b8b4d9e002e..011f64d3ec2a 100644
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -7,7 +7,8 @@
//
icon_state = "plasma"
item_state = "" //no inhands
- slot_flags = 0
+ slot_flags = ITEM_SLOT_ACCESSORY
+ slot_equipment_priority = list(ITEM_SLOT_ACCESSORY)
w_class = WEIGHT_CLASS_SMALL
var/above_suit = FALSE
var/minimize_when_attached = TRUE // TRUE if shown as a small icon in corner, FALSE if overlayed
diff --git a/code/modules/events/shuttle_catastrophe.dm b/code/modules/events/shuttle_catastrophe.dm
index 2e431a8a3470..18b9dc61cabf 100644
--- a/code/modules/events/shuttle_catastrophe.dm
+++ b/code/modules/events/shuttle_catastrophe.dm
@@ -9,6 +9,8 @@
/datum/round_event_control/shuttle_catastrophe/canSpawnEvent(players, gamemode)
if(SSshuttle.emergency.name == "Build your own shuttle kit")
return FALSE //don't undo manual player engineering, it also would unload people and ghost them, there's just a lot of problems
+ if(SSshuttle.emergency.in_flight())
+ return FALSE //ditto, problems
return ..()
diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm
index 155efcd7dca4..52ed3eca5e4c 100644
--- a/code/modules/jobs/access.dm
+++ b/code/modules/jobs/access.dm
@@ -366,7 +366,7 @@
"Research Director", "Scientist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician", "Peacekeeper", "Prisoner")
/proc/get_all_job_icons() //For all existing HUD icons
- return get_all_jobs() + list("Prisoner")
+ return get_all_jobs()
/proc/get_all_centcom_jobs()
return list("VIP Guest","Custodian","Thunderdome Overseer","CentCom Official","Medical Officer","Death Commando","Research Officer","Special Ops Officer","Admiral","CentCom Commander","Emergency Response Team Commander","Security Response Officer","Engineer Response Officer", "Medical Response Officer","CentCom Bartender","Nuclear Waste Expert") //No idea how to modularly edit a global proc
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index 7a5ffbbbae68..ce8c54a68512 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -309,12 +309,13 @@
C.assignment = J.title
//End of skyrat change
C.update_label()
- for(var/A in SSeconomy.bank_accounts)
- var/datum/bank_account/B = A
- if(B.account_id == H.account_id)
- C.registered_account = B
- B.bank_cards += C
- break
+ if(J.title != "Stowaway")
+ for(var/A in SSeconomy.bank_accounts)
+ var/datum/bank_account/B = A
+ if(B.account_id == H.account_id)
+ C.registered_account = B
+ B.bank_cards += C
+ break
H.sec_hud_set_ID()
var/obj/item/pda/PDA = H.get_item_by_slot(pda_slot)
diff --git a/code/modules/jobs/jobs.dm b/code/modules/jobs/jobs.dm
index c351cd25c6e8..e7674c7a2b2f 100644
--- a/code/modules/jobs/jobs.dm
+++ b/code/modules/jobs/jobs.dm
@@ -47,7 +47,8 @@ GLOBAL_LIST_INIT(civilian_positions, list(
"Clown",
"Mime",
"Prisoner",
- "Assistant"))
+ "Assistant",
+ "Stowaway"))
GLOBAL_LIST_INIT(security_positions, list(
"Head of Security",
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index 378313311e83..ea5223975443 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -30,7 +30,6 @@
age = rand(AGE_MIN,AGE_MAX)
/datum/preferences/proc/update_preview_icon(current_tab)
- var/equip_job = (current_tab != APPEARANCE_TAB)
// Determine what job is marked as 'High' priority, and dress them up as such.
var/datum/job/previewJob = get_highest_job()
@@ -49,13 +48,14 @@
mannequin.add_overlay(mutable_appearance('modular_citadel/icons/ui/backgrounds.dmi', bgstate, layer = SPACE_LAYER))
copy_to(mannequin, initial_spawn = TRUE)
- if(current_tab == LOADOUT_TAB)
- //give it its loadout if not on the appearance tab
- SSjob.equip_loadout(parent.mob, mannequin, FALSE, bypass_prereqs = TRUE, can_drop = FALSE)
- else
- if(previewJob && equip_job)
- mannequin.job = previewJob.title
- previewJob.equip(mannequin, TRUE, preference_source = parent)
+ switch(preview_pref)
+ if(PREVIEW_PREF_JOB)
+ if(previewJob)
+ mannequin.job = previewJob.title
+ previewJob.equip(mannequin, TRUE, preference_source = parent)
+ if(PREVIEW_PREF_LOADOUT)
+ SSjob.equip_loadout(parent.mob, mannequin, bypass_prereqs = TRUE, can_drop = FALSE)
+ SSjob.post_equip_loadout(parent.mob, mannequin, bypass_prereqs = TRUE, can_drop = FALSE)
mannequin.regenerate_icons()
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 20bcf4b70da5..c5c135f8a513 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -8,6 +8,7 @@
GLOB.carbon_list += src
blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio)
add_movespeed_modifier(/datum/movespeed_modifier/carbon_crawling)
+ register_context()
/mob/living/carbon/Destroy()
//This must be done first, so the mob ghosts correctly before DNA etc is nulled
diff --git a/code/modules/mob/living/carbon/carbon_context.dm b/code/modules/mob/living/carbon/carbon_context.dm
new file mode 100644
index 000000000000..e7fc4d11bf93
--- /dev/null
+++ b/code/modules/mob/living/carbon/carbon_context.dm
@@ -0,0 +1,48 @@
+/mob/living/carbon/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+
+ if (!isnull(held_item))
+ return .
+
+ if (!ishuman(user))
+ return .
+
+ var/combat_mode = SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)
+
+ if(user == src)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_HELP, "Check injuries")
+ else if(!lying)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_HELP, "Comfort")
+ else if (health >= 0 && !HAS_TRAIT(src, TRAIT_FAKEDEATH))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_HELP, "Shake")
+ else
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_HELP, "CPR")
+
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_DISARM, "Disarm")
+ if(combat_mode && (src != user))
+ LAZYSET(context[SCREENTIP_CONTEXT_RMB], INTENT_DISARM, "Shove")
+
+ if(src != user)
+ if (pulledby == user)
+ switch (user.grab_state)
+ if (GRAB_PASSIVE)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_GRAB, "Grip")
+ if (GRAB_AGGRESSIVE)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_GRAB, "Choke")
+ if (GRAB_NECK)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_GRAB, "Strangle")
+ else
+ return .
+ else
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_GRAB, "Pull")
+
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_HARM, "Attack")
+
+ // Monkeys cannot be grabbed harder using ctrl-click, don't ask.
+ if((pulledby != user) && (src != user))
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_LMB], INTENT_ANY, "Pull")
+ // Happens on any intent i believe
+ if((user == src) && combat_mode && lying)
+ LAZYSET(context[SCREENTIP_CONTEXT_RMB], INTENT_ANY, "Force to get up")
+
+ return CONTEXTUAL_SCREENTIP_SET
diff --git a/code/modules/mob/living/carbon/human/human_context.dm b/code/modules/mob/living/carbon/human/human_context.dm
new file mode 100644
index 000000000000..5229fba3ea0d
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/human_context.dm
@@ -0,0 +1,36 @@
+/mob/living/carbon/human/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+
+ if (!ishuman(user))
+ return .
+
+ var/aim_for_mouth = user.zone_selected == "mouth"
+ var/target_on_help = a_intent == INTENT_HELP
+ var/target_aiming_for_mouth = zone_selected == "mouth"
+ var/target_restrained = restrained()
+ var/same_dir = (dir & user.dir)
+ var/aim_for_groin = user.zone_selected == "groin"
+ var/target_aiming_for_groin = zone_selected == "groin"
+
+ if(aim_for_mouth && (target_on_help || target_restrained || target_aiming_for_mouth))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_DISARM, "Slap face")
+
+ else if(aim_for_groin && (src == user || lying || same_dir) && (target_on_help || target_restrained || target_aiming_for_groin))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_DISARM, "Slap ass")
+
+ // Humans can actually be upgrade grabbed using ctrl-click
+ if(src != user)
+ if (pulledby == user)
+ switch (user.grab_state)
+ if (GRAB_PASSIVE)
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_LMB], INTENT_ANY, "Grip")
+ if (GRAB_AGGRESSIVE)
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_LMB], INTENT_ANY, "Choke")
+ if (GRAB_NECK)
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_LMB], INTENT_ANY, "Strangle")
+ else
+ return .
+ else
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_LMB], INTENT_ANY, "Pull")
+
+ return CONTEXTUAL_SCREENTIP_SET
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index ca5f6b135b3c..e5cab7a6f557 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -190,6 +190,10 @@
if(ITEM_SLOT_SUITSTORE)
s_store = I
update_inv_s_store()
+ if(ITEM_SLOT_ACCESSORY)
+ var/obj/item/clothing/under/attach_target = w_uniform
+ attach_target.attach_accessory(I, src, TRUE)
+ // updates handled by attach_accessory
else
to_chat(src, "You are trying to equip this item to an unsupported inventory slot. Report this to a coder! ")
not_handled = TRUE
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 6052229e35fa..0c30c42a6552 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1523,6 +1523,39 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(SEND_SIGNAL(H.back, COMSIG_TRY_STORAGE_CAN_INSERT, I, H, TRUE))
return TRUE
return FALSE
+ if(ITEM_SLOT_ACCESSORY)
+ if(istype(I, /obj/item/clothing/accessory/ring))
+ if(istype(H.gloves))
+ var/obj/item/clothing/gloves/attaching_target = H.gloves
+ if(length(attaching_target.attached_accessories) > attaching_target.max_accessories)
+ if(return_warning)
+ return_warning[1] = "\The [attaching_target] is at maximum capacity!"
+ return FALSE
+ if(attaching_target.dummy_thick)
+ if(return_warning)
+ return_warning[1] = "\The [attaching_target] are too bulky and cannot have accessories attached to it!"
+ return FALSE
+ else
+ return TRUE
+ else if(return_warning)
+ return_warning[1] = "\The [H.w_uniform] cannot have any attachments."
+ return FALSE
+ else
+ if(istype(H.w_uniform, /obj/item/clothing/under))
+ var/obj/item/clothing/under/attaching_target = H.w_uniform
+ if(length(attaching_target.attached_accessories) > attaching_target.max_accessories)
+ if(return_warning)
+ return_warning[1] = "\The [attaching_target] is at maximum capacity!"
+ return FALSE
+ if(attaching_target.dummy_thick)
+ if(return_warning)
+ return_warning[1] = "\The [attaching_target] is too bulky and cannot have accessories attached to it!"
+ return FALSE
+ else
+ return TRUE
+ else if(return_warning)
+ return_warning[1] = "\The [H.w_uniform] cannot have any attachments."
+ return FALSE
return FALSE //Unsupported slot
/datum/species/proc/equip_delay_self_check(obj/item/I, mob/living/carbon/human/H, bypass_equip_delay_self)
diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm
index 18e717191e03..cfeae5730b0c 100644
--- a/code/modules/modular_computers/file_system/programs/card.dm
+++ b/code/modules/modular_computers/file_system/programs/card.dm
@@ -167,7 +167,8 @@
if(!computer || !authenticated)
return
if(minor)
- if(!(target_id_card.assignment in head_subordinates) && target_id_card.assignment != "Assistant")
+ var/assign = GetJobName(target_id_card)
+ if(!(assign in head_subordinates) && assign != "Assistant")
return
target_id_card.access -= get_all_centcom_access() + get_all_accesses()
diff --git a/code/modules/modular_computers/file_system/programs/jobmanagement.dm b/code/modules/modular_computers/file_system/programs/jobmanagement.dm
index 29f9a37433a4..b849df2fc87e 100644
--- a/code/modules/modular_computers/file_system/programs/jobmanagement.dm
+++ b/code/modules/modular_computers/file_system/programs/jobmanagement.dm
@@ -19,6 +19,7 @@
"AI",
"Assistant",
"Prisoner",
+ "Stowaway",
"Cyborg",
"Captain",
"Head of Personnel",
diff --git a/code/modules/photography/_pictures.dm b/code/modules/photography/_pictures.dm
index 6f85cdb3a617..dace901ceaa6 100644
--- a/code/modules/photography/_pictures.dm
+++ b/code/modules/photography/_pictures.dm
@@ -76,7 +76,7 @@
/proc/load_photo_from_disk(id, location)
var/datum/picture/P = load_picture_from_disk(id)
if(istype(P))
- var/obj/item/photo/p = new(location, P)
+ var/obj/item/photo/old/p = new(location, P)
return p
/proc/load_picture_from_disk(id)
diff --git a/code/modules/photography/photos/album.dm b/code/modules/photography/photos/album.dm
index 6f35e7a99d1d..48a920355365 100644
--- a/code/modules/photography/photos/album.dm
+++ b/code/modules/photography/photos/album.dm
@@ -48,7 +48,7 @@
for(var/i in ids)
if(i in current_ids)
continue
- var/obj/item/photo/P = load_photo_from_disk(i)
+ var/obj/item/photo/old/P = load_photo_from_disk(i)
if(istype(P))
if(!SEND_SIGNAL(src, COMSIG_TRY_STORAGE_INSERT, P, null, TRUE, TRUE))
qdel(P)
diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm
index 4000bf843cdb..45aa4aeb79ef 100644
--- a/code/modules/photography/photos/frame.dm
+++ b/code/modules/photography/photos/frame.dm
@@ -98,7 +98,7 @@
load_from_id(data[persistence_id])
/obj/structure/sign/picture_frame/proc/load_from_id(id)
- var/obj/item/photo/P = load_photo_from_disk(id)
+ var/obj/item/photo/old/P = load_photo_from_disk(id)
if(istype(P))
if(istype(framed))
framed.forceMove(drop_location())
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm
index 1b1c710e8c38..0ac303a3a083 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm
@@ -92,6 +92,11 @@
category = list("initial","Tools","Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SERVICE
+/datum/design/airlock_painter/decal/tile
+ name = "Tile Sprayer"
+ id = "tile_sprayer"
+ build_path = /obj/item/airlock_painter/decal/tile
+
/datum/design/cultivator
name = "Cultivator"
id = "cultivator"
diff --git a/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo.dm b/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo.dm
index ea8e59a6b3d1..f2514b6f9c98 100644
--- a/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo.dm
+++ b/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo.dm
@@ -17,7 +17,15 @@
build_path = /obj/item/circuitboard/computer/cargo/request
category = list("Computer Boards")
departmental_flags = DEPARTMENTAL_FLAG_CARGO
-
+
+/datum/design/board/bounty
+ name = "Computer Design (Bounty Console)"
+ desc = "Allows for the construction of circuit boards used to build a Bounty Console."
+ id = "bounty"
+ build_path = /obj/item/circuitboard/computer/bounty
+ category = list("Computer Boards")
+ departmental_flags = DEPARTMENTAL_FLAG_CARGO
+
/datum/design/board/mining
name = "Computer Design (Outpost Status Display)"
desc = "Allows for the construction of circuit boards used to build an outpost status display console."
diff --git a/code/modules/research/techweb/nodes/tools_nodes.dm b/code/modules/research/techweb/nodes/tools_nodes.dm
index 86a48ab8de90..004795113bbc 100644
--- a/code/modules/research/techweb/nodes/tools_nodes.dm
+++ b/code/modules/research/techweb/nodes/tools_nodes.dm
@@ -5,7 +5,7 @@
display_name = "Basic Tools"
description = "Basic mechanical, electronic, surgical and botanical tools."
prereq_ids = list("base")
- design_ids = list("screwdriver", "wrench", "wirecutters", "crowbar", "multitool", "welding_tool", "tscanner", "analyzer", "cable_coil", "pipe_painter", "airlock_painter", "decal_painter", "scalpel", "circular_saw", "surgicaldrill", "retractor", "cautery", "hemostat", "cultivator", "plant_analyzer", "shovel", "spade", "hatchet", "mop", "broom", "normtrash", "spraycan")
+ design_ids = list("screwdriver", "wrench", "wirecutters", "crowbar", "multitool", "welding_tool", "tscanner", "analyzer", "cable_coil", "pipe_painter", "airlock_painter", "decal_painter", "tile_sprayer", "scalpel", "circular_saw", "surgicaldrill", "retractor", "cautery", "hemostat", "cultivator", "plant_analyzer", "shovel", "spade", "hatchet", "mop", "broom", "normtrash", "spraycan")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500)
/datum/techweb_node/basic_mining
diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm
index 99aaa8d8ec56..f350dd507e22 100644
--- a/code/modules/surgery/bodyparts/helpers.dm
+++ b/code/modules/surgery/bodyparts/helpers.dm
@@ -3,6 +3,8 @@
return
/mob/living/carbon/get_bodypart(zone)
+ RETURN_TYPE(/obj/item/bodypart)
+
if(!zone)
zone = BODY_ZONE_CHEST
for(var/X in bodyparts)
diff --git a/config/config.txt b/config/config.txt
index cda573d11d8a..f9a588e63ad0 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -53,3 +53,4 @@ $include splurt/maps.txt
$include splurt/server.txt
$include splurt/connections.txt
$include splurt/donator.txt
+$include splurt/autocryo.txt
diff --git a/config/sandstorm/balance.txt b/config/sandstorm/balance.txt
index 1268cb190421..bc10b7a47131 100644
--- a/config/sandstorm/balance.txt
+++ b/config/sandstorm/balance.txt
@@ -57,3 +57,36 @@ BLUESPACEMINER_MULT_OUTPUT 1
## What is the minimum stock part tier to produce bluespace crystals?
BLUESPACEMINER_CRYSTAL_TIER 5
+
+###
+## TETRIS
+###
+
+## The machine produces science points based on score
+## Uncomment this to prevent it from doing so
+#TETRIS_NO_SCIENCE
+
+## How many prizes can the machine dispense
+## This is also limited by TETRIS_SCORE_MAX
+TETRIS_PRIZES_MAX 5
+
+## How many points required per prize vended
+## Amount is equal to SCORE divided by TETRIS_REWARD_DIVISOR
+TETRIS_REWARD_DIVISOR 1000
+
+## Minimum score required to message admins
+## This is intended for detecting suspicious scores
+TETRIS_SCORE_HIGH 10000
+
+## Maximum score that can be displayed
+## Score values past this number are ignored
+TETRIS_SCORE_MAX 100000
+
+## Maximum research points that can be generated
+## Score values past this number are ignored
+TETRIS_SCORE_MAX_SCI 10000
+
+## Minimum time between giving rewards
+## This applies to both prizes and research points
+## Time is measured in ticks
+TETRIS_TIME_COOLDOWN 600
diff --git a/config/splurt/autocryo.txt b/config/splurt/autocryo.txt
new file mode 100644
index 000000000000..bae707e02110
--- /dev/null
+++ b/config/splurt/autocryo.txt
@@ -0,0 +1,5 @@
+## Uncomment to enable automatic SSD cryo
+# AUTOCRYO_ENABLED
+
+## Time in seconds before sending SSD users to cryo
+AUTOCRYO_TIME_TRIGGER 24000
diff --git a/config/splurt/general.txt b/config/splurt/general.txt
index dcc4de101d4d..6eed64353545 100644
--- a/config/splurt/general.txt
+++ b/config/splurt/general.txt
@@ -9,3 +9,8 @@ MAX_INFINIDORMS 5
# Weighted station traits
# If uncommented, the server will pick random station traits according to their weight configuration
WEIGHTED_STATION_TRAITS
+
+# Base amount of max save slots
+# Amount of character slots that players will have without modifiers being applied
+# default is 24
+#BASE_SAVE_SLOTS 24
diff --git a/html/changelogs/archive/2023-02.yml b/html/changelogs/archive/2023-02.yml
index f105d2f39c6f..c4252dd18f19 100644
--- a/html/changelogs/archive/2023-02.yml
+++ b/html/changelogs/archive/2023-02.yml
@@ -21,3 +21,93 @@
LeDrascol:
- rscadd: Added variant of Subtle verb with typing indicator
- tweak: Default binding for Subtle is now Control-5
+2023-02-07:
+ LeDrascol:
+ - tweak: Added gain, lose, and medical text to werewolf quirk
+ - tweak: Updated werewolf ability tooltip
+ - tweak: Changed body part sprites used for werewolf
+ - tweak: Werewolves cannot transform while asleep, restrained, or stunned
+ - tweak: Werewolf transformation now has a five second cooldown
+ - tweak: Werewolf species name prefix is now based on gender
+ - tweak: Werewolves can be slime and jelly entities
+ - tweak: Werewolves will gain an appropriate taur body if the owner had one
+ - bugfix: Werewolves cannot transform while dead
+ - bugfix: Werewolf transformation organ bug fixed for some species
+ - bugfix: Werewolf old species attributes are no longer lost on action removal
+ - bugfix: Werewolves custom species name properly applies
+ - bugfix: Werewolves will regain exotic eye types
+ - code_imp: Added a werewolf quirk trait
+ - refactor: Updated werewolf quirk variable names
+ - tweak: Added Bluespace Light Replacer to the Science protolathe
+ The-Real-Goku:
+ - rscadd: Added persistent photo album.
+ - rscadd: Added custom name for player album. ([Player name]'s album)
+ - rscadd: Added specific names for the photo albums located in the Heads of Departments'
+ lockers. (Ex. Captain, HoP...)
+ - bugfix: Fixed in-hand sprite for Photo Album. (They looked like briefcases before).
+ zeroisthebiggay:
+ - bugfix: ai research
+2023-02-09:
+ BongaTheProto:
+ - rscadd: New tail, Snake Tail (Large)
+ - tweak: Now the max amount of character slots can be configured, and donators get
+ more slots
+ - bugfix: Photographer quirk will no longer fuck over your neck loadout items
+ Comicao1:
+ - rscadd: Added a few icons and code. Not modularized because it's not possible.
+ - rscadd: Adds the inflate verb.
+2023-02-10:
+ Comicao1:
+ - rscadd: Beach ball may be inserted a vibrator in it.
+ - rscadd: Syndicate beach ball also might be bought in the traitor's uplink.
+2023-02-11:
+ SandPoot:
+ - refactor: Interaction menu is no longer stored in your mind, and should clear
+ references and all properly when deleting.
+ WoolyAypa:
+ - rscadd: Added a new polychromic Princess Leia outfits to the ClothesMate (and
+ loadout)
+ - rscadd: Added a polychromic version of the "Performers one piece" to the ClothesMate
+ (and loadout)
+ - rscadd: Added high-heel sandals to the KinkMate (and loadout)
+2023-02-12:
+ BongaTheProto:
+ - bugfix: snake tail (large) is now available for humans and lizards too
+ WoolyAypa:
+ - bugfix: Space princess outfit now can be used along with digitigrade legs
+ - rscadd: Added some of the old dullahan stuff to the new one
+ - bugfix: Fixed the overlay glitches with the new dullahan quirk
+ - bugfix: Space princess outfit and the polychromic performers one piece can now
+ be colored in the loadout
+2023-02-13:
+ Neyusha:
+ - rscadd: Added stowaway role
+2023-02-14:
+ LeDrascol:
+ - tweak: SSD players are automatically sent to cryo after 40 minutes
+ - code_imp: Reverted non-modular SPLURT edits to TETRIS
+ - balance: T.E.T.R.I.S. arcade machine now generates research points if used by
+ scientists
+ - balance: T.E.T.R.I.S. machine maximum score, prize count, and points payout are
+ now limited
+ - balance: T.E.T.R.I.S. machine can only dispense rewards once per configured time
+ threshold
+ - server: Added configuration settings for the T.E.T.R.I.S. arcade machine
+2023-02-16:
+ Zattarra:
+ - rscadd: Added the shortcrop, longcrop, and formalcrop.
+ - rscadd: Added croptops to loadout.
+ - rscadd: Added croptops to clothesmate.
+ - imageadd: Gave the croptops sprites.
+2023-02-17:
+ LeDrascol:
+ - tweak: Hexacamphor overdose will remove the In Estrous quirk
+2023-02-18:
+ KeplerWasTaken:
+ - rscadd: A new drink, the Ion Storm, made with 5 parts quadruple sec, 2 parts bastion
+ bourbon, resulting in 10 units.
+ LeDrascol:
+ - rscdel: Removed techweb entry for Infective Exo-Locomotion nanites
+2023-02-20:
+ LeDrascol:
+ - refactor: Refactored trait defines
diff --git a/icons/effects/random_spawners.dmi b/icons/effects/random_spawners.dmi
new file mode 100644
index 000000000000..144287ced02d
Binary files /dev/null and b/icons/effects/random_spawners.dmi differ
diff --git a/icons/emoji_32.dmi b/icons/emoji_32.dmi
index d976daa3668c..1a0684c2fddd 100644
Binary files a/icons/emoji_32.dmi and b/icons/emoji_32.dmi differ
diff --git a/icons/mob/augmentation/cosmetic_prosthetic/veymed.dmi b/icons/mob/augmentation/cosmetic_prosthetic/veymed.dmi
new file mode 100644
index 000000000000..aaf11cfd9f58
Binary files /dev/null and b/icons/mob/augmentation/cosmetic_prosthetic/veymed.dmi differ
diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi
index 9746e61a3d32..f7062b9f4ec2 100644
Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index d0ebbb450113..b694d0ba35ec 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 0d87e7871cd6..3836f4c713aa 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 95a04717e951..73ba2fcdb0b5 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/turf/decals.dmi b/icons/turf/decals.dmi
index 4ed8c8db9a7c..6b42ad12c796 100644
Binary files a/icons/turf/decals.dmi and b/icons/turf/decals.dmi differ
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index 4c092368727b..197f08835653 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -54,9 +54,10 @@
/datum/gear/donator/kiaramedal
name = "Insignia of Steele"
- slot = ITEM_SLOT_BACKPACK
+ slot = ITEM_SLOT_ACCESSORY
path = /obj/item/clothing/accessory/medal/steele
ckeywhitelist = list("inferno707")
+ handle_post_equip = TRUE
/datum/gear/donator/hheart
name = "The Hollow Heart"
diff --git a/modular_citadel/code/modules/client/loadout/_loadout.dm b/modular_citadel/code/modules/client/loadout/_loadout.dm
index 5f895c4805fb..f33beecb327a 100644
--- a/modular_citadel/code/modules/client/loadout/_loadout.dm
+++ b/modular_citadel/code/modules/client/loadout/_loadout.dm
@@ -55,6 +55,7 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids)
var/geargroupID //defines the ID that the gear inherits from the config
var/loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION
var/list/loadout_initial_colors = list()
+ var/handle_post_equip = FALSE
//NEW DONATOR SYTSEM STUFF
var/donoritem //autoset on new if null
diff --git a/modular_citadel/code/modules/client/loadout/_service.dm b/modular_citadel/code/modules/client/loadout/_service.dm
index 848ad6233c8b..4f96b36e2e0b 100644
--- a/modular_citadel/code/modules/client/loadout/_service.dm
+++ b/modular_citadel/code/modules/client/loadout/_service.dm
@@ -2,20 +2,20 @@
name = "Staff Assistant's jumpsuit"
path = /obj/item/clothing/under/misc/staffassistant
subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS
- restricted_roles = list("Assistant")
+ restricted_roles = list("Assistant", "Stowaway")
/datum/gear/suit/neetsuit
name = "D.A.B. suit"
path = /obj/item/clothing/suit/assu_suit
subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS
- restricted_roles = list("Assistant")
+ restricted_roles = list("Assistant", "Stowaway")
cost = 2
/datum/gear/head/neethelm
name = "D.A.B. helmet"
path = /obj/item/clothing/head/assu_helmet
subcategory = LOADOUT_SUBCATEGORY_HEAD_JOBS
- restricted_roles = list("Assistant")
+ restricted_roles = list("Assistant", "Stowaway")
cost = 2
/datum/gear/backpack/plushvar
diff --git a/modular_citadel/code/modules/client/loadout/accessory.dm b/modular_citadel/code/modules/client/loadout/accessory.dm
new file mode 100644
index 000000000000..55cce181a5b7
--- /dev/null
+++ b/modular_citadel/code/modules/client/loadout/accessory.dm
@@ -0,0 +1,20 @@
+/datum/gear/accessory
+ category = LOADOUT_CATEGORY_ACCESSORY
+ slot = ITEM_SLOT_ACCESSORY
+ handle_post_equip = TRUE
+
+/datum/gear/accessory/necklace
+ name = "A renameable necklace"
+ path = /obj/item/clothing/accessory/necklace
+
+/datum/gear/accessory/polymaidapron
+ name = "Polychromic maid apron"
+ path = /obj/item/clothing/accessory/maidapron/polychromic
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_initial_colors = list("#333333", "#FFFFFF")
+
+/datum/gear/accessory/pridepin
+ name = "Pride pin"
+ path = /obj/item/clothing/accessory/pride
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION
+ cost = 0
diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm
index a0be000b3150..24545e7b4c30 100644
--- a/modular_citadel/code/modules/client/loadout/backpack.dm
+++ b/modular_citadel/code/modules/client/loadout/backpack.dm
@@ -2,6 +2,7 @@
category = LOADOUT_CATEGORY_BACKPACK
subcategory = LOADOUT_SUBCATEGORY_BACKPACK_GENERAL
slot = ITEM_SLOT_BACKPACK
+ handle_post_equip = TRUE
/datum/gear/backpack/plushbox
name = "Plushie Choice Box"
@@ -172,25 +173,6 @@
path = /obj/item/storage/fancy/ringbox/diamond
cost = 5
-/datum/gear/backpack/necklace //this is here because loadout doesn't support proper accessories
- name = "A renameable necklace"
- path = /obj/item/clothing/accessory/necklace
- subcategory = LOADOUT_SUBCATEGORY_BACKPACK_ACCESSORIES
-
-/datum/gear/backpack/polymaidapron //this is ALSO here because loadout doesn't support proper accessories
- name = "Polychromic maid apron"
- path = /obj/item/clothing/accessory/maidapron/polychromic
- loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
- loadout_initial_colors = list("#333333", "#FFFFFF")
- subcategory = LOADOUT_SUBCATEGORY_BACKPACK_ACCESSORIES
-
-/datum/gear/backpack/pridepin //what the two comments above said
- name = "Pride pin"
- path = /obj/item/clothing/accessory/pride
- loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION
- subcategory = LOADOUT_SUBCATEGORY_BACKPACK_ACCESSORIES
- cost = 0
-
// Moved here from quirks
/datum/gear/backpack/dyespray
name = "Hair dye spray"
diff --git a/modular_citadel/code/modules/client/loadout/head.dm b/modular_citadel/code/modules/client/loadout/head.dm
index 58dd6e9fc3b9..fdaee6f309e6 100644
--- a/modular_citadel/code/modules/client/loadout/head.dm
+++ b/modular_citadel/code/modules/client/loadout/head.dm
@@ -157,7 +157,7 @@
description = "A visored cap. Intended to be used with ORV uniform."
path = /obj/item/clothing/head/kepi/orvi
subcategory = LOADOUT_SUBCATEGORY_HEAD_JOBS
- restricted_roles = list("Assistant")
+ restricted_roles = list("Assistant", "Stowaway")
/*Commenting out Until next Christmas or made automatic
/datum/gear/santahatr
diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm
index 5c22485c1f05..280f6a248510 100644
--- a/modular_citadel/code/modules/client/loadout/uniform.dm
+++ b/modular_citadel/code/modules/client/loadout/uniform.dm
@@ -623,7 +623,7 @@
name = "ORV uniform, assistant"
path = /obj/item/clothing/under/trek/orv
subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS
- restricted_roles = list("Assistant")
+ restricted_roles = list("Assistant", "Stowaway")
/datum/gear/uniform/orvsrv
name = "ORV uniform, other"
diff --git a/modular_sand/code/_globalvars/bitfields.dm b/modular_sand/code/_globalvars/bitfields.dm
index c149e1c11e41..7a2bb8d87d5d 100644
--- a/modular_sand/code/_globalvars/bitfields.dm
+++ b/modular_sand/code/_globalvars/bitfields.dm
@@ -25,6 +25,7 @@ DEFINE_BITFIELD(flags_inv, list(
))
DEFINE_BITFIELD(slot_flags, list(
+ "ITEM_SLOT_ACCESSORY" = ITEM_SLOT_ACCESSORY,
"ITEM_SLOT_BACK" = ITEM_SLOT_BACK,
"ITEM_SLOT_BACKPACK" = ITEM_SLOT_BACKPACK,
"ITEM_SLOT_BELT" = ITEM_SLOT_BELT,
diff --git a/modular_sand/code/controllers/configuration/entries/sandstorm_balance.dm b/modular_sand/code/controllers/configuration/entries/sandstorm_balance.dm
index f739dec7b156..8d738c425a60 100644
--- a/modular_sand/code/controllers/configuration/entries/sandstorm_balance.dm
+++ b/modular_sand/code/controllers/configuration/entries/sandstorm_balance.dm
@@ -64,3 +64,31 @@
// BSM minimum tier for bluespace crystals
/datum/config_entry/number/bluespaceminer_crystal_tier
config_entry_value = 5
+
+/// TETRIS ARCADE MACHINE ///
+// If the machine should skip producing science points
+/datum/config_entry/flag/tetris_no_science
+
+// Points required per prize vended
+/datum/config_entry/number/tetris_reward_divisor
+ config_entry_value = 1000
+
+// Points required per prize vended
+/datum/config_entry/number/tetris_prizes_max
+ config_entry_value = 5
+
+// Minimum score required to message admins
+/datum/config_entry/number/tetris_score_high
+ config_entry_value = 10000
+
+// Maximum research points that can be generated
+/datum/config_entry/number/tetris_score_max
+ config_entry_value = 100000
+
+// Maximum research points that can be generated
+/datum/config_entry/number/tetris_score_max_sci
+ config_entry_value = 10000
+
+// Minimum time between giving rewards
+/datum/config_entry/number/tetris_time_cooldown
+ config_entry_value = 600
diff --git a/modular_sand/code/controllers/subsystem/interactions.dm b/modular_sand/code/controllers/subsystem/interactions.dm
index f4a1a08c5e0e..dee26167c31f 100644
--- a/modular_sand/code/controllers/subsystem/interactions.dm
+++ b/modular_sand/code/controllers/subsystem/interactions.dm
@@ -4,6 +4,9 @@ SUBSYSTEM_DEF(interactions)
init_order = INIT_ORDER_INTERACTIONS
var/list/interactions
VAR_PROTECTED/list/blacklisted_mobs = list(
+ /mob/dead,
+ /mob/dview,
+ /mob/camera, // Although it would be funny to fuck the sentient disease or AI hologram
/mob/living/simple_animal/pet,
/mob/living/simple_animal/cockroach,
/mob/living/simple_animal/babyKiwi,
diff --git a/modular_sand/code/datums/interactions/interaction_interface.dm b/modular_sand/code/datums/components/interaction_menu_granter.dm
similarity index 81%
rename from modular_sand/code/datums/interactions/interaction_interface.dm
rename to modular_sand/code/datums/components/interaction_menu_granter.dm
index 2d7f79413289..c985ff2e9cd5 100644
--- a/modular_sand/code/datums/interactions/interaction_interface.dm
+++ b/modular_sand/code/datums/components/interaction_menu_granter.dm
@@ -1,59 +1,69 @@
/// Attempts to open the tgui menu
-/mob/living/verb/interact_with()
+/mob/verb/interact_with()
set name = "Interact With"
set desc = "Perform an interaction with someone."
set category = "IC"
set src in view(usr.client)
- if(!usr.mind) //Mindless boys, honestly just don't, it's better this way
+ var/datum/component/interaction_menu_granter/menu = usr.GetComponent(/datum/component/interaction_menu_granter)
+ if(!menu)
+ to_chat(usr, span_warning("You must have done something really bad to not have an interaction component."))
return
- if(!usr.mind.interaction_holder)
- usr.mind.interaction_holder = new(usr.mind)
- usr.mind.interaction_holder.target = src
- usr.mind.interaction_holder.ui_interact(usr)
-/*
-/// Allows "cyborg" players to change gender at will
-/mob/living/silicon/robot/verb/toggle_gender()
- set name = "Set Gender"
- set desc = "Allows you to set your gender."
-
- if(stat != CONSCIOUS)
- to_chat(usr, span_warning("You cannot toggle your gender while unconcious!"))
+ if(!src)
+ to_chat(usr, span_warning("Your interaction target is gone!"))
return
-
- var/choice = tgui_alert(usr, "Select Gender.", "Gender", list("Both", "Male", "Female"))
- switch(choice)
- if("Both")
- has_penis = TRUE
- has_vagina = TRUE
- if("Male")
- has_penis = TRUE
- has_vagina = FALSE
- if("Female")
- has_penis = FALSE
- has_vagina = TRUE
-*/
+ menu.open_menu(usr, src)
#define INTERACTION_NORMAL 0
#define INTERACTION_LEWD 1
#define INTERACTION_EXTREME 2
-/datum/mind
- var/datum/interaction_menu/interaction_holder
+/// The menu itself, only var is target which is the mob you are interacting with
+/datum/component/interaction_menu_granter
+ var/mob/living/target
-/datum/mind/New(key)
+/datum/component/interaction_menu_granter/Initialize(...)
+ if(!ismob(parent))
+ return COMPONENT_INCOMPATIBLE
+ var/mob/parent_mob = parent
+ if(!parent_mob.client)
+ return COMPONENT_INCOMPATIBLE
. = ..()
- interaction_holder = new(src)
-/// The menu itself, only var is target which is the mob you are interacting with
-/datum/interaction_menu
- var/mob/living/target
+/datum/component/interaction_menu_granter/RegisterWithParent()
+ . = ..()
+ RegisterSignal(parent, COMSIG_MOB_CTRLSHIFTCLICKON, .proc/open_menu)
+
+/datum/component/interaction_menu_granter/Destroy(force, ...)
+ target = null
+ . = ..()
-/datum/interaction_menu/ui_state(mob/user)
- return GLOB.conscious_state
+/datum/component/interaction_menu_granter/UnregisterFromParent()
+ UnregisterSignal(parent, COMSIG_MOB_CTRLSHIFTCLICKON)
+ . = ..()
+
+/// The one interacting is clicker, the interacted is clicked.
+/datum/component/interaction_menu_granter/proc/open_menu(mob/clicker, mob/clicked)
+ // COMSIG_MOB_CTRLSHIFTCLICKON accepts `atom`s, prevent it
+ if(!istype(clicked))
+ return FALSE
+ // Don't cancel admin quick spawn
+ if(isobserver(clicked) && check_rights_for(clicker.client, R_SPAWN))
+ return FALSE
+ target = clicked
+ ui_interact(clicker)
+ return COMSIG_MOB_CANCEL_CLICKON
+
+/datum/component/interaction_menu_granter/ui_state(mob/user)
+ // Funny admin, don't you dare be the extra funny now.
+ if(user.client.holder && !user.client.holder.deadmined)
+ return GLOB.always_state
+ if(user == parent)
+ return GLOB.conscious_state
+ return GLOB.never_state
-/datum/interaction_menu/ui_interact(mob/user, datum/tgui/ui)
+/datum/component/interaction_menu_granter/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "MobInteraction", "Interactions")
@@ -68,10 +78,10 @@
else
return 0
-/datum/interaction_menu/ui_data(mob/user)
+/datum/component/interaction_menu_granter/ui_data(mob/user)
. = ..()
//Getting player
- var/mob/living/self = user
+ var/mob/living/self = parent
//Getting info
.["isTargetSelf"] = target == self
.["interactingWith"] = target != self ? "Interacting with \the [target]..." : "Interacting with yourself..."
@@ -136,22 +146,22 @@
genital_entry["arousal_state"] = genital.aroused_state
genital_entry["always_accessible"] = genital.always_accessible
genitals += list(genital_entry)
- if(iscarbon(self) && !self.getorganslot(ORGAN_SLOT_ANUS))
- var/simulated_ass = list()
- simulated_ass["name"] = "Anus"
- simulated_ass["key"] = "anus"
- var/visibility = "Invalid"
- switch(self.anus_exposed)
- if(1)
- visibility = "Always visible"
- if(0)
- visibility = "Hidden by underwear"
- else
- visibility = "Always hidden"
- simulated_ass["visibility"] = visibility
- simulated_ass["possible_choices"] = GLOB.genitals_visibility_toggles - GEN_VISIBLE_NO_CLOTHES
- simulated_ass["always_accessible"] = self.anus_always_accessible
- genitals += list(simulated_ass)
+ if(!get_genitals.getorganslot(ORGAN_SLOT_ANUS)) //SPLURT Edit
+ var/simulated_ass = list()
+ simulated_ass["name"] = "Anus"
+ simulated_ass["key"] = "anus"
+ var/visibility = "Invalid"
+ switch(get_genitals.anus_exposed)
+ if(1)
+ visibility = "Always visible"
+ if(0)
+ visibility = "Hidden by underwear"
+ else
+ visibility = "Always hidden"
+ simulated_ass["visibility"] = visibility
+ simulated_ass["possible_choices"] = GLOB.genitals_visibility_toggles - GEN_VISIBLE_NO_CLOTHES
+ simulated_ass["always_accessible"] = get_genitals.anus_always_accessible
+ genitals += list(simulated_ass)
.["genitals"] = genitals
//Get their genitals
@@ -227,18 +237,19 @@
else
return "No"
-/datum/interaction_menu/ui_act(action, params)
+/datum/component/interaction_menu_granter/ui_act(action, params)
if(..())
return
+ var/mob/living/parent_mob = parent
switch(action)
if("interact")
var/datum/interaction/o = SSinteractions.interactions[params["interaction"]]
if(o)
- o.do_action(usr, target)
+ o.do_action(parent_mob, target)
return TRUE
return FALSE
if("genital")
- var/mob/living/carbon/self = usr
+ var/mob/living/carbon/self = parent_mob
if("visibility" in params)
if(params["genital"] == "anus")
self.anus_toggle_visibility(params["visibility"])
@@ -301,7 +312,7 @@
return TRUE
return FALSE
if("char_pref")
- var/datum/preferences/prefs = usr.client.prefs
+ var/datum/preferences/prefs = parent_mob.client.prefs
var/value = num_to_pref(params["value"])
switch(params["char_pref"])
if("erp_pref")
@@ -341,7 +352,7 @@
prefs.save_character()
return TRUE
if("pref")
- var/datum/preferences/prefs = usr.client.prefs
+ var/datum/preferences/prefs = parent_mob.client.prefs
switch(params["pref"])
if("verb_consent")
TOGGLE_BITFIELD(prefs.toggles, VERB_CONSENT)
diff --git a/modular_sand/code/datums/elements/holder_micro.dm b/modular_sand/code/datums/elements/holder_micro.dm
index f264ded3b580..0161e9ac902c 100644
--- a/modular_sand/code/datums/elements/holder_micro.dm
+++ b/modular_sand/code/datums/elements/holder_micro.dm
@@ -168,9 +168,12 @@
set category = "IC"
set src in view(usr.client)
- if(!usr.mind) //Mindless boys, honestly just don't, it's better this way
+ var/datum/component/interaction_menu_granter/menu = usr.GetComponent(/datum/component/interaction_menu_granter)
+ if(!menu)
+ to_chat(usr, span_warning("You must have done something really bad to not have an interaction component."))
return
- if(!usr.mind.interaction_holder)
- usr.mind.interaction_holder = new(usr.mind)
- usr.mind.interaction_holder.target = src.held_mob
- usr.mind.interaction_holder.ui_interact(usr)
+
+ if(!src)
+ to_chat(usr, span_warning("Your interaction target is gone!"))
+ return
+ menu.open_menu(usr, src)
diff --git a/modular_sand/code/datums/elements/skirt_peeking.dm b/modular_sand/code/datums/elements/skirt_peeking.dm
index e5be0fc43424..96207fbffaff 100644
--- a/modular_sand/code/datums/elements/skirt_peeking.dm
+++ b/modular_sand/code/datums/elements/skirt_peeking.dm
@@ -29,12 +29,17 @@
// And are you under us while we're standing up?
if(!(CHECK_BITFIELD(living_peeker.mobility_flags, MOBILITY_STAND)) && (CHECK_BITFIELD(peeked.mobility_flags, MOBILITY_STAND)) && (peeked.loc == living_peeker.loc))
return TRUE
+ // Do you happen to be small enough to easily look under us?
+ if(COMPARE_SIZES(peeked, peeker) >= 2)
+ return TRUE
// Or are you nearby and we are up high
// to-do SOMEONE PLEASE PORT /datum/element/climbable
- var/obj/structure/high_ground = locate(/obj/structure) in get_turf(peeked)
- if(high_ground && high_ground.climbable && CHECK_BITFIELD(peeked.mobility_flags, MOBILITY_STAND) && \
- peeked.Adjacent(peeker))
- return TRUE
+ var/obj/structure/high_ground_peeked = locate(/obj/structure) in get_turf(peeked)
+ var/obj/structure/high_ground_peeker = locate(/obj/structure) in get_turf(peeker)
+ if(high_ground_peeked && high_ground_peeked.climbable && CHECK_BITFIELD(peeked.mobility_flags, MOBILITY_STAND) && peeked.Adjacent(peeker))
+ // Funnily enough, if we're at the same height, they can't just peek under us!
+ if(!(high_ground_peeker && high_ground_peeker.climbable))
+ return TRUE
return FALSE
/datum/element/skirt_peeking/proc/on_examine(mob/living/carbon/human/peeked, mob/peeker, list/examine_list)
@@ -99,3 +104,22 @@
string += " on full display."
examine_content += span_purple(string)
+ // Let's see if we caught them, addtimer so it appears after the peek.
+ addtimer(CALLBACK(src, .proc/try_notice, peeked, peeker), 1)
+
+/// Alright, they've peeked us and everything, did we notice it though?
+/datum/element/skirt_peeking/proc/try_notice(mob/living/carbon/human/peeked, mob/living/peeker)
+ if(!peeked || !peeker)
+ return
+ if(!istype(peeked) || !istype(peeker))
+ return
+ var/obj/item/clothing/under/worn_uniform = peeked.get_item_by_slot(ITEM_SLOT_ICLOTHING)
+ if(!istype(worn_uniform))
+ return
+ var/obj/item/clothing/glasses/eye_blocker = peeker.get_item_by_slot(ITEM_SLOT_EYES)
+ if(!(!peeked.client && (peeked.stat == CONSCIOUS) && !HAS_TRAIT(peeked, TRAIT_BLIND) && !is_blind(peeked) && \
+ !peeker.is_eyes_covered(FALSE) && !(eye_blocker && eye_blocker.tint > 0) && \
+ !(peeker.invisibility > peeked.invisibility) && !(peeker.alpha <= 30)))
+ return
+ to_chat(peeked, span_warning("You notice [peeker] looking under your [worn_uniform.name]!"))
+ to_chat(peeker, span_warning("[peeked] notices you peeking under [peeked.p_their()] [worn_uniform.name]!"))
diff --git a/modular_sand/code/datums/interactions/_interaction.dm b/modular_sand/code/datums/interactions/_interaction.dm
index b7077ae80dea..5ba1efe8e84c 100644
--- a/modular_sand/code/datums/interactions/_interaction.dm
+++ b/modular_sand/code/datums/interactions/_interaction.dm
@@ -10,13 +10,15 @@
- Makes all the code good because yes as well - SandPoot
**/
-/mob/living/proc/list_interaction_attributes()
- var/dat = list()
+/mob/proc/list_interaction_attributes()
+ return list()
+
+/mob/living/list_interaction_attributes()
+ . = ..()
if(has_hands())
- dat += "...have hands."
+ . += "...have hands."
if(has_mouth())
- dat += "...have a mouth, which is [mouth_is_free() ? "uncovered" : "covered"]."
- return dat
+ . += "...have a mouth, which is [mouth_is_free() ? "uncovered" : "covered"]."
/// The base of all interactions
/datum/interaction
diff --git a/modular_sand/code/datums/interactions/lewd_interactions.dm b/modular_sand/code/datums/interactions/lewd_interactions.dm
index 2171ec0b7fe8..ccd0708d93be 100644
--- a/modular_sand/code/datums/interactions/lewd_interactions.dm
+++ b/modular_sand/code/datums/interactions/lewd_interactions.dm
@@ -516,18 +516,18 @@
return ..()
/mob/living/list_interaction_attributes(mob/living/LM)
- var/dat = ..()
+ . = ..()
if(!COOLDOWN_FINISHED(LM, refractory_period))
- dat += "...are sexually exhausted for the time being."
+ . += "...are sexually exhausted for the time being."
switch(a_intent)
if(INTENT_HELP)
- dat += "...are acting gentle."
+ . += "...are acting gentle."
if(INTENT_DISARM)
- dat += "...are acting playful."
+ . += "...are acting playful."
if(INTENT_GRAB)
- dat += "...are acting rough."
+ . += "...are acting rough."
if(INTENT_HARM)
- dat += "...are fighting anyone who comes near."
+ . += "...are fighting anyone who comes near."
//Here comes the fucking weird shit.
if(client)
var/client/cli = client
@@ -536,45 +536,44 @@
if(!ucli || (ucli.prefs.extremepref != "No"))
if(!get_item_by_slot(ITEM_SLOT_EARS_LEFT) && !get_item_by_slot(ITEM_SLOT_EARS_RIGHT))
if(has_ears())
- dat += "...have unprotected ears."
+ . += "...have unprotected ears."
else
- dat += "...have a hole where their ears should be."
+ . += "...have a hole where their ears should be."
else
- dat += "...have covered ears."
+ . += "...have covered ears."
if(!get_item_by_slot(ITEM_SLOT_EYES))
if(has_eyes())
- dat += "...have exposed eyes."
+ . += "...have exposed eyes."
else
- dat += "...have exposed eyesockets."
+ . += "...have exposed eyesockets."
else
- dat += "...have covered eyes."
+ . += "...have covered eyes."
//
// check those loops only once, thanks
var/is_topless = is_topless()
var/is_bottomless = is_bottomless()
if(is_topless && is_bottomless)
- dat += "...are naked."
+ . += "...are naked."
else
if((is_topless && !is_bottomless) || (!is_topless && is_bottomless))
- dat += "...are partially clothed."
+ . += "...are partially clothed."
else
- dat += "...are clothed."
+ . += "...are clothed."
if(has_breasts(REQUIRE_EXPOSED))
- dat += "...have breasts."
+ . += "...have breasts."
if(has_penis(REQUIRE_EXPOSED))
- dat += "...have a penis."
+ . += "...have a penis."
if(has_strapon(REQUIRE_EXPOSED))
- dat += "...have a strapon."
+ . += "...have a strapon."
if(has_balls(REQUIRE_EXPOSED))
- dat += "...have a ballsack."
+ . += "...have a ballsack."
if(has_vagina(REQUIRE_EXPOSED))
- dat += "...have a vagina."
+ . += "...have a vagina."
if(has_anus(REQUIRE_EXPOSED))
- dat += "...have an anus."
+ . += "...have an anus."
if(has_feet(REQUIRE_EXPOSED))
switch(has_feet(REQUIRE_EXPOSED))
if(2)
- dat += "...have a pair of feet."
+ . += "...have a pair of feet."
if(1)
- dat += "...have a single foot."
- return dat
+ . += "...have a single foot."
diff --git a/modular_sand/code/game/machinery/computer/arcade/tetris.dm b/modular_sand/code/game/machinery/computer/arcade/tetris.dm
index 1769ebe2aa62..0ddd5be709c9 100644
--- a/modular_sand/code/game/machinery/computer/arcade/tetris.dm
+++ b/modular_sand/code/game/machinery/computer/arcade/tetris.dm
@@ -1,13 +1,20 @@
-#define REWARD_DIVISOR 1000
-// At the end of the game, the thing yields tetris_score/REWARD_DIVISOR prize tickets. Adjust accordingly.
+// Configuration defines
+#define TETRIS_REWARD_DIVISOR CONFIG_GET(number/tetris_reward_divisor)
+#define TETRIS_PRIZES_MAX CONFIG_GET(number/tetris_prizes_max)
+#define TETRIS_SCORE_HIGH CONFIG_GET(number/tetris_score_high)
+#define TETRIS_SCORE_MAX CONFIG_GET(number/tetris_score_max)
+#define TETRIS_SCORE_MAX_SCI CONFIG_GET(number/tetris_score_max_sci)
+#define TETRIS_TIME_COOLDOWN CONFIG_GET(number/tetris_time_cooldown)
+#define TETRIS_NO_SCIENCE CONFIG_GET(flag/tetris_no_science)
+
+// Cooldown defines
+#define TETRIS_COOLDOWN_MAIN cooldown_timer
/obj/machinery/computer/arcade/tetris
name = "T.E.T.R.I.S."
desc = "The pinnacle of human technology."
- icon = 'icons/obj/computer.dmi'
- icon_state = "arcade"
circuit = /obj/item/circuitboard/computer/arcade/tetris
- light_color = LIGHT_COLOR_GREEN
+ COOLDOWN_DECLARE(TETRIS_COOLDOWN_MAIN)
/obj/machinery/computer/arcade/tetris/Topic(href, href_list)
if(..())
@@ -15,13 +22,63 @@
else
usr.set_machine(src)
if(href_list["tetrisScore"])
- var/temp_score = text2num(href_list["tetrisScore"])
- say("YOUR SCORE: [temp_score]!")
- var/reward = round(temp_score/REWARD_DIVISOR)
- message_admins("[ADMIN_LOOKUPFLW(usr)] used [src] with score [temp_score] and total_rewards [reward]!!!")
- if(reward > 5)
- reward = 4
- prizevend(usr, reward)
+ // Sanitize score as an integer
+ // Restricts maximum score to (default) 100,000
+ var/temp_score = sanitize_num_clamp(text2num(href_list["tetrisScore"]), max=TETRIS_SCORE_MAX)
+
+ // Check for high score
+ if(temp_score > TETRIS_SCORE_HIGH)
+ // Alert admins
+ message_admins("[ADMIN_LOOKUPFLW(usr)] [ADMIN_KICK(usr)] has achieved a score of [temp_score] on [src] in [get_area(src.loc)]! Score exceeds configured suspicion threshold.")
+
+ // Round and clamp prize count from 0 to (default) 5
+ var/reward_count = clamp(round(temp_score/TETRIS_REWARD_DIVISOR), 0, TETRIS_PRIZES_MAX)
+
+ // Define score text
+ var/score_text = (reward_count ? temp_score : "PATHETIC! TRY HARDER")
+
+ // Display normal message
+ say("YOUR SCORE: [score_text]!")
+
+ // Check if any prize would be vended
+ if(!reward_count)
+ // Return without further effects
+ return
+
+ // Check cooldown
+ if(!COOLDOWN_FINISHED(src, TETRIS_COOLDOWN_MAIN))
+ // Play a fake prize vend effect based on prizevend()
+ playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3)
+ visible_message(span_notice("[src] sputters for a moment before going quiet."))
+
+ // Return with no further effects
+ return
+
+ // Set cooldown time
+ COOLDOWN_START(src, TETRIS_COOLDOWN_MAIN, TETRIS_TIME_COOLDOWN)
+
+ // Vend prizes
+ prizevend(usr, reward_count)
+
+ // Check if science points are possible and allowed
+ if((!SSresearch.science_tech) || TETRIS_NO_SCIENCE)
+ return
+
+ // Define user ID card
+ var/obj/item/card/id/user_id = usr.get_idcard()
+
+ // Check if ID exists
+ // Check if ID has science access
+ if(istype(user_id) && (ACCESS_RESEARCH in user_id.access))
+ // Limit maximum research points to (default) 10,000
+ var/score_research_points = clamp(temp_score, 0, TETRIS_SCORE_MAX_SCI)
+
+ // Add science points based on score
+ SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = score_research_points))
+
+ // Announce points earned
+ say("Research personnel detected. Applying gathered data to algorithms...")
+
return
/obj/machinery/computer/arcade/tetris/attack_ai(user as mob)
@@ -99,3 +156,13 @@
user << browse(dat, "window=tetris;size=435x550")
user.set_machine(src)
onclose(user, "tetris")
+
+// Remove defines
+#undef TETRIS_REWARD_DIVISOR
+#undef TETRIS_PRIZES_MAX
+#undef TETRIS_SCORE_HIGH
+#undef TETRIS_SCORE_MAX
+#undef TETRIS_SCORE_MAX_SCI
+#undef TETRIS_TIME_COOLDOWN
+#undef TETRIS_NO_SCIENCE
+#undef TETRIS_COOLDOWN_MAIN
diff --git a/modular_sand/code/modules/client/loadout/accessories.dm b/modular_sand/code/modules/client/loadout/accessories.dm
index a317069bf495..61562dd38b32 100644
--- a/modular_sand/code/modules/client/loadout/accessories.dm
+++ b/modular_sand/code/modules/client/loadout/accessories.dm
@@ -1,6 +1,5 @@
/datum/gear/accessories/ring
- category = LOADOUT_CATEGORY_GLOVES
- slot = ITEM_SLOT_HANDS
+ slot = ITEM_SLOT_ACCESSORY
/datum/gear/accessories/ring/goldring
name = "A gold ring"
diff --git a/modular_sand/code/modules/clothing/gloves/accessories.dm b/modular_sand/code/modules/clothing/gloves/accessories.dm
index 1c3986de1f5a..e2afe193ffba 100644
--- a/modular_sand/code/modules/clothing/gloves/accessories.dm
+++ b/modular_sand/code/modules/clothing/gloves/accessories.dm
@@ -3,7 +3,8 @@
desc = "A tiny gold ring, sized to wrap around a finger."
gender = NEUTER
w_class = WEIGHT_CLASS_TINY
- slot_flags = ITEM_SLOT_GLOVES
+ slot_flags = ITEM_SLOT_ACCESSORY | ITEM_SLOT_GLOVES
+ slot_equipment_priority = ITEM_SLOT_ACCESSORY | ITEM_SLOT_GLOVES | ITEM_SLOT_BACKPACK
icon = 'icons/obj/ring.dmi'
mob_overlay_icon = 'icons/mob/clothing/hands.dmi'
icon_state = "ringgold"
diff --git a/modular_sand/code/modules/mob/living/silicon/robot/robot.dm b/modular_sand/code/modules/mob/living/silicon/robot/robot.dm
index 1ae172a5c479..184b318d1e8a 100644
--- a/modular_sand/code/modules/mob/living/silicon/robot/robot.dm
+++ b/modular_sand/code/modules/mob/living/silicon/robot/robot.dm
@@ -18,3 +18,24 @@
/mob/living/silicon/robot/modules/roleplay/binarycheck()
return 0 //Roleplay borgs aren't truly borgs
+
+/// Allows "cyborg" players to change gender at will
+/mob/living/silicon/robot/verb/toggle_gender()
+ set name = "Set Gender"
+ set desc = "Allows you to set your gender."
+
+ if(stat != CONSCIOUS)
+ to_chat(usr, span_warning("You cannot toggle your gender while unconcious!"))
+ return
+
+ var/choice = tgui_alert(usr, "Select Gender.", "Gender", list("Both", "Male", "Female"))
+ switch(choice)
+ if("Both")
+ has_penis = TRUE
+ has_vagina = TRUE
+ if("Male")
+ has_penis = TRUE
+ has_vagina = FALSE
+ if("Female")
+ has_penis = FALSE
+ has_vagina = TRUE
diff --git a/modular_sand/code/modules/mob/mob.dm b/modular_sand/code/modules/mob/mob.dm
index 05b0920a20cb..7957645e5490 100644
--- a/modular_sand/code/modules/mob/mob.dm
+++ b/modular_sand/code/modules/mob/mob.dm
@@ -1,3 +1,22 @@
+// Only Clients should have a panel for them, okay?
+/mob/Login()
+ . = ..()
+ AddComponent(/datum/component/interaction_menu_granter)
+
+/mob/Logout()
+ qdel(GetComponent(/datum/component/interaction_menu_granter))
+ . = ..()
+
+/mob/Initialize(mapload)
+ . = ..()
+ register_context()
+
+/mob/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+ if(user.GetComponent(/datum/component/interaction_menu_granter))
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB], INTENT_ANY, "Interact with")
+ return CONTEXTUAL_SCREENTIP_SET
+
///Adjust the thirst of a mob
/mob/proc/adjust_thirst(change, max = THIRST_LEVEL_THRESHOLD)
thirst = clamp(thirst + change, 0, max)
diff --git a/modular_sand/code/modules/resize/resizing.dm b/modular_sand/code/modules/resize/resizing.dm
index 9d0302561d0c..913fcbb294a4 100644
--- a/modular_sand/code/modules/resize/resizing.dm
+++ b/modular_sand/code/modules/resize/resizing.dm
@@ -19,12 +19,12 @@
return TRUE
//Doing messages
- if(abs(get_size(user)/get_size(target) >= 2)) //if the initiator is twice the size of the micro
+ if(COMPARE_SIZES(user, target) >= 2) //if the initiator is twice the size of the micro
now_pushing = 0
user.forceMove(target.loc)
//Smaller person being stepped on
- if(get_size(user) > get_size(target) && iscarbon(src))
+ if(iscarbon(src))
if(istype(user) && user.dna.features["taur"] == "Naga" || user.dna.features["taur"] == "Tentacle")
target.visible_message(span_notice("[src] carefully slithers around [target]."), span_notice("[src]'s huge tail slithers besides you."))
else
@@ -32,7 +32,7 @@
return TRUE
//Smaller person stepping under a larger person
- if(abs(get_size(target)/get_size(user)) >= 2)
+ if(COMPARE_SIZES(target, user) >= 2)
user.forceMove(target.loc)
now_pushing = 0
micro_step_under(target)
@@ -59,7 +59,7 @@
user.forceMove(target.loc)
return TRUE
- if(abs(get_size(user)/get_size(target)) >= 2)
+ if(COMPARE_SIZES(user, target) >= 2)
log_combat(user, target, "stepped on", addition="[user.a_intent] trample")
if(user.a_intent == "disarm" && CHECK_MOBILITY(user, MOBILITY_MOVE) && !user.buckled)
now_pushing = 0
@@ -67,7 +67,7 @@
user.sizediffStamLoss(target)
user.add_movespeed_modifier(/datum/movespeed_modifier/stomp, TRUE) //Full stop
addtimer(CALLBACK(user, /mob/.proc/remove_movespeed_modifier, MOVESPEED_ID_STOMP, TRUE), 3) //0.3 seconds
- if(get_size(user) > get_size(target) && iscarbon(user))
+ if(iscarbon(user))
if(istype(user) && user.dna.features["taur"] == "Naga" || user.dna.features["taur"] == "Tentacle")
target.visible_message(span_danger("[src] carefully rolls their tail over [target]!"), span_danger("[src]'s huge tail rolls over you!"))
else
@@ -83,7 +83,7 @@
user.add_movespeed_modifier(/datum/movespeed_modifier/stomp, TRUE)
addtimer(CALLBACK(user, /mob/.proc/remove_movespeed_modifier, MOVESPEED_ID_STOMP, TRUE), 10) //1 second
//user.Stun(20)
- if(get_size(user) > get_size(target) && iscarbon(user))
+ if(iscarbon(user))
if(istype(user) && (user.dna.features["taur"] == "Naga" || user.dna.features["taur"] == "Tentacle"))
target.visible_message(span_danger("[src] mows down [target] under their tail!"), span_userdanger("[src] plows their tail over you mercilessly!"))
else
@@ -97,7 +97,7 @@
user.sizediffStun(target)
user.add_movespeed_modifier(/datum/movespeed_modifier/stomp, TRUE)
addtimer(CALLBACK(user, /mob/.proc/remove_movespeed_modifier, MOVESPEED_ID_STOMP, TRUE), 7)//About 3/4th a second
- if(get_size(user) > get_size(target) && iscarbon(user))
+ if(iscarbon(user))
var/feetCover = (user.wear_suit && (user.wear_suit.body_parts_covered & FEET)) || (user.w_uniform && (user.w_uniform.body_parts_covered & FEET) || (user.shoes && (user.shoes.body_parts_covered & FEET)))
if(feetCover)
if(user?.dna?.features["taur"] == "Naga" || user?.dna?.features["taur"] == "Tentacle")
@@ -116,7 +116,7 @@
SEND_SIGNAL(target, COMSIG_MICRO_PICKUP_FEET, user)
return TRUE
- if(abs(get_size(target)/get_size(user)) >= 2)
+ if(COMPARE_SIZES(target, user) >= 2)
user.forceMove(target.loc)
now_pushing = 0
micro_step_under(target)
@@ -141,17 +141,17 @@
//Proc for scaling stamina damage on size difference
/mob/living/carbon/proc/sizediffStamLoss(mob/living/carbon/target)
- var/S = (get_size(src)/get_size(target)*25) //macro divided by micro, times 25
+ var/S = COMPARE_SIZES(src, target) * 25 //macro divided by micro, times 25
target.Knockdown(S) //final result in stamina knockdown
//Proc for scaling stuns on size difference (for grab intent)
/mob/living/carbon/proc/sizediffStun(mob/living/carbon/target)
- var/T = (get_size(src)/get_size(target)*2) //Macro divided by micro, times 2
+ var/T = COMPARE_SIZES(src, target) * 2 //Macro divided by micro, times 2
target.Stun(T)
//Proc for scaling brute damage on size difference
/mob/living/carbon/proc/sizediffBruteloss(mob/living/carbon/target)
- var/B = (get_size(src)/get_size(target)*3) //macro divided by micro, times 3
+ var/B = COMPARE_SIZES(src, target) * 3 //macro divided by micro, times 3
target.adjustBruteLoss(B) //final result in brute loss
//Proc for instantly grabbing valid size difference. Code optimizations soon(TM)
diff --git a/modular_splurt/code/_globalvars/lists/mobs.dm b/modular_splurt/code/_globalvars/lists/mobs.dm
index 92a3c83791f1..22062af32939 100644
--- a/modular_splurt/code/_globalvars/lists/mobs.dm
+++ b/modular_splurt/code/_globalvars/lists/mobs.dm
@@ -1 +1,2 @@
GLOBAL_LIST_EMPTY(discord_passthrough)
+GLOBAL_LIST_EMPTY(ssd_mob_list) // Player mobs that are SSD
diff --git a/modular_splurt/code/controllers/configuration/entries/splurt_autocryo.dm b/modular_splurt/code/controllers/configuration/entries/splurt_autocryo.dm
new file mode 100644
index 000000000000..c94e2e3d9865
--- /dev/null
+++ b/modular_splurt/code/controllers/configuration/entries/splurt_autocryo.dm
@@ -0,0 +1,8 @@
+// Time before sending the user to cryo
+/datum/config_entry/number/autocryo_time_trigger
+ config_entry_value = 24000
+ min_val = 600
+ integer = TRUE
+
+// Should this system be used?
+/datum/config_entry/flag/autocryo_enabled
diff --git a/modular_splurt/code/controllers/configuration/entries/splurt_general.dm b/modular_splurt/code/controllers/configuration/entries/splurt_general.dm
index 8c79ccfe15b4..cf0b98343413 100644
--- a/modular_splurt/code/controllers/configuration/entries/splurt_general.dm
+++ b/modular_splurt/code/controllers/configuration/entries/splurt_general.dm
@@ -4,3 +4,6 @@
config_entry_value = 5
/datum/config_entry/flag/weighted_station_traits
+
+/datum/config_entry/number/base_save_slots
+ config_entry_value = DEFAULT_SAVE_SLOTS
diff --git a/modular_splurt/code/controllers/subsystem/afk.dm b/modular_splurt/code/controllers/subsystem/afk.dm
new file mode 100644
index 000000000000..70e213c269a7
--- /dev/null
+++ b/modular_splurt/code/controllers/subsystem/afk.dm
@@ -0,0 +1,43 @@
+// Define config entries for cryo
+#define SUBSYSTEM_CRYO_CAN_RUN CONFIG_GET(flag/autocryo_enabled)
+#define SUBSYSTEM_CRYO_TIME CONFIG_GET(number/autocryo_time_trigger)
+
+SUBSYSTEM_DEF(auto_cryo)
+ name = "Automated Cryogenics"
+ flags = SS_BACKGROUND
+
+/datum/controller/subsystem/auto_cryo/Initialize()
+ // Check config before running
+ if(!SUBSYSTEM_CRYO_CAN_RUN)
+ can_fire = FALSE
+
+ return ..()
+
+/datum/controller/subsystem/auto_cryo/fire()
+ // Check for any targets
+ if(!GLOB.ssd_mob_list.len)
+ // No SSD mobs exist
+ return
+
+ // Check possible targets
+ for(var/mob/living/cryo_mob in GLOB.ssd_mob_list)
+ // Get SSD time
+ // This is set when disconnecting
+ var/afk_time = world.time - cryo_mob.lastclienttime
+
+ // Check if client meets the time requirement
+ if(afk_time < SUBSYSTEM_CRYO_TIME)
+ continue
+
+ // Send to cryo
+ cryoMob(cryo_mob, effects = TRUE)
+
+ // Remove from SSD list
+ GLOB.ssd_mob_list -= cryo_mob
+
+ // Log cryo interaction
+ log_game("[cryo_mob] was sent to cryo after being SSD for [afk_time] ticks.")
+
+// Remove defines
+#undef SUBSYSTEM_CRYO_CAN_RUN
+#undef SUBSYSTEM_CRYO_TIME
diff --git a/modular_splurt/code/datums/components/dullahan.dm b/modular_splurt/code/datums/components/dullahan.dm
index a8558a583500..6fae1b981dc8 100644
--- a/modular_splurt/code/datums/components/dullahan.dm
+++ b/modular_splurt/code/datums/components/dullahan.dm
@@ -1,3 +1,15 @@
+#define HEAD_ACCESSORIES_PATHS list(\
+ /obj/item/clothing/head = 'icons/mob/clothing/head.dmi',\
+ /obj/item/clothing/glasses = 'icons/mob/clothing/eyes.dmi',\
+ /obj/item/reagent_containers/glass/bucket = 'icons/mob/clothing/head.dmi',\
+ /obj/item/reagent_containers/rag/towel = 'icons/mob/clothing/head.dmi',\
+ /obj/item/paper = 'icons/mob/clothing/head.dmi',\
+ /obj/item/nullrod/fedora = 'icons/mob/clothing/head.dmi',\
+ )
+
+/obj/item/organ/eyes/dullahan
+ tint = 0
+
/datum/component/neckfire
var/mutable_appearance/neck_fire
@@ -30,7 +42,7 @@
neck_fire.icon_state = "neckfire"
neck_fire.color = fire_color
- neck_fire.plane = 19 // glowy i hope
+ //neck_fire.plane = 19 // glowy i hope
var/datum/action/neckfire/A = new /datum/action/neckfire(src)
A.Grant(M)
@@ -72,3 +84,84 @@
var/mob/living/carbon/human/H = quirk_holder
if(H.dna.features["neckfire"] && !istype(H, /mob/living/carbon/human/dummy))
H.AddComponent(/datum/component/neckfire, H.dna.features["neckfire_color"])
+
+/datum/component/dullahan
+ var/obj/item/clothing/head_accessory
+ var/mutable_appearance/head_accessory_MA
+
+/datum/component/dullahan/Initialize()
+ . = ..()
+ RegisterSignal(dullahan_head, COMSIG_MOUSEDROPPED_ONTO, .proc/on_mouse_dropped)
+ RegisterSignal(dullahan_head, COMSIG_MOUSEDROP_ONTO, .proc/on_mouse_drop)
+
+/datum/component/dullahan/proc/add_head_accessory(obj/item/clothing/I, item_path)
+ head_accessory_MA = mutable_appearance(I.mob_overlay_icon || HEAD_ACCESSORIES_PATHS[item_path])
+ head_accessory_MA.icon_state = I.icon_state
+ I.forceMove(dullahan_head)
+
+ dullahan_head.add_overlay(head_accessory_MA)
+ head_accessory = I
+
+/datum/component/dullahan/proc/remove_head_accessory(obj/item/clothing/I)
+ dullahan_head.cut_overlay(head_accessory_MA)
+ head_accessory = null
+
+/datum/component/dullahan/proc/on_mouse_dropped(datum/source, obj/item/I, mob/living/user)
+ var/mob/living/carbon/owner = dullahan_head.owner
+ var/item_path
+
+ for(var/type in HEAD_ACCESSORIES_PATHS)
+ if(istype(I, type))
+ item_path = type
+ break
+
+ if(item_path && !head_accessory)
+ if(istype(I, /obj/item/clothing))
+ var/obj/item/organ/eyes/dullahan/eyes = owner.getorganslot(ORGAN_SLOT_EYES)
+ var/obj/item/clothing/clothing = I
+
+ eyes.flash_protect = clothing.flash_protect
+ eyes.tint = clothing.tint
+ owner.update_tint()
+
+ add_head_accessory(I, item_path)
+ else
+ to_chat(user, span_notice("You can't put \the [I.name] on the head of \the [owner.name]"))
+ return
+
+/datum/component/dullahan/proc/on_mouse_drop(datum/source, atom/A, mob/living/user)
+ var/mob/living/carbon/owner = dullahan_head.owner
+
+ if(head_accessory)
+ if(istype(A, /turf/open))
+ head_accessory.forceMove(A)
+ else if(istype(A, /atom/movable/screen/inventory/hand))
+ var/atom/movable/screen/inventory/hand/H = A
+
+ user.put_in_hand(head_accessory, H.held_index)
+ else
+ return
+
+ var/obj/item/organ/eyes/dullahan/eyes = owner.getorganslot(ORGAN_SLOT_EYES)
+ eyes.flash_protect = 0
+ eyes.tint = 0
+ owner.update_tint()
+
+ remove_head_accessory(head_accessory)
+
+/datum/action/item_action/organ_action/dullahan/proc/toggle_monochromacy()
+ var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES)
+
+ if(eyes.monochromacy_on)
+ owner.remove_client_colour(/datum/client_colour/monochrome)
+ else
+ owner.add_client_colour(/datum/client_colour/monochrome)
+
+ eyes.monochromacy_on = !eyes.monochromacy_on
+
+/obj/item/organ/eyes
+ var/monochromacy_on = FALSE
+
+/datum/action/item_action/organ_action/dullahan/Grant(mob/M)
+ . = ..()
+ toggle_monochromacy()
diff --git a/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm b/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm
index ca6fddf6e87b..896cc1c05fc5 100644
--- a/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm
+++ b/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm
@@ -469,6 +469,20 @@
if(gut)
gut.modify_size(-1)
+/datum/interaction/lewd/inflate_belly
+ description = "Inflate belly"
+ require_user_belly = REQUIRE_EXPOSED
+ interaction_sound = null
+ max_distance = 0
+ user_is_target = TRUE
+ write_log_user = "inflated their belly"
+ write_log_target = null
+
+/datum/interaction/lewd/inflate_belly/display_interaction(mob/living/carbon/user)
+ var/obj/item/organ/genital/belly/gut = user.getorganslot(ORGAN_SLOT_BELLY)
+ if(gut)
+ gut.modify_size(1)
+
/datum/interaction/lewd/nuzzle_belly
description = "Nuzzle their belly."
require_target_belly = REQUIRE_EXPOSED
diff --git a/modular_splurt/code/datums/traits/good.dm b/modular_splurt/code/datums/traits/good.dm
index 1984a6a73fcb..70a84f4d82f9 100644
--- a/modular_splurt/code/datums/traits/good.dm
+++ b/modular_splurt/code/datums/traits/good.dm
@@ -1,3 +1,18 @@
+//Main code edits
+/datum/quirk/photographer
+ desc = "You carry your camera and personal photo album everywhere you go, and you're quicker at taking pictures."
+
+/datum/quirk/photographer/on_spawn()
+ . = ..()
+ var/mob/living/carbon/human/H = quirk_holder
+ var/obj/item/storage/photo_album/photo_album = new(get_turf(H))
+ H.put_in_hands(photo_album)
+ H.equip_to_slot(photo_album, ITEM_SLOT_BACKPACK)
+ photo_album.persistence_id = "personal_[H.mind.key]" // this is a persistent album, the ID is tied to the account's key to avoid tampering
+ photo_album.persistence_load()
+ photo_album.name = "[H.real_name]'s photo album"
+
+//Own stuff
/datum/quirk/tough
name = "Tough"
desc = "Your body is abnormally enduring and can take 10% more damage."
diff --git a/modular_splurt/code/datums/traits/neutral.dm b/modular_splurt/code/datums/traits/neutral.dm
index 156a3fc4b31e..9c7c6b8f6774 100644
--- a/modular_splurt/code/datums/traits/neutral.dm
+++ b/modular_splurt/code/datums/traits/neutral.dm
@@ -152,7 +152,6 @@
gain_text = span_notice("You feel like being someone's pet...")
lose_text = span_notice("You no longer feel like being a pet...")
processing_quirk = TRUE
- var/mood_category = "dom_trained"
var/notice_delay = 0
var/mob/living/carbon/human/last_dom
@@ -202,10 +201,10 @@
//Handle the mood
var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood)
- if(istype(mood.mood_events[mood_category], /datum/mood_event/dominant/good_boy))
- SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/dominant/good_boy)
+ if(istype(mood.mood_events[QMOOD_WELL_TRAINED], /datum/mood_event/dominant/good_boy))
+ SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, QMOOD_WELL_TRAINED, /datum/mood_event/dominant/good_boy)
else
- SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/dominant/need)
+ SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, QMOOD_WELL_TRAINED, /datum/mood_event/dominant/need)
//Don't do anything if a previous dom was found
if(last_dom)
@@ -279,7 +278,6 @@
// The shame is unbearable
mood_quirk = FALSE
processing_quirk = FALSE
- var/mood_category = "backpack_implant_mood"
/datum/quirk/storage_concealment/on_spawn()
. = ..()
@@ -295,10 +293,10 @@
// Check the quirk holder for the trait
if(HAS_TRAIT(quirk_holder, TRAIT_HIDE_BACKPACK))
// When found: Mood bonus
- SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/dorsualiphobic_mood_positive)
+ SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, QMOOD_HIDE_BAG, /datum/mood_event/dorsualiphobic_mood_positive)
else
// When not found: Mood penalty
- SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/dorsualiphobic_mood_negative)
+ SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, QMOOD_HIDE_BAG, /datum/mood_event/dorsualiphobic_mood_negative)
//succubus and incubus below
/datum/quirk/incubus
@@ -510,21 +508,43 @@
/datum/quirk/werewolf //adds the werewolf quirk
name = "Werewolf"
- desc = "A beastly affliction allows you to shapeshift into a more wolfish appearance at will. This will increase your size (In general and below!) and cause you to behave as though you were an anthropomorphic canine. (This is still being tested. Please send any bugs to nukechicken on discord)"
+ desc = "A beastly affliction allows you to shape-shift into a large anthropomorphic canine at will."
value = 0
+ mob_trait = TRAIT_WEREWOLF
+ gain_text = span_notice("You feel the full moon beckon.")
+ lose_text = span_notice("The moon's call hushes into silence.")
+ medical_record_text = "Patient has been reported howling at the night sky."
+ var/list/old_features
/datum/quirk/werewolf/add()
- . = ..()
- var/mob/living/carbon/human/H = quirk_holder
- var/datum/action/werewolf/W = new
- W.Grant(H)
+ // Define old features
+ old_features = list("species" = SPECIES_HUMAN, "legs" = "Plantigrade", "size" = 1, "bark")
+
+ // Define quirk mob
+ var/mob/living/carbon/human/quirk_mob = quirk_holder
+
+ // Record features
+ old_features = quirk_mob.dna.features.Copy()
+ old_features["species"] = quirk_mob.dna.species.type
+ old_features["custom_species"] = quirk_mob.custom_species
+ old_features["size"] = get_size(quirk_mob)
+ old_features["bark"] = quirk_mob.vocal_bark_id
+ old_features["taur"] = quirk_mob.dna.features["taur"]
+ old_features["eye_type"] = quirk_mob.dna.species.eye_type
+
+/datum/quirk/werewolf/post_add()
+ // Define quirk action
+ var/datum/action/cooldown/werewolf/transform/quirk_action = new
+
+ // Grant quirk action
+ quirk_action.Grant(quirk_holder)
/datum/quirk/werewolf/remove()
- var/mob/living/carbon/human/H = quirk_holder
- var/datum/action/werewolf/W = locate() in H.actions
- W.Remove(H)
- . = ..()
+ // Define quirk action
+ var/datum/action/cooldown/werewolf/transform/quirk_action = locate() in quirk_holder.actions
+ // Revoke quirk action
+ quirk_action.Remove(quirk_holder)
/datum/quirk/gargoyle //Mmmm yes stone time
name = "Gargoyle"
@@ -613,15 +633,14 @@
value = 0
mood_quirk = TRUE
processing_quirk = TRUE
- var/mood_category = "nudist_mood"
/datum/quirk/nudist/on_process()
var/mob/living/carbon/human/H = quirk_holder
// Checking torso exposure appears to be a robust method.
if( ( H.is_chest_exposed() && H.is_groin_exposed() ) )
- SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/nudist_positive)
+ SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, QMOOD_NUDIST, /datum/mood_event/nudist_positive)
else
- SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/nudist_negative)
+ SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, QMOOD_NUDIST, /datum/mood_event/nudist_negative)
/datum/quirk/nudist/on_spawn()
. = ..()
@@ -640,15 +659,14 @@
mood_quirk = TRUE
medical_record_text = "Patient feels more secure when wearing a gas mask."
processing_quirk = TRUE
- var/mood_category = "masked_mook"
/datum/quirk/masked_mook/on_process()
var/mob/living/carbon/human/H = quirk_holder
var/obj/item/clothing/mask/gas/gasmask = H.get_item_by_slot(ITEM_SLOT_MASK)
if(istype(gasmask))
- SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/masked_mook)
+ SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, QMOOD_MASKED_MOOK, /datum/mood_event/masked_mook)
else
- SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/masked_mook_incomplete)
+ SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, QMOOD_MASKED_MOOK, /datum/mood_event/masked_mook_incomplete)
/datum/quirk/masked_mook/on_spawn()
. = ..()
diff --git a/modular_splurt/code/datums/traits/trait_actions.dm b/modular_splurt/code/datums/traits/trait_actions.dm
index 51b93106fd8c..da19988868ec 100644
--- a/modular_splurt/code/datums/traits/trait_actions.dm
+++ b/modular_splurt/code/datums/traits/trait_actions.dm
@@ -673,89 +673,221 @@
// Quirk: Werewolf
//
-/datum/action/werewolf
- name = "Transform"
- desc = "Transform into your wolf form."
+/datum/action/cooldown/werewolf
+ name = "Werewolf Ability"
+ desc = "Do something related to werewolves."
icon_icon = 'modular_splurt/icons/mob/actions/misc_actions.dmi'
button_icon_state = "Transform"
+ check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUN | AB_CHECK_CONSCIOUS | AB_CHECK_ALIVE
+ cooldown_time = 5 SECONDS
+ transparent_when_unavailable = TRUE
+
+/datum/action/cooldown/werewolf/transform
+ name = "Toggle Werewolf Form"
+ desc = "Transform in or out of your wolf form."
var/transformed = FALSE
- var/list/old_features = list("species" = SPECIES_HUMAN, "legs" = "Plantigrade", "size" = 1, "bark")
+ var/species_changed = FALSE
+ var/werewolf_gender = "Lycan"
+ var/list/old_features
-/datum/action/werewolf/Trigger()
+/datum/action/cooldown/werewolf/transform/Grant()
. = ..()
- var/mob/living/carbon/human/H = owner
- var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS)
- var/obj/item/organ/genital/breasts/B = H.getorganslot(ORGAN_SLOT_BREASTS)
- var/obj/item/organ/genital/vagina/V = H.getorganslot(ORGAN_SLOT_VAGINA)
- H.shake_animation(2)
- if(!transformed) // transform them
- H.visible_message(span_danger("[H] shivers, their flesh bursting with a sudden growth of thick fur and their features contorting to that of a beast's, fully transforming them into a werewolf!"))
- H.set_species(/datum/species/mammal, 1)
- H.dna.species.mutant_bodyparts["mam_tail"] = "Wolf"
- H.dna.species.mutant_bodyparts["legs"] = "Digitigrade"
- H.Digitigrade_Leg_Swap(FALSE)
- H.dna.species.mutant_bodyparts["mam_snouts"] = "Mammal, Thick"
- H.dna.features["mam_ears"] = "Wolf"
- H.dna.features["mam_tail"] = "Wolf"
- H.dna.features["mam_snouts"] = "Mammal, Thick"
- H.dna.features["legs"] = "Digitigrade"
- H.update_size(get_size(H) + 0.5)
- H.set_bark("bark")
- H.custom_species = "Werewolf"
- if(!(H.dna.species.species_traits.Find(DIGITIGRADE)))
- H.dna.species.species_traits += DIGITIGRADE
- H.update_body()
- H.update_body_parts()
- if(B)
- B.color = "#[H.dna.features["mcolor"]]"
- B.update()
- if(P)
- P.shape = "Knotted"
- P.color = "#ff7c80"
- P.update()
- P.modify_size(6)
- if(V)
- V.shape = "Furred"
- V.color = "#[H.dna.features["mcolor"]]"
- V.update()
- else // untransform them
- H.visible_message(span_danger("[H] shrinks, their wolfish features quickly receding."))
- H.set_species(old_features["species"], TRUE)
- H.set_bark(old_features["bark"])
- H.dna.features["mam_ears"] = old_features["mam_ears"]
- H.dna.features["mam_snouts"] = old_features["mam_snouts"]
- H.dna.features["mam_tail"] = old_features["mam_tail"]
- H.dna.features["legs"] = old_features["legs"] //i hate legs i hate legs i hate legs i hate legs i hate legs i hate legs i hate legs
+
+ // Define carbon owner
+ var/mob/living/carbon/action_owner_carbon = owner
+
+ // Define parent quirk
+ var/datum/quirk/werewolf/quirk_data = locate() in action_owner_carbon.roundstart_quirks
+
+ // Check if data was copied
+ if(!quirk_data)
+ // Log error and return
+ log_game("Failed to get species data for werewolf action!")
+ return
+
+ // Define stored features
+ old_features = quirk_data.old_features.Copy()
+
+ // Define action owner
+ var/mob/living/carbon/human/action_owner = owner
+
+ // Set species gendered name
+ switch(action_owner.gender)
+ if(MALE)
+ werewolf_gender = "Wer"
+ if(FEMALE)
+ werewolf_gender = "Wīf"
+ if(PLURAL)
+ werewolf_gender = "Hie"
+ if(NEUTER)
+ werewolf_gender = "Þing"
+
+/datum/action/cooldown/werewolf/transform/Trigger()
+ . = ..()
+
+ // Check if unavailable
+ // Checks the parent function's return value
+ if(!.)
+ // Messages will not display here
+ return FALSE
+
+ // Define action owner
+ var/mob/living/carbon/human/action_owner = owner
+
+ // Check for restraints
+ if(!CHECK_MOBILITY(action_owner, MOBILITY_USE))
+ // Warn user, then return
+ action_owner.visible_message(span_warning("You cannot transform while restrained!"))
+ return
+
+ // Define citadel organs
+ var/obj/item/organ/genital/penis/organ_penis = action_owner.getorganslot(ORGAN_SLOT_PENIS)
+ var/obj/item/organ/genital/breasts/organ_breasts = action_owner.getorganslot(ORGAN_SLOT_BREASTS)
+ var/obj/item/organ/genital/vagina/organ_vagina = action_owner.getorganslot(ORGAN_SLOT_VAGINA)
+
+ // Play shake animation
+ action_owner.shake_animation(2)
+
+ // Transform into wolf form
+ if(!transformed)
+ // Define current species type
+ var/datum/species/owner_species = action_owner.dna.species.type
+
+ // Check if species has changed
+ if(old_features["species"] != owner_species)
+ // Set old species
+ old_features["species"] = owner_species
+
+ // Define species prefix
+ var/custom_species_prefix
+
+ // Check if species is mammal (anthro)
+ if(ismammal(action_owner))
+ // Do nothing!
+
+ // Check if species is already a mammal sub-type
+ else if(owner_species in subtypesof(/datum/species/mammal))
+ // Do nothing!
+
+ // Check if species is a jelly
+ else if(isjellyperson(action_owner))
+ // Set species prefix
+ custom_species_prefix = "Jelly "
+
+ // Check if species is a jelly subtype
+ else if(owner_species in subtypesof(/datum/species/jelly))
+ // Set species prefix
+ custom_species_prefix = "Slime "
+
+ // Species is not a mammal
+ else
+ // Change species
+ action_owner.set_species(/datum/species/mammal, 1)
+
+ // Set species changed
+ species_changed = TRUE
+
+ // Set species features
+ action_owner.dna.custom_species = "[custom_species_prefix][werewolf_gender]wulf"
+ action_owner.dna.species.mutant_bodyparts["mam_tail"] = "Otusian"
+ action_owner.dna.species.mutant_bodyparts["legs"] = "Digitigrade"
+ action_owner.Digitigrade_Leg_Swap(FALSE)
+ action_owner.dna.species.mutant_bodyparts["mam_snouts"] = "Sergal"
+ action_owner.dna.features["mam_ears"] = "Jackal"
+ action_owner.dna.features["mam_tail"] = "Otusian"
+ action_owner.dna.features["mam_snouts"] = "Sergal"
+ action_owner.dna.features["legs"] = "Digitigrade"
+ action_owner.dna.features["insect_fluff"] = "Hyena"
+ action_owner.update_size(get_size(action_owner) + 0.5)
+ action_owner.set_bark("bark")
+ if(old_features["taur"] != "None")
+ action_owner.dna.features["taur"] = "Canine"
+ if(!(action_owner.dna.species.species_traits.Find(DIGITIGRADE)))
+ action_owner.dna.species.species_traits += DIGITIGRADE
+ action_owner.update_body()
+ action_owner.update_body_parts()
+
+ // Update possible citadel organs
+ if(organ_breasts)
+ organ_breasts.color = "#[action_owner.dna.features["mcolor"]]"
+ organ_breasts.update()
+ if(organ_penis)
+ organ_penis.shape = "Knotted"
+ organ_penis.color = "#ff7c80"
+ organ_penis.update()
+ organ_penis.modify_size(6)
+ if(organ_vagina)
+ organ_vagina.shape = "Furred"
+ organ_vagina.color = "#[action_owner.dna.features["mcolor"]]"
+ organ_vagina.update()
+
+ // Un-transform from wolf form
+ else
+ // Check if species was already mammal (anthro)
+ if(!species_changed)
+ // Do nothing!
+
+ // Species was not a mammal
+ else
+ // Revert species
+ action_owner.set_species(old_features["species"], TRUE)
+
+ // Clear species changed flag
+ species_changed = FALSE
+
+ // Revert species trait
+ action_owner.set_bark(old_features["bark"])
+ action_owner.dna.custom_species = old_features["custom_species"]
+ action_owner.dna.features["mam_ears"] = old_features["mam_ears"]
+ action_owner.dna.features["mam_snouts"] = old_features["mam_snouts"]
+ action_owner.dna.features["mam_tail"] = old_features["mam_tail"]
+ action_owner.dna.features["legs"] = old_features["legs"]
+ action_owner.dna.features["insect_fluff"] = old_features["insect_fluff"]
+ action_owner.dna.species.eye_type = old_features["eye_type"]
+ if(old_features["taur"] != "None")
+ action_owner.dna.features["taur"] = old_features["taur"]
if(old_features["legs"] == "Plantigrade")
- H.dna.species.species_traits -= DIGITIGRADE
- H.Digitigrade_Leg_Swap(TRUE)
- H.dna.species.mutant_bodyparts["legs"] = old_features["legs"]
- H.update_body()
- H.update_body_parts()
- H.update_size(get_size(H) - 0.5)
- if(B)
- B.color = "#[old_features["breasts_color"]]"
- B.update()
- if(H.has_penis())
- P.shape = old_features["cock_shape"]
- P.color = "#[old_features["cock_color"]]"
- P.update()
- P.modify_size(-6)
- if(H.has_vagina())
- V.shape = old_features["vag_shape"]
- V.color = "#[old_features["vag_color"]]"
- V.update()
- V.update_size()
+ action_owner.dna.species.species_traits -= DIGITIGRADE
+ action_owner.Digitigrade_Leg_Swap(TRUE)
+ action_owner.dna.species.mutant_bodyparts["legs"] = old_features["legs"]
+ action_owner.update_body()
+ action_owner.update_body_parts()
+ action_owner.update_size(get_size(action_owner) - 0.5)
+
+ // Revert citadel organs
+ if(organ_breasts)
+ organ_breasts.color = "#[old_features["breasts_color"]]"
+ organ_breasts.update()
+ if(action_owner.has_penis())
+ organ_penis.shape = old_features["cock_shape"]
+ organ_penis.color = "#[old_features["cock_color"]]"
+ organ_penis.update()
+ organ_penis.modify_size(-6)
+ if(action_owner.has_vagina())
+ organ_vagina.shape = old_features["vag_shape"]
+ organ_vagina.color = "#[old_features["vag_color"]]"
+ organ_vagina.update()
+ organ_vagina.update_size()
+
+ // Set transformation message
+ var/owner_p_their = action_owner.p_their()
+ var/toggle_message = (!transformed ? "[action_owner] shivers, [owner_p_their] flesh bursting with a sudden growth of thick fur as [owner_p_their] features contort to that of a beast, fully transforming [action_owner.p_them()] into a werewolf!" : "[action_owner] shrinks, [owner_p_their] wolfish features quickly receding.")
+
+ // Alert in local chat
+ action_owner.visible_message(span_danger(toggle_message))
+
+ // Toggle transformation state
transformed = !transformed
-/datum/action/werewolf/Grant()// on grant sets some variables
- . = ..()
- var/mob/living/carbon/human/H = owner
- old_features = H.dna.features.Copy()
- old_features["species"] = H.dna.species.type
- old_features["size"] = get_size(H)
- old_features["bark"] = H.vocal_bark_id
+ // Start cooldown
+ StartCooldown()
+
+ // Return success
+ return TRUE
+//
+// Quirk: Gargoyle
+//
/datum/action/gargoyle/transform
name = "Transform"
@@ -795,10 +927,6 @@
to_chat(H, span_warning("You have transformed too recently; you cannot yet transform again!"))
return 0
-//
-// Quirk: Gargoyle
-//
-
/datum/action/gargoyle/check
name = "Check"
desc = "Check your current energy levels."
diff --git a/modular_splurt/code/game/objects/effects/landmarks.dm b/modular_splurt/code/game/objects/effects/landmarks.dm
index 1d26983266e5..6825efe6ca70 100644
--- a/modular_splurt/code/game/objects/effects/landmarks.dm
+++ b/modular_splurt/code/game/objects/effects/landmarks.dm
@@ -23,6 +23,12 @@
icon = 'modular_splurt/icons/mob/landmarks.dmi'
icon_state = "Psychologist"
+/obj/effect/landmark/start/stowaway
+ name = "Stowaway"
+ icon = 'modular_splurt/icons/mob/landmarks.dmi'
+ icon_state = "Stowaway"
+ jobspawn_override = TRUE //spawn in maint
+ delete_after_roundstart = FALSE
//Landmark that creates destinations for the navigate verb to path to
/obj/effect/landmark/navigate_destination
diff --git a/modular_splurt/code/game/objects/items/toys.dm b/modular_splurt/code/game/objects/items/toys.dm
index 1d441a4a94ae..b131fd5c7445 100644
--- a/modular_splurt/code/game/objects/items/toys.dm
+++ b/modular_splurt/code/game/objects/items/toys.dm
@@ -39,3 +39,70 @@
// Set flavor text
name = "generic action figure"
desc = "It\'s just a normal toy."
+
+/obj/item/toy/beach_ball
+ var/obj/item/vibrator
+ var/enabled = FALSE
+
+/obj/item/toy/beach_ball/syndicate
+ icon_state = "ballsyndicate"
+ icon = 'modular_splurt/icons/misc/beach.dmi'
+ desc = "Hmm. This ball is a bit heavier and tougher than the others."
+
+/obj/item/toy/beach_ball/attackby(obj/item/I, mob/living/user)
+ if(istype(I, /obj/item/electropack/vibrator))
+ if(vibrator)
+ to_chat(user, span_warning("There is already a vibrator inside this!"))
+ else
+ if(!user.transferItemToLoc(I,src))
+ return
+ to_chat(user, span_notice("You put [I] inside [src]."))
+ vibrator = I
+
+/obj/item/toy/beach_ball/attack_self(mob/user)
+ var/list/options_list = list()
+ if(vibrator)
+ options_list += list("Eject" = image(icon = 'icons/radials/taperecorder.dmi', icon_state = "eject", dir = EAST))
+ options_list += list("Play" = image(icon = 'icons/radials/taperecorder.dmi', icon_state = "play", dir = WEST))
+ if(options_list)
+ var/selection = show_radial_menu(user, src, options_list, radius = 38, require_near = TRUE, tooltips = TRUE)
+ if(!selection)
+ return
+ switch(selection)
+ if("Play")
+ playsound(user, 'sound/effects/clock_tick.ogg', 50, 1, -1)
+ enabled = !enabled
+ if(enabled)
+ START_PROCESSING(SSobj, src)
+ else
+ STOP_PROCESSING(SSobj, src)
+ to_chat(user, "You toggle the [vibrator]. ")
+ if("Eject")
+ playsound(user, 'sound/weapons/empty.ogg', 100, 1)
+ to_chat(user, "You remove [vibrator] from [src]. ")
+ user.put_in_hands(vibrator)
+ enabled = FALSE
+ vibrator = null
+ update_icon()
+
+/obj/item/toy/beach_ball/process()
+ if(vibrator && enabled)
+ throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),3,1)
+ playsound(src, 'modular_splurt/sound/lewd/vibrate.ogg', 40, 1, -1)
+
+/obj/item/toy/beach_ball/syndicate/process()
+ . = ..()
+ if(vibrator && enabled)
+ throwforce = 60
+
+/obj/item/toy/beach_ball/syndicate/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
+ if(ishuman(thrower))
+ throwforce = 0
+ . = ..()
+
+/obj/item/toy/beach_ball/syndicate/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+ . = ..()
+ if(istype(hit_atom, /turf/closed/wall) && throwforce > 0)
+ var/turf/closed/wall/W = hit_atom
+ W.dismantle_wall()
+
diff --git a/modular_splurt/code/modules/antagonists/slaver/slaver.dm b/modular_splurt/code/modules/antagonists/slaver/slaver.dm
index 610e12b74d74..7638cc11f359 100644
--- a/modular_splurt/code/modules/antagonists/slaver/slaver.dm
+++ b/modular_splurt/code/modules/antagonists/slaver/slaver.dm
@@ -44,6 +44,7 @@ GLOBAL_LIST_INIT(slavers_ransom_values, list(
"Scientist" = SLAVER_STANDARD_RANSOM,
"Roboticist" = SLAVER_STANDARD_RANSOM,
"Prisoner" = SLAVER_STANDARD_RANSOM,
+ "Stowaway" = SLAVER_STANDARD_RANSOM,
"Curator" = SLAVER_STANDARD_RANSOM,
"Lawyer" = SLAVER_STANDARD_RANSOM,
"Chaplain" = SLAVER_STANDARD_RANSOM,
diff --git a/modular_splurt/code/modules/client/loadout/accessory.dm b/modular_splurt/code/modules/client/loadout/accessory.dm
new file mode 100644
index 000000000000..e2d2e6d8be27
--- /dev/null
+++ b/modular_splurt/code/modules/client/loadout/accessory.dm
@@ -0,0 +1,11 @@
+/datum/gear/accessory/shortcrop
+ name = "Short sleeved croptop"
+ path = /obj/item/clothing/accessory/shortcrop
+
+/datum/gear/accessory/longcrop
+ name = "Long sleeved croptop"
+ path = /obj/item/clothing/accessory/longcrop
+
+/datum/gear/accessory/formalcrop
+ name = "Formal croptop"
+ path = /obj/item/clothing/accessory/formalcrop
diff --git a/modular_splurt/code/modules/client/loadout/shoes.dm b/modular_splurt/code/modules/client/loadout/shoes.dm
index d10f8234446d..b75b1cd62115 100644
--- a/modular_splurt/code/modules/client/loadout/shoes.dm
+++ b/modular_splurt/code/modules/client/loadout/shoes.dm
@@ -2,7 +2,7 @@
/datum/gear/shoes/footwraps
name = "Cloth Footwraps"
path= /obj/item/clothing/shoes/footwraps
-
+
/datum/gear/shoes/invisiboots
name = "Invisifiber Footwraps"
path= /obj/item/clothing/shoes/invisiboots
@@ -36,3 +36,7 @@
/datum/gear/shoes/puttee
restricted_roles = list("Security Officer", "Warden", "Head of Security", "Brig Physician", "Blueshield")
+
+/datum/gear/shoes/highheel_sandals
+ name = "High-heel Sandals"
+ path = /obj/item/clothing/shoes/highheel_sandals
diff --git a/modular_splurt/code/modules/client/loadout/uniform.dm b/modular_splurt/code/modules/client/loadout/uniform.dm
index 29d91596d727..1333a8c76496 100644
--- a/modular_splurt/code/modules/client/loadout/uniform.dm
+++ b/modular_splurt/code/modules/client/loadout/uniform.dm
@@ -146,3 +146,15 @@
path = /obj/item/clothing/under/goner/fake/poly
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
loadout_initial_colors = list("#E6E6E6")
+
+/datum/gear/uniform/leia_outfit
+ name = "Princess Leia Outfit"
+ path = /obj/item/clothing/under/misc/leia_outfit
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_initial_colors = list("#C61818", "#D4AF37")
+
+/datum/gear/uniform/performer/polychromic
+ name = "Polychromic performers one piece"
+ path = /obj/item/clothing/under/performer/polychromic
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_initial_colors = list("#ffffff")
diff --git a/modular_splurt/code/modules/client/preferences.dm b/modular_splurt/code/modules/client/preferences.dm
index 683afd00cfd0..13b9bc882bb7 100644
--- a/modular_splurt/code/modules/client/preferences.dm
+++ b/modular_splurt/code/modules/client/preferences.dm
@@ -1,12 +1,18 @@
/datum/preferences
+ max_save_slots = DEFAULT_SAVE_SLOTS
var/unholypref = "No" //Goin 2 hell fo dis one
-
var/list/gfluid_blacklist = list() //Stuff you don't want people to cum into you
/datum/preferences/New(client/C)
if(!GLOB.genital_fluids_list)
build_genital_fluids_list() //I DON'T KNOW where else to put it, ok??
+ //Extra saves for donators
+ max_save_slots = CONFIG_GET(number/base_save_slots)
+ if(istype(C))
+ var/extra_slots = (IS_CKEY_DONATOR_GROUP(C.key, DONATOR_GROUP_TIER_1) + IS_CKEY_DONATOR_GROUP(C.key, DONATOR_GROUP_TIER_2) + IS_CKEY_DONATOR_GROUP(C.key, DONATOR_GROUP_TIER_3)) * 10
+ max_save_slots += extra_slots
+
. = ..()
/proc/build_genital_fluids_list()
diff --git a/modular_splurt/code/modules/clothing/shoes/miscellaneous.dm b/modular_splurt/code/modules/clothing/shoes/miscellaneous.dm
index f5a8fac73506..d87fd74ce723 100644
--- a/modular_splurt/code/modules/clothing/shoes/miscellaneous.dm
+++ b/modular_splurt/code/modules/clothing/shoes/miscellaneous.dm
@@ -84,3 +84,15 @@
build_path = /obj/item/clothing/shoes/jackboots/cbrn/mopp
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/obj/item/clothing/shoes/highheel_sandals
+ name = "high-heel sandals"
+ desc = "A pair of high-heel sandals"
+ icon = 'modular_splurt/icons/obj/clothing/shoes.dmi'
+ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/shoes.dmi'
+ anthro_mob_worn_overlay = 'modular_splurt/icons/mob/clothing/shoes_digi.dmi'
+ icon_state = "highheel_sandals"
+
+/obj/item/clothing/shoes/highheel_sandals/Initialize()
+ . = ..()
+ AddComponent(/datum/component/squeak, list('modular_splurt/sound/effects/footstep/highheel1.ogg' = 1,'modular_splurt/sound/effects/footstep/highheel2.ogg' = 1), 20)
diff --git a/modular_splurt/code/modules/clothing/under/accessories.dm b/modular_splurt/code/modules/clothing/under/accessories.dm
new file mode 100644
index 000000000000..eafad46702e4
--- /dev/null
+++ b/modular_splurt/code/modules/clothing/under/accessories.dm
@@ -0,0 +1,26 @@
+/obj/item/clothing/accessory/shortcrop
+ name = "short sleeved crop top"
+ desc = "A short sleeved crop top, for when it gets too hot."
+ icon = 'modular_splurt/icons/obj/clothing/accessories.dmi'
+ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/accessories.dmi'
+ icon_state = "shortcrop"
+ item_state = "shortcrop"
+ minimize_when_attached = FALSE
+
+/obj/item/clothing/accessory/longcrop
+ name = "long sleeved crop top"
+ desc = "A long sleeved crop top, now with long sleeves!"
+ icon = 'modular_splurt/icons/obj/clothing/accessories.dmi'
+ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/accessories.dmi'
+ icon_state = "longcrop"
+ item_state = "longcrop"
+ minimize_when_attached = FALSE
+
+/obj/item/clothing/accessory/formalcrop
+ name = "formal crop top"
+ desc = "A 'formal' crop top. Not sure how this'll fool anyone."
+ icon = 'modular_splurt/icons/obj/clothing/accessories.dmi'
+ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/accessories.dmi'
+ icon_state = "formalcrop"
+ item_state = "formalcrop"
+ minimize_when_attached = FALSE
diff --git a/modular_splurt/code/modules/clothing/under/miscellaneous.dm b/modular_splurt/code/modules/clothing/under/miscellaneous.dm
index 3f6b80626019..990dedb2a8bf 100644
--- a/modular_splurt/code/modules/clothing/under/miscellaneous.dm
+++ b/modular_splurt/code/modules/clothing/under/miscellaneous.dm
@@ -311,3 +311,25 @@
/obj/item/clothing/under/misc/gear_harness
body_parts_covered = NONE
+/obj/item/clothing/under/misc/leia_outfit
+ name = "space princess outfit"
+ desc = "Chain for your Master's erotic asphyxiation not included."
+ icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi'
+ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi'
+ icon_state = "leia"
+ can_adjust = FALSE
+ mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
+
+/obj/item/clothing/under/misc/leia_outfit/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, list("#C61818", "#D4AF37"), 2)
+
+/obj/item/clothing/under/performer/polychromic
+ name = "polychromic performers one piece"
+ icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi'
+ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi'
+ icon_state = "poly_performer"
+
+/obj/item/clothing/under/performer/polychromic/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, list("#ffffff"), 1)
diff --git a/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm b/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm
index c388d8fe3c9f..813e34f04180 100644
--- a/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm
+++ b/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm
@@ -290,3 +290,14 @@
/datum/reagent/consumable/milkshake_base = 1,
/datum/reagent/consumable/watermelonjuice = 1
)
+
+/datum/chemical_reaction/ionstorm
+ name = "Ion Storm"
+ id = /datum/reagent/consumable/ethanol/ionstorm
+ results = list(/datum/reagent/consumable/ethanol/ionstorm = 10)
+ required_reagents = list(
+ /datum/reagent/consumable/ethanol/quadruple_sec = 5,
+ /datum/reagent/consumable/ethanol/bastion_bourbon = 2
+ )
+ mix_message = "The lights flicker for a moment..."
+ mix_sound = 'sound/weapons/taser.ogg'
diff --git a/modular_splurt/code/modules/jobs/job_types/stowaway.dm b/modular_splurt/code/modules/jobs/job_types/stowaway.dm
new file mode 100644
index 000000000000..76056726d0b1
--- /dev/null
+++ b/modular_splurt/code/modules/jobs/job_types/stowaway.dm
@@ -0,0 +1,63 @@
+GLOBAL_LIST_EMPTY(roundstart_stowaway)
+
+/datum/job/stowaway
+ title = "Stowaway"
+ flag = STOWAWAY
+ department_head = NONE
+ department_flag = NONE
+ paycheck = 0
+ paycheck_department = null
+ faction = "Station"
+ total_positions = 0
+ spawn_positions = 3
+ threat = 0.5
+ supervisors = "no one"
+ minimal_player_age = 3
+ exp_requirements = 100
+ exp_type = EXP_TYPE_CREW
+ considered_combat_role = FALSE
+ custom_spawn_text = "You are a stowaway. You should NOT be starting fights or attempting to fight security for any reason. At best you should be actively on the run from them as you are on the station illegally. "
+ outfit = /datum/outfit/job/stowaway
+ plasma_outfit = /datum/outfit/plasmaman/stowaway
+ display_order = JOB_DISPLAY_ORDER_STOWAWAY
+
+/datum/job/stowaway/get_latejoin_spawn_point()
+ return get_roundstart_spawn_point()
+
+/datum/outfit/job/stowaway/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
+ ..()
+ var/suited = !preference_source || preference_source.prefs.jumpsuit_style == PREF_SUIT
+ uniform = suited ? /obj/item/clothing/under/color/random : /obj/item/clothing/under/color/jumpskirt/random
+
+/obj/item/card/id/stowaway_stolen
+ name = "unknown ID card"
+ desc = "An strange-looking old ID card."
+ icon_state = "data_1"
+ uses_overlays = FALSE
+ registered_name = null
+ assignment = null
+ access = list(ACCESS_MAINT_TUNNELS)
+ bank_support = ID_NO_BANK_ACCOUNT
+
+/datum/outfit/job/stowaway
+ name = "Stowaway"
+ jobtype = /datum/job/stowaway
+ uniform = /obj/item/clothing/under/color/random
+ shoes = /obj/item/clothing/shoes/sneakers/black
+ id = /obj/item/card/id/stowaway_stolen
+ ears = null
+ belt = /obj/item/storage/belt/utility/atmostech
+ gloves = /obj/item/clothing/gloves/color/yellow
+ r_pocket = /obj/item/radio
+ l_pocket = /obj/item/flashlight
+
+/datum/outfit/plasmaman/stowaway
+ name = "Stowaway Plasmaman"
+ shoes = /obj/item/clothing/shoes/sneakers/black
+ id = /obj/item/card/id/stowaway_stolen
+ ears = null
+ belt = /obj/item/storage/belt/utility/full
+ gloves = /obj/item/clothing/gloves/color/yellow
+ r_pocket = /obj/item/radio
+ l_pocket = /obj/item/flashlight
+
diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/tails.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/tails.dm
index 4bc73fc7247b..7f9eff453e46 100644
--- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/tails.dm
+++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/tails.dm
@@ -249,6 +249,24 @@
icon = 'modular_splurt/icons/mob/mam_tails.dmi'
matrixed_sections = MATRIX_RED_GREEN
+/datum/sprite_accessory/tails/mam_tails/snakelarge
+ name = "Snake Tail (Large)"
+ icon_state = "snakelarge"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/64_mam_tails.dmi'
+ dimension_x = 64
+ center = TRUE
+ matrixed_sections = MATRIX_RED_GREEN
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/snakelarge
+ name = "Snake Tail (Large)"
+ icon_state = "snakelarge"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/64_mam_tails.dmi'
+ dimension_x = 64
+ center = TRUE
+ matrixed_sections = MATRIX_RED_GREEN
+
//Lizard tails
/datum/sprite_accessory/tails/lizard/tailmaw
name = "Tailmaw"
@@ -306,6 +324,24 @@
icon = 'modular_splurt/icons/mob/mam_tails.dmi'
matrixed_sections = MATRIX_RED_GREEN
+/datum/sprite_accessory/tails/lizard/snakelarge
+ name = "Snake Tail (Large)"
+ icon_state = "snakelarge"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/64_mam_tails.dmi'
+ dimension_x = 64
+ center = TRUE
+ matrixed_sections = MATRIX_RED_GREEN
+
+/datum/sprite_accessory/tails_animated/lizard/snakelarge
+ name = "Snake Tail (Large)"
+ icon_state = "snakelarge"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/64_mam_tails.dmi'
+ dimension_x = 64
+ center = TRUE
+ matrixed_sections = MATRIX_RED_GREEN
+
//Human tails
/datum/sprite_accessory/tails/human/deer
name = "Deer"
@@ -400,3 +436,21 @@
color_src = MATRIXED
icon = 'modular_splurt/icons/mob/mam_tails.dmi'
matrixed_sections = MATRIX_RED_GREEN
+
+/datum/sprite_accessory/tails/human/snakelarge
+ name = "Snake Tail (Large)"
+ icon_state = "snakelarge"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/64_mam_tails.dmi'
+ dimension_x = 64
+ center = TRUE
+ matrixed_sections = MATRIX_RED_GREEN
+
+/datum/sprite_accessory/tails_animated/human/snakelarge
+ name = "Snake Tail (Large)"
+ icon_state = "snakelarge"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/64_mam_tails.dmi'
+ dimension_x = 64
+ center = TRUE
+ matrixed_sections = MATRIX_RED_GREEN
diff --git a/modular_splurt/code/modules/mob/living/carbon/human/emote.dm b/modular_splurt/code/modules/mob/living/carbon/human/emote.dm
new file mode 100644
index 000000000000..8877e15eaba0
--- /dev/null
+++ b/modular_splurt/code/modules/mob/living/carbon/human/emote.dm
@@ -0,0 +1,12 @@
+/datum/emote/sound/human/huh
+ key = "huh"
+ key_third_person = "huh's"
+ message = "seems confused."
+ sound = 'modular_splurt/sound/voice/huh.ogg'
+
+/datum/emote/sound/human/whine
+ key = "whine"
+ key_third_person = "whines"
+ message = "whines."
+ sound = 'modular_splurt/sound/voice/whine.ogg'
+
diff --git a/modular_splurt/code/modules/mob/living/login.dm b/modular_splurt/code/modules/mob/living/login.dm
new file mode 100644
index 000000000000..24246535343f
--- /dev/null
+++ b/modular_splurt/code/modules/mob/living/login.dm
@@ -0,0 +1,10 @@
+/mob/living/Login()
+ . = ..()
+
+ // Check if mob is in SSD list
+ if(src in GLOB.ssd_mob_list)
+ // Remove from SSD list
+ GLOB.ssd_mob_list -= src
+
+ // Log mob SSD removal
+ log_game("[src] was removed from the SSD list.")
diff --git a/modular_splurt/code/modules/mob/living/logout.dm b/modular_splurt/code/modules/mob/living/logout.dm
new file mode 100644
index 000000000000..e640cfbf1842
--- /dev/null
+++ b/modular_splurt/code/modules/mob/living/logout.dm
@@ -0,0 +1,25 @@
+/mob/living/Logout()
+ . = ..()
+
+ // Check for BORIS AI borgs
+ if(src in GLOB.available_ai_shells)
+ return
+
+ // Check for the AI
+ if(isAI(src))
+ return
+
+ // Check for VR mob
+ if(src.GetComponent(/datum/component/virtual_reality))
+ return
+
+ // Check if mob is in a VR pod
+ // This is not an ideal solution
+ if(istype(src.loc, /obj/machinery/vr_sleeper))
+ return
+
+ // Add to SSD list
+ GLOB.ssd_mob_list |= src
+
+ // Log mob SSD status
+ log_game("[src] was added to the SSD list.")
diff --git a/modular_splurt/code/modules/mob/living/silicon/robot/robot.dm b/modular_splurt/code/modules/mob/living/silicon/robot/robot.dm
index fa00e0ff449b..65ece9be12b3 100644
--- a/modular_splurt/code/modules/mob/living/silicon/robot/robot.dm
+++ b/modular_splurt/code/modules/mob/living/silicon/robot/robot.dm
@@ -1,7 +1,7 @@
//Main code edits
/// Allows "cyborg" players to change gender at will - Modularised here
// FUNCTION MOVED TO living.dm AS PROC
-/mob/living/silicon/robot/verb/toggle_gender()
+/mob/living/silicon/robot/toggle_gender()
set name = "Set Gender"
set desc = "Allows you to set your gender."
set category = "Robot Commands"
diff --git a/modular_splurt/code/modules/mob/splurt_emotes.dm b/modular_splurt/code/modules/mob/splurt_emotes.dm
index 7dc25f9c5dc4..b9d3412e5079 100644
--- a/modular_splurt/code/modules/mob/splurt_emotes.dm
+++ b/modular_splurt/code/modules/mob/splurt_emotes.dm
@@ -758,6 +758,19 @@
user.nextsoundemote = world.time + 7
playsound(user, 'modular_splurt/sound/voice/weh_s.ogg', 50, 1, -1)
+/datum/emote/living/waa
+ key = "waa"
+ key_third_person = "waas"
+ message = "let out a waa!"
+
+/datum/emote/living/waa/run_emote(mob/user, params, type_override, intentional)
+ if(!(. = ..()))
+ return
+ if(user.nextsoundemote >= world.time)
+ return
+ user.nextsoundemote = world.time + 10
+ playsound(user, 'modular_splurt/sound/voice/waa.ogg', 50, 1, -1)
+
/datum/emote/living/mlem
key = "mlem"
key_third_person = "mlems"
diff --git a/modular_splurt/code/modules/photography/photos/album.dm b/modular_splurt/code/modules/photography/photos/album.dm
new file mode 100644
index 000000000000..f7795a670e23
--- /dev/null
+++ b/modular_splurt/code/modules/photography/photos/album.dm
@@ -0,0 +1,27 @@
+/obj/item/storage/photo_album
+ desc = "A big book used to store photos and mementos."
+ item_state = "album"
+ lefthand_file = 'modular_splurt/icons/mob/inhands/misc/books_lefthand.dmi'
+ righthand_file = 'modular_splurt/icons/mob/inhands/misc/books_righthand.dmi'
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/storage/photo_album/HoS
+ name = "photo album (Head of Security)"
+
+/obj/item/storage/photo_album/RD
+ name = "photo album (Research Director)"
+
+/obj/item/storage/photo_album/HoP
+ name = "photo album (Head of Personnel)"
+
+/obj/item/storage/photo_album/Captain
+ name = "photo album (Captain)"
+
+/obj/item/storage/photo_album/CMO
+ name = "photo album (Chief Medical Officer)"
+
+/obj/item/storage/photo_album/QM
+ name = "photo album (Quartermaster)"
+
+/obj/item/storage/photo_album/CE
+ name = "photo album (Chief Engineer)"
diff --git a/modular_splurt/code/modules/photography/photos/photo.dm b/modular_splurt/code/modules/photography/photos/photo.dm
new file mode 100644
index 000000000000..3eb0f707529f
--- /dev/null
+++ b/modular_splurt/code/modules/photography/photos/photo.dm
@@ -0,0 +1,3 @@
+/obj/item/photo/old
+ icon = 'modular_splurt/icons/obj/items_and_weapons.dmi'
+ icon_state = "photo_old"
diff --git a/modular_splurt/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/modular_splurt/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 0b7fc6f66205..cbbb817aa42c 100644
--- a/modular_splurt/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/modular_splurt/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -358,3 +358,27 @@
nT.Insert(M)
T.moveToNullspace()//To valhalla
to_chat(M, span_big_warning("Your tongue feels... weally fwuffy!!"))
+
+/datum/reagent/consumable/ethanol/ionstorm
+ name = "Ion Storm"
+ description = "A highly chaotic mixture that looks like it may react violently at any moment, but is surprisingly stable"
+ color = "#3fd2ff"
+ taste_description = "a scorching taste of strong alcohol and good brew going down your throat, making you feel warm inside"
+ glass_icon = 'modular_splurt/icons/obj/drinks.dmi'
+ glass_icon_state = "ionstorm"
+ glass_name = "glass of Ion Storm"
+ glass_desc = "You're not sure how this mixture is stable or even if it's drinkable, but it does remind you of a hot cup of apple cider on a cold winter morning"
+ pH = 6.5
+ value = REAGENT_VALUE_UNCOMMON
+ boozepwr = 30
+ quality = DRINK_FANTASTIC
+
+/datum/reagent/consumable/ethanol/ionstorm/on_mob_life(mob/living/carbon/C)
+ C.adjustBruteLoss(-0.5,0)
+ C.adjustFireLoss(-0.5,0)
+ if (C.reagents.has_reagent(/datum/reagent/medicine/epinephrine))
+ C.adjustToxLoss(0.25)
+ else
+ C.adjustOxyLoss(0.25)
+ . = 1
+ return ..()
diff --git a/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index 07917089d2c8..972cd42ba998 100644
--- a/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -1,19 +1,62 @@
+#define QUIRK_ESTROUS_ACTIVE /datum/quirk/estrous_active
+
+// Hexacrocin
/datum/reagent/drug/aphrodisiacplus/overdose_start(mob/living/M)
+ . = ..()
+
+ // Check for mob with client
+ if(!(istype(M) && M.client))
+ return
+
+ // Check pref for arousable
+ if(!M.client?.prefs.arousable)
+ // Log interaction and return
+ M.log_message("overdosed on [src], but ignored it due to arousal preference.", LOG_EMOTE)
+ return
+
+ // Check pref for aphro
+ if(M.client?.prefs.cit_toggles & NO_APHRO)
+ // Log interaction and return
+ M.log_message("overdosed on [src], but ignored it due to aphrodisiac preference.", LOG_EMOTE)
+ return
+
// Check for pre-existing heat trait
- if(!HAS_TRAIT(M, TRAIT_ESTROUS_ACTIVE))
- // Check client preferences
- if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO))
- // Add quirk
- M.add_quirk(/datum/quirk/estrous_active, APHRO_TRAIT)
+ if(!M.has_quirk(QUIRK_ESTROUS_ACTIVE))
+ // Add quirk
+ M.add_quirk(QUIRK_ESTROUS_ACTIVE, APHRO_TRAIT)
- // Chat message is handled by the quirk
+ // Chat message is handled by the quirk
- // Log interaction
- M.log_message("Given the In Estrous quirk by hexacrocin overdose.", LOG_EMOTE)
+ // Log interaction
+ M.log_message("was given the In Estrous quirk by [src] overdose.", LOG_EMOTE)
// Return normally
. = ..()
+// Hexacamphor
+/datum/reagent/drug/anaphrodisiacplus/overdose_start(mob/living/M)
+ . = ..()
+
+ // Check for mob with client
+ if(!(istype(M) && M.client))
+ return
+
+ // Check pref for arousable
+ if(!M.client?.prefs.arousable)
+ // Log interaction and return
+ M.log_message("overdosed on [src], but ignored it due to arousal preference.", LOG_EMOTE)
+ return
+
+ // Check for pre-existing heat trait
+ if(M.has_quirk(QUIRK_ESTROUS_ACTIVE))
+ // Remove quirk
+ M.remove_quirk(QUIRK_ESTROUS_ACTIVE)
+
+ // Chat message is handled by the quirk
+
+ // Log interaction
+ M.log_message("lost the In Estrous quirk due to [src] overdose.", LOG_EMOTE)
+
//Own stuff
/datum/reagent/drug/maint/tar
name = "Maintenance Tar"
@@ -81,3 +124,5 @@
var/temp = holder ? holder.chem_temp : T20C
T.atmos_spawn_air("copium=[volume];TEMP=[temp]")
return
+
+#undef QUIRK_ESTROUS_ACTIVE
diff --git a/modular_splurt/code/modules/research/designs/misc_designs.dm b/modular_splurt/code/modules/research/designs/misc_designs.dm
new file mode 100644
index 000000000000..e6105fd3f355
--- /dev/null
+++ b/modular_splurt/code/modules/research/designs/misc_designs.dm
@@ -0,0 +1,2 @@
+/datum/design/light_replacer_blue/New()
+ departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE
diff --git a/modular_splurt/code/modules/research/techweb/nodes/nanites_nodes.dm b/modular_splurt/code/modules/research/techweb/nodes/nanites_nodes.dm
new file mode 100644
index 000000000000..a662a03f7fc9
--- /dev/null
+++ b/modular_splurt/code/modules/research/techweb/nodes/nanites_nodes.dm
@@ -0,0 +1,12 @@
+// Harmful nanites node
+/datum/techweb_node/nanite_hazard/New()
+ // Define designs to remove
+ var/list/rem_designs = list(
+ "spreading_nanites"
+ )
+
+ // Remove designs from the list
+ LAZYREMOVE(design_ids, rem_designs)
+
+ // Return
+ . = ..()
diff --git a/modular_splurt/code/modules/research/techweb/nodes/robotic_nodes.dm b/modular_splurt/code/modules/research/techweb/nodes/robotic_nodes.dm
index f90fac955d5d..92564858131b 100644
--- a/modular_splurt/code/modules/research/techweb/nodes/robotic_nodes.dm
+++ b/modular_splurt/code/modules/research/techweb/nodes/robotic_nodes.dm
@@ -1,7 +1,7 @@
/datum/techweb_node/neural_programming
design_ids = list("impant_radio")
-/datum/techweb_node/ai/Initialize()
+/datum/techweb_node/ai/New()
var/extra_designs = list(
"slut_module",
"shebang_module",
diff --git a/modular_splurt/code/modules/uplink/uplink_items/uplink_devices.dm b/modular_splurt/code/modules/uplink/uplink_items/uplink_devices.dm
new file mode 100644
index 000000000000..fe3de42d03d0
--- /dev/null
+++ b/modular_splurt/code/modules/uplink/uplink_items/uplink_devices.dm
@@ -0,0 +1,6 @@
+/datum/uplink_item/device_tools/syndicate_ball
+ name = "Syndicate Beach Ball"
+ item = /obj/item/toy/beach_ball/syndicate
+ desc = "A beach ball, it reacts when a vibrator is inserted inside of it. Watch out!"
+ cost = 3
+
diff --git a/modular_splurt/code/modules/vending/clothesmate.dm b/modular_splurt/code/modules/vending/clothesmate.dm
index d7d67e401156..d6dee6e947c0 100644
--- a/modular_splurt/code/modules/vending/clothesmate.dm
+++ b/modular_splurt/code/modules/vending/clothesmate.dm
@@ -16,7 +16,12 @@
/obj/item/clothing/under/officesexy = 3,
/obj/item/clothing/suit/toggle/tunnelfox = 3,
/obj/item/clothing/under/performer = 2,
- /obj/item/clothing/under/bluedress = 3
+ /obj/item/clothing/under/bluedress = 3,
+ /obj/item/clothing/accessory/shortcrop = 3,
+ /obj/item/clothing/accessory/longcrop = 3,
+ /obj/item/clothing/accessory/formalcrop = 3,
+ /obj/item/clothing/under/misc/leia_outfit = 2,
+ /obj/item/clothing/under/performer/polychromic = 2
)
var/list/extra_contraband = list(
/obj/item/clothing/under/rank/civilian/lawyer/galaxy_red = 3,
diff --git a/modular_splurt/code/modules/vending/kinkmate.dm b/modular_splurt/code/modules/vending/kinkmate.dm
index 1d2f3c5a94f3..53b6abb542bb 100644
--- a/modular_splurt/code/modules/vending/kinkmate.dm
+++ b/modular_splurt/code/modules/vending/kinkmate.dm
@@ -29,7 +29,8 @@
/obj/item/restraints/bondage_rope = 5,
/obj/item/clothing/under/domina = 5,
/obj/item/clothing/under/performer = 3,
- /obj/item/clothing/shoes/invisiboots = 10 // Added here to go with the Gear Harness
+ /obj/item/clothing/shoes/invisiboots = 10, // Added here to go with the Gear Harness
+ /obj/item/clothing/shoes/highheel_sandals = 3
)
var/list/extra_contraband = list(
//Lewd-Clothes
diff --git a/modular_splurt/icons/misc/beach.dmi b/modular_splurt/icons/misc/beach.dmi
new file mode 100644
index 000000000000..0bc186df19c5
Binary files /dev/null and b/modular_splurt/icons/misc/beach.dmi differ
diff --git a/modular_splurt/icons/mob/64_mam_tails.dmi b/modular_splurt/icons/mob/64_mam_tails.dmi
index 115d05143612..71249b8896b2 100644
Binary files a/modular_splurt/icons/mob/64_mam_tails.dmi and b/modular_splurt/icons/mob/64_mam_tails.dmi differ
diff --git a/modular_splurt/icons/mob/clothing/accessories.dmi b/modular_splurt/icons/mob/clothing/accessories.dmi
new file mode 100644
index 000000000000..024e1d544325
Binary files /dev/null and b/modular_splurt/icons/mob/clothing/accessories.dmi differ
diff --git a/modular_splurt/icons/mob/clothing/current_head_accessories.dmi b/modular_splurt/icons/mob/clothing/current_head_accessories.dmi
new file mode 100644
index 000000000000..6d189aeba5e9
Binary files /dev/null and b/modular_splurt/icons/mob/clothing/current_head_accessories.dmi differ
diff --git a/modular_splurt/icons/mob/clothing/shoes.dmi b/modular_splurt/icons/mob/clothing/shoes.dmi
index 0956dfbdd1dd..005bdc7b7d92 100644
Binary files a/modular_splurt/icons/mob/clothing/shoes.dmi and b/modular_splurt/icons/mob/clothing/shoes.dmi differ
diff --git a/modular_splurt/icons/mob/clothing/shoes_digi.dmi b/modular_splurt/icons/mob/clothing/shoes_digi.dmi
index a37e1178f13b..755d9c92e9e7 100644
Binary files a/modular_splurt/icons/mob/clothing/shoes_digi.dmi and b/modular_splurt/icons/mob/clothing/shoes_digi.dmi differ
diff --git a/modular_splurt/icons/mob/clothing/uniform.dmi b/modular_splurt/icons/mob/clothing/uniform.dmi
index 1555bade4dda..dccf18cc4379 100644
Binary files a/modular_splurt/icons/mob/clothing/uniform.dmi and b/modular_splurt/icons/mob/clothing/uniform.dmi differ
diff --git a/modular_splurt/icons/mob/inhands/misc/books_lefthand.dmi b/modular_splurt/icons/mob/inhands/misc/books_lefthand.dmi
new file mode 100644
index 000000000000..cd59fe6d0316
Binary files /dev/null and b/modular_splurt/icons/mob/inhands/misc/books_lefthand.dmi differ
diff --git a/modular_splurt/icons/mob/inhands/misc/books_righthand.dmi b/modular_splurt/icons/mob/inhands/misc/books_righthand.dmi
new file mode 100644
index 000000000000..a2fc3cc73b1d
Binary files /dev/null and b/modular_splurt/icons/mob/inhands/misc/books_righthand.dmi differ
diff --git a/modular_splurt/icons/mob/landmarks.dmi b/modular_splurt/icons/mob/landmarks.dmi
index 7ee3942be1bb..5c596e0c95a3 100644
Binary files a/modular_splurt/icons/mob/landmarks.dmi and b/modular_splurt/icons/mob/landmarks.dmi differ
diff --git a/modular_splurt/icons/obj/clothing/accessories.dmi b/modular_splurt/icons/obj/clothing/accessories.dmi
new file mode 100644
index 000000000000..c15501ea74a3
Binary files /dev/null and b/modular_splurt/icons/obj/clothing/accessories.dmi differ
diff --git a/modular_splurt/icons/obj/clothing/shoes.dmi b/modular_splurt/icons/obj/clothing/shoes.dmi
index 71b62b42bcc0..311174d23da4 100644
Binary files a/modular_splurt/icons/obj/clothing/shoes.dmi and b/modular_splurt/icons/obj/clothing/shoes.dmi differ
diff --git a/modular_splurt/icons/obj/clothing/uniforms.dmi b/modular_splurt/icons/obj/clothing/uniforms.dmi
index 3880f77532f3..f6648a1fac84 100644
Binary files a/modular_splurt/icons/obj/clothing/uniforms.dmi and b/modular_splurt/icons/obj/clothing/uniforms.dmi differ
diff --git a/modular_splurt/icons/obj/drinks.dmi b/modular_splurt/icons/obj/drinks.dmi
index 4ea6784f4e1b..55d640912e94 100644
Binary files a/modular_splurt/icons/obj/drinks.dmi and b/modular_splurt/icons/obj/drinks.dmi differ
diff --git a/modular_splurt/icons/obj/items_and_weapons.dmi b/modular_splurt/icons/obj/items_and_weapons.dmi
index 0dd0e88c6a9e..a5b3d02d5b96 100644
Binary files a/modular_splurt/icons/obj/items_and_weapons.dmi and b/modular_splurt/icons/obj/items_and_weapons.dmi differ
diff --git a/modular_splurt/sound/voice/huh.ogg b/modular_splurt/sound/voice/huh.ogg
new file mode 100644
index 000000000000..accf4cab3c7d
Binary files /dev/null and b/modular_splurt/sound/voice/huh.ogg differ
diff --git a/modular_splurt/sound/voice/waa.ogg b/modular_splurt/sound/voice/waa.ogg
new file mode 100644
index 000000000000..9e5ba7866f24
Binary files /dev/null and b/modular_splurt/sound/voice/waa.ogg differ
diff --git a/modular_splurt/sound/voice/whine.ogg b/modular_splurt/sound/voice/whine.ogg
new file mode 100644
index 000000000000..2d2f825a83ac
Binary files /dev/null and b/modular_splurt/sound/voice/whine.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 2ea84c02e08c..e54661c7c128 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -108,6 +108,7 @@
#include "code\__DEFINES\rust_g.dm"
#include "code\__DEFINES\rust_g_overrides.dm"
#include "code\__DEFINES\say.dm"
+#include "code\__DEFINES\screentips.dm"
#include "code\__DEFINES\security_levels.dm"
#include "code\__DEFINES\shuttles.dm"
#include "code\__DEFINES\sight.dm"
@@ -157,6 +158,8 @@
#include "code\__DEFINES\dcs\helpers.dm"
#include "code\__DEFINES\dcs\signals.dm"
#include "code\__DEFINES\dcs\signals\signals_movable.dm"
+#include "code\__DEFINES\dcs\signals\signals_painting.dm"
+#include "code\__DEFINES\dcs\signals\signals_screentips.dm"
#include "code\__DEFINES\dcs\signals\signals_subsystem.dm"
#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movement.dm"
#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_living.dm"
@@ -211,6 +214,7 @@
#include "code\__HELPERS\reagents.dm"
#include "code\__HELPERS\roundend.dm"
#include "code\__HELPERS\sanitize_values.dm"
+#include "code\__HELPERS\screentips.dm"
#include "code\__HELPERS\shell.dm"
#include "code\__HELPERS\stat_tracking.dm"
#include "code\__HELPERS\text.dm"
@@ -232,6 +236,7 @@
#include "code\__HELPERS\sorts\MergeSort.dm"
#include "code\__HELPERS\sorts\TimSort.dm"
#include "code\__SANDCODE\DEFINES\chat.dm"
+#include "code\__SANDCODE\DEFINES\DNA.dm"
#include "code\__SANDCODE\DEFINES\language.dm"
#include "code\__SANDCODE\DEFINES\lewd.dm"
#include "code\__SANDCODE\DEFINES\loadout.dm"
@@ -247,6 +252,7 @@
#include "code\__SANDCODE\DEFINES\subsystems.dm"
#include "code\__SANDCODE\DEFINES\traits.dm"
#include "code\__SANDCODE\DEFINES\wires.dm"
+#include "code\__SANDCODE\DEFINES\dcs\signals\signals_mob_main.dm"
#include "code\__SANDCODE\DEFINES\dcs\signals\sizecode.dm"
#include "code\__SANDCODE\HELPERS\sizecode.dm"
#include "code\__SPLURTCODE\DEFINES\access.dm"
@@ -262,6 +268,7 @@
#include "code\__SPLURTCODE\DEFINES\lewd.dm"
#include "code\__SPLURTCODE\DEFINES\login.dm"
#include "code\__SPLURTCODE\DEFINES\mobs.dm"
+#include "code\__SPLURTCODE\DEFINES\preferences.dm"
#include "code\__SPLURTCODE\DEFINES\pregnancy.dm"
#include "code\__SPLURTCODE\DEFINES\quirks.dm"
#include "code\__SPLURTCODE\DEFINES\radiation.dm"
@@ -274,8 +281,6 @@
#include "code\__SPLURTCODE\DEFINES\traits.dm"
#include "code\__SPLURTCODE\DEFINES\arousal\genitals.dm"
#include "code\__SPLURTCODE\DEFINES\dcs\signals.dm"
-#include "code\__SPLURTCODE\DEFINES\zeros\species.dm"
-#include "code\__SPLURTCODE\DEFINES\zeros\traits.dm"
#include "code\_globalvars\admin.dm"
#include "code\_globalvars\bitfields.dm"
#include "code\_globalvars\configuration.dm"
@@ -761,6 +766,10 @@
#include "code\datums\elements\ventcrawling.dm"
#include "code\datums\elements\weather_listener.dm"
#include "code\datums\elements\wuv.dm"
+#include "code\datums\elements\screentips\contextual_screentip_bare_hands.dm"
+#include "code\datums\elements\screentips\contextual_screentip_item_typechecks.dm"
+#include "code\datums\elements\screentips\contextual_screentip_sharpness.dm"
+#include "code\datums\elements\screentips\contextual_screentip_tools.dm"
#include "code\datums\helper_datums\events.dm"
#include "code\datums\helper_datums\getrev.dm"
#include "code\datums\helper_datums\icon_snapshot.dm"
@@ -816,6 +825,8 @@
#include "code\datums\ruins\lavaland.dm"
#include "code\datums\ruins\space.dm"
#include "code\datums\ruins\station.dm"
+#include "code\datums\screentips\atom_context.dm"
+#include "code\datums\screentips\item_context.dm"
#include "code\datums\skills\_check_skills.dm"
#include "code\datums\skills\_skill.dm"
#include "code\datums\skills\_skill_holder.dm"
@@ -1991,6 +2002,7 @@
#include "code\modules\buildmode\submodes\throwing.dm"
#include "code\modules\buildmode\submodes\variable_edit.dm"
#include "code\modules\cargo\bounty.dm"
+#include "code\modules\cargo\bounty_console.dm"
#include "code\modules\cargo\centcom_podlauncher.dm"
#include "code\modules\cargo\console.dm"
#include "code\modules\cargo\coupon.dm"
@@ -2686,6 +2698,7 @@
#include "code\modules\mob\living\brain\status_procs.dm"
#include "code\modules\mob\living\carbon\carbon.dm"
#include "code\modules\mob\living\carbon\carbon_active_parry.dm"
+#include "code\modules\mob\living\carbon\carbon_context.dm"
#include "code\modules\mob\living\carbon\carbon_defense.dm"
#include "code\modules\mob\living\carbon\carbon_defines.dm"
#include "code\modules\mob\living\carbon\carbon_movement.dm"
@@ -2741,6 +2754,7 @@
#include "code\modules\mob\living\carbon\human\examine.dm"
#include "code\modules\mob\living\carbon\human\human.dm"
#include "code\modules\mob\living\carbon\human\human_block.dm"
+#include "code\modules\mob\living\carbon\human\human_context.dm"
#include "code\modules\mob\living\carbon\human\human_defense.dm"
#include "code\modules\mob\living\carbon\human\human_defines.dm"
#include "code\modules\mob\living\carbon\human\human_helpers.dm"
@@ -3716,6 +3730,7 @@
#include "code\modules\tgui\states\human_adjacent.dm"
#include "code\modules\tgui\states\inventory.dm"
#include "code\modules\tgui\states\language_menu.dm"
+#include "code\modules\tgui\states\never.dm"
#include "code\modules\tgui\states\new_player.dm"
#include "code\modules\tgui\states\not_incapacitated.dm"
#include "code\modules\tgui\states\notcontained.dm"
@@ -3860,6 +3875,7 @@
#include "modular_citadel\code\modules\client\loadout\_medical.dm"
#include "modular_citadel\code\modules\client\loadout\_security.dm"
#include "modular_citadel\code\modules\client\loadout\_service.dm"
+#include "modular_citadel\code\modules\client\loadout\accessory.dm"
#include "modular_citadel\code\modules\client\loadout\backpack.dm"
#include "modular_citadel\code\modules\client\loadout\glasses.dm"
#include "modular_citadel\code\modules\client\loadout\gloves.dm"
@@ -3943,6 +3959,7 @@
#include "modular_sand\code\datums\action.dm"
#include "modular_sand\code\datums\ai_laws.dm"
#include "modular_sand\code\datums\shuttles.dm"
+#include "modular_sand\code\datums\components\interaction_menu_granter.dm"
#include "modular_sand\code\datums\components\mood.dm"
#include "modular_sand\code\datums\components\riding.dm"
#include "modular_sand\code\datums\components\container_item\container_item.dm"
@@ -3953,7 +3970,6 @@
#include "modular_sand\code\datums\elements\holder_micro.dm"
#include "modular_sand\code\datums\elements\skirt_peeking.dm"
#include "modular_sand\code\datums\interactions\_interaction.dm"
-#include "modular_sand\code\datums\interactions\interaction_interface.dm"
#include "modular_sand\code\datums\interactions\interaction_mob.dm"
#include "modular_sand\code\datums\interactions\lewd_definitions.dm"
#include "modular_sand\code\datums\interactions\lewd_interactions.dm"
@@ -4285,6 +4301,7 @@
#include "modular_splurt\code\_onclick\hud\robot.dm"
#include "modular_splurt\code\_onclick\hud\screen_objects.dm"
#include "modular_splurt\code\_rendering\fullscreen\fullscreen.dm"
+#include "modular_splurt\code\controllers\configuration\entries\splurt_autocryo.dm"
#include "modular_splurt\code\controllers\configuration\entries\splurt_comms.dm"
#include "modular_splurt\code\controllers\configuration\entries\splurt_connections.dm"
#include "modular_splurt\code\controllers\configuration\entries\splurt_discord.dm"
@@ -4293,6 +4310,7 @@
#include "modular_splurt\code\controllers\configuration\entries\splurt_general.dm"
#include "modular_splurt\code\controllers\configuration\entries\splurt_maps.dm"
#include "modular_splurt\code\controllers\configuration\entries\splurt_server.dm"
+#include "modular_splurt\code\controllers\subsystem\afk.dm"
#include "modular_splurt\code\controllers\subsystem\discord.dm"
#include "modular_splurt\code\controllers\subsystem\redbot.dm"
#include "modular_splurt\code\controllers\subsystem\ticker.dm"
@@ -4533,6 +4551,7 @@
#include "modular_splurt\code\modules\client\client_procs.dm"
#include "modular_splurt\code\modules\client\preferences.dm"
#include "modular_splurt\code\modules\client\preferences_savefile.dm"
+#include "modular_splurt\code\modules\client\loadout\accessory.dm"
#include "modular_splurt\code\modules\client\loadout\backpack.dm"
#include "modular_splurt\code\modules\client\loadout\boxers.dm"
#include "modular_splurt\code\modules\client\loadout\glasses.dm"
@@ -4592,6 +4611,7 @@
#include "modular_splurt\code\modules\clothing\suits\utility.dm"
#include "modular_splurt\code\modules\clothing\suits\vest.dm"
#include "modular_splurt\code\modules\clothing\under\_under.dm"
+#include "modular_splurt\code\modules\clothing\under\accessories.dm"
#include "modular_splurt\code\modules\clothing\under\miscellaneous.dm"
#include "modular_splurt\code\modules\clothing\under\shorts.dm"
#include "modular_splurt\code\modules\clothing\under\jobs\command.dm"
@@ -4643,6 +4663,7 @@
#include "modular_splurt\code\modules\jobs\job_types\security_officer.dm"
#include "modular_splurt\code\modules\jobs\job_types\service.dm"
#include "modular_splurt\code\modules\jobs\job_types\station_engineer.dm"
+#include "modular_splurt\code\modules\jobs\job_types\stowaway.dm"
#include "modular_splurt\code\modules\keybindings\keybind\communication.dm"
#include "modular_splurt\code\modules\keybindings\keybind\human.dm"
#include "modular_splurt\code\modules\keybindings\keybind\movement.dm"
@@ -4678,10 +4699,13 @@
#include "modular_splurt\code\modules\mob\living\living_mobility.dm"
#include "modular_splurt\code\modules\mob\living\living_movement.dm"
#include "modular_splurt\code\modules\mob\living\living_signals.dm"
+#include "modular_splurt\code\modules\mob\living\login.dm"
+#include "modular_splurt\code\modules\mob\living\logout.dm"
#include "modular_splurt\code\modules\mob\living\navigation.dm"
#include "modular_splurt\code\modules\mob\living\say.dm"
#include "modular_splurt\code\modules\mob\living\brain\brain_item.dm"
#include "modular_splurt\code\modules\mob\living\carbon\carbon.dm"
+#include "modular_splurt\code\modules\mob\living\carbon\human\emote.dm"
#include "modular_splurt\code\modules\mob\living\carbon\human\human.dm"
#include "modular_splurt\code\modules\mob\living\carbon\human\human_defines.dm"
#include "modular_splurt\code\modules\mob\living\carbon\human\inventory.dm"
@@ -4714,6 +4738,8 @@
#include "modular_splurt\code\modules\mob\living\simple_animal\hostile\megafauna\king_of_goats.dm"
#include "modular_splurt\code\modules\mob\living\simple_animal\hostile\megafauna\sand.dm"
#include "modular_splurt\code\modules\paperwork\pen.dm"
+#include "modular_splurt\code\modules\photography\photos\album.dm"
+#include "modular_splurt\code\modules\photography\photos\photo.dm"
#include "modular_splurt\code\modules\power\cell.dm"
#include "modular_splurt\code\modules\power\reactor\fluffed.dm"
#include "modular_splurt\code\modules\projectiles\ammunition\ballistic\pistol.dm"
@@ -4760,6 +4786,7 @@
#include "modular_splurt\code\modules\research\designs\mecha_designs.dm"
#include "modular_splurt\code\modules\research\designs\mechfabricator_designs.dm"
#include "modular_splurt\code\modules\research\designs\medical_designs.dm"
+#include "modular_splurt\code\modules\research\designs\misc_designs.dm"
#include "modular_splurt\code\modules\research\designs\power_designs.dm"
#include "modular_splurt\code\modules\research\designs\stock_parts_designs.dm"
#include "modular_splurt\code\modules\research\designs\tool_designs.dm"
@@ -4769,6 +4796,7 @@
#include "modular_splurt\code\modules\research\techweb\nodes\bluespace_nodes.dm"
#include "modular_splurt\code\modules\research\techweb\nodes\mecha_nodes.dm"
#include "modular_splurt\code\modules\research\techweb\nodes\medical_nodes.dm"
+#include "modular_splurt\code\modules\research\techweb\nodes\nanites_nodes.dm"
#include "modular_splurt\code\modules\research\techweb\nodes\robotic_nodes.dm"
#include "modular_splurt\code\modules\resize\smallsprite_action.dm"
#include "modular_splurt\code\modules\ruins\objects_and_mobs\ash_walker_den.dm"
diff --git a/tgui/.yarn/releases/yarn-3.4.1.cjs b/tgui/.yarn/releases/yarn-3.4.1.cjs
new file mode 100644
index 000000000000..2bdb752d8609
--- /dev/null
+++ b/tgui/.yarn/releases/yarn-3.4.1.cjs
@@ -0,0 +1,873 @@
+#!/usr/bin/env node
+/* eslint-disable */
+//prettier-ignore
+(()=>{var Mue=Object.create;var Wb=Object.defineProperty;var Kue=Object.getOwnPropertyDescriptor;var Uue=Object.getOwnPropertyNames;var Hue=Object.getPrototypeOf,Gue=Object.prototype.hasOwnProperty;var J=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+r+'" is not supported')});var Yue=(r,e)=>()=>(r&&(e=r(r=0)),e);var w=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ut=(r,e)=>{for(var t in e)Wb(r,t,{get:e[t],enumerable:!0})},jue=(r,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Uue(e))!Gue.call(r,n)&&n!==t&&Wb(r,n,{get:()=>e[n],enumerable:!(i=Kue(e,n))||i.enumerable});return r};var Pe=(r,e,t)=>(t=r!=null?Mue(Hue(r)):{},jue(e||!r||!r.__esModule?Wb(t,"default",{value:r,enumerable:!0}):t,r));var _1=w((O7e,X1)=>{X1.exports=V1;V1.sync=uge;var W1=J("fs");function cge(r,e){var t=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!t||(t=t.split(";"),t.indexOf("")!==-1))return!0;for(var i=0;i{tK.exports=$1;$1.sync=gge;var Z1=J("fs");function $1(r,e,t){Z1.stat(r,function(i,n){t(i,i?!1:eK(n,e))})}function gge(r,e){return eK(Z1.statSync(r),e)}function eK(r,e){return r.isFile()&&fge(r,e)}function fge(r,e){var t=r.mode,i=r.uid,n=r.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt("100",8),l=parseInt("010",8),c=parseInt("001",8),u=a|l,g=t&c||t&l&&n===o||t&a&&i===s||t&u&&s===0;return g}});var nK=w((U7e,iK)=>{var K7e=J("fs"),_E;process.platform==="win32"||global.TESTING_WINDOWS?_E=_1():_E=rK();iK.exports=uS;uS.sync=hge;function uS(r,e,t){if(typeof e=="function"&&(t=e,e={}),!t){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(i,n){uS(r,e||{},function(s,o){s?n(s):i(o)})})}_E(r,e||{},function(i,n){i&&(i.code==="EACCES"||e&&e.ignoreErrors)&&(i=null,n=!1),t(i,n)})}function hge(r,e){try{return _E.sync(r,e||{})}catch(t){if(e&&e.ignoreErrors||t.code==="EACCES")return!1;throw t}}});var uK=w((H7e,cK)=>{var Ig=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",sK=J("path"),pge=Ig?";":":",oK=nK(),aK=r=>Object.assign(new Error(`not found: ${r}`),{code:"ENOENT"}),AK=(r,e)=>{let t=e.colon||pge,i=r.match(/\//)||Ig&&r.match(/\\/)?[""]:[...Ig?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(t)],n=Ig?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=Ig?n.split(t):[""];return Ig&&r.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:i,pathExt:s,pathExtExe:n}},lK=(r,e,t)=>{typeof e=="function"&&(t=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=AK(r,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(aK(r));let f=i[c],h=/^".*"$/.test(f)?f.slice(1,-1):f,p=sK.join(h,r),C=!h&&/^\.[\\\/]/.test(r)?r.slice(0,2)+p:p;u(l(C,c,0))}),l=(c,u,g)=>new Promise((f,h)=>{if(g===n.length)return f(a(u+1));let p=n[g];oK(c+p,{pathExt:s},(C,y)=>{if(!C&&y)if(e.all)o.push(c+p);else return f(c+p);return f(l(c,u,g+1))})});return t?a(0).then(c=>t(null,c),t):a(0)},dge=(r,e)=>{e=e||{};let{pathEnv:t,pathExt:i,pathExtExe:n}=AK(r,e),s=[];for(let o=0;o{"use strict";var gK=(r={})=>{let e=r.env||process.env;return(r.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(i=>i.toUpperCase()==="PATH")||"Path"};gS.exports=gK;gS.exports.default=gK});var CK=w((Y7e,dK)=>{"use strict";var hK=J("path"),Cge=uK(),mge=fK();function pK(r,e){let t=r.options.env||process.env,i=process.cwd(),n=r.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(r.options.cwd)}catch{}let o;try{o=Cge.sync(r.command,{path:t[mge({env:t})],pathExt:e?hK.delimiter:void 0})}catch{}finally{s&&process.chdir(i)}return o&&(o=hK.resolve(n?r.options.cwd:"",o)),o}function Ege(r){return pK(r)||pK(r,!0)}dK.exports=Ege});var mK=w((j7e,hS)=>{"use strict";var fS=/([()\][%!^"`<>&|;, *?])/g;function Ige(r){return r=r.replace(fS,"^$1"),r}function yge(r,e){return r=`${r}`,r=r.replace(/(\\*)"/g,'$1$1\\"'),r=r.replace(/(\\*)$/,"$1$1"),r=`"${r}"`,r=r.replace(fS,"^$1"),e&&(r=r.replace(fS,"^$1")),r}hS.exports.command=Ige;hS.exports.argument=yge});var IK=w((q7e,EK)=>{"use strict";EK.exports=/^#!(.*)/});var wK=w((J7e,yK)=>{"use strict";var wge=IK();yK.exports=(r="")=>{let e=r.match(wge);if(!e)return null;let[t,i]=e[0].replace(/#! ?/,"").split(" "),n=t.split("/").pop();return n==="env"?i:i?`${n} ${i}`:n}});var QK=w((W7e,BK)=>{"use strict";var pS=J("fs"),Bge=wK();function Qge(r){let t=Buffer.alloc(150),i;try{i=pS.openSync(r,"r"),pS.readSync(i,t,0,150,0),pS.closeSync(i)}catch{}return Bge(t.toString())}BK.exports=Qge});var xK=w((z7e,vK)=>{"use strict";var bge=J("path"),bK=CK(),SK=mK(),Sge=QK(),vge=process.platform==="win32",xge=/\.(?:com|exe)$/i,Pge=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function Dge(r){r.file=bK(r);let e=r.file&&Sge(r.file);return e?(r.args.unshift(r.file),r.command=e,bK(r)):r.file}function kge(r){if(!vge)return r;let e=Dge(r),t=!xge.test(e);if(r.options.forceShell||t){let i=Pge.test(e);r.command=bge.normalize(r.command),r.command=SK.command(r.command),r.args=r.args.map(s=>SK.argument(s,i));let n=[r.command].concat(r.args).join(" ");r.args=["/d","/s","/c",`"${n}"`],r.command=process.env.comspec||"cmd.exe",r.options.windowsVerbatimArguments=!0}return r}function Rge(r,e,t){e&&!Array.isArray(e)&&(t=e,e=null),e=e?e.slice(0):[],t=Object.assign({},t);let i={command:r,args:e,options:t,file:void 0,original:{command:r,args:e}};return t.shell?i:kge(i)}vK.exports=Rge});var kK=w((V7e,DK)=>{"use strict";var dS=process.platform==="win32";function CS(r,e){return Object.assign(new Error(`${e} ${r.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${r.command}`,path:r.command,spawnargs:r.args})}function Fge(r,e){if(!dS)return;let t=r.emit;r.emit=function(i,n){if(i==="exit"){let s=PK(n,e,"spawn");if(s)return t.call(r,"error",s)}return t.apply(r,arguments)}}function PK(r,e){return dS&&r===1&&!e.file?CS(e.original,"spawn"):null}function Nge(r,e){return dS&&r===1&&!e.file?CS(e.original,"spawnSync"):null}DK.exports={hookChildProcess:Fge,verifyENOENT:PK,verifyENOENTSync:Nge,notFoundError:CS}});var IS=w((X7e,yg)=>{"use strict";var RK=J("child_process"),mS=xK(),ES=kK();function FK(r,e,t){let i=mS(r,e,t),n=RK.spawn(i.command,i.args,i.options);return ES.hookChildProcess(n,i),n}function Lge(r,e,t){let i=mS(r,e,t),n=RK.spawnSync(i.command,i.args,i.options);return n.error=n.error||ES.verifyENOENTSync(n.status,i),n}yg.exports=FK;yg.exports.spawn=FK;yg.exports.sync=Lge;yg.exports._parse=mS;yg.exports._enoent=ES});var LK=w((_7e,NK)=>{"use strict";function Tge(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function Ml(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Ml)}Tge(Ml,Error);Ml.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g>",ie=me(">>",!1),de=">&",tt=me(">&",!1),Pt=">",It=me(">",!1),Or="<<<",ii=me("<<<",!1),gi="<&",hr=me("<&",!1),fi="<",ni=me("<",!1),Ls=function(m){return{type:"argument",segments:[].concat(...m)}},pr=function(m){return m},Ei="$'",_n=me("$'",!1),oa="'",aA=me("'",!1),eg=function(m){return[{type:"text",text:m}]},Zn='""',AA=me('""',!1),aa=function(){return{type:"text",text:""}},up='"',lA=me('"',!1),cA=function(m){return m},wr=function(m){return{type:"arithmetic",arithmetic:m,quoted:!0}},wl=function(m){return{type:"shell",shell:m,quoted:!0}},tg=function(m){return{type:"variable",...m,quoted:!0}},po=function(m){return{type:"text",text:m}},rg=function(m){return{type:"arithmetic",arithmetic:m,quoted:!1}},gp=function(m){return{type:"shell",shell:m,quoted:!1}},fp=function(m){return{type:"variable",...m,quoted:!1}},vr=function(m){return{type:"glob",pattern:m}},se=/^[^']/,Co=Je(["'"],!0,!1),Dn=function(m){return m.join("")},ig=/^[^$"]/,Qt=Je(["$",'"'],!0,!1),Bl=`\\
+`,kn=me(`\\
+`,!1),$n=function(){return""},es="\\",gt=me("\\",!1),mo=/^[\\$"`]/,At=Je(["\\","$",'"',"`"],!1,!1),an=function(m){return m},S="\\a",Tt=me("\\a",!1),ng=function(){return"a"},Ql="\\b",hp=me("\\b",!1),pp=function(){return"\b"},dp=/^[Ee]/,Cp=Je(["E","e"],!1,!1),mp=function(){return"\x1B"},G="\\f",yt=me("\\f",!1),uA=function(){return"\f"},ji="\\n",bl=me("\\n",!1),Xe=function(){return`
+`},Aa="\\r",sg=me("\\r",!1),bE=function(){return"\r"},Ep="\\t",SE=me("\\t",!1),ar=function(){return" "},Rn="\\v",Sl=me("\\v",!1),Ip=function(){return"\v"},Ts=/^[\\'"?]/,la=Je(["\\","'",'"',"?"],!1,!1),An=function(m){return String.fromCharCode(parseInt(m,16))},Te="\\x",og=me("\\x",!1),vl="\\u",Os=me("\\u",!1),xl="\\U",gA=me("\\U",!1),ag=function(m){return String.fromCodePoint(parseInt(m,16))},Ag=/^[0-7]/,ca=Je([["0","7"]],!1,!1),ua=/^[0-9a-fA-f]/,rt=Je([["0","9"],["a","f"],["A","f"]],!1,!1),Eo=nt(),fA="-",Pl=me("-",!1),Ms="+",Dl=me("+",!1),vE=".",yp=me(".",!1),lg=function(m,b,N){return{type:"number",value:(m==="-"?-1:1)*parseFloat(b.join("")+"."+N.join(""))}},wp=function(m,b){return{type:"number",value:(m==="-"?-1:1)*parseInt(b.join(""))}},xE=function(m){return{type:"variable",...m}},kl=function(m){return{type:"variable",name:m}},PE=function(m){return m},cg="*",hA=me("*",!1),Rr="/",DE=me("/",!1),Ks=function(m,b,N){return{type:b==="*"?"multiplication":"division",right:N}},Us=function(m,b){return b.reduce((N,U)=>({left:N,...U}),m)},ug=function(m,b,N){return{type:b==="+"?"addition":"subtraction",right:N}},pA="$((",R=me("$((",!1),q="))",Ce=me("))",!1),Ke=function(m){return m},Re="$(",ze=me("$(",!1),dt=function(m){return m},Ft="${",Fn=me("${",!1),Db=":-",$M=me(":-",!1),e1=function(m,b){return{name:m,defaultValue:b}},kb=":-}",t1=me(":-}",!1),r1=function(m){return{name:m,defaultValue:[]}},Rb=":+",i1=me(":+",!1),n1=function(m,b){return{name:m,alternativeValue:b}},Fb=":+}",s1=me(":+}",!1),o1=function(m){return{name:m,alternativeValue:[]}},Nb=function(m){return{name:m}},a1="$",A1=me("$",!1),l1=function(m){return e.isGlobPattern(m)},c1=function(m){return m},Lb=/^[a-zA-Z0-9_]/,Tb=Je([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),Ob=function(){return T()},Mb=/^[$@*?#a-zA-Z0-9_\-]/,Kb=Je(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),u1=/^[(){}<>$|&; \t"']/,gg=Je(["(",")","{","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),Ub=/^[<>&; \t"']/,Hb=Je(["<",">","&",";"," "," ",'"',"'"],!1,!1),kE=/^[ \t]/,RE=Je([" "," "],!1,!1),Q=0,Me=0,dA=[{line:1,column:1}],d=0,E=[],I=0,k;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function T(){return r.substring(Me,Q)}function _(){return Et(Me,Q)}function te(m,b){throw b=b!==void 0?b:Et(Me,Q),ki([lt(m)],r.substring(Me,Q),b)}function Be(m,b){throw b=b!==void 0?b:Et(Me,Q),Nn(m,b)}function me(m,b){return{type:"literal",text:m,ignoreCase:b}}function Je(m,b,N){return{type:"class",parts:m,inverted:b,ignoreCase:N}}function nt(){return{type:"any"}}function wt(){return{type:"end"}}function lt(m){return{type:"other",description:m}}function it(m){var b=dA[m],N;if(b)return b;for(N=m-1;!dA[N];)N--;for(b=dA[N],b={line:b.line,column:b.column};Nd&&(d=Q,E=[]),E.push(m))}function Nn(m,b){return new Ml(m,null,null,b)}function ki(m,b,N){return new Ml(Ml.buildMessage(m,b),m,b,N)}function CA(){var m,b;return m=Q,b=Mr(),b===t&&(b=null),b!==t&&(Me=m,b=s(b)),m=b,m}function Mr(){var m,b,N,U,ce;if(m=Q,b=Kr(),b!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();N!==t?(U=ga(),U!==t?(ce=ts(),ce===t&&(ce=null),ce!==t?(Me=m,b=o(b,U,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;if(m===t)if(m=Q,b=Kr(),b!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();N!==t?(U=ga(),U===t&&(U=null),U!==t?(Me=m,b=a(b,U),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;return m}function ts(){var m,b,N,U,ce;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(N=Mr(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,b=l(N),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t;return m}function ga(){var m;return r.charCodeAt(Q)===59?(m=c,Q++):(m=t,I===0&&Qe(u)),m===t&&(r.charCodeAt(Q)===38?(m=g,Q++):(m=t,I===0&&Qe(f))),m}function Kr(){var m,b,N;return m=Q,b=g1(),b!==t?(N=yue(),N===t&&(N=null),N!==t?(Me=m,b=h(b,N),m=b):(Q=m,m=t)):(Q=m,m=t),m}function yue(){var m,b,N,U,ce,Se,ht;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(N=wue(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=Kr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,b=p(N,ce),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;return m}function wue(){var m;return r.substr(Q,2)===C?(m=C,Q+=2):(m=t,I===0&&Qe(y)),m===t&&(r.substr(Q,2)===B?(m=B,Q+=2):(m=t,I===0&&Qe(v))),m}function g1(){var m,b,N;return m=Q,b=bue(),b!==t?(N=Bue(),N===t&&(N=null),N!==t?(Me=m,b=D(b,N),m=b):(Q=m,m=t)):(Q=m,m=t),m}function Bue(){var m,b,N,U,ce,Se,ht;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(N=Que(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=g1(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,b=L(N,ce),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;return m}function Que(){var m;return r.substr(Q,2)===H?(m=H,Q+=2):(m=t,I===0&&Qe(j)),m===t&&(r.charCodeAt(Q)===124?(m=$,Q++):(m=t,I===0&&Qe(V))),m}function FE(){var m,b,N,U,ce,Se;if(m=Q,b=Q1(),b!==t)if(r.charCodeAt(Q)===61?(N=W,Q++):(N=t,I===0&&Qe(Z)),N!==t)if(U=p1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(Me=m,b=A(b,U),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t;else Q=m,m=t;if(m===t)if(m=Q,b=Q1(),b!==t)if(r.charCodeAt(Q)===61?(N=W,Q++):(N=t,I===0&&Qe(Z)),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,b=ae(b),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t;return m}function bue(){var m,b,N,U,ce,Se,ht,Bt,Jr,hi,rs;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(r.charCodeAt(Q)===40?(N=ge,Q++):(N=t,I===0&&Qe(re)),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=Mr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();if(Se!==t)if(r.charCodeAt(Q)===41?(ht=O,Q++):(ht=t,I===0&&Qe(F)),ht!==t){for(Bt=[],Jr=He();Jr!==t;)Bt.push(Jr),Jr=He();if(Bt!==t){for(Jr=[],hi=Bp();hi!==t;)Jr.push(hi),hi=Bp();if(Jr!==t){for(hi=[],rs=He();rs!==t;)hi.push(rs),rs=He();hi!==t?(Me=m,b=ue(ce,Jr),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;if(m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(r.charCodeAt(Q)===123?(N=he,Q++):(N=t,I===0&&Qe(ke)),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=Mr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();if(Se!==t)if(r.charCodeAt(Q)===125?(ht=Fe,Q++):(ht=t,I===0&&Qe(Ne)),ht!==t){for(Bt=[],Jr=He();Jr!==t;)Bt.push(Jr),Jr=He();if(Bt!==t){for(Jr=[],hi=Bp();hi!==t;)Jr.push(hi),hi=Bp();if(Jr!==t){for(hi=[],rs=He();rs!==t;)hi.push(rs),rs=He();hi!==t?(Me=m,b=oe(ce,Jr),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;if(m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t){for(N=[],U=FE();U!==t;)N.push(U),U=FE();if(N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t){if(ce=[],Se=h1(),Se!==t)for(;Se!==t;)ce.push(Se),Se=h1();else ce=t;if(ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,b=le(N,ce),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t;if(m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t){if(N=[],U=FE(),U!==t)for(;U!==t;)N.push(U),U=FE();else N=t;if(N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,b=we(N),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}}}return m}function f1(){var m,b,N,U,ce;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t){if(N=[],U=NE(),U!==t)for(;U!==t;)N.push(U),U=NE();else N=t;if(N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,b=fe(N),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t;return m}function h1(){var m,b,N;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t?(N=Bp(),N!==t?(Me=m,b=Ae(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();b!==t?(N=NE(),N!==t?(Me=m,b=Ae(N),m=b):(Q=m,m=t)):(Q=m,m=t)}return m}function Bp(){var m,b,N,U,ce;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();return b!==t?(qe.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(ne)),N===t&&(N=null),N!==t?(U=Sue(),U!==t?(ce=NE(),ce!==t?(Me=m,b=Y(N,U,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function Sue(){var m;return r.substr(Q,2)===pe?(m=pe,Q+=2):(m=t,I===0&&Qe(ie)),m===t&&(r.substr(Q,2)===de?(m=de,Q+=2):(m=t,I===0&&Qe(tt)),m===t&&(r.charCodeAt(Q)===62?(m=Pt,Q++):(m=t,I===0&&Qe(It)),m===t&&(r.substr(Q,3)===Or?(m=Or,Q+=3):(m=t,I===0&&Qe(ii)),m===t&&(r.substr(Q,2)===gi?(m=gi,Q+=2):(m=t,I===0&&Qe(hr)),m===t&&(r.charCodeAt(Q)===60?(m=fi,Q++):(m=t,I===0&&Qe(ni))))))),m}function NE(){var m,b,N;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();return b!==t?(N=p1(),N!==t?(Me=m,b=Ae(N),m=b):(Q=m,m=t)):(Q=m,m=t),m}function p1(){var m,b,N;if(m=Q,b=[],N=d1(),N!==t)for(;N!==t;)b.push(N),N=d1();else b=t;return b!==t&&(Me=m,b=Ls(b)),m=b,m}function d1(){var m,b;return m=Q,b=vue(),b!==t&&(Me=m,b=pr(b)),m=b,m===t&&(m=Q,b=xue(),b!==t&&(Me=m,b=pr(b)),m=b,m===t&&(m=Q,b=Pue(),b!==t&&(Me=m,b=pr(b)),m=b,m===t&&(m=Q,b=Due(),b!==t&&(Me=m,b=pr(b)),m=b))),m}function vue(){var m,b,N,U;return m=Q,r.substr(Q,2)===Ei?(b=Ei,Q+=2):(b=t,I===0&&Qe(_n)),b!==t?(N=Fue(),N!==t?(r.charCodeAt(Q)===39?(U=oa,Q++):(U=t,I===0&&Qe(aA)),U!==t?(Me=m,b=eg(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function xue(){var m,b,N,U;return m=Q,r.charCodeAt(Q)===39?(b=oa,Q++):(b=t,I===0&&Qe(aA)),b!==t?(N=kue(),N!==t?(r.charCodeAt(Q)===39?(U=oa,Q++):(U=t,I===0&&Qe(aA)),U!==t?(Me=m,b=eg(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function Pue(){var m,b,N,U;if(m=Q,r.substr(Q,2)===Zn?(b=Zn,Q+=2):(b=t,I===0&&Qe(AA)),b!==t&&(Me=m,b=aa()),m=b,m===t)if(m=Q,r.charCodeAt(Q)===34?(b=up,Q++):(b=t,I===0&&Qe(lA)),b!==t){for(N=[],U=C1();U!==t;)N.push(U),U=C1();N!==t?(r.charCodeAt(Q)===34?(U=up,Q++):(U=t,I===0&&Qe(lA)),U!==t?(Me=m,b=cA(N),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;return m}function Due(){var m,b,N;if(m=Q,b=[],N=m1(),N!==t)for(;N!==t;)b.push(N),N=m1();else b=t;return b!==t&&(Me=m,b=cA(b)),m=b,m}function C1(){var m,b;return m=Q,b=w1(),b!==t&&(Me=m,b=wr(b)),m=b,m===t&&(m=Q,b=B1(),b!==t&&(Me=m,b=wl(b)),m=b,m===t&&(m=Q,b=qb(),b!==t&&(Me=m,b=tg(b)),m=b,m===t&&(m=Q,b=Rue(),b!==t&&(Me=m,b=po(b)),m=b))),m}function m1(){var m,b;return m=Q,b=w1(),b!==t&&(Me=m,b=rg(b)),m=b,m===t&&(m=Q,b=B1(),b!==t&&(Me=m,b=gp(b)),m=b,m===t&&(m=Q,b=qb(),b!==t&&(Me=m,b=fp(b)),m=b,m===t&&(m=Q,b=Tue(),b!==t&&(Me=m,b=vr(b)),m=b,m===t&&(m=Q,b=Lue(),b!==t&&(Me=m,b=po(b)),m=b)))),m}function kue(){var m,b,N;for(m=Q,b=[],se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Co));N!==t;)b.push(N),se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Co));return b!==t&&(Me=m,b=Dn(b)),m=b,m}function Rue(){var m,b,N;if(m=Q,b=[],N=E1(),N===t&&(ig.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Qt))),N!==t)for(;N!==t;)b.push(N),N=E1(),N===t&&(ig.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Qt)));else b=t;return b!==t&&(Me=m,b=Dn(b)),m=b,m}function E1(){var m,b,N;return m=Q,r.substr(Q,2)===Bl?(b=Bl,Q+=2):(b=t,I===0&&Qe(kn)),b!==t&&(Me=m,b=$n()),m=b,m===t&&(m=Q,r.charCodeAt(Q)===92?(b=es,Q++):(b=t,I===0&&Qe(gt)),b!==t?(mo.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(At)),N!==t?(Me=m,b=an(N),m=b):(Q=m,m=t)):(Q=m,m=t)),m}function Fue(){var m,b,N;for(m=Q,b=[],N=I1(),N===t&&(se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Co)));N!==t;)b.push(N),N=I1(),N===t&&(se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Co)));return b!==t&&(Me=m,b=Dn(b)),m=b,m}function I1(){var m,b,N;return m=Q,r.substr(Q,2)===S?(b=S,Q+=2):(b=t,I===0&&Qe(Tt)),b!==t&&(Me=m,b=ng()),m=b,m===t&&(m=Q,r.substr(Q,2)===Ql?(b=Ql,Q+=2):(b=t,I===0&&Qe(hp)),b!==t&&(Me=m,b=pp()),m=b,m===t&&(m=Q,r.charCodeAt(Q)===92?(b=es,Q++):(b=t,I===0&&Qe(gt)),b!==t?(dp.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Cp)),N!==t?(Me=m,b=mp(),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===G?(b=G,Q+=2):(b=t,I===0&&Qe(yt)),b!==t&&(Me=m,b=uA()),m=b,m===t&&(m=Q,r.substr(Q,2)===ji?(b=ji,Q+=2):(b=t,I===0&&Qe(bl)),b!==t&&(Me=m,b=Xe()),m=b,m===t&&(m=Q,r.substr(Q,2)===Aa?(b=Aa,Q+=2):(b=t,I===0&&Qe(sg)),b!==t&&(Me=m,b=bE()),m=b,m===t&&(m=Q,r.substr(Q,2)===Ep?(b=Ep,Q+=2):(b=t,I===0&&Qe(SE)),b!==t&&(Me=m,b=ar()),m=b,m===t&&(m=Q,r.substr(Q,2)===Rn?(b=Rn,Q+=2):(b=t,I===0&&Qe(Sl)),b!==t&&(Me=m,b=Ip()),m=b,m===t&&(m=Q,r.charCodeAt(Q)===92?(b=es,Q++):(b=t,I===0&&Qe(gt)),b!==t?(Ts.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(la)),N!==t?(Me=m,b=an(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Nue()))))))))),m}function Nue(){var m,b,N,U,ce,Se,ht,Bt,Jr,hi,rs,Jb;return m=Q,r.charCodeAt(Q)===92?(b=es,Q++):(b=t,I===0&&Qe(gt)),b!==t?(N=Gb(),N!==t?(Me=m,b=An(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Te?(b=Te,Q+=2):(b=t,I===0&&Qe(og)),b!==t?(N=Q,U=Q,ce=Gb(),ce!==t?(Se=Ln(),Se!==t?(ce=[ce,Se],U=ce):(Q=U,U=t)):(Q=U,U=t),U===t&&(U=Gb()),U!==t?N=r.substring(N,Q):N=U,N!==t?(Me=m,b=An(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===vl?(b=vl,Q+=2):(b=t,I===0&&Qe(Os)),b!==t?(N=Q,U=Q,ce=Ln(),ce!==t?(Se=Ln(),Se!==t?(ht=Ln(),ht!==t?(Bt=Ln(),Bt!==t?(ce=[ce,Se,ht,Bt],U=ce):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t),U!==t?N=r.substring(N,Q):N=U,N!==t?(Me=m,b=An(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===xl?(b=xl,Q+=2):(b=t,I===0&&Qe(gA)),b!==t?(N=Q,U=Q,ce=Ln(),ce!==t?(Se=Ln(),Se!==t?(ht=Ln(),ht!==t?(Bt=Ln(),Bt!==t?(Jr=Ln(),Jr!==t?(hi=Ln(),hi!==t?(rs=Ln(),rs!==t?(Jb=Ln(),Jb!==t?(ce=[ce,Se,ht,Bt,Jr,hi,rs,Jb],U=ce):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t),U!==t?N=r.substring(N,Q):N=U,N!==t?(Me=m,b=ag(N),m=b):(Q=m,m=t)):(Q=m,m=t)))),m}function Gb(){var m;return Ag.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(ca)),m}function Ln(){var m;return ua.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(rt)),m}function Lue(){var m,b,N,U,ce;if(m=Q,b=[],N=Q,r.charCodeAt(Q)===92?(U=es,Q++):(U=t,I===0&&Qe(gt)),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Eo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t),N===t&&(N=Q,U=Q,I++,ce=b1(),I--,ce===t?U=void 0:(Q=U,U=t),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Eo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t)),N!==t)for(;N!==t;)b.push(N),N=Q,r.charCodeAt(Q)===92?(U=es,Q++):(U=t,I===0&&Qe(gt)),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Eo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t),N===t&&(N=Q,U=Q,I++,ce=b1(),I--,ce===t?U=void 0:(Q=U,U=t),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Eo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t));else b=t;return b!==t&&(Me=m,b=Dn(b)),m=b,m}function Yb(){var m,b,N,U,ce,Se;if(m=Q,r.charCodeAt(Q)===45?(b=fA,Q++):(b=t,I===0&&Qe(Pl)),b===t&&(r.charCodeAt(Q)===43?(b=Ms,Q++):(b=t,I===0&&Qe(Dl))),b===t&&(b=null),b!==t){if(N=[],qe.test(r.charAt(Q))?(U=r.charAt(Q),Q++):(U=t,I===0&&Qe(ne)),U!==t)for(;U!==t;)N.push(U),qe.test(r.charAt(Q))?(U=r.charAt(Q),Q++):(U=t,I===0&&Qe(ne));else N=t;if(N!==t)if(r.charCodeAt(Q)===46?(U=vE,Q++):(U=t,I===0&&Qe(yp)),U!==t){if(ce=[],qe.test(r.charAt(Q))?(Se=r.charAt(Q),Q++):(Se=t,I===0&&Qe(ne)),Se!==t)for(;Se!==t;)ce.push(Se),qe.test(r.charAt(Q))?(Se=r.charAt(Q),Q++):(Se=t,I===0&&Qe(ne));else ce=t;ce!==t?(Me=m,b=lg(b,N,ce),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;if(m===t){if(m=Q,r.charCodeAt(Q)===45?(b=fA,Q++):(b=t,I===0&&Qe(Pl)),b===t&&(r.charCodeAt(Q)===43?(b=Ms,Q++):(b=t,I===0&&Qe(Dl))),b===t&&(b=null),b!==t){if(N=[],qe.test(r.charAt(Q))?(U=r.charAt(Q),Q++):(U=t,I===0&&Qe(ne)),U!==t)for(;U!==t;)N.push(U),qe.test(r.charAt(Q))?(U=r.charAt(Q),Q++):(U=t,I===0&&Qe(ne));else N=t;N!==t?(Me=m,b=wp(b,N),m=b):(Q=m,m=t)}else Q=m,m=t;if(m===t&&(m=Q,b=qb(),b!==t&&(Me=m,b=xE(b)),m=b,m===t&&(m=Q,b=Rl(),b!==t&&(Me=m,b=kl(b)),m=b,m===t)))if(m=Q,r.charCodeAt(Q)===40?(b=ge,Q++):(b=t,I===0&&Qe(re)),b!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();if(N!==t)if(U=y1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(r.charCodeAt(Q)===41?(Se=O,Q++):(Se=t,I===0&&Qe(F)),Se!==t?(Me=m,b=PE(U),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t}return m}function jb(){var m,b,N,U,ce,Se,ht,Bt;if(m=Q,b=Yb(),b!==t){for(N=[],U=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===42?(Se=cg,Q++):(Se=t,I===0&&Qe(hA)),Se===t&&(r.charCodeAt(Q)===47?(Se=Rr,Q++):(Se=t,I===0&&Qe(DE))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=Yb(),Bt!==t?(Me=U,ce=Ks(b,Se,Bt),U=ce):(Q=U,U=t)):(Q=U,U=t)}else Q=U,U=t;else Q=U,U=t;for(;U!==t;){for(N.push(U),U=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===42?(Se=cg,Q++):(Se=t,I===0&&Qe(hA)),Se===t&&(r.charCodeAt(Q)===47?(Se=Rr,Q++):(Se=t,I===0&&Qe(DE))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=Yb(),Bt!==t?(Me=U,ce=Ks(b,Se,Bt),U=ce):(Q=U,U=t)):(Q=U,U=t)}else Q=U,U=t;else Q=U,U=t}N!==t?(Me=m,b=Us(b,N),m=b):(Q=m,m=t)}else Q=m,m=t;return m}function y1(){var m,b,N,U,ce,Se,ht,Bt;if(m=Q,b=jb(),b!==t){for(N=[],U=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===43?(Se=Ms,Q++):(Se=t,I===0&&Qe(Dl)),Se===t&&(r.charCodeAt(Q)===45?(Se=fA,Q++):(Se=t,I===0&&Qe(Pl))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=jb(),Bt!==t?(Me=U,ce=ug(b,Se,Bt),U=ce):(Q=U,U=t)):(Q=U,U=t)}else Q=U,U=t;else Q=U,U=t;for(;U!==t;){for(N.push(U),U=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===43?(Se=Ms,Q++):(Se=t,I===0&&Qe(Dl)),Se===t&&(r.charCodeAt(Q)===45?(Se=fA,Q++):(Se=t,I===0&&Qe(Pl))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=jb(),Bt!==t?(Me=U,ce=ug(b,Se,Bt),U=ce):(Q=U,U=t)):(Q=U,U=t)}else Q=U,U=t;else Q=U,U=t}N!==t?(Me=m,b=Us(b,N),m=b):(Q=m,m=t)}else Q=m,m=t;return m}function w1(){var m,b,N,U,ce,Se;if(m=Q,r.substr(Q,3)===pA?(b=pA,Q+=3):(b=t,I===0&&Qe(R)),b!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();if(N!==t)if(U=y1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(r.substr(Q,2)===q?(Se=q,Q+=2):(Se=t,I===0&&Qe(Ce)),Se!==t?(Me=m,b=Ke(U),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;return m}function B1(){var m,b,N,U;return m=Q,r.substr(Q,2)===Re?(b=Re,Q+=2):(b=t,I===0&&Qe(ze)),b!==t?(N=Mr(),N!==t?(r.charCodeAt(Q)===41?(U=O,Q++):(U=t,I===0&&Qe(F)),U!==t?(Me=m,b=dt(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function qb(){var m,b,N,U,ce,Se;return m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Fn)),b!==t?(N=Rl(),N!==t?(r.substr(Q,2)===Db?(U=Db,Q+=2):(U=t,I===0&&Qe($M)),U!==t?(ce=f1(),ce!==t?(r.charCodeAt(Q)===125?(Se=Fe,Q++):(Se=t,I===0&&Qe(Ne)),Se!==t?(Me=m,b=e1(N,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Fn)),b!==t?(N=Rl(),N!==t?(r.substr(Q,3)===kb?(U=kb,Q+=3):(U=t,I===0&&Qe(t1)),U!==t?(Me=m,b=r1(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Fn)),b!==t?(N=Rl(),N!==t?(r.substr(Q,2)===Rb?(U=Rb,Q+=2):(U=t,I===0&&Qe(i1)),U!==t?(ce=f1(),ce!==t?(r.charCodeAt(Q)===125?(Se=Fe,Q++):(Se=t,I===0&&Qe(Ne)),Se!==t?(Me=m,b=n1(N,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Fn)),b!==t?(N=Rl(),N!==t?(r.substr(Q,3)===Fb?(U=Fb,Q+=3):(U=t,I===0&&Qe(s1)),U!==t?(Me=m,b=o1(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Fn)),b!==t?(N=Rl(),N!==t?(r.charCodeAt(Q)===125?(U=Fe,Q++):(U=t,I===0&&Qe(Ne)),U!==t?(Me=m,b=Nb(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.charCodeAt(Q)===36?(b=a1,Q++):(b=t,I===0&&Qe(A1)),b!==t?(N=Rl(),N!==t?(Me=m,b=Nb(N),m=b):(Q=m,m=t)):(Q=m,m=t)))))),m}function Tue(){var m,b,N;return m=Q,b=Oue(),b!==t?(Me=Q,N=l1(b),N?N=void 0:N=t,N!==t?(Me=m,b=c1(b),m=b):(Q=m,m=t)):(Q=m,m=t),m}function Oue(){var m,b,N,U,ce;if(m=Q,b=[],N=Q,U=Q,I++,ce=S1(),I--,ce===t?U=void 0:(Q=U,U=t),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Eo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t),N!==t)for(;N!==t;)b.push(N),N=Q,U=Q,I++,ce=S1(),I--,ce===t?U=void 0:(Q=U,U=t),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Eo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t);else b=t;return b!==t&&(Me=m,b=Dn(b)),m=b,m}function Q1(){var m,b,N;if(m=Q,b=[],Lb.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Tb)),N!==t)for(;N!==t;)b.push(N),Lb.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Tb));else b=t;return b!==t&&(Me=m,b=Ob()),m=b,m}function Rl(){var m,b,N;if(m=Q,b=[],Mb.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Kb)),N!==t)for(;N!==t;)b.push(N),Mb.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Kb));else b=t;return b!==t&&(Me=m,b=Ob()),m=b,m}function b1(){var m;return u1.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(gg)),m}function S1(){var m;return Ub.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(Hb)),m}function He(){var m,b;if(m=[],kE.test(r.charAt(Q))?(b=r.charAt(Q),Q++):(b=t,I===0&&Qe(RE)),b!==t)for(;b!==t;)m.push(b),kE.test(r.charAt(Q))?(b=r.charAt(Q),Q++):(b=t,I===0&&Qe(RE));else m=t;return m}if(k=n(),k!==t&&Q===r.length)return k;throw k!==t&&Q{"use strict";function Mge(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function Ul(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Ul)}Mge(Ul,Error);Ul.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;gH&&(H=v,j=[]),j.push(ne))}function Ne(ne,Y){return new Ul(ne,null,null,Y)}function oe(ne,Y,pe){return new Ul(Ul.buildMessage(ne,Y),ne,Y,pe)}function le(){var ne,Y,pe,ie;return ne=v,Y=we(),Y!==t?(r.charCodeAt(v)===47?(pe=s,v++):(pe=t,$===0&&Fe(o)),pe!==t?(ie=we(),ie!==t?(D=ne,Y=a(Y,ie),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=we(),Y!==t&&(D=ne,Y=l(Y)),ne=Y),ne}function we(){var ne,Y,pe,ie;return ne=v,Y=fe(),Y!==t?(r.charCodeAt(v)===64?(pe=c,v++):(pe=t,$===0&&Fe(u)),pe!==t?(ie=qe(),ie!==t?(D=ne,Y=g(Y,ie),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=fe(),Y!==t&&(D=ne,Y=f(Y)),ne=Y),ne}function fe(){var ne,Y,pe,ie,de;return ne=v,r.charCodeAt(v)===64?(Y=c,v++):(Y=t,$===0&&Fe(u)),Y!==t?(pe=Ae(),pe!==t?(r.charCodeAt(v)===47?(ie=s,v++):(ie=t,$===0&&Fe(o)),ie!==t?(de=Ae(),de!==t?(D=ne,Y=h(),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=Ae(),Y!==t&&(D=ne,Y=h()),ne=Y),ne}function Ae(){var ne,Y,pe;if(ne=v,Y=[],p.test(r.charAt(v))?(pe=r.charAt(v),v++):(pe=t,$===0&&Fe(C)),pe!==t)for(;pe!==t;)Y.push(pe),p.test(r.charAt(v))?(pe=r.charAt(v),v++):(pe=t,$===0&&Fe(C));else Y=t;return Y!==t&&(D=ne,Y=h()),ne=Y,ne}function qe(){var ne,Y,pe;if(ne=v,Y=[],y.test(r.charAt(v))?(pe=r.charAt(v),v++):(pe=t,$===0&&Fe(B)),pe!==t)for(;pe!==t;)Y.push(pe),y.test(r.charAt(v))?(pe=r.charAt(v),v++):(pe=t,$===0&&Fe(B));else Y=t;return Y!==t&&(D=ne,Y=h()),ne=Y,ne}if(V=n(),V!==t&&v===r.length)return V;throw V!==t&&v{"use strict";function UK(r){return typeof r>"u"||r===null}function Uge(r){return typeof r=="object"&&r!==null}function Hge(r){return Array.isArray(r)?r:UK(r)?[]:[r]}function Gge(r,e){var t,i,n,s;if(e)for(s=Object.keys(e),t=0,i=s.length;t{"use strict";function Op(r,e){Error.call(this),this.name="YAMLException",this.reason=r,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}Op.prototype=Object.create(Error.prototype);Op.prototype.constructor=Op;Op.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t};HK.exports=Op});var jK=w((pXe,YK)=>{"use strict";var GK=Gl();function SS(r,e,t,i,n){this.name=r,this.buffer=e,this.position=t,this.line=i,this.column=n}SS.prototype.getSnippet=function(e,t){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,t=t||75,i="",n=this.position;n>0&&`\0\r
+\x85\u2028\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>t/2-1){i=" ... ",n+=5;break}for(s="",o=this.position;ot/2-1){s=" ... ",o-=5;break}return a=this.buffer.slice(n,o),GK.repeat(" ",e)+i+a+s+`
+`+GK.repeat(" ",e+this.position-n+i.length)+"^"};SS.prototype.toString=function(e){var t,i="";return this.name&&(i+='in "'+this.name+'" '),i+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet(),t&&(i+=`:
+`+t)),i};YK.exports=SS});var si=w((dXe,JK)=>{"use strict";var qK=Qg(),qge=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],Jge=["scalar","sequence","mapping"];function Wge(r){var e={};return r!==null&&Object.keys(r).forEach(function(t){r[t].forEach(function(i){e[String(i)]=t})}),e}function zge(r,e){if(e=e||{},Object.keys(e).forEach(function(t){if(qge.indexOf(t)===-1)throw new qK('Unknown option "'+t+'" is met in definition of "'+r+'" YAML type.')}),this.tag=r,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=Wge(e.styleAliases||null),Jge.indexOf(this.kind)===-1)throw new qK('Unknown kind "'+this.kind+'" is specified for "'+r+'" YAML type.')}JK.exports=zge});var Yl=w((CXe,zK)=>{"use strict";var WK=Gl(),nI=Qg(),Vge=si();function vS(r,e,t){var i=[];return r.include.forEach(function(n){t=vS(n,e,t)}),r[e].forEach(function(n){t.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),t.push(n)}),t.filter(function(n,s){return i.indexOf(s)===-1})}function Xge(){var r={scalar:{},sequence:{},mapping:{},fallback:{}},e,t;function i(n){r[n.kind][n.tag]=r.fallback[n.tag]=n}for(e=0,t=arguments.length;e{"use strict";var _ge=si();VK.exports=new _ge("tag:yaml.org,2002:str",{kind:"scalar",construct:function(r){return r!==null?r:""}})});var ZK=w((EXe,_K)=>{"use strict";var Zge=si();_K.exports=new Zge("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(r){return r!==null?r:[]}})});var eU=w((IXe,$K)=>{"use strict";var $ge=si();$K.exports=new $ge("tag:yaml.org,2002:map",{kind:"mapping",construct:function(r){return r!==null?r:{}}})});var sI=w((yXe,tU)=>{"use strict";var efe=Yl();tU.exports=new efe({explicit:[XK(),ZK(),eU()]})});var iU=w((wXe,rU)=>{"use strict";var tfe=si();function rfe(r){if(r===null)return!0;var e=r.length;return e===1&&r==="~"||e===4&&(r==="null"||r==="Null"||r==="NULL")}function ife(){return null}function nfe(r){return r===null}rU.exports=new tfe("tag:yaml.org,2002:null",{kind:"scalar",resolve:rfe,construct:ife,predicate:nfe,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var sU=w((BXe,nU)=>{"use strict";var sfe=si();function ofe(r){if(r===null)return!1;var e=r.length;return e===4&&(r==="true"||r==="True"||r==="TRUE")||e===5&&(r==="false"||r==="False"||r==="FALSE")}function afe(r){return r==="true"||r==="True"||r==="TRUE"}function Afe(r){return Object.prototype.toString.call(r)==="[object Boolean]"}nU.exports=new sfe("tag:yaml.org,2002:bool",{kind:"scalar",resolve:ofe,construct:afe,predicate:Afe,represent:{lowercase:function(r){return r?"true":"false"},uppercase:function(r){return r?"TRUE":"FALSE"},camelcase:function(r){return r?"True":"False"}},defaultStyle:"lowercase"})});var aU=w((QXe,oU)=>{"use strict";var lfe=Gl(),cfe=si();function ufe(r){return 48<=r&&r<=57||65<=r&&r<=70||97<=r&&r<=102}function gfe(r){return 48<=r&&r<=55}function ffe(r){return 48<=r&&r<=57}function hfe(r){if(r===null)return!1;var e=r.length,t=0,i=!1,n;if(!e)return!1;if(n=r[t],(n==="-"||n==="+")&&(n=r[++t]),n==="0"){if(t+1===e)return!0;if(n=r[++t],n==="b"){for(t++;t=0?"0b"+r.toString(2):"-0b"+r.toString(2).slice(1)},octal:function(r){return r>=0?"0"+r.toString(8):"-0"+r.toString(8).slice(1)},decimal:function(r){return r.toString(10)},hexadecimal:function(r){return r>=0?"0x"+r.toString(16).toUpperCase():"-0x"+r.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var cU=w((bXe,lU)=>{"use strict";var AU=Gl(),Cfe=si(),mfe=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function Efe(r){return!(r===null||!mfe.test(r)||r[r.length-1]==="_")}function Ife(r){var e,t,i,n;return e=r.replace(/_/g,"").toLowerCase(),t=e[0]==="-"?-1:1,n=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?t===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),t*e):t*parseFloat(e,10)}var yfe=/^[-+]?[0-9]+e/;function wfe(r,e){var t;if(isNaN(r))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===r)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===r)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(AU.isNegativeZero(r))return"-0.0";return t=r.toString(10),yfe.test(t)?t.replace("e",".e"):t}function Bfe(r){return Object.prototype.toString.call(r)==="[object Number]"&&(r%1!==0||AU.isNegativeZero(r))}lU.exports=new Cfe("tag:yaml.org,2002:float",{kind:"scalar",resolve:Efe,construct:Ife,predicate:Bfe,represent:wfe,defaultStyle:"lowercase"})});var xS=w((SXe,uU)=>{"use strict";var Qfe=Yl();uU.exports=new Qfe({include:[sI()],implicit:[iU(),sU(),aU(),cU()]})});var PS=w((vXe,gU)=>{"use strict";var bfe=Yl();gU.exports=new bfe({include:[xS()]})});var dU=w((xXe,pU)=>{"use strict";var Sfe=si(),fU=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),hU=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function vfe(r){return r===null?!1:fU.exec(r)!==null||hU.exec(r)!==null}function xfe(r){var e,t,i,n,s,o,a,l=0,c=null,u,g,f;if(e=fU.exec(r),e===null&&(e=hU.exec(r)),e===null)throw new Error("Date resolve error");if(t=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(t,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]==="-"&&(c=-c)),f=new Date(Date.UTC(t,i,n,s,o,a,l)),c&&f.setTime(f.getTime()-c),f}function Pfe(r){return r.toISOString()}pU.exports=new Sfe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:vfe,construct:xfe,instanceOf:Date,represent:Pfe})});var mU=w((PXe,CU)=>{"use strict";var Dfe=si();function kfe(r){return r==="<<"||r===null}CU.exports=new Dfe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:kfe})});var yU=w((DXe,IU)=>{"use strict";var jl;try{EU=J,jl=EU("buffer").Buffer}catch{}var EU,Rfe=si(),DS=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
+\r`;function Ffe(r){if(r===null)return!1;var e,t,i=0,n=r.length,s=DS;for(t=0;t64)){if(e<0)return!1;i+=6}return i%8===0}function Nfe(r){var e,t,i=r.replace(/[\r\n=]/g,""),n=i.length,s=DS,o=0,a=[];for(e=0;e>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return t=n%4*6,t===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):t===18?(a.push(o>>10&255),a.push(o>>2&255)):t===12&&a.push(o>>4&255),jl?jl.from?jl.from(a):new jl(a):a}function Lfe(r){var e="",t=0,i,n,s=r.length,o=DS;for(i=0;i>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]),t=(t<<8)+r[i];return n=s%3,n===0?(e+=o[t>>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]):n===2?(e+=o[t>>10&63],e+=o[t>>4&63],e+=o[t<<2&63],e+=o[64]):n===1&&(e+=o[t>>2&63],e+=o[t<<4&63],e+=o[64],e+=o[64]),e}function Tfe(r){return jl&&jl.isBuffer(r)}IU.exports=new Rfe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:Ffe,construct:Nfe,predicate:Tfe,represent:Lfe})});var BU=w((kXe,wU)=>{"use strict";var Ofe=si(),Mfe=Object.prototype.hasOwnProperty,Kfe=Object.prototype.toString;function Ufe(r){if(r===null)return!0;var e=[],t,i,n,s,o,a=r;for(t=0,i=a.length;t{"use strict";var Gfe=si(),Yfe=Object.prototype.toString;function jfe(r){if(r===null)return!0;var e,t,i,n,s,o=r;for(s=new Array(o.length),e=0,t=o.length;e{"use strict";var Jfe=si(),Wfe=Object.prototype.hasOwnProperty;function zfe(r){if(r===null)return!0;var e,t=r;for(e in t)if(Wfe.call(t,e)&&t[e]!==null)return!1;return!0}function Vfe(r){return r!==null?r:{}}SU.exports=new Jfe("tag:yaml.org,2002:set",{kind:"mapping",resolve:zfe,construct:Vfe})});var Sg=w((NXe,xU)=>{"use strict";var Xfe=Yl();xU.exports=new Xfe({include:[PS()],implicit:[dU(),mU()],explicit:[yU(),BU(),bU(),vU()]})});var DU=w((LXe,PU)=>{"use strict";var _fe=si();function Zfe(){return!0}function $fe(){}function ehe(){return""}function the(r){return typeof r>"u"}PU.exports=new _fe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:Zfe,construct:$fe,predicate:the,represent:ehe})});var RU=w((TXe,kU)=>{"use strict";var rhe=si();function ihe(r){if(r===null||r.length===0)return!1;var e=r,t=/\/([gim]*)$/.exec(r),i="";return!(e[0]==="/"&&(t&&(i=t[1]),i.length>3||e[e.length-i.length-1]!=="/"))}function nhe(r){var e=r,t=/\/([gim]*)$/.exec(r),i="";return e[0]==="/"&&(t&&(i=t[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function she(r){var e="/"+r.source+"/";return r.global&&(e+="g"),r.multiline&&(e+="m"),r.ignoreCase&&(e+="i"),e}function ohe(r){return Object.prototype.toString.call(r)==="[object RegExp]"}kU.exports=new rhe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:ihe,construct:nhe,predicate:ohe,represent:she})});var LU=w((OXe,NU)=>{"use strict";var oI;try{FU=J,oI=FU("esprima")}catch{typeof window<"u"&&(oI=window.esprima)}var FU,ahe=si();function Ahe(r){if(r===null)return!1;try{var e="("+r+")",t=oI.parse(e,{range:!0});return!(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")}catch{return!1}}function lhe(r){var e="("+r+")",t=oI.parse(e,{range:!0}),i=[],n;if(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return t.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=t.body[0].expression.body.range,t.body[0].expression.body.type==="BlockStatement"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,"return "+e.slice(n[0],n[1]))}function che(r){return r.toString()}function uhe(r){return Object.prototype.toString.call(r)==="[object Function]"}NU.exports=new ahe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:Ahe,construct:lhe,predicate:uhe,represent:che})});var Mp=w((MXe,OU)=>{"use strict";var TU=Yl();OU.exports=TU.DEFAULT=new TU({include:[Sg()],explicit:[DU(),RU(),LU()]})});var r2=w((KXe,Kp)=>{"use strict";var da=Gl(),jU=Qg(),ghe=jK(),qU=Sg(),fhe=Mp(),wA=Object.prototype.hasOwnProperty,aI=1,JU=2,WU=3,AI=4,kS=1,hhe=2,MU=3,phe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,dhe=/[\x85\u2028\u2029]/,Che=/[,\[\]\{\}]/,zU=/^(?:!|!!|![a-z\-]+!)$/i,VU=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function KU(r){return Object.prototype.toString.call(r)}function Bo(r){return r===10||r===13}function Jl(r){return r===9||r===32}function un(r){return r===9||r===32||r===10||r===13}function vg(r){return r===44||r===91||r===93||r===123||r===125}function mhe(r){var e;return 48<=r&&r<=57?r-48:(e=r|32,97<=e&&e<=102?e-97+10:-1)}function Ehe(r){return r===120?2:r===117?4:r===85?8:0}function Ihe(r){return 48<=r&&r<=57?r-48:-1}function UU(r){return r===48?"\0":r===97?"\x07":r===98?"\b":r===116||r===9?" ":r===110?`
+`:r===118?"\v":r===102?"\f":r===114?"\r":r===101?"\x1B":r===32?" ":r===34?'"':r===47?"/":r===92?"\\":r===78?"\x85":r===95?"\xA0":r===76?"\u2028":r===80?"\u2029":""}function yhe(r){return r<=65535?String.fromCharCode(r):String.fromCharCode((r-65536>>10)+55296,(r-65536&1023)+56320)}var XU=new Array(256),_U=new Array(256);for(ql=0;ql<256;ql++)XU[ql]=UU(ql)?1:0,_U[ql]=UU(ql);var ql;function whe(r,e){this.input=r,this.filename=e.filename||null,this.schema=e.schema||fhe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function ZU(r,e){return new jU(e,new ghe(r.filename,r.input,r.position,r.line,r.position-r.lineStart))}function ft(r,e){throw ZU(r,e)}function lI(r,e){r.onWarning&&r.onWarning.call(null,ZU(r,e))}var HU={YAML:function(e,t,i){var n,s,o;e.version!==null&&ft(e,"duplication of %YAML directive"),i.length!==1&&ft(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),n===null&&ft(e,"ill-formed argument of the YAML directive"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&&ft(e,"unacceptable YAML version of the document"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&lI(e,"unsupported YAML version of the document")},TAG:function(e,t,i){var n,s;i.length!==2&&ft(e,"TAG directive accepts exactly two arguments"),n=i[0],s=i[1],zU.test(n)||ft(e,"ill-formed tag handle (first argument) of the TAG directive"),wA.call(e.tagMap,n)&&ft(e,'there is a previously declared suffix for "'+n+'" tag handle'),VU.test(s)||ft(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=s}};function yA(r,e,t,i){var n,s,o,a;if(e1&&(r.result+=da.repeat(`
+`,e-1))}function Bhe(r,e,t){var i,n,s,o,a,l,c,u,g=r.kind,f=r.result,h;if(h=r.input.charCodeAt(r.position),un(h)||vg(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(n=r.input.charCodeAt(r.position+1),un(n)||t&&vg(n)))return!1;for(r.kind="scalar",r.result="",s=o=r.position,a=!1;h!==0;){if(h===58){if(n=r.input.charCodeAt(r.position+1),un(n)||t&&vg(n))break}else if(h===35){if(i=r.input.charCodeAt(r.position-1),un(i))break}else{if(r.position===r.lineStart&&cI(r)||t&&vg(h))break;if(Bo(h))if(l=r.line,c=r.lineStart,u=r.lineIndent,zr(r,!1,-1),r.lineIndent>=e){a=!0,h=r.input.charCodeAt(r.position);continue}else{r.position=o,r.line=l,r.lineStart=c,r.lineIndent=u;break}}a&&(yA(r,s,o,!1),FS(r,r.line-l),s=o=r.position,a=!1),Jl(h)||(o=r.position+1),h=r.input.charCodeAt(++r.position)}return yA(r,s,o,!1),r.result?!0:(r.kind=g,r.result=f,!1)}function Qhe(r,e){var t,i,n;if(t=r.input.charCodeAt(r.position),t!==39)return!1;for(r.kind="scalar",r.result="",r.position++,i=n=r.position;(t=r.input.charCodeAt(r.position))!==0;)if(t===39)if(yA(r,i,r.position,!0),t=r.input.charCodeAt(++r.position),t===39)i=r.position,r.position++,n=r.position;else return!0;else Bo(t)?(yA(r,i,n,!0),FS(r,zr(r,!1,e)),i=n=r.position):r.position===r.lineStart&&cI(r)?ft(r,"unexpected end of the document within a single quoted scalar"):(r.position++,n=r.position);ft(r,"unexpected end of the stream within a single quoted scalar")}function bhe(r,e){var t,i,n,s,o,a;if(a=r.input.charCodeAt(r.position),a!==34)return!1;for(r.kind="scalar",r.result="",r.position++,t=i=r.position;(a=r.input.charCodeAt(r.position))!==0;){if(a===34)return yA(r,t,r.position,!0),r.position++,!0;if(a===92){if(yA(r,t,r.position,!0),a=r.input.charCodeAt(++r.position),Bo(a))zr(r,!1,e);else if(a<256&&XU[a])r.result+=_U[a],r.position++;else if((o=Ehe(a))>0){for(n=o,s=0;n>0;n--)a=r.input.charCodeAt(++r.position),(o=mhe(a))>=0?s=(s<<4)+o:ft(r,"expected hexadecimal character");r.result+=yhe(s),r.position++}else ft(r,"unknown escape sequence");t=i=r.position}else Bo(a)?(yA(r,t,i,!0),FS(r,zr(r,!1,e)),t=i=r.position):r.position===r.lineStart&&cI(r)?ft(r,"unexpected end of the document within a double quoted scalar"):(r.position++,i=r.position)}ft(r,"unexpected end of the stream within a double quoted scalar")}function She(r,e){var t=!0,i,n=r.tag,s,o=r.anchor,a,l,c,u,g,f={},h,p,C,y;if(y=r.input.charCodeAt(r.position),y===91)l=93,g=!1,s=[];else if(y===123)l=125,g=!0,s={};else return!1;for(r.anchor!==null&&(r.anchorMap[r.anchor]=s),y=r.input.charCodeAt(++r.position);y!==0;){if(zr(r,!0,e),y=r.input.charCodeAt(r.position),y===l)return r.position++,r.tag=n,r.anchor=o,r.kind=g?"mapping":"sequence",r.result=s,!0;t||ft(r,"missed comma between flow collection entries"),p=h=C=null,c=u=!1,y===63&&(a=r.input.charCodeAt(r.position+1),un(a)&&(c=u=!0,r.position++,zr(r,!0,e))),i=r.line,Pg(r,e,aI,!1,!0),p=r.tag,h=r.result,zr(r,!0,e),y=r.input.charCodeAt(r.position),(u||r.line===i)&&y===58&&(c=!0,y=r.input.charCodeAt(++r.position),zr(r,!0,e),Pg(r,e,aI,!1,!0),C=r.result),g?xg(r,s,f,p,h,C):c?s.push(xg(r,null,f,p,h,C)):s.push(h),zr(r,!0,e),y=r.input.charCodeAt(r.position),y===44?(t=!0,y=r.input.charCodeAt(++r.position)):t=!1}ft(r,"unexpected end of the stream within a flow collection")}function vhe(r,e){var t,i,n=kS,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=r.input.charCodeAt(r.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(r.kind="scalar",r.result="";g!==0;)if(g=r.input.charCodeAt(++r.position),g===43||g===45)kS===n?n=g===43?MU:hhe:ft(r,"repeat of a chomping mode identifier");else if((u=Ihe(g))>=0)u===0?ft(r,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?ft(r,"repeat of an indentation width identifier"):(a=e+u-1,o=!0);else break;if(Jl(g)){do g=r.input.charCodeAt(++r.position);while(Jl(g));if(g===35)do g=r.input.charCodeAt(++r.position);while(!Bo(g)&&g!==0)}for(;g!==0;){for(RS(r),r.lineIndent=0,g=r.input.charCodeAt(r.position);(!o||r.lineIndenta&&(a=r.lineIndent),Bo(g)){l++;continue}if(r.lineIndent e)&&l!==0)ft(r,"bad indentation of a sequence entry");else if(r.lineIndente)&&(Pg(r,e,AI,!0,n)&&(p?f=r.result:h=r.result),p||(xg(r,c,u,g,f,h,s,o),g=f=h=null),zr(r,!0,-1),y=r.input.charCodeAt(r.position)),r.lineIndent>e&&y!==0)ft(r,"bad indentation of a mapping entry");else if(r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndent tag; it should be "scalar", not "'+r.kind+'"'),g=0,f=r.implicitTypes.length;g tag; it should be "'+h.kind+'", not "'+r.kind+'"'),h.resolve(r.result)?(r.result=h.construct(r.result),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):ft(r,"cannot resolve a node with !<"+r.tag+"> explicit tag")):ft(r,"unknown tag !<"+r.tag+">");return r.listener!==null&&r.listener("close",r),r.tag!==null||r.anchor!==null||u}function Rhe(r){var e=r.position,t,i,n,s=!1,o;for(r.version=null,r.checkLineBreaks=r.legacy,r.tagMap={},r.anchorMap={};(o=r.input.charCodeAt(r.position))!==0&&(zr(r,!0,-1),o=r.input.charCodeAt(r.position),!(r.lineIndent>0||o!==37));){for(s=!0,o=r.input.charCodeAt(++r.position),t=r.position;o!==0&&!un(o);)o=r.input.charCodeAt(++r.position);for(i=r.input.slice(t,r.position),n=[],i.length<1&&ft(r,"directive name must not be less than one character in length");o!==0;){for(;Jl(o);)o=r.input.charCodeAt(++r.position);if(o===35){do o=r.input.charCodeAt(++r.position);while(o!==0&&!Bo(o));break}if(Bo(o))break;for(t=r.position;o!==0&&!un(o);)o=r.input.charCodeAt(++r.position);n.push(r.input.slice(t,r.position))}o!==0&&RS(r),wA.call(HU,i)?HU[i](r,i,n):lI(r,'unknown document directive "'+i+'"')}if(zr(r,!0,-1),r.lineIndent===0&&r.input.charCodeAt(r.position)===45&&r.input.charCodeAt(r.position+1)===45&&r.input.charCodeAt(r.position+2)===45?(r.position+=3,zr(r,!0,-1)):s&&ft(r,"directives end mark is expected"),Pg(r,r.lineIndent-1,AI,!1,!0),zr(r,!0,-1),r.checkLineBreaks&&dhe.test(r.input.slice(e,r.position))&&lI(r,"non-ASCII line breaks are interpreted as content"),r.documents.push(r.result),r.position===r.lineStart&&cI(r)){r.input.charCodeAt(r.position)===46&&(r.position+=3,zr(r,!0,-1));return}if(r.position"u"&&(t=e,e=null);var i=$U(r,t);if(typeof e!="function")return i;for(var n=0,s=i.length;n"u"&&(t=e,e=null),e2(r,e,da.extend({schema:qU},t))}function Nhe(r,e){return t2(r,da.extend({schema:qU},e))}Kp.exports.loadAll=e2;Kp.exports.load=t2;Kp.exports.safeLoadAll=Fhe;Kp.exports.safeLoad=Nhe});var b2=w((UXe,OS)=>{"use strict";var Hp=Gl(),Gp=Qg(),Lhe=Mp(),The=Sg(),c2=Object.prototype.toString,u2=Object.prototype.hasOwnProperty,Ohe=9,Up=10,Mhe=13,Khe=32,Uhe=33,Hhe=34,g2=35,Ghe=37,Yhe=38,jhe=39,qhe=42,f2=44,Jhe=45,h2=58,Whe=61,zhe=62,Vhe=63,Xhe=64,p2=91,d2=93,_he=96,C2=123,Zhe=124,m2=125,Fi={};Fi[0]="\\0";Fi[7]="\\a";Fi[8]="\\b";Fi[9]="\\t";Fi[10]="\\n";Fi[11]="\\v";Fi[12]="\\f";Fi[13]="\\r";Fi[27]="\\e";Fi[34]='\\"';Fi[92]="\\\\";Fi[133]="\\N";Fi[160]="\\_";Fi[8232]="\\L";Fi[8233]="\\P";var $he=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function epe(r,e){var t,i,n,s,o,a,l;if(e===null)return{};for(t={},i=Object.keys(e),n=0,s=i.length;n0?r.charCodeAt(s-1):null,f=f&&s2(o,a)}else{for(s=0;si&&r[g+1]!==" ",g=s);else if(!Dg(o))return uI;a=s>0?r.charCodeAt(s-1):null,f=f&&s2(o,a)}c=c||u&&s-g-1>i&&r[g+1]!==" "}return!l&&!c?f&&!n(r)?I2:y2:t>9&&E2(r)?uI:c?B2:w2}function ope(r,e,t,i){r.dump=function(){if(e.length===0)return"''";if(!r.noCompatMode&&$he.indexOf(e)!==-1)return"'"+e+"'";var n=r.indent*Math.max(1,t),s=r.lineWidth===-1?-1:Math.max(Math.min(r.lineWidth,40),r.lineWidth-n),o=i||r.flowLevel>-1&&t>=r.flowLevel;function a(l){return rpe(r,l)}switch(spe(e,o,r.indent,s,a)){case I2:return e;case y2:return"'"+e.replace(/'/g,"''")+"'";case w2:return"|"+o2(e,r.indent)+a2(n2(e,n));case B2:return">"+o2(e,r.indent)+a2(n2(ape(e,s),n));case uI:return'"'+Ape(e,s)+'"';default:throw new Gp("impossible error: invalid scalar style")}}()}function o2(r,e){var t=E2(r)?String(e):"",i=r[r.length-1]===`
+`,n=i&&(r[r.length-2]===`
+`||r===`
+`),s=n?"+":i?"":"-";return t+s+`
+`}function a2(r){return r[r.length-1]===`
+`?r.slice(0,-1):r}function ape(r,e){for(var t=/(\n+)([^\n]*)/g,i=function(){var c=r.indexOf(`
+`);return c=c!==-1?c:r.length,t.lastIndex=c,A2(r.slice(0,c),e)}(),n=r[0]===`
+`||r[0]===" ",s,o;o=t.exec(r);){var a=o[1],l=o[2];s=l[0]===" ",i+=a+(!n&&!s&&l!==""?`
+`:"")+A2(l,e),n=s}return i}function A2(r,e){if(r===""||r[0]===" ")return r;for(var t=/ [^ ]/g,i,n=0,s,o=0,a=0,l="";i=t.exec(r);)a=i.index,a-n>e&&(s=o>n?o:a,l+=`
+`+r.slice(n,s),n=s+1),o=a;return l+=`
+`,r.length-n>e&&o>n?l+=r.slice(n,o)+`
+`+r.slice(o+1):l+=r.slice(n),l.slice(1)}function Ape(r){for(var e="",t,i,n,s=0;s=55296&&t<=56319&&(i=r.charCodeAt(s+1),i>=56320&&i<=57343)){e+=i2((t-55296)*1024+i-56320+65536),s++;continue}n=Fi[t],e+=!n&&Dg(t)?r[s]:n||i2(t)}return e}function lpe(r,e,t){var i="",n=r.tag,s,o;for(s=0,o=t.length;s1024&&(u+="? "),u+=r.dump+(r.condenseFlow?'"':"")+":"+(r.condenseFlow?"":" "),Wl(r,e,c,!1,!1)&&(u+=r.dump,i+=u));r.tag=n,r.dump="{"+i+"}"}function gpe(r,e,t,i){var n="",s=r.tag,o=Object.keys(t),a,l,c,u,g,f;if(r.sortKeys===!0)o.sort();else if(typeof r.sortKeys=="function")o.sort(r.sortKeys);else if(r.sortKeys)throw new Gp("sortKeys must be a boolean or a function");for(a=0,l=o.length;a1024,g&&(r.dump&&Up===r.dump.charCodeAt(0)?f+="?":f+="? "),f+=r.dump,g&&(f+=NS(r,e)),Wl(r,e+1,u,!0,g)&&(r.dump&&Up===r.dump.charCodeAt(0)?f+=":":f+=": ",f+=r.dump,n+=f));r.tag=s,r.dump=n||"{}"}function l2(r,e,t){var i,n,s,o,a,l;for(n=t?r.explicitTypes:r.implicitTypes,s=0,o=n.length;s tag resolver accepts not "'+l+'" style');r.dump=i}return!0}return!1}function Wl(r,e,t,i,n,s){r.tag=null,r.dump=t,l2(r,t,!1)||l2(r,t,!0);var o=c2.call(r.dump);i&&(i=r.flowLevel<0||r.flowLevel>e);var a=o==="[object Object]"||o==="[object Array]",l,c;if(a&&(l=r.duplicates.indexOf(t),c=l!==-1),(r.tag!==null&&r.tag!=="?"||c||r.indent!==2&&e>0)&&(n=!1),c&&r.usedDuplicates[l])r.dump="*ref_"+l;else{if(a&&c&&!r.usedDuplicates[l]&&(r.usedDuplicates[l]=!0),o==="[object Object]")i&&Object.keys(r.dump).length!==0?(gpe(r,e,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(upe(r,e,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump));else if(o==="[object Array]"){var u=r.noArrayIndent&&e>0?e-1:e;i&&r.dump.length!==0?(cpe(r,u,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(lpe(r,u,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump))}else if(o==="[object String]")r.tag!=="?"&&ope(r,r.dump,e,s);else{if(r.skipInvalid)return!1;throw new Gp("unacceptable kind of an object to dump "+o)}r.tag!==null&&r.tag!=="?"&&(r.dump="!<"+r.tag+"> "+r.dump)}return!0}function fpe(r,e){var t=[],i=[],n,s;for(LS(r,t,i),n=0,s=i.length;n{"use strict";var gI=r2(),S2=b2();function fI(r){return function(){throw new Error("Function "+r+" is deprecated and cannot be used.")}}Fr.exports.Type=si();Fr.exports.Schema=Yl();Fr.exports.FAILSAFE_SCHEMA=sI();Fr.exports.JSON_SCHEMA=xS();Fr.exports.CORE_SCHEMA=PS();Fr.exports.DEFAULT_SAFE_SCHEMA=Sg();Fr.exports.DEFAULT_FULL_SCHEMA=Mp();Fr.exports.load=gI.load;Fr.exports.loadAll=gI.loadAll;Fr.exports.safeLoad=gI.safeLoad;Fr.exports.safeLoadAll=gI.safeLoadAll;Fr.exports.dump=S2.dump;Fr.exports.safeDump=S2.safeDump;Fr.exports.YAMLException=Qg();Fr.exports.MINIMAL_SCHEMA=sI();Fr.exports.SAFE_SCHEMA=Sg();Fr.exports.DEFAULT_SCHEMA=Mp();Fr.exports.scan=fI("scan");Fr.exports.parse=fI("parse");Fr.exports.compose=fI("compose");Fr.exports.addConstructor=fI("addConstructor")});var P2=w((GXe,x2)=>{"use strict";var ppe=v2();x2.exports=ppe});var k2=w((YXe,D2)=>{"use strict";function dpe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function zl(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,zl)}dpe(zl,Error);zl.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g({[Ke]:Ce})))},H=function(R){return R},j=function(R){return R},$=Ts("correct indentation"),V=" ",W=ar(" ",!1),Z=function(R){return R.length===pA*ug},A=function(R){return R.length===(pA+1)*ug},ae=function(){return pA++,!0},ge=function(){return pA--,!0},re=function(){return sg()},O=Ts("pseudostring"),F=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,ue=Rn(["\r",`
+`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),he=/^[^\r\n\t ,\][{}:#"']/,ke=Rn(["\r",`
+`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),Fe=function(){return sg().replace(/^ *| *$/g,"")},Ne="--",oe=ar("--",!1),le=/^[a-zA-Z\/0-9]/,we=Rn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),fe=/^[^\r\n\t :,]/,Ae=Rn(["\r",`
+`," "," ",":",","],!0,!1),qe="null",ne=ar("null",!1),Y=function(){return null},pe="true",ie=ar("true",!1),de=function(){return!0},tt="false",Pt=ar("false",!1),It=function(){return!1},Or=Ts("string"),ii='"',gi=ar('"',!1),hr=function(){return""},fi=function(R){return R},ni=function(R){return R.join("")},Ls=/^[^"\\\0-\x1F\x7F]/,pr=Rn(['"',"\\",["\0",""],"\x7F"],!0,!1),Ei='\\"',_n=ar('\\"',!1),oa=function(){return'"'},aA="\\\\",eg=ar("\\\\",!1),Zn=function(){return"\\"},AA="\\/",aa=ar("\\/",!1),up=function(){return"/"},lA="\\b",cA=ar("\\b",!1),wr=function(){return"\b"},wl="\\f",tg=ar("\\f",!1),po=function(){return"\f"},rg="\\n",gp=ar("\\n",!1),fp=function(){return`
+`},vr="\\r",se=ar("\\r",!1),Co=function(){return"\r"},Dn="\\t",ig=ar("\\t",!1),Qt=function(){return" "},Bl="\\u",kn=ar("\\u",!1),$n=function(R,q,Ce,Ke){return String.fromCharCode(parseInt(`0x${R}${q}${Ce}${Ke}`))},es=/^[0-9a-fA-F]/,gt=Rn([["0","9"],["a","f"],["A","F"]],!1,!1),mo=Ts("blank space"),At=/^[ \t]/,an=Rn([" "," "],!1,!1),S=Ts("white space"),Tt=/^[ \t\n\r]/,ng=Rn([" "," ",`
+`,"\r"],!1,!1),Ql=`\r
+`,hp=ar(`\r
+`,!1),pp=`
+`,dp=ar(`
+`,!1),Cp="\r",mp=ar("\r",!1),G=0,yt=0,uA=[{line:1,column:1}],ji=0,bl=[],Xe=0,Aa;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function sg(){return r.substring(yt,G)}function bE(){return An(yt,G)}function Ep(R,q){throw q=q!==void 0?q:An(yt,G),vl([Ts(R)],r.substring(yt,G),q)}function SE(R,q){throw q=q!==void 0?q:An(yt,G),og(R,q)}function ar(R,q){return{type:"literal",text:R,ignoreCase:q}}function Rn(R,q,Ce){return{type:"class",parts:R,inverted:q,ignoreCase:Ce}}function Sl(){return{type:"any"}}function Ip(){return{type:"end"}}function Ts(R){return{type:"other",description:R}}function la(R){var q=uA[R],Ce;if(q)return q;for(Ce=R-1;!uA[Ce];)Ce--;for(q=uA[Ce],q={line:q.line,column:q.column};Ceji&&(ji=G,bl=[]),bl.push(R))}function og(R,q){return new zl(R,null,null,q)}function vl(R,q,Ce){return new zl(zl.buildMessage(R,q),R,q,Ce)}function Os(){var R;return R=ag(),R}function xl(){var R,q,Ce;for(R=G,q=[],Ce=gA();Ce!==t;)q.push(Ce),Ce=gA();return q!==t&&(yt=R,q=s(q)),R=q,R}function gA(){var R,q,Ce,Ke,Re;return R=G,q=ua(),q!==t?(r.charCodeAt(G)===45?(Ce=o,G++):(Ce=t,Xe===0&&Te(a)),Ce!==t?(Ke=Rr(),Ke!==t?(Re=ca(),Re!==t?(yt=R,q=l(Re),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R}function ag(){var R,q,Ce;for(R=G,q=[],Ce=Ag();Ce!==t;)q.push(Ce),Ce=Ag();return q!==t&&(yt=R,q=c(q)),R=q,R}function Ag(){var R,q,Ce,Ke,Re,ze,dt,Ft,Fn;if(R=G,q=Rr(),q===t&&(q=null),q!==t){if(Ce=G,r.charCodeAt(G)===35?(Ke=u,G++):(Ke=t,Xe===0&&Te(g)),Ke!==t){if(Re=[],ze=G,dt=G,Xe++,Ft=Us(),Xe--,Ft===t?dt=void 0:(G=dt,dt=t),dt!==t?(r.length>G?(Ft=r.charAt(G),G++):(Ft=t,Xe===0&&Te(f)),Ft!==t?(dt=[dt,Ft],ze=dt):(G=ze,ze=t)):(G=ze,ze=t),ze!==t)for(;ze!==t;)Re.push(ze),ze=G,dt=G,Xe++,Ft=Us(),Xe--,Ft===t?dt=void 0:(G=dt,dt=t),dt!==t?(r.length>G?(Ft=r.charAt(G),G++):(Ft=t,Xe===0&&Te(f)),Ft!==t?(dt=[dt,Ft],ze=dt):(G=ze,ze=t)):(G=ze,ze=t);else Re=t;Re!==t?(Ke=[Ke,Re],Ce=Ke):(G=Ce,Ce=t)}else G=Ce,Ce=t;if(Ce===t&&(Ce=null),Ce!==t){if(Ke=[],Re=Ks(),Re!==t)for(;Re!==t;)Ke.push(Re),Re=Ks();else Ke=t;Ke!==t?(yt=R,q=h(),R=q):(G=R,R=t)}else G=R,R=t}else G=R,R=t;if(R===t&&(R=G,q=ua(),q!==t?(Ce=Pl(),Ce!==t?(Ke=Rr(),Ke===t&&(Ke=null),Ke!==t?(r.charCodeAt(G)===58?(Re=p,G++):(Re=t,Xe===0&&Te(C)),Re!==t?(ze=Rr(),ze===t&&(ze=null),ze!==t?(dt=ca(),dt!==t?(yt=R,q=y(Ce,dt),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,q=ua(),q!==t?(Ce=Ms(),Ce!==t?(Ke=Rr(),Ke===t&&(Ke=null),Ke!==t?(r.charCodeAt(G)===58?(Re=p,G++):(Re=t,Xe===0&&Te(C)),Re!==t?(ze=Rr(),ze===t&&(ze=null),ze!==t?(dt=ca(),dt!==t?(yt=R,q=y(Ce,dt),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t))){if(R=G,q=ua(),q!==t)if(Ce=Ms(),Ce!==t)if(Ke=Rr(),Ke!==t)if(Re=vE(),Re!==t){if(ze=[],dt=Ks(),dt!==t)for(;dt!==t;)ze.push(dt),dt=Ks();else ze=t;ze!==t?(yt=R,q=y(Ce,Re),R=q):(G=R,R=t)}else G=R,R=t;else G=R,R=t;else G=R,R=t;else G=R,R=t;if(R===t)if(R=G,q=ua(),q!==t)if(Ce=Ms(),Ce!==t){if(Ke=[],Re=G,ze=Rr(),ze===t&&(ze=null),ze!==t?(r.charCodeAt(G)===44?(dt=B,G++):(dt=t,Xe===0&&Te(v)),dt!==t?(Ft=Rr(),Ft===t&&(Ft=null),Ft!==t?(Fn=Ms(),Fn!==t?(yt=Re,ze=D(Ce,Fn),Re=ze):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t),Re!==t)for(;Re!==t;)Ke.push(Re),Re=G,ze=Rr(),ze===t&&(ze=null),ze!==t?(r.charCodeAt(G)===44?(dt=B,G++):(dt=t,Xe===0&&Te(v)),dt!==t?(Ft=Rr(),Ft===t&&(Ft=null),Ft!==t?(Fn=Ms(),Fn!==t?(yt=Re,ze=D(Ce,Fn),Re=ze):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t);else Ke=t;Ke!==t?(Re=Rr(),Re===t&&(Re=null),Re!==t?(r.charCodeAt(G)===58?(ze=p,G++):(ze=t,Xe===0&&Te(C)),ze!==t?(dt=Rr(),dt===t&&(dt=null),dt!==t?(Ft=ca(),Ft!==t?(yt=R,q=L(Ce,Ke,Ft),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)}else G=R,R=t;else G=R,R=t}return R}function ca(){var R,q,Ce,Ke,Re,ze,dt;if(R=G,q=G,Xe++,Ce=G,Ke=Us(),Ke!==t?(Re=rt(),Re!==t?(r.charCodeAt(G)===45?(ze=o,G++):(ze=t,Xe===0&&Te(a)),ze!==t?(dt=Rr(),dt!==t?(Ke=[Ke,Re,ze,dt],Ce=Ke):(G=Ce,Ce=t)):(G=Ce,Ce=t)):(G=Ce,Ce=t)):(G=Ce,Ce=t),Xe--,Ce!==t?(G=q,q=void 0):q=t,q!==t?(Ce=Ks(),Ce!==t?(Ke=Eo(),Ke!==t?(Re=xl(),Re!==t?(ze=fA(),ze!==t?(yt=R,q=H(Re),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,q=Us(),q!==t?(Ce=Eo(),Ce!==t?(Ke=ag(),Ke!==t?(Re=fA(),Re!==t?(yt=R,q=H(Ke),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t))if(R=G,q=Dl(),q!==t){if(Ce=[],Ke=Ks(),Ke!==t)for(;Ke!==t;)Ce.push(Ke),Ke=Ks();else Ce=t;Ce!==t?(yt=R,q=j(q),R=q):(G=R,R=t)}else G=R,R=t;return R}function ua(){var R,q,Ce;for(Xe++,R=G,q=[],r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Te(W));Ce!==t;)q.push(Ce),r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Te(W));return q!==t?(yt=G,Ce=Z(q),Ce?Ce=void 0:Ce=t,Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)):(G=R,R=t),Xe--,R===t&&(q=t,Xe===0&&Te($)),R}function rt(){var R,q,Ce;for(R=G,q=[],r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Te(W));Ce!==t;)q.push(Ce),r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Te(W));return q!==t?(yt=G,Ce=A(q),Ce?Ce=void 0:Ce=t,Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)):(G=R,R=t),R}function Eo(){var R;return yt=G,R=ae(),R?R=void 0:R=t,R}function fA(){var R;return yt=G,R=ge(),R?R=void 0:R=t,R}function Pl(){var R;return R=kl(),R===t&&(R=yp()),R}function Ms(){var R,q,Ce;if(R=kl(),R===t){if(R=G,q=[],Ce=lg(),Ce!==t)for(;Ce!==t;)q.push(Ce),Ce=lg();else q=t;q!==t&&(yt=R,q=re()),R=q}return R}function Dl(){var R;return R=wp(),R===t&&(R=xE(),R===t&&(R=kl(),R===t&&(R=yp()))),R}function vE(){var R;return R=wp(),R===t&&(R=kl(),R===t&&(R=lg())),R}function yp(){var R,q,Ce,Ke,Re,ze;if(Xe++,R=G,F.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(ue)),q!==t){for(Ce=[],Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(he.test(r.charAt(G))?(ze=r.charAt(G),G++):(ze=t,Xe===0&&Te(ke)),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ke!==t;)Ce.push(Ke),Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(he.test(r.charAt(G))?(ze=r.charAt(G),G++):(ze=t,Xe===0&&Te(ke)),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ce!==t?(yt=R,q=Fe(),R=q):(G=R,R=t)}else G=R,R=t;return Xe--,R===t&&(q=t,Xe===0&&Te(O)),R}function lg(){var R,q,Ce,Ke,Re;if(R=G,r.substr(G,2)===Ne?(q=Ne,G+=2):(q=t,Xe===0&&Te(oe)),q===t&&(q=null),q!==t)if(le.test(r.charAt(G))?(Ce=r.charAt(G),G++):(Ce=t,Xe===0&&Te(we)),Ce!==t){for(Ke=[],fe.test(r.charAt(G))?(Re=r.charAt(G),G++):(Re=t,Xe===0&&Te(Ae));Re!==t;)Ke.push(Re),fe.test(r.charAt(G))?(Re=r.charAt(G),G++):(Re=t,Xe===0&&Te(Ae));Ke!==t?(yt=R,q=Fe(),R=q):(G=R,R=t)}else G=R,R=t;else G=R,R=t;return R}function wp(){var R,q;return R=G,r.substr(G,4)===qe?(q=qe,G+=4):(q=t,Xe===0&&Te(ne)),q!==t&&(yt=R,q=Y()),R=q,R}function xE(){var R,q;return R=G,r.substr(G,4)===pe?(q=pe,G+=4):(q=t,Xe===0&&Te(ie)),q!==t&&(yt=R,q=de()),R=q,R===t&&(R=G,r.substr(G,5)===tt?(q=tt,G+=5):(q=t,Xe===0&&Te(Pt)),q!==t&&(yt=R,q=It()),R=q),R}function kl(){var R,q,Ce,Ke;return Xe++,R=G,r.charCodeAt(G)===34?(q=ii,G++):(q=t,Xe===0&&Te(gi)),q!==t?(r.charCodeAt(G)===34?(Ce=ii,G++):(Ce=t,Xe===0&&Te(gi)),Ce!==t?(yt=R,q=hr(),R=q):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,r.charCodeAt(G)===34?(q=ii,G++):(q=t,Xe===0&&Te(gi)),q!==t?(Ce=PE(),Ce!==t?(r.charCodeAt(G)===34?(Ke=ii,G++):(Ke=t,Xe===0&&Te(gi)),Ke!==t?(yt=R,q=fi(Ce),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)),Xe--,R===t&&(q=t,Xe===0&&Te(Or)),R}function PE(){var R,q,Ce;if(R=G,q=[],Ce=cg(),Ce!==t)for(;Ce!==t;)q.push(Ce),Ce=cg();else q=t;return q!==t&&(yt=R,q=ni(q)),R=q,R}function cg(){var R,q,Ce,Ke,Re,ze;return Ls.test(r.charAt(G))?(R=r.charAt(G),G++):(R=t,Xe===0&&Te(pr)),R===t&&(R=G,r.substr(G,2)===Ei?(q=Ei,G+=2):(q=t,Xe===0&&Te(_n)),q!==t&&(yt=R,q=oa()),R=q,R===t&&(R=G,r.substr(G,2)===aA?(q=aA,G+=2):(q=t,Xe===0&&Te(eg)),q!==t&&(yt=R,q=Zn()),R=q,R===t&&(R=G,r.substr(G,2)===AA?(q=AA,G+=2):(q=t,Xe===0&&Te(aa)),q!==t&&(yt=R,q=up()),R=q,R===t&&(R=G,r.substr(G,2)===lA?(q=lA,G+=2):(q=t,Xe===0&&Te(cA)),q!==t&&(yt=R,q=wr()),R=q,R===t&&(R=G,r.substr(G,2)===wl?(q=wl,G+=2):(q=t,Xe===0&&Te(tg)),q!==t&&(yt=R,q=po()),R=q,R===t&&(R=G,r.substr(G,2)===rg?(q=rg,G+=2):(q=t,Xe===0&&Te(gp)),q!==t&&(yt=R,q=fp()),R=q,R===t&&(R=G,r.substr(G,2)===vr?(q=vr,G+=2):(q=t,Xe===0&&Te(se)),q!==t&&(yt=R,q=Co()),R=q,R===t&&(R=G,r.substr(G,2)===Dn?(q=Dn,G+=2):(q=t,Xe===0&&Te(ig)),q!==t&&(yt=R,q=Qt()),R=q,R===t&&(R=G,r.substr(G,2)===Bl?(q=Bl,G+=2):(q=t,Xe===0&&Te(kn)),q!==t?(Ce=hA(),Ce!==t?(Ke=hA(),Ke!==t?(Re=hA(),Re!==t?(ze=hA(),ze!==t?(yt=R,q=$n(Ce,Ke,Re,ze),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)))))))))),R}function hA(){var R;return es.test(r.charAt(G))?(R=r.charAt(G),G++):(R=t,Xe===0&&Te(gt)),R}function Rr(){var R,q;if(Xe++,R=[],At.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(an)),q!==t)for(;q!==t;)R.push(q),At.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(an));else R=t;return Xe--,R===t&&(q=t,Xe===0&&Te(mo)),R}function DE(){var R,q;if(Xe++,R=[],Tt.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(ng)),q!==t)for(;q!==t;)R.push(q),Tt.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(ng));else R=t;return Xe--,R===t&&(q=t,Xe===0&&Te(S)),R}function Ks(){var R,q,Ce,Ke,Re,ze;if(R=G,q=Us(),q!==t){for(Ce=[],Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(ze=Us(),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ke!==t;)Ce.push(Ke),Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(ze=Us(),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)}else G=R,R=t;return R}function Us(){var R;return r.substr(G,2)===Ql?(R=Ql,G+=2):(R=t,Xe===0&&Te(hp)),R===t&&(r.charCodeAt(G)===10?(R=pp,G++):(R=t,Xe===0&&Te(dp)),R===t&&(r.charCodeAt(G)===13?(R=Cp,G++):(R=t,Xe===0&&Te(mp)))),R}let ug=2,pA=0;if(Aa=n(),Aa!==t&&G===r.length)return Aa;throw Aa!==t&&G{"use strict";var wpe=r=>{let e=!1,t=!1,i=!1;for(let n=0;n{if(!(typeof r=="string"||Array.isArray(r)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let t=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(r)?r=r.map(n=>n.trim()).filter(n=>n.length).join("-"):r=r.trim(),r.length===0?"":r.length===1?e.pascalCase?r.toUpperCase():r.toLowerCase():(r!==r.toLowerCase()&&(r=wpe(r)),r=r.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\d+(\w|$)/g,n=>n.toUpperCase()),t(r))};KS.exports=T2;KS.exports.default=T2});var M2=w((VXe,Bpe)=>{Bpe.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var Vl=w(On=>{"use strict";var U2=M2(),Qo=process.env;Object.defineProperty(On,"_vendors",{value:U2.map(function(r){return r.constant})});On.name=null;On.isPR=null;U2.forEach(function(r){let t=(Array.isArray(r.env)?r.env:[r.env]).every(function(i){return K2(i)});if(On[r.constant]=t,t)switch(On.name=r.name,typeof r.pr){case"string":On.isPR=!!Qo[r.pr];break;case"object":"env"in r.pr?On.isPR=r.pr.env in Qo&&Qo[r.pr.env]!==r.pr.ne:"any"in r.pr?On.isPR=r.pr.any.some(function(i){return!!Qo[i]}):On.isPR=K2(r.pr);break;default:On.isPR=null}});On.isCI=!!(Qo.CI||Qo.CONTINUOUS_INTEGRATION||Qo.BUILD_NUMBER||Qo.RUN_ID||On.name);function K2(r){return typeof r=="string"?!!Qo[r]:Object.keys(r).every(function(e){return Qo[e]===r[e]})}});var gn={};ut(gn,{KeyRelationship:()=>Xl,applyCascade:()=>zp,base64RegExp:()=>q2,colorStringAlphaRegExp:()=>j2,colorStringRegExp:()=>Y2,computeKey:()=>BA,getPrintable:()=>Vr,hasExactLength:()=>X2,hasForbiddenKeys:()=>tde,hasKeyRelationship:()=>JS,hasMaxLength:()=>Mpe,hasMinLength:()=>Ope,hasMutuallyExclusiveKeys:()=>rde,hasRequiredKeys:()=>ede,hasUniqueItems:()=>Kpe,isArray:()=>Ppe,isAtLeast:()=>Gpe,isAtMost:()=>Ype,isBase64:()=>Zpe,isBoolean:()=>Spe,isDate:()=>xpe,isDict:()=>kpe,isEnum:()=>Wi,isHexColor:()=>_pe,isISO8601:()=>Xpe,isInExclusiveRange:()=>qpe,isInInclusiveRange:()=>jpe,isInstanceOf:()=>Fpe,isInteger:()=>Jpe,isJSON:()=>$pe,isLiteral:()=>Qpe,isLowerCase:()=>Wpe,isNegative:()=>Upe,isNullable:()=>Tpe,isNumber:()=>vpe,isObject:()=>Rpe,isOneOf:()=>Npe,isOptional:()=>Lpe,isPositive:()=>Hpe,isString:()=>Wp,isTuple:()=>Dpe,isUUID4:()=>Vpe,isUnknown:()=>V2,isUpperCase:()=>zpe,iso8601RegExp:()=>qS,makeCoercionFn:()=>_l,makeSetter:()=>z2,makeTrait:()=>W2,makeValidator:()=>bt,matchesRegExp:()=>Vp,plural:()=>EI,pushError:()=>pt,simpleKeyRegExp:()=>G2,uuid4RegExp:()=>J2});function bt({test:r}){return W2(r)()}function Vr(r){return r===null?"null":r===void 0?"undefined":r===""?"an empty string":JSON.stringify(r)}function BA(r,e){var t,i,n;return typeof e=="number"?`${(t=r==null?void 0:r.p)!==null&&t!==void 0?t:"."}[${e}]`:G2.test(e)?`${(i=r==null?void 0:r.p)!==null&&i!==void 0?i:""}.${e}`:`${(n=r==null?void 0:r.p)!==null&&n!==void 0?n:"."}[${JSON.stringify(e)}]`}function _l(r,e){return t=>{let i=r[e];return r[e]=t,_l(r,e).bind(null,i)}}function z2(r,e){return t=>{r[e]=t}}function EI(r,e,t){return r===1?e:t}function pt({errors:r,p:e}={},t){return r==null||r.push(`${e!=null?e:"."}: ${t}`),!1}function Qpe(r){return bt({test:(e,t)=>e!==r?pt(t,`Expected a literal (got ${Vr(r)})`):!0})}function Wi(r){let e=Array.isArray(r)?r:Object.values(r),t=new Set(e);return bt({test:(i,n)=>t.has(i)?!0:pt(n,`Expected a valid enumeration value (got ${Vr(i)})`)})}var G2,Y2,j2,q2,J2,qS,W2,V2,Wp,bpe,Spe,vpe,xpe,Ppe,Dpe,kpe,Rpe,Fpe,Npe,zp,Lpe,Tpe,Ope,Mpe,X2,Kpe,Upe,Hpe,Gpe,Ype,jpe,qpe,Jpe,Vp,Wpe,zpe,Vpe,Xpe,_pe,Zpe,$pe,ede,tde,rde,Xl,ide,JS,ns=Yue(()=>{G2=/^[a-zA-Z_][a-zA-Z0-9_]*$/,Y2=/^#[0-9a-f]{6}$/i,j2=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,q2=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,J2=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,qS=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,W2=r=>()=>r;V2=()=>bt({test:(r,e)=>!0});Wp=()=>bt({test:(r,e)=>typeof r!="string"?pt(e,`Expected a string (got ${Vr(r)})`):!0});bpe=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),Spe=()=>bt({test:(r,e)=>{var t;if(typeof r!="boolean"){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i=bpe.get(r);if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a boolean (got ${Vr(r)})`)}return!0}}),vpe=()=>bt({test:(r,e)=>{var t;if(typeof r!="number"){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i;if(typeof r=="string"){let n;try{n=JSON.parse(r)}catch{}if(typeof n=="number")if(JSON.stringify(n)===r)i=n;else return pt(e,`Received a number that can't be safely represented by the runtime (${r})`)}if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a number (got ${Vr(r)})`)}return!0}}),xpe=()=>bt({test:(r,e)=>{var t;if(!(r instanceof Date)){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i;if(typeof r=="string"&&qS.test(r))i=new Date(r);else{let n;if(typeof r=="string"){let s;try{s=JSON.parse(r)}catch{}typeof s=="number"&&(n=s)}else typeof r=="number"&&(n=r);if(typeof n<"u")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return pt(e,`Received a timestamp that can't be safely represented by the runtime (${r})`)}if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a date (got ${Vr(r)})`)}return!0}}),Ppe=(r,{delimiter:e}={})=>bt({test:(t,i)=>{var n;if(typeof t=="string"&&typeof e<"u"&&typeof(i==null?void 0:i.coercions)<"u"){if(typeof(i==null?void 0:i.coercion)>"u")return pt(i,"Unbound coercion result");t=t.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,t)])}if(!Array.isArray(t))return pt(i,`Expected an array (got ${Vr(t)})`);let s=!0;for(let o=0,a=t.length;o{let t=X2(r.length);return bt({test:(i,n)=>{var s;if(typeof i=="string"&&typeof e<"u"&&typeof(n==null?void 0:n.coercions)<"u"){if(typeof(n==null?void 0:n.coercion)>"u")return pt(n,"Unbound coercion result");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:".",n.coercion.bind(null,i)])}if(!Array.isArray(i))return pt(n,`Expected a tuple (got ${Vr(i)})`);let o=t(i,Object.assign({},n));for(let a=0,l=i.length;abt({test:(t,i)=>{if(typeof t!="object"||t===null)return pt(i,`Expected an object (got ${Vr(t)})`);let n=Object.keys(t),s=!0;for(let o=0,a=n.length;o{let t=Object.keys(r);return bt({test:(i,n)=>{if(typeof i!="object"||i===null)return pt(n,`Expected an object (got ${Vr(i)})`);let s=new Set([...t,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l==="constructor"||l==="__proto__")a=pt(Object.assign(Object.assign({},n),{p:BA(n,l)}),"Unsafe property name");else{let c=Object.prototype.hasOwnProperty.call(r,l)?r[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c<"u"?a=c(u,Object.assign(Object.assign({},n),{p:BA(n,l),coercion:_l(i,l)}))&&a:e===null?a=pt(Object.assign(Object.assign({},n),{p:BA(n,l)}),`Extraneous property (got ${Vr(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:z2(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},Fpe=r=>bt({test:(e,t)=>e instanceof r?!0:pt(t,`Expected an instance of ${r.name} (got ${Vr(e)})`)}),Npe=(r,{exclusive:e=!1}={})=>bt({test:(t,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)<"u"?[]:void 0;for(let c=0,u=r.length;c1?pt(i,`Expected to match exactly a single predicate (matched ${a.join(", ")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),zp=(r,e)=>bt({test:(t,i)=>{var n,s;let o={value:t},a=typeof(i==null?void 0:i.coercions)<"u"?_l(o,"value"):void 0,l=typeof(i==null?void 0:i.coercions)<"u"?[]:void 0;if(!r(t,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l<"u")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)<"u"){if(o.value!==t){if(typeof(i==null?void 0:i.coercion)>"u")return pt(i,"Unbound coercion result");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),Lpe=r=>bt({test:(e,t)=>typeof e>"u"?!0:r(e,t)}),Tpe=r=>bt({test:(e,t)=>e===null?!0:r(e,t)}),Ope=r=>bt({test:(e,t)=>e.length>=r?!0:pt(t,`Expected to have a length of at least ${r} elements (got ${e.length})`)}),Mpe=r=>bt({test:(e,t)=>e.length<=r?!0:pt(t,`Expected to have a length of at most ${r} elements (got ${e.length})`)}),X2=r=>bt({test:(e,t)=>e.length!==r?pt(t,`Expected to have a length of exactly ${r} elements (got ${e.length})`):!0}),Kpe=({map:r}={})=>bt({test:(e,t)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;sbt({test:(r,e)=>r<=0?!0:pt(e,`Expected to be negative (got ${r})`)}),Hpe=()=>bt({test:(r,e)=>r>=0?!0:pt(e,`Expected to be positive (got ${r})`)}),Gpe=r=>bt({test:(e,t)=>e>=r?!0:pt(t,`Expected to be at least ${r} (got ${e})`)}),Ype=r=>bt({test:(e,t)=>e<=r?!0:pt(t,`Expected to be at most ${r} (got ${e})`)}),jpe=(r,e)=>bt({test:(t,i)=>t>=r&&t<=e?!0:pt(i,`Expected to be in the [${r}; ${e}] range (got ${t})`)}),qpe=(r,e)=>bt({test:(t,i)=>t>=r&&tbt({test:(e,t)=>e!==Math.round(e)?pt(t,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:pt(t,`Expected to be a safe integer (got ${e})`)}),Vp=r=>bt({test:(e,t)=>r.test(e)?!0:pt(t,`Expected to match the pattern ${r.toString()} (got ${Vr(e)})`)}),Wpe=()=>bt({test:(r,e)=>r!==r.toLowerCase()?pt(e,`Expected to be all-lowercase (got ${r})`):!0}),zpe=()=>bt({test:(r,e)=>r!==r.toUpperCase()?pt(e,`Expected to be all-uppercase (got ${r})`):!0}),Vpe=()=>bt({test:(r,e)=>J2.test(r)?!0:pt(e,`Expected to be a valid UUID v4 (got ${Vr(r)})`)}),Xpe=()=>bt({test:(r,e)=>qS.test(r)?!1:pt(e,`Expected to be a valid ISO 8601 date string (got ${Vr(r)})`)}),_pe=({alpha:r=!1})=>bt({test:(e,t)=>(r?Y2.test(e):j2.test(e))?!0:pt(t,`Expected to be a valid hexadecimal color string (got ${Vr(e)})`)}),Zpe=()=>bt({test:(r,e)=>q2.test(r)?!0:pt(e,`Expected to be a valid base 64 string (got ${Vr(r)})`)}),$pe=(r=V2())=>bt({test:(e,t)=>{let i;try{i=JSON.parse(e)}catch{return pt(t,`Expected to be a valid JSON string (got ${Vr(e)})`)}return r(i,t)}}),ede=r=>{let e=new Set(r);return bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?pt(i,`Missing required ${EI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},tde=r=>{let e=new Set(r);return bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?pt(i,`Forbidden ${EI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},rde=r=>{let e=new Set(r);return bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?pt(i,`Mutually exclusive properties ${s.map(o=>`"${o}"`).join(", ")}`):!0}})};(function(r){r.Forbids="Forbids",r.Requires="Requires"})(Xl||(Xl={}));ide={[Xl.Forbids]:{expect:!1,message:"forbids using"},[Xl.Requires]:{expect:!0,message:"requires using"}},JS=(r,e,t,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(t),o=ide[e];return bt({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(r)||n.has(a[r]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?pt(l,`Property "${r}" ${o.message} ${EI(u.length,"property","properties")} ${u.map(g=>`"${g}"`).join(", ")}`):!0}})}});var fH=w((V_e,gH)=>{"use strict";gH.exports=(r,...e)=>new Promise(t=>{t(r(...e))})});var Tg=w((X_e,ev)=>{"use strict";var Ide=fH(),hH=r=>{if(r<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],t=0,i=()=>{t--,e.length>0&&e.shift()()},n=(a,l,...c)=>{t++;let u=Ide(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{tnew Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>t},pendingCount:{get:()=>e.length}}),o};ev.exports=hH;ev.exports.default=hH});var ed=w((Z_e,pH)=>{var yde="2.0.0",wde=Number.MAX_SAFE_INTEGER||9007199254740991,Bde=16;pH.exports={SEMVER_SPEC_VERSION:yde,MAX_LENGTH:256,MAX_SAFE_INTEGER:wde,MAX_SAFE_COMPONENT_LENGTH:Bde}});var td=w(($_e,dH)=>{var Qde=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...r)=>console.error("SEMVER",...r):()=>{};dH.exports=Qde});var Zl=w((bA,CH)=>{var{MAX_SAFE_COMPONENT_LENGTH:tv}=ed(),bde=td();bA=CH.exports={};var Sde=bA.re=[],$e=bA.src=[],et=bA.t={},vde=0,St=(r,e,t)=>{let i=vde++;bde(i,e),et[r]=i,$e[i]=e,Sde[i]=new RegExp(e,t?"g":void 0)};St("NUMERICIDENTIFIER","0|[1-9]\\d*");St("NUMERICIDENTIFIERLOOSE","[0-9]+");St("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");St("MAINVERSION",`(${$e[et.NUMERICIDENTIFIER]})\\.(${$e[et.NUMERICIDENTIFIER]})\\.(${$e[et.NUMERICIDENTIFIER]})`);St("MAINVERSIONLOOSE",`(${$e[et.NUMERICIDENTIFIERLOOSE]})\\.(${$e[et.NUMERICIDENTIFIERLOOSE]})\\.(${$e[et.NUMERICIDENTIFIERLOOSE]})`);St("PRERELEASEIDENTIFIER",`(?:${$e[et.NUMERICIDENTIFIER]}|${$e[et.NONNUMERICIDENTIFIER]})`);St("PRERELEASEIDENTIFIERLOOSE",`(?:${$e[et.NUMERICIDENTIFIERLOOSE]}|${$e[et.NONNUMERICIDENTIFIER]})`);St("PRERELEASE",`(?:-(${$e[et.PRERELEASEIDENTIFIER]}(?:\\.${$e[et.PRERELEASEIDENTIFIER]})*))`);St("PRERELEASELOOSE",`(?:-?(${$e[et.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${$e[et.PRERELEASEIDENTIFIERLOOSE]})*))`);St("BUILDIDENTIFIER","[0-9A-Za-z-]+");St("BUILD",`(?:\\+(${$e[et.BUILDIDENTIFIER]}(?:\\.${$e[et.BUILDIDENTIFIER]})*))`);St("FULLPLAIN",`v?${$e[et.MAINVERSION]}${$e[et.PRERELEASE]}?${$e[et.BUILD]}?`);St("FULL",`^${$e[et.FULLPLAIN]}$`);St("LOOSEPLAIN",`[v=\\s]*${$e[et.MAINVERSIONLOOSE]}${$e[et.PRERELEASELOOSE]}?${$e[et.BUILD]}?`);St("LOOSE",`^${$e[et.LOOSEPLAIN]}$`);St("GTLT","((?:<|>)?=?)");St("XRANGEIDENTIFIERLOOSE",`${$e[et.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);St("XRANGEIDENTIFIER",`${$e[et.NUMERICIDENTIFIER]}|x|X|\\*`);St("XRANGEPLAIN",`[v=\\s]*(${$e[et.XRANGEIDENTIFIER]})(?:\\.(${$e[et.XRANGEIDENTIFIER]})(?:\\.(${$e[et.XRANGEIDENTIFIER]})(?:${$e[et.PRERELEASE]})?${$e[et.BUILD]}?)?)?`);St("XRANGEPLAINLOOSE",`[v=\\s]*(${$e[et.XRANGEIDENTIFIERLOOSE]})(?:\\.(${$e[et.XRANGEIDENTIFIERLOOSE]})(?:\\.(${$e[et.XRANGEIDENTIFIERLOOSE]})(?:${$e[et.PRERELEASELOOSE]})?${$e[et.BUILD]}?)?)?`);St("XRANGE",`^${$e[et.GTLT]}\\s*${$e[et.XRANGEPLAIN]}$`);St("XRANGELOOSE",`^${$e[et.GTLT]}\\s*${$e[et.XRANGEPLAINLOOSE]}$`);St("COERCE",`(^|[^\\d])(\\d{1,${tv}})(?:\\.(\\d{1,${tv}}))?(?:\\.(\\d{1,${tv}}))?(?:$|[^\\d])`);St("COERCERTL",$e[et.COERCE],!0);St("LONETILDE","(?:~>?)");St("TILDETRIM",`(\\s*)${$e[et.LONETILDE]}\\s+`,!0);bA.tildeTrimReplace="$1~";St("TILDE",`^${$e[et.LONETILDE]}${$e[et.XRANGEPLAIN]}$`);St("TILDELOOSE",`^${$e[et.LONETILDE]}${$e[et.XRANGEPLAINLOOSE]}$`);St("LONECARET","(?:\\^)");St("CARETTRIM",`(\\s*)${$e[et.LONECARET]}\\s+`,!0);bA.caretTrimReplace="$1^";St("CARET",`^${$e[et.LONECARET]}${$e[et.XRANGEPLAIN]}$`);St("CARETLOOSE",`^${$e[et.LONECARET]}${$e[et.XRANGEPLAINLOOSE]}$`);St("COMPARATORLOOSE",`^${$e[et.GTLT]}\\s*(${$e[et.LOOSEPLAIN]})$|^$`);St("COMPARATOR",`^${$e[et.GTLT]}\\s*(${$e[et.FULLPLAIN]})$|^$`);St("COMPARATORTRIM",`(\\s*)${$e[et.GTLT]}\\s*(${$e[et.LOOSEPLAIN]}|${$e[et.XRANGEPLAIN]})`,!0);bA.comparatorTrimReplace="$1$2$3";St("HYPHENRANGE",`^\\s*(${$e[et.XRANGEPLAIN]})\\s+-\\s+(${$e[et.XRANGEPLAIN]})\\s*$`);St("HYPHENRANGELOOSE",`^\\s*(${$e[et.XRANGEPLAINLOOSE]})\\s+-\\s+(${$e[et.XRANGEPLAINLOOSE]})\\s*$`);St("STAR","(<|>)?=?\\s*\\*");St("GTE0","^\\s*>=\\s*0.0.0\\s*$");St("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")});var rd=w((eZe,mH)=>{var xde=["includePrerelease","loose","rtl"],Pde=r=>r?typeof r!="object"?{loose:!0}:xde.filter(e=>r[e]).reduce((e,t)=>(e[t]=!0,e),{}):{};mH.exports=Pde});var bI=w((tZe,yH)=>{var EH=/^[0-9]+$/,IH=(r,e)=>{let t=EH.test(r),i=EH.test(e);return t&&i&&(r=+r,e=+e),r===e?0:t&&!i?-1:i&&!t?1:rIH(e,r);yH.exports={compareIdentifiers:IH,rcompareIdentifiers:Dde}});var Li=w((rZe,bH)=>{var SI=td(),{MAX_LENGTH:wH,MAX_SAFE_INTEGER:vI}=ed(),{re:BH,t:QH}=Zl(),kde=rd(),{compareIdentifiers:id}=bI(),Un=class{constructor(e,t){if(t=kde(t),e instanceof Un){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>wH)throw new TypeError(`version is longer than ${wH} characters`);SI("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let i=e.trim().match(t.loose?BH[QH.LOOSE]:BH[QH.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>vI||this.major<0)throw new TypeError("Invalid major version");if(this.minor>vI||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>vI||this.patch<0)throw new TypeError("Invalid patch version");i[4]?this.prerelease=i[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};bH.exports=Un});var $l=w((iZe,PH)=>{var{MAX_LENGTH:Rde}=ed(),{re:SH,t:vH}=Zl(),xH=Li(),Fde=rd(),Nde=(r,e)=>{if(e=Fde(e),r instanceof xH)return r;if(typeof r!="string"||r.length>Rde||!(e.loose?SH[vH.LOOSE]:SH[vH.FULL]).test(r))return null;try{return new xH(r,e)}catch{return null}};PH.exports=Nde});var kH=w((nZe,DH)=>{var Lde=$l(),Tde=(r,e)=>{let t=Lde(r,e);return t?t.version:null};DH.exports=Tde});var FH=w((sZe,RH)=>{var Ode=$l(),Mde=(r,e)=>{let t=Ode(r.trim().replace(/^[=v]+/,""),e);return t?t.version:null};RH.exports=Mde});var LH=w((oZe,NH)=>{var Kde=Li(),Ude=(r,e,t,i)=>{typeof t=="string"&&(i=t,t=void 0);try{return new Kde(r,t).inc(e,i).version}catch{return null}};NH.exports=Ude});var ss=w((aZe,OH)=>{var TH=Li(),Hde=(r,e,t)=>new TH(r,t).compare(new TH(e,t));OH.exports=Hde});var xI=w((AZe,MH)=>{var Gde=ss(),Yde=(r,e,t)=>Gde(r,e,t)===0;MH.exports=Yde});var HH=w((lZe,UH)=>{var KH=$l(),jde=xI(),qde=(r,e)=>{if(jde(r,e))return null;{let t=KH(r),i=KH(e),n=t.prerelease.length||i.prerelease.length,s=n?"pre":"",o=n?"prerelease":"";for(let a in t)if((a==="major"||a==="minor"||a==="patch")&&t[a]!==i[a])return s+a;return o}};UH.exports=qde});var YH=w((cZe,GH)=>{var Jde=Li(),Wde=(r,e)=>new Jde(r,e).major;GH.exports=Wde});var qH=w((uZe,jH)=>{var zde=Li(),Vde=(r,e)=>new zde(r,e).minor;jH.exports=Vde});var WH=w((gZe,JH)=>{var Xde=Li(),_de=(r,e)=>new Xde(r,e).patch;JH.exports=_de});var VH=w((fZe,zH)=>{var Zde=$l(),$de=(r,e)=>{let t=Zde(r,e);return t&&t.prerelease.length?t.prerelease:null};zH.exports=$de});var _H=w((hZe,XH)=>{var eCe=ss(),tCe=(r,e,t)=>eCe(e,r,t);XH.exports=tCe});var $H=w((pZe,ZH)=>{var rCe=ss(),iCe=(r,e)=>rCe(r,e,!0);ZH.exports=iCe});var PI=w((dZe,tG)=>{var eG=Li(),nCe=(r,e,t)=>{let i=new eG(r,t),n=new eG(e,t);return i.compare(n)||i.compareBuild(n)};tG.exports=nCe});var iG=w((CZe,rG)=>{var sCe=PI(),oCe=(r,e)=>r.sort((t,i)=>sCe(t,i,e));rG.exports=oCe});var sG=w((mZe,nG)=>{var aCe=PI(),ACe=(r,e)=>r.sort((t,i)=>aCe(i,t,e));nG.exports=ACe});var nd=w((EZe,oG)=>{var lCe=ss(),cCe=(r,e,t)=>lCe(r,e,t)>0;oG.exports=cCe});var DI=w((IZe,aG)=>{var uCe=ss(),gCe=(r,e,t)=>uCe(r,e,t)<0;aG.exports=gCe});var rv=w((yZe,AG)=>{var fCe=ss(),hCe=(r,e,t)=>fCe(r,e,t)!==0;AG.exports=hCe});var kI=w((wZe,lG)=>{var pCe=ss(),dCe=(r,e,t)=>pCe(r,e,t)>=0;lG.exports=dCe});var RI=w((BZe,cG)=>{var CCe=ss(),mCe=(r,e,t)=>CCe(r,e,t)<=0;cG.exports=mCe});var iv=w((QZe,uG)=>{var ECe=xI(),ICe=rv(),yCe=nd(),wCe=kI(),BCe=DI(),QCe=RI(),bCe=(r,e,t,i)=>{switch(e){case"===":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r===t;case"!==":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r!==t;case"":case"=":case"==":return ECe(r,t,i);case"!=":return ICe(r,t,i);case">":return yCe(r,t,i);case">=":return wCe(r,t,i);case"<":return BCe(r,t,i);case"<=":return QCe(r,t,i);default:throw new TypeError(`Invalid operator: ${e}`)}};uG.exports=bCe});var fG=w((bZe,gG)=>{var SCe=Li(),vCe=$l(),{re:FI,t:NI}=Zl(),xCe=(r,e)=>{if(r instanceof SCe)return r;if(typeof r=="number"&&(r=String(r)),typeof r!="string")return null;e=e||{};let t=null;if(!e.rtl)t=r.match(FI[NI.COERCE]);else{let i;for(;(i=FI[NI.COERCERTL].exec(r))&&(!t||t.index+t[0].length!==r.length);)(!t||i.index+i[0].length!==t.index+t[0].length)&&(t=i),FI[NI.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;FI[NI.COERCERTL].lastIndex=-1}return t===null?null:vCe(`${t[2]}.${t[3]||"0"}.${t[4]||"0"}`,e)};gG.exports=xCe});var pG=w((SZe,hG)=>{"use strict";hG.exports=function(r){r.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var sd=w((vZe,dG)=>{"use strict";dG.exports=Ht;Ht.Node=ec;Ht.create=Ht;function Ht(r){var e=this;if(e instanceof Ht||(e=new Ht),e.tail=null,e.head=null,e.length=0,r&&typeof r.forEach=="function")r.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var t=0,i=arguments.length;t1)t=e;else if(this.head)i=this.head.next,t=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;i!==null;n++)t=r(t,i.value,n),i=i.next;return t};Ht.prototype.reduceReverse=function(r,e){var t,i=this.tail;if(arguments.length>1)t=e;else if(this.tail)i=this.tail.prev,t=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=this.length-1;i!==null;n--)t=r(t,i.value,n),i=i.prev;return t};Ht.prototype.toArray=function(){for(var r=new Array(this.length),e=0,t=this.head;t!==null;e++)r[e]=t.value,t=t.next;return r};Ht.prototype.toArrayReverse=function(){for(var r=new Array(this.length),e=0,t=this.tail;t!==null;e++)r[e]=t.value,t=t.prev;return r};Ht.prototype.slice=function(r,e){e=e||this.length,e<0&&(e+=this.length),r=r||0,r<0&&(r+=this.length);var t=new Ht;if(ethis.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&ithis.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>r;i--,n=n.prev)t.push(n.value);return t};Ht.prototype.splice=function(r,e,...t){r>this.length&&(r=this.length-1),r<0&&(r=this.length+r);for(var i=0,n=this.head;n!==null&&i{"use strict";var RCe=sd(),tc=Symbol("max"),Ia=Symbol("length"),Og=Symbol("lengthCalculator"),ad=Symbol("allowStale"),rc=Symbol("maxAge"),Ea=Symbol("dispose"),CG=Symbol("noDisposeOnSet"),di=Symbol("lruList"),Ws=Symbol("cache"),EG=Symbol("updateAgeOnGet"),nv=()=>1,ov=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let t=this[tc]=e.max||1/0,i=e.length||nv;if(this[Og]=typeof i!="function"?nv:i,this[ad]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[rc]=e.maxAge||0,this[Ea]=e.dispose,this[CG]=e.noDisposeOnSet||!1,this[EG]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[tc]=e||1/0,od(this)}get max(){return this[tc]}set allowStale(e){this[ad]=!!e}get allowStale(){return this[ad]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[rc]=e,od(this)}get maxAge(){return this[rc]}set lengthCalculator(e){typeof e!="function"&&(e=nv),e!==this[Og]&&(this[Og]=e,this[Ia]=0,this[di].forEach(t=>{t.length=this[Og](t.value,t.key),this[Ia]+=t.length})),od(this)}get lengthCalculator(){return this[Og]}get length(){return this[Ia]}get itemCount(){return this[di].length}rforEach(e,t){t=t||this;for(let i=this[di].tail;i!==null;){let n=i.prev;mG(this,e,i,t),i=n}}forEach(e,t){t=t||this;for(let i=this[di].head;i!==null;){let n=i.next;mG(this,e,i,t),i=n}}keys(){return this[di].toArray().map(e=>e.key)}values(){return this[di].toArray().map(e=>e.value)}reset(){this[Ea]&&this[di]&&this[di].length&&this[di].forEach(e=>this[Ea](e.key,e.value)),this[Ws]=new Map,this[di]=new RCe,this[Ia]=0}dump(){return this[di].map(e=>LI(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[di]}set(e,t,i){if(i=i||this[rc],i&&typeof i!="number")throw new TypeError("maxAge must be a number");let n=i?Date.now():0,s=this[Og](t,e);if(this[Ws].has(e)){if(s>this[tc])return Mg(this,this[Ws].get(e)),!1;let l=this[Ws].get(e).value;return this[Ea]&&(this[CG]||this[Ea](e,l.value)),l.now=n,l.maxAge=i,l.value=t,this[Ia]+=s-l.length,l.length=s,this.get(e),od(this),!0}let o=new av(e,t,s,n,i);return o.length>this[tc]?(this[Ea]&&this[Ea](e,t),!1):(this[Ia]+=o.length,this[di].unshift(o),this[Ws].set(e,this[di].head),od(this),!0)}has(e){if(!this[Ws].has(e))return!1;let t=this[Ws].get(e).value;return!LI(this,t)}get(e){return sv(this,e,!0)}peek(e){return sv(this,e,!1)}pop(){let e=this[di].tail;return e?(Mg(this,e),e.value):null}del(e){Mg(this,this[Ws].get(e))}load(e){this.reset();let t=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-t;o>0&&this.set(n.k,n.v,o)}}}prune(){this[Ws].forEach((e,t)=>sv(this,t,!1))}},sv=(r,e,t)=>{let i=r[Ws].get(e);if(i){let n=i.value;if(LI(r,n)){if(Mg(r,i),!r[ad])return}else t&&(r[EG]&&(i.value.now=Date.now()),r[di].unshiftNode(i));return n.value}},LI=(r,e)=>{if(!e||!e.maxAge&&!r[rc])return!1;let t=Date.now()-e.now;return e.maxAge?t>e.maxAge:r[rc]&&t>r[rc]},od=r=>{if(r[Ia]>r[tc])for(let e=r[di].tail;r[Ia]>r[tc]&&e!==null;){let t=e.prev;Mg(r,e),e=t}},Mg=(r,e)=>{if(e){let t=e.value;r[Ea]&&r[Ea](t.key,t.value),r[Ia]-=t.length,r[Ws].delete(t.key),r[di].removeNode(e)}},av=class{constructor(e,t,i,n,s){this.key=e,this.value=t,this.length=i,this.now=n,this.maxAge=s||0}},mG=(r,e,t,i)=>{let n=t.value;LI(r,n)&&(Mg(r,t),r[ad]||(n=void 0)),n&&e.call(i,n.value,n.key,r)};IG.exports=ov});var os=w((PZe,bG)=>{var ic=class{constructor(e,t){if(t=NCe(t),e instanceof ic)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new ic(e.raw,t);if(e instanceof Av)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!BG(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&KCe(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(",")}:${e}`,n=wG.get(i);if(n)return n;let s=this.options.loose,o=s?Ti[Bi.HYPHENRANGELOOSE]:Ti[Bi.HYPHENRANGE];e=e.replace(o,VCe(this.options.includePrerelease)),Gr("hyphen replace",e),e=e.replace(Ti[Bi.COMPARATORTRIM],TCe),Gr("comparator trim",e,Ti[Bi.COMPARATORTRIM]),e=e.replace(Ti[Bi.TILDETRIM],OCe),e=e.replace(Ti[Bi.CARETTRIM],MCe),e=e.split(/\s+/).join(" ");let a=s?Ti[Bi.COMPARATORLOOSE]:Ti[Bi.COMPARATOR],l=e.split(" ").map(f=>UCe(f,this.options)).join(" ").split(/\s+/).map(f=>zCe(f,this.options)).filter(this.options.loose?f=>!!f.match(a):()=>!0).map(f=>new Av(f,this.options)),c=l.length,u=new Map;for(let f of l){if(BG(f))return[f];u.set(f.value,f)}u.size>1&&u.has("")&&u.delete("");let g=[...u.values()];return wG.set(i,g),g}intersects(e,t){if(!(e instanceof ic))throw new TypeError("a Range is required");return this.set.some(i=>QG(i,t)&&e.set.some(n=>QG(n,t)&&i.every(s=>n.every(o=>s.intersects(o,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new LCe(e,this.options)}catch{return!1}for(let t=0;tr.value==="<0.0.0-0",KCe=r=>r.value==="",QG=(r,e)=>{let t=!0,i=r.slice(),n=i.pop();for(;t&&i.length;)t=i.every(s=>n.intersects(s,e)),n=i.pop();return t},UCe=(r,e)=>(Gr("comp",r,e),r=YCe(r,e),Gr("caret",r),r=HCe(r,e),Gr("tildes",r),r=qCe(r,e),Gr("xrange",r),r=WCe(r,e),Gr("stars",r),r),Vi=r=>!r||r.toLowerCase()==="x"||r==="*",HCe=(r,e)=>r.trim().split(/\s+/).map(t=>GCe(t,e)).join(" "),GCe=(r,e)=>{let t=e.loose?Ti[Bi.TILDELOOSE]:Ti[Bi.TILDE];return r.replace(t,(i,n,s,o,a)=>{Gr("tilde",r,i,n,s,o,a);let l;return Vi(n)?l="":Vi(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:Vi(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(Gr("replaceTilde pr",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,Gr("tilde return",l),l})},YCe=(r,e)=>r.trim().split(/\s+/).map(t=>jCe(t,e)).join(" "),jCe=(r,e)=>{Gr("caret",r,e);let t=e.loose?Ti[Bi.CARETLOOSE]:Ti[Bi.CARET],i=e.includePrerelease?"-0":"";return r.replace(t,(n,s,o,a,l)=>{Gr("caret",r,n,s,o,a,l);let c;return Vi(s)?c="":Vi(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:Vi(a)?s==="0"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(Gr("replaceCaret pr",l),s==="0"?o==="0"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(Gr("no pr"),s==="0"?o==="0"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),Gr("caret return",c),c})},qCe=(r,e)=>(Gr("replaceXRanges",r,e),r.split(/\s+/).map(t=>JCe(t,e)).join(" ")),JCe=(r,e)=>{r=r.trim();let t=e.loose?Ti[Bi.XRANGELOOSE]:Ti[Bi.XRANGE];return r.replace(t,(i,n,s,o,a,l)=>{Gr("xRange",r,i,n,s,o,a,l);let c=Vi(s),u=c||Vi(o),g=u||Vi(a),f=g;return n==="="&&f&&(n=""),l=e.includePrerelease?"-0":"",c?n===">"||n==="<"?i="<0.0.0-0":i="*":n&&f?(u&&(o=0),a=0,n===">"?(n=">=",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n==="<="&&(n="<",u?s=+s+1:o=+o+1),n==="<"&&(l="-0"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),Gr("xRange return",i),i})},WCe=(r,e)=>(Gr("replaceStars",r,e),r.trim().replace(Ti[Bi.STAR],"")),zCe=(r,e)=>(Gr("replaceGTE0",r,e),r.trim().replace(Ti[e.includePrerelease?Bi.GTE0PRE:Bi.GTE0],"")),VCe=r=>(e,t,i,n,s,o,a,l,c,u,g,f,h)=>(Vi(i)?t="":Vi(n)?t=`>=${i}.0.0${r?"-0":""}`:Vi(s)?t=`>=${i}.${n}.0${r?"-0":""}`:o?t=`>=${t}`:t=`>=${t}${r?"-0":""}`,Vi(c)?l="":Vi(u)?l=`<${+c+1}.0.0-0`:Vi(g)?l=`<${c}.${+u+1}.0-0`:f?l=`<=${c}.${u}.${g}-${f}`:r?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),XCe=(r,e,t)=>{for(let i=0;i0){let n=r[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Ad=w((DZe,DG)=>{var ld=Symbol("SemVer ANY"),Kg=class{static get ANY(){return ld}constructor(e,t){if(t=_Ce(t),e instanceof Kg){if(e.loose===!!t.loose)return e;e=e.value}cv("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===ld?this.value="":this.value=this.operator+this.semver.version,cv("comp",this)}parse(e){let t=this.options.loose?SG[vG.COMPARATORLOOSE]:SG[vG.COMPARATOR],i=e.match(t);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:"",this.operator==="="&&(this.operator=""),i[2]?this.semver=new xG(i[2],this.options.loose):this.semver=ld}toString(){return this.value}test(e){if(cv("Comparator.test",e,this.options.loose),this.semver===ld||e===ld)return!0;if(typeof e=="string")try{e=new xG(e,this.options)}catch{return!1}return lv(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof Kg))throw new TypeError("a Comparator is required");if((!t||typeof t!="object")&&(t={loose:!!t,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new PG(e.value,t).test(this.value);if(e.operator==="")return e.value===""?!0:new PG(this.value,t).test(e.semver);let i=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),n=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),s=this.semver.version===e.semver.version,o=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),a=lv(this.semver,"<",e.semver,t)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),l=lv(this.semver,">",e.semver,t)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return i||n||s&&o||a||l}};DG.exports=Kg;var _Ce=rd(),{re:SG,t:vG}=Zl(),lv=iv(),cv=td(),xG=Li(),PG=os()});var cd=w((kZe,kG)=>{var ZCe=os(),$Ce=(r,e,t)=>{try{e=new ZCe(e,t)}catch{return!1}return e.test(r)};kG.exports=$Ce});var FG=w((RZe,RG)=>{var eme=os(),tme=(r,e)=>new eme(r,e).set.map(t=>t.map(i=>i.value).join(" ").trim().split(" "));RG.exports=tme});var LG=w((FZe,NG)=>{var rme=Li(),ime=os(),nme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new ime(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new rme(i,t))}),i};NG.exports=nme});var OG=w((NZe,TG)=>{var sme=Li(),ome=os(),ame=(r,e,t)=>{let i=null,n=null,s=null;try{s=new ome(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new sme(i,t))}),i};TG.exports=ame});var UG=w((LZe,KG)=>{var uv=Li(),Ame=os(),MG=nd(),lme=(r,e)=>{r=new Ame(r,e);let t=new uv("0.0.0");if(r.test(t)||(t=new uv("0.0.0-0"),r.test(t)))return t;t=null;for(let i=0;i{let a=new uv(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||MG(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!t||MG(t,s))&&(t=s)}return t&&r.test(t)?t:null};KG.exports=lme});var GG=w((TZe,HG)=>{var cme=os(),ume=(r,e)=>{try{return new cme(r,e).range||"*"}catch{return null}};HG.exports=ume});var TI=w((OZe,JG)=>{var gme=Li(),qG=Ad(),{ANY:fme}=qG,hme=os(),pme=cd(),YG=nd(),jG=DI(),dme=RI(),Cme=kI(),mme=(r,e,t,i)=>{r=new gme(r,i),e=new hme(e,i);let n,s,o,a,l;switch(t){case">":n=YG,s=dme,o=jG,a=">",l=">=";break;case"<":n=jG,s=Cme,o=YG,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(pme(r,e,i))return!1;for(let c=0;c{h.semver===fme&&(h=new qG(">=0.0.0")),g=g||h,f=f||h,n(h.semver,g.semver,i)?g=h:o(h.semver,f.semver,i)&&(f=h)}),g.operator===a||g.operator===l||(!f.operator||f.operator===a)&&s(r,f.semver))return!1;if(f.operator===l&&o(r,f.semver))return!1}return!0};JG.exports=mme});var zG=w((MZe,WG)=>{var Eme=TI(),Ime=(r,e,t)=>Eme(r,e,">",t);WG.exports=Ime});var XG=w((KZe,VG)=>{var yme=TI(),wme=(r,e,t)=>yme(r,e,"<",t);VG.exports=wme});var $G=w((UZe,ZG)=>{var _G=os(),Bme=(r,e,t)=>(r=new _G(r,t),e=new _G(e,t),r.intersects(e));ZG.exports=Bme});var tY=w((HZe,eY)=>{var Qme=cd(),bme=ss();eY.exports=(r,e,t)=>{let i=[],n=null,s=null,o=r.sort((u,g)=>bme(u,g,t));for(let u of o)Qme(u,e,t)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push("*"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(" || "),c=typeof e.raw=="string"?e.raw:String(e);return l.length{var rY=os(),OI=Ad(),{ANY:gv}=OI,ud=cd(),fv=ss(),Sme=(r,e,t={})=>{if(r===e)return!0;r=new rY(r,t),e=new rY(e,t);let i=!1;e:for(let n of r.set){for(let s of e.set){let o=vme(n,s,t);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},vme=(r,e,t)=>{if(r===e)return!0;if(r.length===1&&r[0].semver===gv){if(e.length===1&&e[0].semver===gv)return!0;t.includePrerelease?r=[new OI(">=0.0.0-0")]:r=[new OI(">=0.0.0")]}if(e.length===1&&e[0].semver===gv){if(t.includePrerelease)return!0;e=[new OI(">=0.0.0")]}let i=new Set,n,s;for(let h of r)h.operator===">"||h.operator===">="?n=iY(n,h,t):h.operator==="<"||h.operator==="<="?s=nY(s,h,t):i.add(h.semver);if(i.size>1)return null;let o;if(n&&s){if(o=fv(n.semver,s.semver,t),o>0)return null;if(o===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let h of i){if(n&&!ud(h,String(n),t)||s&&!ud(h,String(s),t))return null;for(let p of e)if(!ud(h,String(p),t))return!1;return!0}let a,l,c,u,g=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",c=c||h.operator==="<"||h.operator==="<=",n){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===">"||h.operator===">="){if(a=iY(n,h,t),a===h&&a!==n)return!1}else if(n.operator===">="&&!ud(n.semver,String(h),t))return!1}if(s){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator==="<"||h.operator==="<="){if(l=nY(s,h,t),l===h&&l!==s)return!1}else if(s.operator==="<="&&!ud(s.semver,String(h),t))return!1}if(!h.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||f||g)},iY=(r,e,t)=>{if(!r)return e;let i=fv(r.semver,e.semver,t);return i>0?r:i<0||e.operator===">"&&r.operator===">="?e:r},nY=(r,e,t)=>{if(!r)return e;let i=fv(r.semver,e.semver,t);return i<0?r:i>0||e.operator==="<"&&r.operator==="<="?e:r};sY.exports=Sme});var Xr=w((YZe,aY)=>{var hv=Zl();aY.exports={re:hv.re,src:hv.src,tokens:hv.t,SEMVER_SPEC_VERSION:ed().SEMVER_SPEC_VERSION,SemVer:Li(),compareIdentifiers:bI().compareIdentifiers,rcompareIdentifiers:bI().rcompareIdentifiers,parse:$l(),valid:kH(),clean:FH(),inc:LH(),diff:HH(),major:YH(),minor:qH(),patch:WH(),prerelease:VH(),compare:ss(),rcompare:_H(),compareLoose:$H(),compareBuild:PI(),sort:iG(),rsort:sG(),gt:nd(),lt:DI(),eq:xI(),neq:rv(),gte:kI(),lte:RI(),cmp:iv(),coerce:fG(),Comparator:Ad(),Range:os(),satisfies:cd(),toComparators:FG(),maxSatisfying:LG(),minSatisfying:OG(),minVersion:UG(),validRange:GG(),outside:TI(),gtr:zG(),ltr:XG(),intersects:$G(),simplifyRange:tY(),subset:oY()}});var pv=w(MI=>{"use strict";Object.defineProperty(MI,"__esModule",{value:!0});MI.VERSION=void 0;MI.VERSION="9.1.0"});var Gt=w((exports,module)=>{"use strict";var __spreadArray=exports&&exports.__spreadArray||function(r,e,t){if(t||arguments.length===2)for(var i=0,n=e.length,s;i{(function(r,e){typeof define=="function"&&define.amd?define([],e):typeof KI=="object"&&KI.exports?KI.exports=e():r.regexpToAst=e()})(typeof self<"u"?self:AY,function(){function r(){}r.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},r.prototype.restoreState=function(p){this.idx=p.idx,this.input=p.input,this.groupIdx=p.groupIdx},r.prototype.pattern=function(p){this.idx=0,this.input=p,this.groupIdx=0,this.consumeChar("/");var C=this.disjunction();this.consumeChar("/");for(var y={type:"Flags",loc:{begin:this.idx,end:p.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":o(y,"global");break;case"i":o(y,"ignoreCase");break;case"m":o(y,"multiLine");break;case"u":o(y,"unicode");break;case"y":o(y,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:y,value:C,loc:this.loc(0)}},r.prototype.disjunction=function(){var p=[],C=this.idx;for(p.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),p.push(this.alternative());return{type:"Disjunction",value:p,loc:this.loc(C)}},r.prototype.alternative=function(){for(var p=[],C=this.idx;this.isTerm();)p.push(this.term());return{type:"Alternative",value:p,loc:this.loc(C)}},r.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},r.prototype.assertion=function(){var p=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(p)};case"$":return{type:"EndAnchor",loc:this.loc(p)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(p)};case"B":return{type:"NonWordBoundary",loc:this.loc(p)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");var C;switch(this.popChar()){case"=":C="Lookahead";break;case"!":C="NegativeLookahead";break}a(C);var y=this.disjunction();return this.consumeChar(")"),{type:C,value:y,loc:this.loc(p)}}l()},r.prototype.quantifier=function(p){var C,y=this.idx;switch(this.popChar()){case"*":C={atLeast:0,atMost:1/0};break;case"+":C={atLeast:1,atMost:1/0};break;case"?":C={atLeast:0,atMost:1};break;case"{":var B=this.integerIncludingZero();switch(this.popChar()){case"}":C={atLeast:B,atMost:B};break;case",":var v;this.isDigit()?(v=this.integerIncludingZero(),C={atLeast:B,atMost:v}):C={atLeast:B,atMost:1/0},this.consumeChar("}");break}if(p===!0&&C===void 0)return;a(C);break}if(!(p===!0&&C===void 0))return a(C),this.peekChar(0)==="?"?(this.consumeChar("?"),C.greedy=!1):C.greedy=!0,C.type="Quantifier",C.loc=this.loc(y),C},r.prototype.atom=function(){var p,C=this.idx;switch(this.peekChar()){case".":p=this.dotAll();break;case"\\":p=this.atomEscape();break;case"[":p=this.characterClass();break;case"(":p=this.group();break}return p===void 0&&this.isPatternCharacter()&&(p=this.patternCharacter()),a(p),p.loc=this.loc(C),this.isQuantifier()&&(p.quantifier=this.quantifier()),p},r.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[n(`
+`),n("\r"),n("\u2028"),n("\u2029")]}},r.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},r.prototype.decimalEscapeAtom=function(){var p=this.positiveInteger();return{type:"GroupBackReference",value:p}},r.prototype.characterClassEscape=function(){var p,C=!1;switch(this.popChar()){case"d":p=u;break;case"D":p=u,C=!0;break;case"s":p=f;break;case"S":p=f,C=!0;break;case"w":p=g;break;case"W":p=g,C=!0;break}return a(p),{type:"Set",value:p,complement:C}},r.prototype.controlEscapeAtom=function(){var p;switch(this.popChar()){case"f":p=n("\f");break;case"n":p=n(`
+`);break;case"r":p=n("\r");break;case"t":p=n(" ");break;case"v":p=n("\v");break}return a(p),{type:"Character",value:p}},r.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var p=this.popChar();if(/[a-zA-Z]/.test(p)===!1)throw Error("Invalid ");var C=p.toUpperCase().charCodeAt(0)-64;return{type:"Character",value:C}},r.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:n("\0")}},r.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},r.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},r.prototype.identityEscapeAtom=function(){var p=this.popChar();return{type:"Character",value:n(p)}},r.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case`
+`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:var p=this.popChar();return{type:"Character",value:n(p)}}},r.prototype.characterClass=function(){var p=[],C=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),C=!0);this.isClassAtom();){var y=this.classAtom(),B=y.type==="Character";if(B&&this.isRangeDash()){this.consumeChar("-");var v=this.classAtom(),D=v.type==="Character";if(D){if(v.value=this.input.length)throw Error("Unexpected end of input");this.idx++},r.prototype.loc=function(p){return{begin:p,end:this.idx}};var e=/[0-9a-fA-F]/,t=/[0-9]/,i=/[1-9]/;function n(p){return p.charCodeAt(0)}function s(p,C){p.length!==void 0?p.forEach(function(y){C.push(y)}):C.push(p)}function o(p,C){if(p[C]===!0)throw"duplicate flag "+C;p[C]=!0}function a(p){if(p===void 0)throw Error("Internal Error - Should never get here!")}function l(){throw Error("Internal Error - Should never get here!")}var c,u=[];for(c=n("0");c<=n("9");c++)u.push(c);var g=[n("_")].concat(u);for(c=n("a");c<=n("z");c++)g.push(c);for(c=n("A");c<=n("Z");c++)g.push(c);var f=[n(" "),n("\f"),n(`
+`),n("\r"),n(" "),n("\v"),n(" "),n("\xA0"),n("\u1680"),n("\u2000"),n("\u2001"),n("\u2002"),n("\u2003"),n("\u2004"),n("\u2005"),n("\u2006"),n("\u2007"),n("\u2008"),n("\u2009"),n("\u200A"),n("\u2028"),n("\u2029"),n("\u202F"),n("\u205F"),n("\u3000"),n("\uFEFF")];function h(){}return h.prototype.visitChildren=function(p){for(var C in p){var y=p[C];p.hasOwnProperty(C)&&(y.type!==void 0?this.visit(y):Array.isArray(y)&&y.forEach(function(B){this.visit(B)},this))}},h.prototype.visit=function(p){switch(p.type){case"Pattern":this.visitPattern(p);break;case"Flags":this.visitFlags(p);break;case"Disjunction":this.visitDisjunction(p);break;case"Alternative":this.visitAlternative(p);break;case"StartAnchor":this.visitStartAnchor(p);break;case"EndAnchor":this.visitEndAnchor(p);break;case"WordBoundary":this.visitWordBoundary(p);break;case"NonWordBoundary":this.visitNonWordBoundary(p);break;case"Lookahead":this.visitLookahead(p);break;case"NegativeLookahead":this.visitNegativeLookahead(p);break;case"Character":this.visitCharacter(p);break;case"Set":this.visitSet(p);break;case"Group":this.visitGroup(p);break;case"GroupBackReference":this.visitGroupBackReference(p);break;case"Quantifier":this.visitQuantifier(p);break}this.visitChildren(p)},h.prototype.visitPattern=function(p){},h.prototype.visitFlags=function(p){},h.prototype.visitDisjunction=function(p){},h.prototype.visitAlternative=function(p){},h.prototype.visitStartAnchor=function(p){},h.prototype.visitEndAnchor=function(p){},h.prototype.visitWordBoundary=function(p){},h.prototype.visitNonWordBoundary=function(p){},h.prototype.visitLookahead=function(p){},h.prototype.visitNegativeLookahead=function(p){},h.prototype.visitCharacter=function(p){},h.prototype.visitSet=function(p){},h.prototype.visitGroup=function(p){},h.prototype.visitGroupBackReference=function(p){},h.prototype.visitQuantifier=function(p){},{RegExpParser:r,BaseRegExpVisitor:h,VERSION:"0.5.0"}})});var GI=w(Ug=>{"use strict";Object.defineProperty(Ug,"__esModule",{value:!0});Ug.clearRegExpParserCache=Ug.getRegExpAst=void 0;var xme=UI(),HI={},Pme=new xme.RegExpParser;function Dme(r){var e=r.toString();if(HI.hasOwnProperty(e))return HI[e];var t=Pme.pattern(e);return HI[e]=t,t}Ug.getRegExpAst=Dme;function kme(){HI={}}Ug.clearRegExpParserCache=kme});var fY=w(pn=>{"use strict";var Rme=pn&&pn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(pn,"__esModule",{value:!0});pn.canMatchCharCode=pn.firstCharOptimizedIndices=pn.getOptimizedStartCodesIndices=pn.failedOptimizationPrefixMsg=void 0;var cY=UI(),as=Gt(),uY=GI(),ya=Cv(),gY="Complement Sets are not supported for first char optimization";pn.failedOptimizationPrefixMsg=`Unable to use "first char" lexer optimizations:
+`;function Fme(r,e){e===void 0&&(e=!1);try{var t=(0,uY.getRegExpAst)(r),i=jI(t.value,{},t.flags.ignoreCase);return i}catch(s){if(s.message===gY)e&&(0,as.PRINT_WARNING)(""+pn.failedOptimizationPrefixMsg+(" Unable to optimize: < "+r.toString()+` >
+`)+` Complement Sets cannot be automatically optimized.
+ This will disable the lexer's first char optimizations.
+ See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n="";e&&(n=`
+ This will disable the lexer's first char optimizations.
+ See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,as.PRINT_ERROR)(pn.failedOptimizationPrefixMsg+`
+`+(" Failed parsing: < "+r.toString()+` >
+`)+(" Using the regexp-to-ast library version: "+cY.VERSION+`
+`)+" Please open an issue at: https://github.com/bd82/regexp-to-ast/issues"+n)}}return[]}pn.getOptimizedStartCodesIndices=Fme;function jI(r,e,t){switch(r.type){case"Disjunction":for(var i=0;i=ya.minOptimizationVal)for(var f=u.from>=ya.minOptimizationVal?u.from:ya.minOptimizationVal,h=u.to,p=(0,ya.charCodeToOptimizedIndex)(f),C=(0,ya.charCodeToOptimizedIndex)(h),y=p;y<=C;y++)e[y]=y}}});break;case"Group":jI(o.value,e,t);break;default:throw Error("Non Exhaustive Match")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type==="Group"&&dv(o)===!1||o.type!=="Group"&&a===!1)break}break;default:throw Error("non exhaustive match!")}return(0,as.values)(e)}pn.firstCharOptimizedIndices=jI;function YI(r,e,t){var i=(0,ya.charCodeToOptimizedIndex)(r);e[i]=i,t===!0&&Nme(r,e)}function Nme(r,e){var t=String.fromCharCode(r),i=t.toUpperCase();if(i!==t){var n=(0,ya.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=t.toLowerCase();if(s!==t){var n=(0,ya.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function lY(r,e){return(0,as.find)(r.value,function(t){if(typeof t=="number")return(0,as.contains)(e,t);var i=t;return(0,as.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function dv(r){return r.quantifier&&r.quantifier.atLeast===0?!0:r.value?(0,as.isArray)(r.value)?(0,as.every)(r.value,dv):dv(r.value):!1}var Lme=function(r){Rme(e,r);function e(t){var i=r.call(this)||this;return i.targetCharCodes=t,i.found=!1,i}return e.prototype.visitChildren=function(t){if(this.found!==!0){switch(t.type){case"Lookahead":this.visitLookahead(t);return;case"NegativeLookahead":this.visitNegativeLookahead(t);return}r.prototype.visitChildren.call(this,t)}},e.prototype.visitCharacter=function(t){(0,as.contains)(this.targetCharCodes,t.value)&&(this.found=!0)},e.prototype.visitSet=function(t){t.complement?lY(t,this.targetCharCodes)===void 0&&(this.found=!0):lY(t,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(cY.BaseRegExpVisitor);function Tme(r,e){if(e instanceof RegExp){var t=(0,uY.getRegExpAst)(e),i=new Lme(r);return i.visit(t),i.found}else return(0,as.find)(e,function(n){return(0,as.contains)(r,n.charCodeAt(0))})!==void 0}pn.canMatchCharCode=Tme});var Cv=w(Ve=>{"use strict";var hY=Ve&&Ve.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Ve,"__esModule",{value:!0});Ve.charCodeToOptimizedIndex=Ve.minOptimizationVal=Ve.buildLineBreakIssueMessage=Ve.LineTerminatorOptimizedTester=Ve.isShortPattern=Ve.isCustomPattern=Ve.cloneEmptyGroups=Ve.performWarningRuntimeChecks=Ve.performRuntimeChecks=Ve.addStickyFlag=Ve.addStartOfInput=Ve.findUnreachablePatterns=Ve.findModesThatDoNotExist=Ve.findInvalidGroupType=Ve.findDuplicatePatterns=Ve.findUnsupportedFlags=Ve.findStartOfInputAnchor=Ve.findEmptyMatchRegExps=Ve.findEndOfInputAnchor=Ve.findInvalidPatterns=Ve.findMissingPatterns=Ve.validatePatterns=Ve.analyzeTokenTypes=Ve.enableSticky=Ve.disableSticky=Ve.SUPPORT_STICKY=Ve.MODES=Ve.DEFAULT_MODE=void 0;var pY=UI(),ir=gd(),xe=Gt(),Hg=fY(),dY=GI(),So="PATTERN";Ve.DEFAULT_MODE="defaultMode";Ve.MODES="modes";Ve.SUPPORT_STICKY=typeof new RegExp("(?:)").sticky=="boolean";function Ome(){Ve.SUPPORT_STICKY=!1}Ve.disableSticky=Ome;function Mme(){Ve.SUPPORT_STICKY=!0}Ve.enableSticky=Mme;function Kme(r,e){e=(0,xe.defaults)(e,{useSticky:Ve.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",`
+`],tracer:function(v,D){return D()}});var t=e.tracer;t("initCharCodeToOptimizedIndexMap",function(){Vme()});var i;t("Reject Lexer.NA",function(){i=(0,xe.reject)(r,function(v){return v[So]===ir.Lexer.NA})});var n=!1,s;t("Transform Patterns",function(){n=!1,s=(0,xe.map)(i,function(v){var D=v[So];if((0,xe.isRegExp)(D)){var L=D.source;return L.length===1&&L!=="^"&&L!=="$"&&L!=="."&&!D.ignoreCase?L:L.length===2&&L[0]==="\\"&&!(0,xe.contains)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],L[1])?L[1]:e.useSticky?Iv(D):Ev(D)}else{if((0,xe.isFunction)(D))return n=!0,{exec:D};if((0,xe.has)(D,"exec"))return n=!0,D;if(typeof D=="string"){if(D.length===1)return D;var H=D.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),j=new RegExp(H);return e.useSticky?Iv(j):Ev(j)}else throw Error("non exhaustive match")}})});var o,a,l,c,u;t("misc mapping",function(){o=(0,xe.map)(i,function(v){return v.tokenTypeIdx}),a=(0,xe.map)(i,function(v){var D=v.GROUP;if(D!==ir.Lexer.SKIPPED){if((0,xe.isString)(D))return D;if((0,xe.isUndefined)(D))return!1;throw Error("non exhaustive match")}}),l=(0,xe.map)(i,function(v){var D=v.LONGER_ALT;if(D){var L=(0,xe.isArray)(D)?(0,xe.map)(D,function(H){return(0,xe.indexOf)(i,H)}):[(0,xe.indexOf)(i,D)];return L}}),c=(0,xe.map)(i,function(v){return v.PUSH_MODE}),u=(0,xe.map)(i,function(v){return(0,xe.has)(v,"POP_MODE")})});var g;t("Line Terminator Handling",function(){var v=DY(e.lineTerminatorCharacters);g=(0,xe.map)(i,function(D){return!1}),e.positionTracking!=="onlyOffset"&&(g=(0,xe.map)(i,function(D){if((0,xe.has)(D,"LINE_BREAKS"))return D.LINE_BREAKS;if(xY(D,v)===!1)return(0,Hg.canMatchCharCode)(v,D.PATTERN)}))});var f,h,p,C;t("Misc Mapping #2",function(){f=(0,xe.map)(i,wv),h=(0,xe.map)(s,vY),p=(0,xe.reduce)(i,function(v,D){var L=D.GROUP;return(0,xe.isString)(L)&&L!==ir.Lexer.SKIPPED&&(v[L]=[]),v},{}),C=(0,xe.map)(s,function(v,D){return{pattern:s[D],longerAlt:l[D],canLineTerminator:g[D],isCustom:f[D],short:h[D],group:a[D],push:c[D],pop:u[D],tokenTypeIdx:o[D],tokenType:i[D]}})});var y=!0,B=[];return e.safeMode||t("First Char Optimization",function(){B=(0,xe.reduce)(i,function(v,D,L){if(typeof D.PATTERN=="string"){var H=D.PATTERN.charCodeAt(0),j=yv(H);mv(v,j,C[L])}else if((0,xe.isArray)(D.START_CHARS_HINT)){var $;(0,xe.forEach)(D.START_CHARS_HINT,function(W){var Z=typeof W=="string"?W.charCodeAt(0):W,A=yv(Z);$!==A&&($=A,mv(v,A,C[L]))})}else if((0,xe.isRegExp)(D.PATTERN))if(D.PATTERN.unicode)y=!1,e.ensureOptimizations&&(0,xe.PRINT_ERROR)(""+Hg.failedOptimizationPrefixMsg+(" Unable to analyze < "+D.PATTERN.toString()+` > pattern.
+`)+` The regexp unicode flag is not currently supported by the regexp-to-ast library.
+ This will disable the lexer's first char optimizations.
+ For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var V=(0,Hg.getOptimizedStartCodesIndices)(D.PATTERN,e.ensureOptimizations);(0,xe.isEmpty)(V)&&(y=!1),(0,xe.forEach)(V,function(W){mv(v,W,C[L])})}else e.ensureOptimizations&&(0,xe.PRINT_ERROR)(""+Hg.failedOptimizationPrefixMsg+(" TokenType: <"+D.name+`> is using a custom token pattern without providing parameter.
+`)+` This will disable the lexer's first char optimizations.
+ For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),y=!1;return v},[])}),t("ArrayPacking",function(){B=(0,xe.packArray)(B)}),{emptyGroups:p,patternIdxToConfig:C,charCodeToPatternIdxToConfig:B,hasCustom:n,canBeOptimized:y}}Ve.analyzeTokenTypes=Kme;function Ume(r,e){var t=[],i=CY(r);t=t.concat(i.errors);var n=mY(i.valid),s=n.valid;return t=t.concat(n.errors),t=t.concat(Hme(s)),t=t.concat(QY(s)),t=t.concat(bY(s,e)),t=t.concat(SY(s)),t}Ve.validatePatterns=Ume;function Hme(r){var e=[],t=(0,xe.filter)(r,function(i){return(0,xe.isRegExp)(i[So])});return e=e.concat(EY(t)),e=e.concat(yY(t)),e=e.concat(wY(t)),e=e.concat(BY(t)),e=e.concat(IY(t)),e}function CY(r){var e=(0,xe.filter)(r,function(n){return!(0,xe.has)(n,So)}),t=(0,xe.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- missing static 'PATTERN' property",type:ir.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,xe.difference)(r,e);return{errors:t,valid:i}}Ve.findMissingPatterns=CY;function mY(r){var e=(0,xe.filter)(r,function(n){var s=n[So];return!(0,xe.isRegExp)(s)&&!(0,xe.isFunction)(s)&&!(0,xe.has)(s,"exec")&&!(0,xe.isString)(s)}),t=(0,xe.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:ir.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,xe.difference)(r,e);return{errors:t,valid:i}}Ve.findInvalidPatterns=mY;var Gme=/[^\\][\$]/;function EY(r){var e=function(n){hY(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(pY.BaseRegExpVisitor),t=(0,xe.filter)(r,function(n){var s=n[So];try{var o=(0,dY.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return Gme.test(s.source)}}),i=(0,xe.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error:
+ Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$'
+ See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:ir.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ve.findEndOfInputAnchor=EY;function IY(r){var e=(0,xe.filter)(r,function(i){var n=i[So];return n.test("")}),t=(0,xe.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' must not match an empty string",type:ir.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return t}Ve.findEmptyMatchRegExps=IY;var Yme=/[^\\[][\^]|^\^/;function yY(r){var e=function(n){hY(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(pY.BaseRegExpVisitor),t=(0,xe.filter)(r,function(n){var s=n[So];try{var o=(0,dY.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return Yme.test(s.source)}}),i=(0,xe.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error:
+ Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^'
+ See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:ir.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ve.findStartOfInputAnchor=yY;function wY(r){var e=(0,xe.filter)(r,function(i){var n=i[So];return n instanceof RegExp&&(n.multiline||n.global)}),t=(0,xe.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:ir.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return t}Ve.findUnsupportedFlags=wY;function BY(r){var e=[],t=(0,xe.map)(r,function(s){return(0,xe.reduce)(r,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,xe.contains)(e,a)&&a.PATTERN!==ir.Lexer.NA&&(e.push(a),o.push(a)),o},[])});t=(0,xe.compact)(t);var i=(0,xe.filter)(t,function(s){return s.length>1}),n=(0,xe.map)(i,function(s){var o=(0,xe.map)(s,function(l){return l.name}),a=(0,xe.first)(s).PATTERN;return{message:"The same RegExp pattern ->"+a+"<-"+("has been used in all of the following Token Types: "+o.join(", ")+" <-"),type:ir.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}Ve.findDuplicatePatterns=BY;function QY(r){var e=(0,xe.filter)(r,function(i){if(!(0,xe.has)(i,"GROUP"))return!1;var n=i.GROUP;return n!==ir.Lexer.SKIPPED&&n!==ir.Lexer.NA&&!(0,xe.isString)(n)}),t=(0,xe.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:ir.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return t}Ve.findInvalidGroupType=QY;function bY(r,e){var t=(0,xe.filter)(r,function(n){return n.PUSH_MODE!==void 0&&!(0,xe.contains)(e,n.PUSH_MODE)}),i=(0,xe.map)(t,function(n){var s="Token Type: ->"+n.name+"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->"+n.PUSH_MODE+"<-which does not exist";return{message:s,type:ir.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}Ve.findModesThatDoNotExist=bY;function SY(r){var e=[],t=(0,xe.reduce)(r,function(i,n,s){var o=n.PATTERN;return o===ir.Lexer.NA||((0,xe.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,xe.isRegExp)(o)&&qme(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,xe.forEach)(r,function(i,n){(0,xe.forEach)(t,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n"+i.name+"<-")+`in the lexer's definition.
+See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:ir.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}Ve.findUnreachablePatterns=SY;function jme(r,e){if((0,xe.isRegExp)(e)){var t=e.exec(r);return t!==null&&t.index===0}else{if((0,xe.isFunction)(e))return e(r,0,[],{});if((0,xe.has)(e,"exec"))return e.exec(r,0,[],{});if(typeof e=="string")return e===r;throw Error("non exhaustive match")}}function qme(r){var e=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return(0,xe.find)(e,function(t){return r.source.indexOf(t)!==-1})===void 0}function Ev(r){var e=r.ignoreCase?"i":"";return new RegExp("^(?:"+r.source+")",e)}Ve.addStartOfInput=Ev;function Iv(r){var e=r.ignoreCase?"iy":"y";return new RegExp(""+r.source,e)}Ve.addStickyFlag=Iv;function Jme(r,e,t){var i=[];return(0,xe.has)(r,Ve.DEFAULT_MODE)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ve.DEFAULT_MODE+`> property in its definition
+`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,xe.has)(r,Ve.MODES)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ve.MODES+`> property in its definition
+`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,xe.has)(r,Ve.MODES)&&(0,xe.has)(r,Ve.DEFAULT_MODE)&&!(0,xe.has)(r.modes,r.defaultMode)&&i.push({message:"A MultiMode Lexer cannot be initialized with a "+Ve.DEFAULT_MODE+": <"+r.defaultMode+`>which does not exist
+`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,xe.has)(r,Ve.MODES)&&(0,xe.forEach)(r.modes,function(n,s){(0,xe.forEach)(n,function(o,a){(0,xe.isUndefined)(o)&&i.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+("<"+s+"> at index: <"+a+`>
+`),type:ir.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}Ve.performRuntimeChecks=Jme;function Wme(r,e,t){var i=[],n=!1,s=(0,xe.compact)((0,xe.flatten)((0,xe.mapValues)(r.modes,function(l){return l}))),o=(0,xe.reject)(s,function(l){return l[So]===ir.Lexer.NA}),a=DY(t);return e&&(0,xe.forEach)(o,function(l){var c=xY(l,a);if(c!==!1){var u=PY(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,xe.has)(l,"LINE_BREAKS")?l.LINE_BREAKS===!0&&(n=!0):(0,Hg.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found.
+ This Lexer has been defined to track line and column information,
+ But none of the Token Types can be identified as matching a line terminator.
+ See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS
+ for details.`,type:ir.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}Ve.performWarningRuntimeChecks=Wme;function zme(r){var e={},t=(0,xe.keys)(r);return(0,xe.forEach)(t,function(i){var n=r[i];if((0,xe.isArray)(n))e[i]=[];else throw Error("non exhaustive match")}),e}Ve.cloneEmptyGroups=zme;function wv(r){var e=r.PATTERN;if((0,xe.isRegExp)(e))return!1;if((0,xe.isFunction)(e))return!0;if((0,xe.has)(e,"exec"))return!0;if((0,xe.isString)(e))return!1;throw Error("non exhaustive match")}Ve.isCustomPattern=wv;function vY(r){return(0,xe.isString)(r)&&r.length===1?r.charCodeAt(0):!1}Ve.isShortPattern=vY;Ve.LineTerminatorOptimizedTester={test:function(r){for(var e=r.length,t=this.lastIndex;t Token Type
+`)+(" Root cause: "+e.errMsg+`.
+`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===ir.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option.
+`+(" The problem is in the <"+r.name+`> Token Type
+`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}Ve.buildLineBreakIssueMessage=PY;function DY(r){var e=(0,xe.map)(r,function(t){return(0,xe.isString)(t)&&t.length>0?t.charCodeAt(0):t});return e}function mv(r,e,t){r[e]===void 0?r[e]=[t]:r[e].push(t)}Ve.minOptimizationVal=256;var qI=[];function yv(r){return r255?255+~~(r/255):r}}});var Gg=w(Nt=>{"use strict";Object.defineProperty(Nt,"__esModule",{value:!0});Nt.isTokenType=Nt.hasExtendingTokensTypesMapProperty=Nt.hasExtendingTokensTypesProperty=Nt.hasCategoriesProperty=Nt.hasShortKeyProperty=Nt.singleAssignCategoriesToksMap=Nt.assignCategoriesMapProp=Nt.assignCategoriesTokensProp=Nt.assignTokenDefaultProps=Nt.expandCategories=Nt.augmentTokenTypes=Nt.tokenIdxToClass=Nt.tokenShortNameIdx=Nt.tokenStructuredMatcherNoCategories=Nt.tokenStructuredMatcher=void 0;var _r=Gt();function Xme(r,e){var t=r.tokenTypeIdx;return t===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[t]===!0}Nt.tokenStructuredMatcher=Xme;function _me(r,e){return r.tokenTypeIdx===e.tokenTypeIdx}Nt.tokenStructuredMatcherNoCategories=_me;Nt.tokenShortNameIdx=1;Nt.tokenIdxToClass={};function Zme(r){var e=kY(r);RY(e),NY(e),FY(e),(0,_r.forEach)(e,function(t){t.isParent=t.categoryMatches.length>0})}Nt.augmentTokenTypes=Zme;function kY(r){for(var e=(0,_r.cloneArr)(r),t=r,i=!0;i;){t=(0,_r.compact)((0,_r.flatten)((0,_r.map)(t,function(s){return s.CATEGORIES})));var n=(0,_r.difference)(t,e);e=e.concat(n),(0,_r.isEmpty)(n)?i=!1:t=n}return e}Nt.expandCategories=kY;function RY(r){(0,_r.forEach)(r,function(e){LY(e)||(Nt.tokenIdxToClass[Nt.tokenShortNameIdx]=e,e.tokenTypeIdx=Nt.tokenShortNameIdx++),Bv(e)&&!(0,_r.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Bv(e)||(e.CATEGORIES=[]),TY(e)||(e.categoryMatches=[]),OY(e)||(e.categoryMatchesMap={})})}Nt.assignTokenDefaultProps=RY;function FY(r){(0,_r.forEach)(r,function(e){e.categoryMatches=[],(0,_r.forEach)(e.categoryMatchesMap,function(t,i){e.categoryMatches.push(Nt.tokenIdxToClass[i].tokenTypeIdx)})})}Nt.assignCategoriesTokensProp=FY;function NY(r){(0,_r.forEach)(r,function(e){Qv([],e)})}Nt.assignCategoriesMapProp=NY;function Qv(r,e){(0,_r.forEach)(r,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),(0,_r.forEach)(e.CATEGORIES,function(t){var i=r.concat(e);(0,_r.contains)(i,t)||Qv(i,t)})}Nt.singleAssignCategoriesToksMap=Qv;function LY(r){return(0,_r.has)(r,"tokenTypeIdx")}Nt.hasShortKeyProperty=LY;function Bv(r){return(0,_r.has)(r,"CATEGORIES")}Nt.hasCategoriesProperty=Bv;function TY(r){return(0,_r.has)(r,"categoryMatches")}Nt.hasExtendingTokensTypesProperty=TY;function OY(r){return(0,_r.has)(r,"categoryMatchesMap")}Nt.hasExtendingTokensTypesMapProperty=OY;function $me(r){return(0,_r.has)(r,"tokenTypeIdx")}Nt.isTokenType=$me});var bv=w(JI=>{"use strict";Object.defineProperty(JI,"__esModule",{value:!0});JI.defaultLexerErrorProvider=void 0;JI.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(r){return"Unable to pop Lexer Mode after encountering Token ->"+r.image+"<- The Mode Stack is empty"},buildUnexpectedCharactersMessage:function(r,e,t,i,n){return"unexpected character: ->"+r.charAt(e)+"<- at offset: "+e+","+(" skipped "+t+" characters.")}}});var gd=w(nc=>{"use strict";Object.defineProperty(nc,"__esModule",{value:!0});nc.Lexer=nc.LexerDefinitionErrorType=void 0;var zs=Cv(),nr=Gt(),eEe=Gg(),tEe=bv(),rEe=GI(),iEe;(function(r){r[r.MISSING_PATTERN=0]="MISSING_PATTERN",r[r.INVALID_PATTERN=1]="INVALID_PATTERN",r[r.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",r[r.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",r[r.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",r[r.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",r[r.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",r[r.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",r[r.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",r[r.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",r[r.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",r[r.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",r[r.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",r[r.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",r[r.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",r[r.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",r[r.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK"})(iEe=nc.LexerDefinitionErrorType||(nc.LexerDefinitionErrorType={}));var fd={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[`
+`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:tEe.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(fd);var nEe=function(){function r(e,t){var i=this;if(t===void 0&&(t=fd),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof t=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object.
+a boolean 2nd argument is no longer supported`);this.config=(0,nr.merge)(fd,t);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var s,o=!0;i.TRACE_INIT("Lexer Config handling",function(){if(i.config.lineTerminatorsPattern===fd.lineTerminatorsPattern)i.config.lineTerminatorsPattern=zs.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===fd.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config.
+ For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(t.safeMode&&t.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,nr.isArray)(e)?(s={modes:{}},s.modes[zs.DEFAULT_MODE]=(0,nr.cloneArr)(e),s[zs.DEFAULT_MODE]=zs.DEFAULT_MODE):(o=!1,s=(0,nr.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT("performRuntimeChecks",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,zs.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT("performWarningRuntimeChecks",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,zs.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,nr.forEach)(s.modes,function(u,g){s.modes[g]=(0,nr.reject)(u,function(f){return(0,nr.isUndefined)(f)})});var a=(0,nr.keys)(s.modes);if((0,nr.forEach)(s.modes,function(u,g){i.TRACE_INIT("Mode: <"+g+"> processing",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT("validatePatterns",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,zs.validatePatterns)(u,a))}),(0,nr.isEmpty)(i.lexerDefinitionErrors)){(0,eEe.augmentTokenTypes)(u);var f;i.TRACE_INIT("analyzeTokenTypes",function(){f=(0,zs.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:t.positionTracking,ensureOptimizations:t.ensureOptimizations,safeMode:t.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=f.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=f.charCodeToPatternIdxToConfig,i.emptyGroups=(0,nr.merge)(i.emptyGroups,f.emptyGroups),i.hasCustom=f.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=f.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,nr.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,nr.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`-----------------------
+`);throw new Error(`Errors detected in definition of Lexer:
+`+c)}(0,nr.forEach)(i.lexerDefinitionWarning,function(u){(0,nr.PRINT_WARNING)(u.message)}),i.TRACE_INIT("Choosing sub-methods implementations",function(){if(zs.SUPPORT_STICKY?(i.chopInput=nr.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=nr.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=nr.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=nr.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=nr.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid config option: "'+i.config.positionTracking+'"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT("Failed Optimization Warnings",function(){var u=(0,nr.reduce)(i.canModeBeOptimized,function(g,f,h){return f===!1&&g.push(h),g},[]);if(t.ensureOptimizations&&!(0,nr.isEmpty)(u))throw Error("Lexer Modes: < "+u.join(", ")+` > cannot be optimized.
+ Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.
+ Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT("clearRegExpParserCache",function(){(0,rEe.clearRegExpParserCache)()}),i.TRACE_INIT("toFastProperties",function(){(0,nr.toFastProperties)(i)})})}return r.prototype.tokenize=function(e,t){if(t===void 0&&(t=this.defaultMode),!(0,nr.isEmpty)(this.lexerDefinitionErrors)){var i=(0,nr.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`-----------------------
+`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer:
+`+n)}var s=this.tokenizeInternal(e,t);return s},r.prototype.tokenizeInternal=function(e,t){var i=this,n,s,o,a,l,c,u,g,f,h,p,C,y,B,v,D,L=e,H=L.length,j=0,$=0,V=this.hasCustom?0:Math.floor(e.length/10),W=new Array(V),Z=[],A=this.trackStartLines?1:void 0,ae=this.trackStartLines?1:void 0,ge=(0,zs.cloneEmptyGroups)(this.emptyGroups),re=this.trackStartLines,O=this.config.lineTerminatorsPattern,F=0,ue=[],he=[],ke=[],Fe=[];Object.freeze(Fe);var Ne=void 0;function oe(){return ue}function le(pr){var Ei=(0,zs.charCodeToOptimizedIndex)(pr),_n=he[Ei];return _n===void 0?Fe:_n}var we=function(pr){if(ke.length===1&&pr.tokenType.PUSH_MODE===void 0){var Ei=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(pr);Z.push({offset:pr.startOffset,line:pr.startLine!==void 0?pr.startLine:void 0,column:pr.startColumn!==void 0?pr.startColumn:void 0,length:pr.image.length,message:Ei})}else{ke.pop();var _n=(0,nr.last)(ke);ue=i.patternIdxToConfig[_n],he=i.charCodeToPatternIdxToConfig[_n],F=ue.length;var oa=i.canModeBeOptimized[_n]&&i.config.safeMode===!1;he&&oa?Ne=le:Ne=oe}};function fe(pr){ke.push(pr),he=this.charCodeToPatternIdxToConfig[pr],ue=this.patternIdxToConfig[pr],F=ue.length,F=ue.length;var Ei=this.canModeBeOptimized[pr]&&this.config.safeMode===!1;he&&Ei?Ne=le:Ne=oe}fe.call(this,t);for(var Ae;jc.length){c=a,u=g,Ae=tt;break}}}break}}if(c!==null){if(f=c.length,h=Ae.group,h!==void 0&&(p=Ae.tokenTypeIdx,C=this.createTokenInstance(c,j,p,Ae.tokenType,A,ae,f),this.handlePayload(C,u),h===!1?$=this.addToken(W,$,C):ge[h].push(C)),e=this.chopInput(e,f),j=j+f,ae=this.computeNewColumn(ae,f),re===!0&&Ae.canLineTerminator===!0){var It=0,Or=void 0,ii=void 0;O.lastIndex=0;do Or=O.test(c),Or===!0&&(ii=O.lastIndex-1,It++);while(Or===!0);It!==0&&(A=A+It,ae=f-ii,this.updateTokenEndLineColumnLocation(C,h,ii,It,A,ae,f))}this.handleModes(Ae,we,fe,C)}else{for(var gi=j,hr=A,fi=ae,ni=!1;!ni&&j <"+e+">");var n=(0,nr.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r.SKIPPED="This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.",r.NA=/NOT_APPLICABLE/,r}();nc.Lexer=nEe});var SA=w(Qi=>{"use strict";Object.defineProperty(Qi,"__esModule",{value:!0});Qi.tokenMatcher=Qi.createTokenInstance=Qi.EOF=Qi.createToken=Qi.hasTokenLabel=Qi.tokenName=Qi.tokenLabel=void 0;var Vs=Gt(),sEe=gd(),Sv=Gg();function oEe(r){return JY(r)?r.LABEL:r.name}Qi.tokenLabel=oEe;function aEe(r){return r.name}Qi.tokenName=aEe;function JY(r){return(0,Vs.isString)(r.LABEL)&&r.LABEL!==""}Qi.hasTokenLabel=JY;var AEe="parent",MY="categories",KY="label",UY="group",HY="push_mode",GY="pop_mode",YY="longer_alt",jY="line_breaks",qY="start_chars_hint";function WY(r){return lEe(r)}Qi.createToken=WY;function lEe(r){var e=r.pattern,t={};if(t.name=r.name,(0,Vs.isUndefined)(e)||(t.PATTERN=e),(0,Vs.has)(r,AEe))throw`The parent property is no longer supported.
+See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,Vs.has)(r,MY)&&(t.CATEGORIES=r[MY]),(0,Sv.augmentTokenTypes)([t]),(0,Vs.has)(r,KY)&&(t.LABEL=r[KY]),(0,Vs.has)(r,UY)&&(t.GROUP=r[UY]),(0,Vs.has)(r,GY)&&(t.POP_MODE=r[GY]),(0,Vs.has)(r,HY)&&(t.PUSH_MODE=r[HY]),(0,Vs.has)(r,YY)&&(t.LONGER_ALT=r[YY]),(0,Vs.has)(r,jY)&&(t.LINE_BREAKS=r[jY]),(0,Vs.has)(r,qY)&&(t.START_CHARS_HINT=r[qY]),t}Qi.EOF=WY({name:"EOF",pattern:sEe.Lexer.NA});(0,Sv.augmentTokenTypes)([Qi.EOF]);function cEe(r,e,t,i,n,s,o,a){return{image:e,startOffset:t,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:r.tokenTypeIdx,tokenType:r}}Qi.createTokenInstance=cEe;function uEe(r,e){return(0,Sv.tokenStructuredMatcher)(r,e)}Qi.tokenMatcher=uEe});var dn=w(Wt=>{"use strict";var wa=Wt&&Wt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Wt,"__esModule",{value:!0});Wt.serializeProduction=Wt.serializeGrammar=Wt.Terminal=Wt.Alternation=Wt.RepetitionWithSeparator=Wt.Repetition=Wt.RepetitionMandatoryWithSeparator=Wt.RepetitionMandatory=Wt.Option=Wt.Alternative=Wt.Rule=Wt.NonTerminal=Wt.AbstractProduction=void 0;var Ar=Gt(),gEe=SA(),vo=function(){function r(e){this._definition=e}return Object.defineProperty(r.prototype,"definition",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),r.prototype.accept=function(e){e.visit(this),(0,Ar.forEach)(this.definition,function(t){t.accept(e)})},r}();Wt.AbstractProduction=vo;var zY=function(r){wa(e,r);function e(t){var i=r.call(this,[])||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(t){},enumerable:!1,configurable:!0}),e.prototype.accept=function(t){t.visit(this)},e}(vo);Wt.NonTerminal=zY;var VY=function(r){wa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.orgText="",(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(vo);Wt.Rule=VY;var XY=function(r){wa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.ignoreAmbiguities=!1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(vo);Wt.Alternative=XY;var _Y=function(r){wa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(vo);Wt.Option=_Y;var ZY=function(r){wa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(vo);Wt.RepetitionMandatory=ZY;var $Y=function(r){wa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(vo);Wt.RepetitionMandatoryWithSeparator=$Y;var ej=function(r){wa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(vo);Wt.Repetition=ej;var tj=function(r){wa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(vo);Wt.RepetitionWithSeparator=tj;var rj=function(r){wa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this._definition},set:function(t){this._definition=t},enumerable:!1,configurable:!0}),e}(vo);Wt.Alternation=rj;var WI=function(){function r(e){this.idx=1,(0,Ar.assign)(this,(0,Ar.pick)(e,function(t){return t!==void 0}))}return r.prototype.accept=function(e){e.visit(this)},r}();Wt.Terminal=WI;function fEe(r){return(0,Ar.map)(r,hd)}Wt.serializeGrammar=fEe;function hd(r){function e(s){return(0,Ar.map)(s,hd)}if(r instanceof zY){var t={type:"NonTerminal",name:r.nonTerminalName,idx:r.idx};return(0,Ar.isString)(r.label)&&(t.label=r.label),t}else{if(r instanceof XY)return{type:"Alternative",definition:e(r.definition)};if(r instanceof _Y)return{type:"Option",idx:r.idx,definition:e(r.definition)};if(r instanceof ZY)return{type:"RepetitionMandatory",idx:r.idx,definition:e(r.definition)};if(r instanceof $Y)return{type:"RepetitionMandatoryWithSeparator",idx:r.idx,separator:hd(new WI({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof tj)return{type:"RepetitionWithSeparator",idx:r.idx,separator:hd(new WI({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof ej)return{type:"Repetition",idx:r.idx,definition:e(r.definition)};if(r instanceof rj)return{type:"Alternation",idx:r.idx,definition:e(r.definition)};if(r instanceof WI){var i={type:"Terminal",name:r.terminalType.name,label:(0,gEe.tokenLabel)(r.terminalType),idx:r.idx};(0,Ar.isString)(r.label)&&(i.terminalLabel=r.label);var n=r.terminalType.PATTERN;return r.terminalType.PATTERN&&(i.pattern=(0,Ar.isRegExp)(n)?n.source:n),i}else{if(r instanceof VY)return{type:"Rule",name:r.name,orgText:r.orgText,definition:e(r.definition)};throw Error("non exhaustive match")}}}Wt.serializeProduction=hd});var VI=w(zI=>{"use strict";Object.defineProperty(zI,"__esModule",{value:!0});zI.RestWalker=void 0;var vv=Gt(),Cn=dn(),hEe=function(){function r(){}return r.prototype.walk=function(e,t){var i=this;t===void 0&&(t=[]),(0,vv.forEach)(e.definition,function(n,s){var o=(0,vv.drop)(e.definition,s+1);if(n instanceof Cn.NonTerminal)i.walkProdRef(n,o,t);else if(n instanceof Cn.Terminal)i.walkTerminal(n,o,t);else if(n instanceof Cn.Alternative)i.walkFlat(n,o,t);else if(n instanceof Cn.Option)i.walkOption(n,o,t);else if(n instanceof Cn.RepetitionMandatory)i.walkAtLeastOne(n,o,t);else if(n instanceof Cn.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,t);else if(n instanceof Cn.RepetitionWithSeparator)i.walkManySep(n,o,t);else if(n instanceof Cn.Repetition)i.walkMany(n,o,t);else if(n instanceof Cn.Alternation)i.walkOr(n,o,t);else throw Error("non exhaustive match")})},r.prototype.walkTerminal=function(e,t,i){},r.prototype.walkProdRef=function(e,t,i){},r.prototype.walkFlat=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkOption=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkAtLeastOne=function(e,t,i){var n=[new Cn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkAtLeastOneSep=function(e,t,i){var n=ij(e,t,i);this.walk(e,n)},r.prototype.walkMany=function(e,t,i){var n=[new Cn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkManySep=function(e,t,i){var n=ij(e,t,i);this.walk(e,n)},r.prototype.walkOr=function(e,t,i){var n=this,s=t.concat(i);(0,vv.forEach)(e.definition,function(o){var a=new Cn.Alternative({definition:[o]});n.walk(a,s)})},r}();zI.RestWalker=hEe;function ij(r,e,t){var i=[new Cn.Option({definition:[new Cn.Terminal({terminalType:r.separator})].concat(r.definition)})],n=i.concat(e,t);return n}});var Yg=w(XI=>{"use strict";Object.defineProperty(XI,"__esModule",{value:!0});XI.GAstVisitor=void 0;var xo=dn(),pEe=function(){function r(){}return r.prototype.visit=function(e){var t=e;switch(t.constructor){case xo.NonTerminal:return this.visitNonTerminal(t);case xo.Alternative:return this.visitAlternative(t);case xo.Option:return this.visitOption(t);case xo.RepetitionMandatory:return this.visitRepetitionMandatory(t);case xo.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(t);case xo.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(t);case xo.Repetition:return this.visitRepetition(t);case xo.Alternation:return this.visitAlternation(t);case xo.Terminal:return this.visitTerminal(t);case xo.Rule:return this.visitRule(t);default:throw Error("non exhaustive match")}},r.prototype.visitNonTerminal=function(e){},r.prototype.visitAlternative=function(e){},r.prototype.visitOption=function(e){},r.prototype.visitRepetition=function(e){},r.prototype.visitRepetitionMandatory=function(e){},r.prototype.visitRepetitionMandatoryWithSeparator=function(e){},r.prototype.visitRepetitionWithSeparator=function(e){},r.prototype.visitAlternation=function(e){},r.prototype.visitTerminal=function(e){},r.prototype.visitRule=function(e){},r}();XI.GAstVisitor=pEe});var dd=w(Oi=>{"use strict";var dEe=Oi&&Oi.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Oi,"__esModule",{value:!0});Oi.collectMethods=Oi.DslMethodsCollectorVisitor=Oi.getProductionDslName=Oi.isBranchingProd=Oi.isOptionalProd=Oi.isSequenceProd=void 0;var pd=Gt(),Qr=dn(),CEe=Yg();function mEe(r){return r instanceof Qr.Alternative||r instanceof Qr.Option||r instanceof Qr.Repetition||r instanceof Qr.RepetitionMandatory||r instanceof Qr.RepetitionMandatoryWithSeparator||r instanceof Qr.RepetitionWithSeparator||r instanceof Qr.Terminal||r instanceof Qr.Rule}Oi.isSequenceProd=mEe;function xv(r,e){e===void 0&&(e=[]);var t=r instanceof Qr.Option||r instanceof Qr.Repetition||r instanceof Qr.RepetitionWithSeparator;return t?!0:r instanceof Qr.Alternation?(0,pd.some)(r.definition,function(i){return xv(i,e)}):r instanceof Qr.NonTerminal&&(0,pd.contains)(e,r)?!1:r instanceof Qr.AbstractProduction?(r instanceof Qr.NonTerminal&&e.push(r),(0,pd.every)(r.definition,function(i){return xv(i,e)})):!1}Oi.isOptionalProd=xv;function EEe(r){return r instanceof Qr.Alternation}Oi.isBranchingProd=EEe;function IEe(r){if(r instanceof Qr.NonTerminal)return"SUBRULE";if(r instanceof Qr.Option)return"OPTION";if(r instanceof Qr.Alternation)return"OR";if(r instanceof Qr.RepetitionMandatory)return"AT_LEAST_ONE";if(r instanceof Qr.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(r instanceof Qr.RepetitionWithSeparator)return"MANY_SEP";if(r instanceof Qr.Repetition)return"MANY";if(r instanceof Qr.Terminal)return"CONSUME";throw Error("non exhaustive match")}Oi.getProductionDslName=IEe;var nj=function(r){dEe(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.separator="-",t.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},t}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(t){var i=t.terminalType.name+this.separator+"Terminal";(0,pd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitNonTerminal=function(t){var i=t.nonTerminalName+this.separator+"Terminal";(0,pd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(CEe.GAstVisitor);Oi.DslMethodsCollectorVisitor=nj;var _I=new nj;function yEe(r){_I.reset(),r.accept(_I);var e=_I.dslMethods;return _I.reset(),e}Oi.collectMethods=yEe});var Dv=w(Po=>{"use strict";Object.defineProperty(Po,"__esModule",{value:!0});Po.firstForTerminal=Po.firstForBranching=Po.firstForSequence=Po.first=void 0;var ZI=Gt(),sj=dn(),Pv=dd();function $I(r){if(r instanceof sj.NonTerminal)return $I(r.referencedRule);if(r instanceof sj.Terminal)return Aj(r);if((0,Pv.isSequenceProd)(r))return oj(r);if((0,Pv.isBranchingProd)(r))return aj(r);throw Error("non exhaustive match")}Po.first=$I;function oj(r){for(var e=[],t=r.definition,i=0,n=t.length>i,s,o=!0;n&&o;)s=t[i],o=(0,Pv.isOptionalProd)(s),e=e.concat($I(s)),i=i+1,n=t.length>i;return(0,ZI.uniq)(e)}Po.firstForSequence=oj;function aj(r){var e=(0,ZI.map)(r.definition,function(t){return $I(t)});return(0,ZI.uniq)((0,ZI.flatten)(e))}Po.firstForBranching=aj;function Aj(r){return[r.terminalType]}Po.firstForTerminal=Aj});var kv=w(ey=>{"use strict";Object.defineProperty(ey,"__esModule",{value:!0});ey.IN=void 0;ey.IN="_~IN~_"});var fj=w(As=>{"use strict";var wEe=As&&As.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(As,"__esModule",{value:!0});As.buildInProdFollowPrefix=As.buildBetweenProdsFollowPrefix=As.computeAllProdsFollows=As.ResyncFollowsWalker=void 0;var BEe=VI(),QEe=Dv(),lj=Gt(),cj=kv(),bEe=dn(),uj=function(r){wEe(e,r);function e(t){var i=r.call(this)||this;return i.topProd=t,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(t,i,n){},e.prototype.walkProdRef=function(t,i,n){var s=gj(t.referencedRule,t.idx)+this.topProd.name,o=i.concat(n),a=new bEe.Alternative({definition:o}),l=(0,QEe.first)(a);this.follows[s]=l},e}(BEe.RestWalker);As.ResyncFollowsWalker=uj;function SEe(r){var e={};return(0,lj.forEach)(r,function(t){var i=new uj(t).startWalking();(0,lj.assign)(e,i)}),e}As.computeAllProdsFollows=SEe;function gj(r,e){return r.name+e+cj.IN}As.buildBetweenProdsFollowPrefix=gj;function vEe(r){var e=r.terminalType.name;return e+r.idx+cj.IN}As.buildInProdFollowPrefix=vEe});var Cd=w(Ba=>{"use strict";Object.defineProperty(Ba,"__esModule",{value:!0});Ba.defaultGrammarValidatorErrorProvider=Ba.defaultGrammarResolverErrorProvider=Ba.defaultParserErrorProvider=void 0;var jg=SA(),xEe=Gt(),Xs=Gt(),Rv=dn(),hj=dd();Ba.defaultParserErrorProvider={buildMismatchTokenMessage:function(r){var e=r.expected,t=r.actual,i=r.previous,n=r.ruleName,s=(0,jg.hasTokenLabel)(e),o=s?"--> "+(0,jg.tokenLabel)(e)+" <--":"token of type --> "+e.name+" <--",a="Expecting "+o+" but found --> '"+t.image+"' <--";return a},buildNotAllInputParsedMessage:function(r){var e=r.firstRedundant,t=r.ruleName;return"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(r){var e=r.expectedPathsPerAlt,t=r.actual,i=r.previous,n=r.customUserDescription,s=r.ruleName,o="Expecting: ",a=(0,Xs.first)(t).image,l=`
+but found: '`+a+"'";if(n)return o+n+l;var c=(0,Xs.reduce)(e,function(h,p){return h.concat(p)},[]),u=(0,Xs.map)(c,function(h){return"["+(0,Xs.map)(h,function(p){return(0,jg.tokenLabel)(p)}).join(", ")+"]"}),g=(0,Xs.map)(u,function(h,p){return" "+(p+1)+". "+h}),f=`one of these possible Token sequences:
+`+g.join(`
+`);return o+f+l},buildEarlyExitMessage:function(r){var e=r.expectedIterationPaths,t=r.actual,i=r.customUserDescription,n=r.ruleName,s="Expecting: ",o=(0,Xs.first)(t).image,a=`
+but found: '`+o+"'";if(i)return s+i+a;var l=(0,Xs.map)(e,function(u){return"["+(0,Xs.map)(u,function(g){return(0,jg.tokenLabel)(g)}).join(",")+"]"}),c=`expecting at least one iteration which starts with one of these possible Token sequences::
+ `+("<"+l.join(" ,")+">");return s+c+a}};Object.freeze(Ba.defaultParserErrorProvider);Ba.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(r,e){var t="Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<-
+inside top level rule: ->`+r.name+"<-";return t}};Ba.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(r,e){function t(u){return u instanceof Rv.Terminal?u.terminalType.name:u instanceof Rv.NonTerminal?u.nonTerminalName:""}var i=r.name,n=(0,Xs.first)(e),s=n.idx,o=(0,hj.getProductionDslName)(n),a=t(n),l=s>0,c="->"+o+(l?s:"")+"<- "+(a?"with argument: ->"+a+"<-":"")+`
+ appears more than once (`+e.length+" times) in the top level rule: ->"+i+`<-.
+ For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES
+ `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,`
+`),c},buildNamespaceConflictError:function(r){var e=`Namespace conflict found in grammar.
+`+("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <"+r.name+`>.
+`)+`To resolve this make sure each Terminal and Non-Terminal names are unique
+This is easy to accomplish by using the convention that Terminal names start with an uppercase letter
+and Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(r){var e=(0,Xs.map)(r.prefixPath,function(n){return(0,jg.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous alternatives: <"+r.ambiguityIndices.join(" ,")+`> due to common lookahead prefix
+`+("in inside <"+r.topLevelRule.name+`> Rule,
+`)+("<"+e+`> may appears as a prefix path in all these alternatives.
+`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX
+For Further details.`;return i},buildAlternationAmbiguityError:function(r){var e=(0,Xs.map)(r.prefixPath,function(n){return(0,jg.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous Alternatives Detected: <"+r.ambiguityIndices.join(" ,")+"> in "+(" inside <"+r.topLevelRule.name+`> Rule,
+`)+("<"+e+`> may appears as a prefix path in all these alternatives.
+`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES
+For Further details.`,i},buildEmptyRepetitionError:function(r){var e=(0,hj.getProductionDslName)(r.repetition);r.repetition.idx!==0&&(e+=r.repetition.idx);var t="The repetition <"+e+"> within Rule <"+r.topLevelRule.name+`> can never consume any tokens.
+This could lead to an infinite loop.`;return t},buildTokenNameError:function(r){return"deprecated"},buildEmptyAlternationError:function(r){var e="Ambiguous empty alternative: <"+(r.emptyChoiceIdx+1)+">"+(" in inside <"+r.topLevelRule.name+`> Rule.
+`)+"Only the last alternative may be an empty alternative.";return e},buildTooManyAlternativesError:function(r){var e=`An Alternation cannot have more than 256 alternatives:
+`+(" inside <"+r.topLevelRule.name+`> Rule.
+ has `+(r.alternation.definition.length+1)+" alternatives.");return e},buildLeftRecursionError:function(r){var e=r.topLevelRule.name,t=xEe.map(r.leftRecursionPath,function(s){return s.name}),i=e+" --> "+t.concat([e]).join(" --> "),n=`Left Recursion found in grammar.
+`+("rule: <"+e+`> can be invoked from itself (directly or indirectly)
+`)+(`without consuming any Tokens. The grammar path that causes this is:
+ `+i+`
+`)+` To fix this refactor your grammar to remove the left recursion.
+see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(r){return"deprecated"},buildDuplicateRuleNameError:function(r){var e;r.topLevelRule instanceof Rv.Rule?e=r.topLevelRule.name:e=r.topLevelRule;var t="Duplicate definition, rule: ->"+e+"<- is already defined in the grammar: ->"+r.grammarName+"<-";return t}}});var Cj=w(vA=>{"use strict";var PEe=vA&&vA.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(vA,"__esModule",{value:!0});vA.GastRefResolverVisitor=vA.resolveGrammar=void 0;var DEe=Hn(),pj=Gt(),kEe=Yg();function REe(r,e){var t=new dj(r,e);return t.resolveRefs(),t.errors}vA.resolveGrammar=REe;var dj=function(r){PEe(e,r);function e(t,i){var n=r.call(this)||this;return n.nameToTopRule=t,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var t=this;(0,pj.forEach)((0,pj.values)(this.nameToTopRule),function(i){t.currTopLevel=i,i.accept(t)})},e.prototype.visitNonTerminal=function(t){var i=this.nameToTopRule[t.nonTerminalName];if(i)t.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,t);this.errors.push({message:n,type:DEe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:t.nonTerminalName})}},e}(kEe.GAstVisitor);vA.GastRefResolverVisitor=dj});var Ed=w(Nr=>{"use strict";var sc=Nr&&Nr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Nr,"__esModule",{value:!0});Nr.nextPossibleTokensAfter=Nr.possiblePathsFrom=Nr.NextTerminalAfterAtLeastOneSepWalker=Nr.NextTerminalAfterAtLeastOneWalker=Nr.NextTerminalAfterManySepWalker=Nr.NextTerminalAfterManyWalker=Nr.AbstractNextTerminalAfterProductionWalker=Nr.NextAfterTokenWalker=Nr.AbstractNextPossibleTokensWalker=void 0;var mj=VI(),Kt=Gt(),FEe=Dv(),kt=dn(),Ej=function(r){sc(e,r);function e(t,i){var n=r.call(this)||this;return n.topProd=t,n.path=i,n.possibleTokTypes=[],n.nextProductionName="",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,Kt.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,Kt.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(t,i){i===void 0&&(i=[]),this.found||r.prototype.walk.call(this,t,i)},e.prototype.walkProdRef=function(t,i,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,Kt.isEmpty)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(mj.RestWalker);Nr.AbstractNextPossibleTokensWalker=Ej;var NEe=function(r){sc(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.path=i,n.nextTerminalName="",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(t,i,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new kt.Alternative({definition:s});this.possibleTokTypes=(0,FEe.first)(o),this.found=!0}},e}(Ej);Nr.NextAfterTokenWalker=NEe;var md=function(r){sc(e,r);function e(t,i){var n=r.call(this)||this;return n.topRule=t,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(mj.RestWalker);Nr.AbstractNextTerminalAfterProductionWalker=md;var LEe=function(r){sc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkMany=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkMany.call(this,t,i,n)},e}(md);Nr.NextTerminalAfterManyWalker=LEe;var TEe=function(r){sc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkManySep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkManySep.call(this,t,i,n)},e}(md);Nr.NextTerminalAfterManySepWalker=TEe;var OEe=function(r){sc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOne.call(this,t,i,n)},e}(md);Nr.NextTerminalAfterAtLeastOneWalker=OEe;var MEe=function(r){sc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOneSep.call(this,t,i,n)},e}(md);Nr.NextTerminalAfterAtLeastOneSepWalker=MEe;function Ij(r,e,t){t===void 0&&(t=[]),t=(0,Kt.cloneArr)(t);var i=[],n=0;function s(c){return c.concat((0,Kt.drop)(r,n+1))}function o(c){var u=Ij(s(c),e,t);return i.concat(u)}for(;t.length=0;ge--){var re=B.definition[ge],O={idx:p,def:re.definition.concat((0,Kt.drop)(h)),ruleStack:C,occurrenceStack:y};g.push(O),g.push(o)}else if(B instanceof kt.Alternative)g.push({idx:p,def:B.definition.concat((0,Kt.drop)(h)),ruleStack:C,occurrenceStack:y});else if(B instanceof kt.Rule)g.push(UEe(B,p,C,y));else throw Error("non exhaustive match")}}return u}Nr.nextPossibleTokensAfter=KEe;function UEe(r,e,t,i){var n=(0,Kt.cloneArr)(t);n.push(r.name);var s=(0,Kt.cloneArr)(i);return s.push(1),{idx:e,def:r.definition,ruleStack:n,occurrenceStack:s}}});var Id=w(_t=>{"use strict";var Bj=_t&&_t.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(_t,"__esModule",{value:!0});_t.areTokenCategoriesNotUsed=_t.isStrictPrefixOfPath=_t.containsPath=_t.getLookaheadPathsForOptionalProd=_t.getLookaheadPathsForOr=_t.lookAheadSequenceFromAlternatives=_t.buildSingleAlternativeLookaheadFunction=_t.buildAlternativesLookAheadFunc=_t.buildLookaheadFuncForOptionalProd=_t.buildLookaheadFuncForOr=_t.getProdType=_t.PROD_TYPE=void 0;var sr=Gt(),yj=Ed(),HEe=VI(),ty=Gg(),xA=dn(),GEe=Yg(),oi;(function(r){r[r.OPTION=0]="OPTION",r[r.REPETITION=1]="REPETITION",r[r.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",r[r.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",r[r.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",r[r.ALTERNATION=5]="ALTERNATION"})(oi=_t.PROD_TYPE||(_t.PROD_TYPE={}));function YEe(r){if(r instanceof xA.Option)return oi.OPTION;if(r instanceof xA.Repetition)return oi.REPETITION;if(r instanceof xA.RepetitionMandatory)return oi.REPETITION_MANDATORY;if(r instanceof xA.RepetitionMandatoryWithSeparator)return oi.REPETITION_MANDATORY_WITH_SEPARATOR;if(r instanceof xA.RepetitionWithSeparator)return oi.REPETITION_WITH_SEPARATOR;if(r instanceof xA.Alternation)return oi.ALTERNATION;throw Error("non exhaustive match")}_t.getProdType=YEe;function jEe(r,e,t,i,n,s){var o=bj(r,e,t),a=Lv(o)?ty.tokenStructuredMatcherNoCategories:ty.tokenStructuredMatcher;return s(o,i,a,n)}_t.buildLookaheadFuncForOr=jEe;function qEe(r,e,t,i,n,s){var o=Sj(r,e,n,t),a=Lv(o)?ty.tokenStructuredMatcherNoCategories:ty.tokenStructuredMatcher;return s(o[0],a,i)}_t.buildLookaheadFuncForOptionalProd=qEe;function JEe(r,e,t,i){var n=r.length,s=(0,sr.every)(r,function(l){return(0,sr.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,sr.map)(l,function(D){return D.GATE}),u=0;u{"use strict";var Tv=zt&&zt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(zt,"__esModule",{value:!0});zt.checkPrefixAlternativesAmbiguities=zt.validateSomeNonEmptyLookaheadPath=zt.validateTooManyAlts=zt.RepetionCollector=zt.validateAmbiguousAlternationAlternatives=zt.validateEmptyOrAlternative=zt.getFirstNoneTerminal=zt.validateNoLeftRecursion=zt.validateRuleIsOverridden=zt.validateRuleDoesNotAlreadyExist=zt.OccurrenceValidationCollector=zt.identifyProductionForDuplicates=zt.validateGrammar=void 0;var er=Gt(),br=Gt(),Do=Hn(),Ov=dd(),qg=Id(),_Ee=Ed(),_s=dn(),Mv=Yg();function ZEe(r,e,t,i,n){var s=er.map(r,function(h){return $Ee(h,i)}),o=er.map(r,function(h){return Kv(h,h,i)}),a=[],l=[],c=[];(0,br.every)(o,br.isEmpty)&&(a=(0,br.map)(r,function(h){return Rj(h,i)}),l=(0,br.map)(r,function(h){return Fj(h,e,i)}),c=Tj(r,e,i));var u=rIe(r,t,i),g=(0,br.map)(r,function(h){return Lj(h,i)}),f=(0,br.map)(r,function(h){return kj(h,r,n,i)});return er.flatten(s.concat(c,o,a,l,u,g,f))}zt.validateGrammar=ZEe;function $Ee(r,e){var t=new Dj;r.accept(t);var i=t.allProductions,n=er.groupBy(i,xj),s=er.pick(n,function(a){return a.length>1}),o=er.map(er.values(s),function(a){var l=er.first(a),c=e.buildDuplicateFoundError(r,a),u=(0,Ov.getProductionDslName)(l),g={message:c,type:Do.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:r.name,dslName:u,occurrence:l.idx},f=Pj(l);return f&&(g.parameter=f),g});return o}function xj(r){return(0,Ov.getProductionDslName)(r)+"_#_"+r.idx+"_#_"+Pj(r)}zt.identifyProductionForDuplicates=xj;function Pj(r){return r instanceof _s.Terminal?r.terminalType.name:r instanceof _s.NonTerminal?r.nonTerminalName:""}var Dj=function(r){Tv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}(Mv.GAstVisitor);zt.OccurrenceValidationCollector=Dj;function kj(r,e,t,i){var n=[],s=(0,br.reduce)(e,function(a,l){return l.name===r.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:r,grammarName:t});n.push({message:o,type:Do.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:r.name})}return n}zt.validateRuleDoesNotAlreadyExist=kj;function eIe(r,e,t){var i=[],n;return er.contains(e,r)||(n="Invalid rule override, rule: ->"+r+"<- cannot be overridden in the grammar: ->"+t+"<-as it is not defined in any of the super grammars ",i.push({message:n,type:Do.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:r})),i}zt.validateRuleIsOverridden=eIe;function Kv(r,e,t,i){i===void 0&&(i=[]);var n=[],s=yd(e.definition);if(er.isEmpty(s))return[];var o=r.name,a=er.contains(s,r);a&&n.push({message:t.buildLeftRecursionError({topLevelRule:r,leftRecursionPath:i}),type:Do.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=er.difference(s,i.concat([r])),c=er.map(l,function(u){var g=er.cloneArr(i);return g.push(u),Kv(r,u,t,g)});return n.concat(er.flatten(c))}zt.validateNoLeftRecursion=Kv;function yd(r){var e=[];if(er.isEmpty(r))return e;var t=er.first(r);if(t instanceof _s.NonTerminal)e.push(t.referencedRule);else if(t instanceof _s.Alternative||t instanceof _s.Option||t instanceof _s.RepetitionMandatory||t instanceof _s.RepetitionMandatoryWithSeparator||t instanceof _s.RepetitionWithSeparator||t instanceof _s.Repetition)e=e.concat(yd(t.definition));else if(t instanceof _s.Alternation)e=er.flatten(er.map(t.definition,function(o){return yd(o.definition)}));else if(!(t instanceof _s.Terminal))throw Error("non exhaustive match");var i=(0,Ov.isOptionalProd)(t),n=r.length>1;if(i&&n){var s=er.drop(r);return e.concat(yd(s))}else return e}zt.getFirstNoneTerminal=yd;var Uv=function(r){Tv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.alternations=[],t}return e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}(Mv.GAstVisitor);function Rj(r,e){var t=new Uv;r.accept(t);var i=t.alternations,n=er.reduce(i,function(s,o){var a=er.dropRight(o.definition),l=er.map(a,function(c,u){var g=(0,_Ee.nextPossibleTokensAfter)([c],[],null,1);return er.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:r,alternation:o,emptyChoiceIdx:u}),type:Do.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:r.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(er.compact(l))},[]);return n}zt.validateEmptyOrAlternative=Rj;function Fj(r,e,t){var i=new Uv;r.accept(i);var n=i.alternations;n=(0,br.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=er.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,qg.getLookaheadPathsForOr)(l,r,c,a),g=tIe(u,a,r,t),f=Oj(u,a,r,t);return o.concat(g,f)},[]);return s}zt.validateAmbiguousAlternationAlternatives=Fj;var Nj=function(r){Tv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}(Mv.GAstVisitor);zt.RepetionCollector=Nj;function Lj(r,e){var t=new Uv;r.accept(t);var i=t.alternations,n=er.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:r,alternation:o}),type:Do.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:r.name,occurrence:o.idx}),s},[]);return n}zt.validateTooManyAlts=Lj;function Tj(r,e,t){var i=[];return(0,br.forEach)(r,function(n){var s=new Nj;n.accept(s);var o=s.allProductions;(0,br.forEach)(o,function(a){var l=(0,qg.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,qg.getLookaheadPathsForOptionalProd)(u,n,l,c),f=g[0];if((0,br.isEmpty)((0,br.flatten)(f))){var h=t.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:Do.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}zt.validateSomeNonEmptyLookaheadPath=Tj;function tIe(r,e,t,i){var n=[],s=(0,br.reduce)(r,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,br.forEach)(l,function(u){var g=[c];(0,br.forEach)(r,function(f,h){c!==h&&(0,qg.containsPath)(f,u)&&e.definition[h].ignoreAmbiguities!==!0&&g.push(h)}),g.length>1&&!(0,qg.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=er.map(s,function(a){var l=(0,br.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:Do.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:t.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function Oj(r,e,t,i){var n=[],s=(0,br.reduce)(r,function(o,a,l){var c=(0,br.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,br.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,br.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx{"use strict";Object.defineProperty(Jg,"__esModule",{value:!0});Jg.validateGrammar=Jg.resolveGrammar=void 0;var Gv=Gt(),iIe=Cj(),nIe=Hv(),Mj=Cd();function sIe(r){r=(0,Gv.defaults)(r,{errMsgProvider:Mj.defaultGrammarResolverErrorProvider});var e={};return(0,Gv.forEach)(r.rules,function(t){e[t.name]=t}),(0,iIe.resolveGrammar)(e,r.errMsgProvider)}Jg.resolveGrammar=sIe;function oIe(r){return r=(0,Gv.defaults)(r,{errMsgProvider:Mj.defaultGrammarValidatorErrorProvider}),(0,nIe.validateGrammar)(r.rules,r.maxLookahead,r.tokenTypes,r.errMsgProvider,r.grammarName)}Jg.validateGrammar=oIe});var Wg=w(mn=>{"use strict";var wd=mn&&mn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(mn,"__esModule",{value:!0});mn.EarlyExitException=mn.NotAllInputParsedException=mn.NoViableAltException=mn.MismatchedTokenException=mn.isRecognitionException=void 0;var aIe=Gt(),Uj="MismatchedTokenException",Hj="NoViableAltException",Gj="EarlyExitException",Yj="NotAllInputParsedException",jj=[Uj,Hj,Gj,Yj];Object.freeze(jj);function AIe(r){return(0,aIe.contains)(jj,r.name)}mn.isRecognitionException=AIe;var ry=function(r){wd(e,r);function e(t,i){var n=this.constructor,s=r.call(this,t)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),lIe=function(r){wd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=Uj,s}return e}(ry);mn.MismatchedTokenException=lIe;var cIe=function(r){wd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=Hj,s}return e}(ry);mn.NoViableAltException=cIe;var uIe=function(r){wd(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.name=Yj,n}return e}(ry);mn.NotAllInputParsedException=uIe;var gIe=function(r){wd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=Gj,s}return e}(ry);mn.EarlyExitException=gIe});var jv=w(Mi=>{"use strict";Object.defineProperty(Mi,"__esModule",{value:!0});Mi.attemptInRepetitionRecovery=Mi.Recoverable=Mi.InRuleRecoveryException=Mi.IN_RULE_RECOVERY_EXCEPTION=Mi.EOF_FOLLOW_KEY=void 0;var iy=SA(),ls=Gt(),fIe=Wg(),hIe=kv(),pIe=Hn();Mi.EOF_FOLLOW_KEY={};Mi.IN_RULE_RECOVERY_EXCEPTION="InRuleRecoveryException";function Yv(r){this.name=Mi.IN_RULE_RECOVERY_EXCEPTION,this.message=r}Mi.InRuleRecoveryException=Yv;Yv.prototype=Error.prototype;var dIe=function(){function r(){}return r.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,ls.has)(e,"recoveryEnabled")?e.recoveryEnabled:pIe.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=qj)},r.prototype.getTokenToInsert=function(e){var t=(0,iy.createTokenInstance)(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return t.isInsertedInRecovery=!0,t},r.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},r.prototype.tryInRepetitionRecovery=function(e,t,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),f=function(){var h=s.LA(0),p=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:h,ruleName:s.getCurrRuleFullName()}),C=new fIe.MismatchedTokenException(p,u,s.LA(0));C.resyncedTokens=(0,ls.dropRight)(l),s.SAVE_ERROR(C)};!c;)if(this.tokenMatcher(g,n)){f();return}else if(i.call(this)){f(),e.apply(this,t);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},r.prototype.shouldInRepetitionRecoveryBeTried=function(e,t,i){return!(i===!1||e===void 0||t===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,t)))},r.prototype.getFollowsForInRuleRecovery=function(e,t){var i=this.getCurrentGrammarPath(e,t),n=this.getNextPossibleTokenTypes(i);return n},r.prototype.tryInRuleRecovery=function(e,t){if(this.canRecoverWithSingleTokenInsertion(e,t)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new Yv("sad sad panda")},r.prototype.canPerformInRuleRecovery=function(e,t){return this.canRecoverWithSingleTokenInsertion(e,t)||this.canRecoverWithSingleTokenDeletion(e)},r.prototype.canRecoverWithSingleTokenInsertion=function(e,t){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,ls.isEmpty)(t))return!1;var n=this.LA(1),s=(0,ls.find)(t,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},r.prototype.canRecoverWithSingleTokenDeletion=function(e){var t=this.tokenMatcher(this.LA(2),e);return t},r.prototype.isInCurrentRuleReSyncSet=function(e){var t=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(t);return(0,ls.contains)(i,e)},r.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),t=this.LA(1),i=2;;){var n=t.tokenType;if((0,ls.contains)(e,n))return n;t=this.LA(i),i++}},r.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return Mi.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),t=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:t,inRule:this.shortRuleNameToFullName(i)}},r.prototype.buildFullFollowKeyStack=function(){var e=this,t=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,ls.map)(t,function(n,s){return s===0?Mi.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(t[s-1])}})},r.prototype.flattenFollowSet=function(){var e=this,t=(0,ls.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,ls.flatten)(t)},r.prototype.getFollowSetFromFollowKey=function(e){if(e===Mi.EOF_FOLLOW_KEY)return[iy.EOF];var t=e.ruleName+e.idxInCallingRule+hIe.IN+e.inRule;return this.resyncFollows[t]},r.prototype.addToResyncTokens=function(e,t){return this.tokenMatcher(e,iy.EOF)||t.push(e),t},r.prototype.reSyncTo=function(e){for(var t=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,t);return(0,ls.dropRight)(t)},r.prototype.attemptInRepetitionRecovery=function(e,t,i,n,s,o,a){},r.prototype.getCurrentGrammarPath=function(e,t){var i=this.getHumanReadableRuleStack(),n=(0,ls.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:t};return s},r.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,ls.map)(this.RULE_STACK,function(t){return e.shortRuleNameToFullName(t)})},r}();Mi.Recoverable=dIe;function qj(r,e,t,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var f=l.token,h=l.occurrence,p=l.isEndOfRule;this.RULE_STACK.length===1&&p&&f===void 0&&(f=iy.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(f,h,o)&&this.tryInRepetitionRecovery(r,e,t,f)}Mi.attemptInRepetitionRecovery=qj});var ny=w(qt=>{"use strict";Object.defineProperty(qt,"__esModule",{value:!0});qt.getKeyForAutomaticLookahead=qt.AT_LEAST_ONE_SEP_IDX=qt.MANY_SEP_IDX=qt.AT_LEAST_ONE_IDX=qt.MANY_IDX=qt.OPTION_IDX=qt.OR_IDX=qt.BITS_FOR_ALT_IDX=qt.BITS_FOR_RULE_IDX=qt.BITS_FOR_OCCURRENCE_IDX=qt.BITS_FOR_METHOD_TYPE=void 0;qt.BITS_FOR_METHOD_TYPE=4;qt.BITS_FOR_OCCURRENCE_IDX=8;qt.BITS_FOR_RULE_IDX=12;qt.BITS_FOR_ALT_IDX=8;qt.OR_IDX=1<{"use strict";Object.defineProperty(sy,"__esModule",{value:!0});sy.LooksAhead=void 0;var Qa=Id(),Zs=Gt(),Jj=Hn(),ba=ny(),oc=dd(),mIe=function(){function r(){}return r.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,Zs.has)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:Jj.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,Zs.has)(e,"maxLookahead")?e.maxLookahead:Jj.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,Zs.isES2015MapSupported)()?new Map:[],(0,Zs.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},r.prototype.preComputeLookaheadFunctions=function(e){var t=this;(0,Zs.forEach)(e,function(i){t.TRACE_INIT(i.name+" Rule Lookahead",function(){var n=(0,oc.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,Zs.forEach)(s,function(g){var f=g.idx===0?"":g.idx;t.TRACE_INIT(""+(0,oc.getProductionDslName)(g)+f,function(){var h=(0,Qa.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||t.maxLookahead,g.hasPredicates,t.dynamicTokensEnabled,t.lookAheadBuilderForAlternatives),p=(0,ba.getKeyForAutomaticLookahead)(t.fullRuleNameToShort[i.name],ba.OR_IDX,g.idx);t.setLaFuncCache(p,h)})}),(0,Zs.forEach)(o,function(g){t.computeLookaheadFunc(i,g.idx,ba.MANY_IDX,Qa.PROD_TYPE.REPETITION,g.maxLookahead,(0,oc.getProductionDslName)(g))}),(0,Zs.forEach)(a,function(g){t.computeLookaheadFunc(i,g.idx,ba.OPTION_IDX,Qa.PROD_TYPE.OPTION,g.maxLookahead,(0,oc.getProductionDslName)(g))}),(0,Zs.forEach)(l,function(g){t.computeLookaheadFunc(i,g.idx,ba.AT_LEAST_ONE_IDX,Qa.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,oc.getProductionDslName)(g))}),(0,Zs.forEach)(c,function(g){t.computeLookaheadFunc(i,g.idx,ba.AT_LEAST_ONE_SEP_IDX,Qa.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,oc.getProductionDslName)(g))}),(0,Zs.forEach)(u,function(g){t.computeLookaheadFunc(i,g.idx,ba.MANY_SEP_IDX,Qa.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,oc.getProductionDslName)(g))})})})},r.prototype.computeLookaheadFunc=function(e,t,i,n,s,o){var a=this;this.TRACE_INIT(""+o+(t===0?"":t),function(){var l=(0,Qa.buildLookaheadFuncForOptionalProd)(t,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,ba.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,t);a.setLaFuncCache(c,l)})},r.prototype.lookAheadBuilderForOptional=function(e,t,i){return(0,Qa.buildSingleAlternativeLookaheadFunction)(e,t,i)},r.prototype.lookAheadBuilderForAlternatives=function(e,t,i,n){return(0,Qa.buildAlternativesLookAheadFunc)(e,t,i,n)},r.prototype.getKeyForAutomaticLookahead=function(e,t){var i=this.getLastExplicitRuleShortName();return(0,ba.getKeyForAutomaticLookahead)(i,e,t)},r.prototype.getLaFuncFromCache=function(e){},r.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},r.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},r.prototype.setLaFuncCache=function(e,t){},r.prototype.setLaFuncCacheUsingMap=function(e,t){this.lookAheadFuncsCache.set(e,t)},r.prototype.setLaFuncUsingObj=function(e,t){this.lookAheadFuncsCache[e]=t},r}();sy.LooksAhead=mIe});var zj=w(ko=>{"use strict";Object.defineProperty(ko,"__esModule",{value:!0});ko.addNoneTerminalToCst=ko.addTerminalToCst=ko.setNodeLocationFull=ko.setNodeLocationOnlyOffset=void 0;function EIe(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.endOffset=e.endOffset):r.endOffset{"use strict";Object.defineProperty(PA,"__esModule",{value:!0});PA.defineNameProp=PA.functionName=PA.classNameFromInstance=void 0;var BIe=Gt();function QIe(r){return Xj(r.constructor)}PA.classNameFromInstance=QIe;var Vj="name";function Xj(r){var e=r.name;return e||"anonymous"}PA.functionName=Xj;function bIe(r,e){var t=Object.getOwnPropertyDescriptor(r,Vj);return(0,BIe.isUndefined)(t)||t.configurable?(Object.defineProperty(r,Vj,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}PA.defineNameProp=bIe});var tq=w(bi=>{"use strict";Object.defineProperty(bi,"__esModule",{value:!0});bi.validateRedundantMethods=bi.validateMissingCstMethods=bi.validateVisitor=bi.CstVisitorDefinitionError=bi.createBaseVisitorConstructorWithDefaults=bi.createBaseSemanticVisitorConstructor=bi.defaultVisit=void 0;var cs=Gt(),Bd=qv();function _j(r,e){for(var t=(0,cs.keys)(r),i=t.length,n=0;n:
+ `+(""+s.join(`
+
+`).replace(/\n/g,`
+ `)))}}};return t.prototype=i,t.prototype.constructor=t,t._RULE_NAMES=e,t}bi.createBaseSemanticVisitorConstructor=SIe;function vIe(r,e,t){var i=function(){};(0,Bd.defineNameProp)(i,r+"BaseSemanticsWithDefaults");var n=Object.create(t.prototype);return(0,cs.forEach)(e,function(s){n[s]=_j}),i.prototype=n,i.prototype.constructor=i,i}bi.createBaseVisitorConstructorWithDefaults=vIe;var Jv;(function(r){r[r.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",r[r.MISSING_METHOD=1]="MISSING_METHOD"})(Jv=bi.CstVisitorDefinitionError||(bi.CstVisitorDefinitionError={}));function Zj(r,e){var t=$j(r,e),i=eq(r,e);return t.concat(i)}bi.validateVisitor=Zj;function $j(r,e){var t=(0,cs.map)(e,function(i){if(!(0,cs.isFunction)(r[i]))return{msg:"Missing visitor method: <"+i+"> on "+(0,Bd.functionName)(r.constructor)+" CST Visitor.",type:Jv.MISSING_METHOD,methodName:i}});return(0,cs.compact)(t)}bi.validateMissingCstMethods=$j;var xIe=["constructor","visit","validateVisitor"];function eq(r,e){var t=[];for(var i in r)(0,cs.isFunction)(r[i])&&!(0,cs.contains)(xIe,i)&&!(0,cs.contains)(e,i)&&t.push({msg:"Redundant visitor method: <"+i+"> on "+(0,Bd.functionName)(r.constructor)+` CST Visitor
+There is no Grammar Rule corresponding to this method's name.
+`,type:Jv.REDUNDANT_METHOD,methodName:i});return t}bi.validateRedundantMethods=eq});var iq=w(oy=>{"use strict";Object.defineProperty(oy,"__esModule",{value:!0});oy.TreeBuilder=void 0;var zg=zj(),Zr=Gt(),rq=tq(),PIe=Hn(),DIe=function(){function r(){}return r.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,Zr.has)(e,"nodeLocationTracking")?e.nodeLocationTracking:PIe.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=Zr.NOOP,this.cstFinallyStateUpdate=Zr.NOOP,this.cstPostTerminal=Zr.NOOP,this.cstPostNonTerminal=Zr.NOOP,this.cstPostRule=Zr.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=zg.setNodeLocationFull,this.setNodeLocationFromNode=zg.setNodeLocationFull,this.cstPostRule=Zr.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=Zr.NOOP,this.setNodeLocationFromNode=Zr.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=zg.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=zg.setNodeLocationOnlyOffset,this.cstPostRule=Zr.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=Zr.NOOP,this.setNodeLocationFromNode=Zr.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=Zr.NOOP,this.setNodeLocationFromNode=Zr.NOOP,this.cstPostRule=Zr.NOOP,this.setInitialNodeLocation=Zr.NOOP;else throw Error('Invalid config option: "'+e.nodeLocationTracking+'"')},r.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},r.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},r.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.setInitialNodeLocationFullRegular=function(e){var t=this.LA(1);e.location={startOffset:t.startOffset,startLine:t.startLine,startColumn:t.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.cstInvocationStateUpdate=function(e,t){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},r.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},r.prototype.cstPostRuleFull=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?(i.endOffset=t.endOffset,i.endLine=t.endLine,i.endColumn=t.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},r.prototype.cstPostRuleOnlyOffset=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?i.endOffset=t.endOffset:i.startOffset=NaN},r.prototype.cstPostTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,zg.addTerminalToCst)(i,t,e),this.setNodeLocationFromToken(i.location,t)},r.prototype.cstPostNonTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,zg.addNoneTerminalToCst)(i,t,e),this.setNodeLocationFromNode(i.location,e.location)},r.prototype.getBaseCstVisitorConstructor=function(){if((0,Zr.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,rq.createBaseSemanticVisitorConstructor)(this.className,(0,Zr.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},r.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,Zr.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,rq.createBaseVisitorConstructorWithDefaults)(this.className,(0,Zr.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},r.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},r.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},r.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},r}();oy.TreeBuilder=DIe});var sq=w(ay=>{"use strict";Object.defineProperty(ay,"__esModule",{value:!0});ay.LexerAdapter=void 0;var nq=Hn(),kIe=function(){function r(){}return r.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(r.prototype,"input",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),r.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):nq.END_OF_FILE},r.prototype.LA=function(e){var t=this.currIdx+e;return t<0||this.tokVectorLength<=t?nq.END_OF_FILE:this.tokVector[t]},r.prototype.consumeToken=function(){this.currIdx++},r.prototype.exportLexerState=function(){return this.currIdx},r.prototype.importLexerState=function(e){this.currIdx=e},r.prototype.resetLexerState=function(){this.currIdx=-1},r.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},r.prototype.getLexerPosition=function(){return this.exportLexerState()},r}();ay.LexerAdapter=kIe});var aq=w(Ay=>{"use strict";Object.defineProperty(Ay,"__esModule",{value:!0});Ay.RecognizerApi=void 0;var oq=Gt(),RIe=Wg(),Wv=Hn(),FIe=Cd(),NIe=Hv(),LIe=dn(),TIe=function(){function r(){}return r.prototype.ACTION=function(e){return e.call(this)},r.prototype.consume=function(e,t,i){return this.consumeInternal(t,e,i)},r.prototype.subrule=function(e,t,i){return this.subruleInternal(t,e,i)},r.prototype.option=function(e,t){return this.optionInternal(t,e)},r.prototype.or=function(e,t){return this.orInternal(t,e)},r.prototype.many=function(e,t){return this.manyInternal(e,t)},r.prototype.atLeastOne=function(e,t){return this.atLeastOneInternal(e,t)},r.prototype.CONSUME=function(e,t){return this.consumeInternal(e,0,t)},r.prototype.CONSUME1=function(e,t){return this.consumeInternal(e,1,t)},r.prototype.CONSUME2=function(e,t){return this.consumeInternal(e,2,t)},r.prototype.CONSUME3=function(e,t){return this.consumeInternal(e,3,t)},r.prototype.CONSUME4=function(e,t){return this.consumeInternal(e,4,t)},r.prototype.CONSUME5=function(e,t){return this.consumeInternal(e,5,t)},r.prototype.CONSUME6=function(e,t){return this.consumeInternal(e,6,t)},r.prototype.CONSUME7=function(e,t){return this.consumeInternal(e,7,t)},r.prototype.CONSUME8=function(e,t){return this.consumeInternal(e,8,t)},r.prototype.CONSUME9=function(e,t){return this.consumeInternal(e,9,t)},r.prototype.SUBRULE=function(e,t){return this.subruleInternal(e,0,t)},r.prototype.SUBRULE1=function(e,t){return this.subruleInternal(e,1,t)},r.prototype.SUBRULE2=function(e,t){return this.subruleInternal(e,2,t)},r.prototype.SUBRULE3=function(e,t){return this.subruleInternal(e,3,t)},r.prototype.SUBRULE4=function(e,t){return this.subruleInternal(e,4,t)},r.prototype.SUBRULE5=function(e,t){return this.subruleInternal(e,5,t)},r.prototype.SUBRULE6=function(e,t){return this.subruleInternal(e,6,t)},r.prototype.SUBRULE7=function(e,t){return this.subruleInternal(e,7,t)},r.prototype.SUBRULE8=function(e,t){return this.subruleInternal(e,8,t)},r.prototype.SUBRULE9=function(e,t){return this.subruleInternal(e,9,t)},r.prototype.OPTION=function(e){return this.optionInternal(e,0)},r.prototype.OPTION1=function(e){return this.optionInternal(e,1)},r.prototype.OPTION2=function(e){return this.optionInternal(e,2)},r.prototype.OPTION3=function(e){return this.optionInternal(e,3)},r.prototype.OPTION4=function(e){return this.optionInternal(e,4)},r.prototype.OPTION5=function(e){return this.optionInternal(e,5)},r.prototype.OPTION6=function(e){return this.optionInternal(e,6)},r.prototype.OPTION7=function(e){return this.optionInternal(e,7)},r.prototype.OPTION8=function(e){return this.optionInternal(e,8)},r.prototype.OPTION9=function(e){return this.optionInternal(e,9)},r.prototype.OR=function(e){return this.orInternal(e,0)},r.prototype.OR1=function(e){return this.orInternal(e,1)},r.prototype.OR2=function(e){return this.orInternal(e,2)},r.prototype.OR3=function(e){return this.orInternal(e,3)},r.prototype.OR4=function(e){return this.orInternal(e,4)},r.prototype.OR5=function(e){return this.orInternal(e,5)},r.prototype.OR6=function(e){return this.orInternal(e,6)},r.prototype.OR7=function(e){return this.orInternal(e,7)},r.prototype.OR8=function(e){return this.orInternal(e,8)},r.prototype.OR9=function(e){return this.orInternal(e,9)},r.prototype.MANY=function(e){this.manyInternal(0,e)},r.prototype.MANY1=function(e){this.manyInternal(1,e)},r.prototype.MANY2=function(e){this.manyInternal(2,e)},r.prototype.MANY3=function(e){this.manyInternal(3,e)},r.prototype.MANY4=function(e){this.manyInternal(4,e)},r.prototype.MANY5=function(e){this.manyInternal(5,e)},r.prototype.MANY6=function(e){this.manyInternal(6,e)},r.prototype.MANY7=function(e){this.manyInternal(7,e)},r.prototype.MANY8=function(e){this.manyInternal(8,e)},r.prototype.MANY9=function(e){this.manyInternal(9,e)},r.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},r.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},r.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},r.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},r.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},r.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},r.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},r.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},r.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},r.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},r.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},r.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},r.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},r.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},r.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},r.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},r.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},r.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},r.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},r.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},r.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},r.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},r.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},r.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},r.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},r.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},r.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},r.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},r.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},r.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},r.prototype.RULE=function(e,t,i){if(i===void 0&&(i=Wv.DEFAULT_RULE_CONFIG),(0,oq.contains)(this.definedRulesNames,e)){var n=FIe.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:Wv.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,t,i);return this[e]=o,o},r.prototype.OVERRIDE_RULE=function(e,t,i){i===void 0&&(i=Wv.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,NIe.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,t,i);return this[e]=s,s},r.prototype.BACKTRACK=function(e,t){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,t),!0}catch(n){if((0,RIe.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},r.prototype.getGAstProductions=function(){return this.gastProductionsCache},r.prototype.getSerializedGastProductions=function(){return(0,LIe.serializeGrammar)((0,oq.values)(this.gastProductionsCache))},r}();Ay.RecognizerApi=TIe});var uq=w(cy=>{"use strict";Object.defineProperty(cy,"__esModule",{value:!0});cy.RecognizerEngine=void 0;var Pr=Gt(),Gn=ny(),ly=Wg(),Aq=Id(),Vg=Ed(),lq=Hn(),OIe=jv(),cq=SA(),Qd=Gg(),MIe=qv(),KIe=function(){function r(){}return r.prototype.initRecognizerEngine=function(e,t){if(this.className=(0,MIe.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=Qd.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,Pr.has)(t,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property.
+ See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0
+ For Further details.`);if((0,Pr.isArray)(e)){if((0,Pr.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty.
+ Note that the first argument for the parser constructor
+ is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument.
+ See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0
+ For Further details.`)}if((0,Pr.isArray)(e))this.tokensMap=(0,Pr.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,Pr.has)(e,"modes")&&(0,Pr.every)((0,Pr.flatten)((0,Pr.values)(e.modes)),Qd.isTokenType)){var i=(0,Pr.flatten)((0,Pr.values)(e.modes)),n=(0,Pr.uniq)(i);this.tokensMap=(0,Pr.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,Pr.isObject)(e))this.tokensMap=(0,Pr.cloneObj)(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=cq.EOF;var s=(0,Pr.every)((0,Pr.values)(e),function(o){return(0,Pr.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?Qd.tokenStructuredMatcherNoCategories:Qd.tokenStructuredMatcher,(0,Qd.augmentTokenTypes)((0,Pr.values)(this.tokensMap))},r.prototype.defineRule=function(e,t,i){if(this.selfAnalysisDone)throw Error("Grammar rule <"+e+`> may not be defined after the 'performSelfAnalysis' method has been called'
+Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,Pr.has)(i,"resyncEnabled")?i.resyncEnabled:lq.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,Pr.has)(i,"recoveryValueFunc")?i.recoveryValueFunc:lq.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<t},r.prototype.orInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(Gn.OR_IDX,t),n=(0,Pr.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(t,e.ERR_MSG)},r.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),t=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new ly.NotAllInputParsedException(t,e))}},r.prototype.subruleInternal=function(e,t,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,t,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},r.prototype.subruleInternalError=function(e,t,i){throw(0,ly.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,t!==void 0&&t.LABEL!==void 0?t.LABEL:i),delete e.partialCstResult),e},r.prototype.consumeInternal=function(e,t,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,t,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},r.prototype.consumeInternalError=function(e,t,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:t,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new ly.MismatchedTokenException(n,t,s))},r.prototype.consumeInternalRecovery=function(e,t,i){if(this.recoveryEnabled&&i.name==="MismatchedTokenException"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,t);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===OIe.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},r.prototype.saveRecogState=function(){var e=this.errors,t=(0,Pr.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:t,CST_STACK:this.CST_STACK}},r.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},r.prototype.ruleInvocationStateUpdate=function(e,t,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(t,e)},r.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},r.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},r.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},r.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),cq.EOF)},r.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},r}();cy.RecognizerEngine=KIe});var fq=w(uy=>{"use strict";Object.defineProperty(uy,"__esModule",{value:!0});uy.ErrorHandler=void 0;var zv=Wg(),Vv=Gt(),gq=Id(),UIe=Hn(),HIe=function(){function r(){}return r.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,Vv.has)(e,"errorMessageProvider")?e.errorMessageProvider:UIe.DEFAULT_PARSER_CONFIG.errorMessageProvider},r.prototype.SAVE_ERROR=function(e){if((0,zv.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,Vv.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")},Object.defineProperty(r.prototype,"errors",{get:function(){return(0,Vv.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),r.prototype.raiseEarlyExitException=function(e,t,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,gq.getLookaheadPathsForOptionalProd)(e,s,t,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new zv.EarlyExitException(u,this.LA(1),this.LA(0)))},r.prototype.raiseNoAltException=function(e,t){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,gq.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:t,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new zv.NoViableAltException(c,this.LA(1),l))},r}();uy.ErrorHandler=HIe});var dq=w(gy=>{"use strict";Object.defineProperty(gy,"__esModule",{value:!0});gy.ContentAssist=void 0;var hq=Ed(),pq=Gt(),GIe=function(){function r(){}return r.prototype.initContentAssist=function(){},r.prototype.computeContentAssist=function(e,t){var i=this.gastProductionsCache[e];if((0,pq.isUndefined)(i))throw Error("Rule ->"+e+"<- does not exist in this grammar.");return(0,hq.nextPossibleTokensAfter)([i],t,this.tokenMatcher,this.maxLookahead)},r.prototype.getNextPossibleTokenTypes=function(e){var t=(0,pq.first)(e.ruleStack),i=this.getGAstProductions(),n=i[t],s=new hq.NextAfterTokenWalker(n,e).startWalking();return s},r}();gy.ContentAssist=GIe});var Qq=w(py=>{"use strict";Object.defineProperty(py,"__esModule",{value:!0});py.GastRecorder=void 0;var En=Gt(),Ro=dn(),YIe=gd(),Iq=Gg(),yq=SA(),jIe=Hn(),qIe=ny(),hy={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(hy);var Cq=!0,mq=Math.pow(2,qIe.BITS_FOR_OCCURRENCE_IDX)-1,wq=(0,yq.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:YIe.Lexer.NA});(0,Iq.augmentTokenTypes)([wq]);var Bq=(0,yq.createTokenInstance)(wq,`This IToken indicates the Parser is in Recording Phase
+ See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(Bq);var JIe={name:`This CSTNode indicates the Parser is in Recording Phase
+ See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},WIe=function(){function r(){}return r.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},r.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var t=function(n){var s=n>0?n:"";e["CONSUME"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e["SUBRULE"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e["OPTION"+s]=function(o){return this.optionInternalRecord(o,n)},e["OR"+s]=function(o){return this.orInternalRecord(o,n)},e["MANY"+s]=function(o){this.manyInternalRecord(n,o)},e["MANY_SEP"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e["AT_LEAST_ONE"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e["AT_LEAST_ONE_SEP"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)t(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},r.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var t=0;t<10;t++){var i=t>0?t:"";delete e["CONSUME"+i],delete e["SUBRULE"+i],delete e["OPTION"+i],delete e["OR"+i],delete e["MANY"+i],delete e["MANY_SEP"+i],delete e["AT_LEAST_ONE"+i],delete e["AT_LEAST_ONE_SEP"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},r.prototype.ACTION_RECORD=function(e){},r.prototype.BACKTRACK_RECORD=function(e,t){return function(){return!0}},r.prototype.LA_RECORD=function(e){return jIe.END_OF_FILE},r.prototype.topLevelRuleRecord=function(e,t){try{var i=new Ro.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),t.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+`
+ This error was thrown during the "grammar recording phase" For more info see:
+ https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}},r.prototype.optionInternalRecord=function(e,t){return bd.call(this,Ro.Option,e,t)},r.prototype.atLeastOneInternalRecord=function(e,t){bd.call(this,Ro.RepetitionMandatory,t,e)},r.prototype.atLeastOneSepFirstInternalRecord=function(e,t){bd.call(this,Ro.RepetitionMandatoryWithSeparator,t,e,Cq)},r.prototype.manyInternalRecord=function(e,t){bd.call(this,Ro.Repetition,t,e)},r.prototype.manySepFirstInternalRecord=function(e,t){bd.call(this,Ro.RepetitionWithSeparator,t,e,Cq)},r.prototype.orInternalRecord=function(e,t){return zIe.call(this,e,t)},r.prototype.subruleInternalRecord=function(e,t,i){if(fy(t),!e||(0,En.has)(e,"ruleName")===!1){var n=new Error(" argument is invalid"+(" expecting a Parser method reference but got: <"+JSON.stringify(e)+">")+(`
+ inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,En.peek)(this.recordingProdStack),o=e.ruleName,a=new Ro.NonTerminal({idx:t,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?JIe:hy},r.prototype.consumeInternalRecord=function(e,t,i){if(fy(t),!(0,Iq.hasShortKeyProperty)(e)){var n=new Error(" argument is invalid"+(" expecting a TokenType reference but got: <"+JSON.stringify(e)+">")+(`
+ inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,En.peek)(this.recordingProdStack),o=new Ro.Terminal({idx:t,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),Bq},r}();py.GastRecorder=WIe;function bd(r,e,t,i){i===void 0&&(i=!1),fy(t);var n=(0,En.peek)(this.recordingProdStack),s=(0,En.isFunction)(e)?e:e.DEF,o=new r({definition:[],idx:t});return i&&(o.separator=e.SEP),(0,En.has)(e,"MAX_LOOKAHEAD")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),hy}function zIe(r,e){var t=this;fy(e);var i=(0,En.peek)(this.recordingProdStack),n=(0,En.isArray)(r)===!1,s=n===!1?r:r.DEF,o=new Ro.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&r.IGNORE_AMBIGUITIES===!0});(0,En.has)(r,"MAX_LOOKAHEAD")&&(o.maxLookahead=r.MAX_LOOKAHEAD);var a=(0,En.some)(s,function(l){return(0,En.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,En.forEach)(s,function(l){var c=new Ro.Alternative({definition:[]});o.definition.push(c),(0,En.has)(l,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,En.has)(l,"GATE")&&(c.ignoreAmbiguities=!0),t.recordingProdStack.push(c),l.ALT.call(t),t.recordingProdStack.pop()}),hy}function Eq(r){return r===0?"":""+r}function fy(r){if(r<0||r>mq){var e=new Error("Invalid DSL Method idx value: <"+r+`>
+ `+("Idx value must be a none negative value smaller than "+(mq+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var Sq=w(dy=>{"use strict";Object.defineProperty(dy,"__esModule",{value:!0});dy.PerformanceTracer=void 0;var bq=Gt(),VIe=Hn(),XIe=function(){function r(){}return r.prototype.initPerformanceTracer=function(e){if((0,bq.has)(e,"traceInitPerf")){var t=e.traceInitPerf,i=typeof t=="number";this.traceInitMaxIdent=i?t:1/0,this.traceInitPerf=i?t>0:t}else this.traceInitMaxIdent=0,this.traceInitPerf=VIe.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},r.prototype.TRACE_INIT=function(e,t){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <"+e+">");var n=(0,bq.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r}();dy.PerformanceTracer=XIe});var vq=w(Cy=>{"use strict";Object.defineProperty(Cy,"__esModule",{value:!0});Cy.applyMixins=void 0;function _Ie(r,e){e.forEach(function(t){var i=t.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!=="constructor"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(r.prototype,n,s):r.prototype[n]=t.prototype[n]}})})}Cy.applyMixins=_Ie});var Hn=w(dr=>{"use strict";var Dq=dr&&dr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(dr,"__esModule",{value:!0});dr.EmbeddedActionsParser=dr.CstParser=dr.Parser=dr.EMPTY_ALT=dr.ParserDefinitionErrorType=dr.DEFAULT_RULE_CONFIG=dr.DEFAULT_PARSER_CONFIG=dr.END_OF_FILE=void 0;var Xi=Gt(),ZIe=fj(),xq=SA(),kq=Cd(),Pq=Kj(),$Ie=jv(),eye=Wj(),tye=iq(),rye=sq(),iye=aq(),nye=uq(),sye=fq(),oye=dq(),aye=Qq(),Aye=Sq(),lye=vq();dr.END_OF_FILE=(0,xq.createTokenInstance)(xq.EOF,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(dr.END_OF_FILE);dr.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:kq.defaultParserErrorProvider,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1});dr.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var cye;(function(r){r[r.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",r[r.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",r[r.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",r[r.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",r[r.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",r[r.LEFT_RECURSION=5]="LEFT_RECURSION",r[r.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",r[r.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",r[r.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",r[r.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",r[r.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",r[r.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",r[r.TOO_MANY_ALTS=12]="TOO_MANY_ALTS"})(cye=dr.ParserDefinitionErrorType||(dr.ParserDefinitionErrorType={}));function uye(r){return r===void 0&&(r=void 0),function(){return r}}dr.EMPTY_ALT=uye;var my=function(){function r(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(t),i.initLexerAdapter(),i.initLooksAhead(t),i.initRecognizerEngine(e,t),i.initRecoverable(t),i.initTreeBuilder(t),i.initContentAssist(),i.initGastRecorder(t),i.initPerformanceTracer(t),(0,Xi.has)(t,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated.
+ Please use the flag on the relevant DSL method instead.
+ See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES
+ For further details.`);this.skipValidations=(0,Xi.has)(t,"skipValidations")?t.skipValidations:dr.DEFAULT_PARSER_CONFIG.skipValidations}return r.performSelfAnalysis=function(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")},r.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT("performSelfAnalysis",function(){var t;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT("toFastProps",function(){(0,Xi.toFastProperties)(e)}),e.TRACE_INIT("Grammar Recording",function(){try{e.enableRecording(),(0,Xi.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+" Rule",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT("Grammar Resolving",function(){n=(0,Pq.resolveGrammar)({rules:(0,Xi.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT("Grammar Validations",function(){if((0,Xi.isEmpty)(n)&&e.skipValidations===!1){var s=(0,Pq.validateGrammar)({rules:(0,Xi.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,Xi.values)(e.tokensMap),errMsgProvider:kq.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,Xi.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT("computeAllProdsFollows",function(){var s=(0,ZIe.computeAllProdsFollows)((0,Xi.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT("ComputeLookaheadFunctions",function(){e.preComputeLookaheadFunctions((0,Xi.values)(e.gastProductionsCache))})),!r.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,Xi.isEmpty)(e.definitionErrors))throw t=(0,Xi.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected:
+ `+t.join(`
+-------------------------------
+`))})},r.DEFER_DEFINITION_ERRORS_HANDLING=!1,r}();dr.Parser=my;(0,lye.applyMixins)(my,[$Ie.Recoverable,eye.LooksAhead,tye.TreeBuilder,rye.LexerAdapter,nye.RecognizerEngine,iye.RecognizerApi,sye.ErrorHandler,oye.ContentAssist,aye.GastRecorder,Aye.PerformanceTracer]);var gye=function(r){Dq(e,r);function e(t,i){i===void 0&&(i=dr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,Xi.cloneObj)(i);return s.outputCst=!0,n=r.call(this,t,s)||this,n}return e}(my);dr.CstParser=gye;var fye=function(r){Dq(e,r);function e(t,i){i===void 0&&(i=dr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,Xi.cloneObj)(i);return s.outputCst=!1,n=r.call(this,t,s)||this,n}return e}(my);dr.EmbeddedActionsParser=fye});var Fq=w(Ey=>{"use strict";Object.defineProperty(Ey,"__esModule",{value:!0});Ey.createSyntaxDiagramsCode=void 0;var Rq=pv();function hye(r,e){var t=e===void 0?{}:e,i=t.resourceBase,n=i===void 0?"https://unpkg.com/chevrotain@"+Rq.VERSION+"/diagrams/":i,s=t.css,o=s===void 0?"https://unpkg.com/chevrotain@"+Rq.VERSION+"/diagrams/diagrams.css":s,a=`
+
+
+
+
+
+`,l=`
+
+`,c=`
+