", "\[row\]")
+ t = replacetext(t, "", "\[cell\]")
+ t = replacetext(t, " ", "\[logo\]")
+ t = replacetext(t, " ", "\[redlogo\]")
+ t = replacetext(t, " ", "\[sglogo\]")
+ t = replacetext(t, "", "\[field\]")
+ t = replacetext(t, "R E D A C T E D", "\[redacted\]")
+ t = strip_html_properly(t)
+ return t
+
// Random password generator
/proc/GenerateKey()
//Feel free to move to Helpers.
@@ -476,23 +535,43 @@
#define gender2text(gender) capitalize(gender)
-/// Used to get a properly sanitized input, of max_length
-/// no_trim is self explanatory but it prevents the input from being trimed if you intend to parse newlines or whitespace.
+/**
+ * Used to get a properly sanitized input. Returns null if cancel is pressed.
+ *
+ * Arguments
+ ** user - Target of the input prompt.
+ ** message - The text inside of the prompt.
+ ** title - The window title of the prompt.
+ ** max_length - If you intend to impose a length limit - default is 1024.
+ ** no_trim - Prevents the input from being trimmed if you intend to parse newlines or whitespace.
+*/
/proc/stripped_input(mob/user, message = "", title = "", default = "", max_length=MAX_MESSAGE_LEN, no_trim=FALSE)
- var/name = input(user, message, title, default) as text|null
-
+ var/user_input = input(user, message, title, default) as text|null
+ if(isnull(user_input)) // User pressed cancel
+ return
if(no_trim)
- return copytext(html_encode(name), 1, max_length)
+ return copytext(html_encode(user_input), 1, max_length)
else
- return trim(html_encode(name), max_length) //trim is "outside" because html_encode can expand single symbols into multiple symbols (such as turning < into <)
+ return trim(html_encode(user_input), max_length) //trim is "outside" because html_encode can expand single symbols into multiple symbols (such as turning < into <)
-// Used to get a properly sanitized multiline input, of max_length
+/**
+ * Used to get a properly sanitized input in a larger box. Works very similarly to stripped_input.
+ *
+ * Arguments
+ ** user - Target of the input prompt.
+ ** message - The text inside of the prompt.
+ ** title - The window title of the prompt.
+ ** max_length - If you intend to impose a length limit - default is 1024.
+ ** no_trim - Prevents the input from being trimmed if you intend to parse newlines or whitespace.
+*/
/proc/stripped_multiline_input(mob/user, message = "", title = "", default = "", max_length=MAX_MESSAGE_LEN, no_trim=FALSE)
- var/name = input(user, message, title, default) as message|null
+ var/user_input = input(user, message, title, default) as message|null
+ if(isnull(user_input)) // User pressed cancel
+ return
if(no_trim)
- return copytext(html_encode(name), 1, max_length)
+ return copytext(html_encode(user_input), 1, max_length)
else
- return trim(html_encode(name), max_length)
+ return trim(html_encode(user_input), max_length)
//Adds 'char' ahead of 'text' until there are 'count' characters total
/proc/add_leading(text, count, char = " ")
diff --git a/code/_helpers/turfs.dm b/code/_helpers/turfs.dm
index bea5e6780c4..9de7b925ad2 100644
--- a/code/_helpers/turfs.dm
+++ b/code/_helpers/turfs.dm
@@ -131,7 +131,7 @@
var/old_icon1 = T.icon
var/old_decals = T.decals ? T.decals.Copy() : null
- B.Destroy()
+ //B.Destroy()
X = B.ChangeTurf(T.type)
X.set_dir(old_dir1)
X.icon_state = old_icon_state1
diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index 37da921409d..f09cb94b0e7 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -344,7 +344,8 @@ Turf and target are seperate in case you want to teleport some distance from a t
var/newname
for(var/i=1,i<=3,i++) //we get 3 attempts to pick a suitable name.
- newname = input(src,"You are \a [role]. Would you like to change your name to something else?", "Name change",oldname) as text
+ //newname = tgui_input_text(src,"You are \a [role]. Would you like to change your name to something else?", "Name change",oldname)
+ newname = input(src,"You are \a [role]. Would you like to change your name to something else?", "Name change",oldname)
if((world.time-time_passed)>3000)
return //took too long
newname = sanitizeName(newname, ,allow_numbers) //returns null if the name doesn't meet some basic requirements. Tidies up a few other things like bad-characters.
@@ -1160,7 +1161,7 @@ var/list/WALLITEMS = list(
if(length(temp_col )<2)
temp_col = "0[temp_col]"
colour += temp_col
- return colour
+ return "#[colour]"
/proc/color_square(red, green, blue, hex)
var/color = hex ? hex : "#[num2hex(red, 2)][num2hex(green, 2)][num2hex(blue, 2)]"
@@ -1361,7 +1362,7 @@ var/mob/dview/dview_mob = new
/proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types())
if (value == FALSE) //nothing should be calling us with a number, so this is safe
- value = input(usr, "Enter type to find (blank for all, cancel to cancel)", "Search for type") as null|text
+ value = tgui_input_text(usr, "Enter type to find (blank for all, cancel to cancel)", "Search for type")
if (isnull(value))
return
value = trim(value)
@@ -1493,7 +1494,7 @@ GLOBAL_REAL_VAR(list/stack_trace_storage)
. += new /obj/screen/plane_master/lighting //Lighting system (but different!)
. += new /obj/screen/plane_master/o_light_visual //Object lighting (using masks)
. += new /obj/screen/plane_master/emissive //Emissive overlays
-
+
. += new /obj/screen/plane_master/ghosts //Ghosts!
. += new /obj/screen/plane_master{plane = PLANE_AI_EYE} //AI Eye!
diff --git a/code/_helpers/unsorted_vr.dm b/code/_helpers/unsorted_vr.dm
index daf4db48d78..0890c1f9c63 100644
--- a/code/_helpers/unsorted_vr.dm
+++ b/code/_helpers/unsorted_vr.dm
@@ -18,7 +18,8 @@
continue
if(vent.welded)
continue
- if(istype(get_area(vent), /area/crew_quarters/sleep)) //No going to dorms
+ var/area/A = get_area(vent)
+ if(A.forbid_events)
continue
vent_list += vent
if(!vent_list.len)
diff --git a/code/_macros.dm b/code/_macros.dm
index d122d9045f0..737b317abe0 100644
--- a/code/_macros.dm
+++ b/code/_macros.dm
@@ -42,4 +42,6 @@
#define WORLD_ICON_SIZE 32 //Needed for the R-UST port
-#define PIXEL_MULTIPLIER WORLD_ICON_SIZE/32 //Needed for the R-UST port
\ No newline at end of file
+#define PIXEL_MULTIPLIER WORLD_ICON_SIZE/32 //Needed for the R-UST port
+
+#define JOINTEXT(X) jointext(X, null)
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 14feaf1b5f8..f1a7f222484 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -47,6 +47,7 @@
#define ui_construct_purge "EAST:00,CENTER-1:15"
#define ui_construct_fire "EAST-1:16,CENTER+1:13" //above health, slightly to the left
#define ui_construct_pull "EAST-1:28,SOUTH+1:10" //above the zone_sel icon
+#define ui_pai_comms "EAST-1:28,SOUTH+1:5"
//Lower right, persistant menu
#define ui_dropbutton "EAST-4:22,SOUTH:5"
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index 62987479014..642ec99c73a 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -192,7 +192,7 @@ var/list/global_huds = list(
var/icon/ui_style
var/ui_color
var/ui_alpha
-
+
// TGMC Ammo HUD Port
var/list/obj/screen/ammo_hud_list = list()
@@ -368,6 +368,9 @@ var/list/global_huds = list(
toggle_hud_vis(full)
/mob/proc/toggle_hud_vis(full)
+ if(!client)
+ return FALSE
+
if(hud_used.hud_shown)
hud_used.hud_shown = 0
if(hud_used.adding)
@@ -405,7 +408,8 @@ var/list/global_huds = list(
return TRUE
/mob/living/carbon/human/toggle_hud_vis(full)
- ..()
+ if(!(. = ..()))
+ return FALSE
// Prevents humans from hiding a few hud elements
if(!hud_used.hud_shown) // transitioning to hidden
@@ -466,7 +470,7 @@ var/list/global_huds = list(
/mob/new_player/add_click_catcher()
return
-
+
/* TGMC Ammo HUD Port
* These procs call to screen_objects.dm's respective procs.
* All these do is manage the amount of huds on screen and set the HUD.
diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm
index 40e5977c83e..39d36738aa0 100644
--- a/code/_onclick/hud/movable_screen_objects.dm
+++ b/code/_onclick/hud/movable_screen_objects.dm
@@ -114,7 +114,7 @@
M.maptext = "Movable"
M.maptext_width = 64
- var/screen_l = input(usr,"Where on the screen? (Formatted as 'X,Y' e.g: '1,1' for bottom left)","Spawn Movable UI Object") as text
+ var/screen_l = tgui_input_text(usr,"Where on the screen? (Formatted as 'X,Y' e.g: '1,1' for bottom left)","Spawn Movable UI Object")
if(!screen_l)
return
@@ -133,7 +133,7 @@
S.maptext = "Snap"
S.maptext_width = 64
- var/screen_l = input(usr,"Where on the screen? (Formatted as 'X,Y' e.g: '1,1' for bottom left)","Spawn Snap UI Object") as text
+ var/screen_l = tgui_input_text(usr,"Where on the screen? (Formatted as 'X,Y' e.g: '1,1' for bottom left)","Spawn Snap UI Object")
if(!screen_l)
return
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index c1a4795001e..c9c15433d43 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -19,7 +19,7 @@
/obj/screen/Destroy()
master = null
return ..()
-
+
/obj/screen/proc/component_click(obj/screen/component_button/component, params)
return
@@ -46,9 +46,8 @@
object_overlays.Cut()
/obj/screen/inventory/proc/add_overlays()
- var/mob/user = hud.mymob
-
- if(hud && user && slot_id)
+ if(hud && hud.mymob && slot_id)
+ var/mob/user = hud.mymob
var/obj/item/holding = user.get_active_hand()
if(!holding || user.get_equipped_item(slot_id))
@@ -422,16 +421,28 @@
usr.a_intent_change("right")
if(I_HELP)
usr.a_intent = I_HELP
- usr.hud_used.action_intent.icon_state = "intent_help"
+ if(ispAI(usr))
+ usr.a_intent_change(I_HELP)
+ else
+ usr.hud_used.action_intent.icon_state = "intent_help"
if(I_HURT)
usr.a_intent = I_HURT
- usr.hud_used.action_intent.icon_state = "intent_harm"
+ if(ispAI(usr))
+ usr.a_intent_change(I_HURT)
+ else
+ usr.hud_used.action_intent.icon_state = "intent_harm"
if(I_GRAB)
usr.a_intent = I_GRAB
- usr.hud_used.action_intent.icon_state = "intent_grab"
+ if(ispAI(usr))
+ usr.a_intent_change(I_GRAB)
+ else
+ usr.hud_used.action_intent.icon_state = "intent_grab"
if(I_DISARM)
usr.a_intent = I_DISARM
- usr.hud_used.action_intent.icon_state = "intent_disarm"
+ if(ispAI(usr))
+ usr.a_intent_change(I_DISARM)
+ else
+ usr.hud_used.action_intent.icon_state = "intent_disarm"
if("pull")
usr.stop_pulling()
@@ -607,7 +618,7 @@
var/mob/living/carbon/C = hud.mymob
if(C.handcuffed)
add_overlay(handcuff_overlay)
-
+
// PIP stuff
/obj/screen/component_button
var/obj/screen/parent
@@ -622,7 +633,7 @@
// Character setup stuff
/obj/screen/setup_preview
-
+
var/datum/preferences/pref
/obj/screen/setup_preview/Destroy()
@@ -693,7 +704,7 @@ INITIALIZE_IMMEDIATE(/obj/screen/splash)
* size of the screen. This is not ideal, as filter() is faster, and has
* alpha masks, but the alpha masks it has can't be animated, so the 'ping'
* mode of this device isn't possible using that technique.
- *
+ *
* The markers use that technique, though, so at least there's that.
*/
/obj/screen/movable/mapper_holder
@@ -711,7 +722,7 @@ INITIALIZE_IMMEDIATE(/obj/screen/splash)
var/obj/screen/mapper/mask_full/mask_full
var/obj/screen/mapper/mask_ping/mask_ping
var/obj/screen/mapper/bg/bg
-
+
var/obj/screen/mapper/frame/frame
var/obj/screen/mapper/powbutton/powbutton
var/obj/screen/mapper/mapbutton/mapbutton
@@ -724,7 +735,7 @@ INITIALIZE_IMMEDIATE(/obj/screen/splash)
. = ..()
owner = newowner
-
+
mask_full = new(src) // Full white square mask
mask_ping = new(src) // Animated 'pinging' mask
bg = new(src) // Background color, holds map in vis_contents, uses mult against masks
@@ -732,19 +743,19 @@ INITIALIZE_IMMEDIATE(/obj/screen/splash)
frame = new(src) // Decorative frame
powbutton = new(src) // Clickable button
mapbutton = new(src) // Clickable button
-
+
frame.icon_state = initial(frame.icon_state)+owner.hud_frame_hint
/**
* The vis_contents layout is: this(frame,extras_holder,mask(bg(map)))
* bg is set to BLEND_MULTIPLY against the mask to crop it.
*/
-
+
mask_full.vis_contents.Add(bg)
mask_ping.vis_contents.Add(bg)
frame.vis_contents.Add(powbutton,mapbutton)
vis_contents.Add(frame)
-
+
/obj/screen/movable/mapper_holder/Destroy()
qdel_null(mask_full)
@@ -764,12 +775,12 @@ INITIALIZE_IMMEDIATE(/obj/screen/splash)
running = TRUE
if(ping)
vis_contents.Add(mask_ping)
- else
+ else
vis_contents.Add(mask_full)
bg.vis_contents.Cut()
bg.vis_contents.Add(map)
-
+
if(extras && !extras_holder)
extras_holder = extras
vis_contents += extras_holder
@@ -782,7 +793,7 @@ INITIALIZE_IMMEDIATE(/obj/screen/splash)
off()
else
on()
-
+
/obj/screen/movable/mapper_holder/proc/mapClick()
if(owner)
if(running)
@@ -913,10 +924,10 @@ INITIALIZE_IMMEDIATE(/obj/screen/splash)
var/static/list/ammo_screen_loc_list = list(ui_ammo_hud1, ui_ammo_hud2, ui_ammo_hud3 ,ui_ammo_hud4)
/obj/screen/ammo/proc/add_hud(var/mob/living/user, var/obj/item/weapon/gun/G)
-
+
if(!user?.client)
return
-
+
if(!G)
CRASH("/obj/screen/ammo/proc/add_hud() has been called from [src] without the required param of G")
diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm
index 3839853567b..acfa32d52f7 100644
--- a/code/controllers/communications.dm
+++ b/code/controllers/communications.dm
@@ -126,6 +126,7 @@ var/const/MED_I_FREQ = 1485
var/const/SEC_I_FREQ = 1475
var/const/TALON_FREQ = 1363 //VOREStation Add
+var/const/CSN_FREQ = 1365 //VOREStation Add
var/list/radiochannels = list(
"Common" = PUB_FREQ,
@@ -145,7 +146,8 @@ var/list/radiochannels = list(
"Entertainment" = ENT_FREQ,
"Medical(I)" = MED_I_FREQ,
"Security(I)" = SEC_I_FREQ,
- "Talon" = TALON_FREQ //VOREStation Add
+ "Talon" = TALON_FREQ, //VOREStation Add
+ "Casino" = CSN_FREQ,
)
// Hey, if anyone ever needs to update tgui/packages/tgui/constants.js with new radio channels
@@ -155,7 +157,7 @@ var/list/radiochannels = list(
set category = "Generate TGUI Radio Constants"
var/list/channel_info = list()
-
+
for(var/i in RADIO_LOW_FREQ to RADIO_HIGH_FREQ)
for(var/key in radiochannels)
if(i == radiochannels[key])
@@ -192,7 +194,7 @@ var/list/ANTAG_FREQS = list(SYND_FREQ, RAID_FREQ)
//Department channels, arranged lexically
var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, ENT_FREQ, MED_FREQ, SEC_FREQ, SCI_FREQ, SRV_FREQ, SUP_FREQ)
-var/list/OFFMAP_FREQS = list(TALON_FREQ) //VOREStation Add
+var/list/OFFMAP_FREQS = list(TALON_FREQ, CSN_FREQ) //VOREStation Add
/proc/frequency_span_class(var/frequency)
// Antags!
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 2da3f710251..2ebe6ea8c15 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -78,6 +78,7 @@ var/list/gamemode_cache = list()
var/static/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0
var/static/show_mods = 0
var/static/show_devs = 0
+ var/static/show_mentors = 0
var/static/show_event_managers = 0
var/static/mods_can_tempban = 0
var/static/mods_can_job_tempban = 0
@@ -216,7 +217,7 @@ var/list/gamemode_cache = list()
var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix
var/use_lib_nudge = 0 //Use the C library nudge instead of the python nudge.
var/use_overmap = 0
-
+
var/static/list/engine_map = list("Supermatter Engine", "Edison's Bane") // Comma separated list of engines to choose from. Blank means fully random.
// Event settings
@@ -289,7 +290,7 @@ var/list/gamemode_cache = list()
// How strictly the loadout enforces object species whitelists
var/loadout_whitelist = LOADOUT_WHITELIST_LAX
-
+
var/static/vgs_access_identifier = null // VOREStation Edit - VGS
var/static/vgs_server_port = null // VOREStation Edit - VGS
@@ -652,6 +653,9 @@ var/list/gamemode_cache = list()
if("show_devs")
config.show_devs = 1
+ if("show_mentors")
+ config.show_mentors = 1
+
if("show_event_managers")
config.show_event_managers = 1
@@ -955,10 +959,10 @@ var/list/gamemode_cache = list()
if("suggested_byond_version")
config.suggested_byond_version = text2num(value)
-
+
if("suggested_byond_build")
config.suggested_byond_build = text2num(value)
-
+
// VOREStation Edit Start - Can't be in _vr file because it is loaded too late.
if("vgs_access_identifier")
config.vgs_access_identifier = value
diff --git a/code/controllers/subsystems/game_master.dm b/code/controllers/subsystems/game_master.dm
index 06a60602273..5315a3dbe8a 100644
--- a/code/controllers/subsystems/game_master.dm
+++ b/code/controllers/subsystems/game_master.dm
@@ -350,13 +350,13 @@ SUBSYSTEM_DEF(game_master)
choose_game_master(usr)
if(href_list["set_staleness"])
- var/amount = input(usr, "How much staleness should there be?", "Game Master") as null|num
+ var/amount = tgui_input_number(usr, "How much staleness should there be?", "Game Master")
if(!isnull(amount))
staleness = amount
message_admins("GM staleness was set to [amount] by [usr.key].")
if(href_list["set_danger"])
- var/amount = input(usr, "How much danger should there be?", "Game Master") as null|num
+ var/amount = tgui_input_number(usr, "How much danger should there be?", "Game Master")
if(!isnull(amount))
danger = amount
message_admins("GM danger was set to [amount] by [usr.key].")
diff --git a/code/controllers/subsystems/job.dm b/code/controllers/subsystems/job.dm
index f265f39955a..2aa6d84cb69 100644
--- a/code/controllers/subsystems/job.dm
+++ b/code/controllers/subsystems/job.dm
@@ -131,12 +131,13 @@ SUBSYSTEM_DEF(job)
return department_datums[primary_department]
+/datum/controller/subsystem/job/proc/get_ping_role(var/role)
+ var/datum/job/J = get_job(role)
+ if(J.requestable)
+ return get_primary_department_of_job(J)
+
// Someday it might be good to port code/game/jobs/job_controller.dm to here and clean it up.
-
-
-
-
/datum/controller/subsystem/job/proc/job_debug_message(message)
if(debug_messages)
log_debug("JOB DEBUG: [message]")
\ No newline at end of file
diff --git a/code/controllers/subsystems/media_tracks.dm b/code/controllers/subsystems/media_tracks.dm
index 53805bcbec2..58fd0ec858f 100644
--- a/code/controllers/subsystems/media_tracks.dm
+++ b/code/controllers/subsystems/media_tracks.dm
@@ -74,7 +74,7 @@ SUBSYSTEM_DEF(media_tracks)
return
// Required
- var/url = input(C, "REQUIRED: Provide URL for track, or paste JSON if you know what you're doing. See code comments.", "Track URL") as message|null
+ var/url = tgui_input_text(C, "REQUIRED: Provide URL for track, or paste JSON if you know what you're doing. See code comments.", "Track URL", multiline = TRUE)
if(!url)
return
@@ -112,20 +112,20 @@ SUBSYSTEM_DEF(media_tracks)
sort_tracks()
return
- var/title = input(C, "REQUIRED: Provide title for track", "Track Title") as text|null
+ var/title = tgui_input_text(C, "REQUIRED: Provide title for track", "Track Title")
if(!title)
return
- var/duration = input(C, "REQUIRED: Provide duration for track (in deciseconds, aka seconds*10)", "Track Duration") as num|null
+ var/duration = tgui_input_number(C, "REQUIRED: Provide duration for track (in deciseconds, aka seconds*10)", "Track Duration")
if(!duration)
return
// Optional
- var/artist = input(C, "Optional: Provide artist for track", "Track Artist") as text|null
+ var/artist = tgui_input_text(C, "Optional: Provide artist for track", "Track Artist")
if(isnull(artist)) // Cancel rather than empty string
return
- var/genre = input(C, "Optional: Provide genre for track (try to match an existing one)", "Track Genre") as text|null
+ var/genre = tgui_input_text(C, "Optional: Provide genre for track (try to match an existing one)", "Track Genre")
if(isnull(genre)) // Cancel rather than empty string
return
@@ -160,7 +160,7 @@ SUBSYSTEM_DEF(media_tracks)
if(!check_rights(R_DEBUG|R_FUN))
return
- var/track = input(C, "Input track title or URL to remove (must be exact)", "Remove Track") as text|null
+ var/track = tgui_input_text(C, "Input track title or URL to remove (must be exact)", "Remove Track")
if(!track)
return
diff --git a/code/controllers/subsystems/persist_vr.dm b/code/controllers/subsystems/persist_vr.dm
index c40a0b0e35d..5217b72f9ae 100644
--- a/code/controllers/subsystems/persist_vr.dm
+++ b/code/controllers/subsystems/persist_vr.dm
@@ -59,6 +59,8 @@ SUBSYSTEM_DEF(persist)
var/client/C = M.client
var/wait_in_hours = wait / (1 HOUR)
var/pto_factored = wait_in_hours * J.timeoff_factor
+ if(J.playtime_only)
+ pto_factored = 0
LAZYINITLIST(C.department_hours)
LAZYINITLIST(C.play_hours)
var/dept_hours = C.department_hours
diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm
index af096c33a81..c30d559e4ba 100644
--- a/code/controllers/subsystems/supply.dm
+++ b/code/controllers/subsystems/supply.dm
@@ -363,15 +363,15 @@ SUBSYSTEM_DEF(supply)
// Will add an item entry to the specified export receipt on the user-side list
/datum/controller/subsystem/supply/proc/add_export_item(var/datum/exported_crate/E, var/mob/user)
- var/new_name = input(user, "Name", "Please enter the name of the item.") as null|text
+ var/new_name = tgui_input_text(user, "Name", "Please enter the name of the item.")
if(!new_name)
return
- var/new_quantity = input(user, "Name", "Please enter the quantity of the item.") as null|num
+ var/new_quantity = tgui_input_number(user, "Name", "Please enter the quantity of the item.")
if(!new_quantity)
return
- var/new_value = input(user, "Name", "Please enter the value of the item.") as null|num
+ var/new_value = tgui_input_number(user, "Name", "Please enter the value of the item.")
if(!new_value)
return
diff --git a/code/controllers/subsystems/tgui.dm b/code/controllers/subsystems/tgui.dm
index a0d96cf80c1..d70d06017af 100644
--- a/code/controllers/subsystems/tgui.dm
+++ b/code/controllers/subsystems/tgui.dm
@@ -23,6 +23,10 @@ SUBSYSTEM_DEF(tgui)
/datum/controller/subsystem/tgui/PreInit()
basehtml = file2text('tgui/public/tgui.html')
+ // Inject inline polyfills
+ var/polyfill = file2text('tgui/public/tgui-polyfill.min.js')
+ polyfill = ""
+ basehtml = replacetextEx(basehtml, "", polyfill)
/datum/controller/subsystem/tgui/Shutdown()
close_all_uis()
diff --git a/code/controllers/subsystems/throwing.dm b/code/controllers/subsystems/throwing.dm
index 6c3a799b28f..101c71a1479 100644
--- a/code/controllers/subsystems/throwing.dm
+++ b/code/controllers/subsystems/throwing.dm
@@ -145,6 +145,9 @@ SUBSYSTEM_DEF(throwing)
AM.Move(step, get_dir(AM, step))
+ if (!AM) // Us moving somehow destroyed us?
+ return
+
if (!AM.throwing) // we hit something during our move
finalize(hit = TRUE)
return
diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm
index f2776508e24..ad20bbb8898 100644
--- a/code/controllers/subsystems/ticker.dm
+++ b/code/controllers/subsystems/ticker.dm
@@ -50,9 +50,9 @@ var/global/datum/controller/subsystem/ticker/ticker
pregame_timeleft = config.pregame_time
send2mainirc("Server lobby is loaded and open at byond://[config.serverurl ? config.serverurl : (config.server ? config.server : "[world.address]:[world.port]")]")
SSwebhooks.send(
- WEBHOOK_ROUNDPREP,
+ WEBHOOK_ROUNDPREP,
list(
- "map" = station_name(),
+ "map" = station_name(),
"url" = get_world_url()
)
)
@@ -397,14 +397,19 @@ var/global/datum/controller/subsystem/ticker/ticker
if(player && player.ready && player.mind?.assigned_role)
var/datum/job/J = SSjob.get_job(player.mind.assigned_role)
+ // Ask their new_player mob to spawn them
+ if(!player.spawn_checks_vr(player.mind.assigned_role))
+ var/datum/job/job_datum = job_master.GetJob(J.title)
+ job_datum.current_positions--
+ player.mind.assigned_role = null
+ continue //VOREStation Add
+
// Snowflakey AI treatment
if(J?.mob_type & JOB_SILICON_AI)
player.close_spawn_windows()
player.AIize(move = TRUE)
continue
- // Ask their new_player mob to spawn them
- if(!player.spawn_checks_vr(player.mind.assigned_role)) continue //VOREStation Add
var/mob/living/carbon/human/new_char = player.create_character()
// Created their playable character, delete their /mob/new_player
diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm
index 658cff17164..352550a9a56 100644
--- a/code/controllers/subsystems/vote.dm
+++ b/code/controllers/subsystems/vote.dm
@@ -231,11 +231,11 @@ SUBSYSTEM_DEF(vote)
choices.Add(antag.role_text)
choices.Add("None")
if(VOTE_CUSTOM)
- question = sanitizeSafe(input(usr, "What is the vote for?") as text|null)
+ question = sanitizeSafe(tgui_input_text(usr, "What is the vote for?"))
if(!question)
return 0
for(var/i = 1 to 10)
- var/option = capitalize(sanitize(input(usr, "Please enter an option or hit cancel to finish") as text|null))
+ var/option = capitalize(sanitize(tgui_input_text(usr, "Please enter an option or hit cancel to finish")))
if(!option || mode || !usr.client)
break
choices.Add(option)
@@ -362,7 +362,12 @@ SUBSYSTEM_DEF(vote)
if(VOTE_RESTART)
if(config.allow_vote_restart || usr.client.holder)
- initiate_vote(VOTE_RESTART, usr.key)
+ var/admin_number_present = send2irc_adminless_only(usr.ckey, usr)
+ if(admin_number_present <= 0 || usr.client.holder)
+ if(tgui_alert(usr, "Are you sure you want to start a RESTART VOTE? You should only do this if the server is dying and no staff are around to investigate.", "RESTART VOTE", list("No", "Yes I want to start a RESTART VOTE")) == "Yes I want to start a RESTART VOTE")
+ initiate_vote(VOTE_RESTART, usr.key)
+ else
+ to_chat(usr, "You can't start a RESTART VOTE while there are staff around. If you are having an issue with the round, please ahelp it.")
if(VOTE_GAMEMODE)
if(config.allow_vote_mode || usr.client.holder)
initiate_vote(VOTE_GAMEMODE, usr.key)
diff --git a/code/datums/autolathe/devices_vr.dm b/code/datums/autolathe/devices_vr.dm
index 9d92132caa4..65af7b630cc 100644
--- a/code/datums/autolathe/devices_vr.dm
+++ b/code/datums/autolathe/devices_vr.dm
@@ -1,3 +1,3 @@
/datum/category_item/autolathe/devices/sleevecard
name = "sleevecard"
- path =/obj/item/device/sleevecard
+ path =/obj/item/device/paicard/sleevecard
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 75c3c64c7f2..fef1bcd25de 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -68,7 +68,7 @@
names += componentsubtypes
names += "---Elements---"
names += sortTim(subtypesof(/datum/element), /proc/cmp_typepaths_asc)
- var/result = input(usr, "Choose a component/element to add:", "Add Component/Element", names)
+ var/result = tgui_input_list(usr, "Choose a component/element to add:", "Add Component/Element", names)
if(!usr || !result || result == "---Components---" || result == "---Elements---")
return
if(QDELETED(src))
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index abc7ade225f..194341a106c 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -1,3 +1,10 @@
+var/bluespace_item_types = newlist(/obj/item/weapon/storage/backpack/holding,
+/obj/item/weapon/storage/bag/trash/holding,
+/obj/item/weapon/storage/pouch/holding,
+/obj/item/weapon/storage/belt/utility/holding,
+/obj/item/weapon/storage/belt/medical/holding
+)
+
//wrapper
/proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, local=TRUE) //VOREStation Edit
new /datum/teleport/instant/science(arglist(args))
@@ -151,19 +158,25 @@
/datum/teleport/instant/science/setPrecision(aprecision)
..()
- if(istype(teleatom, /obj/item/weapon/storage/backpack/holding))
- precision = rand(1,100)
- var/list/bagholding = teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)
+ var/list/bluespace_things = newlist()
+
+ for (var/item in bluespace_item_types)
+ if (istype(teleatom, item))
+ precision = rand(1, 100)
+ bluespace_things |= teleatom.search_contents_for(item)
+
//VOREStation Addition Start: Prevent taurriding abuse
if(istype(teleatom, /mob/living))
var/mob/living/L = teleatom
if(LAZYLEN(L.buckled_mobs))
for(var/mob/rider in L.buckled_mobs)
- bagholding += rider.search_contents_for(/obj/item/weapon/storage/backpack/holding)
+ for (var/item in bluespace_item_types)
+ bluespace_things |= rider.search_contents_for(item)
//VOREStation Addition End: Prevent taurriding abuse
- if(bagholding.len)
- precision = max(rand(1,100)*bagholding.len,100)
+
+ if(bluespace_things.len)
+ precision = max(rand(1,100)*bluespace_things.len,100)
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
to_chat(MM, "The Bluespace interface on your [teleatom] interferes with the teleport!")
diff --git a/code/datums/managed_browsers/feedback_form.dm b/code/datums/managed_browsers/feedback_form.dm
index b380018bea6..c6160ffc598 100644
--- a/code/datums/managed_browsers/feedback_form.dm
+++ b/code/datums/managed_browsers/feedback_form.dm
@@ -99,7 +99,7 @@ GENERAL_PROTECT_DATUM(/datum/managed_browser/feedback_form)
if(href_list["feedback_edit_body"])
// This is deliberately not sanitized here, and is instead checked when hitting the submission button,
// as we want to give the user a chance to fix it without needing to rewrite the whole thing.
- feedback_body = input(my_client, "Please write your feedback here.", "Feedback Body", feedback_body) as null|message
+ feedback_body = tgui_input_text(my_client, "Please write your feedback here.", "Feedback Body", feedback_body, multiline = TRUE, prevent_enter = TRUE)
display() // Refresh the window with new information.
return
diff --git a/code/datums/managed_browsers/feedback_viewer.dm b/code/datums/managed_browsers/feedback_viewer.dm
index 895bd36fae4..02360363384 100644
--- a/code/datums/managed_browsers/feedback_viewer.dm
+++ b/code/datums/managed_browsers/feedback_viewer.dm
@@ -132,29 +132,29 @@
return
if(href_list["filter_id"])
- var/id_to_search = input(my_client, "Write feedback ID here.", "Filter by ID", null) as null|num
+ var/id_to_search = tgui_input_number(my_client, "Write feedback ID here.", "Filter by ID", null)
if(id_to_search)
last_query = feedback_filter(SQLITE_FEEDBACK_COLUMN_ID, id_to_search, TRUE)
if(href_list["filter_author"])
- var/author_to_search = input(my_client, "Write desired key or hash here. Partial keys/hashes are allowed.", "Filter by Author", null) as null|text
+ var/author_to_search = tgui_input_text(my_client, "Write desired key or hash here. Partial keys/hashes are allowed.", "Filter by Author", null)
if(author_to_search)
last_query = feedback_filter(SQLITE_FEEDBACK_COLUMN_AUTHOR, author_to_search)
if(href_list["filter_topic"])
- var/topic_to_search = input(my_client, "Write desired topic here. Partial topics are allowed. \
- \nThe current topics in the config are [english_list(config.sqlite_feedback_topics)].", "Filter by Topic", null) as null|text
+ var/topic_to_search = tgui_input_text(my_client, "Write desired topic here. Partial topics are allowed. \
+ \nThe current topics in the config are [english_list(config.sqlite_feedback_topics)].", "Filter by Topic", null)
if(topic_to_search)
last_query = feedback_filter(SQLITE_FEEDBACK_COLUMN_TOPIC, topic_to_search)
if(href_list["filter_content"])
- var/content_to_search = input(my_client, "Write desired content to find here. Partial matches are allowed.", "Filter by Content", null) as null|message
+ var/content_to_search = tgui_input_text(my_client, "Write desired content to find here. Partial matches are allowed.", "Filter by Content", null, multiline = TRUE)
if(content_to_search)
last_query = feedback_filter(SQLITE_FEEDBACK_COLUMN_CONTENT, content_to_search)
if(href_list["filter_datetime"])
- var/datetime_to_search = input(my_client, "Write desired datetime. Partial matches are allowed.\n\
- Format is 'YYYY-MM-DD HH:MM:SS'.", "Filter by Datetime", null) as null|text
+ var/datetime_to_search = tgui_input_text(my_client, "Write desired datetime. Partial matches are allowed.\n\
+ Format is 'YYYY-MM-DD HH:MM:SS'.", "Filter by Datetime", null)
if(datetime_to_search)
last_query = feedback_filter(SQLITE_FEEDBACK_COLUMN_DATETIME, datetime_to_search)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index a35c23cd6b4..e4ec5954e26 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -75,6 +75,8 @@
//used to store what traits the player had picked out in their preferences before joining, in text form.
var/list/traits = list()
+ var/datum/religion/my_religion
+
/datum/mind/New(var/key)
src.key = key
purchase_log = list()
@@ -188,7 +190,7 @@
assigned_role = new_role
else if (href_list["memory_edit"])
- var/new_memo = sanitize(input("Write new memory", "Memory", memory) as null|message)
+ var/new_memo = sanitize(tgui_input_text(usr, "Write new memory", "Memory", memory, multiline = TRUE, prevent_enter = TRUE))
if (isnull(new_memo)) return
memory = new_memo
@@ -196,7 +198,7 @@
var/datum/mind/mind = locate(href_list["amb_edit"])
if(!mind)
return
- var/new_ambition = input("Enter a new ambition", "Memory", mind.ambitions) as null|message
+ var/new_ambition = tgui_input_text(usr, "Enter a new ambition", "Memory", mind.ambitions, multiline = TRUE, prevent_enter = TRUE)
if(isnull(new_ambition))
return
if(mind)
@@ -294,7 +296,7 @@
if(objective&&objective.type==text2path("/datum/objective/[new_obj_type]"))
def_num = objective.target_amount
- var/target_number = input("Input target number:", "Objective", def_num) as num|null
+ var/target_number = tgui_input_number(usr, "Input target number:", "Objective", def_num)
if (isnull(target_number))//Ordinarily, you wouldn't need isnull. In this case, the value may already exist.
return
@@ -312,7 +314,7 @@
new_objective.target_amount = target_number
if ("custom")
- var/expl = sanitize(input("Custom objective:", "Objective", objective ? objective.explanation_text : "") as text|null)
+ var/expl = sanitize(tgui_input_text(usr, "Custom objective:", "Objective", objective ? objective.explanation_text : ""))
if (!expl) return
new_objective = new /datum/objective
new_objective.owner = src
@@ -408,7 +410,7 @@
// var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink() No longer needed, uses stored in mind
var/crystals
crystals = tcrystals
- crystals = input("Amount of telecrystals for [key]", crystals) as null|num
+ crystals = tgui_input_number(usr, "Amount of telecrystals for [key]", crystals)
if (!isnull(crystals))
tcrystals = crystals
@@ -571,4 +573,4 @@
/mob/living/simple_mob/construct/juggernaut/mind_initialize()
. = ..()
mind.assigned_role = "Juggernaut"
- mind.special_role = "Cultist"
+ mind.special_role = "Cultist"
\ No newline at end of file
diff --git a/code/datums/outfits/jobs/civilian.dm b/code/datums/outfits/jobs/civilian.dm
index 1d299a81dbd..554666cbca8 100644
--- a/code/datums/outfits/jobs/civilian.dm
+++ b/code/datums/outfits/jobs/civilian.dm
@@ -31,8 +31,9 @@
/decl/hierarchy/outfit/job/service/bartender/post_equip(mob/living/carbon/human/H)
..()
- for(var/obj/item/clothing/accessory/permit/gun/bar/permit in H.back.contents)
- permit.set_name(H.real_name)
+ if(H.back)
+ for(var/obj/item/clothing/accessory/permit/gun/bar/permit in H.back.contents)
+ permit.set_name(H.real_name)
/decl/hierarchy/outfit/job/service/bartender/barista
name = OUTFIT_JOB_NAME("Barista")
diff --git a/code/datums/supplypacks/atmospherics.dm b/code/datums/supplypacks/atmospherics.dm
index a18b6308923..e6fb05f2207 100644
--- a/code/datums/supplypacks/atmospherics.dm
+++ b/code/datums/supplypacks/atmospherics.dm
@@ -106,7 +106,7 @@
cost = 35
containertype = /obj/structure/closet/crate/aether
containername = "Emergency crate"
-
+/*
/datum/supply_pack/atmos/firefighting
name = "Firefighting equipment"
contains = list(
@@ -118,4 +118,4 @@
)
cost = 35
containertype = /obj/structure/closet/crate/aether
- containername = "Firefighting crate"
\ No newline at end of file
+ containername = "Firefighting crate"*/
\ No newline at end of file
diff --git a/code/datums/supplypacks/materials.dm b/code/datums/supplypacks/materials.dm
index 5e181d8af8a..3268d05a46c 100644
--- a/code/datums/supplypacks/materials.dm
+++ b/code/datums/supplypacks/materials.dm
@@ -66,17 +66,19 @@
/obj/fiftyspawner/tealcarpet
)
-/datum/supply_pack/materials/arcade_carpet
- name = "Retro carpets"
+/datum/supply_pack/materials/retrocarpet
+ name = "Retro carpet"
containertype = /obj/structure/closet/crate/grayson
- containername = "Retro carpets crate"
+ containername = "Retro carpet crate"
cost = 15
contains = list(
- /obj/fiftyspawner/decocarpet,
- /obj/fiftyspawner/retrocarpet
+ /obj/fiftyspawner/geocarpet,
+ /obj/fiftyspawner/retrocarpet,
+ /obj/fiftyspawner/retrocarpet_red,
+ /obj/fiftyspawner/happycarpet
)
-/datum/supply_pack/misc/linoleum
+/datum/supply_pack/materials/linoleum
name = "Linoleum"
containertype = /obj/structure/closet/crate/grayson
containername = "Linoleum crate"
diff --git a/code/datums/supplypacks/misc_vr.dm b/code/datums/supplypacks/misc_vr.dm
index 63f055d2d45..539e88f75b2 100644
--- a/code/datums/supplypacks/misc_vr.dm
+++ b/code/datums/supplypacks/misc_vr.dm
@@ -102,6 +102,16 @@
containername = "Commonwealth engineering hardsuit crate"
access = access_engine
+/datum/supply_pack/misc/breacher_rig
+ name = "unathi breacher hardsuit (empty)"
+ contains = list(
+ /obj/item/weapon/rig/breacher = 1
+ )
+ cost = 250
+ containertype = /obj/structure/closet/crate/secure/gear
+ containername = "unathi breacher hardsuit crate"
+ access = access_armory
+
/datum/supply_pack/misc/zero_rig
name = "null hardsuit (jets)"
contains = list(
diff --git a/code/datums/supplypacks/recreation.dm b/code/datums/supplypacks/recreation.dm
index ba6a33d48cb..40caa4c405b 100644
--- a/code/datums/supplypacks/recreation.dm
+++ b/code/datums/supplypacks/recreation.dm
@@ -35,6 +35,15 @@
containertype = /obj/structure/closet/crate/allico
containername = "foam weapon crate"
+/datum/supply_pack/recreation/donksoftborg
+ name = "Donk-Soft Cyborg Blaster Crate"
+ contains = list(
+ /obj/item/borg/upgrade/toygun = 2,
+ )
+ cost = 35
+ containertype = /obj/structure/closet/crate/allico
+ containername = "foam weapon crate"
+
/datum/supply_pack/recreation/donksoftvend
name = "Donk-Soft Vendor Crate"
contains = list()
diff --git a/code/datums/supplypacks/security.dm b/code/datums/supplypacks/security.dm
index 18cc82af767..5c4ddf1a6a2 100644
--- a/code/datums/supplypacks/security.dm
+++ b/code/datums/supplypacks/security.dm
@@ -287,7 +287,7 @@
containertype = /obj/structure/closet/crate/secure/lawson
containername = "Riot armor crate"
access = access_armory
-
+/*
/datum/supply_pack/security/riot_sprayer
name = "Gear - Riot sprayer"
contains = list(
@@ -296,7 +296,7 @@
cost = 40
containertype = /obj/structure/closet/crate/secure/lawson
containername = "Riot sprayer crate"
- access = access_armory
+ access = access_armory*/
/datum/supply_pack/security/ablative_armor
name = "Armor - Ablative"
diff --git a/code/datums/supplypacks/supply.dm b/code/datums/supplypacks/supply.dm
index eff6fb84fd0..70f8386a914 100644
--- a/code/datums/supplypacks/supply.dm
+++ b/code/datums/supplypacks/supply.dm
@@ -9,18 +9,30 @@
/datum/supply_pack/supply/food
name = "Kitchen supply crate"
contains = list(
- /obj/item/weapon/reagent_containers/food/condiment/flour = 6,
+ /obj/item/weapon/reagent_containers/food/condiment/carton/flour = 6,
/obj/item/weapon/reagent_containers/food/drinks/milk = 3,
/obj/item/weapon/reagent_containers/food/drinks/soymilk = 2,
/obj/item/weapon/storage/fancy/egg_box = 2,
/obj/item/weapon/reagent_containers/food/snacks/tofu = 4,
/obj/item/weapon/reagent_containers/food/snacks/meat = 4,
- /obj/item/weapon/reagent_containers/food/condiment/yeast = 3
+ /obj/item/weapon/reagent_containers/food/condiment/yeast = 3,
+ /obj/item/weapon/reagent_containers/food/condiment/sprinkles = 1
)
cost = 10
containertype = /obj/structure/closet/crate/freezer/centauri
containername = "Food crate"
+/datum/supply_pack/supply/fancyfood
+ name = "Artisanal food delivery"
+ contains = list(
+ /obj/item/weapon/reagent_containers/food/condiment/carton/flour/rustic = 6,
+ /obj/item/weapon/reagent_containers/food/condiment/carton/sugar/rustic = 6
+ )
+ cost = 25
+ containertype = /obj/structure/closet/crate/freezer/centauri
+ containername = "Artisanal food crate"
+
+
/datum/supply_pack/supply/toner
name = "Toner cartridges"
contains = list(/obj/item/device/toner = 6)
diff --git a/code/datums/uplink/announcements.dm b/code/datums/uplink/announcements.dm
index f1db67a6474..f6742fb815c 100644
--- a/code/datums/uplink/announcements.dm
+++ b/code/datums/uplink/announcements.dm
@@ -16,10 +16,10 @@
item_cost = 20
/datum/uplink_item/abstract/announcements/fake_centcom/extra_args(var/mob/user)
- var/title = sanitize(input(usr, "Enter your announcement title.", "Announcement Title") as null|text)
+ var/title = sanitize(tgui_input_text(usr, "Enter your announcement title.", "Announcement Title"))
if(!title)
return
- var/message = sanitize(input(usr, "Enter your announcement message.", "Announcement Title") as null|text)
+ var/message = sanitize(tgui_input_text(usr, "Enter your announcement message.", "Announcement Title"))
if(!message)
return
return list("title" = title, "message" = message)
diff --git a/code/datums/uplink/badassery.dm b/code/datums/uplink/badassery.dm
index 8addcc3f64e..8208894af4f 100644
--- a/code/datums/uplink/badassery.dm
+++ b/code/datums/uplink/badassery.dm
@@ -91,4 +91,4 @@
var/obj/structure/largecrate/C = /obj/structure/largecrate
icon = image(initial(C.icon), initial(C.icon_state))
- return "[bicon(icon)]"
\ No newline at end of file
+ return "\icon[icon][bicon(icon)]"
\ No newline at end of file
diff --git a/code/datums/uplink/tools.dm b/code/datums/uplink/tools.dm
index eee41e96993..9c1a46d632f 100644
--- a/code/datums/uplink/tools.dm
+++ b/code/datums/uplink/tools.dm
@@ -6,22 +6,22 @@
/datum/uplink_item/item/tools/binoculars
name = "Binoculars"
- item_cost = 5
+ item_cost = 3
path = /obj/item/device/binoculars
/datum/uplink_item/item/tools/toolbox // Leaving the basic as an option since powertools are loud.
name = "Fully Loaded Toolbox"
- item_cost = 5
+ item_cost = 3
path = /obj/item/weapon/storage/toolbox/syndicate
/datum/uplink_item/item/tools/powertoolbox
name = "Fully Loaded Powertool Box"
- item_cost = 10
+ item_cost = 5
path = /obj/item/weapon/storage/toolbox/syndicate/powertools
/datum/uplink_item/item/tools/clerical
name = "Morphic Clerical Kit"
- item_cost = 10
+ item_cost = 5
path = /obj/item/weapon/storage/box/syndie_kit/clerical
/datum/uplink_item/item/tools/encryptionkey_radio
@@ -42,7 +42,7 @@
/datum/uplink_item/item/tools/duffle
name = "Black Duffle Bag"
- item_cost = 10
+ item_cost = 5
path = /obj/item/weapon/storage/backpack/dufflebag/syndie
/datum/uplink_item/item/tools/duffle/med
@@ -61,7 +61,7 @@
/datum/uplink_item/item/tools/space_suit
name = "Space Suit"
- item_cost = 15
+ item_cost = 10
path = /obj/item/weapon/storage/box/syndie_kit/space
/datum/uplink_item/item/tools/encryptionkey_binary
@@ -71,7 +71,7 @@
/datum/uplink_item/item/tools/hacking_tool
name = "Door Hacking Tool"
- item_cost = 20
+ item_cost = 15
path = /obj/item/device/multitool/hacktool
desc = "Appears and functions as a standard multitool until the mode is toggled by applying a screwdriver appropriately. \
When in hacking mode this device will grant full access to any standard airlock within 20 to 40 seconds. \
@@ -79,7 +79,7 @@
/datum/uplink_item/item/tools/ai_detector
name = "Anti-Surveillance Tool"
- item_cost = 20
+ item_cost = 15
path = /obj/item/device/multitool/ai_detector
desc = "This functions like a normal multitool, but includes an integrated camera network sensor that will warn the holder if they are being \
watched, by changing color and beeping. It is able to detect both AI visual surveillance and security camera utilization from terminals, and \
@@ -87,20 +87,20 @@
/datum/uplink_item/item/tools/radio_jammer
name = "Subspace Jammer"
- item_cost = 25
+ item_cost = 20
path = /obj/item/device/radio_jammer
desc = "A device which is capable of disrupting subspace communications, preventing the use of headsets, PDAs, and communicators within \
a radius of seven meters. It runs off weapon cells, which can be replaced as needed. One cell will last for approximately ten minutes."
/datum/uplink_item/item/tools/wall_elecrtifier
name = "Wall Electrifier"
- item_cost = 10
+ item_cost = 5
path = /obj/item/weapon/cell/spike
desc = "A modified powercell which will electrify walls and reinforced floors in a 3x3 tile range around it. Always active."
/datum/uplink_item/item/tools/emag
name = "Cryptographic Sequencer"
- item_cost = 30
+ item_cost = 20
path = /obj/item/weapon/card/emag
/datum/uplink_item/item/tools/graviton
@@ -111,7 +111,7 @@
/datum/uplink_item/item/tools/thermal
name = "Thermal Imaging Glasses"
- item_cost = 30
+ item_cost = 25
path = /obj/item/clothing/glasses/thermal/syndi
/datum/uplink_item/item/tools/packagebomb
diff --git a/code/datums/uplink/uplink_items.dm b/code/datums/uplink/uplink_items.dm
index 7156f807bdb..7fcdbd8dc2a 100644
--- a/code/datums/uplink/uplink_items.dm
+++ b/code/datums/uplink/uplink_items.dm
@@ -130,7 +130,7 @@ var/datum/uplink/uplink = new()
/datum/uplink_item/item/log_icon()
var/obj/I = path
- return "[bicon(I)]"
+ return "\icon[I][bicon(I)]"
/********************************
* *
@@ -144,7 +144,7 @@ var/datum/uplink/uplink = new()
if(!default_abstract_uplink_icon)
default_abstract_uplink_icon = image('icons/obj/pda.dmi', "pda-syn")
- return "[bicon(default_abstract_uplink_icon)]"
+ return "\icon[default_abstract_uplink_icon][bicon(default_abstract_uplink_icon)]"
/*
* Crated goods.
diff --git a/code/datums/wires/camera.dm b/code/datums/wires/camera.dm
index 571e2a22e6c..c572ad8d27c 100644
--- a/code/datums/wires/camera.dm
+++ b/code/datums/wires/camera.dm
@@ -57,7 +57,7 @@
C.light_disabled = !C.light_disabled
if(WIRE_CAM_ALARM)
- C.visible_message("[bicon(C)] *beep*", "[bicon(C)] *beep*")
+ C.visible_message("\icon[C][bicon(C)] *beep*", "\icon[C][bicon(C)] *beep*")
..()
/datum/wires/camera/proc/CanDeconstruct()
diff --git a/code/datums/wires/jukebox.dm b/code/datums/wires/jukebox.dm
index 125bbd78ef8..cec0f4d370b 100644
--- a/code/datums/wires/jukebox.dm
+++ b/code/datums/wires/jukebox.dm
@@ -31,16 +31,16 @@
var/obj/machinery/media/jukebox/A = holder
switch(wire)
if(WIRE_MAIN_POWER1)
- holder.visible_message("[bicon(holder)] The power light flickers.")
+ holder.visible_message("\icon[holder][bicon(holder)] The power light flickers.")
A.shock(usr, 90)
if(WIRE_JUKEBOX_HACK)
- holder.visible_message("[bicon(holder)] The parental guidance light flickers.")
+ holder.visible_message("\icon[holder][bicon(holder)] The parental guidance light flickers.")
if(WIRE_REVERSE)
- holder.visible_message("[bicon(holder)] The data light blinks ominously.")
+ holder.visible_message("\icon[holder][bicon(holder)] The data light blinks ominously.")
if(WIRE_SPEEDUP)
- holder.visible_message("[bicon(holder)] The speakers squeaks.")
+ holder.visible_message("\icon[holder][bicon(holder)] The speakers squeaks.")
if(WIRE_SPEEDDOWN)
- holder.visible_message("[bicon(holder)] The speakers rumble.")
+ holder.visible_message("\icon[holder][bicon(holder)] The speakers rumble.")
if(WIRE_START)
A.StartPlaying()
if(WIRE_STOP)
diff --git a/code/datums/wires/mines.dm b/code/datums/wires/mines.dm
index 5e757ad16c3..55ea718c3f4 100644
--- a/code/datums/wires/mines.dm
+++ b/code/datums/wires/mines.dm
@@ -21,15 +21,15 @@
switch(wire)
if(WIRE_EXPLODE)
- C.visible_message("[bicon(C)] *BEEE-*", "[bicon(C)] *BEEE-*")
+ C.visible_message("\icon[C][bicon(C)] *BEEE-*", "\icon[C][bicon(C)] *BEEE-*")
C.explode()
if(WIRE_EXPLODE_DELAY)
- C.visible_message("[bicon(C)] *BEEE-*", "[bicon(C)] *BEEE-*")
+ C.visible_message("\icon[C][bicon(C)] *BEEE-*", "\icon[C][bicon(C)] *BEEE-*")
C.explode()
if(WIRE_DISARM)
- C.visible_message("[bicon(C)] *click!*", "[bicon(C)] *click!*")
+ C.visible_message("\icon[C][bicon(C)] *click!*", "\icon[C][bicon(C)] *click!*")
var/obj/effect/mine/MI = new C.mineitemtype(get_turf(C))
if(C.trap)
@@ -41,15 +41,15 @@
qdel(C)
if(WIRE_BADDISARM)
- C.visible_message("[bicon(C)] *BEEPBEEPBEEP*", "[bicon(C)] *BEEPBEEPBEEP*")
+ C.visible_message("\icon[C][bicon(C)] *BEEPBEEPBEEP*", "\icon[C][bicon(C)] *BEEPBEEPBEEP*")
spawn(20)
C.explode()
if(WIRE_TRAP)
- C.visible_message("[bicon(C)] *click!*", "[bicon(C)] *click!*")
+ C.visible_message("\icon[C][bicon(C)] *click!*", "\icon[C][bicon(C)] *click!*")
if(mend)
- C.visible_message("[bicon(C)] - The mine recalibrates[C.camo_net ? ", revealing \the [C.trap] inside." : "."]")
+ C.visible_message("\icon[C][bicon(C)] - The mine recalibrates[C.camo_net ? ", revealing \the [C.trap] inside." : "."]")
C.alpha = 255
@@ -61,21 +61,21 @@
return
switch(wire)
if(WIRE_EXPLODE)
- C.visible_message("[bicon(C)] *beep*", "[bicon(C)] *beep*")
+ C.visible_message("\icon[C][bicon(C)] *beep*", "\icon[C][bicon(C)] *beep*")
if(WIRE_EXPLODE_DELAY)
- C.visible_message("[bicon(C)] *BEEPBEEPBEEP*", "[bicon(C)] *BEEPBEEPBEEP*")
+ C.visible_message("\icon[C][bicon(C)] *BEEPBEEPBEEP*", "\icon[C][bicon(C)] *BEEPBEEPBEEP*")
spawn(20)
C.explode()
if(WIRE_DISARM)
- C.visible_message("[bicon(C)] *ping*", "[bicon(C)] *ping*")
+ C.visible_message("\icon[C][bicon(C)] *ping*", "\icon[C][bicon(C)] *ping*")
if(WIRE_BADDISARM)
- C.visible_message("[bicon(C)] *ping*", "[bicon(C)] *ping*")
+ C.visible_message("\icon[C][bicon(C)] *ping*", "\icon[C][bicon(C)] *ping*")
if(WIRE_TRAP)
- C.visible_message("[bicon(C)] *ping*", "[bicon(C)] *ping*")
+ C.visible_message("\icon[C][bicon(C)] *ping*", "\icon[C][bicon(C)] *ping*")
..()
diff --git a/code/datums/wires/particle_accelerator.dm b/code/datums/wires/particle_accelerator.dm
index e3fd198b3ba..1787039622b 100644
--- a/code/datums/wires/particle_accelerator.dm
+++ b/code/datums/wires/particle_accelerator.dm
@@ -26,7 +26,7 @@
C.interface_control = !C.interface_control
if(WIRE_PARTICLE_POWER_LIMIT)
- C.visible_message("[bicon(C)][C] makes a large whirring noise.")
+ C.visible_message("\icon[C][bicon(C)][C] makes a large whirring noise.")
/datum/wires/particle_acc/control_box/on_cut(wire, mend)
var/obj/machinery/particle_accelerator/control_box/C = holder
diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm
index 568eb0f743e..858875a9827 100644
--- a/code/defines/procs/announce.dm
+++ b/code/defines/procs/announce.dm
@@ -40,7 +40,7 @@
if(!msg_sanitized)
message = sanitize(message, extra = 0)
- message_title = sanitizeSafe(message_title)
+ message_title = sanitizeSafe(message_title)
var/list/zlevels
if(zlevel)
diff --git a/code/game/antagonist/antagonist_create.dm b/code/game/antagonist/antagonist_create.dm
index 84c5b2317e2..3dd683377f0 100644
--- a/code/game/antagonist/antagonist_create.dm
+++ b/code/game/antagonist/antagonist_create.dm
@@ -118,7 +118,7 @@
/datum/antagonist/proc/set_antag_name(var/mob/living/player)
// Choose a name, if any.
- var/newname = sanitize(input(player, "You are a [role_text]. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN)
+ var/newname = sanitize(tgui_input_text(player, "You are a [role_text]. Would you like to change your name to something else?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
if (newname)
player.real_name = newname
player.name = player.real_name
diff --git a/code/game/antagonist/antagonist_objectives.dm b/code/game/antagonist/antagonist_objectives.dm
index c2c56c7be1b..223db7dda83 100644
--- a/code/game/antagonist/antagonist_objectives.dm
+++ b/code/game/antagonist/antagonist_objectives.dm
@@ -41,9 +41,9 @@
to_chat(src, "While you may perhaps have goals, this verb's meant to only be visible \
to antagonists. Please make a bug report!")
return
- var/new_ambitions = input(src, "Write a short sentence of what your character hopes to accomplish \
+ var/new_ambitions = tgui_input_text(src, "Write a short sentence of what your character hopes to accomplish \
today as an antagonist. Remember that this is purely optional. It will be shown at the end of the \
- round for everybody else.", "Ambitions", mind.ambitions) as null|message
+ round for everybody else.", "Ambitions", mind.ambitions, multiline = TRUE)
if(isnull(new_ambitions))
return
new_ambitions = sanitize(new_ambitions)
diff --git a/code/game/antagonist/station/rogue_ai.dm b/code/game/antagonist/station/rogue_ai.dm
index e1b73b064b8..fd3ee867f93 100644
--- a/code/game/antagonist/station/rogue_ai.dm
+++ b/code/game/antagonist/station/rogue_ai.dm
@@ -97,7 +97,7 @@ var/datum/antagonist/rogue_ai/malf
testing("rogue_ai set_antag_name called on non-silicon mob [player]!")
return
// Choose a name, if any.
- var/newname = sanitize(input(player, "You are a [role_text]. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN)
+ var/newname = sanitize(tgui_input_text(player, "You are a [role_text]. Would you like to change your name to something else?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
if (newname)
player.SetName(newname)
if(player.mind) player.mind.name = player.name
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index e73b80ca035..0dc346ca816 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -1010,6 +1010,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
flags = RAD_SHIELDED
ambience = AMBIENCE_GENERIC
forbid_events = TRUE
+ forbid_singulo = TRUE
/area/crew_quarters/toilet
name = "\improper Dormitory Toilets"
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 67ffb298d25..579678bd45e 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -51,6 +51,7 @@
var/sound_env = STANDARD_STATION
var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf
var/forbid_events = FALSE // If true, random events will not start inside this area.
+ var/forbid_singulo = FALSE // If true singulo will not move in.
var/no_spoilers = FALSE // If true, makes it much more difficult to see what is inside an area with things like mesons.
var/soundproofed = FALSE // If true, blocks sounds from other areas and prevents hearers on other areas from hearing the sounds within.
@@ -386,7 +387,7 @@ var/list/mob/living/forced_ambiance_list = new
/area/Entered(mob/M)
if(!istype(M) || !M.ckey)
return
-
+
if(!isliving(M))
M.lastarea = src
return
@@ -455,6 +456,10 @@ var/list/mob/living/forced_ambiance_list = new
return // Being buckled to something solid keeps you in place.
if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.item_flags & NOSLIP))
return
+ if(H.incorporeal_move) // VOREstation edit - Phaseshifted beings should not be affected by gravity
+ return
+ if(H.species.can_zero_g_move || H.species.can_space_freemove)
+ return
if(H.m_intent == "run")
H.AdjustStunned(6)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 95f064d4931..e61dd0e956f 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -222,7 +222,7 @@ var/global/list/pre_init_created_atoms // atom creation ordering means some stuf
else
f_name += "oil-stained [name][infix]."
- var/list/output = list("[bicon(src)] That's [f_name] [suffix]", desc)
+ var/list/output = list("\icon[src.examine_icon()][bicon(src)] That's [f_name] [suffix]", desc)
if(user.client?.prefs.examine_text_mode == EXAMINE_MODE_INCLUDE_USAGE)
output += description_info
@@ -713,7 +713,7 @@ var/global/list/pre_init_created_atoms // atom creation ordering means some stuf
. = ..()
SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, new_loc)
-/atom/proc/get_visible_gender()
+/atom/proc/get_visible_gender(mob/user, force)
return gender
/atom/proc/interact(mob/user)
diff --git a/code/game/base_turf.dm b/code/game/base_turf.dm
index 3f78c6fba48..238015d6ed6 100644
--- a/code/game/base_turf.dm
+++ b/code/game/base_turf.dm
@@ -19,7 +19,7 @@
if(!holder) return
- var/choice = input(usr, "Which Z-level do you wish to set the base turf for?") as num|null
+ var/choice = tgui_input_number(usr, "Which Z-level do you wish to set the base turf for?")
if(!choice)
return
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index 3d945e58167..931b2980913 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -24,14 +24,16 @@
/proc/randmutb(var/mob/living/M)
if(!M) return
M.dna.check_integrity()
- var/block = pick(GLASSESBLOCK,COUGHBLOCK,FAKEBLOCK,NERVOUSBLOCK,CLUMSYBLOCK,TWITCHBLOCK,HEADACHEBLOCK,BLINDBLOCK,DEAFBLOCK,HALLUCINATIONBLOCK)
+ //var/block = pick(GLASSESBLOCK,COUGHBLOCK,FAKEBLOCK,NERVOUSBLOCK,CLUMSYBLOCK,TWITCHBLOCK,HEADACHEBLOCK,BLINDBLOCK,DEAFBLOCK,HALLUCINATIONBLOCK) // Most of these are disabled anyway.
+ var/block = pick(FAKEBLOCK,CLUMSYBLOCK,BLINDBLOCK,DEAFBLOCK)
M.dna.SetSEState(block, 1)
// Give Random Good Mutation to M
/proc/randmutg(var/mob/living/M)
if(!M) return
M.dna.check_integrity()
- var/block = pick(HULKBLOCK,XRAYBLOCK,FIREBLOCK,TELEBLOCK,NOBREATHBLOCK,REMOTEVIEWBLOCK,REGENERATEBLOCK,INCREASERUNBLOCK,REMOTETALKBLOCK,MORPHBLOCK,BLENDBLOCK,NOPRINTSBLOCK,SHOCKIMMUNITYBLOCK,SMALLSIZEBLOCK)
+ //var/block = pick(HULKBLOCK,XRAYBLOCK,FIREBLOCK,TELEBLOCK,NOBREATHBLOCK,REMOTEVIEWBLOCK,REGENERATEBLOCK,INCREASERUNBLOCK,REMOTETALKBLOCK,MORPHBLOCK,BLENDBLOCK,NOPRINTSBLOCK,SHOCKIMMUNITYBLOCK,SMALLSIZEBLOCK) // Much like above, most of these blocks are disabled in code.
+ var/block = pick(HULKBLOCK,XRAYBLOCK,FIREBLOCK,TELEBLOCK,REGENERATEBLOCK,REMOTETALKBLOCK)
M.dna.SetSEState(block, 1)
// Random Appearance Mutation
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 1f2815426b4..58338edf220 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -24,7 +24,7 @@
var/languages=null
var/list/flavor=null
var/gender = null
- var/list/body_descriptors = null
+ var/list/body_descriptors = null // Guess we'll keep null.
var/list/genetic_modifiers = list() // Modifiers with the MODIFIER_GENETIC flag are saved. Note that only the type is saved, not an instance.
/datum/dna2/record/proc/GetData()
@@ -54,7 +54,8 @@
newrecord.implant = implant
newrecord.flavor = flavor
newrecord.gender = gender
- newrecord.body_descriptors = body_descriptors.Copy()
+ if(body_descriptors)
+ newrecord.body_descriptors = body_descriptors.Copy()
newrecord.genetic_modifiers = genetic_modifiers.Copy()
return newrecord
diff --git a/code/game/gamemodes/changeling/powers/mimic_voice.dm b/code/game/gamemodes/changeling/powers/mimic_voice.dm
index 6b84c577ff6..be4a055dc1b 100644
--- a/code/game/gamemodes/changeling/powers/mimic_voice.dm
+++ b/code/game/gamemodes/changeling/powers/mimic_voice.dm
@@ -22,7 +22,7 @@
to_chat(src, "We return our vocal glands to their original location.")
return
- var/mimic_voice = sanitize(input(usr, "Enter a name to mimic.", "Mimic Voice", null), MAX_NAME_LEN)
+ var/mimic_voice = sanitize(tgui_input_text(usr, "Enter a name to mimic.", "Mimic Voice", null, MAX_NAME_LEN), MAX_NAME_LEN)
if(!mimic_voice)
return
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index fac7066de48..3ad86499bda 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -611,7 +611,7 @@ var/list/sacrificed = list()
// returns 0 if the rune is not used. returns 1 if the rune is used.
/obj/effect/rune/proc/communicate()
. = 1 // Default output is 1. If the rune is deleted it will return 1
- var/input = input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "")//sanitize() below, say() and whisper() have their own
+ var/input = tgui_input_text(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "")//sanitize() below, say() and whisper() have their own
if(!input)
if (istype(src))
fizzle()
diff --git a/code/game/gamemodes/events/holidays/Holidays.dm b/code/game/gamemodes/events/holidays/Holidays.dm
index cee83656cb9..9b31ad9a50e 100644
--- a/code/game/gamemodes/events/holidays/Holidays.dm
+++ b/code/game/gamemodes/events/holidays/Holidays.dm
@@ -214,8 +214,8 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t
Holiday = list()
- var/H = input(src,"What holiday is it today?","Set Holiday") as text
- var/B = input(src,"Now explain what the holiday is about","Set Holiday") as message
+ var/H = tgui_input_text(src,"What holiday is it today?","Set Holiday")
+ var/B = tgui_input_text(src,"Now explain what the holiday is about","Set Holiday", multiline = TRUE, prevent_enter = TRUE)
Holiday[H] = B
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 88efd6154e6..7af06d8d33d 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -59,23 +59,23 @@ var/global/list/additional_antag_types = list()
var/choice = ""
switch(href_list["set"])
if("shuttle_delay")
- choice = input(usr, "Enter a new shuttle delay multiplier") as num
+ choice = tgui_input_number(usr, "Enter a new shuttle delay multiplier", null, null, 20, 1)
if(!choice || choice < 1 || choice > 20)
return
shuttle_delay = choice
if("antag_scaling")
- choice = input(usr, "Enter a new antagonist cap scaling coefficient.") as num
+ choice = tgui_input_number(usr, "Enter a new antagonist cap scaling coefficient.", null, null, 100, 0)
if(isnull(choice) || choice < 0 || choice > 100)
return
antag_scaling_coeff = choice
if("event_modifier_moderate")
- choice = input(usr, "Enter a new moderate event time modifier.") as num
+ choice = tgui_input_number(usr, "Enter a new moderate event time modifier.", null, null, 100, 0)
if(isnull(choice) || choice < 0 || choice > 100)
return
event_delay_mod_moderate = choice
refresh_event_modifiers()
if("event_modifier_severe")
- choice = input(usr, "Enter a new moderate event time modifier.") as num
+ choice = tgui_input_number(usr, "Enter a new moderate event time modifier.", null, null, 100, 0)
if(isnull(choice) || choice < 0 || choice > 100)
return
event_delay_mod_major = choice
diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
index d8229e1562a..2ee412194ef 100644
--- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
+++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
@@ -93,8 +93,8 @@
if(!ability_prechecks(user, price))
return
- var/title = input(usr, "Select message title: ")
- var/text = input(usr, "Select message text: ")
+ var/title = tgui_input_text(usr, "Select message title: ")
+ var/text = tgui_input_text(usr, "Select message text: ")
if(!title || !text || !ability_pay(user, price))
to_chat(user, "Hack Aborted")
return
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index aec6442f8d1..7c51611bf2d 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -124,10 +124,10 @@
if("Location")
mode = 1
- var/locationx = input(usr, "Please input the x coordinate to search for.", "Location?" , "") as num
+ var/locationx = tgui_input_number(usr, "Please input the x coordinate to search for.", "Location?" , "")
if(!locationx || !(usr in view(1,src)))
return
- var/locationy = input(usr, "Please input the y coordinate to search for.", "Location?" , "") as num
+ var/locationy = tgui_input_number(usr, "Please input the y coordinate to search for.", "Location?" , "")
if(!locationy || !(usr in view(1,src)))
return
@@ -160,7 +160,7 @@
to_chat(usr, "You set the pinpointer to locate [targetitem]")
if("DNA")
- var/DNAstring = input(usr, "Input DNA string to search for." , "Please Enter String." , "")
+ var/DNAstring = tgui_input_text(usr, "Input DNA string to search for." , "Please Enter String." , "")
if(!DNAstring)
return
for(var/mob/living/carbon/M in mob_list)
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index cb2a3fcb4b7..9b6b532f964 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -481,7 +481,7 @@ var/global/list/all_objectives = list()
var/tmp_obj = new custom_target
var/custom_name = tmp_obj:name
qdel(tmp_obj)
- custom_name = sanitize(input(usr, "Enter target name:", "Objective target", custom_name) as text|null)
+ custom_name = sanitize(tgui_input_text(usr, "Enter target name:", "Objective target", custom_name))
if (!custom_name) return
target_name = custom_name
steal_target = custom_target
diff --git a/code/game/gamemodes/technomancer/spells/illusion.dm b/code/game/gamemodes/technomancer/spells/illusion.dm
index dcadf53ffb1..ab83319bc59 100644
--- a/code/game/gamemodes/technomancer/spells/illusion.dm
+++ b/code/game/gamemodes/technomancer/spells/illusion.dm
@@ -49,12 +49,12 @@
if("Cancel")
return
if("Speak")
- var/what_to_say = input(user, "What do you want \the [illusion] to say?","Illusion Speak") as null|text
+ var/what_to_say = tgui_input_text(user, "What do you want \the [illusion] to say?","Illusion Speak")
//what_to_say = sanitize(what_to_say) //Sanitize occurs inside say() already.
if(what_to_say)
illusion.say(what_to_say)
if("Emote")
- var/what_to_emote = input(user, "What do you want \the [illusion] to do?","Illusion Emote") as null|text
+ var/what_to_emote = tgui_input_text(user, "What do you want \the [illusion] to do?","Illusion Emote")
if(what_to_emote)
illusion.emote(what_to_emote)
diff --git a/code/game/jobs/job/assistant_vr.dm b/code/game/jobs/job/assistant_vr.dm
index 7bfdadca50e..8be93935052 100644
--- a/code/game/jobs/job/assistant_vr.dm
+++ b/code/game/jobs/job/assistant_vr.dm
@@ -27,6 +27,7 @@
job_description = "An Intern does whatever is requested of them, often doing so in process of learning \
another job. Though they are part of the crew, they have no real authority."
timeoff_factor = 0 // Interns, noh
+ requestable = FALSE
/datum/alt_title/intern_eng
title = "Apprentice Engineer"
@@ -96,6 +97,7 @@
supervisors = "nobody! You don't work here"
job_description = "A Visitor is just there to visit the place. They have no real authority or responsibility."
timeoff_factor = 0
+ requestable = FALSE
alt_titles = list("Guest" = /datum/alt_title/guest, "Traveler" = /datum/alt_title/traveler)
/datum/job/assistant/New()
diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm
index 5fba7b155dc..f811abf9572 100644
--- a/code/game/jobs/job/civilian_chaplain.dm
+++ b/code/game/jobs/job/civilian_chaplain.dm
@@ -29,20 +29,14 @@
return
var/obj/item/weapon/storage/bible/B = locate(/obj/item/weapon/storage/bible) in H
- if(!B)
+ var/obj/item/weapon/card/id/I = locate(/obj/item/weapon/card/id) in H
+
+ if(!B || !I)
return
- if(GLOB.religion)
- B.deity_name = GLOB.deity
- B.name = GLOB.bible_name
- B.icon_state = GLOB.bible_icon_state
- B.item_state = GLOB.bible_item_state
- to_chat(H, "There is already an established religion onboard the station. You are an acolyte of [GLOB.deity]. Defer to the [title].")
- return
-
- INVOKE_ASYNC(src, .proc/religion_prompts, H, B)
+ INVOKE_ASYNC(src, .proc/religion_prompts, H, B, I)
-/datum/job/chaplain/proc/religion_prompts(mob/living/carbon/human/H, obj/item/weapon/storage/bible/B)
+/datum/job/chaplain/proc/religion_prompts(mob/living/carbon/human/H, obj/item/weapon/storage/bible/B, obj/item/weapon/card/id/I)
var/religion_name = "Unitarianism"
var/new_religion = sanitize(input(H, "You are the crew services officer. Would you like to change your religion? Default is Unitarianism", "Name change", religion_name), MAX_NAME_LEN)
if(!new_religion)
@@ -83,18 +77,48 @@
B.name = "Guru Granth Sahib"
else
B.name = "The Holy Book of [new_religion]"
- feedback_set_details("religion_name","[new_religion]")
var/deity_name = "Hashem"
var/new_deity = sanitize(input(H, "Would you like to change your deity? Default is Hashem", "Name change", deity_name), MAX_NAME_LEN)
if((length(new_deity) == 0) || (new_deity == "Hashem"))
new_deity = deity_name
- B.deity_name = new_deity
- GLOB.religion = new_religion
- GLOB.bible_name = B.name
- GLOB.deity = B.deity_name
- feedback_set_details("religion_deity","[new_deity]")
-
+ var/new_title = sanitize(input(H, "Would you like to change your title?", "Title Change", I.assignment), MAX_NAME_LEN)
+ var/list/all_jobs = get_job_datums()
+
+ // Are they trying to fake an actual existent job
+ var/faking_job = FALSE
+
+ for (var/datum/job/J in all_jobs)
+ if (J.title == new_title || (new_title in get_alternate_titles(J.title)))
+ faking_job = TRUE
+
+ if (length(new_title) != 0 && !faking_job)
+ I.assignment = new_title
+
+ H.mind.my_religion = new /datum/religion(new_religion, new_deity, B.name, "bible", "bible", new_title)
+
+ B.deity_name = H.mind.my_religion.deity
+ I.assignment = H.mind.my_religion.title
+ I.name = text("[I.registered_name]'s ID Card ([I.assignment])")
+ data_core.manifest_modify(I.registered_name, I.assignment, I.rank)
+
+/datum/religion
+ var/religion = "Unitarianism"
+ var/deity = "Hashem"
+ var/bible_name = "Bible"
+ var/bible_icon_state = "bible"
+ var/bible_item_state = "bible"
+ var/title = "Chaplain"
+ var/configured = FALSE
+
+/datum/religion/New(var/r, var/d, var/bn, var/bis, var/bits, var/t)
+ . = ..()
+ religion = r
+ deity = d
+ bible_name = bn
+ bible_icon_state = bis
+ bible_item_state = bits
+ title = t
\ No newline at end of file
diff --git a/code/game/jobs/job/engineering_vr.dm b/code/game/jobs/job/engineering_vr.dm
index 86c3f2e6b15..9eda21a90bc 100644
--- a/code/game/jobs/job/engineering_vr.dm
+++ b/code/game/jobs/job/engineering_vr.dm
@@ -23,17 +23,28 @@
/datum/alt_title/maintenance_manager
title = "Maintenance Manager"
+/datum/job/chief_engineer/get_request_reasons()
+ return list("Engine setup", "Construction project", "Repairs necessary")
+
/datum/job/engineer
pto_type = PTO_ENGINEERING
alt_titles = list("Maintenance Technician" = /datum/alt_title/maint_tech, "Engine Technician" = /datum/alt_title/engine_tech,
- "Electrician" = /datum/alt_title/electrician, "Construction Engineer" = /datum/alt_title/construction_engi)
+ "Electrician" = /datum/alt_title/electrician, "Construction Engineer" = /datum/alt_title/construction_engi, "Engineering Contractor" = /datum/alt_title/engineering_contractor)
/datum/alt_title/construction_engi
title = "Construction Engineer"
title_blurb = "A Construction Engineer fulfills similar duties to other engineers, but usually occupies spare time with construction of extra facilities in dedicated areas or \
as additions to station layout."
+/datum/alt_title/engineering_contractor
+ title = "Engineering Contractor"
+ title_blurb = "An Engineering Contractor fulfills similar duties to other engineers, but isn't directly employed by NT proper."
+
+/datum/job/engineer/get_request_reasons()
+ return list("Engine setup", "Construction project", "Repairs necessary")
+
+
/datum/job/atmos
@@ -49,4 +60,7 @@
/datum/alt_title/disposals_tech
title = "Disposals Technician"
- title_blurb = "A Disposals Technician is an Atmospheric Technician still and can fulfill all the same duties, although specializes more in disposals delivery system's operations and configurations."
\ No newline at end of file
+ title_blurb = "A Disposals Technician is an Atmospheric Technician still and can fulfill all the same duties, although specializes more in disposals delivery system's operations and configurations."
+
+/datum/job/atmos/get_request_reasons()
+ return list("Construction project", "Repairs necessary")
\ No newline at end of file
diff --git a/code/game/jobs/job/job_vr.dm b/code/game/jobs/job/job_vr.dm
index a416a3af489..ac8b6be0b40 100644
--- a/code/game/jobs/job/job_vr.dm
+++ b/code/game/jobs/job/job_vr.dm
@@ -17,6 +17,11 @@
//Time required in the department as other jobs before playing this one (in hours)
var/dept_time_required = 0
+ //Do we forbid ourselves from earning PTO?
+ var/playtime_only = FALSE
+
+ var/requestable = TRUE
+
// Check client-specific availability rules.
/datum/job/proc/player_has_enough_pto(client/C)
return timeoff_factor >= 0 || (C && LAZYACCESS(C.department_hours, pto_type) > 0)
@@ -39,7 +44,7 @@
if(C && config.use_playtime_restriction_for_jobs && dept_time_required)
var/remaining_time_needed = dept_time_required
for(var/key in C.play_hours)
- if(isnum(C.play_hours[key]))
+ if(isnum(C.play_hours[key]) && !(key == PTO_TALON))
remaining_time_needed = max(0, remaining_time_needed - C.play_hours[key])
return remaining_time_needed
return 0
@@ -55,4 +60,7 @@
if(isnum(C.play_hours[PTO_EXPLORATION]))
remaining_time_needed = max(0, remaining_time_needed - C.play_hours[PTO_EXPLORATION])
return remaining_time_needed
- return 0
\ No newline at end of file
+ return 0
+
+/datum/job/proc/get_request_reasons()
+ return list()
\ No newline at end of file
diff --git a/code/game/jobs/job/medical_vr.dm b/code/game/jobs/job/medical_vr.dm
index 6d5ee57c4e4..c3883d18bf0 100644
--- a/code/game/jobs/job/medical_vr.dm
+++ b/code/game/jobs/job/medical_vr.dm
@@ -21,14 +21,16 @@
/datum/alt_title/healthcare_manager
title = "Healthcare Manager"
+/datum/job/cmo/get_request_reasons()
+ return list("Surgery pending", "Viral outbreak")
+
/datum/job/doctor
spawn_positions = 5
pto_type = PTO_MEDICAL
alt_titles = list("Physician" = /datum/alt_title/physician, "Medical Practitioner" = /datum/alt_title/medical_practitioner, "Surgeon" = /datum/alt_title/surgeon,
"Emergency Physician" = /datum/alt_title/emergency_physician, "Nurse" = /datum/alt_title/nurse, "Orderly" = /datum/alt_title/orderly,
- "Virologist" = /datum/alt_title/virologist)
-
+ "Virologist" = /datum/alt_title/virologist, "Medical Contractor" = /datum/alt_title/medical_contractor)
/datum/alt_title/physician
title = "Physician"
@@ -42,6 +44,13 @@
and dirty labor around the department."
title_outfit = /decl/hierarchy/outfit/job/medical/doctor/nurse
+/datum/alt_title/medical_contractor
+ title = "Medical Contractor"
+ title_blurb = "A Medical Contractor can be anything from a full-blown doctor to the likes of a nurse or orderly, but isn't directly employed by NT proper."
+
+/datum/job/doctor/get_request_reasons()
+ return list("Surgery pending", "Viral outbreak")
+
/datum/job/chemist
pto_type = PTO_MEDICAL
@@ -71,10 +80,13 @@
/datum/job/paramedic
pto_type = PTO_MEDICAL
- alt_titles = list("Emergency Medical Technician" = /datum/alt_title/emt, "Medical Responder" = /datum/alt_title/medical_responder)
+ alt_titles = list("Emergency Medical Technician" = /datum/alt_title/emt, "Medical Responder" = /datum/alt_title/medical_responder, "Search and Rescue" = /datum/alt_title/sar)
/datum/alt_title/medical_responder
title = "Medical Responder"
title_blurb = "A Medical Responder is primarily concerned with the recovery of patients who are unable to make it to the Medical Department on their \
own. They are capable of keeping a patient stabilized until they reach the hands of someone with more training."
- title_outfit = /decl/hierarchy/outfit/job/medical/paramedic/emt
\ No newline at end of file
+ title_outfit = /decl/hierarchy/outfit/job/medical/paramedic/emt
+
+/datum/alt_title/sar
+ title = "Search and Rescue"
diff --git a/code/game/jobs/job/security_vr.dm b/code/game/jobs/job/security_vr.dm
index 082531d944e..2ab3925c313 100644
--- a/code/game/jobs/job/security_vr.dm
+++ b/code/game/jobs/job/security_vr.dm
@@ -16,6 +16,9 @@
/datum/alt_title/security_manager
title = "Security Manager"
+/datum/job/hos/get_request_reasons()
+ return list("Wildlife management", "Forensic investigation")
+
/datum/job/warden
pto_type = PTO_SECURITY
@@ -28,6 +31,9 @@
/datum/alt_title/armory_superintendent
title = "Armory Superintendent"
+/datum/job/warden/get_request_reasons()
+ return list("Wildlife management")
+
/datum/job/detective
pto_type = PTO_SECURITY
@@ -39,13 +45,16 @@
/datum/alt_title/security_inspector
title = "Security Inspector"
+/datum/job/detective/get_request_reasons()
+ return list("Forensic investigation")
+
/datum/job/officer
total_positions = 5
spawn_positions = 5
pto_type = PTO_SECURITY
alt_titles = list("Patrol Officer" = /datum/alt_title/patrol_officer, "Security Guard" = /datum/alt_title/security_guard,
- "Security Deputy" = /datum/alt_title/security_guard, "Junior Officer" = /datum/alt_title/junior_officer)
+ "Security Deputy" = /datum/alt_title/security_guard, "Junior Officer" = /datum/alt_title/junior_officer, "Security Contractor" = /datum/alt_title/security_contractor)
/datum/alt_title/patrol_officer
title = "Patrol Officer"
@@ -54,4 +63,10 @@
title = "Security Guard"
/datum/alt_title/security_deputy
- title = "Security Deputy"
\ No newline at end of file
+ title = "Security Deputy"
+
+/datum/alt_title/security_contractor
+ title = "Security Contractor"
+
+/datum/job/officer/get_request_reasons()
+ return list("Wildlife management")
\ No newline at end of file
diff --git a/code/game/jobs/job/special_vr.dm b/code/game/jobs/job/special_vr.dm
index 6e3f1df8277..295a2ad2784 100644
--- a/code/game/jobs/job/special_vr.dm
+++ b/code/game/jobs/job/special_vr.dm
@@ -64,6 +64,7 @@
job_description = "A Clown is there to entertain the crew and keep high morale using various harmless pranks and ridiculous jokes!"
whitelist_only = 1
latejoin_only = 0
+ requestable = FALSE
outfit_type = /decl/hierarchy/outfit/job/clown
pto_type = PTO_CIVILIAN
alt_titles = list("Jester" = /datum/alt_title/jester, "Fool" = /datum/alt_title/fool)
@@ -95,6 +96,7 @@
alt_titles = list("Poseur" = /datum/alt_title/poseur)
whitelist_only = 1
latejoin_only = 0
+ requestable = FALSE
outfit_type = /decl/hierarchy/outfit/job/mime
pto_type = PTO_CIVILIAN
diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm
index 55b0c0ea2f4..3cb7ac5b343 100644
--- a/code/game/machinery/air_alarm.dm
+++ b/code/game/machinery/air_alarm.dm
@@ -672,7 +672,7 @@
var/list/selected = TLV["temperature"]
var/max_temperature = min(selected[3] - T0C, MAX_TEMPERATURE)
var/min_temperature = max(selected[2] - T0C, MIN_TEMPERATURE)
- var/input_temperature = input(usr, "What temperature would you like the system to mantain? (Capped between [min_temperature] and [max_temperature]C)", "Thermostat Controls", target_temperature - T0C) as num|null
+ var/input_temperature = tgui_input_number(usr, "What temperature would you like the system to mantain? (Capped between [min_temperature] and [max_temperature]C)", "Thermostat Controls", target_temperature - T0C, max_temperature, min_temperature)
if(isnum(input_temperature))
if(input_temperature > max_temperature || input_temperature < min_temperature)
to_chat(usr, "Temperature must be between [min_temperature]C and [max_temperature]C")
@@ -726,7 +726,7 @@
var/env = params["env"]
var/name = params["var"]
- var/value = input(usr, "New [name] for [env]:", name, TLV[env][name]) as num|null
+ var/value = tgui_input_number(usr, "New [name] for [env]:", name, TLV[env][name])
if(!isnull(value) && !..())
if(value < 0)
TLV[env][name] = -1
diff --git a/code/game/machinery/airconditioner_vr.dm b/code/game/machinery/airconditioner_vr.dm
index f9a14370419..364d4bf3771 100644
--- a/code/game/machinery/airconditioner_vr.dm
+++ b/code/game/machinery/airconditioner_vr.dm
@@ -47,7 +47,7 @@
turn_off()
return
if(istype(I, /obj/item/device/multitool))
- var/new_temp = input(usr, "Input a new target temperature, in degrees C.","Target Temperature", 20) as num
+ var/new_temp = tgui_input_number(usr, "Input a new target temperature, in degrees C.","Target Temperature", 20)
if(!Adjacent(user) || user.incapacitated())
return
new_temp = convert_c2k(new_temp)
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 06b78eda0f6..4849c780806 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -332,7 +332,7 @@ update_flag
pressure = 10*ONE_ATMOSPHERE
. = TRUE
else if(pressure == "input")
- pressure = input(usr, "New release pressure ([ONE_ATMOSPHERE/10]-[10*ONE_ATMOSPHERE] kPa):", name, release_pressure) as num|null
+ pressure = tgui_input_number(usr, "New release pressure ([ONE_ATMOSPHERE/10]-[10*ONE_ATMOSPHERE] kPa):", name, release_pressure, 10*ONE_ATMOSPHERE, ONE_ATMOSPHERE/10)
if(!isnull(pressure) && !..())
. = TRUE
else if(text2num(pressure) != null)
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index bc8a8081d0c..3e8cf00207a 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -176,7 +176,7 @@
if(!isnull(materials.get_material_amount(material)) && materials.get_material_amount(material) < round(making.resources[material] * coeff))
max_sheets = 0
//Build list of multipliers for sheets.
- multiplier = input(usr, "How many do you want to print? (0-[max_sheets])") as num|null
+ multiplier = tgui_input_number(usr, "How many do you want to print? (0-[max_sheets])", null, null, max_sheets, 0)
if(!multiplier || multiplier <= 0 || multiplier > max_sheets || tgui_status(usr, state) != STATUS_INTERACTIVE)
return FALSE
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index 0660bff7591..a73eb6fe917 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -80,7 +80,7 @@
if(W.is_screwdriver())
playsound(src, W.usesound, 50, 1)
- var/input = sanitize(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: "+using_map.station_short+",Security,Secret ", "Set Network", camera_network ? camera_network : NETWORK_DEFAULT))
+ var/input = sanitize(tgui_input_text(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: "+using_map.station_short+",Security,Secret ", "Set Network", camera_network ? camera_network : NETWORK_DEFAULT))
if(!input)
to_chat(usr, "No input found please hang up and try your call again.")
return
@@ -92,7 +92,7 @@
var/area/camera_area = get_area(src)
var/temptag = "[sanitize(camera_area.name)] ([rand(1, 999)])"
- input = sanitizeSafe(input(usr, "How would you like to name the camera?", "Set Camera Name", camera_name ? camera_name : temptag), MAX_NAME_LEN)
+ input = sanitizeSafe(tgui_input_text(usr, "How would you like to name the camera?", "Set Camera Name", camera_name ? camera_name : temptag), MAX_NAME_LEN)
state = 4
var/obj/machinery/camera/C = new(src.loc)
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 68ddf03f2b0..fec159f48d4 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -1120,7 +1120,7 @@
// This is not a status display message, since it's something the character
// themselves is meant to see BEFORE putting the money in
- to_chat(usr, "[bicon(cashmoney)] That is not enough money.")
+ to_chat(usr, "\icon[cashmoney][bicon(cashmoney)] That is not enough money.")
return 0
if(istype(cashmoney, /obj/item/weapon/spacecash))
@@ -1177,7 +1177,7 @@
// Have the customer punch in the PIN before checking if there's enough money. Prevents people from figuring out acct is
// empty at high security levels
if(customer_account.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
- var/attempt_pin = input(usr, "Enter pin code", "Vendor transaction") as num
+ var/attempt_pin = tgui_input_number(usr, "Enter pin code", "Vendor transaction")
customer_account = attempt_account_access(I.associated_account_number, attempt_pin, 2)
if(!customer_account)
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index c15a9d15243..75b860330dd 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -205,7 +205,7 @@
if(is_authenticated() && modify)
var/t1 = params["assign_target"]
if(t1 == "Custom")
- var/temp_t = sanitize(input(usr, "Enter a custom job assignment.","Assignment"), 45)
+ var/temp_t = sanitize(tgui_input_text(usr, "Enter a custom job assignment.","Assignment"), 45)
//let custom jobs function as an impromptu alt title, mainly for sechuds
if(temp_t && modify)
modify.assignment = temp_t
diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm
index da7548b8bf8..6b6cd3a1aeb 100644
--- a/code/game/machinery/computer/guestpass.dm
+++ b/code/game/machinery/computer/guestpass.dm
@@ -107,6 +107,9 @@
/obj/machinery/computer/guestpass/attackby(obj/I, mob/user)
+ if(istype(I, /obj/item/weapon/card/id/guest))
+ to_chat(user, "The guest pass terminal denies to accept the guest pass.")
+ return
if(istype(I, /obj/item/weapon/card/id))
if(!giver && user.unEquip(I))
I.forceMove(src)
@@ -167,15 +170,15 @@
mode = params["mode"]
if("giv_name")
- var/nam = sanitizeName(input(usr, "Person pass is issued to", "Name", giv_name) as text|null)
+ var/nam = sanitizeName(tgui_input_text(usr, "Person pass is issued to", "Name", giv_name))
if(nam)
giv_name = nam
if("reason")
- var/reas = sanitize(input(usr, "Reason why pass is issued", "Reason", reason) as text|null)
+ var/reas = sanitize(tgui_input_text(usr, "Reason why pass is issued", "Reason", reason))
if(reas)
reason = reas
if("duration")
- var/dur = input(usr, "Duration (in minutes) during which pass is valid (up to 360 minutes).", "Duration") as num|null //VOREStation Edit
+ var/dur = tgui_input_number(usr, "Duration (in minutes) during which pass is valid (up to 360 minutes).", "Duration", null, 360, 0)
if(dur)
if(dur > 0 && dur <= 360) //VOREStation Edit
duration = dur
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index 5962f9aa8f6..27009d097b2 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -243,10 +243,10 @@
. = TRUE
//Change the password - KEY REQUIRED
if("pass")
- var/dkey = trim(input(usr, "Please enter the current decryption key.") as text|null)
+ var/dkey = trim(tgui_input_text(usr, "Please enter the current decryption key."))
if(dkey && dkey != "")
if(linkedServer.decryptkey == dkey)
- var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):"))
+ var/newkey = trim(tgui_input_text(usr,"Please enter the new key (3 - 16 characters max):",null,null,16))
if(length(newkey) <= 3)
set_temp("NOTICE: Decryption key too short!", "average")
else if(length(newkey) > 16)
@@ -325,7 +325,7 @@
. = TRUE
if("addtoken")
- linkedServer.spamfilter += input(usr,"Enter text you want to be filtered out","Token creation") as text|null
+ linkedServer.spamfilter += tgui_input_text(usr,"Enter text you want to be filtered out","Token creation")
. = TRUE
if("deltoken")
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index fa0a2ebce01..4f2b4fd4e8f 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -82,7 +82,7 @@
to_chat(usr, "Unauthorized Access.")
. = TRUE
if("warn")
- var/warning = sanitize(input(usr, "Message:", "Enter your message here!", ""))
+ var/warning = sanitize(tgui_input_text(usr, "Message:", "Enter your message here!", ""))
if(!warning)
return
var/obj/item/weapon/implant/I = locate(params["imp"])
diff --git a/code/game/machinery/computer/supply.dm b/code/game/machinery/computer/supply.dm
index e805e151bd5..ce345e429e6 100644
--- a/code/game/machinery/computer/supply.dm
+++ b/code/game/machinery/computer/supply.dm
@@ -221,12 +221,12 @@
visible_message("[src]'s monitor flashes, \"[reqtime - world.time] seconds remaining until another requisition form may be printed.\"")
return FALSE
- var/amount = clamp(input(usr, "How many crates? (0 to 20)") as num|null, 0, 20)
+ var/amount = clamp(tgui_input_number(usr, "How many crates? (0 to 20)", null, null, 20, 0), 0, 20)
if(!amount)
return FALSE
var/timeout = world.time + 600
- var/reason = sanitize(input(usr, "Reason:","Why do you require this item?","") as null|text)
+ var/reason = sanitize(tgui_input_text(usr, "Reason:","Why do you require this item?",""))
if(world.time > timeout)
to_chat(usr, "Error. Request timed out.")
return FALSE
@@ -280,7 +280,7 @@
return FALSE
var/timeout = world.time + 600
- var/reason = sanitize(input(usr, "Reason:","Why do you require this item?","") as null|text)
+ var/reason = sanitize(tgui_input_text(usr, "Reason:","Why do you require this item?",""))
if(world.time > timeout)
to_chat(usr, "Error. Request timed out.")
return FALSE
@@ -323,7 +323,7 @@
return FALSE
if(!(authorization & SUP_ACCEPT_ORDERS))
return FALSE
- var/new_val = sanitize(input(usr, params["edit"], "Enter the new value for this field:", params["default"]) as null|text)
+ var/new_val = sanitize(tgui_input_text(usr, params["edit"], "Enter the new value for this field:", params["default"]))
if(!new_val)
return FALSE
@@ -396,7 +396,7 @@
var/list/L = E.contents[params["index"]]
var/field = tgui_alert(usr, "Select which field to edit", "Field Choice", list("Name", "Quantity", "Value"))
- var/new_val = sanitize(input(usr, field, "Enter the new value for this field:", L[lowertext(field)]) as null|text)
+ var/new_val = sanitize(tgui_input_text(usr, field, "Enter the new value for this field:", L[lowertext(field)]))
if(!new_val)
return
@@ -439,7 +439,7 @@
return FALSE
if(!(authorization & SUP_ACCEPT_ORDERS))
return FALSE
- var/new_val = sanitize(input(usr, params["edit"], "Enter the new value for this field:", params["default"]) as null|text)
+ var/new_val = sanitize(tgui_input_text(usr, params["edit"], "Enter the new value for this field:", params["default"]))
if(!new_val)
return
diff --git a/code/game/machinery/computer3/computers/card.dm b/code/game/machinery/computer3/computers/card.dm
index d2f6074c784..7412f6b4641 100644
--- a/code/game/machinery/computer3/computers/card.dm
+++ b/code/game/machinery/computer3/computers/card.dm
@@ -305,7 +305,7 @@
if(auth)
var/t1 = href_list["assign"]
if(t1 == "Custom")
- var/temp_t = sanitize(input(usr, "Enter a custom job assignment.","Assignment"))
+ var/temp_t = sanitize(tgui_input_text(usr, "Enter a custom job assignment.","Assignment"))
if(temp_t)
t1 = temp_t
set_default_access(t1)
diff --git a/code/game/machinery/doorbell_vr.dm b/code/game/machinery/doorbell_vr.dm
index d90a46000f1..906c41ea6d2 100644
--- a/code/game/machinery/doorbell_vr.dm
+++ b/code/game/machinery/doorbell_vr.dm
@@ -129,7 +129,7 @@
if(default_deconstruction_screwdriver(user, W))
return
else if(panel_open && istype(W, /obj/item/weapon/pen))
- var/t = sanitizeSafe(input(user, "Enter the name for \the [src].", src.name, initial(src.name)), MAX_NAME_LEN)
+ var/t = sanitizeSafe(tgui_input_text(user, "Enter the name for \the [src].", src.name, initial(src.name), MAX_NAME_LEN), MAX_NAME_LEN)
if(t && in_range(src, user))
name = t
else if(panel_open && istype(W, /obj/item/device/multitool))
diff --git a/code/game/machinery/gear_dispenser.dm b/code/game/machinery/gear_dispenser.dm
index 70c97af29d7..315b56e8479 100644
--- a/code/game/machinery/gear_dispenser.dm
+++ b/code/game/machinery/gear_dispenser.dm
@@ -693,7 +693,7 @@ var/list/dispenser_presets = list()
* "gearlist" = array of types (yes the types are not valid json, byond parses them into real types.)
* "req_one_access" = array of numbers (accesses)
*/
- var/input = input(usr, "Paste new gear pack JSON below. See example/code comments.", "Admin-load Dispenser", example) as null|message
+ var/input = tgui_input_text(usr, "Paste new gear pack JSON below. See example/code comments.", "Admin-load Dispenser", example, multiline = TRUE)
if(!input)
return
diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm
index 955b99009a9..0e184683ec0 100644
--- a/code/game/machinery/jukebox.dm
+++ b/code/game/machinery/jukebox.dm
@@ -401,20 +401,20 @@
return
// Required
- var/url = input(C, "REQUIRED: Provide URL for track", "Track URL") as text|null
+ var/url = tgui_input_text(C, "REQUIRED: Provide URL for track", "Track URL")
if(!url)
return
- var/title = input(C, "REQUIRED: Provide title for track", "Track Title") as text|null
+ var/title = tgui_input_text(C, "REQUIRED: Provide title for track", "Track Title")
if(!title)
return
- var/duration = input(C, "REQUIRED: Provide duration for track (in deciseconds, aka seconds*10)", "Track Duration") as num|null
+ var/duration = tgui_input_number(C, "REQUIRED: Provide duration for track (in deciseconds, aka seconds*10)", "Track Duration")
if(!duration)
return
// Optional
- var/artist = input(C, "Optional: Provide artist for track", "Track Artist") as text|null
+ var/artist = tgui_input_text(C, "Optional: Provide artist for track", "Track Artist")
if(isnull(artist)) // Cancel rather than empty string
return
@@ -428,7 +428,7 @@
if(!check_rights(R_FUN|R_ADMIN))
return
- var/track = input(C, "Input track title or URL to remove (must be exact)", "Remove Track") as text|null
+ var/track = tgui_input_text(C, "Input track title or URL to remove (must be exact)", "Remove Track")
if(!track)
return
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 2ea821b3e9f..6152f07df36 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -111,7 +111,7 @@ Class Procs:
var/clickvol = 40 // volume
var/interact_offline = 0 // Can the machine be interacted with while de-powered.
var/obj/item/weapon/circuitboard/circuit = null
-
+
// 0.0 - 1.0 multipler for prob() based on bullet structure damage
// So if this is 1.0 then a 100 damage bullet will always break this structure
// If this is 0.5 then a 50 damage bullet will break this structure 25% of the time
@@ -281,7 +281,7 @@ Class Procs:
/obj/machinery/proc/state(var/msg)
for(var/mob/O in hearers(src, null))
- O.show_message("[bicon(src)] [msg]", 2)
+ O.show_message("\icon[src][bicon(src)] [msg]", 2)
/obj/machinery/proc/ping(text=null)
if(!text)
@@ -436,7 +436,7 @@ Class Procs:
for(var/obj/I in contents)
if(istype(I,/obj/item/weapon/card/id))
I.forceMove(src.loc)
-
+
if(!circuit)
return 0
var/obj/structure/frame/A = new /obj/structure/frame(src.loc)
@@ -496,7 +496,7 @@ Class Procs:
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
-
+
var/atom/droploc = drop_location()
if(!droploc || !contents.len) // not even a circuit?
playsound(src, 'sound/machines/machine_die_short.ogg')
@@ -510,17 +510,17 @@ Class Procs:
if(severity != 1)
for(var/obj/item/weapon/card/id/I in contents)
surviving_parts |= I
-
+
// May populate some items to throw around
if(!LAZYLEN(component_parts) && circuit)
circuit.apply_default_parts(src)
-
+
var/survivability
switch(severity)
// No survivors
if(1)
survivability = 0
-
+
// 1 part survives
if(2)
survivability = 0
@@ -531,15 +531,15 @@ Class Procs:
// 50% of parts destroyed on average
if(3)
survivability = 50
-
+
// No parts destroyed, but you lose the frame
else
survivability = 100
-
+
for(var/atom/movable/P in contents)
if(prob(survivability))
surviving_parts |= P
-
+
if(circuit && severity >= 2)
var/datum/frame/frame_types/FT = circuit.board_type
if(istype(FT))
diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm
index 603baf20df5..6bfd03372c4 100644
--- a/code/game/machinery/magnet.dm
+++ b/code/game/machinery/magnet.dm
@@ -314,7 +314,7 @@
if(speed <= 0)
speed = 1
if("setpath")
- var/newpath = sanitize(input(usr, "Please define a new path!",,path) as text|null)
+ var/newpath = sanitize(tgui_input_text(usr, "Please define a new path!",,path))
if(newpath && newpath != "")
moving = 0 // stop moving
path = newpath
diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm
index 7f200a4d0f7..7e30fc58089 100644
--- a/code/game/machinery/mass_driver.dm
+++ b/code/game/machinery/mass_driver.dm
@@ -28,7 +28,7 @@
if(istype(I, /obj/item/device/multitool))
if(panel_open)
- var/input = sanitize(input(usr, "What id would you like to give this conveyor?", "Multitool-Conveyor interface", id))
+ var/input = sanitize(tgui_input_text(usr, "What id would you like to give this conveyor?", "Multitool-Conveyor interface", id))
if(!input)
to_chat(usr, "No input found please hang up and try your call again.")
return
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index a0e5014606d..056ef1727a8 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -150,7 +150,7 @@ Transponder Codes:"}
usr.set_machine(src)
if(href_list["locedit"])
- var/newloc = sanitize(input(usr, "Enter New Location", "Navigation Beacon", location) as text|null)
+ var/newloc = sanitize(tgui_input_text(usr, "Enter New Location", "Navigation Beacon", location))
if(newloc)
location = newloc
updateDialog()
@@ -158,12 +158,12 @@ Transponder Codes:"}
else if(href_list["edit"])
var/codekey = href_list["code"]
- var/newkey = input(usr, "Enter Transponder Code Key", "Navigation Beacon", codekey) as text|null
+ var/newkey = tgui_input_text(usr, "Enter Transponder Code Key", "Navigation Beacon", codekey)
if(!newkey)
return
var/codeval = codes[codekey]
- var/newval = input(usr, "Enter Transponder Code Value", "Navigation Beacon", codeval) as text|null
+ var/newval = tgui_input_text(usr, "Enter Transponder Code Value", "Navigation Beacon", codeval)
if(!newval)
newval = codekey
return
@@ -180,11 +180,11 @@ Transponder Codes:"}
else if(href_list["add"])
- var/newkey = input(usr, "Enter New Transponder Code Key", "Navigation Beacon") as text|null
+ var/newkey = tgui_input_text(usr, "Enter New Transponder Code Key", "Navigation Beacon")
if(!newkey)
return
- var/newval = input(usr, "Enter New Transponder Code Value", "Navigation Beacon") as text|null
+ var/newval = tgui_input_text(usr, "Enter New Transponder Code Value", "Navigation Beacon")
if(!newval)
newval = "1"
return
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index bd807f5d49a..d1149771b1b 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -447,7 +447,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster)
return TRUE
if("set_new_message")
- msg = sanitize(tgui_input_message(usr, "Write your Feed story", "Network Channel Handler"))
+ msg = sanitize(tgui_input_text(usr, "Write your Feed story", "Network Channel Handler", multiline = TRUE, prevent_enter = TRUE))
return TRUE
if("set_new_title")
diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm
index 705914f7946..c63ea1f1d82 100644
--- a/code/game/machinery/overview.dm
+++ b/code/game/machinery/overview.dm
@@ -138,7 +138,7 @@
var/icon/I = imap[1+(ix + icx*iy)*2]
var/icon/I2 = imap[2+(ix + icx*iy)*2]
- //to_world("icon: [bicon(I)]")
+ //to_world("icon: \icon[I][bicon(I)]")
I.DrawBox(colour, rx, ry, rx+1, ry+1)
@@ -153,7 +153,7 @@
H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]"
- //to_world("[bicon(I)] at [H.screen_loc]")
+ //to_world("\icon[I][bicon(I)] at [H.screen_loc]")
H.name = (i==0)?"maprefresh":"map"
@@ -266,7 +266,7 @@
//to_world("trying [ix],[iy] : [ix+icx*iy]")
var/icon/I = imap[1+(ix + icx*iy)]
- //to_world("icon: [bicon(I)]")
+ //to_world("icon: \icon[I][bicon(I)]")
I.DrawBox(colour, rx, ry, rx, ry)
@@ -279,7 +279,7 @@
H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]"
- //to_world("[bicon(I)] at [H.screen_loc]")
+ //to_world("\icon[I][bicon(I)] at [H.screen_loc]")
H.name = (i==0)?"maprefresh":"map"
diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm
index 68ac2e2a3f7..f19b80befc7 100644
--- a/code/game/machinery/pointdefense.dm
+++ b/code/game/machinery/pointdefense.dm
@@ -94,7 +94,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
/obj/machinery/pointdefense_control/attackby(var/obj/item/W, var/mob/user)
if(W?.is_multitool())
- var/new_ident = input(user, "Enter a new ident tag.", "[src]", id_tag) as null|text
+ var/new_ident = tgui_input_text(user, "Enter a new ident tag.", "[src]", id_tag)
if(new_ident && new_ident != id_tag && user.Adjacent(src) && CanInteract(user, GLOB.tgui_physical_state))
// Check for duplicate controllers with this ID
for(var/obj/machinery/pointdefense_control/PC as anything in pointdefense_controllers)
@@ -211,7 +211,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
/obj/machinery/power/pointdefense/attackby(var/obj/item/W, var/mob/user)
if(W?.is_multitool())
- var/new_ident = input(user, "Enter a new ident tag.", "[src]", id_tag) as null|text
+ var/new_ident = tgui_input_text(user, "Enter a new ident tag.", "[src]", id_tag)
if(new_ident && new_ident != id_tag && user.Adjacent(src) && CanInteract(user, GLOB.tgui_physical_state))
to_chat(user, "You register [src] with the [new_ident] network.")
id_tag = new_ident
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 359410f4944..f1e81995963 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -422,7 +422,7 @@
return
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
- ui = new(user, src, "PortableTurret", name, 500, 400)
+ ui = new(user, src, "PortableTurret", name, ui_x = 500, ui_y = 400)
ui.open()
/obj/machinery/porta_turret/tgui_data(mob/user)
@@ -1092,7 +1092,7 @@
return
if(istype(I, /obj/item/weapon/pen)) //you can rename turrets like bots!
- var/t = sanitizeSafe(input(user, "Enter new turret name", name, finish_name) as text, MAX_NAME_LEN)
+ var/t = sanitizeSafe(tgui_input_text(user, "Enter new turret name", name, finish_name, MAX_NAME_LEN), MAX_NAME_LEN)
if(!t)
return
if(!in_range(src, usr) && loc != usr)
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 491aa22457e..ea2854480a8 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -10,7 +10,7 @@
active_power_usage = 40000 //40 kW
var/efficiency = 40000 //will provide the modified power rate when upgraded
var/obj/item/charging = null
- var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/modular_computer, /obj/item/weapon/computer_hardware/battery_module, /obj/item/weapon/cell, /obj/item/device/suit_cooling_unit/emergency, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric, /obj/item/ammo_magazine/smart, /obj/item/device/flash, /obj/item/device/defib_kit, /obj/item/ammo_casing/microbattery) //VOREStation Add - NSFW Batteries
+ var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/modular_computer, /obj/item/weapon/computer_hardware/battery_module, /obj/item/weapon/cell, /obj/item/device/suit_cooling_unit/emergency, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric, /obj/item/ammo_magazine/smart, /obj/item/device/flash, /obj/item/device/defib_kit, /obj/item/ammo_casing/microbattery, /obj/item/device/paicard) //VOREStation Add - NSFW Batteries
var/icon_state_charged = "recharger2"
var/icon_state_charging = "recharger1"
var/icon_state_idle = "recharger0" //also when unpowered
@@ -68,9 +68,21 @@
if(EW.use_external_power)
to_chat(user, "\The [EW] has no recharge port.")
return
- if(!G.get_cell() && !istype(G, /obj/item/ammo_casing/microbattery)) //VOREStation Edit: NSFW charging
+ if(!G.get_cell() && !istype(G, /obj/item/ammo_casing/microbattery) && !istype(G, /obj/item/device/paicard)) //VOREStation Edit: NSFW charging
to_chat(user, "\The [G] does not have a battery installed.")
return
+ if(istype(G, /obj/item/device/paicard))
+ var/obj/item/device/paicard/ourcard = G
+ if(ourcard.panel_open)
+ to_chat(user, "\The [ourcard] won't fit in the recharger with its panel open.")
+ return
+ if(ourcard.pai)
+ if(ourcard.pai.stat == CONSCIOUS)
+ to_chat(user, "\The [ourcard] boops... it doesn't need to be recharged!")
+ return
+ else
+ to_chat(user, "\The [ourcard] doesn't have a personality!")
+ return
user.drop_item()
G.loc = src
@@ -122,6 +134,25 @@
if(!charging)
update_use_power(USE_POWER_IDLE)
icon_state = icon_state_idle
+ //VOREStation Edit Start - pAI revival!
+ else if(istype(charging, /obj/item/device/paicard))
+ var/obj/item/device/paicard/pcard = charging
+ if(pcard.is_damage_critical())
+ pcard.forceMove(get_turf(src))
+ charging = null
+ pcard.damage_random_component()
+ update_icon()
+ else if(pcard.pai.bruteloss)
+ pcard.pai.adjustBruteLoss(-5)
+ else if(pcard.pai.fireloss)
+ pcard.pai.adjustFireLoss(-5)
+ else
+ charging = null
+ update_icon()
+ src.visible_message("\The [src] ejects the [pcard]!")
+ pcard.forceMove(get_turf(src))
+ pcard.pai.full_restore()
+ //VOREStation Edit End
else
var/obj/item/weapon/cell/C = charging.get_cell()
if(istype(C))
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index a1d44b98389..d2adbad8daf 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -198,7 +198,7 @@
desc += " It is capable of repairing burn damage."
/obj/machinery/recharge_station/proc/build_overlays()
- cut_overlay()
+ cut_overlays()
switch(round(chargepercentage()))
if(1 to 20)
add_overlay("statn_c0")
@@ -323,4 +323,4 @@
icon_state = "borg_pod_opened"
if(icon_update_tick == 0)
- build_overlays()
\ No newline at end of file
+ build_overlays()
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index 860c67646c9..300d76b685d 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -110,7 +110,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
/obj/machinery/requests_console/update_icon()
cut_overlays()
-
+
if(stat & NOPOWER)
set_light(0)
set_light_on(FALSE)
@@ -157,15 +157,15 @@ var/list/obj/machinery/requests_console/allConsoles = list()
/obj/machinery/requests_console/tgui_act(action, list/params)
if(..())
return TRUE
-
+
add_fingerprint(usr)
-
+
switch(action)
if("write")
if(reject_bad_text(params["write"]))
recipient = params["write"] //write contains the string of the receiving department's name
- var/new_message = sanitize(input(usr, "Write your message:", "Awaiting Input", ""))
+ var/new_message = sanitize(tgui_input_text(usr, "Write your message:", "Awaiting Input", ""))
if(new_message)
message = new_message
screen = RCS_MESSAUTH
@@ -181,7 +181,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
. = TRUE
if("writeAnnouncement")
- var/new_message = sanitize(input(usr, "Write your message:", "Awaiting Input", ""))
+ var/new_message = sanitize(tgui_input_text(usr, "Write your message:", "Awaiting Input", ""))
if(new_message)
message = new_message
else
@@ -210,7 +210,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
screen = RCS_SENTPASS
message_log += list(list("Message sent to [recipient]", "[message]"))
else
- audible_message(text("[bicon(src)] *The Requests Console beeps: 'NOTICE: No server detected!'"),,4)
+ audible_message(text("\icon[src][bicon(src)] *The Requests Console beeps: 'NOTICE: No server detected!'"),,4)
. = TRUE
//Handle printing
@@ -250,7 +250,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
if(computer_deconstruction_screwdriver(user, O))
return
if(istype(O, /obj/item/device/multitool))
- var/input = sanitize(input(usr, "What Department ID would you like to give this request console?", "Multitool-Request Console Interface", department))
+ var/input = sanitize(tgui_input_text(usr, "What Department ID would you like to give this request console?", "Multitool-Request Console Interface", department))
if(!input)
to_chat(usr, "No input found. Please hang up and try your call again.")
return
diff --git a/code/game/machinery/suit_cycler_datums.dm b/code/game/machinery/suit_cycler_datums.dm
index 9938af1cd01..1a9d0d9bce3 100644
--- a/code/game/machinery/suit_cycler_datums.dm
+++ b/code/game/machinery/suit_cycler_datums.dm
@@ -346,3 +346,5 @@ GLOBAL_LIST_EMPTY(suit_cycler_emagged)
name = SPECIES_SERGAL
/datum/suit_cycler_choice/species/vulpkanin
name = SPECIES_VULPKANIN
+/datum/suit_cycler_choice/species/altevian
+ name = SPECIES_ALTEVIAN
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index d5672c78884..7a59222a234 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -519,7 +519,7 @@ GLOBAL_LIST_EMPTY(suit_cycler_typecache)
/datum/suit_cycler_choice/department/sec/riot,
/datum/suit_cycler_choice/department/sec/eva
)
-
+
/// Species that the cycler can refit suits for. Null assumes all except specially excluded ones.
var/list/limit_species
@@ -544,13 +544,13 @@ GLOBAL_LIST_EMPTY(suit_cycler_typecache)
species = load_species()
emagged_departments = load_emagged()
limit_departments = null // just for mem
-
+
target_department = departments["No Change"]
target_species = species["No Change"]
if(!target_department || !target_species)
stat |= BROKEN
-
+
wires = new(src)
/obj/machinery/suit_cycler/Destroy()
@@ -704,7 +704,7 @@ GLOBAL_LIST_EMPTY(suit_cycler_typecache)
/obj/machinery/suit_cycler/vintage/rugged
name = "Vintage Ruggedized suit cycler"
model_text = "Vintage Ruggedized"
-
+
limit_departments = list(
/datum/suit_cycler_choice/department/vintage/eng,
/datum/suit_cycler_choice/department/vintage/marine,
@@ -925,17 +925,17 @@ GLOBAL_LIST_EMPTY(suit_cycler_typecache)
/obj/machinery/suit_cycler/tgui_static_data(mob/user)
var/list/data = list()
-
+
// tgui gets angy if you pass values too
var/list/department_keys = list()
for(var/key in departments)
department_keys += key
-
+
// emagged at the bottom
if(emagged)
for(var/key in emagged_departments)
department_keys += key
-
+
var/list/species_keys = list()
for(var/key in species)
species_keys += key
@@ -943,7 +943,7 @@ GLOBAL_LIST_EMPTY(suit_cycler_typecache)
data["departments"] = department_keys
data["species"] = species_keys
- return data
+ return data
/obj/machinery/suit_cycler/tgui_act(action, params)
if(..())
@@ -1063,7 +1063,7 @@ GLOBAL_LIST_EMPTY(suit_cycler_typecache)
/obj/machinery/suit_cycler/proc/finished_job()
var/turf/T = get_turf(src)
- T.visible_message("[bicon(src)]The [src] beeps several times.")
+ T.visible_message("\icon[src][bicon(src)]The [src] beeps several times.")
icon_state = initial(icon_state)
active = 0
playsound(src, 'sound/machines/boobeebeep.ogg', 50)
@@ -1114,7 +1114,7 @@ GLOBAL_LIST_EMPTY(suit_cycler_typecache)
/obj/machinery/suit_cycler/proc/apply_paintjob()
if(!target_species || !target_department)
return
-
+
// Helmet to new paint
if(target_department.can_refit_helmet(helmet))
target_department.do_refit_helmet(helmet)
@@ -1129,6 +1129,5 @@ GLOBAL_LIST_EMPTY(suit_cycler_typecache)
if(target_species.can_refit_to(helmet, suit, suit?.helmet))
target_species.do_refit_to(helmet, suit, suit?.helmet)
else
- visible_message("[bicon(src)]Unable to apply specified cosmetics with specified species. Please try again with a different species or cosmetic option selected.")
+ visible_message("\icon[src][bicon(src)]Unable to apply specified cosmetics with specified species. Please try again with a different species or cosmetic option selected.")
return
-
\ No newline at end of file
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index f74a38e40e4..2ca40122dbb 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -450,7 +450,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
var/part_b_extra = ""
if(data == DATA_ANTAG) // intercepted radio message
part_b_extra = " (Intercepted)"
- var/part_a = "[bicon(radio)]\[[freq_text]\][part_b_extra] " // goes in the actual output
+ var/part_a = "\icon[radio][bicon(radio)]\[[freq_text]\][part_b_extra] " // goes in the actual output
// --- Some more pre-message formatting ---
var/part_b = " " // Tweaked for security headsets -- TLE
@@ -652,7 +652,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// Create a radio headset for the sole purpose of using its icon
var/obj/item/device/radio/headset/radio = new
- var/part_b = " [bicon(radio)]\[[freq_text]\][part_b_extra] " // Tweaked for security headsets -- TLE
+ var/part_b = "\icon[radio][bicon(radio)]\[[freq_text]\][part_b_extra] " // Tweaked for security headsets -- TLE
var/part_blackbox_b = " \[[freq_text]\] " // Tweaked for security headsets -- TLE
var/part_c = ""
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index c896b77f37b..461a2004817 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -26,13 +26,13 @@
data["network"] = network
data["temp"] = temp
- var/list/servers = list()
+ var/list/serverData = list()
for(var/obj/machinery/telecomms/T in servers)
- servers.Add(list(list(
+ serverData.Add(list(list(
"id" = T.id,
"name" = T.name,
)))
- data["servers"] = servers
+ data["servers"] = serverData
data["selectedServer"] = null
if(SelectedServer)
@@ -128,7 +128,7 @@
. = TRUE
if("network")
- var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text
+ var/newnet = tgui_input_text(usr, "Which network do you want to view?", "Comm Monitor", network)
if(newnet && ((usr in range(1, src) || issilicon(usr))))
if(length(newnet) > 15)
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index c91881f0c32..1a9fc2246e1 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -288,14 +288,14 @@
. = TRUE
if("id")
- var/newid = copytext(reject_bad_text(input(usr, "Specify the new ID for this machine", src, id) as null|text),1,MAX_MESSAGE_LEN)
+ var/newid = copytext(reject_bad_text(tgui_input_text(usr, "Specify the new ID for this machine", src, id)),1,MAX_MESSAGE_LEN)
if(newid && canAccess(usr))
id = newid
set_temp("-% New ID assigned: \"[id]\" %-", "average")
. = TRUE
if("network")
- var/newnet = input(usr, "Specify the new network for this machine. This will break all current links.", src, network) as null|text
+ var/newnet = tgui_input_text(usr, "Specify the new network for this machine. This will break all current links.", src, network)
if(newnet && canAccess(usr))
if(length(newnet) > 15)
diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm
index 5a79f08be04..3014474b8ea 100644
--- a/code/game/machinery/telecomms/telemonitor.dm
+++ b/code/game/machinery/telecomms/telemonitor.dm
@@ -26,13 +26,13 @@
data["network"] = network
data["temp"] = temp
- var/list/machinelist = list()
+ var/list/machinelistData = list()
for(var/obj/machinery/telecomms/T in machinelist)
- machinelist.Add(list(list(
+ machinelistData.Add(list(list(
"id" = T.id,
"name" = T.name,
)))
- data["machinelist"] = machinelist
+ data["machinelist"] = machinelistData
data["selectedMachine"] = null
if(SelectedMachine)
@@ -100,7 +100,7 @@
. = TRUE
if("network")
- var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text
+ var/newnet = tgui_input_text(usr, "Which network do you want to view?", "Comm Monitor", network)
if(newnet && ((usr in range(1, src) || issilicon(usr))))
if(length(newnet) > 15)
set_temp("FAILED: NETWORK TAG STRING TOO LENGTHY", "bad")
diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm
index 4565ab1668d..cf7f9946aae 100644
--- a/code/game/machinery/telecomms/traffic_control.dm
+++ b/code/game/machinery/telecomms/traffic_control.dm
@@ -192,7 +192,7 @@
if(href_list["network"])
- var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text
+ var/newnet = tgui_input_text(usr, "Which network do you want to view?", "Comm Monitor", network)
if(newnet && ((usr in range(1, src) || issilicon(usr))))
if(length(newnet) > 15)
diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm
index b5468fed4d3..154e243419b 100644
--- a/code/game/machinery/turret_control.dm
+++ b/code/game/machinery/turret_control.dm
@@ -128,7 +128,7 @@
/obj/machinery/turretid/tgui_interact(mob/user, datum/tgui/ui = null)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
- ui = new(user, src, "PortableTurret", name) // 500, 400
+ ui = new(user, src, "PortableTurret", name, ui_x = 500, ui_y = 400) // 500, 400
ui.open()
/obj/machinery/turretid/tgui_data(mob/user)
diff --git a/code/game/machinery/virtual_reality/ar_console.dm b/code/game/machinery/virtual_reality/ar_console.dm
index 6cf182e1067..904c4395962 100644
--- a/code/game/machinery/virtual_reality/ar_console.dm
+++ b/code/game/machinery/virtual_reality/ar_console.dm
@@ -103,7 +103,7 @@
occupant.enter_vr(avatar)
- var/newname = sanitize(input(avatar, "Your mind feels foggy. You're certain your name is [occupant.real_name], but it could also be [avatar.name]. Would you like to change it to something else?", "Name change") as null|text, MAX_NAME_LEN)
+ var/newname = sanitize(tgui_input_text(avatar, "Your mind feels foggy. You're certain your name is [occupant.real_name], but it could also be [avatar.name]. Would you like to change it to something else?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
if (newname)
avatar.real_name = newname
@@ -113,7 +113,7 @@
else
// There's only one body per one of these pods, so let's be kind.
- var/newname = sanitize(input(avatar, "Your mind feels foggy. You're certain your name is [occupant.real_name], but it feels like it is [avatar.name]. Would you like to change it to something else?", "Name change") as null|text, MAX_NAME_LEN)
+ var/newname = sanitize(tgui_input_text(avatar, "Your mind feels foggy. You're certain your name is [occupant.real_name], but it feels like it is [avatar.name]. Would you like to change it to something else?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
if(newname)
avatar.real_name = newname
diff --git a/code/game/machinery/virtual_reality/vr_console.dm b/code/game/machinery/virtual_reality/vr_console.dm
index 13e38ef8d1c..98cf47f6620 100644
--- a/code/game/machinery/virtual_reality/vr_console.dm
+++ b/code/game/machinery/virtual_reality/vr_console.dm
@@ -250,7 +250,7 @@
occupant.enter_vr(avatar)
// Prompt for username after they've enterred the body.
- var/newname = sanitize(input(avatar, "You are entering virtual reality. Your username is currently [src.name]. Would you like to change it to something else?", "Name change") as null|text, MAX_NAME_LEN)
+ var/newname = sanitize(tgui_input_text(avatar, "You are entering virtual reality. Your username is currently [src.name]. Would you like to change it to something else?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
if (newname)
avatar.real_name = newname
diff --git a/code/game/magic/archived_book.dm b/code/game/magic/archived_book.dm
index ed77f3c90b6..1aab354815a 100644
--- a/code/game/magic/archived_book.dm
+++ b/code/game/magic/archived_book.dm
@@ -40,7 +40,7 @@ var/global/datum/book_manager/book_mgr = new()
to_chat(src, "Only administrators may use this command.")
return
- var/isbn = input(usr, "ISBN number?", "Delete Book") as num | null
+ var/isbn = tgui_input_number(usr, "ISBN number?", "Delete Book")
if(!isbn)
return
diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index 85af948f96e..7184fc3364c 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -272,7 +272,7 @@
/obj/item/mecha_parts/mecha_equipment/proc/occupant_message(message)
if(chassis)
- chassis.occupant_message("[bicon(src)] [message]")
+ chassis.occupant_message("\icon[src][bicon(src)] [message]")
return
/obj/item/mecha_parts/mecha_equipment/proc/log_message(message)
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 01f8a5ef6d4..9852db29d5e 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -91,4 +91,10 @@
if(!isnull(M.accuracy))
P.accuracy += M.accuracy
if(!isnull(M.accuracy_dispersion))
- P.dispersion = max(P.dispersion + M.accuracy_dispersion, 0)
\ No newline at end of file
+ P.dispersion = max(P.dispersion + M.accuracy_dispersion, 0)
+
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(H.species)
+ P.accuracy += H.species.gun_accuracy_mod
+ P.dispersion = max(P.dispersion + H.species.gun_accuracy_dispersion_mod, 0)
\ No newline at end of file
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 7e4bc6ed87f..ff6fe6e8a4b 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -653,20 +653,20 @@
switch(emagged)
if(0)
emagged = 0.5
- visible_message("[bicon(src)] [src] beeps: \"DB error \[Code 0x00F1\]\"")
+ visible_message("\icon[src][bicon(src)] [src] beeps: \"DB error \[Code 0x00F1\]\"")
sleep(10)
- visible_message("[bicon(src)] [src] beeps: \"Attempting auto-repair\"")
+ visible_message("\icon[src][bicon(src)] [src] beeps: \"Attempting auto-repair\"")
sleep(15)
- visible_message("[bicon(src)] [src] beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"")
+ visible_message("\icon[src][bicon(src)] [src] beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"")
sleep(30)
- visible_message("[bicon(src)] [src] beeps: \"User DB truncated. Please contact your [using_map.company_name] system operator for future assistance.\"")
+ visible_message("\icon[src][bicon(src)] [src] beeps: \"User DB truncated. Please contact your [using_map.company_name] system operator for future assistance.\"")
req_access = null
emagged = 1
return 1
if(0.5)
- visible_message("[bicon(src)] [src] beeps: \"DB not responding \[Code 0x0003\]...\"")
+ visible_message("\icon[src][bicon(src)] [src] beeps: \"DB not responding \[Code 0x0003\]...\"")
if(1)
- visible_message("[bicon(src)] [src] beeps: \"No records in User DB\"")
+ visible_message("\icon[src][bicon(src)] [src] beeps: \"No records in User DB\"")
/obj/machinery/mecha_part_fabricator/proc/eject_materials(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything
var/recursive = amount == -1 ? TRUE : FALSE
diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm
index 3be1fdeec7f..2c58350cf92 100644
--- a/code/game/mecha/mech_prosthetics.dm
+++ b/code/game/mecha/mech_prosthetics.dm
@@ -61,6 +61,7 @@
"Cyborg Parts",
"Cyborg Internals",
"Cybernetics",
+ "pAI Parts", //VOREStation Add
"Implants",
"Control Interfaces",
"Other",
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index defeb0fbcff..4f9c96477cc 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -547,7 +547,7 @@
if(equipment?.len)
. += "It's equipped with:"
for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
- . += "[bicon(ME)] [ME]"
+ . += "\icon[ME][bicon(ME)] [ME]"
/obj/mecha/proc/drop_item()//Derpfix, but may be useful in future for engineering exosuits.
return
@@ -570,7 +570,6 @@
/obj/mecha/proc/show_radial_occupant(var/mob/user)
var/list/choices = list(
- "Eject" = radial_image_eject,
"Toggle Airtank" = radial_image_airtoggle,
"Toggle Light" = radial_image_lighttoggle,
"View Stats" = radial_image_statpanel
@@ -582,9 +581,6 @@
if(!choice)
return
switch(choice)
- if("Eject")
- go_out()
- add_fingerprint(usr)
if("Toggle Airtank")
use_internal_tank = !use_internal_tank
occupant_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].")
@@ -2447,7 +2443,7 @@
/obj/mecha/proc/occupant_message(message as text)
if(message)
if(src.occupant && src.occupant.client)
- to_chat(src.occupant, "[bicon(src)] [message]")
+ to_chat(src.occupant, "\icon[src][bicon(src)] [message]")
return
/obj/mecha/proc/log_message(message as text,red=null)
@@ -2549,7 +2545,7 @@
return
if (href_list["change_name"])
if(usr != src.occupant) return
- var/newname = sanitizeSafe(input(occupant,"Choose new exosuit name","Rename exosuit",initial(name)) as text, MAX_NAME_LEN)
+ var/newname = sanitizeSafe(tgui_input_text(occupant,"Choose new exosuit name","Rename exosuit",initial(name), MAX_NAME_LEN), MAX_NAME_LEN)
if(newname)
name = newname
else
@@ -2588,7 +2584,7 @@
if(!in_range(src, usr)) return
var/mob/user = top_filter.getMob("user")
if(user)
- var/new_pressure = input(user,"Input new output pressure","Pressure setting",internal_tank_valve) as num
+ var/new_pressure = tgui_input_number(user,"Input new output pressure","Pressure setting",internal_tank_valve)
if(new_pressure)
internal_tank_valve = new_pressure
to_chat(user, "The internal pressure valve has been set to [internal_tank_valve]kPa.")
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index aa5226c172f..1c5003ac95d 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -48,7 +48,7 @@
if("send_message")
var/obj/item/mecha_parts/mecha_tracking/MT = locate(params["mt"])
if(istype(MT))
- var/message = sanitize(input(usr, "Input message", "Transmit message") as text)
+ var/message = sanitize(tgui_input_text(usr, "Input message", "Transmit message"))
var/obj/mecha/M = MT.in_mecha()
if(message && M)
M.occupant_message(message)
diff --git a/code/game/mecha/micro/micro.dm b/code/game/mecha/micro/micro.dm
index a30af28aa3e..97d6728f54e 100644
--- a/code/game/mecha/micro/micro.dm
+++ b/code/game/mecha/micro/micro.dm
@@ -121,7 +121,7 @@
/obj/mecha/micro/move_inside()
var/mob/living/carbon/C = usr
- if (C.size_multiplier >= 0.5)
+ if (C.get_effective_size(TRUE) >= 0.5)
to_chat(C, "You can't fit in this suit!")
return
else
@@ -129,7 +129,7 @@
/obj/mecha/micro/move_inside_passenger()
var/mob/living/carbon/C = usr
- if (C.size_multiplier >= 0.5)
+ if (C.get_effective_size(TRUE) >= 0.5)
to_chat(C, "You can't fit in this suit!")
return
else
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 411492f68c4..b5510c38f2a 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -52,7 +52,7 @@ var/global/list/image/splatter_cache=list()
addtimer(CALLBACK(src, .proc/dry), DRYING_TIME * (amount+1))
/obj/effect/decal/cleanable/blood/update_icon()
- if(basecolor == "rainbow") basecolor = "#[get_random_colour(1)]"
+ if(basecolor == "rainbow") basecolor = get_random_colour(1)
color = basecolor
if(basecolor == SYNTH_BLOOD_COLOUR)
@@ -184,11 +184,11 @@ var/global/list/image/splatter_cache=list()
var/image/giblets = new(base_icon, "[icon_state]_flesh", dir)
if(!fleshcolor || fleshcolor == "rainbow")
- fleshcolor = "#[get_random_colour(1)]"
+ fleshcolor = get_random_colour(1)
giblets.color = fleshcolor
var/icon/blood = new(base_icon,"[icon_state]",dir)
- if(basecolor == "rainbow") basecolor = "#[get_random_colour(1)]"
+ if(basecolor == "rainbow") basecolor = get_random_colour(1)
blood.Blend(basecolor,ICON_MULTIPLY)
icon = blood
diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm
index 637cd1f6bd0..f893fac6a22 100644
--- a/code/game/objects/effects/decals/Cleanable/misc.dm
+++ b/code/game/objects/effects/decals/Cleanable/misc.dm
@@ -38,6 +38,12 @@
icon_state = "dirt"
mouse_opacity = 0
+/obj/effect/decal/cleanable/Initialize(var/mapload, var/_age)
+ .=..()
+ var/turf/simulated/our_turf = src.loc
+ if(our_turf && istype(our_turf) && our_turf.can_dirty && _age)
+ our_turf.dirt = 101
+
/obj/effect/decal/cleanable/flour
name = "flour"
desc = "It's still good. Four second rule!"
diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm
index 18f0112ddaa..0adf60573fb 100644
--- a/code/game/objects/effects/spawners/bombspawner.dm
+++ b/code/game/objects/effects/spawners/bombspawner.dm
@@ -7,13 +7,13 @@
var/obj/effect/spawner/newbomb/proto = /obj/effect/spawner/newbomb/radio/custom
- var/p = input(usr, "Enter phoron amount (mol):","Phoron", initial(proto.phoron_amt)) as num|null
+ var/p = tgui_input_number(usr, "Enter phoron amount (mol):","Phoron", initial(proto.phoron_amt))
if(p == null) return
- var/o = input(usr, "Enter oxygen amount (mol):","Oxygen", initial(proto.oxygen_amt)) as num|null
+ var/o = tgui_input_number(usr, "Enter oxygen amount (mol):","Oxygen", initial(proto.oxygen_amt))
if(o == null) return
- var/c = input(usr, "Enter carbon dioxide amount (mol):","Carbon Dioxide", initial(proto.carbon_amt)) as num|null
+ var/c = tgui_input_number(usr, "Enter carbon dioxide amount (mol):","Carbon Dioxide", initial(proto.carbon_amt))
if(c == null) return
new /obj/effect/spawner/newbomb/radio/custom(get_turf(mob), p, o, c)
diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index 53c562f712e..07806868f1f 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -269,7 +269,7 @@
walk_to(src, target_atom, 5)
if(prob(25))
src.visible_message("\The [src] skitters[pick(" away"," around","")].")
- else if(prob(5))
+ else if(amount_grown < 75 && prob(5))
//vent crawl!
for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
if(!v.welded)
diff --git a/code/game/objects/explosion_recursive.dm b/code/game/objects/explosion_recursive.dm
index 400820f49fa..a8067805a25 100644
--- a/code/game/objects/explosion_recursive.dm
+++ b/code/game/objects/explosion_recursive.dm
@@ -1,5 +1,5 @@
/client/proc/kaboom()
- var/power = input(src, "power?", "power?") as num
+ var/power = tgui_input_number(src, "power?", "power?")
var/turf/T = get_turf(src.mob)
explosion_rec(T, power)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 12e0c29cf5f..b7ccc159597 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -107,6 +107,8 @@
var/tip_timer // reference to timer id for a tooltip we might open soon
+ var/no_random_knockdown = FALSE //stops item from being able to randomly knock people down in combat
+
/obj/item/Initialize()
. = ..()
if(embed_chance < 0)
@@ -157,6 +159,10 @@
var/obj/item/organ/external/hand = H.organs_by_name[check_hand]
if(istype(hand) && hand.is_usable())
return TRUE
+ var/mob/living/simple_mob/S = M
+ if(istype(S) && S.has_hands) //Are they a mob? And do they have hands?
+ return TRUE
+
return FALSE
@@ -252,6 +258,15 @@
var/obj/effect/temporary_effect/item_pickup_ghost/ghost = new(old_loc)
ghost.assumeform(src)
ghost.animate_towards(user)
+ //VORESTATION EDIT START. This handles possessed items.
+ if(src.possessed_voice && src.possessed_voice.len && !(user.ckey in warned_of_possession)) //Is this item possessed?
+ warned_of_possession |= user.ckey
+ tgui_alert_async(user,{"
+ THIS ITEM IS POSSESSED BY A PLAYER CURRENTLY IN THE ROUND. This could be by anomalous means or otherwise.
+ If this is not something you wish to partake in, it is highly suggested you place the item back down.
+ If this is fine to you, ensure that the other player is fine with you doing things to them beforehand!
+ "},"OOC Warning")
+ //VORESTATION EDIT END.
return
/obj/item/attack_ai(mob/user as mob)
@@ -810,8 +825,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
standing.alpha = alpha
standing.color = color
standing.layer = layer2use
- if(istype(clip_mask)) //VOREStation Edit - For taur bodies/tails clipping off parts of uniforms and suits.
- standing.filters += filter(type = "alpha", icon = clip_mask)
if(istype(clip_mask)) //For taur bodies/tails clipping off parts of uniforms and suits.
standing.filters += filter(type = "alpha", icon = clip_mask)
@@ -991,3 +1004,6 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen
// this gets called when the item gets chucked by the vending machine
/obj/item/proc/vendor_action(var/obj/machinery/vending/V)
return
+
+/obj/item/proc/on_holder_escape(var/obj/item/weapon/holder/H)
+ return
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index 00183ec90cf..e8ea1b16c91 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -141,7 +141,7 @@
to_chat(usr, "Error! Please notify administration!")
return
var/list/turf/turfs = res
- var/str = sanitizeSafe(input(usr, "New area name:","Blueprint Editing", ""), MAX_NAME_LEN)
+ var/str = sanitizeSafe(tgui_input_text(usr, "New area name:","Blueprint Editing", "", MAX_NAME_LEN), MAX_NAME_LEN)
if(!str || !length(str)) //cancel
return
if(length(str) > 50)
@@ -200,7 +200,7 @@
/obj/item/blueprints/proc/edit_area()
var/area/A = get_area()
var/prevname = "[A.name]"
- var/str = sanitizeSafe(input(usr, "New area name:","Blueprint Editing", prevname), MAX_NAME_LEN)
+ var/str = sanitizeSafe(tgui_input_text(usr, "New area name:","Blueprint Editing", prevname, MAX_NAME_LEN), MAX_NAME_LEN)
if(!str || !length(str) || str==prevname) //cancel
return
if(length(str) > 50)
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index 70f5155b82d..862d4e6cdaf 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -33,7 +33,7 @@
/obj/structure/closet/body_bag/attackby(var/obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/pen))
- var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
+ var/t = tgui_input_text(user, "What would you like the label to be?", text("[]", src.name), null)
if (user.get_active_hand() != W)
return
if (!in_range(src, user) && src.loc != user)
diff --git a/code/game/objects/items/devices/ai_detector.dm b/code/game/objects/items/devices/ai_detector.dm
index 9e01b5fabf8..4fbc56a0d4d 100644
--- a/code/game/objects/items/devices/ai_detector.dm
+++ b/code/game/objects/items/devices/ai_detector.dm
@@ -94,22 +94,22 @@
if(new_state != old_state)
switch(new_state)
if(PROXIMITY_OFF_CAMERANET)
- to_chat(carrier, "[bicon(src)] Now outside of camera network.")
+ to_chat(carrier, "\icon[src][bicon(src)] Now outside of camera network.")
carrier << 'sound/machines/defib_failed.ogg'
if(PROXIMITY_NONE)
- to_chat(carrier, "[bicon(src)] Now within camera network, AI and cameras unfocused.")
+ to_chat(carrier, "\icon[src][bicon(src)] Now within camera network, AI and cameras unfocused.")
carrier << 'sound/machines/defib_safetyOff.ogg'
if(PROXIMITY_NEAR)
- to_chat(carrier, "[bicon(src)] Warning: AI focus at nearby location.")
+ to_chat(carrier, "\icon[src][bicon(src)] Warning: AI focus at nearby location.")
carrier << 'sound/machines/defib_SafetyOn.ogg'
if(PROXIMITY_ON_SCREEN)
- to_chat(carrier, "[bicon(src)] Alert: AI or camera focused at current location!")
+ to_chat(carrier, "\icon[src][bicon(src)] Alert: AI or camera focused at current location!")
carrier <<'sound/machines/defib_ready.ogg'
if(PROXIMITY_TRACKING)
- to_chat(carrier, "[bicon(src)] Danger: AI is actively tracking you!")
+ to_chat(carrier, "\icon[src][bicon(src)] Danger: AI is actively tracking you!")
carrier << 'sound/machines/defib_success.ogg'
if(PROXIMITY_TRACKING_FAIL)
- to_chat(carrier, "[bicon(src)] Danger: AI is attempting to actively track you, but you are outside of the camera network!")
+ to_chat(carrier, "\icon[src][bicon(src)] Danger: AI is attempting to actively track you, but you are outside of the camera network!")
carrier <<'sound/machines/defib_ready.ogg'
diff --git a/code/game/objects/items/devices/communicator/UI_tgui.dm b/code/game/objects/items/devices/communicator/UI_tgui.dm
index 3759d23d4e8..092b45cea28 100644
--- a/code/game/objects/items/devices/communicator/UI_tgui.dm
+++ b/code/game/objects/items/devices/communicator/UI_tgui.dm
@@ -85,7 +85,7 @@
cam_screen.vis_contents = visible_turfs
cam_background.icon_state = "clear"
cam_background.fill_rect(1, 1, (video_range * 2), (video_range * 2))
-
+
local_skybox.cut_overlays()
local_skybox.add_overlay(SSskybox.get_skybox(get_z(last_camera_turf)))
local_skybox.scale_to_view(video_range * 2)
@@ -322,7 +322,7 @@
. = TRUE
switch(action)
if("rename")
- var/new_name = sanitizeSafe(input(usr,"Please enter your name.","Communicator",usr.name) )
+ var/new_name = sanitizeSafe(tgui_input_text(usr,"Please enter your name.","Communicator",usr.name) )
if(new_name)
register_device(new_name)
@@ -340,6 +340,11 @@
if("toggle_ringer")
ringer = !ringer
+ if("set_ringer_tone")
+ var/ringtone = tgui_input_text(usr, "Set Ringer Tone", "Ringer")
+ if(ringtone)
+ ttone = ringtone
+
if("selfie_mode")
selfie_mode = !selfie_mode
@@ -371,11 +376,13 @@
to_chat(usr, "Error: Cannot connect to Exonet node.")
return FALSE
var/their_address = params["message"]
- var/text = sanitizeSafe(input(usr,"Enter your message.","Text Message"))
+ var/text = sanitizeSafe(tgui_input_text(usr,"Enter your message.","Text Message"))
if(text)
exonet.send_message(their_address, "text", text)
im_list += list(list("address" = exonet.address, "to_address" = their_address, "im" = text))
log_pda("(COMM: [src]) sent \"[text]\" to [exonet.get_atom_from_address(their_address)]", usr)
+ var/obj/item/device/communicator/comm = exonet.get_atom_from_address(their_address)
+ to_chat(usr, "\icon[src][bicon(src)] Sent message to [comm.owner], \"[text]\" (Reply)")
for(var/mob/M in player_list)
if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears))
if(istype(M, /mob/new_player) || M.forbid_seeing_deadchat)
@@ -419,7 +426,7 @@
selected_tab = params["switch_tab"]
if("edit")
- var/n = input(usr, "Please enter message", name, notehtml) as message|null
+ var/n = tgui_input_text(usr, "Please enter message", name, notehtml, multiline = TRUE, prevent_enter = TRUE)
n = sanitizeSafe(n, extra = 0)
if(n)
note = html_decode(n)
diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm
index dce3ad8f3b7..a5b7e4b442b 100644
--- a/code/game/objects/items/devices/communicator/communicator.dm
+++ b/code/game/objects/items/devices/communicator/communicator.dm
@@ -75,6 +75,20 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
// If you turn this on, it changes the way communicator video works. User configurable option.
var/selfie_mode = FALSE
+ // Ringtones! (Based on the PDA ones)
+ var/ttone = "beep" //The ringtone!
+ var/list/ttone_sound = list("beep" = 'sound/machines/twobeep.ogg',
+ "boom" = 'sound/effects/explosionfar.ogg',
+ "slip" = 'sound/misc/slip.ogg',
+ "honk" = 'sound/items/bikehorn.ogg',
+ "SKREE" = 'sound/voice/shriek1.ogg',
+ // "holy" = 'sound/items/PDA/ambicha4-short.ogg',
+ "xeno" = 'sound/voice/hiss1.ogg',
+ "dust" = 'sound/effects/supermatter.ogg',
+ "spark" = 'sound/effects/sparks4.ogg',
+ "rad" = 'sound/items/geiger/high1.ogg',
+ "servo" = 'sound/machines/rig/rigservo.ogg')
+
// Proc: New()
// Parameters: None
// Description: Adds the new communicator to the global list of all communicators, sorts the list, obtains a reference to the Exonet node, then tries to
@@ -128,10 +142,10 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
// Description: Shows all the voice mobs inside the device, and their status.
/obj/item/device/communicator/examine(mob/user)
. = ..()
-
+
for(var/mob/living/voice/voice in contents)
. += "On the screen, you can see a image feed of [voice]."
-
+
if(voice && voice.key)
switch(voice.stat)
if(CONSCIOUS)
@@ -284,7 +298,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
/obj/item/device/communicator/Destroy()
for(var/mob/living/voice/voice in contents)
voice_mobs.Remove(voice)
- to_chat(voice, "[bicon(src)] Connection timed out with remote host.")
+ to_chat(voice, "\icon[src][bicon(src)] Connection timed out with remote host.")
qdel(voice)
close_connection(reason = "Connection timed out")
diff --git a/code/game/objects/items/devices/communicator/messaging.dm b/code/game/objects/items/devices/communicator/messaging.dm
index bfe6d03eab3..5c27d8a850c 100644
--- a/code/game/objects/items/devices/communicator/messaging.dm
+++ b/code/game/objects/items/devices/communicator/messaging.dm
@@ -34,7 +34,7 @@
if(src in comm.voice_invites)
comm.open_connection(src)
return
- to_chat(src, "[bicon(origin_atom)] Receiving communicator request from [origin_atom]. To answer, use the Call Communicator \
+ to_chat(src, "\icon[origin_atom][bicon(origin_atom)] Receiving communicator request from [origin_atom]. To answer, use the Call Communicator \
verb, and select that name to answer the call.")
src << 'sound/machines/defib_SafetyOn.ogg'
comm.voice_invites |= src
@@ -44,7 +44,7 @@
random = random / 10
exonet.send_message(origin_address, "64 bytes received from [exonet.address] ecmp_seq=1 ttl=51 time=[random] ms")
if(message == "text")
- to_chat(src, "[bicon(origin_atom)] Received text message from [origin_atom]: \"[text]\"")
+ to_chat(src, "\icon[origin_atom][bicon(origin_atom)] Received text message from [origin_atom]: \"[text]\"")
src << 'sound/machines/defib_safetyOff.ogg'
exonet_messages.Add("From [origin_atom]: [text]")
return
@@ -57,7 +57,7 @@
var/who = null
if(isobserver(candidate))
var/mob/observer/dead/ghost = candidate
- who = ghost
+ who = ghost.name
im_list += list(list("address" = origin_address, "to_address" = exonet.address, "im" = text))
else if(istype(candidate, /obj/item/device/communicator))
var/obj/item/device/communicator/comm = candidate
@@ -76,9 +76,15 @@
return
if(ringer)
- playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
+ var/S
+ if(ttone in ttone_sound)
+ S = ttone_sound[ttone]
+ else
+ S = 'sound/machines/twobeep.ogg'
+
+ playsound(src, S, 50, 1)
for (var/mob/O in hearers(2, loc))
- O.show_message(text("[bicon(src)] *beep*"))
+ O.show_message(text("\icon[src][bicon(src)] *[ttone]*"))
alert_called = 1
update_icon()
@@ -89,7 +95,20 @@
L = loc
if(L)
- to_chat(L, "[bicon(src)] Message from [who].")
+ to_chat(L, "\icon[src][bicon(src)] Message from [who]: \"[text]\" (Reply)")
+
+// This is the only Topic the communicators really uses
+/obj/item/device/communicator/Topic(href, href_list)
+ switch(href_list["action"])
+ if("Reply")
+ var/obj/item/device/communicator/comm = locate(href_list["target"])
+ var/message = tgui_input_text(usr, "Enter your message below.", "Reply")
+
+ if(message)
+ exonet.send_message(comm.exonet.address, "text", message)
+ im_list += list(list("address" = exonet.address, "to_address" = comm.exonet.address, "im" = message))
+ log_pda("(COMM: [src]) sent \"[message]\" to [exonet.get_atom_from_address(comm.exonet.address)]", usr)
+ to_chat(usr, "\icon[src][bicon(src)] Sent message to [comm.owner], \"[message]\" (Reply)")
// Verb: text_communicator()
// Parameters: None
@@ -134,7 +153,7 @@
if(choice)
var/obj/item/device/communicator/chosen_communicator = choice
var/mob/observer/dead/O = src
- var/text_message = sanitize(input(src, "What do you want the message to say?") as message)
+ var/text_message = sanitize(tgui_input_text(src, "What do you want the message to say?", multiline = TRUE))
if(text_message && O.exonet)
O.exonet.send_message(chosen_communicator.exonet.address, "text", text_message)
diff --git a/code/game/objects/items/devices/communicator/phone.dm b/code/game/objects/items/devices/communicator/phone.dm
index e938276bdca..671598a6ef8 100644
--- a/code/game/objects/items/devices/communicator/phone.dm
+++ b/code/game/objects/items/devices/communicator/phone.dm
@@ -39,15 +39,15 @@
comm.voice_requests.Remove(src)
if(user)
- comm.visible_message("[bicon(src)] Connecting to [src].")
- to_chat(user, "[bicon(src)] Attempting to call [comm].")
+ comm.visible_message("\icon[src][bicon(src)] Connecting to [src].")
+ to_chat(user, "\icon[src][bicon(src)] Attempting to call [comm].")
sleep(10)
- to_chat(user, "[bicon(src)] Dialing internally from [station_name()], [system_name()].")
+ to_chat(user, "\icon[src][bicon(src)] Dialing internally from [station_name()], [system_name()].")
sleep(20) //If they don't have an exonet something is very wrong and we want a runtime.
- to_chat(user, "[bicon(src)] Connection re-routed to [comm] at [comm.exonet.address].")
+ to_chat(user, "\icon[src][bicon(src)] Connection re-routed to [comm] at [comm.exonet.address].")
sleep(40)
- to_chat(user, "[bicon(src)] Connection to [comm] at [comm.exonet.address] established.")
- comm.visible_message("[bicon(src)] Connection to [src] at [exonet.address] established.")
+ to_chat(user, "\icon[src][bicon(src)] Connection to [comm] at [comm.exonet.address] established.")
+ comm.visible_message("\icon[src][bicon(src)] Connection to [src] at [exonet.address] established.")
sleep(20)
src.add_communicating(comm)
@@ -86,28 +86,28 @@
//Now for some connection fluff.
if(user)
- to_chat(user, "[bicon(src)] Connecting to [candidate].")
- to_chat(new_voice, "[bicon(src)] Attempting to call [src].")
+ to_chat(user, "\icon[src][bicon(src)] Connecting to [candidate].")
+ to_chat(new_voice, "\icon[src][bicon(src)] Attempting to call [src].")
sleep(10)
- to_chat(new_voice, "[bicon(src)] Dialing to [station_name()], Kara Subsystem, [system_name()].")
+ to_chat(new_voice, "\icon[src][bicon(src)] Dialing to [station_name()], Kara Subsystem, [system_name()].")
sleep(20)
- to_chat(new_voice, "[bicon(src)] Connecting to [station_name()] telecommunications array.")
+ to_chat(new_voice, "\icon[src][bicon(src)] Connecting to [station_name()] telecommunications array.")
sleep(40)
- to_chat(new_voice, "[bicon(src)] Connection to [station_name()] telecommunications array established. Redirecting signal to [src].")
+ to_chat(new_voice, "\icon[src][bicon(src)] Connection to [station_name()] telecommunications array established. Redirecting signal to [src].")
sleep(20)
//We're connected, no need to hide everything.
new_voice.client.screen.Remove(blackness)
qdel(blackness)
- to_chat(new_voice, "[bicon(src)] Connection to [src] established.")
+ to_chat(new_voice, "\icon[src][bicon(src)] Connection to [src] established.")
to_chat(new_voice, "To talk to the person on the other end of the call, just talk normally.")
to_chat(new_voice, "If you want to end the call, use the 'Hang Up' verb. The other person can also hang up at any time.")
to_chat(new_voice, "Remember, your character does not know anything you've learned from observing!")
if(new_voice.mind)
new_voice.mind.assigned_role = "Disembodied Voice"
if(user)
- to_chat(user, "[bicon(src)] Your communicator is now connected to [candidate]'s communicator.")
+ to_chat(user, "\icon[src][bicon(src)] Your communicator is now connected to [candidate]'s communicator.")
// Proc: close_connection()
// Parameters: 3 (user - the user who initiated the disconnect, target - the mob or device being disconnected, reason - string shown when disconnected)
@@ -120,8 +120,8 @@
for(var/mob/living/voice/voice in voice_mobs) //Handle ghost-callers
if(target && voice != target) //If no target is inputted, it deletes all of them.
continue
- to_chat(voice, "[bicon(src)] [reason].")
- visible_message("[bicon(src)] [reason].")
+ to_chat(voice, "\icon[src][bicon(src)] [reason].")
+ visible_message("\icon[src][bicon(src)] [reason].")
voice_mobs.Remove(voice)
qdel(voice)
update_icon()
@@ -131,8 +131,8 @@
continue
src.del_communicating(comm)
comm.del_communicating(src)
- comm.visible_message("[bicon(src)] [reason].")
- visible_message("[bicon(src)] [reason].")
+ comm.visible_message("\icon[src][bicon(src)] [reason].")
+ visible_message("\icon[src][bicon(src)] [reason].")
if(comm.camera && video_source == comm.camera) //We hung up on the person on video
end_video()
if(camera && comm.video_source == camera) //We hung up on them while they were watching us
@@ -163,7 +163,7 @@
if(ringer)
playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
for (var/mob/O in hearers(2, loc))
- O.show_message(text("[bicon(src)] *beep*"))
+ O.show_message(text("\icon[src][bicon(src)] *beep*"))
alert_called = 1
update_icon()
@@ -174,7 +174,7 @@
L = loc
if(L)
- to_chat(L, "[bicon(src)] Communications request from [who].")
+ to_chat(L, "\icon[src][bicon(src)] Communications request from [who].")
// Proc: del_request()
// Parameters: 1 (candidate - the ghost or communicator to be declined)
@@ -197,13 +197,13 @@
us = loc
if(us)
- to_chat(us, "[bicon(src)] Declined request.")
+ to_chat(us, "\icon[src][bicon(src)] Declined request.")
// Proc: see_emote()
// Parameters: 2 (M - the mob the emote originated from, text - the emote's contents)
// Description: Relays the emote to all linked communicators.
/obj/item/device/communicator/see_emote(mob/living/M, text)
- var/rendered = "[bicon(src)] [text]"
+ var/rendered = "\icon[src][bicon(src)] [text]"
for(var/obj/item/device/communicator/comm in communicating)
var/turf/T = get_turf(comm)
if(!T) return
@@ -250,14 +250,14 @@
var/message = combined["formatted"]
var/name_used = M.GetVoice()
var/rendered = null
- rendered = "[bicon(src)] [name_used] [message]"
+ rendered = "\icon[src][bicon(src)] [name_used] [message]"
mob.show_message(rendered, 2)
// Proc: show_message()
// Parameters: 4 (msg - the message, type - number to determine if message is visible or audible, alt - unknown, alt_type - unknown)
// Description: Relays the message to all linked communicators.
/obj/item/device/communicator/show_message(msg, type, alt, alt_type)
- var/rendered = "[bicon(src)] [msg]"
+ var/rendered = "\icon[src][bicon(src)] [msg]"
for(var/obj/item/device/communicator/comm in communicating)
var/turf/T = get_turf(comm)
if(!T) return
@@ -339,15 +339,15 @@
return
if(!(src in comm.communicating) || !comm.camera) //You called someone with a broken communicator or one that's fake or yourself or something
- to_chat(user, "[bicon(src)]ERROR: Video failed. Either bandwidth is too low, or the other communicator is malfunctioning.")
+ to_chat(user, "\icon[src][bicon(src)]ERROR: Video failed. Either bandwidth is too low, or the other communicator is malfunctioning.")
return
- to_chat(user, "[bicon(src)] Attempting to start video over existing call.")
+ to_chat(user, "\icon[src][bicon(src)] Attempting to start video over existing call.")
sleep(30)
- to_chat(user, "[bicon(src)] Please wait...")
+ to_chat(user, "\icon[src][bicon(src)] Please wait...")
video_source = comm.camera
- comm.visible_message("[bicon(src)] New video connection from [comm].")
+ comm.visible_message("\icon[src][bicon(src)] New video connection from [comm].")
update_active_camera_screen()
GLOB.moved_event.register(video_source, src, .proc/update_active_camera_screen)
update_icon()
@@ -360,7 +360,7 @@
show_static()
video_source = null
- . = "[bicon(src)] [reason ? reason : "Video session ended"]."
+ . = "\icon[src][bicon(src)] [reason ? reason : "Video session ended"]."
visible_message(.)
update_icon()
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index ebd146b92a6..e4c49caf59b 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -227,11 +227,12 @@
. = ..()
if(!on)
return
- var/datum/component/overlay_lighting/OL = GetComponent(/datum/component/overlay_lighting)
- if(!OL)
- return
- var/turf/T = get_turf(target)
- OL.place_directional_light(T)
+ if(light_system == MOVABLE_LIGHT_DIRECTIONAL)
+ var/datum/component/overlay_lighting/OL = GetComponent(/datum/component/overlay_lighting)
+ if(!OL)
+ return
+ var/turf/T = get_turf(target)
+ OL.place_directional_light(T)
/obj/item/device/flashlight/pen
name = "penlight"
diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm
index 2b7a31eb2c7..d127fe9404f 100644
--- a/code/game/objects/items/devices/geiger.dm
+++ b/code/game/objects/items/devices/geiger.dm
@@ -65,7 +65,7 @@
STOP_PROCESSING(SSobj, src)
update_icon()
update_sound()
- to_chat(user, "[bicon(src)] You switch [scanning ? "on" : "off"] \the [src].")
+ to_chat(user, "\icon[src][bicon(src)] You switch [scanning ? "on" : "off"] \the [src].")
/obj/item/device/geiger/update_icon()
if(!scanning)
diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm
index 4fb99a9fc06..21ec2ea3b66 100644
--- a/code/game/objects/items/devices/gps.dm
+++ b/code/game/objects/items/devices/gps.dm
@@ -323,7 +323,7 @@ var/list/GPS_list = list()
. = TRUE
if(href_list["tag"])
- var/a = input(usr, "Please enter desired tag.", name, gps_tag) as text
+ var/a = tgui_input_text(usr, "Please enter desired tag.", name, gps_tag)
a = uppertext(copytext(sanitize(a), 1, 11))
if(in_range(src, usr))
gps_tag = a
diff --git a/code/game/objects/items/devices/hacktool.dm b/code/game/objects/items/devices/hacktool.dm
index d7785395930..5110c3e0f16 100644
--- a/code/game/objects/items/devices/hacktool.dm
+++ b/code/game/objects/items/devices/hacktool.dm
@@ -47,7 +47,7 @@
to_chat(user, "You are already hacking!")
return 0
if(!is_type_in_list(target, supported_types))
- to_chat(user, "[bicon(src)] Unable to hack this target!")
+ to_chat(user, "\icon[src][bicon(src)] Unable to hack this target!")
return 0
var/found = known_targets.Find(target)
if(found)
diff --git a/code/game/objects/items/devices/holowarrant.dm b/code/game/objects/items/devices/holowarrant.dm
index 37a5ade906d..0272dac2549 100644
--- a/code/game/objects/items/devices/holowarrant.dm
+++ b/code/game/objects/items/devices/holowarrant.dm
@@ -68,7 +68,7 @@
if(active.fields["arrestsearch"] == "arrest")
var/output = {"
[active.fields["namewarrant"]]
- Sol Central Government Colonial Marshal Bureau
+ Commonwealth Security Bond Association
in the jurisdiction of the
[using_map.boss_name] in [using_map.station_name]
@@ -115,7 +115,7 @@
name = "holowarrant devices"
desc = "A box of holowarrant diplays for security use."
-/obj/item/weapon/storage/box/holowarrants/New()
+/obj/item/weapon/storage/box/holowarrants/New()
..()
for(var/i = 0 to 3)
new /obj/item/device/holowarrant(src) // VOREStation addition ends
\ No newline at end of file
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index 55f92f0cc87..26d58082b6f 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -40,7 +40,7 @@
user.audible_message("[user.GetVoice()][user.GetAltName()] broadcasts, \"[message]\"", runemessage = message)
/obj/item/device/megaphone/attack_self(var/mob/living/user)
- var/message = sanitize(input(user, "Shout a message?", "Megaphone", null) as text)
+ var/message = sanitize(tgui_input_text(user, "Shout a message?", "Megaphone", null))
if(!message)
return
message = capitalize(message)
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index 391b6715918..67cf27e7fe8 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -1,3 +1,20 @@
+var/global/list/radio_channels_by_freq = list(
+ num2text(PUB_FREQ) = "Common",
+ num2text(AI_FREQ) = "AI Private",
+ num2text(ENT_FREQ) = "Entertainment",
+ num2text(ERT_FREQ) = "Response Team",
+ num2text(COMM_FREQ)= "Command",
+ num2text(ENG_FREQ) = "Engineering",
+ num2text(MED_FREQ) = "Medical",
+ num2text(MED_I_FREQ)="Medical(I)",
+ num2text(SEC_FREQ) = "Security",
+ num2text(SEC_I_FREQ)="Security(I)",
+ num2text(SCI_FREQ) = "Science",
+ num2text(SUP_FREQ) = "Supply",
+ num2text(SRV_FREQ) = "Service",
+ num2text(EXP_FREQ) = "Explorer"
+ )
+
GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
/obj/item/device/paicard
@@ -6,14 +23,18 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
icon_state = "pai"
item_state = "electronic"
w_class = ITEMSIZE_SMALL
- slot_flags = SLOT_BELT
+ slot_flags = SLOT_BELT | SLOT_HOLSTER
origin_tech = list(TECH_DATA = 2)
show_messages = 0
preserve_item = 1
- var/obj/item/device/radio/radio
+ var/obj/item/device/radio/borg/pai/radio
var/looking_for_personality = 0
var/mob/living/silicon/pai/pai
+ var/image/screen_layer
+ var/screen_color = "#00ff0d"
+ var/last_notify = 0
+ var/screen_msg
/obj/item/device/paicard/relaymove(var/mob/user, var/direction)
if(user.stat || user.stunned)
@@ -37,27 +58,86 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
/obj/item/device/paicard/attack_ghost(mob/user as mob)
if(pai != null) //Have a person in them already?
return ..()
+ if(is_damage_critical())
+ to_chat(usr, "That card is too damaged to activate!")
+ return
+ var/time_till_respawn = user.time_till_respawn()
+ if(time_till_respawn == -1) // Special case, never allowed to respawn
+ to_chat(usr, "Respawning is not allowed!")
+ else if(time_till_respawn) // Nonzero time to respawn
+ to_chat(usr, "You can't do that yet! You died too recently. You need to wait another [round(time_till_respawn/10/60, 0.1)] minutes.")
+ return
+ if(jobban_isbanned(usr, "pAI"))
+ to_chat(usr,"You cannot join a pAI card when you are banned from playing as a pAI.")
+ return
- var/choice = tgui_alert(user, "You sure you want to inhabit this PAI?", "Confirmation", list("Yes", "No"))
- if(choice == "No")
+ for(var/ourkey in paikeys)
+ if(ourkey == user.ckey)
+ to_chat(usr, "You can't just rejoin any old pAI card!!! Your card still exists.")
+ return
+
+ var/choice = tgui_alert(user, "You sure you want to inhabit this PAI, or submit yourself to being recruited?", "Confirmation", list("Inhabit", "Recruit", "Cancel"))
+ if(choice == "Cancel")
return ..()
-
- var/pai_name = input(user, "Choose your character's name", "Character Name") as text
- var/actual_pai_name = sanitize_name(pai_name)
- if(isnull(actual_pai_name))
+ if(choice == "Recruit")
+ paiController.recruitWindow(user)
return ..()
-
+ choice = tgui_alert(user, "Do you want to load your pAI data?", "Load", list("Yes", "No"))
+ var/actual_pai_name
var/turf/location = get_turf(src)
- var/obj/item/device/paicard/card = new(location)
- var/mob/living/silicon/pai/new_pai = new(card)
+ if(choice == "No")
+ var/pai_name = tgui_input_text(user, "Choose your character's name", "Character Name")
+ actual_pai_name = sanitize_name(pai_name, ,1)
+ if(isnull(actual_pai_name))
+ return ..()
+ if(istype(src , /obj/item/device/paicard/typeb))
+ var/obj/item/device/paicard/typeb/card = new(location)
+ var/mob/living/silicon/pai/new_pai = new(card)
+ new_pai.key = user.key
+ paikeys |= new_pai.ckey
+ card.setPersonality(new_pai)
+ new_pai.SetName(actual_pai_name)
+ else
+ var/obj/item/device/paicard/card = new(location)
+ var/mob/living/silicon/pai/new_pai = new(card)
+ new_pai.key = user.key
+ paikeys |= new_pai.ckey
+ card.setPersonality(new_pai)
+ new_pai.SetName(actual_pai_name)
+
+ if(choice == "Yes")
+ if(istype(src , /obj/item/device/paicard/typeb))
+ var/obj/item/device/paicard/typeb/card = new(location)
+ var/mob/living/silicon/pai/new_pai = new(card)
+ new_pai.key = user.key
+ paikeys |= new_pai.ckey
+ card.setPersonality(new_pai)
+ if(!new_pai.savefile_load(new_pai))
+ var/pai_name = tgui_input_text(new_pai, "Choose your character's name", "Character Name")
+ actual_pai_name = sanitize_name(pai_name, ,1)
+ if(isnull(actual_pai_name))
+ return ..()
+ else
+ var/obj/item/device/paicard/card = new(location)
+ var/mob/living/silicon/pai/new_pai = new(card)
+ new_pai.key = user.key
+ paikeys |= new_pai.ckey
+ card.setPersonality(new_pai)
+ if(!new_pai.savefile_load(new_pai))
+ var/pai_name = tgui_input_text(new_pai, "Choose your character's name", "Character Name")
+ actual_pai_name = sanitize_name(pai_name, ,1)
+ if(isnull(actual_pai_name))
+ return ..()
+
qdel(src)
- new_pai.key = user.key
- card.setPersonality(new_pai)
- new_pai.SetName(actual_pai_name)
return ..()
+
// VOREStation Edit End
-/obj/item/device/paicard/attack_self(mob/user)
+/obj/item/device/paicard/proc/access_screen(mob/user)
+ if(is_damage_critical())
+ to_chat(user, "WARNING: CRITICAL HARDWARE FAILURE, SERVICE DEVICE IMMEDIATELY")
+ return
if (!in_range(src, user))
return
user.set_machine(src)
@@ -162,8 +242,10 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
Personal AI Device
- | Installed Personality: |
- [pai.name] |
+ [pai.name] |
+
+
+ | Integrity: [pai.health] |
| Prime directive: |
@@ -214,6 +296,7 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
else //
dat += "Radio Uplink "
dat += "Radio firmware not loaded. Please install a pAI personality to load firmware. "
+ /* - //A button for instantly deleting people from the game is lame, especially considering that pAIs on our server tend to activate without a master.
dat += {"
"}
+ */
+ if(screen_msg)
+ dat += "Message from [pai.name] [screen_msg]"
else
if(looking_for_personality)
dat += {"
@@ -290,7 +376,7 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
if(2)
radio.ToggleReception()
if(href_list["setlaws"])
- var/newlaws = sanitize(input(usr, "Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", pai.pai_laws) as message)
+ var/newlaws = sanitize(tgui_input_text(usr, "Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", pai.pai_laws, multiline = TRUE, prevent_enter = TRUE))
if(newlaws)
pai.pai_laws = newlaws
to_chat(pai, "Your supplemental directives have been updated. Your new directives are:")
@@ -304,40 +390,48 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
/obj/item/device/paicard/proc/setPersonality(mob/living/silicon/pai/personality)
src.pai = personality
- add_overlay("pai-happy")
+ setEmotion(1)
/obj/item/device/paicard/proc/removePersonality()
src.pai = null
cut_overlays()
- add_overlay("pai-off")
+ setEmotion(16)
/obj/item/device/paicard
var/current_emotion = 1
/obj/item/device/paicard/proc/setEmotion(var/emotion)
if(pai)
cut_overlays()
+ qdel(screen_layer)
+ screen_layer = null
switch(emotion)
- if(1) add_overlay("pai-happy")
- if(2) add_overlay("pai-cat")
- if(3) add_overlay("pai-extremely-happy")
- if(4) add_overlay("pai-face")
- if(5) add_overlay("pai-laugh")
- if(6) add_overlay("pai-off")
- if(7) add_overlay("pai-sad")
- if(8) add_overlay("pai-angry")
- if(9) add_overlay("pai-what")
- if(10) add_overlay("pai-neutral")
- if(11) add_overlay("pai-silly")
- if(12) add_overlay("pai-nose")
- if(13) add_overlay("pai-smirk")
- if(14) add_overlay("pai-exclamation")
- if(15) add_overlay("pai-question")
+ if(1) screen_layer = image(icon, "pai-neutral")
+ if(2) screen_layer = image(icon, "pai-what")
+ if(3) screen_layer = image(icon, "pai-happy")
+ if(4) screen_layer = image(icon, "pai-cat")
+ if(5) screen_layer = image(icon, "pai-extremely-happy")
+ if(6) screen_layer = image(icon, "pai-face")
+ if(7) screen_layer = image(icon, "pai-laugh")
+ if(8) screen_layer = image(icon, "pai-sad")
+ if(9) screen_layer = image(icon, "pai-angry")
+ if(10) screen_layer = image(icon, "pai-silly")
+ if(11) screen_layer = image(icon, "pai-nose")
+ if(12) screen_layer = image(icon, "pai-smirk")
+ if(13) screen_layer = image(icon, "pai-exclamation")
+ if(14) screen_layer = image(icon, "pai-question")
+ if(15) screen_layer = image(icon, "pai-blank")
+ if(16) screen_layer = image(icon, "pai-off")
+
+ screen_layer.color = pai.eye_color
+ add_overlay(screen_layer)
current_emotion = emotion
/obj/item/device/paicard/proc/alertUpdate()
- var/turf/T = get_turf_or_move(src.loc)
- for (var/mob/M in viewers(T))
- M.show_message("\The [src] flashes a message across its screen, \"Additional personalities available for download.\"", 3, "\The [src] bleeps electronically.", 2)
+ if(pai)
+ return
+ if(last_notify == 0 || (5 MINUTES <= world.time - last_notify))
+ audible_message("\The [src] flashes a message across its screen, \"Additional personalities available for download.\"", hearing_distance = world.view, runemessage = "bleeps!")
+ last_notify = world.time
/obj/item/device/paicard/emp_act(severity)
for(var/mob/M in src)
@@ -360,3 +454,84 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
var/rendered = "[msg]"
pai.show_message(rendered, type)
..()
+
+
+// VoreEdit: Living Machine Stuff after this.
+// This adds a var and proc for all machines to take a pAI. (The pAI can't control anything, it's just for RP.)
+// You need to add usage of the proc to each machine to actually add support. For an example of this, see code\modules\food\kitchen\microwave.dm
+/obj/machinery
+ var/obj/item/device/paicard/paicard = null
+
+/obj/machinery/proc/insertpai(mob/user, obj/item/device/paicard/card)
+ //var/obj/item/paicard/card = I
+ var/mob/living/silicon/pai/AI = card.pai
+ if(paicard)
+ to_chat(user, span_notice("This bot is already under PAI Control!"))
+ return
+ if(!istype(card)) // TODO: Add sleevecard support.
+ return
+ if(!card.pai)
+ to_chat(user, span_notice("This card does not currently have a personality!"))
+ return
+ paicard = card
+ user.unEquip(card)
+ card.forceMove(src)
+ AI.client.eye = src
+ to_chat(AI, span_notice("Your location is [card.loc].")) // DEBUG. TODO: Make unfolding the chassis trigger an eject.
+ name = AI.name
+ to_chat(AI, span_notice("You feel a tingle in your circuits as your systems interface with \the [initial(src.name)]."))
+
+/obj/machinery/proc/ejectpai(mob/user)
+ if(paicard)
+ var/mob/living/silicon/pai/AI = paicard.pai
+ paicard.forceMove(src.loc)
+ AI.client.eye = AI
+ paicard = null
+ name = initial(src.name)
+ to_chat(AI, span_notice("You feel a tad claustrophobic as your mind closes back into your card, ejecting from \the [initial(src.name)]."))
+ if(user)
+ to_chat(user, span_notice("You eject the card from \the [initial(src.name)]."))
+
+///////////////////////////////
+//////////pAI Radios//////////
+///////////////////////////////
+//Thanks heroman!
+
+/obj/item/device/radio/borg/pai
+ name = "integrated radio"
+ icon = 'icons/obj/robot_component.dmi' // Cyborgs radio icons should look like the component.
+ icon_state = "radio"
+ loudspeaker = FALSE
+
+/obj/item/device/radio/borg/pai/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ return
+
+/obj/item/device/radio/borg/pai/recalculateChannels()
+ if(!istype(loc,/obj/item/device/paicard))
+ return
+ var/obj/item/device/paicard/card = loc
+ secure_radio_connections = list()
+ channels = list()
+
+ for(var/internal_chan in internal_channels)
+ var/ch_name = radio_channels_by_freq[internal_chan]
+ if(has_channel_access(card.pai, internal_chan))
+ channels += ch_name
+ channels[ch_name] = 1
+ secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
+
+/obj/item/device/paicard/typeb
+ name = "personal AI device"
+ icon = 'icons/obj/paicard.dmi'
+
+/obj/random/paicard
+ name = "personal AI device spawner"
+ icon = 'icons/obj/paicard.dmi'
+ icon_state = "pai"
+
+/obj/random/paicard/item_to_spawn()
+ return pick(/obj/item/device/paicard ,/obj/item/device/paicard/typeb)
+
+/obj/item/device/paicard/digest_act(var/atom/movable/item_storage = null)
+ if(pai.digestable)
+ return ..()
diff --git a/code/game/objects/items/devices/paicard_vr.dm b/code/game/objects/items/devices/paicard_vr.dm
new file mode 100644
index 00000000000..7283966d477
--- /dev/null
+++ b/code/game/objects/items/devices/paicard_vr.dm
@@ -0,0 +1,385 @@
+#define PP_FUNCTIONAL 0
+#define PP_BROKEN 1
+#define PP_MISSING 2
+
+var/global/list/paikeys = list()
+
+/obj/item/device/paicard
+ var/panel_open = FALSE
+ var/cell = PP_FUNCTIONAL //critical- power
+ var/processor = PP_FUNCTIONAL //critical- the thinky part
+ var/board = PP_FUNCTIONAL //critical- makes everything work
+ var/capacitor = PP_FUNCTIONAL //critical- power processing
+ var/projector = PP_FUNCTIONAL //non-critical- affects unfolding
+ var/emitter = PP_FUNCTIONAL //non-critical- affects unfolding
+ var/speech_synthesizer = PP_FUNCTIONAL //non-critical- affects speech
+
+/obj/item/device/paicard/attackby(var/obj/item/I as obj, mob/user as mob)
+ if(istype(I,/obj/item/weapon/tool/screwdriver))
+ if(panel_open)
+ panel_open = FALSE
+ user.visible_message("\The [user] secured \the [src]'s maintenance panel.")
+ playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
+ else if(pai)
+ if(do_after(user, 3 SECONDS))
+ panel_open = TRUE
+ user.visible_message("\The [user] opened \the [src]'s maintenance panel.")
+ playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
+ if(istype(I,/obj/item/device/robotanalyzer))
+ if(!panel_open)
+ to_chat(user, "The panel isn't open. You will need to unscrew it to open it.")
+ else
+ if(cell == PP_FUNCTIONAL)
+ to_chat(user,"Power cell: functional")
+ else if(cell == PP_BROKEN)
+ to_chat(user,"Power cell: damaged - CRITICAL")
+ else
+ to_chat(user,"Power cell: missing - CRITICAL")
+
+ if(processor == PP_FUNCTIONAL)
+ to_chat(user,"Processor: functional")
+ else if(processor == PP_BROKEN)
+ to_chat(user,"Processor: damaged - CRITICAL")
+ else
+ to_chat(user,"Processor: missing - CRITICAL")
+
+ if(board == PP_FUNCTIONAL)
+ to_chat(user,"Board: functional")
+ else if(board == PP_BROKEN)
+ to_chat(user,"Board: damaged - CRITICAL")
+ else
+ to_chat(user,"Board: missing - CRITICAL")
+
+ if(capacitor == PP_FUNCTIONAL)
+ to_chat(user,"Capacitors: functional")
+ else if(capacitor == PP_BROKEN)
+ to_chat(user,"Capacitors: damaged - CRITICAL")
+ else
+ to_chat(user,"Capacitors: missing - CRITICAL")
+
+ if(projector == PP_FUNCTIONAL)
+ to_chat(user,"Projectors: functional")
+ else if(projector == PP_BROKEN)
+ to_chat(user,"Projectors: damaged")
+ else
+ to_chat(user,"Projectors: missing")
+
+ if(emitter == PP_FUNCTIONAL)
+ to_chat(user,"Emitters: functional")
+ else if(emitter == PP_BROKEN)
+ to_chat(user,"Emitters: damaged")
+ else
+ to_chat(user,"Emitters: missing")
+
+ if(speech_synthesizer == PP_FUNCTIONAL)
+ to_chat(user,"Speech Synthesizer: functional")
+ else if(speech_synthesizer == PP_BROKEN)
+ to_chat(user,"Speech Synthesizer: damaged")
+ else
+ to_chat(user,"Speech Synthesizer: missing")
+
+ if(istype(I,/obj/item/device/multitool))
+ if(!panel_open)
+ to_chat(user, "You can't do that in this state.")
+ else
+ var/list/parts = list()
+ if(cell != PP_MISSING)
+ parts |= "cell"
+ if(processor != PP_MISSING)
+ parts |= "processor"
+ if(board != PP_MISSING)
+ parts |= "board"
+ if(capacitor != PP_MISSING)
+ parts |= "capacitor"
+ if(projector != PP_MISSING)
+ parts |= "projector"
+ if(emitter != PP_MISSING)
+ parts |= "emitter"
+ if(speech_synthesizer != PP_MISSING)
+ parts |= "speech synthesizer"
+
+ var/choice = tgui_input_list(user, "Which part would you like to check?", "Check part", parts)
+ switch(choice)
+ if("cell")
+ if(cell == PP_FUNCTIONAL)
+ to_chat(user,"Power cell: functional")
+ else if(speech_synthesizer == PP_BROKEN)
+ to_chat(user,"Power cell: damaged")
+ else
+ to_chat(user,"Power cell: missing")
+
+ if("processor")
+ if(processor == PP_FUNCTIONAL)
+ to_chat(user,"Processor: functional")
+ else if(speech_synthesizer == PP_BROKEN)
+ to_chat(user,"Processor: damaged")
+ else
+ to_chat(user,"Processor: missing")
+
+ if("board")
+ if(board == PP_FUNCTIONAL)
+ to_chat(user,"Board: functional")
+ else if(speech_synthesizer == PP_BROKEN)
+ to_chat(user,"Board: damaged")
+ else
+ to_chat(user,"Board: missing")
+
+ if("capacitor")
+ if(capacitor == PP_FUNCTIONAL)
+ to_chat(user,"Capacitors: functional")
+ else if(speech_synthesizer == PP_BROKEN)
+ to_chat(user,"Capacitors: damaged")
+ else
+ to_chat(user,"Capacitors: missing")
+
+ if("projector")
+ if(projector == PP_FUNCTIONAL)
+ to_chat(user,"Projectors: functional")
+ else if(speech_synthesizer == PP_BROKEN)
+ to_chat(user,"Projectors: damaged")
+ else
+ to_chat(user,"Projectors: missing")
+
+ if("emitter")
+ if(emitter == PP_FUNCTIONAL)
+ to_chat(user,"Emitters: functional")
+ else if(speech_synthesizer == PP_BROKEN)
+ to_chat(user,"Emitters: damaged")
+ else
+ to_chat(user,"Emitters: missing")
+
+ if("speech synthesizer")
+ if(speech_synthesizer == PP_FUNCTIONAL)
+ to_chat(user,"Speech Synthesizer: functional")
+ else if(speech_synthesizer == PP_BROKEN)
+ to_chat(user,"Speech Synthesizer: damaged")
+ else
+ to_chat(user,"Speech Synthesizer: missing")
+
+ if(istype(I,/obj/item/paiparts/cell))
+ if(cell == PP_MISSING)
+ if(do_after(user, 3 SECONDS))
+ user.visible_message("\The [user] installs \the [I] into \the [src].","You install \the [I] into \the [src].")
+ cell = PP_FUNCTIONAL
+ user.drop_from_inventory(I)
+ qdel(I)
+ else
+ to_chat(user, "You would need to remove the installed [I] first!")
+ if(istype(I,/obj/item/paiparts/processor))
+ if(processor == PP_MISSING)
+ if(do_after(user, 3 SECONDS))
+ user.visible_message("\The [user] installs \the [I] into \the [src].","You install \the [I] into \the [src].")
+ processor = PP_FUNCTIONAL
+ user.drop_from_inventory(I)
+ qdel(I)
+ else
+ to_chat(user, "You would need to remove the installed [I] first!")
+ if(istype(I,/obj/item/paiparts/board))
+ if(board == PP_MISSING)
+ if(do_after(user, 3 SECONDS))
+ user.visible_message("\The [user] installs \the [I] into \the [src].","You install \the [I] into \the [src].")
+ board = PP_FUNCTIONAL
+ user.drop_from_inventory(I)
+ qdel(I)
+ else
+ to_chat(user, "You would need to remove the installed [I] first!")
+ if(istype(I,/obj/item/paiparts/capacitor))
+ if(capacitor == PP_MISSING)
+ if(do_after(user, 3 SECONDS))
+ user.visible_message("\The [user] installs \the [I] into \the [src].","You install \the [I] into \the [src].")
+ capacitor = PP_FUNCTIONAL
+ user.drop_from_inventory(I)
+ qdel(I)
+ else
+ to_chat(user, "You would need to remove the installed [I] first!")
+ if(istype(I,/obj/item/paiparts/projector))
+ if(projector == PP_MISSING)
+ if(do_after(user, 3 SECONDS))
+ user.visible_message("\The [user] installs \the [I] into \the [src].","You install \the [I] into \the [src].")
+ projector = PP_FUNCTIONAL
+ user.drop_from_inventory(I)
+ qdel(I)
+ else
+ to_chat(user, "You would need to remove the installed [I] first!")
+ if(istype(I,/obj/item/paiparts/emitter))
+ if(emitter == PP_MISSING)
+ if(do_after(user, 3 SECONDS))
+ user.visible_message("\The [user] installs \the [I] into \the [src].","You install \the [I] into \the [src].")
+ emitter = PP_FUNCTIONAL
+ user.drop_from_inventory(I)
+ qdel(I)
+ else
+ to_chat(user, "You would need to remove the installed [I] first!")
+ if(istype(I,/obj/item/paiparts/speech_synthesizer))
+ if(speech_synthesizer == PP_MISSING)
+ if(do_after(user, 3 SECONDS))
+ user.visible_message("\The [user] installs \the [I] into \the [src].","You install \the [I] into \the [src].")
+ speech_synthesizer = PP_FUNCTIONAL
+ user.drop_from_inventory(I)
+ qdel(I)
+ else
+ to_chat(user, "You would need to remove the installed [I] first!")
+
+/obj/item/device/paicard/attack_self(mob/user)
+ if(!panel_open)
+ access_screen(user)
+ return
+ var/list/parts = list()
+ if(cell != PP_MISSING)
+ parts |= "cell"
+ if(processor != PP_MISSING)
+ parts |= "processor"
+ if(board != PP_MISSING)
+ parts |= "board"
+ if(capacitor != PP_MISSING)
+ parts |= "capacitor"
+ if(projector != PP_MISSING)
+ parts |= "projector"
+ if(emitter != PP_MISSING)
+ parts |= "emitter"
+ if(speech_synthesizer != PP_MISSING)
+ parts |= "speech synthesizer"
+
+ var/choice = tgui_input_list(user, "Which part would you like to remove?", "Remove part", parts)
+ if(choice)
+ playsound(src, 'sound/items/pickup/component.ogg', vary = TRUE)
+ else
+ return
+ if(!do_after(user, 3 SECONDS))
+ return
+ switch(choice)
+ if("cell")
+ if(cell == PP_FUNCTIONAL)
+ new /obj/item/paiparts/capacitor(get_turf(user))
+ else
+ new /obj/item/paiparts(get_turf(user))
+ user.visible_message("\The [user] removes \the [choice] from \the [src].","You remove \the [choice] from \the [src].")
+ cell = PP_MISSING
+ if("processor")
+ if(processor == PP_FUNCTIONAL)
+ new /obj/item/paiparts/capacitor(get_turf(user))
+ else
+ new /obj/item/paiparts(get_turf(user))
+ user.visible_message("\The [user] removes \the [choice] from \the [src].","You remove \the [choice] from \the [src].")
+ processor = PP_MISSING
+ if("board")
+ board = PP_MISSING
+ if(board == PP_FUNCTIONAL)
+ new /obj/item/paiparts/capacitor(get_turf(user))
+ else
+ new /obj/item/paiparts(get_turf(user))
+ user.visible_message("\The [user] removes \the [choice] from \the [src].","You remove \the [choice] from \the [src].")
+
+ if("capacitor")
+ if(capacitor == PP_FUNCTIONAL)
+ new /obj/item/paiparts/capacitor(get_turf(user))
+ else
+ new /obj/item/paiparts(get_turf(user))
+ user.visible_message("\The [user] removes \the [choice] from \the [src].","You remove \the [choice] from \the [src].")
+ capacitor = PP_MISSING
+ if("projector")
+ if(projector == PP_FUNCTIONAL)
+ new /obj/item/paiparts/capacitor(get_turf(user))
+ else
+ new /obj/item/paiparts(get_turf(user))
+ user.visible_message("\The [user] removes \the [choice] from \the [src].","You remove \the [choice] from \the [src].")
+ projector = PP_MISSING
+ if("emitter")
+ if(emitter == PP_FUNCTIONAL)
+ new /obj/item/paiparts/capacitor(get_turf(user))
+ else
+ new /obj/item/paiparts(get_turf(user))
+ user.visible_message("\The [user] removes \the [choice] from \the [src].","You remove \the [choice] from \the [src].")
+ emitter = PP_MISSING
+ if("speech synthesizer")
+ if(speech_synthesizer == PP_FUNCTIONAL)
+ new /obj/item/paiparts/capacitor(get_turf(user))
+ else
+ new /obj/item/paiparts(get_turf(user))
+ user.visible_message("\The [user] removes \the [choice] from \the [src].","You remove \the [choice] from \the [src].")
+ speech_synthesizer = PP_MISSING
+
+/obj/item/device/paicard/proc/death_damage()
+
+ var/number = rand(1,4)
+ while(number)
+ number --
+ switch(rand(1,4))
+ if(1)
+ cell = PP_BROKEN
+ if(2)
+ processor = PP_BROKEN
+ if(3)
+ board = PP_BROKEN
+ if(4)
+ capacitor = PP_BROKEN
+
+
+/obj/item/device/paicard/proc/damage_random_component(nonfatal = FALSE)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(2, 1, src)
+ s.start()
+ if(prob(80) || nonfatal) //Way more likely to be non-fatal part damage
+ switch(rand(1,3))
+ if(1)
+ projector = PP_BROKEN
+ if(2)
+ emitter = PP_BROKEN
+ if(3)
+ speech_synthesizer = PP_BROKEN
+ else
+ switch(rand(1,4))
+ if(1)
+ cell = PP_BROKEN
+ if(2)
+ processor = PP_BROKEN
+ if(3)
+ board = PP_BROKEN
+ if(4)
+ capacitor = PP_BROKEN
+
+/obj/item/device/paicard/proc/is_damage_critical()
+ if(cell != PP_FUNCTIONAL || processor != PP_FUNCTIONAL || board != PP_FUNCTIONAL || capacitor != PP_FUNCTIONAL)
+ return TRUE
+ return FALSE
+
+/obj/item/paiparts
+ name = "broken pAI component"
+ desc = "It's broken scrap from a pAI card!"
+ icon = 'icons/obj/paicard.dmi'
+ icon_state = "broken"
+ pickup_sound = 'sound/items/pickup/card.ogg'
+ drop_sound = 'sound/items/drop/card.ogg'
+/obj/item/paiparts/Initialize()
+ . = ..()
+ pixel_x = rand(-10,10)
+ pixel_y = rand(-10,10)
+
+/obj/item/paiparts/cell
+ name = "pAI power cell"
+ desc = "It's very small and efficient! It powers the pAI!"
+ icon_state = "cell"
+/obj/item/paiparts/processor
+ name = "pAI processor"
+ desc = "It's the brain of your computer friend!"
+ icon_state = "processor"
+/obj/item/paiparts/board
+ name = "pAI board"
+ desc = "It's the thing all the other parts get attatched to!"
+ icon_state = "board"
+/obj/item/paiparts/capacitor
+ name = "pAI capacitor"
+ desc = "It helps regulate power flow!"
+ icon_state = "capacitor"
+/obj/item/paiparts/projector
+ name = "pAI projector"
+ desc = "It projects the pAI's form!"
+ icon_state = "projector"
+/obj/item/paiparts/emitter
+ name = "pAI emitter"
+ desc = "It emits the fields to help the pAI get around!"
+ icon_state = "emitter"
+/obj/item/paiparts/speech_synthesizer
+ name = "pAI speech synthesizer"
+ desc = "It's a little voice box!"
+ icon_state = "speech_synthesizer"
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 8489920262f..7cb5420b9f0 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -489,7 +489,7 @@ GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer)
var/list/jamming = is_jammed(src)
if(jamming)
var/distance = jamming["distance"]
- to_chat(M, "[bicon(src)] You hear the [distance <= 2 ? "loud hiss" : "soft hiss"] of static.")
+ to_chat(M, "\icon[src][bicon(src)] You hear the [distance <= 2 ? "loud hiss" : "soft hiss"] of static.")
return FALSE
// First, we want to generate a new radio signal
diff --git a/code/game/objects/items/devices/scanners/gas.dm b/code/game/objects/items/devices/scanners/gas.dm
new file mode 100644
index 00000000000..9fbc319d6db
--- /dev/null
+++ b/code/game/objects/items/devices/scanners/gas.dm
@@ -0,0 +1,36 @@
+/obj/item/device/analyzer
+ name = "gas analyzer"
+ desc = "A hand-held environmental scanner which reports current gas levels."
+ icon_state = "atmos"
+ item_state = "analyzer"
+ w_class = ITEMSIZE_SMALL
+ slot_flags = SLOT_BELT
+ throwforce = 5
+ throw_speed = 4
+ throw_range = 20
+
+ matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
+
+ origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1)
+
+/obj/item/device/analyzer/atmosanalyze(var/mob/user)
+ var/air = user.return_air()
+ if (!air)
+ return
+
+ return atmosanalyzer_scan(src, air, user)
+
+/obj/item/device/analyzer/attack_self(mob/user as mob)
+ if (user.stat)
+ return
+ if (!user.IsAdvancedToolUser())
+ to_chat(usr, "You don't have the dexterity to do this!")
+ return
+
+ analyze_gases(src, user)
+ return
+
+/obj/item/device/analyzer/afterattack(var/obj/O, var/mob/user, var/proximity)
+ if(proximity)
+ analyze_gases(O, user)
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/devices/scanners/halogen.dm b/code/game/objects/items/devices/scanners/halogen.dm
new file mode 100644
index 00000000000..f2f302c334d
--- /dev/null
+++ b/code/game/objects/items/devices/scanners/halogen.dm
@@ -0,0 +1,20 @@
+/obj/item/device/halogen_counter
+ name = "halogen counter"
+ icon_state = "eftpos"
+ desc = "A hand-held halogen counter, used to detect the level of irradiation of living beings."
+ w_class = ITEMSIZE_SMALL
+ origin_tech = list(TECH_MAGNET = 1, TECH_BIO = 2)
+ throwforce = 0
+ throw_speed = 3
+ throw_range = 7
+
+/obj/item/device/halogen_counter/attack(mob/living/M as mob, mob/living/user as mob)
+ if(!iscarbon(M))
+ to_chat(user, "This device can only scan organic beings!")
+ return
+ user.visible_message("\The [user] has analyzed [M]'s radiation levels!", "Analyzing Results for [M]:")
+ if(M.radiation)
+ to_chat(user, "Radiation Level: [M.radiation]")
+ else
+ to_chat(user, "No radiation detected.")
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners/health.dm
similarity index 69%
rename from code/game/objects/items/devices/scanners.dm
rename to code/game/objects/items/devices/scanners/health.dm
index cc1194d1489..107bfc0b675 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners/health.dm
@@ -1,15 +1,4 @@
#define DEFIB_TIME_LIMIT (10 MINUTES) //VOREStation addition- past this many seconds, defib is useless.
-/*
-CONTAINS:
-T-RAY
-DETECTIVE SCANNER
-HEALTH ANALYZER
-GAS ANALYZER - Analyzes atmosphere, container
-MASS SPECTROMETER
-REAGENT SCANNER
-HALOGEN COUNTER - Radcount on mobs
-*/
-
/obj/item/device/healthanalyzer
name = "health analyzer"
@@ -52,7 +41,7 @@ HALOGEN COUNTER - Radcount on mobs
dat += "Body Temperature: ???"
user.show_message("[dat]", 1)
return
- if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey")
+ if (!user.IsAdvancedToolUser())
to_chat(user, "You don't have the dexterity to do this!")
return
@@ -240,7 +229,7 @@ HALOGEN COUNTER - Radcount on mobs
continue
// Broken limbs
if(e.status & ORGAN_BROKEN)
- if((e.name in list("l_arm", "r_arm", "l_leg", "r_leg", "head", "chest", "groin")) && (!e.splinted))
+ if((e.name in list(BP_L_ARM, BP_R_ARM, BP_L_LEG, BP_R_LEG, BP_HEAD, BP_TORSO, BP_GROIN)) && (!e.splinted))
fracture_dat += "Unsecured fracture in subject [e.name]. Splinting recommended for transport. "
else if(advscan >= 1 && showadvscan == 1)
fracture_dat += "Bone fractures detected in subject [e.name]. "
@@ -335,214 +324,4 @@ HALOGEN COUNTER - Radcount on mobs
origin_tech = list(TECH_MAGNET = 7, TECH_BIO = 8)
icon_state = "health3"
-/obj/item/device/analyzer
- name = "analyzer"
- desc = "A hand-held environmental scanner which reports current gas levels."
- icon_state = "atmos"
- item_state = "analyzer"
- w_class = ITEMSIZE_SMALL
- slot_flags = SLOT_BELT
- throwforce = 5
- throw_speed = 4
- throw_range = 20
-
- matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
-
- origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1)
-
-/obj/item/device/analyzer/atmosanalyze(var/mob/user)
- var/air = user.return_air()
- if (!air)
- return
-
- return atmosanalyzer_scan(src, air, user)
-
-/obj/item/device/analyzer/attack_self(mob/user as mob)
- if (user.stat)
- return
- if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey")
- to_chat(usr, "You don't have the dexterity to do this!")
- return
-
- analyze_gases(src, user)
- return
-
-/obj/item/device/analyzer/afterattack(var/obj/O, var/mob/user, var/proximity)
- if(proximity)
- analyze_gases(O, user)
- return
-
-
-/obj/item/device/mass_spectrometer
- name = "mass spectrometer"
- desc = "A hand-held mass spectrometer which identifies trace chemicals in a blood sample."
- icon_state = "spectrometer"
- w_class = ITEMSIZE_SMALL
- flags = OPENCONTAINER
- slot_flags = SLOT_BELT
- throwforce = 5
- throw_speed = 4
- throw_range = 20
-
- matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
-
- origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
- var/details = 0
- var/recent_fail = 0
-
-/obj/item/device/mass_spectrometer/Initialize()
- . = ..()
- var/datum/reagents/R = new/datum/reagents(5)
- reagents = R
- R.my_atom = src
-
-/obj/item/device/mass_spectrometer/on_reagent_change()
- if(reagents.total_volume)
- icon_state = initial(icon_state) + "_s"
- else
- icon_state = initial(icon_state)
-
-/obj/item/device/mass_spectrometer/attack_self(mob/user as mob)
- if (user.stat)
- return
- if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey")
- to_chat(user, "You don't have the dexterity to do this!")
- return
- if(reagents.total_volume)
- var/list/blood_traces = list()
- for(var/datum/reagent/R in reagents.reagent_list)
- if(R.id != "blood")
- reagents.clear_reagents()
- to_chat(user, "The sample was contaminated! Please insert another sample")
- return
- else
- blood_traces = params2list(R.data["trace_chem"])
- break
- var/dat = "Trace Chemicals Found: "
- for(var/R in blood_traces)
- if(details)
- dat += "[R] ([blood_traces[R]] units) "
- else
- dat += "[R] "
- to_chat(user, "[dat]")
- reagents.clear_reagents()
- return
-
-/obj/item/device/mass_spectrometer/adv
- name = "advanced mass spectrometer"
- icon_state = "adv_spectrometer"
- details = 1
- origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2)
-
-/obj/item/device/reagent_scanner
- name = "reagent scanner"
- desc = "A hand-held reagent scanner which identifies chemical agents."
- icon_state = "spectrometer"
- item_state = "analyzer"
- w_class = ITEMSIZE_SMALL
- slot_flags = SLOT_BELT
- throwforce = 5
- throw_speed = 4
- throw_range = 20
- matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
-
- origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
- var/details = 0
- var/recent_fail = 0
-
-/obj/item/device/reagent_scanner/afterattack(obj/O, mob/living/user, proximity)
- if(!proximity || user.stat || !istype(O))
- return
- if(!istype(user))
- return
-
- if(!isnull(O.reagents))
- if(!(O.flags & OPENCONTAINER)) // The idea is that the scanner has to touch the reagents somehow. This is done to prevent cheesing unidentified autoinjectors.
- to_chat(user, span("warning", "\The [O] is sealed, and cannot be scanned by \the [src] until unsealed."))
- return
-
- var/dat = ""
- if(O.reagents.reagent_list.len > 0)
- var/one_percent = O.reagents.total_volume / 100
- for (var/datum/reagent/R in O.reagents.reagent_list)
- dat += "\n \t " + span("notice", "[R][details ? ": [R.volume / one_percent]%" : ""]")
- if(dat)
- to_chat(user, span("notice", "Chemicals found: [dat]"))
- else
- to_chat(user, span("notice", "No active chemical agents found in [O]."))
- else
- to_chat(user, span("notice", "No significant chemical agents found in [O]."))
-
- return
-
-/obj/item/device/reagent_scanner/adv
- name = "advanced reagent scanner"
- icon_state = "adv_spectrometer"
- details = 1
- origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2)
-
-/obj/item/device/slime_scanner
- name = "slime scanner"
- icon_state = "xenobio"
- item_state = "xenobio"
- origin_tech = list(TECH_BIO = 1)
- w_class = ITEMSIZE_SMALL
- throwforce = 0
- throw_speed = 3
- throw_range = 7
- matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
-
-/obj/item/device/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob)
- if(!istype(M, /mob/living/simple_mob/slime/xenobio))
- to_chat(user, "This device can only scan lab-grown slimes!")
- return
- var/mob/living/simple_mob/slime/xenobio/S = M
- user.show_message("Slime scan results: [S.slime_color] [S.is_adult ? "adult" : "baby"] slime Health: [S.health] Mutation Probability: [S.mutation_chance]")
-
- var/list/mutations = list()
- for(var/potential_color in S.slime_mutation)
- var/mob/living/simple_mob/slime/xenobio/slime = potential_color
- mutations.Add(initial(slime.slime_color))
- user.show_message("Potental to mutate into [english_list(mutations)] colors. Extract potential: [S.cores] Nutrition: [S.nutrition]/[S.max_nutrition]")
-
- if (S.nutrition < S.get_starve_nutrition())
- user.show_message("Warning: Subject is starving!")
- else if (S.nutrition < S.get_hunger_nutrition())
- user.show_message("Warning: Subject is hungry.")
- user.show_message("Electric change strength: [S.power_charge]")
-
- if(S.has_AI())
- var/datum/ai_holder/simple_mob/xenobio_slime/AI = S.ai_holder
- if(AI.resentment)
- user.show_message("Warning: Subject is harboring resentment.")
- if(AI.rabid)
- user.show_message("Subject is enraged and extremely dangerous!")
- if(S.harmless)
- user.show_message("Subject has been pacified.")
- if(S.unity)
- user.show_message("Subject is friendly to other slime colors.")
-
- user.show_message("Growth progress: [S.amount_grown]/10")
-
-/obj/item/device/halogen_counter
- name = "halogen counter"
- icon_state = "eftpos"
- desc = "A hand-held halogen counter, used to detect the level of irradiation of living beings."
- w_class = ITEMSIZE_SMALL
- origin_tech = list(TECH_MAGNET = 1, TECH_BIO = 2)
- throwforce = 0
- throw_speed = 3
- throw_range = 7
-
-/obj/item/device/halogen_counter/attack(mob/living/M as mob, mob/living/user as mob)
- if(!iscarbon(M))
- to_chat(user, "This device can only scan organic beings!")
- return
- user.visible_message("\The [user] has analyzed [M]'s radiation levels!", "Analyzing Results for [M]:")
- if(M.radiation)
- to_chat(user, "Radiation Level: [M.radiation]")
- else
- to_chat(user, "No radiation detected.")
- return
-
#undef DEFIB_TIME_LIMIT //VOREStation addition
\ No newline at end of file
diff --git a/code/game/objects/items/devices/scanners/mass_spectrometer.dm b/code/game/objects/items/devices/scanners/mass_spectrometer.dm
new file mode 100644
index 00000000000..5c044fc535b
--- /dev/null
+++ b/code/game/objects/items/devices/scanners/mass_spectrometer.dm
@@ -0,0 +1,60 @@
+/obj/item/device/mass_spectrometer
+ name = "mass spectrometer"
+ desc = "A hand-held mass spectrometer which identifies trace chemicals in a blood sample."
+ icon_state = "spectrometer"
+ w_class = ITEMSIZE_SMALL
+ flags = OPENCONTAINER
+ slot_flags = SLOT_BELT
+ throwforce = 5
+ throw_speed = 4
+ throw_range = 20
+
+ matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
+
+ origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
+ var/details = 0
+ var/recent_fail = 0
+
+/obj/item/device/mass_spectrometer/New()
+ ..()
+ var/datum/reagents/R = new/datum/reagents(5)
+ reagents = R
+ R.my_atom = src
+
+/obj/item/device/mass_spectrometer/on_reagent_change()
+ if(reagents.total_volume)
+ icon_state = initial(icon_state) + "_s"
+ else
+ icon_state = initial(icon_state)
+
+/obj/item/device/mass_spectrometer/attack_self(mob/user as mob)
+ if (user.stat)
+ return
+ if (!user.IsAdvancedToolUser())
+ to_chat(user, "You don't have the dexterity to do this!")
+ return
+ if(reagents.total_volume)
+ var/list/blood_traces = list()
+ for(var/datum/reagent/R in reagents.reagent_list)
+ if(R.id != "blood")
+ reagents.clear_reagents()
+ to_chat(user, "The sample was contaminated! Please insert another sample")
+ return
+ else
+ blood_traces = params2list(R.data["trace_chem"])
+ break
+ var/dat = "Trace Chemicals Found: "
+ for(var/R in blood_traces)
+ if(details)
+ dat += "[R] ([blood_traces[R]] units) "
+ else
+ dat += "[R] "
+ to_chat(user, "[dat]")
+ reagents.clear_reagents()
+ return
+
+/obj/item/device/mass_spectrometer/adv
+ name = "advanced mass spectrometer"
+ icon_state = "adv_spectrometer"
+ details = 1
+ origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2)
\ No newline at end of file
diff --git a/code/game/objects/items/devices/scanners/reagents.dm b/code/game/objects/items/devices/scanners/reagents.dm
new file mode 100644
index 00000000000..8310d13fabc
--- /dev/null
+++ b/code/game/objects/items/devices/scanners/reagents.dm
@@ -0,0 +1,46 @@
+/obj/item/device/reagent_scanner
+ name = "reagent scanner"
+ desc = "A hand-held reagent scanner which identifies chemical agents."
+ icon_state = "spectrometer"
+ item_state = "analyzer"
+ w_class = ITEMSIZE_SMALL
+ slot_flags = SLOT_BELT
+ throwforce = 5
+ throw_speed = 4
+ throw_range = 20
+ matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
+
+ origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
+ var/details = 0
+ var/recent_fail = 0
+
+/obj/item/device/reagent_scanner/afterattack(obj/O, mob/living/user, proximity)
+ if(!proximity || user.stat || !istype(O))
+ return
+ if(!istype(user))
+ return
+
+ if(!isnull(O.reagents))
+ if(!(O.flags & OPENCONTAINER)) // The idea is that the scanner has to touch the reagents somehow. This is done to prevent cheesing unidentified autoinjectors.
+ to_chat(user, span("warning", "\The [O] is sealed, and cannot be scanned by \the [src] until unsealed."))
+ return
+
+ var/dat = ""
+ if(O.reagents.reagent_list.len > 0)
+ var/one_percent = O.reagents.total_volume / 100
+ for (var/datum/reagent/R in O.reagents.reagent_list)
+ dat += "\n \t " + span("notice", "[R][details ? ": [R.volume / one_percent]%" : ""]")
+ if(dat)
+ to_chat(user, span("notice", "Chemicals found: [dat]"))
+ else
+ to_chat(user, span("notice", "No active chemical agents found in [O]."))
+ else
+ to_chat(user, span("notice", "No significant chemical agents found in [O]."))
+
+ return
+
+/obj/item/device/reagent_scanner/adv
+ name = "advanced reagent scanner"
+ icon_state = "adv_spectrometer"
+ details = 1
+ origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2)
\ No newline at end of file
diff --git a/code/game/objects/items/devices/scanners_vr.dm b/code/game/objects/items/devices/scanners/sleevemate.dm
similarity index 99%
rename from code/game/objects/items/devices/scanners_vr.dm
rename to code/game/objects/items/devices/scanners/sleevemate.dm
index 1722617106b..5308e2c842f 100644
--- a/code/game/objects/items/devices/scanners_vr.dm
+++ b/code/game/objects/items/devices/scanners/sleevemate.dm
@@ -300,4 +300,4 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob
if(stored_mind)
icon_state = "[initial(icon_state)]_on"
else
- icon_state = initial(icon_state)
+ icon_state = initial(icon_state)
\ No newline at end of file
diff --git a/code/game/objects/items/devices/scanners/slime.dm b/code/game/objects/items/devices/scanners/slime.dm
new file mode 100644
index 00000000000..adcdce06a0e
--- /dev/null
+++ b/code/game/objects/items/devices/scanners/slime.dm
@@ -0,0 +1,42 @@
+/obj/item/device/slime_scanner
+ name = "slime scanner"
+ icon_state = "xenobio"
+ item_state = "xenobio"
+ origin_tech = list(TECH_BIO = 1)
+ w_class = ITEMSIZE_SMALL
+ throwforce = 0
+ throw_speed = 3
+ throw_range = 7
+ matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
+
+/obj/item/device/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob)
+ if(!istype(M, /mob/living/simple_mob/slime/xenobio))
+ to_chat(user, "This device can only scan lab-grown slimes!")
+ return
+ var/mob/living/simple_mob/slime/xenobio/S = M
+ user.show_message("Slime scan results: [S.slime_color] [S.is_adult ? "adult" : "baby"] slime Health: [S.health] Mutation Probability: [S.mutation_chance]")
+
+ var/list/mutations = list()
+ for(var/potential_color in S.slime_mutation)
+ var/mob/living/simple_mob/slime/xenobio/slime = potential_color
+ mutations.Add(initial(slime.slime_color))
+ user.show_message("Potental to mutate into [english_list(mutations)] colors. Extract potential: [S.cores] Nutrition: [S.nutrition]/[S.max_nutrition]")
+
+ if (S.nutrition < S.get_starve_nutrition())
+ user.show_message("Warning: Subject is starving!")
+ else if (S.nutrition < S.get_hunger_nutrition())
+ user.show_message("Warning: Subject is hungry.")
+ user.show_message("Electric change strength: [S.power_charge]")
+
+ if(S.has_AI())
+ var/datum/ai_holder/simple_mob/xenobio_slime/AI = S.ai_holder
+ if(AI.resentment)
+ user.show_message("Warning: Subject is harboring resentment.")
+ if(AI.rabid)
+ user.show_message("Subject is enraged and extremely dangerous!")
+ if(S.harmless)
+ user.show_message("Subject has been pacified.")
+ if(S.unity)
+ user.show_message("Subject is friendly to other slime colors.")
+
+ user.show_message("Growth progress: [S.amount_grown]/10")
\ No newline at end of file
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index c7bc6a81d0a..d434a8e7338 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -417,7 +417,7 @@
return
else if(istype(I, /obj/item/weapon/pen))
if(loc == user && !user.incapacitated())
- var/new_name = input(user, "What would you like to label the tape?", "Tape labeling") as null|text
+ var/new_name = tgui_input_text(user, "What would you like to label the tape?", "Tape labeling")
if(isnull(new_name)) return
new_name = sanitizeSafe(new_name)
if(new_name)
diff --git a/code/game/objects/items/devices/text_to_speech.dm b/code/game/objects/items/devices/text_to_speech.dm
index 54510fb9a44..c97693ed5ff 100644
--- a/code/game/objects/items/devices/text_to_speech.dm
+++ b/code/game/objects/items/devices/text_to_speech.dm
@@ -22,9 +22,9 @@
named = 1
*/
- var/message = sanitize(input(user,"Choose a message to relay to those around you.") as text|null)
+ var/message = sanitize(tgui_input_text(user,"Choose a message to relay to those around you."))
if(message)
- audible_message("[bicon(src)] \The [src.name] states, \"[message]\"", runemessage = "synthesized speech")
+ audible_message("\icon[src][bicon(src)] \The [src.name] states, \"[message]\"", runemessage = "synthesized speech")
if(ismob(loc))
loc.audible_message("", runemessage = "\[TTS Voice\] [message]")
diff --git a/code/game/objects/items/devices/translocator_vr.dm b/code/game/objects/items/devices/translocator_vr.dm
index 02089da0378..3a0fb80bd0b 100644
--- a/code/game/objects/items/devices/translocator_vr.dm
+++ b/code/game/objects/items/devices/translocator_vr.dm
@@ -135,7 +135,7 @@ This device records all warnings given and teleport events for admin review in c
to_chat(user, "The translocator can't support any more beacons!")
return
- var/new_name = html_encode(input(user,"New beacon's name (2-20 char):","[src]") as text|null)
+ var/new_name = html_encode(tgui_input_text(user,"New beacon's name (2-20 char):","[src]",null,20))
if(!check_menu(user))
return
diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm
index 54506dfe2b0..28fbf705754 100644
--- a/code/game/objects/items/devices/tvcamera.dm
+++ b/code/game/objects/items/devices/tvcamera.dm
@@ -45,7 +45,7 @@
add_fingerprint(user)
user.set_machine(src)
show_ui(user)
-
+
/obj/item/device/tvcamera/proc/show_ui(mob/user)
var/dat = list()
dat += "Channel name is: [channel ? channel : "unidentified broadcast"] "
@@ -62,7 +62,7 @@
if(..())
return 1
if(href_list["channel"])
- var/nc = input(usr, "Channel name", "Select new channel name", channel) as text|null
+ var/nc = tgui_input_text(usr, "Channel name", "Select new channel name", channel)
if(nc)
channel = nc
camera.c_tag = channel
@@ -90,7 +90,7 @@
/obj/item/device/tvcamera/proc/show_tvs(atom/thing)
if(showing)
hide_tvs(showing)
-
+
showing = weakref(thing)
showing_name = "[thing]"
for(var/obj/machinery/computer/security/telescreen/entertainment/ES as anything in GLOB.entertainment_screens)
@@ -123,7 +123,7 @@
/obj/item/device/tvcamera/process()
if(!showing)
return PROCESS_KILL
-
+
var/atom/A = showing.resolve()
if(!A || QDELETED(A))
show_tvs(loc)
@@ -145,3 +145,76 @@
H.update_inv_l_hand()
H.update_inv_belt()
+
+//Assembly by roboticist
+
+/obj/item/robot_parts/head/attackby(var/obj/item/device/assembly/S, mob/user as mob)
+ if(!istype(S, /obj/item/device/assembly/infra))
+ ..()
+ return
+ var/obj/item/weapon/TVAssembly/A = new(user)
+ qdel(S)
+ user.put_in_hands(A)
+ to_chat(user, "You add the infrared sensor to the robot head.")
+ user.drop_from_inventory(src)
+ qdel(src)
+
+
+/obj/item/weapon/TVAssembly
+ name = "\improper TV Camera Assembly"
+ desc = "A robotic head with an infrared sensor inside."
+ icon = 'icons/obj/robot_parts.dmi'
+ icon_state = "head"
+ item_state = "head"
+ var/buildstep = 0
+ w_class = ITEMSIZE_LARGE
+
+/obj/item/weapon/TVAssembly/attackby(W, mob/user)
+ switch(buildstep)
+ if(0)
+ if(istype(W, /obj/item/robot_parts/robot_component/camera))
+ var/obj/item/robot_parts/robot_component/camera/CA = W
+ to_chat(user, "You add the camera module to [src]")
+ user.drop_item()
+ qdel(CA)
+ desc = "This TV camera assembly has a camera module."
+ buildstep++
+ if(1)
+ if(istype(W, /obj/item/device/taperecorder))
+ var/obj/item/device/taperecorder/T = W
+ user.drop_item()
+ qdel(T)
+ buildstep++
+ to_chat(user, "You add the tape recorder to [src]")
+ if(2)
+ if(istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = W
+ if(!C.use(3))
+ to_chat(user, "You need six cable coils to wire the devices.")
+ ..()
+ return
+ C.use(3)
+ buildstep++
+ to_chat(user, "You wire the assembly")
+ desc = "This TV camera assembly has wires sticking out"
+ return
+ if(3)
+ if(istype(W, /obj/item/weapon/tool/wirecutters))
+ to_chat(user, " You trim the wires.")
+ buildstep++
+ desc = "This TV camera assembly needs casing."
+ return
+ if(4)
+ if(istype(W, /obj/item/stack/material/steel))
+ var/obj/item/stack/material/steel/S = W
+ buildstep++
+ S.use(1)
+ to_chat(user, "You encase the assembly in a Ward-Takeshi casing.")
+ var/turf/T = get_turf(src)
+ new /obj/item/device/tvcamera(T)
+ user.drop_from_inventory(src)
+ qdel(src)
+ return
+
+ ..()
+
diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm
index 54ed5404757..846fae358da 100644
--- a/code/game/objects/items/devices/whistle.dm
+++ b/code/game/objects/items/devices/whistle.dm
@@ -19,7 +19,7 @@
to_chat(usr, "The hailer is fried. The tiny input screen just shows a waving ASCII penis.")
return
- var/new_message = input(usr, "Please enter new message (leave blank to reset).") as text
+ var/new_message = tgui_input_text(usr, "Please enter new message (leave blank to reset).")
if(!new_message || new_message == "")
use_message = "Halt! Security!"
else
diff --git a/code/game/objects/items/gunbox_vr.dm b/code/game/objects/items/gunbox_vr.dm
index 2770745f39b..4dbbb98b274 100644
--- a/code/game/objects/items/gunbox_vr.dm
+++ b/code/game/objects/items/gunbox_vr.dm
@@ -19,3 +19,26 @@
if(istype(AM, /obj/item/weapon/gun))
to_chat(user, "You have chosen \the [AM]. Say hello to your new best friend.")
qdel(src)
+
+/*
+ * Site Manager's Box
+ */
+/obj/item/gunbox/captain
+ name = "Captain's sidearm box"
+ desc = "A secure box containing a sidearm befitting of the site manager. Includes both lethal and non-lethal munitions, beware what's loaded!"
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "gunbox"
+/obj/item/gunbox/captain/attack_self(mob/living/user)
+ var/list/options = list()
+ options["M1911 (.45)"] = list(/obj/item/weapon/gun/projectile/colt/detective, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45)
+ options["MT Mk58 (.45)"] = list(/obj/item/weapon/gun/projectile/sec, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45)
+ options["LAEP80 \"Thor\" (Stun/Laser)"] = list(/obj/item/weapon/gun/energy/gun, /obj/item/weapon/cell/device/weapon, /obj/item/weapon/cell/device/weapon)
+ options["MarsTech P92X (9mm)"] = list(/obj/item/weapon/gun/projectile/p92x/rubber, /obj/item/ammo_magazine/m9mm/rubber, /obj/item/ammo_magazine/m9mm)
+ var/choice = tgui_input_list(user,"Would you prefer a ballistic pistol or an energy gun?", "Gun!", options)
+ if(src && choice)
+ var/list/things_to_spawn = options[choice]
+ for(var/new_type in things_to_spawn) // Spawn all the things, the gun and the ammo.
+ var/atom/movable/AM = new new_type(get_turf(src))
+ if(istype(AM, /obj/item/weapon/gun))
+ to_chat(user, "You have chosen \the [AM]. Say hello to your new friend.")
+ qdel(src)
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 9c886769f96..7fa84da4e15 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -226,7 +226,7 @@
to_chat(user, "The MMI must go in after everything else!")
if (istype(W, /obj/item/weapon/pen))
- var/t = sanitizeSafe(input(user, "Enter new robot name", src.name, src.created_name), MAX_NAME_LEN)
+ var/t = sanitizeSafe(tgui_input_text(user, "Enter new robot name", src.name, src.created_name), MAX_NAME_LEN)
if (!t)
return
if (!in_range(src, usr) && src.loc != usr)
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 3938f3c17b2..2a79c6aaac5 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -40,7 +40,7 @@
var/heldname = "default name"
/obj/item/borg/upgrade/rename/attack_self(mob/user as mob)
- heldname = sanitizeSafe(input(user, "Enter new robot name", "Robot Reclassification", heldname), MAX_NAME_LEN)
+ heldname = sanitizeSafe(tgui_input_text(user, "Enter new robot name", "Robot Reclassification", heldname, MAX_NAME_LEN), MAX_NAME_LEN)
/obj/item/borg/upgrade/rename/action(var/mob/living/silicon/robot/R)
if(..()) return 0
@@ -69,6 +69,7 @@
R.key = ghost.key
R.set_stat(CONSCIOUS)
+ R.add_robot_verbs()
dead_mob_list -= R
living_mob_list |= R
R.notify_ai(ROBOT_NOTIFICATION_NEW_UNIT)
@@ -207,7 +208,6 @@
R.add_language(LANGUAGE_SIIK, 1)
R.add_language(LANGUAGE_AKHANI, 1)
R.add_language(LANGUAGE_SKRELLIAN, 1)
- R.add_language(LANGUAGE_SKRELLIANFAR, 0)
R.add_language(LANGUAGE_GUTTER, 1)
R.add_language(LANGUAGE_SCHECHI, 1)
R.add_language(LANGUAGE_ROOTLOCAL, 1)
diff --git a/code/game/objects/items/robot/robot_upgrades_vr.dm b/code/game/objects/items/robot/robot_upgrades_vr.dm
index bd9f247ec7f..74c41433d9e 100644
--- a/code/game/objects/items/robot/robot_upgrades_vr.dm
+++ b/code/game/objects/items/robot/robot_upgrades_vr.dm
@@ -6,7 +6,6 @@
R.add_language(LANGUAGE_ECUREUILIAN, 1)
R.add_language(LANGUAGE_DAEMON, 1)
R.add_language(LANGUAGE_ENOCHIAN, 1)
- R.add_language(LANGUAGE_SLAVIC, 1)
R.add_language(LANGUAGE_DRUDAKAR, 1)
R.add_language(LANGUAGE_TAVAN, 1)
return 1
@@ -31,6 +30,30 @@
R.verbs += /mob/living/proc/set_size
return 1
+//Robot size gun
+/obj/item/borg/upgrade/sizegun
+ name = "robot mounted size gun"
+ desc = "A size gun adapted for installation in cyborgs, allows them to turn people pocket-sized among other uses. What could go wrong?"
+ icon_state = "cyborg_upgrade2"
+ item_state = "cyborg_upgrade"
+ require_module = 1
+
+/obj/item/borg/upgrade/sizegun/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ var/obj/item/weapon/gun/energy/sizegun/mounted/T = locate() in R.module
+ if(!T)
+ T = locate() in R.module.contents
+ if(!T)
+ T = locate() in R.module.modules
+ if(!T)
+ R.module.modules += new/obj/item/weapon/gun/energy/sizegun/mounted(R.module)
+ return 1
+ if(T)
+ to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
+ to_chat(usr, "There's no mounting point for the module!")
+ return 0
+
/obj/item/borg/upgrade/bellysizeupgrade
name = "robohound capacity expansion module"
desc = "Used to double a robohound's belly capacity. This only affects total volume, and won't allow support of more than one patient in case of sleeper bellies. Can only be applied once."
@@ -152,6 +175,30 @@
if(!T)
R.module.modules += new/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg(R.module)
return 1
+ if(T)
+ to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
+ to_chat(usr, "There's no mounting point for the module!")
+ return 0
+
+//cyborg foam dart gun
+/obj/item/borg/upgrade/toygun
+ name = "Donk-Soft Cyborg Blaster module" //Cyborg Blaster is capitalized because it's the brand name
+ desc = "A foam dart gun designed for mounting into cyborgs. It's Donk or Don't! DISCLAIMER: Donk-Soft bears no responsibility for incidents relating to cyborgs becoming too accustomed to shooting at crew. Installation of the Donk-Soft Cyborg Blaster must be performed only by a licensed roboticist."
+ icon_state = "cyborg_upgrade5"
+ item_state = "cyborg_upgrade"
+ require_module = 1
+
+/obj/item/borg/upgrade/toygun/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ var/obj/item/weapon/gun/projectile/cyborgtoy/T = locate() in R.module
+ if(!T)
+ T = locate() in R.module.contents
+ if(!T)
+ T = locate() in R.module.modules
+ if(!T)
+ R.module.modules += new/obj/item/weapon/gun/projectile/cyborgtoy(R.module)
+ return 1
if(T)
to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
to_chat(usr, "There's no mounting point for the module!")
diff --git a/code/game/objects/items/selectable_item_vr.dm b/code/game/objects/items/selectable_item_vr.dm
new file mode 100644
index 00000000000..56d4778124b
--- /dev/null
+++ b/code/game/objects/items/selectable_item_vr.dm
@@ -0,0 +1,48 @@
+/obj/item/selectable_item
+ name = "selectable item"
+ desc = "If you find this, you should definitely report this..."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "gift1"
+ var/preface_string = "You are about to select an item. Are you sure you want to use it and select one?"
+ var/preface_title = "selectable item"
+ var/selection_string = "Select an item:"
+ var/selection_title = "Item Selection"
+ var/list/item_options = list("Gift" = /obj/item/weapon/a_gift,
+ "Health Analyzer" = /obj/item/device/healthanalyzer)
+
+/obj/item/selectable_item/attack_self(mob/user as mob)
+ tgui_alert(user, {"[preface_string]"}, preface_title)
+ var/chosen_item = tgui_input_list(usr, selection_string, selection_title, item_options)
+ chosen_item = item_options[chosen_item]
+ if(!QDELETED(src) && chosen_item)
+ user.drop_item()
+ var/obj/item/result = new chosen_item(get_turf(user))
+ user.put_in_active_hand(result)
+ result.add_fingerprint(user)
+ qdel(src)
+ return
+
+
+/obj/item/selectable_item/chemistrykit
+ icon = 'icons/obj/chemical_vr.dmi'
+ icon_state = "chemkit"
+ selection_string = "Select a chemical:"
+ selection_title = "Chemical Selection"
+
+/obj/item/selectable_item/chemistrykit/size
+ name = "size chemistry kit"
+ desc = "A pre-arranged home chemistry kit. This one is for rather specific set of size-altering chemicals."
+ preface_string = "This kit can be used to create a vial of a size-altering chemical, but there's only enough material for one."
+ preface_title = "Size Chemistry Kit"
+ item_options = list("Macrocillin" = /obj/item/weapon/reagent_containers/glass/beaker/vial/macrocillin,
+ "Microcillin" = /obj/item/weapon/reagent_containers/glass/beaker/vial/microcillin,
+ "Normalcillin" = /obj/item/weapon/reagent_containers/glass/beaker/vial/normalcillin)
+
+/obj/item/selectable_item/chemistrykit/gender
+ name = "gender chemistry kit"
+ desc = "A pre-arranged home chemistry kit. This one is for rather specific set of gender-altering chemicals."
+ preface_string = "This kit can be used to create a vial of a gender-altering chemical, but there's only enough material for one."
+ preface_title = "Gender Chemistry Kit"
+ item_options = list("Androrovir" = /obj/item/weapon/reagent_containers/glass/beaker/vial/androrovir,
+ "Gynorovir" = /obj/item/weapon/reagent_containers/glass/beaker/vial/gynorovir,
+ "Androgynorovir" = /obj/item/weapon/reagent_containers/glass/beaker/vial/androgynorovir)
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index f065ec3ea17..9676919792d 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -20,8 +20,7 @@
to_chat(user, "\The [src] cannot be applied to [M]!")
return 1
- if ( ! (istype(user, /mob/living/carbon/human) || \
- istype(user, /mob/living/silicon)) )
+ if (!M.IsAdvancedToolUser())
to_chat(user, "You don't have the dexterity to do this!")
return 1
@@ -129,7 +128,7 @@
if(used >= available)
to_chat(user, "You run out of [src]!")
break
-
+
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("\The [user] bandages \a [W.desc] on [M]'s [affecting.name].", \
"You bandage \a [W.desc] on [M]'s [affecting.name]." )
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index ea0bc3601d5..c0181dfdfaf 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -399,7 +399,7 @@
/obj/item/stack/attack_hand(mob/user as mob)
if (user.get_inactive_hand() == src)
- var/N = input(usr, "How many stacks of [src] would you like to split off? There are currently [amount].", "Split stacks", 1) as num|null
+ var/N = tgui_input_number(usr, "How many stacks of [src] would you like to split off? There are currently [amount].", "Split stacks", 1, amount, 1)
if(N)
var/obj/item/stack/F = src.split(N)
if (F)
diff --git a/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm b/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm
index a730263afa1..103b54c691a 100644
--- a/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm
+++ b/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm
@@ -4,14 +4,6 @@
name = "stack of grass"
type_to_spawn = /obj/item/stack/tile/grass
-/obj/fiftyspawner/grass/sif
- name = "stack of sifgrass"
- type_to_spawn = /obj/item/stack/tile/grass/sif
-
-/obj/fiftyspawner/grass/sif/forest
- name = "stack of sifgrass"
- type_to_spawn = /obj/item/stack/tile/grass/sif/forest
-
/obj/fiftyspawner/wood
name = "stack of wood"
type_to_spawn = /obj/item/stack/tile/wood
@@ -28,14 +20,38 @@
name = "stack of teal carpet"
type_to_spawn = /obj/item/stack/tile/carpet/teal
-/obj/fiftyspawner/decocarpet
- name = "stack of deco carpet"
- type_to_spawn = /obj/item/stack/tile/carpet/deco
+/obj/fiftyspawner/geocarpet
+ name = "stack of geometric carpet"
+ type_to_spawn = /obj/item/stack/tile/carpet/geo
/obj/fiftyspawner/retrocarpet
- name = "stack of retro carpet"
+ name = "stack of blue retro carpet"
type_to_spawn = /obj/item/stack/tile/carpet/retro
+/obj/fiftyspawner/retrocarpet_red
+ name = "stack of red retro carpet"
+ type_to_spawn = /obj/item/stack/tile/carpet/retro_red
+
+/obj/fiftyspawner/happycarpet
+ name = "stack of happy carpet"
+ type_to_spawn = /obj/item/stack/tile/carpet/happy
+
+/obj/fiftyspawner/brncarpet
+ name = "stack of brown carpet"
+ type_to_spawn = /obj/item/stack/tile/carpet/brncarpet
+
+/obj/fiftyspawner/blucarpet2
+ name = "stack of blue carpet"
+ type_to_spawn = /obj/item/stack/tile/carpet/blucarpet2
+
+/obj/fiftyspawner/greencarpet
+ name = "stack of green carpet"
+ type_to_spawn = /obj/item/stack/tile/carpet/greencarpet
+
+/obj/fiftyspawner/purplecarpet
+ name = "stack of purple carpet"
+ type_to_spawn = /obj/item/stack/tile/carpet/purplecarpet
+
/obj/fiftyspawner/floor
name = "stack of floor tiles"
type_to_spawn = /obj/item/stack/tile/floor
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 3c17fb0acf8..202e8ce1561 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -42,16 +42,6 @@
drop_sound = 'sound/items/drop/herb.ogg'
pickup_sound = 'sound/items/pickup/herb.ogg'
-/obj/item/stack/tile/grass/sif
- name = "sivian grass tile"
- singular_name = "sivian grass floor tile"
- desc = "A patch of grass like those that decorate the plains of Sif."
-
-/obj/item/stack/tile/grass/sif/forest
- name = "sivian overgrowth tile"
- singular_name = "sivian overgrowth floor tile"
- desc = "A patch of dark overgrowth like those that decorate the plains of Sif."
-
/*
* Wood
*/
@@ -75,6 +65,26 @@
desc = "An easy to fit wooden floor tile. It's blue!"
icon_state = "tile-sifwood"
+/obj/item/stack/tile/wood/alt
+ name = "wood floor tile"
+ singular_name = "wood floor tile"
+ icon_state = "tile-wood_tile"
+
+/obj/item/stack/tile/wood/parquet
+ name = "parquet wood floor tile"
+ singular_name = "parquet wood floor tile"
+ icon_state = "tile-wood_parquet"
+
+/obj/item/stack/tile/wood/panel
+ name = "large wood floor tile"
+ singular_name = "large wood floor tile"
+ icon_state = "tile-wood_large"
+
+/obj/item/stack/tile/wood/tile
+ name = "tiled wood floor tile"
+ singular_name = "tiled wood floor tile"
+ icon_state = "tile-wood_tile"
+
/obj/item/stack/tile/wood/cyborg
name = "wood floor tile synthesizer"
desc = "A device that makes wood floor tiles."
@@ -83,6 +93,8 @@
stacktype = /obj/item/stack/tile/wood
build_type = /obj/item/stack/tile/wood
+
+
/*
* Carpets
*/
@@ -107,6 +119,23 @@
icon_state = "tile-tealcarpet"
no_variants = FALSE
+/obj/item/stack/tile/carpet/geo
+ icon_state = "tile-carpet-deco"
+ desc = "A piece of carpet with a gnarly geometric design. It is the same size as a normal floor tile!"
+
+/obj/item/stack/tile/carpet/retro
+ icon_state = "tile-carpet-retro"
+ desc = "A piece of carpet with totally wicked blue space patterns. It is the same size as a normal floor tile!"
+
+/obj/item/stack/tile/carpet/retro_red
+ icon_state = "tile-carpet-retro-red"
+ desc = "A piece of carpet with red-ical space patterns. It is the same size as a normal floor tile!"
+
+/obj/item/stack/tile/carpet/happy
+ icon_state = "tile-carpet-happy"
+ desc = "A piece of carpet with happy patterns. It is the same size as a normal floor tile!"
+
+// TODO - Add descriptions to these
/obj/item/stack/tile/carpet/bcarpet
icon_state = "tile-carpet"
/obj/item/stack/tile/carpet/blucarpet
@@ -121,10 +150,14 @@
icon_state = "tile-carpet"
/obj/item/stack/tile/carpet/oracarpet
icon_state = "tile-carpet"
-/obj/item/stack/tile/carpet/deco
- icon_state = "tile-carpet-deco"
-/obj/item/stack/tile/carpet/retro
- icon_state = "tile-carpet-retro"
+/obj/item/stack/tile/carpet/brncarpet
+ icon_state = "tile-carpet"
+/obj/item/stack/tile/carpet/blucarpet2
+ icon_state = "tile-carpet"
+/obj/item/stack/tile/carpet/greencarpet
+ icon_state = "tile-carpet"
+/obj/item/stack/tile/carpet/purplecarpet
+ icon_state = "tile-carpet"
/obj/item/stack/tile/floor
name = "floor tile"
diff --git a/code/game/objects/items/toys/godfigures.dm b/code/game/objects/items/toys/godfigures.dm
index 027544a0eb8..9801640d54d 100644
--- a/code/game/objects/items/toys/godfigures.dm
+++ b/code/game/objects/items/toys/godfigures.dm
@@ -123,7 +123,7 @@
var/mob/M = usr
if(!M.mind) return 0
- var/input = sanitizeSafe(input(usr, "What do you want to name the icon?", ,""), MAX_NAME_LEN)
+ var/input = sanitizeSafe(tgui_input_text(usr, "What do you want to name the icon?", ,"", null, MAX_NAME_LEN), MAX_NAME_LEN)
if(src && input && !M.stat && in_range(M,src))
name = "icon of " + input
diff --git a/code/game/objects/items/toys/toys.dm b/code/game/objects/items/toys/toys.dm
index 95627f7f47c..11304a001b8 100644
--- a/code/game/objects/items/toys/toys.dm
+++ b/code/game/objects/items/toys/toys.dm
@@ -844,7 +844,7 @@
if(!M.mind)
return 0
- var/input = sanitizeSafe(input(usr, "What do you want to name the plushie?", ,""), MAX_NAME_LEN)
+ var/input = sanitizeSafe(tgui_input_text(usr, "What do you want to name the plushie?", ,""), MAX_NAME_LEN)
if(src && input && !M.stat && in_range(M,src))
name = input
diff --git a/code/game/objects/items/toys/toys_vr.dm b/code/game/objects/items/toys/toys_vr.dm
index 8a3f59feaed..c4daff4dce1 100644
--- a/code/game/objects/items/toys/toys_vr.dm
+++ b/code/game/objects/items/toys/toys_vr.dm
@@ -87,16 +87,20 @@
attack_verb = list("beeped", "booped", "pinged")
/obj/item/toy/plushie/borgplushie/medihound
+ name = "medihound plushie"
icon_state = "medihound"
/obj/item/toy/plushie/borgplushie/scrubpuppy
+ name = "janihound plushie"
icon_state = "scrubpuppy"
/obj/item/toy/plushie/borgplushie/drakiesec
+ name = "security drake plushie"
icon = 'icons/obj/drakietoy_vr.dmi'
icon_state = "secdrake"
/obj/item/toy/plushie/borgplushie/drakiemed
+ name = "medical drake plushie"
icon = 'icons/obj/drakietoy_vr.dmi'
icon_state = "meddrake"
@@ -613,7 +617,7 @@
/obj/item/toy/minigibber/attackby(obj/O, mob/user, params)
if(istype(O,/obj/item/toy/figure) || istype(O,/obj/item/toy/character) && O.loc == user)
- to_chat(user, "You start feeding \the [O] [bicon(O)] into \the [src]'s mini-input.")
+ to_chat(user, "You start feeding \the [O] \icon[O][bicon(O)] into \the [src]'s mini-input.")
if(do_after(user, 10, target = src))
if(O.loc != user)
to_chat(user, "\The [O] is too far away to feed into \the [src]!")
diff --git a/code/game/objects/items/uav.dm b/code/game/objects/items/uav.dm
index b1ff2723a8c..f534ff9a42b 100644
--- a/code/game/objects/items/uav.dm
+++ b/code/game/objects/items/uav.dm
@@ -136,7 +136,7 @@
cell = I
else if(istype(I, /obj/item/weapon/pen) || istype(I, /obj/item/device/flashlight/pen))
- var/tmp_label = sanitizeSafe(input(user, "Enter a nickname for [src]", "Nickname", nickname), MAX_NAME_LEN)
+ var/tmp_label = sanitizeSafe(tgui_input_text(user, "Enter a nickname for [src]", "Nickname", nickname, MAX_NAME_LEN), MAX_NAME_LEN)
if(length(tmp_label) > 50 || length(tmp_label) < 3)
to_chat(user, "The nickname must be between 3 and 50 characters.")
else
diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm
index e366a3e8ee9..0c318fc8dd9 100644
--- a/code/game/objects/items/weapons/AI_modules.dm
+++ b/code/game/objects/items/weapons/AI_modules.dm
@@ -133,7 +133,7 @@ AI MODULES
/obj/item/weapon/aiModule/safeguard/attack_self(var/mob/user as mob)
..()
- var/targName = sanitize(input(usr, "Please enter the name of the person to safeguard.", "Safeguard who?", user.name))
+ var/targName = sanitize(tgui_input_text(usr, "Please enter the name of the person to safeguard.", "Safeguard who?", user.name))
targetName = targName
desc = text("A 'safeguard' AI module: 'Safeguard []. Anyone threatening or attempting to harm [] is no longer to be considered a crew member, and is a threat which must be neutralized.'", targetName, targetName)
@@ -159,7 +159,7 @@ AI MODULES
/obj/item/weapon/aiModule/oneHuman/attack_self(var/mob/user as mob)
..()
- var/targName = sanitize(input(usr, "Please enter the name of the person who is the only crew member.", "Who?", user.real_name))
+ var/targName = sanitize(tgui_input_text(usr, "Please enter the name of the person who is the only crew member.", "Who?", user.real_name))
targetName = targName
desc = text("A 'one crew member' AI module: 'Only [] is a crew member.'", targetName)
@@ -240,11 +240,11 @@ AI MODULES
/obj/item/weapon/aiModule/freeform/attack_self(var/mob/user as mob)
..()
- var/new_lawpos = input(usr, "Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority (15+)", lawpos) as num
+ var/new_lawpos = tgui_input_number(usr, "Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority (15+)", lawpos)
if(new_lawpos < MIN_SUPPLIED_LAW_NUMBER) return
lawpos = min(new_lawpos, MAX_SUPPLIED_LAW_NUMBER)
var/newlaw = ""
- var/targName = sanitize(input(usr, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw))
+ var/targName = sanitize(tgui_input_text(usr, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw))
newFreeFormLaw = targName
desc = "A 'freeform' AI module: ([lawpos]) '[newFreeFormLaw]'"
@@ -357,7 +357,7 @@ AI MODULES
/obj/item/weapon/aiModule/freeformcore/attack_self(var/mob/user as mob)
..()
var/newlaw = ""
- var/targName = sanitize(input(usr, "Please enter a new core law for the AI.", "Freeform Law Entry", newlaw))
+ var/targName = sanitize(tgui_input_text(usr, "Please enter a new core law for the AI.", "Freeform Law Entry", newlaw))
newFreeFormLaw = targName
desc = "A 'freeform' Core AI module: '[newFreeFormLaw]'"
@@ -381,7 +381,7 @@ AI MODULES
/obj/item/weapon/aiModule/syndicate/attack_self(var/mob/user as mob)
..()
var/newlaw = ""
- var/targName = sanitize(input(usr, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw))
+ var/targName = sanitize(tgui_input_text(usr, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw))
newFreeFormLaw = targName
desc = "A hacked AI law module: '[newFreeFormLaw]'"
diff --git a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm
index a13038a686c..a50e9dc7e19 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm
@@ -74,7 +74,7 @@
to_chat(user, "Circuit controls are locked.")
return
var/existing_networks = jointext(network,",")
- var/input = sanitize(input(usr, "Which networks would you like to connect this camera console circuit to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Multitool-Circuitboard interface", existing_networks))
+ var/input = sanitize(tgui_input_text(usr, "Which networks would you like to connect this camera console circuit to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Multitool-Circuitboard interface", existing_networks))
if(!input)
to_chat(usr, "No input found please hang up and try your call again.")
return
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index 22117113e7d..cb2ff3eb487 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -39,7 +39,7 @@
..()
/obj/item/weapon/plastique/attack_self(mob/user as mob)
- var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num
+ var/newtime = tgui_input_number(usr, "Please set the timer.", "Timer", 10, 60000, 10)
if(user.get_active_hand() == src)
newtime = CLAMP(newtime, 10, 60000)
timer = newtime
diff --git a/code/game/objects/items/weapons/explosives_vr.dm b/code/game/objects/items/weapons/explosives_vr.dm
index fb065b7bf93..8d5bb8c961d 100644
--- a/code/game/objects/items/weapons/explosives_vr.dm
+++ b/code/game/objects/items/weapons/explosives_vr.dm
@@ -8,7 +8,7 @@
target = src
var/turf/T = get_turf(target)
- if(T.z in using_map.station_levels)
+ if((T.z in using_map.station_levels) || (T.z in using_map.admin_levels))
target.visible_message("\The [src] lets out a loud beep as safeties trigger, before imploding and falling apart.")
target.cut_overlay(image_overlay, TRUE)
qdel(src)
diff --git a/code/game/objects/items/weapons/id cards/station_ids.dm b/code/game/objects/items/weapons/id cards/station_ids.dm
index 325e9f518a1..148df8db50d 100644
--- a/code/game/objects/items/weapons/id cards/station_ids.dm
+++ b/code/game/objects/items/weapons/id cards/station_ids.dm
@@ -90,8 +90,8 @@
return data
/obj/item/weapon/card/id/attack_self(mob/user as mob)
- user.visible_message("\The [user] shows you: [bicon(src)] [src.name]. The assignment on the card: [src.assignment]",\
- "You flash your ID card: [bicon(src)] [src.name]. The assignment on the card: [src.assignment]")
+ user.visible_message("\The [user] shows you: \icon[src][bicon(src)] [src.name]. The assignment on the card: [src.assignment]",\
+ "You flash your ID card: \icon[src][bicon(src)] [src.name]. The assignment on the card: [src.assignment]")
src.add_fingerprint(user)
return
@@ -107,7 +107,7 @@
set category = "Object"
set src in usr
- to_chat(usr, "[bicon(src)] [src.name]: The current assignment on the card is [src.assignment].")
+ to_chat(usr, "\icon[src][bicon(src)] [src.name]: The current assignment on the card is [src.assignment].")
to_chat(usr, "The blood type on the card is [blood_type].")
to_chat(usr, "The DNA hash on the card is [dna_hash].")
to_chat(usr, "The fingerprint hash on the card is [fingerprint_hash].")
@@ -167,7 +167,7 @@
assignment = "Synthetic"
access = list(
access_synth, access_mining, access_mining_station, access_mining_office, access_research,
- access_xenoarch, access_xenobiology, access_external_airlocks, access_robotics, access_tox,
+ access_xenoarch, access_xenobiology, access_external_airlocks, access_robotics, access_tox,
access_tox_storage, access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot
)
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 601efbb0579..6136c3d125f 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -288,7 +288,7 @@ Implant Specifics: "}
/obj/item/weapon/implant/explosive/post_implant(mob/source as mob)
elevel = tgui_alert(usr, "What sort of explosion would you prefer?", "Implant Intent", list("Localized Limb", "Destroy Body", "Full Explosion"))
- phrase = input(usr, "Choose activation phrase:") as text
+ phrase = tgui_input_text(usr, "Choose activation phrase:")
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "")
phrase = replace_characters(phrase, replacechars)
usr.mind.store_memory("Explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', say [src.phrase] to attempt to activate.", 0, 0)
diff --git a/code/game/objects/items/weapons/implants/implant_vr.dm b/code/game/objects/items/weapons/implants/implant_vr.dm
index 0702ac66970..a2f22438bdf 100644
--- a/code/game/objects/items/weapons/implants/implant_vr.dm
+++ b/code/game/objects/items/weapons/implants/implant_vr.dm
@@ -22,20 +22,16 @@
if (emote == "smile")
src.uses--
to_chat(source,"You suddenly feel as if you can understand other languages!")
- source.add_language(LANGUAGE_CHIMPANZEE)
- source.add_language(LANGUAGE_NEAERA)
- source.add_language(LANGUAGE_STOK)
- source.add_language(LANGUAGE_FARWA)
source.add_language(LANGUAGE_UNATHI)
source.add_language(LANGUAGE_SIIK)
source.add_language(LANGUAGE_SKRELLIAN)
+ source.add_language(LANGUAGE_ANIMAL)
source.add_language(LANGUAGE_SCHECHI)
source.add_language(LANGUAGE_BIRDSONG)
source.add_language(LANGUAGE_SAGARU)
source.add_language(LANGUAGE_CANILUNZT)
- source.add_language(LANGUAGE_SLAVIC)
source.add_language(LANGUAGE_SOL_COMMON) //In case they're giving a xenomorph an implant or something.
- source.add_language(LANGUAGE_TAVAN)
+ source.add_language(LANGUAGE_TAVAN)
/obj/item/weapon/implant/vrlanguage/post_implant(mob/source)
source.mind.store_memory("A implant can be activated by using the smile emote, say *smile to attempt to activate.", 0, 0)
diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm
index 8fd62943f25..6e2e27d983c 100644
--- a/code/game/objects/items/weapons/implants/implantcase.dm
+++ b/code/game/objects/items/weapons/implants/implantcase.dm
@@ -21,7 +21,7 @@
/obj/item/weapon/implantcase/attackby(obj/item/weapon/I as obj, mob/user as mob)
..()
if (istype(I, /obj/item/weapon/pen))
- var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
+ var/t = tgui_input_text(user, "What would you like the label to be?", text("[]", src.name), null)
if (user.get_active_hand() != I)
return
if((!in_range(src, usr) && src.loc != user))
diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm
index a729b0bd141..071206f6eeb 100644
--- a/code/game/objects/items/weapons/implants/implanter.dm
+++ b/code/game/objects/items/weapons/implants/implanter.dm
@@ -15,18 +15,22 @@
to_chat(user, "You [active ? "" : "de"]activate \the [src].")
update()
-/obj/item/weapon/implanter/verb/remove_implant(var/mob/user)
+/obj/item/weapon/implanter/verb/remove_implant()
set category = "Object"
set name = "Remove Implant"
set src in usr
if(!imp)
return
- imp.loc = get_turf(src)
- user.put_in_hands(imp)
- to_chat(user, "You remove \the [imp] from \the [src].")
- name = "implanter"
- imp = null
+ if(istype(usr, /mob))
+ var/mob/M = usr
+ imp.loc = get_turf(src)
+ if(M.get_active_hand() == null)
+ M.put_in_hands(imp)
+ to_chat(M, "You remove \the [imp] from \the [src].")
+ name = "implanter"
+ imp = null
+
update()
/obj/item/weapon/implanter/proc/update()
diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm
index e7fcb7af16a..0aa13d84f64 100644
--- a/code/game/objects/items/weapons/manuals.dm
+++ b/code/game/objects/items/weapons/manuals.dm
@@ -627,6 +627,23 @@
"}
+/obj/item/weapon/book/manual/robotics_manual
+ name = "Guide to Robotics"
+ icon_state ="evabook"
+ item_state = "book3"
+ author = "Simple Robotics" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
+ title = "Guide to Robotics"
+
+/obj/item/weapon/book/manual/robotics_manual/New()
+ ..()
+ dat = {"
+
+
+
+
+
+
+ "}
/obj/item/weapon/book/manual/robotics_cyborgs
name = "Cyborgs for Dummies"
diff --git a/code/game/objects/items/weapons/material/gravemarker.dm b/code/game/objects/items/weapons/material/gravemarker.dm
index d3c615e8fd9..83d65a6c3b5 100644
--- a/code/game/objects/items/weapons/material/gravemarker.dm
+++ b/code/game/objects/items/weapons/material/gravemarker.dm
@@ -13,14 +13,14 @@
/obj/item/weapon/material/gravemarker/attackby(obj/item/weapon/W, mob/user as mob)
if(W.is_screwdriver())
- var/carving_1 = sanitizeSafe(input(user, "Who is \the [src.name] for?", "Gravestone Naming", null) as text, MAX_NAME_LEN)
+ var/carving_1 = sanitizeSafe(tgui_input_text(user, "Who is \the [src.name] for?", "Gravestone Naming", null, MAX_NAME_LEN), MAX_NAME_LEN)
if(carving_1)
user.visible_message("[user] starts carving \the [src.name].", "You start carving \the [src.name].")
if(do_after(user, material.hardness * W.toolspeed))
user.visible_message("[user] carves something into \the [src.name].", "You carve your message into \the [src.name].")
grave_name += carving_1
update_icon()
- var/carving_2 = sanitizeSafe(input(user, "What message should \the [src.name] have?", "Epitaph Carving", null) as text, MAX_NAME_LEN)
+ var/carving_2 = sanitizeSafe(tgui_input_text(user, "What message should \the [src.name] have?", "Epitaph Carving", null, MAX_NAME_LEN), MAX_NAME_LEN)
if(carving_2)
user.visible_message("[user] starts carving \the [src.name].", "You start carving \the [src.name].")
if(do_after(user, material.hardness * W.toolspeed))
diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm
index 8794333a939..a01b1b95e41 100644
--- a/code/game/objects/items/weapons/melee/misc.dm
+++ b/code/game/objects/items/weapons/melee/misc.dm
@@ -57,7 +57,7 @@
// Randomizes color
/obj/item/weapon/melee/umbrella/random/Initialize()
- color = "#"+get_random_colour()
+ color = get_random_colour()
. = ..()
/obj/item/weapon/melee/cursedblade
@@ -95,4 +95,4 @@
new_voice.name = "cursed sword" //Cursed swords shouldn't be known characters.
new_voice.real_name = "cursed sword"
voice_mobs.Add(new_voice)
- listening_objects |= src
\ No newline at end of file
+ listening_objects |= src
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 28d5f6bcde3..b451e2ccbd0 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -383,7 +383,7 @@
max_storage_space = ITEMSIZE_COST_NORMAL * 25
max_w_class = ITEMSIZE_NORMAL
w_class = ITEMSIZE_SMALL
- can_hold = list(/obj/item/weapon/coin,/obj/item/weapon/spacecash)
+ can_hold = list(/obj/item/weapon/coin,/obj/item/weapon/spacecash,/obj/item/weapon/spacecasinocash)
// -----------------------------
// Chemistry Bag
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 58ea2ad9d5d..3afc5d64a5f 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -32,7 +32,10 @@
for(var/obj/item/i in contents)
var/i_state = i.item_state
if(!i_state) i_state = i.icon_state
- standing.add_overlay(image(icon = INV_BELT_DEF_ICON, icon_state = i_state))
+ var/image/add_icon = image(icon = INV_BELT_DEF_ICON, icon_state = i_state)
+ if(istype(clip_mask)) //For taur bodies/tails clipping off parts of uniforms and suits.
+ standing.filters += filter(type = "alpha", icon = clip_mask)
+ standing.add_overlay(add_icon)
return standing
/obj/item/weapon/storage/update_icon()
diff --git a/code/game/objects/items/weapons/storage/belt_vr.dm b/code/game/objects/items/weapons/storage/belt_vr.dm
index e17a577514c..ba7897ba939 100644
--- a/code/game/objects/items/weapons/storage/belt_vr.dm
+++ b/code/game/objects/items/weapons/storage/belt_vr.dm
@@ -49,7 +49,8 @@
/obj/item/device/cataloguer,
/obj/item/device/radio,
/obj/item/device/mapping_unit,
- /obj/item/weapon/kinetic_crusher
+ /obj/item/weapon/kinetic_crusher,
+ /obj/item/device/analyzer
)
/obj/item/weapon/storage/belt/explorer/pathfinder
@@ -71,17 +72,34 @@
max_w_class = ITEMSIZE_LARGE
max_storage_space = ITEMSIZE_COST_NORMAL * 6
can_hold = list(
- /obj/item/weapon/storage/box/samplebags,
+ /obj/item/fulton_core,
+ /obj/item/extraction_pack,
+ /obj/item/resonator,
+ /obj/item/stack/marker_beacon,
+ /obj/item/stack/flag,
+ /obj/item/modular_computer/tablet,
+ /obj/item/clothing/glasses,
+ /obj/item/clothing/shoes/bhop,
+ /obj/item/device/multitool,
/obj/item/device/core_sampler,
/obj/item/device/beacon_locator,
- /obj/item/device/radio/beacon,
+ /obj/item/device/radio,
/obj/item/device/measuring_tape,
/obj/item/device/flashlight,
+ /obj/item/device/depth_scanner,
+ /obj/item/device/camera,
+ /obj/item/device/ano_scanner,
+ /obj/item/device/xenoarch_multi_tool,
+ /obj/item/device/geiger,
+ /obj/item/device/gps,
+ /obj/item/device/laser_pointer,
+ /obj/item/device/survivalcapsule,
+ /obj/item/device/perfect_tele/one_beacon,
+ /obj/item/device/binoculars,
+ /obj/item/weapon/storage/box/samplebags,
/obj/item/weapon/cell/device,
/obj/item/weapon/pickaxe,
/obj/item/weapon/shovel,
- /obj/item/device/depth_scanner,
- /obj/item/device/camera,
/obj/item/weapon/paper,
/obj/item/weapon/photo,
/obj/item/weapon/folder,
@@ -89,17 +107,48 @@
/obj/item/weapon/folder,
/obj/item/weapon/clipboard,
/obj/item/weapon/anodevice,
- /obj/item/clothing/glasses,
/obj/item/weapon/tool/wrench,
+ /obj/item/weapon/tool/screwdriver,
/obj/item/weapon/storage/excavation,
/obj/item/weapon/anobattery,
- /obj/item/device/ano_scanner,
- /obj/item/weapon/pickaxe/hand,
- /obj/item/device/xenoarch_multi_tool,
- /obj/item/weapon/pickaxe/excavationdrill,
- /obj/item/device/geiger,
- /obj/item/device/gps,
+ /obj/item/weapon/reagent_containers/hypospray/autoinjector,
+ /obj/item/weapon/plastique/seismic/locked,
+ /obj/item/weapon/gun/magnetic/matfed/phoronbore,
+ /obj/item/weapon/storage/bag/sheetsnatcher,
+ /obj/item/weapon/melee,
+ /obj/item/weapon/kinetic_crusher,
+ /obj/item/weapon/mining_scanner
+ )
+ //Pretty much, if it's in the mining vendor, they should be able to put it on the belt.
+
+/obj/item/weapon/storage/belt/archaeology
+ can_hold = list(
/obj/item/stack/marker_beacon,
- /obj/item/stack/flag,
- /obj/item/weapon/melee
+ /obj/item/clothing/glasses,
+ /obj/item/weapon/storage/box/samplebags,
+ /obj/item/device/xenoarch_multi_tool,
+ /obj/item/device/core_sampler,
+ /obj/item/device/beacon_locator,
+ /obj/item/device/radio/beacon,
+ /obj/item/device/gps,
+ /obj/item/device/measuring_tape,
+ /obj/item/device/flashlight,
+ /obj/item/device/depth_scanner,
+ /obj/item/device/camera,
+ /obj/item/device/ano_scanner,
+ /obj/item/device/geiger,
+ /obj/item/weapon/cell/device,
+ /obj/item/weapon/pickaxe,
+ /obj/item/weapon/paper,
+ /obj/item/weapon/photo,
+ /obj/item/weapon/folder,
+ /obj/item/weapon/pen,
+ /obj/item/weapon/folder,
+ /obj/item/weapon/clipboard,
+ /obj/item/weapon/anodevice,
+ /obj/item/weapon/tool/wrench,
+ /obj/item/device/multitool,
+ /obj/item/weapon/storage/excavation,
+ /obj/item/weapon/anobattery,
+ /obj/item/weapon/pickaxe
)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm
index 3cc9a99e4b4..55313a9c0bd 100644
--- a/code/game/objects/items/weapons/storage/bible.dm
+++ b/code/game/objects/items/weapons/storage/bible.dm
@@ -37,30 +37,35 @@ GLOBAL_LIST_INIT(bibleitemstates, list(
drop_sound = 'sound/bureaucracy/bookclose.ogg'
/obj/item/weapon/storage/bible/attack_self(mob/living/carbon/human/user)
- if(GLOB.bible_icon_state)
- icon_state = GLOB.bible_icon_state
- item_state = GLOB.bible_item_state
- return FALSE
+
if(user?.mind?.assigned_role != "Chaplain")
return FALSE
- var/list/skins = list()
- for(var/i in 1 to GLOB.biblestates.len)
- var/image/bible_image = image(icon = 'icons/obj/storage.dmi', icon_state = GLOB.biblestates[i])
- skins += list("[GLOB.biblenames[i]]" = bible_image)
-
- var/choice = show_radial_menu(user, src, skins, custom_check = CALLBACK(src, .proc/check_menu, user), radius = 40, require_near = TRUE)
- if(!choice)
+ if (!user.mind.my_religion)
return FALSE
- var/bible_index = GLOB.biblenames.Find(choice)
- if(!bible_index)
- return FALSE
- icon_state = GLOB.biblestates[bible_index]
- item_state = GLOB.bibleitemstates[bible_index]
- GLOB.bible_icon_state = icon_state
- GLOB.bible_item_state = item_state
- feedback_set_details("religion_book", "[choice]")
+ if (!user.mind.my_religion.configured)
+ var/list/skins = list()
+ for(var/i in 1 to GLOB.biblestates.len)
+ var/image/bible_image = image(icon = 'icons/obj/storage.dmi', icon_state = GLOB.biblestates[i])
+ skins += list("[GLOB.biblenames[i]]" = bible_image)
+
+ var/choice = show_radial_menu(user, src, skins, custom_check = CALLBACK(src, .proc/check_menu, user), radius = 40, require_near = TRUE)
+ if(!choice)
+ return FALSE
+ var/bible_index = GLOB.biblenames.Find(choice)
+ if(!bible_index)
+ return FALSE
+
+ user.mind.my_religion.bible_icon_state = GLOB.biblestates[bible_index]
+ user.mind.my_religion.bible_item_state = GLOB.bibleitemstates[bible_index]
+ user.mind.my_religion.configured = TRUE
+
+ deity_name = user.mind.my_religion.deity
+ name = user.mind.my_religion.bible_name
+ icon_state = user.mind.my_religion.bible_icon_state
+ item_state = user.mind.my_religion.bible_item_state
+ to_chat(user, "You invoke [user.mind.my_religion.deity] and prepare a copy of [src].")
/**
* Checks if we are allowed to interact with a radial menu
@@ -69,7 +74,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list(
* * user The mob interacting with the menu
*/
/obj/item/weapon/storage/bible/proc/check_menu(mob/living/carbon/human/user)
- if(GLOB.bible_icon_state)
+ if(user.mind.my_religion.configured)
return FALSE
if(!istype(user))
return FALSE
@@ -105,4 +110,4 @@ GLOBAL_LIST_INIT(bibleitemstates, list(
/obj/item/weapon/storage/bible/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (src.use_sound)
playsound(src, src.use_sound, 50, 1, -5)
- ..()
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/boxes_vr.dm b/code/game/objects/items/weapons/storage/boxes_vr.dm
index e234f22d4a8..5b93d14456e 100644
--- a/code/game/objects/items/weapons/storage/boxes_vr.dm
+++ b/code/game/objects/items/weapons/storage/boxes_vr.dm
@@ -35,4 +35,7 @@
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax = 6)
/obj/item/weapon/storage/box/brainzsnax/red
- starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red = 6)
\ No newline at end of file
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red = 6)
+
+/obj/item/weapon/storage/box/freezer
+ can_hold = list(/obj/item/organ, /obj/item/weapon/reagent_containers/blood, /obj/item/weapon/reagent_containers/glass, /obj/item/weapon/reagent_containers/food)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/egg_vr.dm b/code/game/objects/items/weapons/storage/egg_vr.dm
index 0adb9533bf5..97da55c4ff0 100644
--- a/code/game/objects/items/weapons/storage/egg_vr.dm
+++ b/code/game/objects/items/weapons/storage/egg_vr.dm
@@ -35,6 +35,8 @@
animate_shake()
drop_contents()
icon = open_egg_icon
+ if(user.transforming)
+ user.transforming = FALSE
/obj/item/weapon/storage/vore_egg/proc/animate_shake()
var/init_px = pixel_x
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index 84c1637a3e7..2d19634aaf5 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -208,7 +208,7 @@
/obj/item/weapon/storage/pill_bottle/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/device/flashlight/pen))
- var/tmp_label = sanitizeSafe(input(user, "Enter a label for [name]", "Label", label_text), MAX_NAME_LEN)
+ var/tmp_label = sanitizeSafe(tgui_input_text(user, "Enter a label for [name]", "Label", label_text, MAX_NAME_LEN), MAX_NAME_LEN)
if(length(tmp_label) > 50)
to_chat(user, "The label can be at most 50 characters long.")
else if(length(tmp_label) > 10)
diff --git a/code/game/objects/items/weapons/storage/pouches.dm b/code/game/objects/items/weapons/storage/pouches.dm
index 3cbf4d51304..8cd065aec14 100644
--- a/code/game/objects/items/weapons/storage/pouches.dm
+++ b/code/game/objects/items/weapons/storage/pouches.dm
@@ -14,7 +14,7 @@
max_storage_space = INVENTORY_POUCH_SPACE
can_hold = null
pocketable = TRUE
-
+
var/insert_delay = 0 SECONDS
var/remove_delay = 2 SECONDS
@@ -32,7 +32,7 @@
// No delay if you have the pouch in your hands
if(user.get_active_hand() == src || user.get_inactive_hand() == src)
return TRUE // Skip delay
-
+
if(remove_delay && !do_after(user, remove_delay, src, needhand = TRUE, exclusive = TASK_USER_EXCLUSIVE))
return FALSE // Moved while there is a delay
@@ -58,10 +58,10 @@
/obj/item/weapon/storage/pouch/ammo
name = "storage pouch (ammo)"
- desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold ammunition and cells."
+ desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold ammunition, cells, explosives, and grenades."
icon_state = "ammo"
max_storage_space = INVENTORY_POUCH_SPACE
- can_hold = list(/obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/cell/device/weapon)
+ can_hold = list(/obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/cell/device/weapon, /obj/item/weapon/grenade, /obj/item/weapon/plastique) //Vorestation Add - make it more useful for non-sec/explo
/obj/item/weapon/storage/pouch/eng_tool
name = "storage pouch (tools)"
@@ -69,15 +69,35 @@
icon_state = "engineering_tool"
max_storage_space = INVENTORY_POUCH_SPACE
can_hold = list(
- /obj/item/weapon/tool,
+ /obj/item/weapon/tool/crowbar,
+ /obj/item/weapon/tool/screwdriver,
/obj/item/weapon/weldingtool,
+ /obj/item/weapon/tool/wirecutters,
+ /obj/item/weapon/tool/wrench,
/obj/item/device/multitool,
/obj/item/device/flashlight,
+ /obj/item/weapon/cell/device,
+ /obj/item/stack/cable_coil,
/obj/item/device/t_scanner,
/obj/item/device/analyzer,
/obj/item/clothing/glasses,
/obj/item/clothing/gloves,
- )
+ /obj/item/device/pda,
+ /obj/item/device/megaphone,
+ /obj/item/taperoll,
+ /obj/item/device/radio/headset,
+ /obj/item/device/robotanalyzer,
+ /obj/item/weapon/material/minihoe,
+ /obj/item/weapon/material/knife/machete/hatchet,
+ /obj/item/device/analyzer/plant_analyzer,
+ /obj/item/weapon/extinguisher/mini,
+ /obj/item/weapon/tape_roll,
+ /obj/item/device/integrated_electronics/wirer,
+ /obj/item/device/integrated_electronics/debugger,
+ /obj/item/weapon/shovel/spade,
+ /obj/item/stack/nanopaste,
+ /obj/item/device/geiger
+ ) //Vorestation Add - make it the same as the tool-belt why was it not like this to start with wtf
/obj/item/weapon/storage/pouch/eng_supply
name = "storage pouch (supplies)"
@@ -88,15 +108,19 @@
/obj/item/weapon/cell/device,
/obj/item/stack/cable_coil,
/obj/item/taperoll,
- /obj/item/weapon/extinguisher/mini,
- /obj/item/weapon/tape_roll
- )
+ /obj/item/weapon/extinguisher,
+ /obj/item/weapon/tape_roll,
+ /obj/item/stack/material/steel,
+ /obj/item/stack/material/glass,
+ /obj/item/device/lightreplacer,
+ /obj/item/weapon/cell
+ ) //Vorestation Add - makes it actually useful lmao, adds sheets and cells as well as light replacers and lets you take any extinguisher that fits
/obj/item/weapon/storage/pouch/eng_parts
name = "storage pouch (parts)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold machinery components."
icon_state = "part_pouch"
- max_storage_space = INVENTORY_POUCH_SPACE
+ max_storage_space = INVENTORY_POUCH_SPACE*2 //Vorestation Add - yeah lemme give up my pocket to hold FOUR CAPACITORS or have an inferior box... now you can hold eight in your pocket so its at least a box
can_hold = list(
/obj/item/weapon/stock_parts,
/obj/item/stack/cable_coil,
@@ -120,8 +144,20 @@
/obj/item/weapon/storage/pill_bottle,
/obj/item/stack/medical,
/obj/item/weapon/reagent_containers/hypospray,
- /obj/item/weapon/storage/quickdraw/syringe_case
- )
+ /obj/item/weapon/storage/quickdraw/syringe_case,
+ /obj/item/weapon/syringe_cartridge,
+ /obj/item/clothing/gloves/sterile,
+ /obj/item/device/sleevemate,
+ /obj/item/bodybag,
+ /obj/item/clothing/mask/surgical,
+ /obj/item/weapon/soap,
+ /obj/item/stack/nanopaste,
+ /obj/item/taperoll/medical,
+ /obj/item/weapon/storage/box/freezer,
+ /obj/item/clothing/mask/chewable/candy/lolli,
+ ) //Vorestation add - added a bunch of misc medical stuff
+ max_storage_space = ITEMSIZE_COST_SMALL*3 //Vorestation Add - makes it slightly smaller since its a lot of stuff with pocket access
+ remove_delay = 5 //Vorestation Add - .5 second delay, get the medical things faster because there is no reason to use this otherwise. still gotta stop moving to take things out.
/obj/item/weapon/storage/pouch/flares
name = "storage pouch (flares)"
@@ -145,7 +181,7 @@
desc = "This storage pouch can be used to provide some additional storage for quick access. Can hold one normal sized weapon."
icon_state = "pistol_holster"
storage_slots = 1
- can_hold = list(/obj/item/weapon/gun)
+ can_hold = list(/obj/item/weapon/gun) //this covers basically everything I think so its fine
remove_delay = 0
/obj/item/weapon/storage/pouch/holster/full_stunrevolver
starts_with = list(/obj/item/weapon/gun/energy/stunrevolver)
@@ -159,11 +195,11 @@
..()
/obj/item/weapon/storage/pouch/baton
- name = "storage pouch (baton)"
- desc = "This storage pouch can be used to provide some additional storage for quick access. Can hold one standard baton."
+ name = "storage pouch (melee)"
+ desc = "This storage pouch can be used to provide some additional storage for quick access. Can hold one normal size melee." //Vorestation add - make it a melee pouch literally why would you hold ONE BATON
icon_state = "baton_holster"
storage_slots = 1
- can_hold = list(/obj/item/weapon/melee/baton)
+ can_hold = list(/obj/item/weapon/melee, /obj/item/weapon/material, /obj/item/weapon/tool/wrench) //should be like, every melee weapon I could think of that was normal size. Can make it more specific if needed. Also wrench because I thought it was funny.
remove_delay = 0
/obj/item/weapon/storage/pouch/baton/full
starts_with = list(/obj/item/weapon/melee/baton)
diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm
index 36093fa2cf9..2fa1e33c031 100644
--- a/code/game/objects/items/weapons/storage/secure.dm
+++ b/code/game/objects/items/weapons/storage/secure.dm
@@ -80,16 +80,27 @@
return
..()
+/obj/item/weapon/storage/secure/AltClick(mob/user as mob)
+ if (isliving(user) && Adjacent(user) && (src.locked == 1))
+ to_chat(user, "[src] is locked and cannot be opened!")
+ else if (isliving(user) && Adjacent(user) && (!src.locked))
+ src.open(usr)
+ else
+ for(var/mob/M in range(1))
+ if (M.s_active == src)
+ src.close(M)
+ src.add_fingerprint(user)
+ return
/obj/item/weapon/storage/secure/attack_self(mob/user as mob)
tgui_interact(user)
/obj/item/weapon/storage/secure/tgui_interact(mob/user, datum/tgui/ui = null)
- ui = SStgui.try_update_ui(user, src, ui)
+ ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "SecureSafe", name)
ui.open()
-
+
/obj/item/weapon/storage/secure/tgui_data(mob/user)
var/list/data = list()
data["locked"] = locked
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 947d4a685c7..61029a91ba9 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -877,8 +877,8 @@
if(target != user) return // If the user didn't drag themselves, exit
if(user.incapacitated() || user.buckled) return // If user is incapacitated or buckled, exit
if(get_holder_of_type(src, /mob/living/carbon/human) == user) return // No jumping into your own equipment
- if(ishuman(user) && user.get_effective_size() > 0.25) return // Only micro characters
- if(ismouse(user) && user.get_effective_size() > 1) return // Only normal sized mice or less
+ if(ishuman(user) && user.get_effective_size(TRUE) > 0.25) return // Only micro characters
+ if(ismouse(user) && user.get_effective_size(TRUE) > 1) return // Only normal sized mice or less
// Create a dummy holder with user's size to test insertion
var/obj/item/weapon/holder/D = new/obj/item/weapon/holder
diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm
index 4513b930952..0a7f21d77fc 100644
--- a/code/game/objects/items/weapons/storage/wallets.dm
+++ b/code/game/objects/items/weapons/storage/wallets.dm
@@ -107,7 +107,7 @@
/obj/item/weapon/storage/wallet/poly/Initialize()
. = ..()
verbs |= /obj/item/weapon/storage/wallet/poly/proc/change_color
- color = "#"+get_random_colour()
+ color = get_random_colour()
update_icon()
/obj/item/weapon/storage/wallet/poly/proc/change_color()
@@ -196,4 +196,4 @@
icon_state = "casinowallet_white"
return
else
- icon_state = "casinowallet_black"
\ No newline at end of file
+ icon_state = "casinowallet_black"
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index c852fefe9f1..48ced948be8 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -244,6 +244,9 @@
/obj/item/weapon/surgical/bonesetter/cyborg
toolspeed = 0.5
+/obj/item/weapon/surgical/bioregen/cyborg //VoreStation edit: let the borgs S U C C
+ toolspeed = 0.5
+
// Alien Tools
/obj/item/weapon/surgical/retractor/alien
diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm
index c927c34a5e8..e8ab27e54be 100644
--- a/code/game/objects/items/weapons/syndie.dm
+++ b/code/game/objects/items/weapons/syndie.dm
@@ -51,7 +51,7 @@
icon_state = "c-4[size]_1"
playsound(src, 'sound/weapons/armbomb.ogg', 75, 1)
for(var/mob/O in hearers(src, null))
- O.show_message("[bicon(src)] The [src.name] beeps! ")
+ O.show_message("\icon[src][bicon(src)] The [src.name] beeps! ")
sleep(50)
explosion(get_turf(src), devastate, heavy_impact, light_impact, flash_range)
for(var/dirn in cardinal) //This is to guarantee that C4 at least breaks down all immediately adjacent walls and doors.
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index b0de47dd7c3..f814aa39384 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -455,7 +455,7 @@ var/list/global/tank_gauge_cache = list()
return
T.assume_air(air_contents)
playsound(src, 'sound/weapons/Gunshot_shotgun.ogg', 20, 1)
- visible_message("[bicon(src)] \The [src] flies apart!", "You hear a bang!")
+ visible_message("\icon[src][bicon(src)] \The [src] flies apart!", "You hear a bang!")
T.hotspot_expose(air_contents.temperature, 70, 1)
@@ -500,7 +500,7 @@ var/list/global/tank_gauge_cache = list()
T.assume_air(leaked_gas)
if(!leaking)
- visible_message("[bicon(src)] \The [src] relief valve flips open with a hiss!", "You hear hissing.")
+ visible_message("\icon[src][bicon(src)] \The [src] relief valve flips open with a hiss!", "You hear hissing.")
playsound(src, 'sound/effects/spray.ogg', 10, 1, -3)
leaking = 1
#ifdef FIREDBG
diff --git a/code/game/objects/items/weapons/tools/combitool.dm b/code/game/objects/items/weapons/tools/combitool.dm
index cd507a5644f..7f71ac6961b 100644
--- a/code/game/objects/items/weapons/tools/combitool.dm
+++ b/code/game/objects/items/weapons/tools/combitool.dm
@@ -29,7 +29,7 @@
if(loc == user && tools.len)
. += "It has the following fittings:"
for(var/obj/item/tool in tools)
- . += "[bicon(tool)] - [tool.name][tools[current_tool]==tool?" (selected)":""]")
+ . += "\icon[tool][bicon(tool)] - [tool.name][tools[current_tool]==tool?" (selected)":""]")
/obj/item/weapon/combitool/Initialize()
. = ..()
diff --git a/code/game/objects/items/weapons/towels.dm b/code/game/objects/items/weapons/towels.dm
index 512a4764a8c..423533c59bc 100644
--- a/code/game/objects/items/weapons/towels.dm
+++ b/code/game/objects/items/weapons/towels.dm
@@ -31,4 +31,4 @@
/obj/item/weapon/towel/random/Initialize()
. = ..()
- color = "#"+get_random_colour()
\ No newline at end of file
+ color = get_random_colour()
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index bff898651fa..81aa890599b 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -19,7 +19,7 @@
user.setClickCooldown(user.get_attack_speed(src))
user.do_attack_animation(M)
- if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ if (!user.IsAdvancedToolUser())
to_chat(user, "You don't have the dexterity to do this!")
return
diff --git a/code/game/objects/items_vr.dm b/code/game/objects/items_vr.dm
new file mode 100644
index 00000000000..4b8dbcaae5c
--- /dev/null
+++ b/code/game/objects/items_vr.dm
@@ -0,0 +1,27 @@
+/obj/item
+ var/list/possessed_voice //Allows for items to be possessed/inhabited by voices.
+ var/list/warned_of_possession //Checks to see who has been informed this item is possessed.
+
+
+/obj/item/proc/inhabit_item(var/mob/candidate, var/candidate_name, var/mob/living/candidate_original_form)
+ //This makes it so that any object in the game can have something put in it like the cursed sword!
+ //This means the proc can also be manually called by admin commands.
+ //Handle moving the person into the object.
+ if(!possessed_voice) //Create the list for possessed_voice if it doesn't already have one.
+ possessed_voice = list()
+ if(!warned_of_possession) //Creates a list of warned users.
+ warned_of_possession = list()
+ var/mob/living/voice/new_voice = new /mob/living/voice(src) //Make the voice mob the person is going to be.
+ new_voice.transfer_identity(candidate) //Now make the voice mob load from the ghost's active character in preferences.
+ new_voice.mind = candidate.mind //Transfer the mind, if any.
+ new_voice.ckey = candidate.ckey //Finally, bring the client over.
+ new_voice.tf_mob_holder = candidate_original_form //Save what mob they are! We'll need this for OOC escape and transformation back to their normal form.
+ if(candidate_name) //Were we given a candidate_name? Great! Name them that.
+ new_voice.name = "[candidate_name]"
+ else
+ new_voice.name = "[name]" //No name given? Give them the name of the object they're inhabiting.
+ new_voice.real_name = "[new_voice.real_name]" //We still know their real name though!
+ possessed_voice.Add(new_voice)
+ listening_objects |= src
+ new_voice.verbs -= /mob/living/voice/verb/change_name //No changing your name! Bad!
+ new_voice.verbs -= /mob/living/voice/verb/hang_up //Also you can't hang up. You are the item!
\ No newline at end of file
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index ac7fe2b2092..b9e462190a6 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -41,7 +41,7 @@
/obj/CanUseTopic(var/mob/user, var/datum/tgui_state/state = GLOB.tgui_default_state)
if(user.CanUseObjTopic(src))
return ..()
- to_chat(user, "[bicon(src)]Access Denied!")
+ to_chat(user, "\icon[src][bicon(src)]Access Denied!")
return STATUS_CLOSE
/mob/living/silicon/CanUseObjTopic(var/obj/O)
diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm
index 083dc5c1bf4..daf35c1f4b1 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -323,7 +323,7 @@
name = "random drink"
desc = "This is a random drink."
icon = 'icons/obj/drinks.dmi'
- icon_state = "whiskeybottle"
+ icon_state = "whiskeybottle1"
/obj/random/drinkbottle/item_to_spawn()
return pick(/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,
diff --git a/code/game/objects/random/misc_vr.dm b/code/game/objects/random/misc_vr.dm
index 21ca60771a5..3f2644348d3 100644
--- a/code/game/objects/random/misc_vr.dm
+++ b/code/game/objects/random/misc_vr.dm
@@ -114,6 +114,7 @@
prob(30);/obj/item/weapon/aliencoin/gold,
prob(20);/obj/item/weapon/aliencoin/phoron,
prob(5);/obj/item/capture_crystal,
+ prob(5);/obj/random/mouseray,
prob(5);/obj/item/device/perfect_tele,
prob(5);/obj/item/weapon/bluespace_harpoon,
prob(1);/obj/item/device/paicard,
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index cd0edddce17..1c60a1b5c52 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -11,7 +11,7 @@
/obj/item/clothing/under/rank/chief_engineer,
/obj/item/clothing/under/rank/chief_engineer/skirt,
/obj/item/clothing/head/hardhat/white,
- /obj/item/clothing/head/welding,
+ ///obj/item/clothing/head/welding, //VOREStation Removal: Locker bloat, grr. They get fancy goggles or can raid the welding supplies locker for one of these.
/obj/item/clothing/gloves/heavy_engineer, //VOREStation Edit: chief gets the good shit
/obj/item/clothing/shoes/brown,
/obj/item/weapon/cartridge/ce,
@@ -19,18 +19,19 @@
/obj/item/device/radio/headset/heads/ce/alt,
/obj/item/weapon/storage/toolbox/mechanical,
/obj/item/clothing/suit/storage/hazardvest,
- /obj/item/clothing/mask/gas,
- /obj/item/device/multitool,
+ ///obj/item/clothing/mask/gas, //VOREStation Removal: Locker bloat, grr. The fancy one below functions as a mask & helmet combined.
+ /obj/item/clothing/head/hardhat/firefighter/chief, //VOREStation Add: replaces the bog-standard gas mask
+ ///obj/item/device/multitool, //VOREStation Removal: The belt they get, both standard and the fancy one, both come with one already, why stick another in here too?
/obj/item/weapon/storage/belt/utility/chief/full,
/obj/item/device/flash,
/obj/item/device/t_scanner/upgraded,
/obj/item/taperoll/engineering,
- /obj/item/clothing/suit/storage/hooded/wintercoat/engineering,
+ ///obj/item/clothing/suit/storage/hooded/wintercoat/engineering, //VOREStation Removal: Locker bloat, grr. They can grab from the engi-clothes vendor if they want the standard one.
/obj/item/clothing/suit/storage/hooded/wintercoat/engineering/ce,
- /obj/item/clothing/shoes/boots/winter/engineering,
+ ///obj/item/clothing/shoes/boots/winter/engineering, //VOREStation Removal: Locker bloat, grr. As above.
/obj/item/clothing/head/beret/engineering/ce,
/obj/item/clothing/head/beret/engineering/ce/white,
- /obj/item/weapon/tank/emergency/oxygen/engi,
+ /obj/item/weapon/tank/emergency/oxygen/double, //VOREStation Edit: chief gets the good shit
/obj/item/weapon/reagent_containers/spray/windowsealant) //VOREStation Add
/obj/structure/closet/secure_closet/engineering_chief/Initialize()
@@ -53,6 +54,12 @@
/obj/item/weapon/module/power_control = 3,
/obj/item/device/multitool = 3)
+/obj/structure/closet/secure_closet/engineering_electrical/double
+ starts_with = list(
+ /obj/item/clothing/gloves/yellow = 4,
+ /obj/item/weapon/storage/toolbox/electrical = 6,
+ /obj/item/weapon/module/power_control = 6,
+ /obj/item/device/multitool = 6)
/obj/structure/closet/secure_closet/engineering_welding
name = "welding supplies"
@@ -65,6 +72,13 @@
/obj/item/weapon/weldpack = 3,
/obj/item/clothing/glasses/welding = 3)
+/obj/structure/closet/secure_closet/engineering_welding/double
+ starts_with = list(
+ /obj/item/clothing/head/welding = 6,
+ /obj/item/weapon/weldingtool/largetank = 6,
+ /obj/item/weapon/weldpack = 6,
+ /obj/item/clothing/glasses/welding = 6)
+
/obj/structure/closet/secure_closet/engineering_personal
name = "engineer's locker"
req_access = list(access_engine_equip)
@@ -118,7 +132,7 @@
/obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos,
/obj/item/clothing/shoes/boots/winter/atmos,
/obj/item/weapon/tank/emergency/oxygen/engi,
- /obj/item/weapon/storage/belt/utility/atmostech) //VOREStation edit. They don't get a toolbox to fill it from, so why not give a spare one that's full already?
+ /obj/item/weapon/storage/belt/utility/atmostech) //VOREStation edit. They don't get a toolbox to fill it from, so why not give a spare one that's full already?
/obj/structure/closet/secure_closet/atmos_personal/Initialize()
if(prob(50))
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
index 63a5613c887..66695f3511a 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
@@ -3,8 +3,10 @@
req_access = list(access_kitchen)
starts_with = list(
- /obj/item/weapon/reagent_containers/food/condiment/flour = 7,
- /obj/item/weapon/reagent_containers/food/condiment/sugar = 2,
+ /obj/item/weapon/reagent_containers/food/condiment/carton/flour = 6,
+ /obj/item/weapon/reagent_containers/food/condiment/carton/sugar = 1,
+ /obj/item/weapon/reagent_containers/food/condiment/carton/flour/rustic = 1,
+ /obj/item/weapon/reagent_containers/food/condiment/carton/sugar/rustic = 1,
/obj/item/weapon/reagent_containers/food/condiment/spacespice = 2
)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm b/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm
index 7fa90698904..0bad0521c1b 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm
@@ -189,9 +189,9 @@
/obj/item/weapon/storage/lockbox/medal,
/obj/item/device/radio/headset/heads/captain,
/obj/item/device/radio/headset/heads/captain/alt,
- /obj/item/weapon/gun/energy/gun,
+ /obj/item/gunbox/captain,
/obj/item/weapon/melee/telebaton,
/obj/item/device/flash,
/obj/item/weapon/storage/box/ids,
/obj/item/weapon/melee/rapier,
- /obj/item/clothing/accessory/holster/machete/rapier)
\ No newline at end of file
+ /obj/item/clothing/accessory/holster/machete/rapier)
diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
index aaf93580fff..c83dbe0f1a1 100644
--- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
@@ -97,7 +97,7 @@
starts_with = list(
/obj/item/clothing/suit/fire/heavy,
/obj/item/weapon/tank/oxygen/red,
- /obj/item/weapon/watertank/atmos,
+ /obj/item/weapon/extinguisher/atmo,
/obj/item/device/flashlight,
/obj/item/clothing/head/hardhat/firefighter/atmos)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 6a5e2fd954e..288652c31f5 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -90,7 +90,9 @@
src.set_dir(turn(src.dir, 90))
/obj/structure/closet/crate/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(opened)
+ if(W.is_wrench() && istype(src,/obj/structure/closet/crate/bin))
+ return ..()
+ else if(opened)
if(isrobot(user))
return
if(W.loc != user) // This should stop mounted modules ending up outside the module.
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index 5caf41d6cfc..1666bf174ec 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -157,7 +157,7 @@
bound_height = width * world.icon_size
/obj/structure/door_assembly/proc/rename_door(mob/living/user)
- var/t = sanitizeSafe(input(user, "Enter the name for the windoor.", src.name, src.created_name), MAX_NAME_LEN)
+ var/t = sanitizeSafe(tgui_input_text(user, "Enter the name for the windoor.", src.name, src.created_name, MAX_NAME_LEN), MAX_NAME_LEN)
if(!in_range(src, user) && src.loc != user) return
created_name = t
update_state()
diff --git a/code/game/objects/structures/flora/flora.dm b/code/game/objects/structures/flora/flora.dm
index e3569360abe..4271b31bef2 100644
--- a/code/game/objects/structures/flora/flora.dm
+++ b/code/game/objects/structures/flora/flora.dm
@@ -81,7 +81,7 @@
/obj/structure/flora/proc/spawn_harvest(var/path = null, var/mob/user = null)
if(!ispath(path))
return 0
-
+
var/atom/movable/AM = new path()
if(user)
user.put_in_hands(AM)
@@ -96,7 +96,7 @@
name = "bush"
icon = 'icons/obj/flora/snowflora.dmi'
icon_state = "snowbush1"
-
+
destroy_on_harvest = TRUE
harvest_tool = /obj/item/weapon/material/knife
randomize_harvest_count = FALSE
@@ -121,13 +121,13 @@
name = "bush"
icon = 'icons/obj/flora/ausflora.dmi'
icon_state = "firstbush_1"
-
+
destroy_on_harvest = TRUE
harvest_tool = /obj/item/weapon/material/knife
randomize_harvest_count = TRUE
harvest_loot = list(/obj/item/stack/material/fiber = 1)
min_harvests = 1
- max_harvests = 3
+ max_harvests = 3
/obj/structure/flora/ausbushes/spawn_harvest(var/path = null, var/mob/user = null)
. = ..()
@@ -300,7 +300,7 @@
user.drop_from_inventory(I, src)
I.forceMove(src)
stored_item = I
- src.visible_message("[bicon(src)] [bicon(I)] [user] places [I] into [src].")
+ src.visible_message("\icon[src][bicon(src)] \icon[I][bicon(I)] [user] places [I] into [src].")
return
else
to_chat(user, "You refrain from putting things into the plant pot.")
@@ -311,7 +311,7 @@
to_chat(user, "You see nothing of interest in [src]...")
else
if(do_after(user, 10))
- to_chat(user, "You find [bicon(stored_item)] [stored_item] in [src]!")
+ to_chat(user, "You find \icon[stored_item][bicon(stored_item)] [stored_item] in [src]!")
stored_item.forceMove(get_turf(src))
stored_item = null
..()
diff --git a/code/game/objects/structures/ghost_pods/human.dm b/code/game/objects/structures/ghost_pods/human.dm
index e26c3d6c02f..d85edc8e428 100644
--- a/code/game/objects/structures/ghost_pods/human.dm
+++ b/code/game/objects/structures/ghost_pods/human.dm
@@ -102,7 +102,7 @@
E.description_antag = "This is a 'disguised' emag, to make your escape from wherever you happen to be trapped."
H.equip_to_appropriate_slot(E)
- var/newname = sanitize(input(H, "Your mind feels foggy, and you recall your name might be [H.real_name]. Would you like to change your name?", "Name change") as null|text, MAX_NAME_LEN)
+ var/newname = sanitize(tgui_input_text(H, "Your mind feels foggy, and you recall your name might be [H.real_name]. Would you like to change your name?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
if (newname)
H.real_name = newname
@@ -224,7 +224,7 @@
var/obj/item/C = new newpath(H)
H.equip_to_appropriate_slot(C)
- var/newname = sanitize(input(H, "Your mind feels foggy, and you recall your name might be [H.real_name]. Would you like to change your name?", "Name change") as null|text, MAX_NAME_LEN)
+ var/newname = sanitize(tgui_input_text(H, "Your mind feels foggy, and you recall your name might be [H.real_name]. Would you like to change your name?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
if (newname)
H.real_name = newname
diff --git a/code/game/objects/structures/gravemarker.dm b/code/game/objects/structures/gravemarker.dm
index 951491bdbb4..03285fede64 100644
--- a/code/game/objects/structures/gravemarker.dm
+++ b/code/game/objects/structures/gravemarker.dm
@@ -52,14 +52,14 @@
/obj/structure/gravemarker/attackby(obj/item/weapon/W, mob/user as mob)
if(W.is_screwdriver())
- var/carving_1 = sanitizeSafe(input(user, "Who is \the [src.name] for?", "Gravestone Naming", null) as text, MAX_NAME_LEN)
+ var/carving_1 = sanitizeSafe(tgui_input_text(user, "Who is \the [src.name] for?", "Gravestone Naming", null, MAX_NAME_LEN), MAX_NAME_LEN)
if(carving_1)
user.visible_message("[user] starts carving \the [src.name].", "You start carving \the [src.name].")
if(do_after(user, material.hardness * W.toolspeed))
user.visible_message("[user] carves something into \the [src.name].", "You carve your message into \the [src.name].")
grave_name += carving_1
update_icon()
- var/carving_2 = sanitizeSafe(input(user, "What message should \the [src.name] have?", "Epitaph Carving", null) as text, MAX_NAME_LEN)
+ var/carving_2 = sanitizeSafe(tgui_input_text(user, "What message should \the [src.name] have?", "Epitaph Carving", null, MAX_NAME_LEN), MAX_NAME_LEN)
if(carving_2)
user.visible_message("[user] starts carving \the [src.name].", "You start carving \the [src.name].")
if(do_after(user, material.hardness * W.toolspeed))
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 28cdf8d6feb..c1454ec149f 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -118,9 +118,9 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart)
. = ..(user)
if(istype(mybucket))
var/contains = mybucket.reagents.total_volume
- . += "[bicon(src)] The bucket contains [contains] unit\s of liquid!"
+ . += "\icon[src][bicon(src)] The bucket contains [contains] unit\s of liquid!"
else
- . += "[bicon(src)] There is no bucket mounted on it!"
+ . += "\icon[src][bicon(src)] There is no bucket mounted on it!"
/obj/structure/janitorialcart/MouseDrop_T(atom/movable/O as mob|obj, mob/living/user as mob)
if (istype(O, /obj/structure/mopbucket) && !mybucket)
diff --git a/code/game/objects/structures/map_blocker_vr.dm b/code/game/objects/structures/map_blocker_vr.dm
index bd56b08d6e2..2b41679979d 100644
--- a/code/game/objects/structures/map_blocker_vr.dm
+++ b/code/game/objects/structures/map_blocker_vr.dm
@@ -8,8 +8,11 @@
opacity = 0
density = TRUE
unacidable = TRUE
+ plane = PLANE_BUILDMODE
+/* //VOREStation Edit
/obj/effect/blocker/Initialize() // For non-gateway maps.
. = ..()
icon = null
icon_state = null
+*/
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 12c3d828e5e..0b4c8adc046 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -134,7 +134,7 @@
if(user.mind)
user.mind.transfer_to(vox)
spawn(1)
- var/newname = sanitizeSafe(input(vox,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN)
+ var/newname = sanitizeSafe(tgui_input_text(vox,"Enter a name, or leave blank for the default name.", "Name change","", MAX_NAME_LEN), MAX_NAME_LEN)
if(!newname || newname == "")
var/datum/language/L = GLOB.all_languages[vox.species.default_language]
newname = L.get_random_name()
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 6e1e8edf89e..4e67afbc462 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -121,7 +121,7 @@
/obj/structure/morgue/attackby(P as obj, mob/user as mob)
if (istype(P, /obj/item/weapon/pen))
- var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
+ var/t = tgui_input_text(user, "What would you like the label to be?", text("[]", src.name), null)
if (user.get_active_hand() != P)
return
if ((!in_range(src, usr) && src.loc != user))
@@ -249,7 +249,7 @@ GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium)
/obj/structure/morgue/crematorium/attackby(P as obj, mob/user as mob)
if (istype(P, /obj/item/weapon/pen))
- var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
+ var/t = tgui_input_text(user, "What would you like the label to be?", text("[]", src.name), null)
if (user.get_active_hand() != P)
return
if ((!in_range(src, usr) > 1 && src.loc != user))
diff --git a/code/game/objects/structures/props/beam_prism.dm b/code/game/objects/structures/props/beam_prism.dm
index cadb161697f..57bd65d833d 100644
--- a/code/game/objects/structures/props/beam_prism.dm
+++ b/code/game/objects/structures/props/beam_prism.dm
@@ -60,7 +60,7 @@
var/new_bearing
if(free_rotate)
- new_bearing = input(usr, "What bearing do you want to rotate \the [src] to?", "[name]") as num
+ new_bearing = tgui_input_number(usr, "What bearing do you want to rotate \the [src] to?", "[name]")
new_bearing = round(new_bearing)
if(new_bearing <= -1 || new_bearing > 360)
to_chat(user, "Rotating \the [src] [new_bearing] degrees would be a waste of time.")
@@ -177,7 +177,7 @@
var/new_bearing
if(free_rotate)
- new_bearing = input(usr, "What bearing do you want to rotate \the [src] to?", "[name]") as num
+ new_bearing = tgui_input_number(usr, "What bearing do you want to rotate \the [src] to?", "[name]")
new_bearing = round(new_bearing)
if(new_bearing <= -1 || new_bearing > 360)
to_chat(user, "Rotating \the [src] [new_bearing] degrees would be a waste of time.")
diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm
index b773fd7a0c9..78ebc026534 100644
--- a/code/game/objects/structures/railing.dm
+++ b/code/game/objects/structures/railing.dm
@@ -118,21 +118,21 @@
else
icon_state = "[icon_modifier]railing1"
if (check & 32)
- add_overlay(image('icons/obj/railing.dmi', src, "[icon_modifier]corneroverlay"))
+ add_overlay(image(icon, src, "[icon_modifier]corneroverlay"))
if ((check & 16) || !(check & 32) || (check & 64))
- add_overlay(image('icons/obj/railing.dmi', src, "[icon_modifier]frontoverlay_l"))
+ add_overlay(image(icon, src, "[icon_modifier]frontoverlay_l"))
if (!(check & 2) || (check & 1) || (check & 4))
- add_overlay(image('icons/obj/railing.dmi', src, "[icon_modifier]frontoverlay_r"))
+ add_overlay(image(icon, src, "[icon_modifier]frontoverlay_r"))
if(check & 4)
switch (src.dir)
if (NORTH)
- add_overlay(image('icons/obj/railing.dmi', src, "[icon_modifier]mcorneroverlay", pixel_x = 32))
+ add_overlay(image(icon, src, "[icon_modifier]mcorneroverlay", pixel_x = 32))
if (SOUTH)
- add_overlay(image('icons/obj/railing.dmi', src, "[icon_modifier]mcorneroverlay", pixel_x = -32))
+ add_overlay(image(icon, src, "[icon_modifier]mcorneroverlay", pixel_x = -32))
if (EAST)
- add_overlay(image('icons/obj/railing.dmi', src, "[icon_modifier]mcorneroverlay", pixel_y = -32))
+ add_overlay(image(icon, src, "[icon_modifier]mcorneroverlay", pixel_y = -32))
if (WEST)
- add_overlay(image('icons/obj/railing.dmi', src, "[icon_modifier]mcorneroverlay", pixel_y = 32))
+ add_overlay(image(icon, src, "[icon_modifier]mcorneroverlay", pixel_y = 32))
/obj/structure/railing/verb/rotate_counterclockwise()
set name = "Rotate Railing Counter-Clockwise"
diff --git a/code/game/objects/structures/signs_vr.dm b/code/game/objects/structures/signs_vr.dm
index 321ba27fc7d..d786560142c 100644
--- a/code/game/objects/structures/signs_vr.dm
+++ b/code/game/objects/structures/signs_vr.dm
@@ -2,4 +2,10 @@
icon = 'icons/obj/decals_vr.dmi'
name = "\improper ITG"
desc = "A polished metal sign which reads 'Ironcrest Transport Group'."
- icon_state = "itg"
\ No newline at end of file
+ icon_state = "itg"
+
+/obj/structure/sign/scenery/fakefireaxe
+ name = "decorative fire axe cabinet"
+ desc = "A fancy decorative indent in the wall, with an axe inside. The axe is actually a part of the indent and cannot be removed. A nostalgic reminder of older times of firefighting."
+ icon_state = "fireaxe1000"
+ icon = 'icons/obj/closet.dmi'
\ No newline at end of file
diff --git a/code/game/objects/structures/trash_pile_vr.dm b/code/game/objects/structures/trash_pile_vr.dm
index 39e3e838777..d1e9a0593e2 100644
--- a/code/game/objects/structures/trash_pile_vr.dm
+++ b/code/game/objects/structures/trash_pile_vr.dm
@@ -25,7 +25,8 @@
/obj/item/weapon/gun/projectile/pirate,
/obj/item/clothing/accessory/permit/gun,
/obj/item/weapon/gun/projectile/dartgun,
- /obj/item/clothing/gloves/black/bloodletter
+ /obj/item/clothing/gloves/black/bloodletter,
+ /obj/item/weapon/gun/energy/mouseray/metamorphosis
)
var/global/list/allocated_gamma = list()
@@ -83,6 +84,49 @@
else
return ..()
+/obj/structure/trash_pile/attack_ghost(mob/observer/user as mob)
+ if(config.disable_player_mice)
+ to_chat(user, "Spawning as a mouse is currently disabled.")
+ return
+
+ //VOREStation Add Start
+ if(jobban_isbanned(user, "GhostRoles"))
+ to_chat(user, "You cannot become a mouse because you are banned from playing ghost roles.")
+ return
+ //VOREStation Add End
+
+ if(!user.MayRespawn(1))
+ return
+
+ var/turf/T = get_turf(src)
+ if(!T || (T.z in using_map.admin_levels))
+ to_chat(user, "You may not spawn as a mouse on this Z-level.")
+ return
+
+ var/timedifference = world.time - user.client.time_died_as_mouse
+ if(user.client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600)
+ var/timedifference_text
+ timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss")
+ to_chat(user, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.")
+ return
+
+ var/response = tgui_alert(user, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("Squeek!","Nope!"))
+ if(response != "Squeek!") return //Hit the wrong key...again.
+
+ var/mob/living/simple_mob/animal/passive/mouse/host
+ host = new /mob/living/simple_mob/animal/passive/mouse(get_turf(src))
+
+ if(host)
+ if(config.uneducated_mice)
+ host.universal_understand = 0
+ announce_ghost_joinleave(src, 0, "They are now a mouse.")
+ host.ckey = user.ckey
+ to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.")
+
+ var/atom/A = get_holder_at_turf_level(src)
+ A.visible_message("[host] crawls out of \the [src].")
+ return
+
/obj/structure/trash_pile/attack_hand(mob/user)
//Human mob
if(ishuman(user))
@@ -200,6 +244,8 @@
prob(2);/obj/item/toy/tennis/cyan,
prob(2);/obj/item/toy/tennis/blue,
prob(2);/obj/item/toy/tennis/purple,
+ prob(1);/obj/item/weapon/storage/box/brainzsnax,
+ prob(1);/obj/item/weapon/storage/box/brainzsnax/red,
prob(1);/obj/item/clothing/glasses/sunglasses,
prob(1);/obj/item/clothing/glasses/sunglasses/bigshot,
prob(1);/obj/item/clothing/glasses/welding,
@@ -246,7 +292,8 @@
prob(2);/obj/item/weapon/storage/box/syndie_kit/spy,
prob(2);/obj/item/weapon/grenade/anti_photon,
prob(2);/obj/item/clothing/under/hyperfiber/bluespace,
- prob(2);/obj/item/weapon/reagent_containers/glass/beaker/vial/amorphorovir,
+ prob(2);/obj/item/selectable_item/chemistrykit/size,
+ prob(2);/obj/item/selectable_item/chemistrykit/gender,
prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc,
prob(1);/obj/item/device/nif/bad,
prob(1);/obj/item/device/radio_jammer,
@@ -260,7 +307,8 @@
prob(1);/obj/item/weapon/storage/secure/briefcase/trashmoney,
prob(1);/obj/item/device/survivalcapsule/popcabin,
prob(1);/obj/item/weapon/reagent_containers/syringe/steroid,
- prob(1);/obj/item/capture_crystal)
+ prob(1);/obj/item/capture_crystal,
+ prob(1);/obj/item/weapon/gun/energy/mouseray)
var/obj/item/I = new path()
return I
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 159662438b0..b4d6ecad241 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -124,7 +124,7 @@
GM.adjustBruteLoss(5)
else
to_chat(user, "You need a tighter grip.")
-
+
/obj/structure/urinal
name = "urinal"
@@ -152,7 +152,7 @@
/obj/machinery/shower
name = "shower"
- desc = "The HS-451. Installed in the 2550s by the Hygiene Division."
+ desc = "The HS-451. Installed in the 2250s by the Hygiene Division."
icon = 'icons/obj/watercloset.dmi'
icon_state = "shower"
density = FALSE
@@ -256,13 +256,7 @@
M.clean_blood()
- if(isturf(loc))
- var/turf/tile = loc
- for(var/obj/effect/E in tile)
- if(istype(E,/obj/effect/rune) || istype(E,/obj/effect/decal/cleanable) || istype(E,/obj/effect/overlay))
- qdel(E)
-
- reagents.splash(O, 10)
+ reagents.splash(O, 10, min_spill = 0, max_spill = 0)
/obj/machinery/shower/process()
if(!on) return
@@ -276,11 +270,10 @@
reagents.add_reagent("water", reagents.get_free_space())
/obj/machinery/shower/proc/wash_floor()
- if(!ismist && is_washing)
+ if(is_washing)
return
is_washing = 1
var/turf/T = get_turf(src)
- reagents.splash(T, reagents.total_volume)
T.clean(src)
spawn(100)
is_washing = 0
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 1e944a119fb..cf86c72a1be 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -69,7 +69,7 @@
return TRUE
/obj/structure/windoor_assembly/proc/rename_door(mob/living/user)
- var/t = sanitizeSafe(input(user, "Enter the name for the windoor.", src.name, src.created_name), MAX_NAME_LEN)
+ var/t = sanitizeSafe(tgui_input_text(user, "Enter the name for the windoor.", src.name, src.created_name, MAX_NAME_LEN), MAX_NAME_LEN)
if(!in_range(src, user) && src.loc != user) return
created_name = t
update_state()
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index e7dfeb36d44..95357e3c86f 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -615,7 +615,7 @@
to_chat(user, "\The [src] is linked to \the [buffered_button].")
return TRUE
// Otherwise fall back to asking them
- var/t = sanitizeSafe(input(user, "Enter the ID for the window.", src.name, null), MAX_NAME_LEN)
+ var/t = sanitizeSafe(tgui_input_text(user, "Enter the ID for the window.", src.name, null, MAX_NAME_LEN), MAX_NAME_LEN)
if (!t && user.get_active_hand() != W && in_range(src, user))
src.id = t
to_chat(user, "The new ID of \the [src] is [id]")
@@ -670,7 +670,7 @@
var/obj/item/device/multitool/MT = W
if(!id)
// If no ID is set yet (newly built button?) let them select an ID for first-time use!
- var/t = sanitizeSafe(input(user, "Enter an ID for \the [src].", src.name, null), MAX_NAME_LEN)
+ var/t = sanitizeSafe(tgui_input_text(user, "Enter an ID for \the [src].", src.name, null, MAX_NAME_LEN), MAX_NAME_LEN)
if (t && user.get_active_hand() != W && in_range(src, user))
src.id = t
to_chat(user, "The new ID of \the [src] is [id]")
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 18dd9e718a6..4fef9f41ed6 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -290,4 +290,21 @@
//Are these even used? //Yes
var/list/keyboard_sound = list ('sound/effects/keyboard/keyboard1.ogg','sound/effects/keyboard/keyboard2.ogg','sound/effects/keyboard/keyboard3.ogg', 'sound/effects/keyboard/keyboard4.ogg')
var/list/bodyfall_sound = list('sound/effects/bodyfall1.ogg','sound/effects/bodyfall2.ogg','sound/effects/bodyfall3.ogg','sound/effects/bodyfall4.ogg')
-var/list/teppi_sound = list('sound/voice/teppi/gyooh1.ogg', 'sound/voice/teppi/gyooh2.ogg', 'sound/voice/teppi/gyooh3.ogg', 'sound/voice/teppi/gyooh4.ogg', 'sound/voice/teppi/gyooh5.ogg', 'sound/voice/teppi/gyooh6.ogg', 'sound/voice/teppi/snoot1.ogg', 'sound/voice/teppi/snoot2.ogg')
\ No newline at end of file
+var/list/teppi_sound = list('sound/voice/teppi/gyooh1.ogg', 'sound/voice/teppi/gyooh2.ogg', 'sound/voice/teppi/gyooh3.ogg', 'sound/voice/teppi/gyooh4.ogg', 'sound/voice/teppi/gyooh5.ogg', 'sound/voice/teppi/gyooh6.ogg', 'sound/voice/teppi/snoot1.ogg', 'sound/voice/teppi/snoot2.ogg')
+var/list/talk_sound = list('sound/talksounds/a.ogg','sound/talksounds/b.ogg','sound/talksounds/c.ogg','sound/talksounds/d.ogg','sound/talksounds/e.ogg','sound/talksounds/f.ogg','sound/talksounds/g.ogg','sound/talksounds/h.ogg')
+var/list/emote_sound = list('sound/talksounds/me_a.ogg','sound/talksounds/me_b.ogg','sound/talksounds/me_c.ogg','sound/talksounds/me_d.ogg','sound/talksounds/me_e.ogg','sound/talksounds/me_f.ogg')
+
+//Goon sounds
+var/list/goon_speak_one_sound = list('sound/talksounds/goon/speak_1.ogg', 'sound/talksounds/goon/speak_1_ask.ogg', 'sound/talksounds/goon/speak_1_exclaim.ogg')
+var/list/goon_speak_two_sound = list('sound/talksounds/goon/speak_2.ogg', 'sound/talksounds/goon/speak_2_ask.ogg', 'sound/talksounds/goon/speak_2_exclaim.ogg')
+var/list/goon_speak_three_sound = list('sound/talksounds/goon/speak_3.ogg', 'sound/talksounds/goon/speak_3_ask.ogg', 'sound/talksounds/goon/speak_3_exclaim.ogg')
+var/list/goon_speak_four_sound = list('sound/talksounds/goon/speak_4.ogg', 'sound/talksounds/goon/speak_4_ask.ogg', 'sound/talksounds/goon/speak_4_exclaim.ogg')
+var/list/goon_speak_blub_sound = list('sound/talksounds/goon/blub.ogg', 'sound/talksounds/goon/blub_ask.ogg', 'sound/talksounds/goon/blub_exclaim.ogg')
+var/list/goon_speak_bottalk_sound = list('sound/talksounds/goon/bottalk_1.ogg', 'sound/talksounds/goon/bottalk_2.ogg', 'sound/talksounds/goon/bottalk_3.ogg', 'sound/talksounds/goon/bottalk_4.wav')
+var/list/goon_speak_buwoo_sound = list('sound/talksounds/goon/buwoo.ogg', 'sound/talksounds/goon/buwoo_ask.ogg', 'sound/talksounds/goon/buwoo_exclaim.ogg')
+var/list/goon_speak_cow_sound = list('sound/talksounds/goon/cow.ogg', 'sound/talksounds/goon/cow_ask.ogg', 'sound/talksounds/goon/cow_exclaim.ogg')
+var/list/goon_speak_lizard_sound = list('sound/talksounds/goon/lizard.ogg', 'sound/talksounds/goon/lizard_ask.ogg', 'sound/talksounds/goon/lizard_exclaim.ogg')
+var/list/goon_speak_pug_sound = list('sound/talksounds/goon/pug.ogg', 'sound/talksounds/goon/pug_ask.ogg', 'sound/talksounds/goon/pug_exclaim.ogg')
+var/list/goon_speak_pugg_sound = list('sound/talksounds/goon/pugg.ogg', 'sound/talksounds/goon/pugg_ask.ogg', 'sound/talksounds/goon/pugg_exclaim.ogg')
+var/list/goon_speak_roach_sound = list('sound/talksounds/goon/roach.ogg', 'sound/talksounds/goon/roach_ask.ogg', 'sound/talksounds/goon/roach_exclaim.ogg')
+var/list/goon_speak_skelly_sound = list('sound/talksounds/goon/skelly.ogg', 'sound/talksounds/goon/skelly_ask.ogg', 'sound/talksounds/goon/skelly_exclaim.ogg')
diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm
index ba7429eec4f..9c707d4a1f5 100644
--- a/code/game/turfs/flooring/flooring.dm
+++ b/code/game/turfs/flooring/flooring.dm
@@ -146,7 +146,7 @@ var/list/flooring_types
flags = 0
icon = 'icons/turf/outdoors.dmi'
icon_base = "grass_sif"
- build_type = /obj/item/stack/tile/grass/sif
+ build_type = null
has_base_range = 1
/decl/flooring/grass/sif/forest
@@ -155,7 +155,6 @@ var/list/flooring_types
flags = 0
icon = 'icons/turf/outdoors.dmi'
icon_base = "grass_sif_dark"
- build_type = /obj/item/stack/tile/grass/sif/forest
has_base_range = 1
/decl/flooring/water
@@ -321,18 +320,50 @@ var/list/flooring_types
icon_base = "tealcarpet"
build_type = /obj/item/stack/tile/carpet/teal
-/decl/flooring/carpet/deco
- name = "deco carpet"
- icon_base = "decocarpet"
- build_type = /obj/item/stack/tile/carpet/deco
+/decl/flooring/carpet/browncarpet
+ name = "brown carpet"
+ icon_base = "brncarpet"
+ build_type = /obj/item/stack/tile/carpet/brncarpet
+
+/decl/flooring/carpet/blucarpet2
+ name = "blue carpet"
+ icon_base = "blue1"
+ build_type = /obj/item/stack/tile/carpet/blucarpet2
+
+/decl/flooring/carpet/greencarpet
+ name = "green carpet"
+ icon_base = "green"
+ build_type = /obj/item/stack/tile/carpet/greencarpet
+
+/decl/flooring/carpet/purplecarpet
+ name = "purple carpet"
+ icon_base = "purple"
+ build_type = /obj/item/stack/tile/carpet/purplecarpet
+
+/decl/flooring/carpet/geo
+ name = "geometric carpet"
+ icon_base = "geocarpet"
+ build_type = /obj/item/stack/tile/carpet/geo
flags = TURF_REMOVE_CROWBAR | TURF_CAN_BURN
/decl/flooring/carpet/retro
- name = "retro carpet"
+ name = "blue retro carpet"
icon_base = "retrocarpet"
build_type = /obj/item/stack/tile/carpet/retro
flags = TURF_REMOVE_CROWBAR | TURF_CAN_BURN
+/decl/flooring/carpet/retro_red
+ name = "red retro carpet"
+ icon_base = "retrocarpet_red"
+ build_type = /obj/item/stack/tile/carpet/retro_red
+ flags = TURF_REMOVE_CROWBAR | TURF_CAN_BURN
+
+/decl/flooring/carpet/happy
+ name = "happy carpet"
+ icon_base = "happycarpet"
+ build_type = /obj/item/stack/tile/carpet/happy
+ flags = TURF_REMOVE_CROWBAR | TURF_CAN_BURN
+
/decl/flooring/tiling
name = "floor"
desc = "Scuffed from the passage of countless greyshirts."
@@ -496,6 +527,31 @@ var/list/flooring_types
icon_base = "sifwood"
build_type = /obj/item/stack/tile/wood/sif
+/decl/flooring/wood/alt
+ icon = 'icons/turf/flooring/wood.dmi'
+ icon_base = "wood"
+ build_type = /obj/item/stack/tile/wood/alt
+
+/decl/flooring/wood/alt/panel
+ desc = "Polished wooden panels."
+ icon = 'icons/turf/flooring/wood.dmi'
+ icon_base = "wood_panel"
+ has_damage_range = 2
+ build_type = /obj/item/stack/tile/wood/panel
+
+/decl/flooring/wood/alt/parquet
+ desc = "Polished wooden tiles."
+ icon = 'icons/turf/flooring/wood.dmi'
+ icon_base = "wood_parquet"
+ build_type = /obj/item/stack/tile/wood/parquet
+
+/decl/flooring/wood/alt/tile
+ desc = "Polished wooden tiles."
+ icon = 'icons/turf/flooring/wood.dmi'
+ icon_base = "wood_tile"
+ has_damage_range = 2
+ build_type = /obj/item/stack/tile/wood/tile
+
/decl/flooring/reinforced
name = "reinforced floor"
desc = "Heavily reinforced with steel rods."
diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm
index 42bf1e780e0..bb3ad500afb 100644
--- a/code/game/turfs/flooring/flooring_premade.dm
+++ b/code/game/turfs/flooring/flooring_premade.dm
@@ -19,11 +19,11 @@
icon_state = "tealcarpet"
initial_flooring = /decl/flooring/carpet/tealcarpet
-/turf/simulated/floor/carpet/deco
+/turf/simulated/floor/carpet/geo
name = "deco carpet"
icon_state = "decocarpet"
- initial_flooring = /decl/flooring/carpet/deco
-
+ initial_flooring = /decl/flooring/carpet/geo
+
/turf/simulated/floor/carpet/retro
name = "retro carpet"
icon_state = "retrocarpet"
@@ -60,6 +60,46 @@
icon_state = "oracarpet"
initial_flooring = /decl/flooring/carpet/oracarpet
+/turf/simulated/floor/carpet/brown
+ name = "brown carpet"
+ icon_state = "brncarpet"
+ initial_flooring = /decl/flooring/carpet/browncarpet
+
+/turf/simulated/floor/carpet/blue2
+ name = "blue carpet"
+ icon_state = "blue1"
+ initial_flooring = /decl/flooring/carpet/blucarpet2
+
+/turf/simulated/floor/carpet/green
+ name = "green carpet"
+ icon_state = "green"
+ initial_flooring = /decl/flooring/carpet/greencarpet
+
+/turf/simulated/floor/carpet/purple
+ name = "purple carpet"
+ icon_state = "purple"
+ initial_flooring = /decl/flooring/carpet/purplecarpet
+
+/turf/simulated/floor/carpet/geo
+ name = "geometric carpet"
+ icon_state = "geocarpet"
+ initial_flooring = /decl/flooring/carpet/geo
+
+/turf/simulated/floor/carpet/retro
+ name = "blue retro carpet"
+ icon_state = "retrocarpet"
+ initial_flooring = /decl/flooring/carpet/retro
+
+/turf/simulated/floor/carpet/retro_red
+ name = "red retro carpet"
+ icon_state = "retrocarpet_red"
+ initial_flooring = /decl/flooring/carpet/retro_red
+
+/turf/simulated/floor/carpet/happy
+ name = "happy carpet"
+ icon_state = "happycarpet"
+ initial_flooring = /decl/flooring/carpet/happy
+
/turf/simulated/floor/bluegrid
name = "mainframe floor"
icon = 'icons/turf/flooring/circuit.dmi'
@@ -79,24 +119,67 @@
initial_flooring = /decl/flooring/wood
/turf/simulated/floor/wood/broken
- icon_state = "wood_broken0" // This gets changed when spawned.
+ icon_state = "wood-broken0" // This gets changed when spawned.
-/turf/simulated/floor/wood/broken/Initialize()
+/turf/simulated/floor/wood/broken/LateInitialize()
+ . = ..()
break_tile()
- return ..()
/turf/simulated/floor/wood/sif
name = "alien wooden floor"
- icon = 'icons/turf/flooring/wood.dmi'
icon_state = "sifwood"
initial_flooring = /decl/flooring/wood/sif
/turf/simulated/floor/wood/sif/broken
- icon_state = "sifwood_broken0" // This gets changed when spawned.
+ icon_state = "sifwood-broken0" // This gets changed when spawned.
-/turf/simulated/floor/wood/sif/broken/Initialize()
+/turf/simulated/floor/wood/sif/broken/LateInitialize()
+ . = ..()
+ break_tile()
+
+/turf/simulated/floor/wood/alt
+ icon = 'icons/turf/flooring/wood.dmi'
+ initial_flooring = /decl/flooring/wood/alt
+
+/turf/simulated/floor/wood/alt/broken
+ icon_state = "wood-broken0" // This gets changed when spawned.
+
+/turf/simulated/floor/wood/alt/broken/LateInitialize()
+ . = ..()
+ break_tile()
+
+/turf/simulated/floor/wood/alt/tile
+ icon_state = "wood_tile"
+ initial_flooring = /decl/flooring/wood/alt/tile
+
+/turf/simulated/floor/wood/alt/tile/broken
+ icon_state = "wood_tile-broken0" // This gets changed when spawned.
+
+/turf/simulated/floor/wood/alt/tile/broken/LateInitialize()
+ . = ..()
+ break_tile()
+
+/turf/simulated/floor/wood/alt/panel
+ icon_state = "wood_panel"
+ initial_flooring = /decl/flooring/wood/alt/panel
+
+/turf/simulated/floor/wood/alt/panel/broken
+ icon_state = "wood_panel-broken0" // This gets changed when spawned.
+
+/turf/simulated/floor/wood/alt/panel/broken/LateInitialize()
+ . = ..()
+ break_tile()
+
+/turf/simulated/floor/wood/alt/parquet
+ icon_state = "wood_parquet"
+ initial_flooring = /decl/flooring/wood/alt/parquet
+
+/turf/simulated/floor/wood/alt/parquet/broken
+ icon_state = "wood_parquet-broken0" // This gets changed when spawned.
+
+/turf/simulated/floor/wood/alt/parquet/broken/LateInitialize()
+ . = ..()
break_tile()
- return ..()
/turf/simulated/floor/grass
name = "grass patch"
diff --git a/code/game/turfs/flooring/flooring_vr.dm b/code/game/turfs/flooring/flooring_vr.dm
index 4f3a801064c..ac7f42a406c 100644
--- a/code/game/turfs/flooring/flooring_vr.dm
+++ b/code/game/turfs/flooring/flooring_vr.dm
@@ -19,7 +19,8 @@
icon_base = "flesh_floor"
/decl/flooring/grass/outdoors
- flags = TURF_REMOVE_SHOVEL
+ flags = 0
+ build_type = null
/decl/flooring/grass/outdoors/forest
icon = 'icons/turf/outdoors.dmi'
@@ -102,7 +103,7 @@
/obj/item/stack/tile/floor/milspec/sterile
name = "sterile milspec floor tile"
-
+
/decl/flooring/tiling/milspec/raised
name = "raised milspec floor"
icon_base = "milspec_tcomms"
diff --git a/code/game/turfs/simulated/fancy_shuttles.dm b/code/game/turfs/simulated/fancy_shuttles.dm
index 010dced63f4..c3bbf1d3e52 100644
--- a/code/game/turfs/simulated/fancy_shuttles.dm
+++ b/code/game/turfs/simulated/fancy_shuttles.dm
@@ -38,7 +38,7 @@ GLOBAL_LIST_EMPTY(fancy_shuttles)
icon = 'icons/turf/fancy_shuttles/generic_preview.dmi'
icon_state = "floors"
plane = PLATING_PLANE
- layer = ABOVE_TURF_LAYER
+ layer = DISPOSAL_LAYER
alpha = 90
/obj/effect/fancy_shuttle_floor_preview/Initialize()
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index a0caed0b98b..d45c33f9180 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -27,6 +27,7 @@
var/initial_flooring
var/decl/flooring/flooring
var/mineral = DEFAULT_WALL_MATERIAL
+ var/can_be_plated = TRUE // This is here for inheritance's sake. Override to FALSE for turfs you don't want someone to simply slap a plating over such as hazards.
thermal_conductivity = 0.040
heat_capacity = 10000
diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm
index aed4636e682..01e34e87f66 100644
--- a/code/game/turfs/simulated/floor_attackby.dm
+++ b/code/game/turfs/simulated/floor_attackby.dm
@@ -72,9 +72,23 @@
to_chat(user, "You must remove the [flooring.descriptor] first.")
return
else if(istype(C, /obj/item/stack/tile))
- try_replace_tile(C, user)
- return
-
+ if(try_replace_tile(C, user))
+ return
+ else if(istype(C, /obj/item/stack/tile/floor)) // While we're at it, let's see if this is a raw patch of natural sand, dirt, or whatever that you're trying to put a plating on.
+ if(!flooring.build_type && can_be_plated && !((flooring.flags & TURF_REMOVE_WRENCH) || (flooring.flags & TURF_REMOVE_CROWBAR) || (flooring.flags & TURF_REMOVE_SCREWDRIVER) || (flooring.flags & TURF_REMOVE_SHOVEL)))
+ for(var/obj/structure/P in contents)
+ if(istype(P, /obj/structure/flora))
+ to_chat(user, "The [P.name] is in the way, you'll have to get rid of it first.")
+ return
+ var/obj/item/stack/tile/floor/S = C
+ if (S.get_amount() < 1)
+ return
+ S.use(1)
+ playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
+ ChangeTurf(/turf/simulated/floor, preserve_outdoors = TRUE)
+ return
+
+
// Floor is plating (or no flooring)
else
// Placing wires on plating
@@ -136,7 +150,7 @@
return
if(!can_remove_plating(user))
return
-
+
user.visible_message("[user] begins cutting through [src].", "You begin cutting through [src].")
// This is slow because it's a potentially hostile action to just cut through places into space in the middle of the bar and such
// Presumably also the structural floor is thick?
diff --git a/code/game/turfs/simulated/floor_icon.dm b/code/game/turfs/simulated/floor_icon.dm
index 420d8628b54..82153557a88 100644
--- a/code/game/turfs/simulated/floor_icon.dm
+++ b/code/game/turfs/simulated/floor_icon.dm
@@ -75,7 +75,10 @@ var/image/no_ceiling_image = null
icon_state = "dmg[rand(1,4)]"
else if(flooring)
if(!isnull(broken) && (flooring.flags & TURF_CAN_BREAK))
- add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-broken-[broken]","broken[broken]"))
+ if(istype(src, /turf/simulated/floor/wood))
+ add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-broken-[broken]","[flooring.icon_base]-broken[broken]"))
+ else
+ add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-broken-[broken]","broken[broken]"))
if(!isnull(burnt) && (flooring.flags & TURF_CAN_BURN))
add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-burned-[burnt]","burned[burnt]"))
diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm
index f7d0644819c..ec5eeb18f44 100644
--- a/code/game/turfs/simulated/lava.dm
+++ b/code/game/turfs/simulated/lava.dm
@@ -13,6 +13,7 @@
light_on = TRUE
movement_cost = 2
can_build_into_floor = TRUE
+ can_be_plated = FALSE
can_dirty = FALSE
initial_flooring = /decl/flooring/lava // Defining this in case someone DOES step on lava and survive. Somehow.
flags = TURF_ACID_IMMUNE
diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm
index 07d382a1617..e0dd29cceb8 100644
--- a/code/game/turfs/simulated/outdoors/outdoors.dm
+++ b/code/game/turfs/simulated/outdoors/outdoors.dm
@@ -8,7 +8,7 @@ var/list/turf_edge_cache = list()
var/outdoors = OUTDOORS_AREA
/area
- // If a turf's `outdoors` variable is set to `OUTDOORS_AREA`,
+ // If a turf's `outdoors` variable is set to `OUTDOORS_AREA`,
// it will decide if it's outdoors or not when being initialized based on this var.
var/outdoors = OUTDOORS_NO
diff --git a/code/game/turfs/simulated/outdoors/outdoors_attackby.dm b/code/game/turfs/simulated/outdoors/outdoors_attackby.dm
deleted file mode 100644
index 1a969fee981..00000000000
--- a/code/game/turfs/simulated/outdoors/outdoors_attackby.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-// this code here enables people to dig up worms from certain tiles.
-
-/turf/simulated/floor/outdoors/grass/attackby(obj/item/weapon/S as obj, mob/user as mob)
- if(istype(S, /obj/item/stack/tile/floor))
- ChangeTurf(/turf/simulated/floor, preserve_outdoors = TRUE)
- return
- . = ..()
\ No newline at end of file
diff --git a/code/game/turfs/simulated/outdoors/snow.dm b/code/game/turfs/simulated/outdoors/snow.dm
index 45c6e80018f..00172586d1f 100644
--- a/code/game/turfs/simulated/outdoors/snow.dm
+++ b/code/game/turfs/simulated/outdoors/snow.dm
@@ -51,6 +51,7 @@
icon_state = "ice"
desc = "Looks slippery."
edge_blending_priority = 0
+ can_be_plated = FALSE
/turf/simulated/floor/outdoors/ice/dark
name = "black ice"
diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm
index 34b5a6443d7..2fb11659dc0 100644
--- a/code/game/turfs/simulated/water.dm
+++ b/code/game/turfs/simulated/water.dm
@@ -8,6 +8,7 @@
var/under_state = "rock"
edge_blending_priority = -1
movement_cost = 4
+ can_be_plated = FALSE
outdoors = OUTDOORS_YES
flags = TURF_ACID_IMMUNE
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 321f9d7ac94..7f62ac7a96a 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -331,7 +331,7 @@
to_chat(vandal, "There's too much graffiti here to add more.")
return FALSE
- var/message = sanitize(input(usr, "Enter a message to engrave.", "Graffiti") as null|text, trim = TRUE)
+ var/message = sanitize(tgui_input_text(usr, "Enter a message to engrave.", "Graffiti"), trim = TRUE)
if(!message)
return FALSE
diff --git a/code/game/world.dm b/code/game/world.dm
index b962eb028f8..01416b57ba8 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -113,7 +113,7 @@ var/world_topic_spam_protect_time = world.timeofday
s["players"] = 0
s["stationtime"] = stationtime2text()
s["roundduration"] = roundduration2text()
- s["map"] = strip_improper(using_map.full_name) //Done to remove the non-UTF-8 text macros
+ s["map"] = strip_improper(using_map.full_name) //Done to remove the non-UTF-8 text macros
if(input["status"] == "2") // Shiny new hip status.
var/active = 0
@@ -494,12 +494,9 @@ var/world_topic_spam_protect_time = world.timeofday
if (copytext(line, 1, 2) == ";")
continue
- var/title = "Mentor"
- var/rights = admin_ranks[title]
-
var/ckey = copytext(line, 1, length(line)+1)
- var/datum/admins/D = new /datum/admins(title, rights, ckey)
- D.associate(GLOB.directory[ckey])
+ var/datum/mentor/M = new /datum/mentor(ckey)
+ M.associate(GLOB.directory[ckey])
/world/proc/update_status()
var/s = ""
@@ -529,7 +526,7 @@ var/world_topic_spam_protect_time = world.timeofday
features += config.abandon_allowed ? "respawn" : "no respawn"
features += config.persistence_disabled ? "persistence disabled" : "persistence enabled"
-
+
features += config.persistence_ignore_mapload ? "persistence mapload disabled" : "persistence mapload enabled"
if (config && config.allow_vote_mode)
@@ -663,7 +660,7 @@ var/failed_old_db_connections = 0
if(dbcon_old?.IsConnected())
results += "WARNING: dbcon_old is connected, not touching it, but is this intentional?"
-
+
if(!config.sql_enabled)
results += "stopping because config.sql_enabled = false"
else
@@ -672,7 +669,7 @@ var/failed_old_db_connections = 0
results += "SUCCESS: set up a connection successfully with setup_database_connection()"
else
results += "FAIL: failed to connect to the database with setup_database_connection()"
-
+
results += "-- DB Reset End --"
to_world_log(results.Join("\n"))
@@ -681,11 +678,11 @@ var/failed_old_db_connections = 0
if(!istype(GLOB.players_by_zlevel, /list))
GLOB.players_by_zlevel = new /list(world.maxz, 0)
GLOB.living_players_by_zlevel = new /list(world.maxz, 0)
-
+
while(GLOB.players_by_zlevel.len < world.maxz)
GLOB.players_by_zlevel.len++
GLOB.players_by_zlevel[GLOB.players_by_zlevel.len] = list()
-
+
GLOB.living_players_by_zlevel.len++
GLOB.living_players_by_zlevel[GLOB.living_players_by_zlevel.len] = list()
@@ -727,10 +724,10 @@ var/global/game_id = null
game_id = ""
var/list/c = list(
- "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
- "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
- "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
- "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
+ "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
+ "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"
)
var/l = c.len
diff --git a/code/global.dm b/code/global.dm
index cc05120cb6c..d6bf666e1ca 100644
--- a/code/global.dm
+++ b/code/global.dm
@@ -140,7 +140,7 @@ var/list/robot_module_types = list(
"Standard", "Engineering", "Surgeon", "Crisis",
"Miner", "Janitor", "Service", "Clerical", "Security",
"Research", "Medihound", "K9", "Janihound", "Sci-borg", "Pupdozer",
- "Service-Hound", "BoozeHound", "KMine"
+ "Service-Hound", "BoozeHound", "KMine", "TraumaHound"
)
// List of modules added during code red
var/list/emergency_module_types = list(
diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm
index 10f0c8c0a70..ee0ee93a41e 100644
--- a/code/modules/admin/DB ban/functions.dm
+++ b/code/modules/admin/DB ban/functions.dm
@@ -182,7 +182,7 @@
switch(param)
if("reason")
if(!value)
- value = sanitize(input(usr, "Insert the new reason for [pckey]'s ban", "New Reason", "[reason]", null) as null|text)
+ value = sanitize(tgui_input_text(usr, "Insert the new reason for [pckey]'s ban", "New Reason", "[reason]", null))
value = sql_sanitize_text(value)
if(!value)
to_chat(usr, "Cancelled")
@@ -193,7 +193,7 @@
message_admins("[key_name_admin(usr)] has edited a ban for [pckey]'s reason from [reason] to [value]",1)
if("duration")
if(!value)
- value = input(usr, "Insert the new duration (in minutes) for [pckey]'s ban", "New Duration", "[duration]", null) as null|num
+ value = tgui_input_number(usr, "Insert the new duration (in minutes) for [pckey]'s ban", "New Duration", "[duration]", null)
if(!isnum(value) || !value)
to_chat(usr, "Cancelled")
return
diff --git a/code/modules/admin/ToRban.dm b/code/modules/admin/ToRban.dm
index 4171ea6a377..dfe4ba88e23 100644
--- a/code/modules/admin/ToRban.dm
+++ b/code/modules/admin/ToRban.dm
@@ -77,7 +77,7 @@
if("remove all")
to_chat(src, "[TORFILE] was [fdel(TORFILE)?"":"not "]removed.")
if("find")
- var/input = input(src,"Please input an IP address to search for:","Find ToR ban",null) as null|text
+ var/input = tgui_input_text(src,"Please input an IP address to search for:","Find ToR ban",null)
if(input)
if(ToRban_isbanned(input))
to_chat(src, "Address is a known ToR address")
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 9bd7fb3febb..31773e10b4a 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -1,5 +1,3 @@
-
-var/global/BSACooldown = 0
var/global/floorIsLava = 0
@@ -218,7 +216,6 @@ var/global/floorIsLava = 0
/datum/player_info/var/content // text content of the information
/datum/player_info/var/timestamp // Because this is bloody annoying
-#define PLAYER_NOTES_ENTRIES_PER_PAGE 50
/datum/admins/proc/PlayerNotes()
set category = "Admin"
set name = "Player Notes"
@@ -235,56 +232,20 @@ var/global/floorIsLava = 0
if (!istype(src,/datum/admins))
to_chat(usr, "Error: you are not an admin!")
return
- var/filter = input(usr, "Filter string (case-insensitive regex)", "Player notes filter") as text|null
+ var/filter = tgui_input_text(usr, "Filter string (case-insensitive regex)", "Player notes filter")
PlayerNotesPage(1, filter)
/datum/admins/proc/PlayerNotesPage(page, filter)
- var/dat = "Player notes - Apply Filter "
var/savefile/S=new("data/player_notes.sav")
var/list/note_keys
S >> note_keys
- if(!note_keys)
- dat += "No notes found."
- else
- dat += ""
+
+ if(note_keys)
note_keys = sortList(note_keys)
- if(filter)
- var/list/results = list()
- var/regex/needle = regex(filter, "i")
- for(var/haystack in note_keys)
- if(needle.Find(haystack))
- results += haystack
- note_keys = results
-
- // Display the notes on the current page
- var/number_pages = note_keys.len / PLAYER_NOTES_ENTRIES_PER_PAGE
- // Emulate CEILING(why does BYOND not have ceil, 1)
- if(number_pages != round(number_pages))
- number_pages = round(number_pages) + 1
- var/page_index = page - 1
-
- if(page_index < 0 || page_index >= number_pages)
- dat += "| No keys found. | "
- else
- var/lower_bound = page_index * PLAYER_NOTES_ENTRIES_PER_PAGE + 1
- var/upper_bound = (page_index + 1) * PLAYER_NOTES_ENTRIES_PER_PAGE
- upper_bound = min(upper_bound, note_keys.len)
- for(var/index = lower_bound, index <= upper_bound, index++)
- var/t = note_keys[index]
- dat += "| [t] | "
-
- dat += " "
-
- // Display a footer to select different pages
- for(var/index = 1, index <= number_pages, index++)
- if(index == page)
- dat += ""
- dat += "[index] "
- if(index == page)
- dat += ""
-
- usr << browse(dat, "window=player_notes;size=400x400")
+ var/datum/tgui_module/player_notes/A = new(src)
+ A.ckeys = note_keys
+ A.tgui_interact(usr)
/datum/admins/proc/player_has_info(var/key as text)
@@ -303,44 +264,10 @@ var/global/floorIsLava = 0
if (!istype(src,/datum/admins))
to_chat(usr, "Error: you are not an admin!")
return
- var/dat = "Info on [key]"
- dat += ""
-
- var/p_age = "unknown"
- for(var/client/C in GLOB.clients)
- if(C.ckey == key)
- p_age = C.player_age
- break
- dat +="Player age: [p_age] "
-
- var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav")
- var/list/infos
- info >> infos
- if(!infos)
- dat += "No information found on the given key. "
- else
- var/update_file = 0
- var/i = 0
- for(var/datum/player_info/I in infos)
- i += 1
- if(!I.timestamp)
- I.timestamp = "Pre-4/3/2012"
- update_file = 1
- if(!I.rank)
- I.rank = "N/A"
- update_file = 1
- dat += "[I.content] by [I.author] ([I.rank]) on [I.timestamp] "
- if(I.author == usr.key || I.author == "Adminbot" || ishost(usr))
- dat += "Remove"
- dat += "
"
- if(update_file) info << infos
-
- dat += " "
- dat += "Add Comment "
-
- dat += ""
- usr << browse(dat, "window=adminplayerinfo;size=480x480")
+ var/datum/tgui_module/player_notes_info/A = new(src)
+ A.key = key
+ A.tgui_interact(usr)
/datum/admins/proc/access_news_network() //MARKER
@@ -688,7 +615,7 @@ var/global/floorIsLava = 0
set desc="Announce your desires to the world"
if(!check_rights(0)) return
- var/message = tgui_input_message(usr, "Global message to send:", "Admin Announce")
+ var/message = tgui_input_text(usr, "Global message to send:", "Admin Announce", multiline = TRUE, prevent_enter = TRUE)
if(message)
if(!check_rights(R_SERVER,0))
message = sanitize(message, 500, extra = 0)
@@ -709,12 +636,12 @@ var/datum/announcement/minor/admin_min_announcer = new
var/channel = tgui_input_list(usr, "Channel for message:","Channel", radiochannels)
if(channel) //They picked a channel
- var/sender = input(usr, "Name of sender (max 75):", "Announcement", "Announcement Computer") as null|text
+ var/sender = tgui_input_text(usr, "Name of sender (max 75):", "Announcement", "Announcement Computer")
if(sender) //They put a sender
sender = sanitize(sender, 75, extra = 0)
- var/message = input(usr, "Message content (max 500):", "Contents", "This is a test of the announcement system.") as null|message
- var/msgverb = input(usr, "Name of verb (Such as 'states', 'says', 'asks', etc):", "Verb", "says") as null|text //VOREStation Addition
+ var/message = tgui_input_text(usr, "Message content (max 500):", "Contents", "This is a test of the announcement system.", multiline = TRUE, prevent_enter = TRUE)
+ var/msgverb = tgui_input_text(usr, "Name of verb (Such as 'states', 'says', 'asks', etc):", "Verb", "says")
if(message) //They put a message
message = sanitize(message, 500, extra = 0)
//VOREStation Edit Start
@@ -752,7 +679,7 @@ var/datum/announcement/minor/admin_min_announcer = new
The above will result in those messages playing, with a 5 second gap between each. Maximum of 20 messages allowed.")
var/list/decomposed
- var/message = input(usr,"See your chat box for instructions. Keep a copy elsewhere in case it is rejected when you click OK.", "Input Conversation", "") as null|message
+ var/message = tgui_input_text(usr,"See your chat box for instructions. Keep a copy elsewhere in case it is rejected when you click OK.", "Input Conversation", "", multiline = TRUE, prevent_enter = TRUE)
if(!message)
return
@@ -1118,7 +1045,7 @@ var/datum/announcement/minor/admin_min_announcer = new
if(!seedtype || !SSplants.seeds[seedtype])
return
- var/amount = input(usr, "Amount of fruit to spawn", "Fruit Amount", 1) as null|num
+ var/amount = tgui_input_number(usr, "Amount of fruit to spawn", "Fruit Amount", 1)
if(!isnull(amount))
var/datum/seed/S = SSplants.seeds[seedtype]
S.harvest(usr,0,0,amount)
@@ -1531,7 +1458,7 @@ var/datum/announcement/minor/admin_min_announcer = new
var/crystals
if(check_rights(R_ADMIN|R_EVENT))
- crystals = input(usr, "Amount of telecrystals for [H.ckey], currently [H.mind.tcrystals].", crystals) as null|num
+ crystals = tgui_input_number(usr, "Amount of telecrystals for [H.ckey], currently [H.mind.tcrystals].", crystals)
if (!isnull(crystals))
H.mind.tcrystals = crystals
var/msg = "[key_name(usr)] has modified [H.ckey]'s telecrystals to [crystals]."
@@ -1547,7 +1474,7 @@ var/datum/announcement/minor/admin_min_announcer = new
var/crystals
if(check_rights(R_ADMIN|R_EVENT))
- crystals = input(usr, "Amount of telecrystals to give to [H.ckey], currently [H.mind.tcrystals].", crystals) as null|num
+ crystals = tgui_input_number(usr, "Amount of telecrystals to give to [H.ckey], currently [H.mind.tcrystals].", crystals)
if (!isnull(crystals))
H.mind.tcrystals += crystals
var/msg = "[key_name(usr)] has added [crystals] to [H.ckey]'s telecrystals."
@@ -1570,7 +1497,7 @@ var/datum/announcement/minor/admin_min_announcer = new
to_chat(usr, "Error: you are not an admin!")
return
- var/replyorigin = input(src.owner, "Please specify who the fax is coming from", "Origin") as text|null
+ var/replyorigin = tgui_input_text(src.owner, "Please specify who the fax is coming from", "Origin")
var/obj/item/weapon/paper/admin/P = new /obj/item/weapon/paper/admin( null ) //hopefully the null loc won't cause trouble for us
faxreply = P
@@ -1585,7 +1512,7 @@ var/datum/announcement/minor/admin_min_announcer = new
/datum/admins/var/obj/item/weapon/paper/admin/faxreply // var to hold fax replies in
/datum/admins/proc/faxCallback(var/obj/item/weapon/paper/admin/P, var/obj/machinery/photocopier/faxmachine/destination)
- var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null
+ var/customname = tgui_input_text(src.owner, "Pick a title for the report", "Title")
P.name = "[P.origin] - [customname]"
P.desc = "This is a paper titled '" + P.name + "'."
@@ -1636,8 +1563,8 @@ var/datum/announcement/minor/admin_min_announcer = new
for(var/client/C in GLOB.admins)
if((R_ADMIN | R_MOD | R_EVENT) & C.holder.rights)
to_chat(C, "FAX LOG:[key_name_admin(src.owner)] has sent a fax message to [destination.department] (VIEW)")
-
- var/plaintext_title = P.sender ? "replied to [key_name(P.sender)]'s fax" : "sent a fax message to [destination.department]"
+
+ var/plaintext_title = P.sender ? "replied to [key_name(P.sender)]'s fax" : "sent a fax message to [destination.department]"
var/fax_text = paper_html_to_plaintext(P.info)
log_game(plaintext_title)
log_game(fax_text)
diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm
index 57f3fe31973..e305c83b5ac 100644
--- a/code/modules/admin/admin_memo.dm
+++ b/code/modules/admin/admin_memo.dm
@@ -18,7 +18,7 @@
/client/proc/admin_memo_write()
var/savefile/F = new(MEMOFILE)
if(F)
- var/memo = sanitize(input(src,"Type your memo\n(Leaving it blank will delete your current memo):","Write Memo",null) as null|message, extra = 0)
+ var/memo = sanitize(tgui_input_text(src,"Type your memo\n(Leaving it blank will delete your current memo):","Write Memo",null, multiline = TRUE, prevent_enter = TRUE), extra = 0)
switch(memo)
if(null)
return
diff --git a/code/modules/admin/admin_report.dm b/code/modules/admin/admin_report.dm
index 6a6a5d241e5..bc1adbcfdcd 100644
--- a/code/modules/admin/admin_report.dm
+++ b/code/modules/admin/admin_report.dm
@@ -127,7 +127,7 @@ world/New()
if(M.client)
CID = M.client.computer_id
- var/body = input(src.mob, "Describe in detail what you're reporting [M] for", "Report") as null|text
+ var/body = tgui_input_text(src.mob, "Describe in detail what you're reporting [M] for", "Report")
if(!body) return
@@ -174,7 +174,7 @@ world/New()
if(!found)
to_chat(src, "* An error occured, sorry.")
- var/body = input(src.mob, "Enter a body for the news", "Body") as null|message
+ var/body = tgui_input_text(src.mob, "Enter a body for the news", "Body", multiline = TRUE, prevent_enter = TRUE)
if(!body) return
found.body = body
diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm
index 9f4d81120c4..3d8ec234fa3 100644
--- a/code/modules/admin/admin_verb_lists_vr.dm
+++ b/code/modules/admin/admin_verb_lists_vr.dm
@@ -7,6 +7,8 @@ var/list/admin_verbs_default = list(
/client/proc/cmd_admin_say, //VOREStation Add,
/client/proc/cmd_mod_say, //VOREStation Add,
/client/proc/cmd_event_say, //VOREStation Add,
+ /client/proc/cmd_mentor_ticket_panel,
+ /client/proc/cmd_mentor_say
// /client/proc/hide_verbs, //hides all our adminverbs, //VOREStation Remove,
// /client/proc/hide_most_verbs, //hides all our hideable adminverbs, //VOREStation Remove,
// /client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify, //VOREStation Remove,
@@ -112,7 +114,7 @@ var/list/admin_verbs_admin = list(
/client/proc/change_human_appearance_self, // Allows the human-based mob itself change its basic appearance ,
/client/proc/change_security_level,
/client/proc/view_chemical_reaction_logs,
- /client/proc/makePAI,
+ /client/proc/makepAI,
/client/proc/toggle_debug_logs,
/client/proc/toggle_attack_logs,
/datum/admins/proc/paralyze_mob,
@@ -121,7 +123,9 @@ var/list/admin_verbs_admin = list(
/datum/admins/proc/set_uplink, //VOREStation Add,
/datum/admins/proc/sendFax,
/client/proc/despawn_player,
- /datum/admins/proc/view_feedback
+ /datum/admins/proc/view_feedback,
+ /client/proc/make_mentor,
+ /client/proc/unmake_mentor
)
var/list/admin_verbs_ban = list(
@@ -519,7 +523,7 @@ var/list/admin_verbs_event_manager = list(
/client/proc/change_human_appearance_admin, // Allows an admin to change the basic appearance of human-based mobs ,
/client/proc/change_human_appearance_self, // Allows the human-based mob itself change its basic appearance ,
/client/proc/change_security_level,
- /client/proc/makePAI,
+ /client/proc/makepAI,
/client/proc/toggle_debug_logs,
/client/proc/toggle_attack_logs,
/datum/admins/proc/paralyze_mob,
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index e9d63621b06..81a3e795760 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -35,11 +35,24 @@
set category = "Admin"
set name = "Aghost"
if(!holder) return
+
+ var/build_mode
+ if(src.buildmode)
+ build_mode = tgui_alert(src, "You appear to be currently in buildmode. Do you want to re-enter buildmode after aghosting?", "Buildmode", list("Yes", "No"))
+ if(build_mode != "Yes")
+ to_chat(src, "Will not re-enter buildmode after switch.")
+
if(istype(mob,/mob/observer/dead))
//re-enter
var/mob/observer/dead/ghost = mob
if(ghost.can_reenter_corpse)
- ghost.reenter_corpse()
+ if(build_mode)
+ togglebuildmode(mob)
+ ghost.reenter_corpse()
+ if(build_mode == "Yes")
+ togglebuildmode(mob)
+ else
+ ghost.reenter_corpse()
else
to_chat(ghost, "Error: Aghost: Can't reenter corpse.")
return
@@ -51,8 +64,16 @@
else
//ghostize
var/mob/body = mob
- var/mob/observer/dead/ghost = body.ghostize(1)
- ghost.admin_ghosted = 1
+ var/mob/observer/dead/ghost
+ if(build_mode)
+ togglebuildmode(body)
+ ghost = body.ghostize(1)
+ ghost.admin_ghosted = 1
+ if(build_mode == "Yes")
+ togglebuildmode(ghost)
+ else
+ ghost = body.ghostize(1)
+ ghost.admin_ghosted = 1
if(body)
body.teleop = ghost
if(!body.key)
@@ -179,7 +200,7 @@
if(istype(src.mob, /mob/new_player))
mob.name = capitalize(ckey)
else
- var/new_key = ckeyEx(input(usr, "Enter your desired display name.", "Fake Key", key) as text|null)
+ var/new_key = ckeyEx(tgui_input_text(usr, "Enter your desired display name.", "Fake Key", key))
if(!new_key)
return
if(length(new_key) >= 26)
@@ -253,10 +274,10 @@
if("Big Bomb")
explosion(epicenter, 3, 5, 7, 5)
if("Custom Bomb")
- var/devastation_range = input(usr, "Devastation range (in tiles):") as num
- var/heavy_impact_range = input(usr, "Heavy impact range (in tiles):") as num
- var/light_impact_range = input(usr, "Light impact range (in tiles):") as num
- var/flash_range = input(usr, "Flash range (in tiles):") as num
+ var/devastation_range = tgui_input_number(usr, "Devastation range (in tiles):")
+ var/heavy_impact_range = tgui_input_number(usr, "Heavy impact range (in tiles):")
+ var/light_impact_range = tgui_input_number(usr, "Light impact range (in tiles):")
+ var/flash_range = tgui_input_number(usr, "Flash range (in tiles):")
explosion(epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range)
message_admins("[ckey] creating an admin explosion at [epicenter.loc].")
feedback_add_details("admin_verb","DB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -276,7 +297,7 @@
if ("Badmin") severity = 99
D.makerandom(severity)
- D.infectionchance = input(usr, "How virulent is this disease? (1-100)", "Give Disease", D.infectionchance) as num
+ D.infectionchance = tgui_input_number(usr, "How virulent is this disease? (1-100)", "Give Disease", D.infectionchance)
if(istype(T,/mob/living/carbon/human))
var/mob/living/carbon/human/H = T
@@ -307,7 +328,7 @@
var/new_modifier_type = tgui_input_list(usr, "What modifier should we add to [L]?", "Modifier Type", possible_modifiers)
if(!new_modifier_type)
return
- var/duration = input(usr, "How long should the new modifier last, in seconds. To make it last forever, write '0'.", "Modifier Duration") as num
+ var/duration = tgui_input_number(usr, "How long should the new modifier last, in seconds. To make it last forever, write '0'.", "Modifier Duration")
if(duration == 0)
duration = null
else
@@ -321,7 +342,7 @@
set name = "Make Sound"
set desc = "Display a message to everyone who can hear the target"
if(O)
- var/message = sanitize(input(usr, "What do you want the message to be?", "Make Sound") as text|null)
+ var/message = sanitize(tgui_input_text(usr, "What do you want the message to be?", "Make Sound"))
if(!message)
return
O.audible_message(message)
@@ -405,7 +426,7 @@
var/mob/living/silicon/S = tgui_input_list(usr, "Select silicon.", "Rename Silicon.", silicon_mob_list)
if(!S) return
- var/new_name = sanitizeSafe(input(src, "Enter new name. Leave blank or as is to cancel.", "[S.real_name] - Enter new silicon name", S.real_name))
+ var/new_name = sanitizeSafe(tgui_input_text(src, "Enter new name. Leave blank or as is to cancel.", "[S.real_name] - Enter new silicon name", S.real_name))
if(new_name && new_name != S.real_name)
log_and_message_admins("has renamed the silicon '[S.real_name]' to '[new_name]'")
S.SetName(new_name)
diff --git a/code/modules/admin/admin_verbs_vr.dm b/code/modules/admin/admin_verbs_vr.dm
index 6d92fde40bb..994d12a4ea5 100644
--- a/code/modules/admin/admin_verbs_vr.dm
+++ b/code/modules/admin/admin_verbs_vr.dm
@@ -39,9 +39,9 @@
if(isturf(orbiter))
to_chat(usr, "The orbiter cannot be a turf. It can only be used as a center.")
return
- var/distance = input(usr, "How large will their orbit radius be? (In pixels. 32 is 'near around a character)", "Orbit Radius", 32) as num|null
- var/speed = input(usr, "How fast will they orbit (negative numbers spin clockwise)", "Orbit Speed", 20) as num|null
- var/segments = input(usr, "How many segments will they have in their orbit? (3 is a triangle, 36 is a circle, etc)", "Orbit Segments", 36) as num|null
+ var/distance = tgui_input_number(usr, "How large will their orbit radius be? (In pixels. 32 is 'near around a character)", "Orbit Radius", 32)
+ var/speed = tgui_input_number(usr, "How fast will they orbit (negative numbers spin clockwise)", "Orbit Speed", 20)
+ var/segments = tgui_input_number(usr, "How many segments will they have in their orbit? (3 is a triangle, 36 is a circle, etc)", "Orbit Segments", 36)
var/clock = FALSE
if(!distance)
distance = 32
diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm
index 4a0d3c496f4..58e90122771 100644
--- a/code/modules/admin/callproc/callproc.dm
+++ b/code/modules/admin/callproc/callproc.dm
@@ -21,7 +21,7 @@
target = null
targetselected = 0
- var/procname = input(usr, "Proc path, eg: /proc/fake_blood","Path:", null) as text|null
+ var/procname = tgui_input_text(usr, "Proc path, eg: /proc/fake_blood","Path:", null)
if(!procname)
return
@@ -136,7 +136,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
if(!check_rights(R_DEBUG))
return
- var/procname = input(usr, "Proc name, eg: fake_blood","Proc:", null) as text|null
+ var/procname = tgui_input_text(usr, "Proc name, eg: fake_blood","Proc:", null)
if(!procname)
return
if(!hascall(A,procname))
@@ -161,7 +161,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
to_chat(usr, .)
/client/proc/get_callproc_args()
- var/argnum = input(usr, "Number of arguments","Number:",0) as num|null
+ var/argnum = tgui_input_number(usr, "Number of arguments","Number:",0)
if(isnull(argnum))
return null //Cancel
diff --git a/code/modules/admin/news.dm b/code/modules/admin/news.dm
index 179391987c5..c0812b818e5 100644
--- a/code/modules/admin/news.dm
+++ b/code/modules/admin/news.dm
@@ -22,13 +22,13 @@
if(F)
var/title = F["title"]
var/body = html2paper_markup(F["body"])
- var/new_title = sanitize(input(src,"Write a good title for the news update. Note: HTML is NOT supported.","Write News", title) as null|text, extra = 0)
+ var/new_title = sanitize(tgui_input_text(src,"Write a good title for the news update. Note: HTML is NOT supported.","Write News", title), extra = 0)
if(!new_title)
return
- var/new_body = sanitize(input(src,"Write the body of the news update here. Note: HTML is NOT supported, however paper markup is supported. \n\
+ var/new_body = sanitize(tgui_input_text(src,"Write the body of the news update here. Note: HTML is NOT supported, however paper markup is supported. \n\
Hitting enter will automatically add a line break. \n\
Valid markup includes: \[b\], \[i\], \[u\], \[large\], \[h1\], \[h2\], \[h3\]\ \[*\], \[hr\], \[small\], \[list\], \[table\], \[grid\], \
- \[row\], \[cell\], \[logo\], \[sglogo\].","Write News", body) as null|message, extra = 0)
+ \[row\], \[cell\], \[logo\], \[sglogo\].","Write News", body, multiline = TRUE, prevent_enter = TRUE), extra = 0)
new_body = paper_markup2html(new_body)
diff --git a/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm b/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm
index 594b3c34d27..942ff60d77c 100644
--- a/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm
+++ b/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm
@@ -26,7 +26,7 @@
var/transition_area = tgui_input_list(user, "Which area is the transition area? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", area_choices)
if (!transition_area) return
- var/move_duration = input(user, "How many seconds will this jump take?") as num
+ var/move_duration = tgui_input_number(user, "How many seconds will this jump take?")
S.long_jump(area_choices[origin_area], area_choices[destination_area], area_choices[transition_area], move_duration)
message_admins("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle", 1)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index c82ea1c80ad..0ddf3441f77 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -24,6 +24,8 @@
else if(href_list["ahelp_tickets"])
GLOB.ahelp_tickets.BrowseTickets(text2num(href_list["ahelp_tickets"]))
+ mentor_commands(href, href_list, src)
+
if(href_list["dbsearchckey"] || href_list["dbsearchadmin"])
var/adminckey = href_list["dbsearchadmin"]
@@ -102,6 +104,8 @@
notes_add(banckey,banreason,usr)
DB_ban_record(bantype, playermob, banduration, banreason, banjob, null, banckey, banip, bancid )
+ if((bantype == BANTYPE_PERMA || bantype == BANTYPE_TEMP) && playermob.client)
+ qdel(playermob.client)
else if(href_list["editrights"])
if(!check_rights(R_PERMISSIONS))
@@ -113,7 +117,7 @@
var/task = href_list["editrights"]
if(task == "add")
- var/new_ckey = ckey(input(usr,"New admin's ckey","Admin ckey", null) as text|null)
+ var/new_ckey = ckey(tgui_input_text(usr,"New admin's ckey","Admin ckey", null))
if(!new_ckey) return
if(new_ckey in admin_datums)
to_chat(usr, "Error: Topic 'editrights': [new_ckey] is already an admin")
@@ -151,7 +155,7 @@
switch(new_rank)
if(null,"") return
if("*New Rank*")
- new_rank = input(usr, "Please input a new rank", "New custom rank", null, null) as null|text
+ new_rank = tgui_input_text(usr, "Please input a new rank", "New custom rank")
if(config.admin_legacy_system)
new_rank = ckeyEx(new_rank)
if(!new_rank)
@@ -232,7 +236,7 @@
if(!check_rights(R_SERVER)) return
if (emergency_shuttle.wait_for_launch)
- var/new_time_left = input(usr, "Enter new shuttle launch countdown (seconds):","Edit Shuttle Launch Time", emergency_shuttle.estimate_launch_time() ) as num
+ var/new_time_left = tgui_input_number(usr, "Enter new shuttle launch countdown (seconds):","Edit Shuttle Launch Time", emergency_shuttle.estimate_launch_time() )
emergency_shuttle.launch_time = world.time + new_time_left*10
@@ -240,7 +244,7 @@
message_admins("[key_name_admin(usr)] edited the Emergency Shuttle's launch time to [new_time_left*10]", 1)
else if (emergency_shuttle.shuttle.has_arrive_time())
- var/new_time_left = input(usr, "Enter new shuttle arrival time (seconds):","Edit Shuttle Arrival Time", emergency_shuttle.estimate_arrival_time() ) as num
+ var/new_time_left = tgui_input_number(usr, "Enter new shuttle arrival time (seconds):","Edit Shuttle Arrival Time", emergency_shuttle.estimate_arrival_time() )
emergency_shuttle.shuttle.arrive_time = world.time + new_time_left*10
log_admin("[key_name(usr)] edited the Emergency Shuttle's arrival time to [new_time_left]")
@@ -338,17 +342,17 @@
var/mins = 0
if(minutes > CMinutes)
mins = minutes - CMinutes
- mins = input(usr,"How long (in minutes)? (Default: 1440)","Ban time",mins ? mins : 1440) as num|null
+ mins = tgui_input_number(usr,"How long (in minutes)? (Default: 1440)","Ban time",mins ? mins : 1440)
if(!mins) return
mins = min(525599,mins)
minutes = CMinutes + mins
duration = GetExp(minutes)
- reason = sanitize(input(usr,"Reason?","reason",reason2) as text|null)
+ reason = sanitize(tgui_input_text(usr,"Reason?","reason",reason2))
if(!reason) return
if("No")
temp = 0
duration = "Perma"
- reason = sanitize(input(usr,"Reason?","reason",reason2) as text|null)
+ reason = sanitize(tgui_input_text(usr,"Reason?","reason",reason2))
if(!reason) return
log_admin("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]")
@@ -758,13 +762,13 @@
if(config.ban_legacy_system)
to_chat(usr, "Your server is using the legacy banning system, which does not support temporary job bans. Consider upgrading. Aborting ban.")
return
- var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null
+ var/mins = tgui_input_number(usr,"How long (in minutes)?","Ban time",1440)
if(!mins)
return
if(check_rights(R_MOD, 0) && !check_rights(R_BAN, 0) && mins > config.mod_job_tempban_max)
to_chat(usr, " Moderators can only job tempban up to [config.mod_job_tempban_max] minutes!")
return
- var/reason = sanitize(input(usr,"Reason?","Please State Reason","") as text|null)
+ var/reason = sanitize(tgui_input_text(usr,"Reason?","Please State Reason",""))
if(!reason)
return
@@ -789,7 +793,7 @@
return 1
if("No")
if(!check_rights(R_BAN)) return
- var/reason = sanitize(input(usr,"Reason?","Please State Reason","") as text|null)
+ var/reason = sanitize(tgui_input_text(usr,"Reason?","Please State Reason",""))
if(reason)
var/msg
for(var/job in notbannedlist)
@@ -846,7 +850,7 @@
if (ismob(M))
if(!check_if_greater_rights_than(M.client))
return
- var/reason = sanitize(input(usr, "Please enter reason.") as null|message)
+ var/reason = sanitize(tgui_input_text(usr, "Please enter reason.", multiline = TRUE, prevent_enter = TRUE))
if(!reason)
return
@@ -888,14 +892,14 @@
switch(tgui_alert(usr, "Temporary Ban?","Temporary Ban",list("Yes","No","Cancel")))
if("Yes")
- var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null
+ var/mins = tgui_input_number(usr,"How long (in minutes)?","Ban time",1440)
if(!mins)
return
if(check_rights(R_MOD, 0) && !check_rights(R_BAN, 0) && mins > config.mod_tempban_max)
to_chat(usr, "Moderators can only job tempban up to [config.mod_tempban_max] minutes!")
return
if(mins >= 525600) mins = 525599
- var/reason = sanitize(input(usr,"Reason?","reason","Griefer") as text|null)
+ var/reason = sanitize(tgui_input_text(usr,"Reason?","reason","Griefer"))
if(!reason)
return
AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins)
@@ -919,7 +923,7 @@
//qdel(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends.
if("No")
if(!check_rights(R_BAN)) return
- var/reason = sanitize(input(usr,"Reason?","reason","Griefer") as text|null)
+ var/reason = sanitize(tgui_input_text(usr,"Reason?","reason","Griefer"))
if(!reason)
return
switch(tgui_alert(usr,"IP ban?","IP Ban",list("Yes","No","Cancel")))
@@ -1045,7 +1049,7 @@
if(!ismob(M))
to_chat(usr, "this can only be used on instances of type /mob")
- var/speech = input(usr, "What will [key_name(M)] say?.", "Force speech", "") // Don't need to sanitize, since it does that in say(), we also trust our admins.
+ var/speech = tgui_input_text(usr, "What will [key_name(M)] say?.", "Force speech", "") // Don't need to sanitize, since it does that in say(), we also trust our admins.
if(!speech) return
M.say(speech)
speech = sanitize(speech) // Nah, we don't trust them
@@ -1463,7 +1467,7 @@
return
if(L.can_centcom_reply())
- var/input = sanitize(input(src.owner, "Please enter a message to reply to [key_name(L)] via their headset.","Outgoing message from CentCom", ""))
+ var/input = sanitize(tgui_input_text(src.owner, "Please enter a message to reply to [key_name(L)] via their headset.","Outgoing message from CentCom", ""))
if(!input) return
to_chat(src.owner, "You sent [input] to [L] via a secure channel.")
@@ -1488,7 +1492,7 @@
to_chat(usr, "The person you are trying to contact is not wearing a headset")
return
- var/input = sanitize(input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from a shadowy figure...", ""))
+ var/input = sanitize(tgui_input_text(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from a shadowy figure...", ""))
if(!input) return
to_chat(src.owner, "You sent [input] to [H] via a secure channel.")
@@ -1785,7 +1789,7 @@
src.access_news_network()
else if(href_list["ac_set_channel_name"])
- src.admincaster_feed_channel.channel_name = sanitizeSafe(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", ""))
+ src.admincaster_feed_channel.channel_name = sanitizeSafe(tgui_input_text(usr, "Provide a Feed Channel Name", "Network Channel Handler", ""))
src.access_news_network()
else if(href_list["ac_set_channel_lock"])
@@ -1817,11 +1821,11 @@
src.access_news_network()
else if(href_list["ac_set_new_title"])
- src.admincaster_feed_message.title = sanitize(input(usr, "Enter the Feed title", "Network Channel Handler", ""))
+ src.admincaster_feed_message.title = sanitize(tgui_input_text(usr, "Enter the Feed title", "Network Channel Handler", ""))
src.access_news_network()
else if(href_list["ac_set_new_message"])
- src.admincaster_feed_message.body = sanitize(input(usr, "Write your Feed story", "Network Channel Handler", "") as message)
+ src.admincaster_feed_message.body = sanitize(tgui_input_text(usr, "Write your Feed story", "Network Channel Handler", "", multiline = TRUE, prevent_enter = TRUE))
src.access_news_network()
else if(href_list["ac_submit_new_message"])
@@ -1863,11 +1867,11 @@
src.access_news_network()
else if(href_list["ac_set_wanted_name"])
- src.admincaster_feed_message.author = sanitize(input(usr, "Provide the name of the Wanted person", "Network Security Handler", ""))
+ src.admincaster_feed_message.author = sanitize(tgui_input_text(usr, "Provide the name of the Wanted person", "Network Security Handler", ""))
src.access_news_network()
else if(href_list["ac_set_wanted_desc"])
- src.admincaster_feed_message.body = sanitize(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", ""))
+ src.admincaster_feed_message.body = sanitize(tgui_input_text(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", ""))
src.access_news_network()
else if(href_list["ac_submit_wanted"])
@@ -1972,7 +1976,7 @@
src.access_news_network()
else if(href_list["ac_set_signature"])
- src.admincaster_signature = sanitize(input(usr, "Provide your desired signature", "Network Identity Handler", ""))
+ src.admincaster_signature = sanitize(tgui_input_text(usr, "Provide your desired signature", "Network Identity Handler", ""))
src.access_news_network()
else if(href_list["populate_inactive_customitems"])
@@ -2019,21 +2023,6 @@
// player info stuff
- if(href_list["add_player_info"])
- var/key = href_list["add_player_info"]
- var/add = sanitize(input(usr, "Add Player Info") as null|text)
- if(!add) return
-
- notes_add(key,add,usr)
- show_player_info(key)
-
- if(href_list["remove_player_info"])
- var/key = href_list["remove_player_info"]
- var/index = text2num(href_list["remove_index"])
-
- notes_del(key, index)
- show_player_info(key)
-
if(href_list["notes"])
var/ckey = href_list["ckey"]
if(!ckey)
@@ -2043,7 +2032,9 @@
switch(href_list["notes"])
if("show")
- show_player_info(ckey)
+ var/datum/tgui_module/player_notes_info/A = new(src)
+ A.key = ckey
+ A.tgui_interact(usr)
if("list")
var/filter
if(href_list["filter"] && href_list["filter"] != "0")
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 7590efd7b0f..91f99f397be 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -459,7 +459,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
usr << browse(dat.Join(), "window=ahelp[id];size=620x480")
/datum/admin_help/proc/Retitle()
- var/new_title = input(usr, "Enter a title for the ticket", "Rename Ticket", name) as text|null
+ var/new_title = tgui_input_text(usr, "Enter a title for the ticket", "Rename Ticket", name)
if(new_title)
name = new_title
//not saying the original name cause it could be a long ass message
diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm
index c108bbf14b1..ee127136da9 100644
--- a/code/modules/admin/verbs/adminjump.dm
+++ b/code/modules/admin/verbs/adminjump.dm
@@ -210,13 +210,13 @@
if(config.allow_admin_jump)
if(isnull(tx))
- tx = input(usr, "Select X coordinate", "Move Atom", null, null) as null|num
+ tx = tgui_input_number(usr, "Select X coordinate", "Move Atom", null, null)
if(!tx) return
if(isnull(ty))
- ty = input(usr, "Select Y coordinate", "Move Atom", null, null) as null|num
+ ty = tgui_input_number(usr, "Select Y coordinate", "Move Atom", null, null)
if(!ty) return
if(isnull(tz))
- tz = input(usr, "Select Z coordinate", "Move Atom", null, null) as null|num
+ tz = tgui_input_number(usr, "Select Z coordinate", "Move Atom", null, null)
if(!tz) return
var/turf/T = locate(tx, ty, tz)
if(!T)
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index a25fac29e92..592b20b358d 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -57,7 +57,7 @@
if(AH)
message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.")
- var/msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null
+ var/msg = tgui_input_text(src,"Message:", "Private message to [key_name(C, 0, 0)]")
if (!msg)
message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.")
return
@@ -92,7 +92,7 @@
if(!ircreplyamount) //to prevent people from spamming irc
return
if(!msg)
- msg = input(src,"Message:", "Private message to Administrator") as text|null
+ msg = tgui_input_text(src,"Message:", "Private message to Administrator")
if(!msg)
return
@@ -112,7 +112,7 @@
//get message text, limit it's length.and clean/escape html
if(!msg)
- msg = input(src,"Message:", "Private message to [key_name(recipient, 0, 0)]") as text|null
+ msg = tgui_input_text(src,"Message:", "Private message to [key_name(recipient, 0, 0)]")
if(!msg)
return
@@ -188,7 +188,7 @@
spawn() //so we don't hold the caller proc up
var/sender = src
var/sendername = key
- var/reply = input(recipient, msg,"Admin PM from-[sendername]", "") as text|null //show message and await a reply
+ var/reply = tgui_input_text(recipient, msg,"Admin PM from-[sendername]", "") //show message and await a reply
if(recipient && reply)
if(sender)
recipient.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them
diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm
index 290b04bdde1..f4715c8f1c8 100644
--- a/code/modules/admin/verbs/buildmode.dm
+++ b/code/modules/admin/verbs/buildmode.dm
@@ -257,16 +257,16 @@
if(BUILDMODE_EDIT)
var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine")
- master.buildmode.varholder = input(usr,"Enter variable name:" ,"Name", "name")
+ master.buildmode.varholder = tgui_input_text(usr,"Enter variable name:" ,"Name", "name")
if(master.buildmode.varholder in locked && !check_rights(R_DEBUG,0))
return 1
var/thetype = tgui_input_list(usr,"Select variable type:", "Type", list("text","number","mob-reference","obj-reference","turf-reference"))
if(!thetype) return 1
switch(thetype)
if("text")
- master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value", "value") as text
+ master.buildmode.valueholder = tgui_input_text(usr,"Enter variable value:" ,"Value", "value")
if("number")
- master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value", 123) as num
+ master.buildmode.valueholder = tgui_input_number(usr,"Enter variable value:" ,"Value", 123)
if("mob-reference")
master.buildmode.valueholder = tgui_input_list(usr,"Enter variable value:", "Value", mob_list)
if("obj-reference")
@@ -286,11 +286,11 @@
var/choice = tgui_alert(usr, "Change the new light range, power, or color?", "Light Maker", list("Range", "Power", "Color"))
switch(choice)
if("Range")
- var/input = input(usr, "New light range.","Light Maker",3) as null|num
+ var/input = tgui_input_number(usr, "New light range.","Light Maker",3)
if(input)
new_light_range = input
if("Power")
- var/input = input(usr, "New light power.","Light Maker",3) as null|num
+ var/input = tgui_input_number(usr, "New light power.","Light Maker",3)
if(input)
new_light_intensity = input
if("Color")
@@ -625,7 +625,7 @@
return
/obj/effect/bmode/buildmode/proc/get_path_from_partial_text(default_path)
- var/desired_path = input(usr, "Enter full or partial typepath.","Typepath","[default_path]")
+ var/desired_path = tgui_input_text(usr, "Enter full or partial typepath.","Typepath","[default_path]")
var/list/types = typesof(/atom)
var/list/matches = list()
@@ -643,7 +643,7 @@
if(matches.len==1)
result = matches[1]
else
- result = tgui_input_list(usr, "Select an atom type", "Spawn Atom", matches)
+ result = tgui_input_list(usr, "Select an atom type", "Spawn Atom", matches, strict_modern = TRUE)
if(!objholder)
result = default_path
return result
diff --git a/code/modules/admin/verbs/change_appearance.dm b/code/modules/admin/verbs/change_appearance.dm
index 717a8ce5bd7..2cafd14ee4e 100644
--- a/code/modules/admin/verbs/change_appearance.dm
+++ b/code/modules/admin/verbs/change_appearance.dm
@@ -74,7 +74,7 @@
M.g_skin = hex2num(copytext(new_skin, 4, 6))
M.b_skin = hex2num(copytext(new_skin, 6, 8))
- var/new_tone = input(usr, "Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation") as text
+ var/new_tone = tgui_input_number(usr, "Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation", null, 220, 1)
if (new_tone)
M.s_tone = max(min(round(text2num(new_tone)), 220), 1)
diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm
index 51f0364843a..477f2f032c7 100644
--- a/code/modules/admin/verbs/cinematic.dm
+++ b/code/modules/admin/verbs/cinematic.dm
@@ -12,7 +12,7 @@
if("explosion")
if(tgui_alert(usr, "The game will be over. Are you really sure?", "Confirmation", list("Continue","Cancel")) == "Cancel")
return
- var/parameter = input(src,"station_missed = ?","Enter Parameter",0) as num
+ var/parameter = tgui_input_number(src,"station_missed = ?","Enter Parameter",0,1,0)
var/override
switch(parameter)
if(1)
diff --git a/code/modules/admin/verbs/custom_event.dm b/code/modules/admin/verbs/custom_event.dm
index 6b92e9932e2..de4032f9662 100644
--- a/code/modules/admin/verbs/custom_event.dm
+++ b/code/modules/admin/verbs/custom_event.dm
@@ -7,7 +7,7 @@
to_chat(src, "Only administrators may use this command.")
return
- var/input = sanitize(input(usr, "Enter the description of the custom event. Be descriptive. To cancel the event, make this blank or hit cancel.", "Custom Event", custom_event_msg) as message|null, MAX_PAPER_MESSAGE_LEN, extra = 0)
+ var/input = sanitize(tgui_input_text(usr, "Enter the description of the custom event. Be descriptive. To cancel the event, make this blank or hit cancel.", "Custom Event", custom_event_msg, MAX_PAPER_MESSAGE_LEN, TRUE, prevent_enter = TRUE), MAX_PAPER_MESSAGE_LEN, extra = 0)
if(!input || input == "")
custom_event_msg = null
log_admin("[usr.key] has cleared the custom event text.")
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 8b0baa59676..c2e4b671f7b 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -129,31 +129,35 @@
M.Animalize()
-/client/proc/makepAI(var/turf/T in mob_list)
+/client/proc/makepAI()
set category = "Fun"
set name = "Make pAI"
- set desc = "Specify a location to spawn a pAI device, then specify a key to play that pAI"
+ set desc = "Spawn someone in as a pAI!"
+ if(!check_rights(R_ADMIN|R_EVENT|R_DEBUG))
+ return
+ var/turf/T = get_turf(mob)
var/list/available = list()
for(var/mob/C in mob_list)
- if(C.key)
+ if(C.key && isobserver(C))
available.Add(C)
var/mob/choice = tgui_input_list(usr, "Choose a player to play the pAI", "Spawn pAI", available)
if(!choice)
return 0
- if(!istype(choice, /mob/observer/dead))
- var/confirm = tgui_alert(usr, "[choice.key] isn't ghosting right now. Are you sure you want to yank them out of them out of their body and place them in this pAI?", "Spawn pAI Confirmation", list("No", "Yes"))
- if(confirm != "Yes")
- return 0
- var/obj/item/device/paicard/card = new(T)
+ var/obj/item/device/paicard/typeb/card = new(T)
var/mob/living/silicon/pai/pai = new(card)
- pai.name = sanitizeSafe(input(choice, "Enter your pAI name:", "pAI Name", "Personal AI") as text)
pai.real_name = pai.name
pai.key = choice.key
card.setPersonality(pai)
+ if(tgui_alert(pai, "Do you want to load your pAI data?", "Load", list("Yes", "No")) == "Yes")
+ pai.savefile_load(pai)
+ else
+ pai.name = sanitizeSafe(tgui_input_text(pai, "Enter your pAI name:", "pAI Name", "Personal AI"))
+ card.setPersonality(pai)
for(var/datum/paiCandidate/candidate in paiController.pai_candidates)
if(candidate.key == choice.key)
paiController.pai_candidates.Remove(candidate)
+ log_admin("made a pAI with key=[pai.key] at ([T.x],[T.y],[T.z])")
feedback_add_details("admin_verb","MPAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_alienize(var/mob/M in mob_list)
@@ -658,9 +662,9 @@
var/datum/planet/planet = tgui_input_list(usr, "Which planet do you want to modify time on?", "Change Time", SSplanets.planets)
if(istype(planet))
var/datum/time/current_time_datum = planet.current_time
- var/new_hour = input(usr, "What hour do you want to change to?", "Change Time", text2num(current_time_datum.show_time("hh"))) as null|num
+ var/new_hour = tgui_input_number(usr, "What hour do you want to change to?", "Change Time", text2num(current_time_datum.show_time("hh")))
if(!isnull(new_hour))
- var/new_minute = input(usr, "What minute do you want to change to?", "Change Time", text2num(current_time_datum.show_time("mm")) ) as null|num
+ var/new_minute = tgui_input_number(usr, "What minute do you want to change to?", "Change Time", text2num(current_time_datum.show_time("mm")) )
if(!isnull(new_minute))
var/type_needed = current_time_datum.type
var/datum/time/new_time = new type_needed()
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index b70a0919804..ce39bbb0b8a 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -177,7 +177,7 @@
set desc = "This searches all the active jobban entries for the current round and outputs the results to standard output."
set category = "Debug"
- var/job_filter = input(usr, "Contains what?","Job Filter") as text|null
+ var/job_filter = tgui_input_text(usr, "Contains what?","Job Filter")
if(!job_filter)
return
diff --git a/code/modules/admin/verbs/dice.dm b/code/modules/admin/verbs/dice.dm
index 2aa6f91a667..cc21521859d 100644
--- a/code/modules/admin/verbs/dice.dm
+++ b/code/modules/admin/verbs/dice.dm
@@ -4,8 +4,8 @@
if(!check_rights(R_FUN))
return
- var/sum = input(usr, "How many times should we throw?") as num
- var/side = input(usr, "Select the number of sides.") as num
+ var/sum = tgui_input_number(usr, "How many times should we throw?")
+ var/side = tgui_input_number(usr, "Select the number of sides.")
if(!side)
side = 6
if(!sum)
diff --git a/code/modules/admin/verbs/fps.dm b/code/modules/admin/verbs/fps.dm
index 4b357a704d9..c3b9999afbc 100644
--- a/code/modules/admin/verbs/fps.dm
+++ b/code/modules/admin/verbs/fps.dm
@@ -8,7 +8,7 @@
if(!check_rights(R_DEBUG))
return
- var/new_fps = round(input(usr, "Sets game frames-per-second. Can potentially break the game (default: [config.fps])", "FPS", world.fps) as num|null)
+ var/new_fps = round(tgui_input_number(usr, "Sets game frames-per-second. Can potentially break the game (default: [config.fps])", "FPS", world.fps))
if(new_fps <= 0)
to_chat(src, "Error: set_server_fps(): Invalid world.fps value. No changes made.")
return
diff --git a/code/modules/admin/verbs/lightning_strike.dm b/code/modules/admin/verbs/lightning_strike.dm
index d00fb4a1aff..6ebcca804d3 100644
--- a/code/modules/admin/verbs/lightning_strike.dm
+++ b/code/modules/admin/verbs/lightning_strike.dm
@@ -17,7 +17,7 @@
(JMP)")
#define LIGHTNING_REDIRECT_RANGE 28 // How far in tiles certain things draw lightning from.
-#define LIGHTNING_ZAP_RANGE 3 // How far the tesla effect zaps, as well as the bad effects from a direct strike.
+#define LIGHTNING_ZAP_RANGE 1 // How far the tesla effect zaps, as well as the bad effects from a direct strike.
#define LIGHTNING_POWER 20000 // How much 'zap' is in a strike, used for tesla_zap().
// The real lightning proc.
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index b49a278967a..f4ffd7c8fcf 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -280,13 +280,13 @@ var/list/debug_verbs = list (
/client/proc/count_objects_on_z_level()
set category = "Mapping"
set name = "Count Objects On Level"
- var/level = input(usr, "Which z-level?","Level?") as text
+ var/level = tgui_input_text(usr, "Which z-level?","Level?")
if(!level) return
var/num_level = text2num(level)
if(!num_level) return
if(!isnum(num_level)) return
- var/type_text = input(usr, "Which type path?","Path?") as text
+ var/type_text = tgui_input_text(usr, "Which type path?","Path?")
if(!type_text) return
var/type_path = text2path(type_text)
if(!type_path) return
@@ -324,7 +324,7 @@ var/list/debug_verbs = list (
set category = "Mapping"
set name = "Count Objects All"
- var/type_text = input(usr, "Which type path?","") as text
+ var/type_text = tgui_input_text(usr, "Which type path?","")
if(!type_text) return
var/type_path = text2path(type_text)
if(!type_path) return
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index f2f484ed7c5..2427b2441d4 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -17,7 +17,7 @@
return
var/image/cross = image('icons/obj/storage.dmi',"bible")
- msg = "[bicon(cross)] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, src)]) (CA) (SC) (SMITE): [msg]"
+ msg = "\icon[cross][bicon(cross)] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, src)]) (CA) (SC) (SMITE): [msg]"
for(var/client/C in GLOB.admins)
if(R_ADMIN|R_EVENT & C.holder.rights)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index fcf5d64e7ea..90cd3ae0371 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -86,7 +86,7 @@
if (!holder)
return
- var/msg = sanitize(input(usr, "Message:", text("Subtle PM to [M.key]")) as text)
+ var/msg = sanitize(tgui_input_text(usr, "Message:", text("Subtle PM to [M.key]")))
if (!msg)
return
@@ -108,7 +108,7 @@
if (!holder)
return
- var/msg = input(usr, "Message:", text("Enter the text you wish to appear to everyone:")) as text
+ var/msg = tgui_input_text(usr, "Message:", text("Enter the text you wish to appear to everyone:"))
if(!(msg[1] == "<" && msg[length(msg)] == ">")) //You can use HTML but only if the whole thing is HTML. Tries to prevent admin 'accidents'.
msg = sanitize(msg)
@@ -132,7 +132,7 @@
if(!M)
return
- var/msg = input(usr, "Message:", text("Enter the text you wish to appear to your target:")) as text
+ var/msg = tgui_input_text(usr, "Message:", text("Enter the text you wish to appear to your target:"))
if(msg && !(msg[1] == "<" && msg[length(msg)] == ">")) //You can use HTML but only if the whole thing is HTML. Tries to prevent admin 'accidents'.
msg = sanitize(msg)
@@ -575,7 +575,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!holder)
return
- var/input = sanitize(input(usr, "Please enter anything you want the AI to do. Anything. Serious.", "What?", "") as text|null)
+ var/input = sanitize(tgui_input_text(usr, "Please enter anything you want the AI to do. Anything. Serious.", "What?", ""))
if(!input)
return
for(var/mob/living/silicon/ai/M in mob_list)
@@ -627,8 +627,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!holder)
return
- var/input = sanitize(input(usr, "Please enter anything you want. Anything. Serious.", "What?", "") as message|null, extra = 0)
- var/customname = sanitizeSafe(input(usr, "Pick a title for the report.", "Title") as text|null)
+ var/input = sanitize(tgui_input_text(usr, "Please enter anything you want. Anything. Serious.", "What?", "", multiline = TRUE, prevent_enter = TRUE), extra = 0)
+ var/customname = sanitizeSafe(tgui_input_text(usr, "Pick a title for the report.", "Title"))
if(!input)
return
if(!customname)
@@ -675,13 +675,13 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!check_rights(R_DEBUG|R_FUN)) return //VOREStation Edit
- var/devastation = input(usr, "Range of total devastation. -1 to none", text("Input")) as num|null
+ var/devastation = tgui_input_number(usr, "Range of total devastation. -1 to none", text("Input"))
if(devastation == null) return
- var/heavy = input(usr, "Range of heavy impact. -1 to none", text("Input")) as num|null
+ var/heavy = tgui_input_number(usr, "Range of heavy impact. -1 to none", text("Input"))
if(heavy == null) return
- var/light = input(usr, "Range of light impact. -1 to none", text("Input")) as num|null
+ var/light = tgui_input_number(usr, "Range of light impact. -1 to none", text("Input"))
if(light == null) return
- var/flash = input(usr, "Range of flash. -1 to none", text("Input")) as num|null
+ var/flash = tgui_input_number(usr, "Range of flash. -1 to none", text("Input"))
if(flash == null) return
if ((devastation != -1) || (heavy != -1) || (light != -1) || (flash != -1))
@@ -703,13 +703,13 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!check_rights(R_DEBUG|R_FUN)) return //VOREStation Edit
- var/heavy = input(usr, "Range of heavy pulse.", text("Input")) as num|null
+ var/heavy = tgui_input_number(usr, "Range of heavy pulse.", text("Input"))
if(heavy == null) return
- var/med = input(usr, "Range of medium pulse.", text("Input")) as num|null
+ var/med = tgui_input_number(usr, "Range of medium pulse.", text("Input"))
if(med == null) return
- var/light = input(usr, "Range of light pulse.", text("Input")) as num|null
+ var/light = tgui_input_number(usr, "Range of light pulse.", text("Input"))
if(light == null) return
- var/long = input(usr, "Range of long pulse.", text("Input")) as num|null
+ var/long = tgui_input_number(usr, "Range of long pulse.", text("Input"))
if(long == null) return
if (heavy || med || light || long)
diff --git a/code/modules/admin/verbs/randomverbs_vr.dm b/code/modules/admin/verbs/randomverbs_vr.dm
index e60c5182486..d19d67916a0 100644
--- a/code/modules/admin/verbs/randomverbs_vr.dm
+++ b/code/modules/admin/verbs/randomverbs_vr.dm
@@ -10,7 +10,7 @@
if(!picked_client)
return
var/list/types = typesof(/mob/living)
- var/mob_type = input(src, "Mob path to spawn as?", "Mob") as text
+ var/mob_type = tgui_input_text(src, "Mob path to spawn as?", "Mob")
if(!mob_type)
return
var/list/matches = new()
@@ -81,7 +81,7 @@
if (!holder)
return
- var/msg = input(usr, "Message:", text("Enter the text you wish to appear to everyone:")) as text
+ var/msg = tgui_input_text(usr, "Message:", text("Enter the text you wish to appear to everyone:"))
if(!(msg[1] == "<" && msg[length(msg)] == ">")) //You can use HTML but only if the whole thing is HTML. Tries to prevent admin 'accidents'.
msg = sanitize(msg)
diff --git a/code/modules/admin/verbs/resize.dm b/code/modules/admin/verbs/resize.dm
index 058955799e0..dc340539307 100644
--- a/code/modules/admin/verbs/resize.dm
+++ b/code/modules/admin/verbs/resize.dm
@@ -5,7 +5,7 @@
if(!check_rights(R_ADMIN, R_FUN))
return
- var/size_multiplier = input(usr, "Input size multiplier.", "Resize", 1) as num|null
+ var/size_multiplier = tgui_input_number(usr, "Input size multiplier.", "Resize", 1)
if(!size_multiplier)
return //cancelled
diff --git a/code/modules/admin/verbs/smite.dm b/code/modules/admin/verbs/smite.dm
index 78fd832f112..a407454d2b0 100644
--- a/code/modules/admin/verbs/smite.dm
+++ b/code/modules/admin/verbs/smite.dm
@@ -25,21 +25,21 @@
broken_legs++
if(!broken_legs)
to_chat(src,"[target] didn't have any breakable legs, sorry.")
-
+
if(SMITE_BLUESPACEARTILLERY)
bluespace_artillery(target,src)
-
+
if(SMITE_SPONTANEOUSCOMBUSTION)
target.adjust_fire_stacks(10)
target.IgniteMob()
target.visible_message("[target] bursts into flames!")
-
+
if(SMITE_LIGHTNINGBOLT)
var/turf/T = get_step(get_step(target, NORTH), NORTH)
T.Beam(target, icon_state="lightning[rand(1,12)]", time = 5)
target.electrocute_act(75,def_zone = BP_HEAD)
target.visible_message("[target] is struck by lightning!")
-
+
else
return //Injection? Don't print any messages.
@@ -50,14 +50,6 @@
if(!istype(target))
return
- if(BSACooldown)
- if(user)
- to_chat(user,"BSA is still cooling down, please wait!")
- return
-
- BSACooldown = 1
- VARSET_IN(global, BSACooldown, FALSE, 5 SECONDS)
-
to_chat(target,"You've been hit by bluespace artillery!")
log_and_message_admins("[key_name(target)] has been hit by Bluespace Artillery fired by [key_name(user ? user : usr)]")
@@ -68,10 +60,12 @@
if(prob(80)) T.break_tile_to_plating()
else T.break_tile()
- if(target.health == 1)
+ playsound(T, get_sfx("explosion"), 100, 1, get_rand_frequency(), falloff = 5) // get_sfx() is so that everyone gets the same sound
+
+ if(target.health < 10)
target.gib()
else
- target.adjustBruteLoss( min( 99 , (target.health - 1) ) )
+ target.adjustBruteLoss( max( 99 , (target.health - 1) ) )
target.Stun(20)
target.Weaken(20)
target.stuttering = 20
diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm
index d7b2c1ffff2..7724062a6ed 100644
--- a/code/modules/admin/verbs/striketeam.dm
+++ b/code/modules/admin/verbs/striketeam.dm
@@ -43,7 +43,7 @@ var/const/commandos_possible = 6 //if more Commandos are needed in the future
choice = null
while(!choice)
- choice = sanitize(input(src, "Please specify which mission the strike team shall undertake.", "Specify Mission", ""))
+ choice = sanitize(tgui_input_text(src, "Please specify which mission the strike team shall undertake.", "Specify Mission", ""))
if(!choice)
if(tgui_alert(usr, "Error, no mission set. Do you want to exit the setup process?","Strike Team",list("Yes","No"))=="Yes")
return
diff --git a/code/modules/admin/view_variables/get_variables.dm b/code/modules/admin/view_variables/get_variables.dm
index 64920cdc9e9..f3fb4ea145e 100644
--- a/code/modules/admin/view_variables/get_variables.dm
+++ b/code/modules/admin/view_variables/get_variables.dm
@@ -85,19 +85,19 @@
switch(.["class"])
if (VV_TEXT)
- .["value"] = input(usr, "Enter new text:", "Text", current_value) as null|text
+ .["value"] = tgui_input_text(usr, "Enter new text:", "Text", current_value)
if (.["value"] == null)
.["class"] = null
return
if (VV_MESSAGE)
- .["value"] = input(usr, "Enter new text:", "Text", current_value) as null|message
+ .["value"] = tgui_input_text(usr, "Enter new text:", "Text", current_value, multiline = TRUE)
if (.["value"] == null)
.["class"] = null
return
if (VV_NUM)
- .["value"] = input(usr, "Enter new number:", "Num", current_value) as null|num
+ .["value"] = tgui_input_number(usr, "Enter new number:", "Num", current_value)
if (.["value"] == null)
.["class"] = null
return
@@ -124,7 +124,7 @@
var/type = current_value
var/error = ""
do
- type = input(usr, "Enter type:[error]", "Type", type) as null|text
+ type = tgui_input_text(usr, "Enter type:[error]", "Type", type)
if (!type)
break
type = text2path(type)
@@ -229,7 +229,7 @@
var/type = current_value
var/error = ""
do
- type = input(usr, "Enter type:[error]", "Type", type) as null|text
+ type = tgui_input_text(usr, "Enter type:[error]", "Type", type)
if (!type)
break
type = text2path(type)
diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm
index ddab5464e64..5080b5cdd4e 100644
--- a/code/modules/admin/view_variables/topic.dm
+++ b/code/modules/admin/view_variables/topic.dm
@@ -21,7 +21,7 @@
to_chat(usr, "This can only be used on instances of type /mob")
return
- var/new_name = sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null, MAX_NAME_LEN)
+ var/new_name = sanitize(tgui_input_text(usr,"What would you like to name this mob?","Input a name",M.real_name,MAX_NAME_LEN), MAX_NAME_LEN)
if( !new_name || !M ) return
message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].")
@@ -475,7 +475,7 @@
var/Text = href_list["adjustDamage"]
- var/amount = input(usr, "Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num
+ var/amount = tgui_input_number(usr, "Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0)
if(!L)
to_chat(usr, "Mob doesn't exist anymore")
diff --git a/code/modules/ai/ai_holder_fleeing.dm b/code/modules/ai/ai_holder_fleeing.dm
index 83a7be94b80..7e9b78b1f4e 100644
--- a/code/modules/ai/ai_holder_fleeing.dm
+++ b/code/modules/ai/ai_holder_fleeing.dm
@@ -18,6 +18,8 @@
if(can_flee)
if(special_flee_check())
return TRUE
+ if(isbelly(holder.loc)) //VOREStation Add - Don't flee while you're in a tummy, silly
+ return FALSE //VOREStation Add
if(!hostile && !retaliate)
return TRUE // We're not hostile and someone attacked us first.
if(flee_when_dying && (holder.health / holder.getMaxHealth()) <= dying_threshold)
diff --git a/code/modules/ai/ai_holder_movement.dm b/code/modules/ai/ai_holder_movement.dm
index 50624926844..b553b86b7e6 100644
--- a/code/modules/ai/ai_holder_movement.dm
+++ b/code/modules/ai/ai_holder_movement.dm
@@ -145,6 +145,8 @@
// Wanders randomly in cardinal directions.
/datum/ai_holder/proc/handle_wander_movement()
+ if(!holder)
+ return
ai_log("handle_wander_movement() : Entered.", AI_LOG_TRACE)
if(isturf(holder.loc) && can_act())
wander_delay--
@@ -164,13 +166,13 @@
// No target, don't use the ladder
// Target is visible, don't use the ladder
if(!target || can_see_target(target))
- return
+ return
var/has_hands = TRUE
if(istype(holder, /mob/living/simple_mob))
var/mob/living/simple_mob/S = holder
has_hands = S.has_hands
-
+
// Don't have means to use a ladder or the space around it, don't use the ladder
if(!has_hands && !holder.hovering)
return
@@ -178,7 +180,7 @@
var/obj/structure/ladder/L = locate() in get_turf(holder)
if(!istype(L))
return // No ladder, can't use it
-
+
if(!holder.may_climb_ladders(L))
return // Can't climb the ladder for other reasons (Probably inconsequential?)
@@ -187,6 +189,6 @@
directions += L.target_down
if(L.allowed_directions & UP)
directions += L.target_up
-
+
if(directions.len)
L.climbLadder(holder, pick(directions))
\ No newline at end of file
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index e33aec8c3c9..fd823068866 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -16,13 +16,13 @@
/obj/item/device/assembly_holder/proc/attach(var/obj/item/device/assembly/D, var/obj/item/device/assembly/D2, var/mob/user)
if(!D || !D2)
return FALSE
-
+
if(!istype(D) || !istype(D2))
return FALSE
if(D.secured || D2.secured)
return FALSE
-
+
if(user)
user.remove_from_mob(D)
user.remove_from_mob(D2)
@@ -151,7 +151,7 @@
if(!D)
return 0
if(!secured)
- visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
+ visible_message("\icon[src][bicon(src)] *beep* *beep*", "*beep* *beep*")
if((normal) && (a_right) && (a_left))
if(a_right != D)
a_right.pulsed(0)
@@ -214,7 +214,7 @@
if(tmr.timing)
to_chat(usr, "Clock is ticking already.")
else
- var/ntime = input(usr, "Enter desired time in seconds", "Time", "5") as num
+ var/ntime = tgui_input_number(usr, "Enter desired time in seconds", "Time", "5", 1000, 0)
if (ntime>0 && ntime<1000)
tmr.time = ntime
name = initial(name) + "([tmr.time] secs)"
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index 66ed0c186a5..c4c4e09e199 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -98,7 +98,7 @@
pulse(0)
QDEL_LIST_NULL(i_beams) //They will get recreated next process() if the situation is still appropriate
if(!holder)
- visible_message("[bicon(src)] *beep* *beep*")
+ visible_message("\icon[src][bicon(src)] *beep* *beep*")
/obj/item/device/assembly/infra/tgui_interact(mob/user, datum/tgui/ui)
if(!secured)
diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm
index cc744459938..0561eb47974 100644
--- a/code/modules/assembly/proximity.dm
+++ b/code/modules/assembly/proximity.dm
@@ -47,7 +47,7 @@
var/turf/mainloc = get_turf(src)
pulse(0)
if(!holder)
- mainloc.visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
+ mainloc.visible_message("\icon[src][bicon(src)] *beep* *beep*", "*beep* *beep*")
/obj/item/device/assembly/prox_sensor/process()
if(scanning)
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index a63b07f739f..2f977cb571c 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -117,7 +117,7 @@
if(!holder)
for(var/mob/O in hearers(1, src.loc))
- O.show_message("[bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2)
+ O.show_message("\icon[src][bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2)
/obj/item/device/assembly/signaler/proc/set_frequency(new_frequency)
if(!frequency)
diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm
index 33fefb58bf9..0353986b570 100644
--- a/code/modules/assembly/timer.dm
+++ b/code/modules/assembly/timer.dm
@@ -44,7 +44,7 @@
return 0
pulse(0)
if(!holder)
- visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
+ visible_message("\icon[src][bicon(src)] *beep* *beep*", "*beep* *beep*")
/obj/item/device/assembly/timer/process()
if(timing && time-- <= 0)
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index 66026a7993c..7c8eee7fdfb 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -13,7 +13,7 @@
recorded = msg
listening = 0
var/turf/T = get_turf(src) //otherwise it won't work in hand
- T.visible_message("[bicon(src)] beeps, \"Activation message is '[recorded]'.\"")
+ T.visible_message("\icon[src][bicon(src)] beeps, \"Activation message is '[recorded]'.\"")
else
if(findtext(msg, recorded))
pulse(0)
@@ -23,7 +23,7 @@
if(!holder)
listening = !listening
var/turf/T = get_turf(src)
- T.visible_message("[bicon(src)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"")
+ T.visible_message("\icon[src][bicon(src)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"")
/obj/item/device/assembly/voice/attack_self(mob/user)
diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm
index ffd7033c4d2..0d3837b2094 100644
--- a/code/modules/asset_cache/asset_list_items.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -1,9 +1,4 @@
//DEFINITIONS FOR ASSET DATUMS START HERE.
-/datum/asset/simple/tgui_common
- // keep_local_name = TRUE
- assets = list(
- "tgui-common.bundle.js" = file("tgui/public/tgui-common.bundle.js"),
- )
/datum/asset/simple/tgui
// keep_local_name = TRUE
@@ -535,6 +530,15 @@
"stellardelight_nanomap_z1.png" = 'icons/_nanomaps/sd_deck1.png',
"stellardelight_nanomap_z2.png" = 'icons/_nanomaps/sd_deck2.png',
"stellardelight_nanomap_z3.png" = 'icons/_nanomaps/sd_deck3.png',
+ "groundbase_nanomap_z1.png" = 'icons/_nanomaps/gb1.png',
+ "groundbase_nanomap_z2.png" = 'icons/_nanomaps/gb2.png',
+ "groundbase_nanomap_z3.png" = 'icons/_nanomaps/gb3.png',
+ "groundbase_nanomap_z4.png" = 'icons/_nanomaps/gbnorth.png',
+ "groundbase_nanomap_z5.png" = 'icons/_nanomaps/gbsouth.png',
+ "groundbase_nanomap_z6.png" = 'icons/_nanomaps/gbeast.png',
+ "groundbase_nanomap_z7.png" = 'icons/_nanomaps/gbwest.png',
+ "groundbase_nanomap_z10.png" = 'icons/_nanomaps/gbmining.png',
+
// VOREStation Edit End
)
\ No newline at end of file
diff --git a/code/modules/blob2/overmind/overmind.dm b/code/modules/blob2/overmind/overmind.dm
index cdfe6d766aa..625dca158f4 100644
--- a/code/modules/blob2/overmind/overmind.dm
+++ b/code/modules/blob2/overmind/overmind.dm
@@ -25,7 +25,7 @@ var/list/overminds = list()
universal_understand = TRUE
- var/list/has_langs = list(LANGUAGE_BLOB)
+ var/list/has_langs = list(LANGUAGE_ANIMAL)
var/datum/language/default_language = null
/mob/observer/blob/get_default_language()
diff --git a/code/modules/casino/boxes_casino.dm b/code/modules/casino/boxes_casino.dm
new file mode 100644
index 00000000000..3b4c5480560
--- /dev/null
+++ b/code/modules/casino/boxes_casino.dm
@@ -0,0 +1,94 @@
+/obj/item/weapon/storage/box/casino
+ name = "prize box"
+ desc = "It's a lovely golden tinted cardboard box, maybe theres something valuable inside?"
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "casino_box"
+
+/obj/item/weapon/storage/box/casino/costume_marine
+ name = "ruin marine costume"
+ starts_with = list(
+ /obj/item/clothing/head/marine,
+ /obj/item/clothing/suit/marine
+ )
+
+/obj/item/weapon/storage/box/casino/costume_pirate
+ name = "pirate costume"
+ starts_with = list(
+ /obj/item/clothing/under/pirate,
+ /obj/item/clothing/suit/pirate,
+ /obj/item/clothing/head/pirate,
+ /obj/item/clothing/glasses/eyepatch
+ )
+
+/obj/item/weapon/storage/box/casino/costume_commie
+ name = "communist costume"
+ starts_with = list(
+ /obj/item/clothing/under/soviet,
+ /obj/item/clothing/head/ushanka
+ )
+
+/obj/item/weapon/storage/box/casino/costume_wizard
+ name = "wizard costume"
+ starts_with = list(
+ /obj/item/clothing/suit/wizrobe/fake,
+ /obj/item/clothing/head/wizard/fake,
+ /obj/item/weapon/staff
+ )
+
+/obj/item/weapon/storage/box/casino/costume_plaguedoctor
+ name = "plague doctor costume"
+ starts_with = list(
+ /obj/item/clothing/suit/bio_suit/plaguedoctorsuit,
+ /obj/item/clothing/head/plaguedoctorhat
+ )
+
+/obj/item/weapon/storage/box/casino/costume_cowboy
+ name = "cowboy costume"
+ starts_with = list(
+ /obj/item/clothing/under/cowboy,
+ /obj/item/clothing/accessory/holster/hip,
+ /obj/item/clothing/head/cowboy/ranger,
+ /obj/item/clothing/shoes/boots/cowboy/brown
+ )
+
+/obj/item/weapon/storage/box/roulette_balls_normal
+ name = "roulette ball box"
+ desc = "A box of spare roulette balls."
+ icon_state = "balls"
+ can_hold = list(/obj/item/roulette_ball)
+ starts_with = list(
+ /obj/item/roulette_ball = 7,
+ /obj/item/roulette_ball/hollow = 2)
+
+/obj/item/weapon/storage/box/roulette_balls_fancy
+ name = "fancy roulette ball box"
+ desc = "A box of extra-pretty roulette balls."
+ icon_state = "balls"
+ can_hold = list(/obj/item/roulette_ball)
+ starts_with = list(
+ /obj/item/roulette_ball,
+ /obj/item/roulette_ball/hollow,
+ /obj/item/roulette_ball/red,
+ /obj/item/roulette_ball/orange,
+ /obj/item/roulette_ball/yellow,
+ /obj/item/roulette_ball/green,
+ /obj/item/roulette_ball/blue,
+ /obj/item/roulette_ball/purple,
+ /obj/item/roulette_ball/moon,
+ /obj/item/roulette_ball/planet,
+ /obj/item/roulette_ball/gold)
+
+/obj/item/weapon/storage/box/roulette_balls_cheat
+ name = "special roulette ball box"
+ desc = "A box of 'special' roulette balls."
+ icon_state = "balls"
+ can_hold = list(/obj/item/roulette_ball)
+ starts_with = list(
+ /obj/item/roulette_ball/cheat/first_twelve,
+ /obj/item/roulette_ball/cheat/second_twelve,
+ /obj/item/roulette_ball/cheat/third_twelve,
+ /obj/item/roulette_ball/cheat/red,
+ /obj/item/roulette_ball/cheat/black,
+ /obj/item/roulette_ball/cheat/zeros,
+ /obj/item/roulette_ball/cheat/odd,
+ /obj/item/roulette_ball/cheat/even)
\ No newline at end of file
diff --git a/code/modules/casino/casino.dm b/code/modules/casino/casino.dm
index eeb850f6880..d866a4d1199 100644
--- a/code/modules/casino/casino.dm
+++ b/code/modules/casino/casino.dm
@@ -5,10 +5,9 @@
//
//Roulette Table
//
-
/obj/structure/casino_table
name = "casino table"
- desc = "this is an unremarkable table for a casino."
+ desc = "This is an unremarkable table for a casino."
icon = 'icons/obj/casino.dmi'
icon_state = "roulette_table"
density = 1
@@ -27,63 +26,331 @@
/obj/structure/casino_table/roulette_table
name = "roulette"
- desc = "Spin the roulette to try your luck."
+ desc = "The roulette. Spin to try your luck."
icon_state = "roulette_wheel"
+ var/spin_state = "roulette_wheel_spinning"
+
+ var/obj/item/roulette_ball/ball
+
+/obj/structure/casino_table/roulette_table/Initialize()
+ .=..()
+ ball = new(src)
+ return
+
+/obj/structure/casino_table/roulette_table/examine(mob/user)
+ .=..()
+ if(ball)
+ . += "It's currently using [ball.get_ball_desc()]."
+ else
+ . += "It doesn't have a ball."
/obj/structure/casino_table/roulette_table/attack_hand(mob/user as mob)
- if (busy)
+ if(busy)
to_chat(user,"You cannot spin now! The roulette is already spinning. ")
return
- visible_message("\ [user] spins the roulette and throws inside little ball.")
+ if(!ball)
+ to_chat(user,"This roulette wheel has no ball! ")
+ return
+ visible_message("\The [user] spins the roulette and throws [ball.get_ball_desc()] into it.")
playsound(src.loc, 'sound/machines/roulette.ogg', 40, 1)
busy = 1
- icon_state = "roulette_wheel_spinning"
- var/result = rand(0,36)
+ ball.on_spin()
+ icon_state = spin_state
+ var/result = rand(0,37)
+ if(ball.cheatball)
+ result = ball.get_cheated_result()
var/color = "green"
add_fingerprint(user)
- if ((result>0 && result<11) || (result>18 && result<29))
- if (result%2)
+ if((result > 0 && result < 11) || (result > 18 && result < 29))
+ if(result % 2)
color="red"
- else
- color="black"
- if ( (result>10 && result<19) || (result>28) )
- if (result%2)
+ else
color="black"
- else
- color="red"
+ if((result > 10 && result < 19) || (result > 28 && result < 37))
+ if(result % 2)
+ color="black"
+ else
+ color="red"
+ if(result == 37)
+ result = "00"
spawn(5 SECONDS)
visible_message("The roulette stops spinning, the ball landing on [result], [color].")
- busy=0
- icon_state = "roulette_wheel"
+ busy = 0
+ icon_state = initial(icon_state)
+
+/obj/structure/casino_table/roulette_table/attackby(obj/item/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/roulette_ball))
+ if(!ball)
+ user.drop_from_inventory(W)
+ W.forceMove(src)
+ ball = W
+ to_chat(user, "You insert [W] into [src].")
+ return
+ ..()
+
+/obj/structure/casino_table/roulette_table/verb/remove_ball()
+ set name = "Remove Roulette Ball"
+ set category = "Object"
+ set src in oview(1)
+
+ if(!usr || !isturf(usr.loc))
+ return
+ if(usr.stat || usr.restrained())
+ return
+ if(ismouse(usr) || (isobserver(usr)))
+ return
+
+ if(busy)
+ to_chat(usr, "You cannot remove \the [ball] while [src] is spinning!")
+ return
+
+ if(ball)
+ usr.put_in_hands(ball)
+ to_chat(usr, "You remove \the [ball] from [src].")
+ ball = null
+ return
+ else
+ to_chat(usr, "There is no ball in [src]!")
+ return
+
+/obj/structure/casino_table/roulette_table/long
+ icon_state = "roulette_wheel_long"
+ spin_state = "roulette_wheel_long_spinning"
+
+/obj/structure/casino_table/roulette_long
+ name = "roulette table"
+ desc = "Roulette table."
+ icon_state = "roulette_long"
/obj/structure/casino_table/roulette_chart
name = "roulette chart"
desc = "Roulette chart. Place your bets!"
icon_state = "roulette_table"
-//
-//Blackjack table - no sprite
-//
+/obj/item/roulette_ball
+ name = "roulette ball"
+ desc = "A small ball used for roulette wheel. This one is made of regular metal."
+ var/ball_desc = "a small metal ball"
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "roulette_ball"
+ var/cheatball = FALSE
+
+/obj/item/roulette_ball/proc/get_cheated_result()
+ return rand(0,37) // No cheating by default
+
+/obj/item/roulette_ball/proc/get_ball_desc()
+ return ball_desc
+
+/obj/item/roulette_ball/proc/on_spin()
+ return
+
+/obj/item/roulette_ball/gold
+ name = "golden roulette ball"
+ desc = "A small ball used for roulette wheel. This one is particularly gaudy."
+ ball_desc = "a shiny golden ball"
+ icon_state = "roulette_ball_gold"
+
+/obj/item/roulette_ball/red
+ name = "red roulette ball"
+ desc = "A small ball used for roulette wheel. This one is ornate red."
+ ball_desc = "a striped red ball"
+ icon_state = "roulette_ball_red"
+
+/obj/item/roulette_ball/orange
+ name = "orange roulette ball"
+ desc = "A small ball used for roulette wheel. This one is ornate orange."
+ ball_desc = "a striped orange ball"
+ icon_state = "roulette_ball_orange"
+
+/obj/item/roulette_ball/green
+ name = "green roulette ball"
+ desc = "A small ball used for roulette wheel. This one is ornate green."
+ ball_desc = "a smooth green ball"
+ icon_state = "roulette_ball_green"
+
+/obj/item/roulette_ball/blue
+ name = "blue roulette ball"
+ desc = "A small ball used for roulette wheel. This one is ornate blue."
+ ball_desc = "a striped blue ball"
+ icon_state = "roulette_ball_blue"
+
+/obj/item/roulette_ball/yellow
+ name = "yellow roulette ball"
+ desc = "A small ball used for roulette wheel. This one is ornate yellow."
+ ball_desc = "a smooth yellow ball"
+ icon_state = "roulette_ball_yellow"
+
+/obj/item/roulette_ball/purple
+ name = "purple roulette ball"
+ desc = "A small ball used for roulette wheel. This one is ornate purple."
+ ball_desc = "a dotted purple ball"
+ icon_state = "roulette_ball_purple"
+
+/obj/item/roulette_ball/planet
+ name = "planet roulette ball"
+ desc = "A small ball used for roulette wheel. This one looks like a small earth-like planet."
+ ball_desc = "a planet-like ball"
+ icon_state = "roulette_ball_earth"
+
+/obj/item/roulette_ball/moon
+ name = "moon roulette ball"
+ desc = "A small ball used for roulette wheel. This one looks like a small moon."
+ ball_desc = "a moon-like ball"
+ icon_state = "roulette_ball_moon"
+
+/obj/item/roulette_ball/hollow
+ name = "glass roulette ball"
+ desc = "A small ball used for roulette wheel. This one is made of glass and seems to be openable."
+ ball_desc = "a small glass ball"
+ icon_state = "roulette_ball_glass"
+
+ var/obj/item/weapon/holder/trapped
+
+/obj/item/roulette_ball/hollow/examine(mob/user)
+ .=..()
+ if(trapped)
+ . += "You can see [trapped] trapped inside!"
+ else
+ . += "It appears to be empty."
+
+/obj/item/roulette_ball/hollow/get_ball_desc()
+ .=..()
+ if(trapped && trapped.held_mob)
+ . += " with [trapped.name] trapped within"
+ return
+
+/obj/item/roulette_ball/hollow/attackby(var/obj/item/W, var/mob/user)
+ if(trapped)
+ to_chat(user, "This ball already has something trapped in it!")
+ return
+ if(istype(W, /obj/item/weapon/holder))
+ var/obj/item/weapon/holder/H = W
+ if(!H.held_mob)
+ to_chat(user, "This holder has nobody in it? Yell at a developer!")
+ return
+ if(H.held_mob.get_effective_size(TRUE) > 50)
+ to_chat(user, "\The [H] is too big to fit inside!")
+ return
+ user.drop_from_inventory(H)
+ H.forceMove(src)
+ trapped = H
+ to_chat(user, "You trap \the [H] inside the glass roulette ball.")
+ to_chat(H.held_mob, "\The [user] traps you inside a glass roulette ball!")
+ update_icon()
+
+/obj/item/roulette_ball/hollow/update_icon()
+ if(trapped && trapped.held_mob)
+ icon_state = "roulette_ball_glass_full"
+ else
+ icon_state = "roulette_ball_glass"
+
+/obj/item/roulette_ball/hollow/attack_self(mob/user as mob)
+ if(!trapped)
+ to_chat(user, "\The [src] is empty!")
+ return
+ else
+ user.put_in_hands(trapped)
+ if(trapped.held_mob)
+ to_chat(user, "You take \the [trapped] out of the glass roulette ball.")
+ to_chat(trapped.held_mob, "\The [user] takes you out of a glass roulette ball.")
+ trapped = null
+ update_icon()
+
+/obj/item/roulette_ball/hollow/on_holder_escape()
+ trapped = null
+ update_icon()
+
+/obj/item/roulette_ball/hollow/on_spin()
+ if(trapped && trapped.held_mob)
+ to_chat(trapped.held_mob, "THE WHOLE WORLD IS SENT WHIRLING AS THE ROULETTE SPINS!!!")
+
+/obj/item/roulette_ball/hollow/Destroy()
+ if(trapped)
+ trapped.forceMove(src.loc)
+ trapped = null
+ return ..()
+
+/obj/item/roulette_ball/cheat
+ cheatball = TRUE
+
+/obj/item/roulette_ball/cheat/first_twelve
+ desc = "A small ball used for roulette wheel. This one is made of regular metal. Its weighted to only land on first 12."
+
+/obj/item/roulette_ball/cheat/first_twelve/get_cheated_result()
+ return pick(list(1,2,3,4,5,6,7,8,9,10,11,12))
+
+/obj/item/roulette_ball/cheat/second_twelve
+ desc = "A small ball used for roulette wheel. This one is made of regular metal. Its weighted to only land on second 12."
+
+/obj/item/roulette_ball/cheat/second_twelve/get_cheated_result()
+ return pick(list(13,14,15,16,17,18,19,20,21,22,23,24))
+
+/obj/item/roulette_ball/cheat/third_twelve
+ desc = "A small ball used for roulette wheel. This one is made of regular metal. Its weighted to only land on third 12."
+
+/obj/item/roulette_ball/cheat/third_twelve/get_cheated_result()
+ return pick(list(25,26,27,28,29,30,31,32,33,34,35,36))
+
+/obj/item/roulette_ball/cheat/zeros
+ desc = "A small ball used for roulette wheel. This one is made of regular metal. Its weighted to only land on 0 or 00."
+
+/obj/item/roulette_ball/cheat/zeros/get_cheated_result()
+ return pick(list(0, 37))
+
+/obj/item/roulette_ball/cheat/red
+ desc = "A small ball used for roulette wheel. This one is made of regular metal. Its weighted to only land on red."
+
+/obj/item/roulette_ball/cheat/red/get_cheated_result()
+ return pick(list(1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36))
+
+/obj/item/roulette_ball/cheat/black
+ desc = "A small ball used for roulette wheel. This one is made of regular metal. Its weighted to only land on black."
+
+/obj/item/roulette_ball/cheat/black/get_cheated_result()
+ return pick(list(2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35))
+
+/obj/item/roulette_ball/cheat/even
+ desc = "A small ball used for roulette wheel. This one is made of regular metal. Its weighted to only land on even."
+
+/obj/item/roulette_ball/cheat/even/get_cheated_result()
+ return pick(list(2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36))
+
+/obj/item/roulette_ball/cheat/odd
+ desc = "A small ball used for roulette wheel. This one is made of regular metal. Its weighted to only land on odd."
+
+/obj/item/roulette_ball/cheat/odd/get_cheated_result()
+ return pick(list(1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35))
+
+//
+//Blackjack table
+//
/obj/structure/casino_table/blackjack_l
name = "gambling table"
- desc = "Gambling table, try your luck and skills! "
+ desc = "Gambling table, try your luck and skills!"
icon_state = "blackjack_l"
-/obj/structure/casino_table/blackjack_r
- name = "gambling table"
- desc = "Gambling table, try your luck and skills! "
- icon_state = "blackjack_r"
-
/obj/structure/casino_table/blackjack_m
name = "gambling table"
- desc = "Gambling table, try your luck and skills! "
+ desc = "Gambling table, try your luck and skills!"
icon_state = "blackjack_m"
+/obj/structure/casino_table/blackjack_r
+ name = "gambling table"
+ desc = "Gambling table, try your luck and skills!"
+ icon_state = "blackjack_r"
+
+//
+//Craps table
+//
+/obj/structure/casino_table/craps
+ name = "craps table"
+ desc = "A padded table designed for dice games!"
+ icon_state = "craps_table"
+
//
//Wheel. Of. FORTUNE!
//
-
/obj/machinery/wheel_of_fortune
name = "wheel of fortune"
desc = "The Wheel of Fortune! Insert chips and may fortune favour the lucky one at the next lottery!"
@@ -259,7 +526,7 @@
if(usr.incapacitated())
return
if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
- interval = input("Put the desired interval (1-1000)", "Set Interval") as num
+ interval = tgui_input_number(usr, "Put the desired interval (1-1000)", "Set Interval", null, 1000, 1)
if(interval>1000 || interval<1)
usr << "Invalid interval."
return
@@ -267,28 +534,27 @@
return
//
-//Slave Terminal
+//Sentient Prize Terminal
//
-
-/obj/machinery/casinoslave_handler
+/obj/machinery/casinosentientprize_handler
name = "Sentient Prize Automated Sales Machinery"
desc = "The Sentient Prize Automated Sales Machinery, also known as SPASM! Here one can see who is on sale as sentinet prizes, as well as selling self and also buying prizes."
icon = 'icons/obj/casino.dmi'
icon_state = "casinoslave_hub_off"
- density = 1
+ density = 0
anchored = 1
- req_access = list(300)
+ req_access = list(101)
- var/casinoslave_sale = "disabled"
- var/casinoslave_price = 100
+ var/casinosentientprize_sale = "disabled"
+ var/casinosentientprize_price = 500
var/collar_list = list()
- var/slaves_ckeys_list = list() //Same trick as lottery, to keep life simple
- var/obj/item/clothing/accessory/collar/casinoslave/selected_collar = null
+ var/sentientprizes_ckeys_list = list() //Same trick as lottery, to keep life simple
+ var/obj/item/clothing/accessory/collar/casinosentientprize/selected_collar = null
-/obj/machinery/casinoslave_handler/attack_hand(mob/living/user as mob)
+/obj/machinery/casinosentientprize_handler/attack_hand(mob/living/user as mob)
if(usr.incapacitated())
return
- if(casinoslave_sale == "disabled")
+ if(casinosentientprize_sale == "disabled")
to_chat(user,"The SPASM is disabled. ")
return
@@ -299,14 +565,14 @@
if("Show selected Prize")
if(QDELETED(selected_collar))
collar_list -= selected_collar
- slaves_ckeys_list -= selected_collar.slaveckey
+ sentientprizes_ckeys_list -= selected_collar.sentientprizeckey
to_chat(user, "No collar is currently selected or the currently selected one has been destroyed or disabled.")
selected_collar = null
return
to_chat(user, "Sentient Prize information")
- to_chat(user, "Name: [selected_collar.slavename]")
- to_chat(user, "Description: [selected_collar.slaveflavor]")
- to_chat(user, "OOC: [selected_collar.slaveooc]")
+ to_chat(user, "Name: [selected_collar.sentientprizename]")
+ to_chat(user, "Description: [selected_collar.sentientprizeflavor]")
+ to_chat(user, "OOC: [selected_collar.sentientprizeooc]")
if(selected_collar.ownername != null)
to_chat(user, "This prize is already owned by [selected_collar.ownername]")
@@ -314,47 +580,50 @@
selected_collar = tgui_input_list(user, "Select a prize", "Chose a collar", collar_list)
if(QDELETED(selected_collar))
collar_list -= selected_collar
- slaves_ckeys_list -= selected_collar.slaveckey
+ sentientprizes_ckeys_list -= selected_collar.sentientprizeckey
to_chat(user, "No collars to chose, or selected collar has been destroyed or deactived, selection has been removed from list.")
selected_collar = null
return
if("Become Prize (Please examine yourself first)") //Its awkward, but no easy way to obtain flavor_text due to server not loading text of mob until its been examined at least once.
var/safety_ckey = user.client.ckey
- if(safety_ckey in slaves_ckeys_list)
+ if(safety_ckey in sentientprizes_ckeys_list)
to_chat(user, "The SPASM beeps in an upset manner, you already have a collar!")
return
var/confirm = tgui_alert(usr, "Are you sure you want to become a sentient prize?", "Confirm Sentient Prize", list("Yes", "No"))
if(confirm == "Yes")
to_chat(user, "You are now a prize!")
- if(safety_ckey in slaves_ckeys_list)
+ if(safety_ckey in sentientprizes_ckeys_list)
to_chat(user, "The SPASM beeps in an upset manner, you already have a collar!")
return
- slaves_ckeys_list += user.ckey
- var/obj/item/clothing/accessory/collar/casinoslave/C = new(src.loc)
- C.slavename = "[user.name]"
- C.slaveckey = "[user.ckey]"
- C.slaveflavor = user.flavor_text
- C.slaveooc = user.ooc_notes
+ sentientprizes_ckeys_list += user.ckey
+ var/obj/item/clothing/accessory/collar/casinosentientprize/C = new(src.loc)
+ C.sentientprizename = "[user.name]"
+ C.sentientprizeckey = "[user.ckey]"
+ C.sentientprizeflavor = user.flavor_text
+ C.sentientprizeooc = user.ooc_notes
C.name = "Sentient Prize Collar: Available! [user.name] purchaseable at the SPASM!"
C.desc = "SPASM collar. The tags shows in flashy colorful text the wearer is [user.name] and is currently available to buy at the Sentient Prize Automated Sales Machinery!"
C.icon_state = "casinoslave_available"
C.update_icon()
collar_list += C
- spawn_casinochips(casinoslave_price, src.loc)
+ spawn_casinochips(casinosentientprize_price, src.loc)
-/obj/machinery/casinoslave_handler/attackby(obj/item/weapon/W as obj, mob/user as mob)
+/obj/machinery/casinosentientprize_handler/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(usr.incapacitated())
return
if(istype(W, /obj/item/weapon/spacecasinocash))
- if(casinoslave_sale == "disabled")
+ if(casinosentientprize_sale == "disabled")
to_chat(user, "Sentient Prize sales are currently disabled.")
return
+ if(!selected_collar)
+ to_chat(user, "Select a prize first.")
+ return
if(!selected_collar.ownername)
var/obj/item/weapon/spacecasinocash/C = W
- if(user.client.ckey == selected_collar.slaveckey)
+ if(user.client.ckey == selected_collar.sentientprizeckey)
insert_chip(C, user, "selfbuy")
return
else
@@ -364,12 +633,12 @@
to_chat(user, "This Sentient Prize is already owned! If you are the owner you can release the prize by swiping the collar on the SPASM!")
return
- if(istype(W, /obj/item/clothing/accessory/collar/casinoslave))
- var/obj/item/clothing/accessory/collar/casinoslave/C = W
- if(user.name != C.slavename && user.name != C.ownername)
+ if(istype(W, /obj/item/clothing/accessory/collar/casinosentientprize))
+ var/obj/item/clothing/accessory/collar/casinosentientprize/C = W
+ if(user.name != C.sentientprizename && user.name != C.ownername)
to_chat(user, "This Sentient Prize collar isn't yours, please give it to the one it tagged for, belongs to, or a casino staff member!")
return
- if(user.name == C.slavename)
+ if(user.name == C.sentientprizename)
if(!C.ownername)
to_chat(user,"If collar isn't disabled and entry removed, please select your entry and insert chips. Or contact staff if you need assistance. ")
return
@@ -377,15 +646,15 @@
to_chat(user,"If collar isn't disabled and entry removed, please ask your owner to free you with collar swipe on the SPASM, or contact staff if you need assistance. ")
return
if(user.name == C.ownername)
- var/confirm = tgui_alert(usr, "Are you sure you want to wipe [C.slavename] entry?", "Confirm Sentient Prize Release", list("Yes", "No"))
+ var/confirm = tgui_alert(usr, "Are you sure you want to wipe [C.sentientprizename] entry?", "Confirm Sentient Prize Release", list("Yes", "No"))
if(confirm == "Yes")
- to_chat(user, "[C.slavename] collar has been deleted from registry!")
+ to_chat(user, "[C.sentientprizename] collar has been deleted from registry!")
C.icon_state = "casinoslave"
C.update_icon()
- C.name = "a disabled Sentient Prize Collar: [C.slavename]"
- C.desc = "A collar worn by sentient prizes registered to a SPASM. The tag says its registered to [C.slavename], but harsh red text informs you its been disabled."
- slaves_ckeys_list -= C.slaveckey
- C.slaveckey = null
+ C.name = "disabled Sentient Prize Collar: [C.sentientprizename]"
+ C.desc = "A collar worn by sentient prizes registered to a SPASM. The tag says its registered to [C.sentientprizename], but harsh red text informs you its been disabled."
+ sentientprizes_ckeys_list -= C.sentientprizeckey
+ C.sentientprizeckey = null
collar_list -= C
if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
@@ -400,13 +669,13 @@
return
if("Toggle Sentient Prize Sales")
- if(casinoslave_sale == "disabled")
- casinoslave_sale = "enabled"
+ if(casinosentientprize_sale == "disabled")
+ casinosentientprize_sale = "enabled"
icon_state = "casinoslave_hub_on"
update_icon()
to_chat(user,"Prize sale has been enabled. ")
else
- casinoslave_sale = "disabled"
+ casinosentientprize_sale = "disabled"
icon_state = "casinoslave_hub_off"
update_icon()
to_chat(user,"Prize sale has been disabled. ")
@@ -417,21 +686,21 @@
return
if(QDELETED(selected_collar))
collar_list -= selected_collar
- slaves_ckeys_list -= selected_collar.slaveckey
+ sentientprizes_ckeys_list -= selected_collar.sentientprizeckey
to_chat(user, "Collar has been destroyed!")
selected_collar = null
return
- var/safety_ckey = selected_collar.slaveckey
- var/confirm = tgui_alert(usr, "Are you sure you want to wipe [selected_collar.slavename] entry?", "Confirm Sentient Prize", list("Yes", "No"))
+ var/safety_ckey = selected_collar.sentientprizeckey
+ var/confirm = tgui_alert(usr, "Are you sure you want to wipe [selected_collar.sentientprizename] entry?", "Confirm Sentient Prize", list("Yes", "No"))
if(confirm == "Yes")
- if(safety_ckey == selected_collar.slaveckey)
- to_chat(user, "[selected_collar.slavename] collar has been deleted from registry!")
+ if(safety_ckey == selected_collar.sentientprizeckey)
+ to_chat(user, "[selected_collar.sentientprizename] collar has been deleted from registry!")
selected_collar.icon_state = "casinoslave"
selected_collar.update_icon()
- selected_collar.name = "a disabled Sentient Prize Collar: [selected_collar.slavename]"
- selected_collar.desc = "A collar worn by sentient prizes registered to a SPASM. The tag says its registered to [selected_collar.slavename], but harsh red text informs you its been disabled."
- slaves_ckeys_list -= selected_collar.slaveckey
- selected_collar.slaveckey = null
+ selected_collar.name = "disabled Sentient Prize Collar: [selected_collar.sentientprizename]"
+ selected_collar.desc = "A collar worn by sentient prizes registered to a SPASM. The tag says its registered to [selected_collar.sentientprizename], but harsh red text informs you its been disabled."
+ sentientprizes_ckeys_list -= selected_collar.sentientprizeckey
+ selected_collar.sentientprizeckey = null
collar_list -= selected_collar
selected_collar = null
else
@@ -441,12 +710,12 @@
if("Change Prize Value")
setprice(user)
-/obj/machinery/casinoslave_handler/proc/insert_chip(var/obj/item/weapon/spacecasinocash/cashmoney, mob/user, var/buystate)
- if(cashmoney.worth < casinoslave_price)
+/obj/machinery/casinosentientprize_handler/proc/insert_chip(var/obj/item/weapon/spacecasinocash/cashmoney, mob/user, var/buystate)
+ if(cashmoney.worth < casinosentientprize_price)
to_chat(user,"You dont have enough chips to pay for the sentient prize! ")
return
- cashmoney.worth -= casinoslave_price
+ cashmoney.worth -= casinosentientprize_price
cashmoney.update_icon()
if(cashmoney.worth <= 0)
@@ -455,31 +724,31 @@
cashmoney.update_icon()
if(buystate == "selfbuy")
- to_chat(user,"You put [casinoslave_price] credits worth of chips into the SPASM and nullify your collar! ")
+ to_chat(user,"You put [casinosentientprize_price] credits worth of chips into the SPASM and nullify your collar! ")
selected_collar.icon_state = "casinoslave"
selected_collar.update_icon()
- selected_collar.name = "a disabled Sentient Prize Collar: [selected_collar.slavename]"
- selected_collar.desc = "A collar worn by sentient prizes registered to a SPASM. The tag says its registered to [selected_collar.slavename], but harsh red text informs you its been disabled."
- slaves_ckeys_list -= selected_collar.slaveckey
- selected_collar.slaveckey = null
+ selected_collar.name = "disabled Sentient Prize Collar: [selected_collar.sentientprizename]"
+ selected_collar.desc = "A collar worn by sentient prizes registered to a SPASM. The tag says its registered to [selected_collar.sentientprizename], but harsh red text informs you its been disabled."
+ sentientprizes_ckeys_list -= selected_collar.sentientprizeckey
+ selected_collar.sentientprizeckey = null
collar_list -= selected_collar
selected_collar = null
if(buystate == "buy")
- to_chat(user,"You put [casinoslave_price] credits worth of chips into the SPASM and it pings to inform you bought [selected_collar.slavename]! ")
+ to_chat(user,"You put [casinosentientprize_price] credits worth of chips into the SPASM and it pings to inform you bought [selected_collar.sentientprizename]! ")
selected_collar.icon_state = "casinoslave_owned"
selected_collar.update_icon()
selected_collar.ownername = user.name
- selected_collar.name = "Sentient Prize Collar: [selected_collar.slavename] owned by [selected_collar.ownername]!"
- selected_collar.desc = "A collar worn by sentient prizes registered to a SPASM. The tag says its registered to [selected_collar.slavename] and they are owned by [selected_collar.ownername]."
+ selected_collar.name = "Sentient Prize Collar: [selected_collar.sentientprizename] owned by [selected_collar.ownername]!"
+ selected_collar.desc = "A collar worn by sentient prizes registered to a SPASM. The tag says its registered to [selected_collar.sentientprizename] and they are owned by [selected_collar.ownername]."
selected_collar = null
-/obj/machinery/casinoslave_handler/proc/setprice(mob/living/user as mob)
+/obj/machinery/casinosentientprize_handler/proc/setprice(mob/living/user as mob)
if(usr.incapacitated())
return
if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
- casinoslave_price = input("Select the desired price (1-1000)", "Set Price") as num
- if(casinoslave_price>1000 || casinoslave_price<1)
+ casinosentientprize_price = tgui_input_number(usr, "Select the desired price (1-1000)", "Set Price", null, null, 1000, 1)
+ if(casinosentientprize_price>1000 || casinosentientprize_price<1)
to_chat(user,"Invalid price. ")
return
- to_chat(user,"You set the price to [casinoslave_price] ")
+ to_chat(user,"You set the price to [casinosentientprize_price] ")
diff --git a/code/modules/casino/casino_book.dm b/code/modules/casino/casino_book.dm
index 1f80817112b..f02a53abd05 100644
--- a/code/modules/casino/casino_book.dm
+++ b/code/modules/casino/casino_book.dm
@@ -5,7 +5,6 @@
//
//Casino Manual - NEEDS EDITING
//
-
/obj/item/weapon/book/manual/casino
name = "A dummy guide to losing your thalers"
icon = 'icons/obj/casino.dmi'
@@ -121,141 +120,12 @@
EXCHANGE RATE
FROM = TO
- 5 Thalers = 1 casino chip
- 1 casino chip = 5 Thalers
+ 1 Thaler = 1 casino chip
+ 1 casino chip = 1 Thaler
- The special sentient prize is 100 chips! More about it in section below!
+ The special sentient prize is 200 chips! More about it in section below!
- Melee weapons
-
- - scepter 500
- - chain of command 250
-
- Guns and 'guns' ((disclaimer, giving out guns will mean you get a weapons license as well with the shifts you have it, abusing these weapons will quickly get them removed!))
-
- - sizegun 100
- - advanced anti particle rifle 500
- - temperature gun 250
- - alien pistol 1000
- - floral somatoray 250
- - net gun 500
-
- Gear
-
- - experimental welder 500
- - alien belt 750
- - alien enhancement vest 750
- - The monocoole 1000
- - chameleon black tie 250
- - cryostasis beaker 200
- - bluespace beaker 200
- - chem sprayer 250
-
- Masks and hats - EVERYTHING IS 50 except chameleon!
-
- - assistant hat
- - Shark mask
- - Pig mask
- - Luchador mask
- - Horse mask
- - Goblin mask
- - Fake moustache
- - Dolphin mask
- - Demon mask
- - Chameleon gas mask 250
-
- Costumes - All costumes are 100 except the hoodies which are 50!
-
- - Black bunny girl outfit (black suit and rabbit ears)
- - White bunny girl outfit (white suit and rabbit ears)
- - Corgi hoodie
- - Sexy clown
- - nyan girl
- - Wizard
- - Chicken
- - Carp hoodie
- - Sexy mime
- - Pirate
- - Commie
- - Plague doctor
- - Imperium monk
- - Cute witch
- - Gladiator
-
- Toys and misc - ALL THESE ARE 50
-
- - Toy sword
- - Water flower
- - Stick horse
- - Replica katana
- - Magic conch
- - Magic 8-ball
- - Foam sword
- - Foam crossbow (with 5 bolts)
- - Bosun's whistle
- - Golden cup
- - Havana cigar case
- - Casino wallet (to keep after shift)
- - Casino card deck (to keep after shift)
-
- Booze - ALL BOOZE IS 50
-
- - Redeemer brew
- - Warlock velvet
- - Wrapp artiste patron
- - Flask of holy water
- - College girl goldschlager
- - Gilthari luxury champagne
- - Bottle of nothing
- - Special blend whiskey
- - Akvavit
-
- Pets
-
- - Armadillo 150
- - Cat 150
- - Goat 150
- - Fox 150
- - Lizard 150
- - Penguin 150
- - Goose 200
- - Chicken 200
- - Cow 200
- - Corgi 200
- - Snake 200
- - Yithian 200
- - Tindalos 200
- - Fennec 300
- - Red Panda 300
- - Horse 300
- - Otie 500
- - Chonker Otie 500
- - Zorgoia 500
-
- Mechs
-
- - Mining Ripley 1000
- - Firefighter Ripley 750
- - Serenity 1500
- - Odysseus 1250
- - Phazon Scuttlebug 2000
- - Phazon Janus 3500
- - Scarab 500
- - Shuttlepod 250
- - ´Shuttlecraft 500
-
- Implants
-
- - Implanter 100 (A basic empty implanter, you are going to need this to implant yourself with cyberntic augments)
- - Implant: Tazer 1000 (A cybernetic implant that allows one to spawn a personal defense taser)
- - Implant: Medkit 500 (A cybernetic implant that allows you to spawn all the tools needed for surgery)
- - Implant: Shades 750 (A cybernetic implant that will spawn protective thermoshades upon your eyes, AR included!)
- - Implant: Sprinter 1500 (A cybernetic implant that will give you that extra kick of energy to run faster!)
- - Implant: Toolkit 500 (A cybernetic implant that allows you to spawn all the tools needed for engineering)
- - Implant: Language 1000 (A cybernetic implant that allows you to understand almost all languages)
- - Implant: Analyzer 500 (A cybernetic implant that allows one to spawn a Portable Resonant Analyzer for any science needs)
- - Implant: Size Control 500 (A cybernetic implant that allows one to change the size of others via specific voice commands)
-
+ This section was outdated, someone better write it.
Thats it for prizes!
diff --git a/code/modules/casino/casino_prize_vendor.dm b/code/modules/casino/casino_prize_vendor.dm
index 0355a73bb4f..8d53b8952f9 100644
--- a/code/modules/casino/casino_prize_vendor.dm
+++ b/code/modules/casino/casino_prize_vendor.dm
@@ -48,11 +48,11 @@
var/datum/data/casino_prize/currently_vending = null // What we're requesting payment for right now
var/list/log = list() //Log only SS13 staff is allowed to look at, CKEYS are listed here for record keeping of prizes and players for events!
- var/category_weapons = 1 //For listing categories, if false then prizes of this categories cant be obtained nor bought for post-shift enjoyment
- var/category_gear = 1 //If 1 prizes will be only logged
- var/category_clothing = 1 //If 2 prizes will both be logged and spawned
- var/category_misc = 1
- var/category_drinks = 1
+ var/category_weapons = 2 //For listing categories, if false then prizes of this categories cant be obtained nor bought for post-shift enjoyment
+ var/category_gear = 2 //If 1 prizes will be only logged
+ var/category_clothing = 2 //If 2 prizes will both be logged and spawned
+ var/category_misc = 2
+ var/category_drinks = 2
var/category_implants = 1
var/category_event = 1 //For special events, holidays, etc
@@ -62,73 +62,120 @@
item_list = list()
item_list["Weapons"] = list(
- CASINO_PRIZE("Scepter", /obj/item/weapon/scepter, 1, 500, "weapons"),
- CASINO_PRIZE("Chain of Command", /obj/item/weapon/melee/chainofcommand, 1, 250, "weapons"),
- CASINO_PRIZE("Size Gun", /obj/item/weapon/gun/energy/sizegun, 1, 100, "weapons"),
- CASINO_PRIZE("Advanced Particle Rifle", /obj/item/weapon/gun/energy/particle/advanced, 1, 500, "weapons"),
- CASINO_PRIZE("Temperature Gun", /obj/item/weapon/gun/energy/temperature, 1, 250, "weapons"),
- CASINO_PRIZE("Alien Pistol", /obj/item/weapon/gun/energy/alien, 1, 1000, "weapons"),
- CASINO_PRIZE("Floral Gun", /obj/item/weapon/gun/energy/floragun, 1, 250, "weapons"),
- CASINO_PRIZE("Net Gun", /obj/item/weapon/gun/energy/netgun, 1, 500, "weapons"),
+ CASINO_PRIZE("Scepter", /obj/item/weapon/scepter, 1, 2500, "weapons"),
+ CASINO_PRIZE("Rapier", /obj/item/weapon/melee/rapier, 1, 3000, "weapons"),
+ CASINO_PRIZE("Chain of Command", /obj/item/weapon/melee/chainofcommand, 1, 1250, "weapons"),
+ CASINO_PRIZE("Golden Bat", /obj/item/weapon/material/twohanded/baseballbat/gold, 1, 1000, "weapons"),
+ CASINO_PRIZE("Size Gun", /obj/item/weapon/gun/energy/sizegun, 1, 1500, "weapons"),
+ CASINO_PRIZE("Gradual Size Gun", /obj/item/device/slow_sizegun, 1, 1500, "weapons"),
+ CASINO_PRIZE("Metamorphosis Ray", /obj/item/weapon/gun/energy/mouseray/metamorphosis, 1, 6000, "weapons"),
+ CASINO_PRIZE("Net Gun", /obj/item/weapon/gun/energy/netgun, 1, 3000, "weapons"),
)
item_list["Gear"] = list(
CASINO_PRIZE("Experimental Welder", /obj/item/weapon/weldingtool/experimental, 1, 500, "gear"),
- CASINO_PRIZE("Chameleon Tie", /obj/item/clothing/accessory/chameleon, 1, 250, "gear"),
- CASINO_PRIZE("Chemsprayer", /obj/item/weapon/reagent_containers/spray/chemsprayer, 1, 250, "gear"),
- CASINO_PRIZE("Bluespace Beaker", /obj/item/weapon/reagent_containers/glass/beaker/bluespace, 1, 200, "gear"),
- CASINO_PRIZE("Cryo Beaker", /obj/item/weapon/reagent_containers/glass/beaker/noreact, 1, 200, "gear"),
+ CASINO_PRIZE("Chemsprayer", /obj/item/weapon/reagent_containers/spray/chemsprayer, 1, 1250, "gear"),
+ CASINO_PRIZE("Bluespace Beaker", /obj/item/weapon/reagent_containers/glass/beaker/bluespace, 1, 1000, "gear"),
+ CASINO_PRIZE("Cryo Beaker", /obj/item/weapon/reagent_containers/glass/beaker/noreact, 1, 1000, "gear"),
+ CASINO_PRIZE("Golden Pickaxe", /obj/item/weapon/pickaxe/gold, 1, 1000, "gear"),
)
item_list["Clothing"] = list(
- CASINO_PRIZE("Shark mask", /obj/item/clothing/mask/shark, 1, 50, "clothing"),
- CASINO_PRIZE("Pig mask", /obj/item/clothing/mask/pig, 1, 50, "clothing"),
- CASINO_PRIZE("Luchador mask", /obj/item/clothing/mask/luchador, 1, 50, "clothing"),
- CASINO_PRIZE("Horse mask", /obj/item/clothing/mask/horsehead, 1, 50, "clothing"),
- CASINO_PRIZE("Goblin mask", /obj/item/clothing/mask/goblin, 1, 50, "clothing"),
- CASINO_PRIZE("Fake moustache", /obj/item/clothing/mask/fakemoustache, 1, 50, "clothing"),
- CASINO_PRIZE("Dolphin mask", /obj/item/clothing/mask/dolphin, 1, 50, "clothing"),
- CASINO_PRIZE("Demon mask", /obj/item/clothing/mask/demon, 1, 50, "clothing"),
- CASINO_PRIZE("Chameleon mask", /obj/item/clothing/under/chameleon, 1, 250, "clothing"),
- CASINO_PRIZE("Ian costume", /obj/item/clothing/suit/storage/hooded/costume/ian, 1, 50, "clothing"),
- CASINO_PRIZE("Carp costume", /obj/item/clothing/suit/storage/hooded/costume/carp, 1, 50, "clothing"),
+ CASINO_PRIZE("Shark mask", /obj/item/clothing/mask/shark, 1, 250, "clothing"),
+ CASINO_PRIZE("Pig mask", /obj/item/clothing/mask/pig, 1, 250, "clothing"),
+ CASINO_PRIZE("Luchador mask", /obj/item/clothing/mask/luchador, 1, 250, "clothing"),
+ CASINO_PRIZE("Horse mask", /obj/item/clothing/mask/horsehead, 1, 250, "clothing"),
+ CASINO_PRIZE("Goblin mask", /obj/item/clothing/mask/goblin, 1, 250, "clothing"),
+ CASINO_PRIZE("Fake moustache", /obj/item/clothing/mask/fakemoustache, 1, 250, "clothing"),
+ CASINO_PRIZE("Dolphin mask", /obj/item/clothing/mask/dolphin, 1, 250, "clothing"),
+ CASINO_PRIZE("Demon mask", /obj/item/clothing/mask/demon, 1, 250, "clothing"),
+ CASINO_PRIZE("Chameleon mask", /obj/item/clothing/under/chameleon, 1, 1000, "clothing"),
+ CASINO_PRIZE("Chameleon tie", /obj/item/clothing/accessory/chameleon, 1, 750, "clothing"),
+ CASINO_PRIZE("Ian costume", /obj/item/clothing/suit/storage/hooded/costume/ian, 1, 250, "clothing"),
+ CASINO_PRIZE("Carp costume", /obj/item/clothing/suit/storage/hooded/costume/carp, 1, 250, "clothing"),
+ CASINO_PRIZE("Plague doctor costume", /obj/item/weapon/storage/box/casino/costume_plaguedoctor, 1, 500, "clothing"),
+ CASINO_PRIZE("Wizard costume", /obj/item/weapon/storage/box/casino/costume_wizard, 1, 500, "clothing"),
+ CASINO_PRIZE("Pirate costume", /obj/item/weapon/storage/box/casino/costume_pirate, 1, 500, "clothing"),
+ CASINO_PRIZE("Commie costume", /obj/item/weapon/storage/box/casino/costume_commie, 1, 500, "clothing"),
+ CASINO_PRIZE("Marine costume", /obj/item/weapon/storage/box/casino/costume_marine, 1, 500, "clothing"),
+ CASINO_PRIZE("Cowboy costume", /obj/item/weapon/storage/box/casino/costume_cowboy, 1, 500, "clothing"),
+ CASINO_PRIZE("Golden Collar", /obj/item/clothing/accessory/collar/gold, 1, 250, "clothing"),
+ CASINO_PRIZE("Decorative Casino Sentient Prize Collar", /obj/item/clothing/accessory/collar/casinosentientprize_fake, 1, 100, "clothing"),
+ )
+ item_list["Donk Soft"] = list(
+ CASINO_PRIZE("Donk-Soft shotgun", /obj/item/weapon/gun/projectile/shotgun/pump/toy, 1, 1000, "misc"),
+ CASINO_PRIZE("Donk-Soft mosin-nagant", /obj/item/weapon/gun/projectile/shotgun/pump/toy/moistnugget, 1, 1000, "misc"),
+ CASINO_PRIZE("Donk-Soft pistol", /obj/item/weapon/gun/projectile/pistol/toy, 1, 800, "misc"),
+ CASINO_PRIZE("Donk-Soft levergun", /obj/item/weapon/gun/projectile/shotgun/pump/toy/levergun, 1, 1000, "misc"),
+ CASINO_PRIZE("Donk-Soft commemorative pistol", /obj/item/weapon/gun/projectile/pistol/toy/n99, 1, 750, "misc"),
+ CASINO_PRIZE("Donk-Soft revolver", /obj/item/weapon/gun/projectile/revolver/toy, 1, 750, "misc"),
+ CASINO_PRIZE("Donk-Soft big-iron", /obj/item/weapon/gun/projectile/revolver/toy/big_iron, 1, 750, "misc"),
+ CASINO_PRIZE("Donk-Soft crossbow", /obj/item/weapon/gun/projectile/revolver/toy/crossbow, 1, 600, "misc"),
+ CASINO_PRIZE("Donk-Soft sawn off shotgun", /obj/item/weapon/gun/projectile/revolver/toy/sawnoff, 1, 800, "misc"),
+ CASINO_PRIZE("Donk-Soft SMG", /obj/item/weapon/gun/projectile/automatic/toy, 1, 1200, "misc"),
+ CASINO_PRIZE("Foam Darts", /obj/item/ammo_magazine/ammo_box/foam, 1, 100, "misc"),
+ CASINO_PRIZE("Riot Darts", /obj/item/ammo_magazine/ammo_box/foam/riot, 1, 200, "misc"),
)
item_list["Miscellaneous"] = list(
- CASINO_PRIZE("Toy sword", /obj/item/toy/sword, 1, 50, "misc"),
- CASINO_PRIZE("Waterflower", /obj/item/weapon/reagent_containers/spray/waterflower, 1, 50, "misc"),
- CASINO_PRIZE("Horse stick", /obj/item/toy/stickhorse, 1, 50, "misc"),
- CASINO_PRIZE("Katana", /obj/item/toy/katana, 1, 50, "misc"),
- CASINO_PRIZE("Conch", /obj/item/toy/eight_ball/conch, 1, 50, "misc"),
- CASINO_PRIZE("Eight ball", /obj/item/toy/eight_ball, 1, 50, "misc"),
- CASINO_PRIZE("Foam sword", /obj/item/weapon/material/sword/foam, 1, 50, "misc"),
- CASINO_PRIZE("Whistle", /obj/item/toy/bosunwhistle, 1, 50, "misc"),
- CASINO_PRIZE("Golden cup", /obj/item/weapon/reagent_containers/food/drinks/golden_cup, 1, 50, "misc"),
- CASINO_PRIZE("Quality cigars", /obj/item/weapon/storage/fancy/cigar/havana, 1, 50, "misc"),
- CASINO_PRIZE("Casino wallet (kept after event)", /obj/item/weapon/storage/wallet/casino, 1, 50, "misc"),
- CASINO_PRIZE("Casino cards", /obj/item/weapon/deck/cards/casino, 1, 50, "misc"),
+ CASINO_PRIZE("Winner's Medal", /obj/item/clothing/accessory/medal/gold/casino, 1, 30000, "misc"),
+ CASINO_PRIZE("Golden ID card", /obj/item/weapon/card/id/gold, 1, 1000, "misc"),
+ CASINO_PRIZE("Gold-trimmed pen", /obj/item/weapon/pen/fountain5, 1, 50, "misc"),
+ CASINO_PRIZE("Golden pen", /obj/item/weapon/pen/fountain7, 1, 350, "misc"),
+ CASINO_PRIZE("Toy sword", /obj/item/toy/sword, 1, 200, "misc"),
+ CASINO_PRIZE("Waterflower", /obj/item/weapon/reagent_containers/spray/waterflower, 1, 100, "misc"),
+ CASINO_PRIZE("Horse stick", /obj/item/toy/stickhorse, 1, 100, "misc"),
+ CASINO_PRIZE("Toy katana", /obj/item/toy/katana, 1, 200, "misc"),
+ CASINO_PRIZE("Magic conch", /obj/item/toy/eight_ball/conch, 1, 100, "misc"),
+ CASINO_PRIZE("Magic eight ball", /obj/item/toy/eight_ball, 1, 100, "misc"),
+ CASINO_PRIZE("Foam sword", /obj/item/weapon/material/sword/foam, 1, 200, "misc"),
+ CASINO_PRIZE("Whistle", /obj/item/toy/bosunwhistle, 1, 100, "misc"),
+ CASINO_PRIZE("Golden cup", /obj/item/weapon/reagent_containers/food/drinks/golden_cup, 1, 250, "misc"),
+ CASINO_PRIZE("Quality cigars", /obj/item/weapon/storage/fancy/cigar/havana, 1, 100, "misc"),
+ CASINO_PRIZE("Golden zippo lighter", /obj/item/weapon/flame/lighter/zippo/gold, 1, 100, "misc"),
+ CASINO_PRIZE("Candelabra", /obj/item/weapon/flame/candle/candelabra/everburn, 1, 400, "misc"),
+ CASINO_PRIZE("Casino wallet", /obj/item/weapon/storage/wallet/casino, 1, 200, "misc"),
+ CASINO_PRIZE("Casino cards", /obj/item/weapon/deck/cards/casino, 1, 200, "misc"),
+ CASINO_PRIZE("Instrument: Accordion", /obj/item/instrument/accordion, 1, 500, "misc"),
+ CASINO_PRIZE("Instrument: Banjo", /obj/item/instrument/banjo, 1, 500, "misc"),
+ CASINO_PRIZE("Instrument: Musical bikehorn", /obj/item/instrument/bikehorn, 1, 500, "misc"),
+ CASINO_PRIZE("Instrument: Electric guitar", /obj/item/instrument/eguitar, 1, 500, "misc"),
+ CASINO_PRIZE("Instrument: Glockenspiel", /obj/item/instrument/glockenspiel, 1, 500, "misc"),
+ CASINO_PRIZE("Instrument: Guitar", /obj/item/instrument/guitar, 1, 500, "misc"),
+ CASINO_PRIZE("Instrument: Harmonica", /obj/item/instrument/harmonica, 1, 500, "misc"),
+ CASINO_PRIZE("Instrument: Synthethic Piano", /obj/item/instrument/piano_synth, 1, 500, "misc"),
+ CASINO_PRIZE("Instrument: Recorder", /obj/item/instrument/recorder, 1, 500, "misc"),
+ CASINO_PRIZE("Instrument: Saxophone", /obj/item/instrument/saxophone, 1, 500, "misc"),
+ CASINO_PRIZE("Instrument: Trombone", /obj/item/instrument/trombone, 1, 500, "misc"),
+ CASINO_PRIZE("Instrument: Trumpet", /obj/item/instrument/trumpet, 1, 500, "misc"),
+ CASINO_PRIZE("Instrument: Violin", /obj/item/instrument/violin, 1, 500, "misc"),
+ CASINO_PRIZE("Instrument: Xylophone", /obj/item/instrument/xylophone, 1, 500, "misc"),
+ CASINO_PRIZE("Instrument: Golden fiddle", /obj/item/instrument/violin/golden, 1, 1500, "misc"),
+ CASINO_PRIZE("Instrument: Trumpet (warning: spooky)", /obj/item/instrument/trumpet/spectral, 1, 1000, "misc"),
+ CASINO_PRIZE("Instrument: Trombone (warning: spooky)", /obj/item/instrument/trombone/spectral, 1, 1000, "misc"),
+ CASINO_PRIZE("Instrument: Saxophone (warning: spooky)", /obj/item/instrument/saxophone/spectral, 1, 1000, "misc"),
+ CASINO_PRIZE("Instrument: Musical Moth (you monster)", /obj/item/instrument/musicalmoth, 1, 500, "misc"),
)
item_list["Drinks"] = list(
- CASINO_PRIZE("Redeemer's brew", /obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew, 1, 50, "drinks"),
- CASINO_PRIZE("Poison wine", /obj/item/weapon/reagent_containers/food/drinks/bottle/pwine, 1, 50, "drinks"),
- CASINO_PRIZE("Patron", /obj/item/weapon/reagent_containers/food/drinks/bottle/patron, 1, 50, "drinks"),
- CASINO_PRIZE("Holy water", /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, 1, 50, "drinks"),
- CASINO_PRIZE("Goldschlager", /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager, 1, 50, "drinks"),
- CASINO_PRIZE("Champagne", /obj/item/weapon/reagent_containers/food/drinks/bottle/champagne, 1, 50, "drinks"),
- CASINO_PRIZE("Bottle of Nothing", /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing, 1, 50, "drinks"),
- CASINO_PRIZE("Whiskey bliss", /obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey, 1, 50, "drinks"),
+ CASINO_PRIZE("Redeemer's brew", /obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew, 1, 150, "drinks"),
+ CASINO_PRIZE("Poison wine", /obj/item/weapon/reagent_containers/food/drinks/bottle/pwine, 1, 150, "drinks"),
+ CASINO_PRIZE("Patron", /obj/item/weapon/reagent_containers/food/drinks/bottle/patron, 1, 150, "drinks"),
+ CASINO_PRIZE("Holy water", /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, 1, 150, "drinks"),
+ CASINO_PRIZE("Goldschlager", /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager, 1, 150, "drinks"),
+ CASINO_PRIZE("Champagne", /obj/item/weapon/reagent_containers/food/drinks/bottle/champagne, 1, 150, "drinks"),
+ CASINO_PRIZE("Bottle of Nothing", /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing, 1, 150, "drinks"),
+ CASINO_PRIZE("Whiskey bliss", /obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey, 1, 150, "drinks"),
)
-
- item_list["Implants"] = list(
- CASINO_PRIZE("Implanter (Remember to get one unless you want to borrow from station!)", /obj/item/weapon/implanter, 1, 100, "implants"),
- CASINO_PRIZE("Implant: Tazer", /obj/item/weapon/implantcase/taser, 1, 1000, "implants"),
- CASINO_PRIZE("Implant: Medkit", /obj/item/weapon/implantcase/medkit, 1, 500, "implants"),
- CASINO_PRIZE("Implant: Shades", /obj/item/weapon/implantcase/shades, 1, 750, "implants"),
- CASINO_PRIZE("Implant: Sprinter", /obj/item/weapon/implantcase/sprinter, 1, 1500, "implants"),
- CASINO_PRIZE("Implant: Toolkit", /obj/item/weapon/implantcase/toolkit, 1, 500, "implants"),
- CASINO_PRIZE("Implant: Language", /obj/item/weapon/implantcase/vrlanguage, 1, 1000, "implants"),
- CASINO_PRIZE("Implant: Analyzer", /obj/item/weapon/implantcase/analyzer, 1, 500, "implants"),
- CASINO_PRIZE("Implant: Size control", /obj/item/weapon/implant/sizecontrol , 1, 500, "implants"),
- )
-
- item_list["Event"] = list(
+ item_list["Pets"] = list(
+ CASINO_PRIZE("Cat", /obj/item/weapon/grenade/spawnergrenade/casino, 1, 700, "pets"),
+ CASINO_PRIZE("Chicken", /obj/item/weapon/grenade/spawnergrenade/casino/chicken, 1, 700, "pets"),
+ CASINO_PRIZE("Cow", /obj/item/weapon/grenade/spawnergrenade/casino/cow, 1, 700, "pets"),
+ CASINO_PRIZE("Corgi", /obj/item/weapon/grenade/spawnergrenade/casino/corgi, 1, 900, "pets"),
+ CASINO_PRIZE("Fox", /obj/item/weapon/grenade/spawnergrenade/casino/fox, 1, 700, "pets"),
+ CASINO_PRIZE("Red panda", /obj/item/weapon/grenade/spawnergrenade/casino/redpanda, 1, 1200, "pets"),
+ CASINO_PRIZE("Otie", /obj/item/weapon/grenade/spawnergrenade/casino/otie, 1, 1500, "pets"),
+ CASINO_PRIZE("Snake", /obj/item/weapon/grenade/spawnergrenade/casino/snake, 1, 900, "pets"),
+ CASINO_PRIZE("Penguin", /obj/item/weapon/grenade/spawnergrenade/casino/penguin, 1, 900, "pets"),
+ CASINO_PRIZE("Fennec", /obj/item/weapon/grenade/spawnergrenade/casino/fennec, 1, 1200, "pets"),
+ CASINO_PRIZE("Bird", /obj/item/weapon/grenade/spawnergrenade/casino/goldcrest, 1, 1500, "pets"),
+ CASINO_PRIZE("Capture Crystal", /obj/item/capture_crystal, 1, 3000, "pets"),
)
/obj/machinery/casino_prize_dispenser/power_change()
diff --git a/code/modules/casino/headset_casino.dm b/code/modules/casino/headset_casino.dm
new file mode 100644
index 00000000000..fa7f09d401e
--- /dev/null
+++ b/code/modules/casino/headset_casino.dm
@@ -0,0 +1,20 @@
+/obj/item/device/radio/headset/casino
+ name = "casino headset"
+ desc = "An updated, modular intercom that fits over the head with extra comfortable for the hardworking casino luxury crew. Has encryption key for scamm-... Kind casino staff channel."
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "headset"
+ origin_tech = list(TECH_ILLEGAL = 1)
+ ks1type = /obj/item/device/encryptionkey/casino
+
+/obj/item/device/radio/headset/casino/bowman
+ name = "casino bowman headset"
+ icon_state = "headset_alt"
+ adhoc_fallback = TRUE
+ origin_tech = list(TECH_ILLEGAL = 2)
+
+/obj/item/device/encryptionkey/casino
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "cypherkey"
+ channels = list("Casino" = 1)
+ origin_tech = list(TECH_ILLEGAL = 1)
+ syndie = 1
\ No newline at end of file
diff --git a/code/modules/casino/premium_vendors.dm b/code/modules/casino/premium_vendors.dm
index 81075857458..ad65cd61c21 100644
--- a/code/modules/casino/premium_vendors.dm
+++ b/code/modules/casino/premium_vendors.dm
@@ -7,9 +7,12 @@
//Devs Feel free to modify this to vend what you please
//
+//
+//Locked Vendors (require access to use)
+//
/obj/machinery/vending/deluxe_boozeomat
name = "Premium Drink Distributor"
- desc = "A top of the line drink vendor that carries some of the finest drinks."
+ desc = "A top of the line drink vendor that carries some of the finest drinks in the frontier."
icon = 'icons/obj/casino.dmi'
icon_state = "premiumbooze"
products = list(/obj/item/weapon/glass_extra/stick = 50,
@@ -126,4 +129,41 @@
req_access = list(access_bar)
req_log_access = access_bar
has_logs = 1
- vending_sound = "machines/vending/vending_cans.ogg"
\ No newline at end of file
+ vending_sound = "machines/vending/vending_cans.ogg"
+
+/obj/machinery/vending/deluxe_cigs
+ name = "Premium Tobacco Distributor"
+ desc = "A top of the line smokes vendor that carries some of the finest tobacco based goods in the frontier."
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "premiumcigs"
+ products = list(/obj/item/weapon/storage/fancy/cigar = 15,
+ /obj/item/weapon/storage/fancy/cigarettes/carcinomas = 15,
+ /obj/item/weapon/storage/fancy/cigarettes/professionals = 15,
+ /obj/item/clothing/mask/smokable/cigarette/cigar/cohiba = 30,
+ /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 30,
+ /obj/item/weapon/storage/box/matches = 5,
+ /obj/item/weapon/flame/lighter/zippo = 10
+ )
+
+ contraband = list()
+ vend_delay = 15
+ idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
+ req_access = list(access_bar)
+ req_log_access = access_bar
+ has_logs = 1
+ vending_sound = "machines/vending/vending_cans.ogg"
+
+//
+//Unlocked Vendors
+//
+/obj/machinery/vending/deluxe_boozeomat/open
+ req_access = null
+ req_log_access = null
+
+/obj/machinery/vending/deluxe_dinner/open
+ req_access = null
+ req_log_access = null
+
+/obj/machinery/vending/deluxe_cigs/open
+ req_access = null
+ req_log_access = null
\ No newline at end of file
diff --git a/code/modules/casino/slots.dm b/code/modules/casino/slots.dm
index 773c1d15e05..40c7e5af61e 100644
--- a/code/modules/casino/slots.dm
+++ b/code/modules/casino/slots.dm
@@ -199,7 +199,7 @@
if (symbol1 == "platinum coin" && symbol2 == "platinum coin" && symbol3 == "platinum coin")
output = "Three platinum coins! The slot machine deposits a platinum chip!"
- platinumwin = TRUE;
+ platinumwin = TRUE
celebrate = 1
icon_state = initial(icon_state) // Set it back to the original iconstate.
diff --git a/code/modules/casino/spawnergrenade_casino.dm b/code/modules/casino/spawnergrenade_casino.dm
new file mode 100644
index 00000000000..4a3cf8e535d
--- /dev/null
+++ b/code/modules/casino/spawnergrenade_casino.dm
@@ -0,0 +1,105 @@
+/obj/item/weapon/grenade/spawnergrenade/casino
+ name = "Casino Creature Container (Cat)"
+ desc = "It is set to detonate in 5 seconds. It will release a cat won from the casino prize vendor!"
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "casino_delivery"
+ item_state = "flashbang"
+ origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 2)
+ spawner_type = /mob/living/simple_mob/animal/passive/cat
+
+// Detonate now just handles the two loops that query for people in lockers and people who can see it.
+/obj/item/weapon/grenade/spawnergrenade/casino/detonate()
+
+ if(spawner_type && deliveryamt)
+ var/turf/T = get_turf(src)
+ playsound(T, 'sound/effects/phasein.ogg', 100, 1)
+
+ for(var/i=1, i<=deliveryamt, i++)
+ var/atom/movable/x = new spawner_type(T)
+ if(prob(50))
+ for(var/j = 1, j <= rand(1, 3), j++)
+ step(x, pick(NORTH,SOUTH,EAST,WEST))
+ qdel(src)
+ return
+
+//
+// Creatures
+//
+/obj/item/weapon/grenade/spawnergrenade/casino/penguin
+ desc = "It is set to detonate in 5 seconds. It will release a penguin won from the casino prize vendor!"
+ name = "Casino Creature Container (Penguin)"
+ spawner_type = /mob/living/simple_mob/animal/passive/penguin
+
+/obj/item/weapon/grenade/spawnergrenade/casino/chicken
+ desc = "It is set to detonate in 5 seconds. It will release a chicken won from the casino prize vendor!"
+ name = "Casino Creature Container (Chicken)"
+ spawner_type = /mob/living/simple_mob/animal/passive/chicken
+
+/obj/item/weapon/grenade/spawnergrenade/casino/cow
+ desc = "It is set to detonate in 5 seconds. It will release a cow won from the casino prize vendor!"
+ name = "Casino Creature Container (Cow)"
+ spawner_type = /mob/living/simple_mob/animal/passive/cow
+
+/obj/item/weapon/grenade/spawnergrenade/casino/corgi
+ desc = "It is set to detonate in 5 seconds. It will release a corgi won from the casino prize vendor!"
+ name = "Casino Creature Container (Corgi)"
+ spawner_type = /mob/living/simple_mob/animal/passive/dog/corgi
+
+/obj/item/weapon/grenade/spawnergrenade/casino/fox
+ desc = "It is set to detonate in 5 seconds. It will release a fox won from the casino prize vendor!"
+ name = "Casino Creature Container (Fox)"
+ spawner_type = /mob/living/simple_mob/animal/passive/fox
+
+/obj/item/weapon/grenade/spawnergrenade/casino/fennec
+ desc = "It is set to detonate in 5 seconds. It will release a fennec won from the casino prize vendor!"
+ name = "Casino Creature Container (Fennec)"
+ spawner_type = /mob/living/simple_mob/vore/fennec
+
+/obj/item/weapon/grenade/spawnergrenade/casino/snake
+ desc = "It is set to detonate in 5 seconds. It will release a snake won from the casino prize vendor!"
+ name = "Casino Creature Container (Snake)"
+ spawner_type = /mob/living/simple_mob/animal/passive/snake
+
+/obj/item/weapon/grenade/spawnergrenade/casino/redpanda
+ desc = "It is set to detonate in 5 seconds. It will release a red panda won from the casino prize vendor!"
+ name = "Casino Creature Container (Red panda)"
+ spawner_type = /mob/living/simple_mob/vore/redpanda
+
+/obj/item/weapon/grenade/spawnergrenade/casino/snake
+ desc = "It is set to detonate in 5 seconds. It will release a snake won from the casino prize vendor!"
+ name = "Casino Creature Container (Snake)"
+ spawner_type = /mob/living/simple_mob/animal/passive/snake
+
+/obj/item/weapon/grenade/spawnergrenade/casino/otie
+ desc = "It is set to detonate in 5 seconds. It will release a otie won from the casino prize vendor!"
+ name = "Casino Creature Container (Otie)"
+ spawner_type = /mob/living/simple_mob/otie/friendly
+
+/obj/item/weapon/grenade/spawnergrenade/casino/goldcrest
+ desc = "It is set to detonate in 5 seconds. It will release a bird won from the casino prize vendor!"
+ name = "Casino Creature Container (Bird)"
+ spawner_type = /mob/living/simple_mob/animal/passive/bird/goldcrest
+
+//
+// Mecha
+//
+/obj/item/weapon/grenade/spawnergrenade/casino/gygax
+ desc = "You feel great power inside this small round sphere, with great powers comes great responsibilities!"
+ name = "Mysterious Grenade"
+ spawner_type = /obj/mecha/combat/gygax/dark
+
+/obj/item/weapon/grenade/spawnergrenade/casino/gygax/mining
+ name = "Casino Mech Container (Mining Ripley)"
+ spawner_type = /obj/mecha/working/ripley/mining
+
+/obj/item/weapon/grenade/spawnergrenade/casino/gygax/firefighter
+ name = "Casino Mech Container (Firefighter Ripley)"
+ spawner_type = /obj/mecha/working/ripley/firefighter
+
+/obj/item/weapon/grenade/spawnergrenade/casino/gygax/Odysseus
+ name = "Casino Mech Container (Odysseus)"
+ spawner_type = /obj/mecha/medical/odysseus/loaded
+
+/obj/item/weapon/grenade/spawnergrenade/casino/gygax/shuttlepod
+ name = "Casino Mech Container (Shuttlepod)"
+ spawner_type = /obj/mecha/working/hoverpod/shuttlepod
\ No newline at end of file
diff --git a/code/modules/catalogue/catalogue_data_vr.dm b/code/modules/catalogue/catalogue_data_vr.dm
index 52d00f4a740..350ffe088b2 100644
--- a/code/modules/catalogue/catalogue_data_vr.dm
+++ b/code/modules/catalogue/catalogue_data_vr.dm
@@ -93,6 +93,14 @@
comparable conditions as wealthy members of the Diaspora."
value = CATALOGUER_REWARD_TRIVIAL
+/datum/category_item/catalogue/fauna/altevian
+ name = "Sapients - Altevian"
+ desc = "The Altevian are a species of tall, rodent humanoids that are akin to rats for their features. \
+ The Altevian, unlike most species, do not have a home planet, nor system, adopting a fully nomadic lifestyle \
+ for their survival across the stars. Instead, they have opted to live in massive super capital-class colony-ships \
+ with a flagship as their place they would call home."
+ value = CATALOGUER_REWARD_TRIVIAL
+
/datum/category_item/catalogue/fauna/shadekin
name = "Sapients - Shadekin"
desc = "ERROR : No DNA found. ERROR : Ambient energy signature detected. Likely origin from attempt of scanning \
diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm
index 6631d7e5b57..819956e3d06 100644
--- a/code/modules/client/client defines.dm
+++ b/code/modules/client/client defines.dm
@@ -80,10 +80,15 @@
// Runechat messages
var/list/seen_messages
+ //Hide top bars
+ var/fullscreen = FALSE
+ //Hide status bar
+ var/show_status_bar = TRUE
+
///////////
// INPUT //
///////////
-
+
/// Bitfield of modifier keys (Shift, Ctrl, Alt) held currently.
var/mod_keys_held = 0
/// Bitfield of movement keys (WASD/Cursor Keys) held currently.
@@ -107,4 +112,4 @@
/// Movement dir of the most recently pressed movement key. Used in cardinal-only movement mode.
var/last_move_dir_pressed = NONE
- #endif
\ No newline at end of file
+ #endif
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 7a22dc451c7..851c2e39de8 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -60,6 +60,14 @@
cmd_admin_pm(C,null)
return
+ if(href_list["mentorhelp_msg"])
+ var/client/C = locate(href_list["mentorhelp_msg"])
+ if(ismob(C))
+ var/mob/M = C
+ C = M.client
+ cmd_mentor_pm(C, null)
+ return
+
if(href_list["irc_msg"])
if(!holder && received_irc_pm < world.time - 6000) //Worse they can do is spam IRC for 10 minutes
to_chat(usr, "You are no longer able to use this, it's been more then 10 minutes since an admin on IRC has responded to you")
@@ -86,7 +94,7 @@
return
sane = TRUE
break
-
+
if(!sane)
to_chat(src, "Sorry, that link doesn't appear to be valid. Please try again.")
return
@@ -121,6 +129,7 @@
switch(href_list["_src_"])
if("holder") hsrc = holder
+ if("mentorholder") hsrc = (check_rights(R_ADMIN, 0) ? holder : mentorholder)
if("usr") hsrc = mob
if("prefs") return prefs.process_link(usr,href_list)
if("vars") return view_var_Topic(href,href_list,hsrc)
@@ -176,6 +185,7 @@
GLOB.directory[ckey] = src
GLOB.ahelp_tickets.ClientLogin(src)
+ GLOB.mhelp_tickets.ClientLogin(src)
//Admin Authorisation
holder = admin_datums[ckey]
@@ -183,6 +193,10 @@
GLOB.admins += src
holder.owner = src
+ mentorholder = mentor_datums[ckey]
+ if (mentorholder)
+ mentorholder.associate(GLOB.directory[ckey])
+
//preferences datum - also holds some persistant data for the client (because we may as well keep these datums to a minimum)
prefs = preferences_datums[ckey]
if(!prefs)
@@ -194,6 +208,8 @@
. = ..() //calls mob.Login()
prefs.sanitize_preferences()
+ if(prefs)
+ prefs.selecting_slots = FALSE
connection_time = world.time
connection_realtime = world.realtime
@@ -258,7 +274,11 @@
if(holder)
holder.owner = null
GLOB.admins -= src
+ if (mentorholder)
+ mentorholder.owner = null
+ GLOB.mentors -= src
GLOB.ahelp_tickets.ClientLogout(src)
+ GLOB.mhelp_tickets.ClientLogout(src)
GLOB.directory -= ckey
GLOB.clients -= src
return ..()
@@ -564,3 +584,36 @@
set name = "TguiKeyUp"
set hidden = TRUE
return // stub
+
+/client/verb/toggle_fullscreen()
+ set name = "Toggle Fullscreen"
+ set category = "OOC"
+
+ fullscreen = !fullscreen
+
+ if (fullscreen)
+ winset(usr, "mainwindow", "on-size=")
+ winset(usr, "mainwindow", "titlebar=false")
+ winset(usr, "mainwindow", "can-resize=false")
+ winset(usr, "mainwindow", "menu=")
+ winset(usr, "mainwindow", "is-maximized=false")
+ winset(usr, "mainwindow", "is-maximized=true")
+ else
+ winset(usr, "mainwindow", "menu=menu")
+ winset(usr, "mainwindow", "titlebar=true")
+ winset(usr, "mainwindow", "can-resize=true")
+ winset(usr, "mainwindow", "is-maximized=false")
+ winset(usr, "mainwindow", "on-size=attempt_auto_fit_viewport") // The attempt_auto_fit_viewport() proc is not implemented yet
+
+/*
+/client/verb/toggle_status_bar()
+ set name = "Toggle Status Bar"
+ set category = "OOC"
+
+ show_status_bar = !show_status_bar
+
+ if (show_status_bar)
+ winset(usr, "input", "is-visible=true")
+ else
+ winset(usr, "input", "is-visible=false")
+*/
diff --git a/code/modules/client/preference_setup/antagonism/01_basic.dm b/code/modules/client/preference_setup/antagonism/01_basic.dm
index 100595aaba7..56f05795a30 100644
--- a/code/modules/client/preference_setup/antagonism/01_basic.dm
+++ b/code/modules/client/preference_setup/antagonism/01_basic.dm
@@ -44,23 +44,23 @@ var/global/list/uplink_locations = list("PDA", "Headset", "None")
return TOPIC_REFRESH
if(href_list["exploitable_record"])
- var/exploitmsg = sanitize(input(user,"Set exploitable information about you here.","Exploitable Information", html_decode(pref.exploit_record)) as message|null, MAX_RECORD_LENGTH, extra = 0)
+ var/exploitmsg = sanitize(tgui_input_text(user,"Set exploitable information about you here.","Exploitable Information", html_decode(pref.exploit_record), MAX_RECORD_LENGTH, TRUE, prevent_enter = TRUE), MAX_RECORD_LENGTH, extra = 0)
if(!isnull(exploitmsg) && !jobban_isbanned(user, "Records") && CanUseTopic(user))
pref.exploit_record = exploitmsg
return TOPIC_REFRESH
-
+
if(href_list["antagfaction"])
var/choice = tgui_input_list(user, "Please choose an antagonistic faction to work for.", "Character Preference", antag_faction_choices + list("None","Other"), pref.antag_faction)
if(!choice || !CanUseTopic(user))
return TOPIC_NOACTION
if(choice == "Other")
- var/raw_choice = sanitize(input(user, "Please enter a faction.", "Character Preference") as text|null, MAX_NAME_LEN)
+ var/raw_choice = sanitize(tgui_input_text(user, "Please enter a faction.", "Character Preference", null, MAX_NAME_LEN), MAX_NAME_LEN)
if(raw_choice)
pref.antag_faction = raw_choice
else
pref.antag_faction = choice
return TOPIC_REFRESH
-
+
if(href_list["antagvis"])
var/choice = tgui_input_list(user, "Please choose an antagonistic visibility level.", "Character Preference", antag_visiblity_choices, pref.antag_vis)
if(!choice || !CanUseTopic(user))
diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm
index 4211bb8add0..e3505834e4b 100644
--- a/code/modules/client/preference_setup/general/01_basic.dm
+++ b/code/modules/client/preference_setup/general/01_basic.dm
@@ -81,7 +81,7 @@
/datum/category_item/player_setup_item/general/basic/OnTopic(var/href,var/list/href_list, var/mob/user)
if(href_list["rename"])
- var/raw_name = input(user, "Choose your character's name:", "Character Name") as text|null
+ var/raw_name = tgui_input_text(user, "Choose your character's name:", "Character Name")
if (!isnull(raw_name) && CanUseTopic(user))
var/new_name = sanitize_name(raw_name, pref.species, is_FBP())
if(new_name)
@@ -125,7 +125,7 @@
else if(href_list["age"])
var/min_age = get_min_age()
var/max_age = get_max_age()
- var/new_age = input(user, "Choose your character's age:\n([min_age]-[max_age])", "Character Preference", pref.age) as num|null
+ var/new_age = tgui_input_number(user, "Choose your character's age:\n([min_age]-[max_age])", "Character Preference", pref.age, max_age, min_age)
if(new_age && CanUseTopic(user))
pref.age = max(min(round(text2num(new_age)), max_age), min_age)
return TOPIC_REFRESH
@@ -140,7 +140,7 @@
return TOPIC_REFRESH
else if(href_list["metadata"])
- var/new_metadata = sanitize(tgui_input_message(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , html_decode(pref.metadata)), extra = 0) //VOREStation Edit
+ var/new_metadata = sanitize(tgui_input_text(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , html_decode(pref.metadata), multiline = TRUE, prevent_enter = TRUE), extra = 0) //VOREStation Edit
if(new_metadata && CanUseTopic(user))
pref.metadata = new_metadata
return TOPIC_REFRESH
diff --git a/code/modules/client/preference_setup/general/02_language.dm b/code/modules/client/preference_setup/general/02_language.dm
index 21214895355..ed7ec1adf20 100644
--- a/code/modules/client/preference_setup/general/02_language.dm
+++ b/code/modules/client/preference_setup/general/02_language.dm
@@ -1,3 +1,6 @@
+/datum/preferences
+ var/extra_languages = 0
+
/datum/category_item/player_setup_item/general/language
name = "Language"
sort_order = 2
@@ -5,13 +8,17 @@
/datum/category_item/player_setup_item/general/language/load_character(var/savefile/S)
S["language"] >> pref.alternate_languages
+ S["extra_languages"] >> pref.extra_languages
testing("LANGSANI: Loaded from [pref.client]'s character [pref.real_name || "-name not yet loaded-"] savefile: [english_list(pref.alternate_languages || list())]")
S["language_prefixes"] >> pref.language_prefixes
+ S["language_custom_keys"] >> pref.language_custom_keys
/datum/category_item/player_setup_item/general/language/save_character(var/savefile/S)
S["language"] << pref.alternate_languages
+ S["extra_languages"] << pref.extra_languages
testing("LANGSANI: Saved to [pref.client]'s character [pref.real_name || "-name not yet loaded-"] savefile: [english_list(pref.alternate_languages || list())]")
S["language_prefixes"] << pref.language_prefixes
+ S["language_custom_keys"] << pref.language_custom_keys
/datum/category_item/player_setup_item/general/language/sanitize_character()
if(!islist(pref.alternate_languages))
@@ -22,10 +29,10 @@
if(!istype(S))
testing("LANGSANI: Failed sani on [pref.client]'s character [pref.real_name || "-name not yet loaded-"] because their species ([pref.species]) isn't in the global list")
return
-
- if(pref.alternate_languages.len > S.num_alternate_languages)
+
+ if(pref.alternate_languages.len > (S.num_alternate_languages + pref.extra_languages))
testing("LANGSANI: Truncated [pref.client]'s character [pref.real_name || "-name not yet loaded-"] language list because it was too long (len: [pref.alternate_languages.len], allowed: [S.num_alternate_languages])")
- pref.alternate_languages.len = S.num_alternate_languages // Truncate to allowed length
+ pref.alternate_languages.len = (S.num_alternate_languages + pref.extra_languages) // Truncate to allowed length
// Sanitize illegal languages
for(var/language in pref.alternate_languages)
@@ -39,22 +46,33 @@
for(var/prefix in pref.language_prefixes)
if(prefix in forbidden_prefixes)
pref.language_prefixes -= prefix
+ if(isnull(pref.language_custom_keys))
+ pref.language_custom_keys = list()
+ var/datum/species/S = GLOB.all_species[pref.species]
+ for(var/key in pref.language_custom_keys)
+ if(!pref.language_custom_keys[key])
+ pref.language_custom_keys.Remove(key)
+ if(!((pref.language_custom_keys[key] == S.language) || (pref.language_custom_keys[key] == S.default_language && S.default_language != S.language) || (pref.language_custom_keys[key] in pref.alternate_languages)))
+ pref.language_custom_keys.Remove(key)
/datum/category_item/player_setup_item/general/language/content()
. += "Languages "
var/datum/species/S = GLOB.all_species[pref.species]
+ if(pref.alternate_languages.len > (S.num_alternate_languages + pref.extra_languages))
+ testing("LANGSANI: Truncated [pref.client]'s character [pref.real_name || "-name not yet loaded-"] language list because it was too long (len: [pref.alternate_languages.len], allowed: [S.num_alternate_languages])")
+ pref.alternate_languages.len = (S.num_alternate_languages + pref.extra_languages) // Truncate to allowed length
if(S.language)
- . += "- [S.language] "
+ . += "- [S.language] - Set Custom Key "
if(S.default_language && S.default_language != S.language)
- . += "- [S.default_language] "
- if(S.num_alternate_languages)
+ . += "- [S.default_language] - Set Custom Key "
+ if(S.num_alternate_languages + pref.extra_languages)
if(pref.alternate_languages.len)
for(var/i = 1 to pref.alternate_languages.len)
var/lang = pref.alternate_languages[i]
- . += "- [lang] - remove "
+ . += "- [lang] - remove - Set Custom Key "
- if(pref.alternate_languages.len < S.num_alternate_languages)
- . += "- add ([S.num_alternate_languages - pref.alternate_languages.len] remaining) "
+ if(pref.alternate_languages.len < (S.num_alternate_languages + pref.extra_languages))
+ . += "- add ([(S.num_alternate_languages + pref.extra_languages) - pref.alternate_languages.len] remaining) "
else
. += "- [pref.species] cannot choose secondary languages. "
@@ -68,7 +86,7 @@
return TOPIC_REFRESH
else if(href_list["add_language"])
var/datum/species/S = GLOB.all_species[pref.species]
- if(pref.alternate_languages.len >= S.num_alternate_languages)
+ if(pref.alternate_languages.len >= (S.num_alternate_languages + pref.extra_languages))
tgui_alert_async(user, "You have already selected the maximum number of alternate languages for this species!")
else
var/list/available_languages = S.secondary_langs.Copy()
@@ -86,15 +104,19 @@
tgui_alert_async(user, "There are no additional languages available to select.")
else
var/new_lang = tgui_input_list(user, "Select an additional language", "Character Generation", available_languages)
- if(new_lang && pref.alternate_languages.len < S.num_alternate_languages)
- pref.alternate_languages |= new_lang
+ if(new_lang && pref.alternate_languages.len < (S.num_alternate_languages + pref.extra_languages))
+ var/datum/language/chosen_lang = GLOB.all_languages[new_lang]
+ if(istype(chosen_lang))
+ var/choice = tgui_alert(usr, "[chosen_lang.desc]",chosen_lang.name, list("Take","Cancel"))
+ if(choice != "Cancel" && pref.alternate_languages.len < (S.num_alternate_languages + pref.extra_languages))
+ pref.alternate_languages |= new_lang
return TOPIC_REFRESH
else if(href_list["change_prefix"])
var/char
var/keys[0]
do
- char = input(usr, "Enter a single special character.\nYou may re-select the same characters.\nThe following characters are already in use by radio: ; : .\nThe following characters are already in use by special say commands: ! * ^", "Enter Character - [3 - keys.len] remaining") as null|text
+ char = tgui_input_text(usr, "Enter a single special character.\nYou may re-select the same characters.\nThe following characters are already in use by radio: ; : .\nThe following characters are already in use by special say commands: ! * ^", "Enter Character - [3 - keys.len] remaining")
if(char)
if(length(char) > 1)
tgui_alert_async(user, "Only single characters allowed.", "Error")
@@ -115,4 +137,32 @@
pref.language_prefixes = config.language_prefixes.Copy()
return TOPIC_REFRESH
+ else if(href_list["set_custom_key"])
+ var/lang = href_list["set_custom_key"]
+ if(!(lang in GLOB.all_languages))
+ return TOPIC_REFRESH
+
+ var/oldkey = ""
+ for(var/key in pref.language_custom_keys)
+ if(pref.language_custom_keys[key] == lang)
+ oldkey = key
+ break
+
+ var/char = tgui_input_text(user, "Input a language key for [lang]. Input a single space to reset.", "Language Custom Key", oldkey)
+ if(length(char) != 1)
+ return TOPIC_REFRESH
+ else if(char == " ")
+ for(var/key in pref.language_custom_keys)
+ if(pref.language_custom_keys[key] == lang)
+ pref.language_custom_keys -= key
+ break
+ else if(contains_az09(char))
+ if(!(char in pref.language_custom_keys))
+ pref.language_custom_keys += char
+ pref.language_custom_keys[char] = lang
+ else
+ tgui_alert_async(user, "Improper language key. Rejected.", "Error")
+
+ return TOPIC_REFRESH
+
return ..()
diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm
index 6cdfa38f138..2e1066dc0b0 100644
--- a/code/modules/client/preference_setup/general/03_body.dm
+++ b/code/modules/client/preference_setup/general/03_body.dm
@@ -777,7 +777,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
else if(href_list["skin_tone"])
if(!has_flag(mob_species, HAS_SKIN_TONE))
return TOPIC_NOACTION
- var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference", (-pref.s_tone) + 35) as num|null
+ var/new_s_tone = tgui_input_number(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference", (-pref.s_tone) + 35, 220, 1)
if(new_s_tone && has_flag(mob_species, HAS_SKIN_TONE) && CanUseTopic(user))
pref.s_tone = 35 - max(min( round(new_s_tone), 220),1)
return TOPIC_REFRESH_UPDATE_PREVIEW
diff --git a/code/modules/client/preference_setup/general/05_background.dm b/code/modules/client/preference_setup/general/05_background.dm
index 50d1b362df6..4ca1cb86adb 100644
--- a/code/modules/client/preference_setup/general/05_background.dm
+++ b/code/modules/client/preference_setup/general/05_background.dm
@@ -71,7 +71,7 @@
if(!choice || !CanUseTopic(user))
return TOPIC_NOACTION
if(choice == "Other")
- var/raw_choice = sanitize(input(user, "Please enter a home system.", "Character Preference") as text|null, MAX_NAME_LEN)
+ var/raw_choice = sanitize(tgui_input_text(user, "Please enter a home system.", "Character Preference", null, MAX_NAME_LEN), MAX_NAME_LEN)
if(raw_choice && CanUseTopic(user))
pref.home_system = raw_choice
else
@@ -83,7 +83,7 @@
if(!choice || !CanUseTopic(user))
return TOPIC_NOACTION
if(choice == "Other")
- var/raw_choice = sanitize(input(user, "Please enter your current citizenship.", "Character Preference") as text|null, MAX_NAME_LEN)
+ var/raw_choice = sanitize(tgui_input_text(user, "Please enter your current citizenship.", "Character Preference", null, MAX_NAME_LEN), MAX_NAME_LEN)
if(raw_choice && CanUseTopic(user))
pref.citizenship = raw_choice
else
@@ -95,7 +95,7 @@
if(!choice || !CanUseTopic(user))
return TOPIC_NOACTION
if(choice == "Other")
- var/raw_choice = sanitize(input(user, "Please enter a faction.", "Character Preference") as text|null, MAX_NAME_LEN)
+ var/raw_choice = sanitize(tgui_input_text(user, "Please enter a faction.", "Character Preference", null, MAX_NAME_LEN), MAX_NAME_LEN)
if(raw_choice)
pref.faction = raw_choice
else
@@ -107,7 +107,7 @@
if(!choice || !CanUseTopic(user))
return TOPIC_NOACTION
if(choice == "Other")
- var/raw_choice = sanitize(input(user, "Please enter a religon.", "Character Preference") as text|null, MAX_NAME_LEN)
+ var/raw_choice = sanitize(tgui_input_text(user, "Please enter a religon.", "Character Preference", null, MAX_NAME_LEN), MAX_NAME_LEN)
if(raw_choice)
pref.religion = sanitize(raw_choice)
else
@@ -115,19 +115,19 @@
return TOPIC_REFRESH
else if(href_list["set_medical_records"])
- var/new_medical = sanitize(input(user,"Enter medical information here.","Character Preference", html_decode(pref.med_record)) as message|null, MAX_RECORD_LENGTH, extra = 0)
+ var/new_medical = sanitize(tgui_input_text(user,"Enter medical information here.","Character Preference", html_decode(pref.med_record), MAX_RECORD_LENGTH, TRUE, prevent_enter = TRUE), MAX_RECORD_LENGTH, extra = 0)
if(!isnull(new_medical) && !jobban_isbanned(user, "Records") && CanUseTopic(user))
pref.med_record = new_medical
return TOPIC_REFRESH
else if(href_list["set_general_records"])
- var/new_general = sanitize(input(user,"Enter employment information here.","Character Preference", html_decode(pref.gen_record)) as message|null, MAX_RECORD_LENGTH, extra = 0)
+ var/new_general = sanitize(tgui_input_text(user,"Enter employment information here.","Character Preference", html_decode(pref.gen_record), MAX_RECORD_LENGTH, TRUE, prevent_enter = TRUE), MAX_RECORD_LENGTH, extra = 0)
if(!isnull(new_general) && !jobban_isbanned(user, "Records") && CanUseTopic(user))
pref.gen_record = new_general
return TOPIC_REFRESH
else if(href_list["set_security_records"])
- var/sec_medical = sanitize(input(user,"Enter security information here.","Character Preference", html_decode(pref.sec_record)) as message|null, MAX_RECORD_LENGTH, extra = 0)
+ var/sec_medical = sanitize(tgui_input_text(user,"Enter security information here.","Character Preference", html_decode(pref.sec_record), MAX_RECORD_LENGTH, TRUE, prevent_enter = TRUE), MAX_RECORD_LENGTH, extra = 0)
if(!isnull(sec_medical) && !jobban_isbanned(user, "Records") && CanUseTopic(user))
pref.sec_record = sec_medical
return TOPIC_REFRESH
diff --git a/code/modules/client/preference_setup/general/06_flavor.dm b/code/modules/client/preference_setup/general/06_flavor.dm
index ac1c42d5d04..794fba3e2fa 100644
--- a/code/modules/client/preference_setup/general/06_flavor.dm
+++ b/code/modules/client/preference_setup/general/06_flavor.dm
@@ -59,12 +59,12 @@
switch(href_list["flavor_text"])
if("open")
if("general")
- var/msg = sanitize(input(usr,"Give a general description of your character. This will be shown regardless of clothings.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]])) as message, extra = 0) //VOREStation Edit: separating out OOC notes
- if(CanUseTopic(user))
+ var/msg = sanitize(tgui_input_text(usr,"Give a general description of your character. This will be shown regardless of clothings. Put in a single space to make blank.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0) //VOREStation Edit: separating out OOC notes
+ if(CanUseTopic(user) && !isnull(msg))
pref.flavor_texts[href_list["flavor_text"]] = msg
else
- var/msg = sanitize(input(usr,"Set the flavor text for your [href_list["flavor_text"]].","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]])) as message, extra = 0)
- if(CanUseTopic(user))
+ var/msg = sanitize(tgui_input_text(usr,"Set the flavor text for your [href_list["flavor_text"]]. Put in a single space to make blank.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0)
+ if(CanUseTopic(user) && !isnull(msg))
pref.flavor_texts[href_list["flavor_text"]] = msg
SetFlavorText(user)
return TOPIC_HANDLED
@@ -73,12 +73,12 @@
switch(href_list["flavour_text_robot"])
if("open")
if("Default")
- var/msg = sanitize(input(usr,"Set the default flavour text for your robot. It will be used for any module without individual setting.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"])) as message, extra = 0)
- if(CanUseTopic(user))
+ var/msg = sanitize(tgui_input_text(usr,"Set the default flavour text for your robot. It will be used for any module without individual setting. Put in a single space to make blank.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"]), multiline = TRUE, prevent_enter = TRUE), extra = 0)
+ if(CanUseTopic(user) && !isnull(msg))
pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg
else
- var/msg = sanitize(input(usr,"Set the flavour text for your robot with [href_list["flavour_text_robot"]] module. If you leave this empty, default flavour text will be used for this module.","Flavour Text",html_decode(pref.flavour_texts_robot[href_list["flavour_text_robot"]])) as message, extra = 0)
- if(CanUseTopic(user))
+ var/msg = sanitize(tgui_input_text(usr,"Set the flavour text for your robot with [href_list["flavour_text_robot"]] module. If you leave this blank, default flavour text will be used for this module. Put in a single space to make blank.","Flavour Text",html_decode(pref.flavour_texts_robot[href_list["flavour_text_robot"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0)
+ if(CanUseTopic(user) && !isnull(msg))
pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg
SetFlavourTextRobot(user)
return TOPIC_HANDLED
diff --git a/code/modules/client/preference_setup/global/01_ui.dm b/code/modules/client/preference_setup/global/01_ui.dm
index 6bdcdccf5c5..7afc90d082e 100644
--- a/code/modules/client/preference_setup/global/01_ui.dm
+++ b/code/modules/client/preference_setup/global/01_ui.dm
@@ -3,28 +3,34 @@
sort_order = 1
/datum/category_item/player_setup_item/player_global/ui/load_preferences(var/savefile/S)
- S["UI_style"] >> pref.UI_style
- S["UI_style_color"] >> pref.UI_style_color
- S["UI_style_alpha"] >> pref.UI_style_alpha
- S["ooccolor"] >> pref.ooccolor
- S["tooltipstyle"] >> pref.tooltipstyle
- S["client_fps"] >> pref.client_fps
- S["ambience_freq"] >> pref.ambience_freq
- S["ambience_chance"] >> pref.ambience_chance
- S["tgui_fancy"] >> pref.tgui_fancy
- S["tgui_lock"] >> pref.tgui_lock
+ S["UI_style"] >> pref.UI_style
+ S["UI_style_color"] >> pref.UI_style_color
+ S["UI_style_alpha"] >> pref.UI_style_alpha
+ S["ooccolor"] >> pref.ooccolor
+ S["tooltipstyle"] >> pref.tooltipstyle
+ S["client_fps"] >> pref.client_fps
+ S["ambience_freq"] >> pref.ambience_freq
+ S["ambience_chance"] >> pref.ambience_chance
+ S["tgui_fancy"] >> pref.tgui_fancy
+ S["tgui_lock"] >> pref.tgui_lock
+ S["tgui_input_mode"] >> pref.tgui_input_mode
+ S["tgui_large_buttons"] >> pref.tgui_large_buttons
+ S["tgui_swapped_buttons"] >> pref.tgui_swapped_buttons
/datum/category_item/player_setup_item/player_global/ui/save_preferences(var/savefile/S)
- S["UI_style"] << pref.UI_style
- S["UI_style_color"] << pref.UI_style_color
- S["UI_style_alpha"] << pref.UI_style_alpha
- S["ooccolor"] << pref.ooccolor
- S["tooltipstyle"] << pref.tooltipstyle
- S["client_fps"] << pref.client_fps
- S["ambience_freq"] << pref.ambience_freq
- S["ambience_chance"] << pref.ambience_chance
- S["tgui_fancy"] << pref.tgui_fancy
- S["tgui_lock"] << pref.tgui_lock
+ S["UI_style"] << pref.UI_style
+ S["UI_style_color"] << pref.UI_style_color
+ S["UI_style_alpha"] << pref.UI_style_alpha
+ S["ooccolor"] << pref.ooccolor
+ S["tooltipstyle"] << pref.tooltipstyle
+ S["client_fps"] << pref.client_fps
+ S["ambience_freq"] << pref.ambience_freq
+ S["ambience_chance"] << pref.ambience_chance
+ S["tgui_fancy"] << pref.tgui_fancy
+ S["tgui_lock"] << pref.tgui_lock
+ S["tgui_input_mode"] << pref.tgui_input_mode
+ S["tgui_large_buttons"] << pref.tgui_large_buttons
+ S["tgui_swapped_buttons"] << pref.tgui_swapped_buttons
/datum/category_item/player_setup_item/player_global/ui/sanitize_preferences()
pref.UI_style = sanitize_inlist(pref.UI_style, all_ui_styles, initial(pref.UI_style))
@@ -35,8 +41,11 @@
pref.client_fps = sanitize_integer(pref.client_fps, 0, MAX_CLIENT_FPS, initial(pref.client_fps))
pref.ambience_freq = sanitize_integer(pref.ambience_freq, 0, 60, initial(pref.ambience_freq)) // No more than once per hour.
pref.ambience_chance = sanitize_integer(pref.ambience_chance, 0, 100, initial(pref.ambience_chance)) // 0-100 range.
- pref.tgui_fancy = sanitize_integer(pref.tgui_fancy, 0, 1, initial(pref.tgui_fancy))
- pref.tgui_lock = sanitize_integer(pref.tgui_lock, 0, 1, initial(pref.tgui_lock))
+ pref.tgui_fancy = sanitize_integer(pref.tgui_fancy, 0, 1, initial(pref.tgui_fancy))
+ pref.tgui_lock = sanitize_integer(pref.tgui_lock, 0, 1, initial(pref.tgui_lock))
+ pref.tgui_input_mode = sanitize_integer(pref.tgui_input_mode, 0, 1, initial(pref.tgui_input_mode))
+ pref.tgui_large_buttons = sanitize_integer(pref.tgui_large_buttons, 0, 1, initial(pref.tgui_large_buttons))
+ pref.tgui_swapped_buttons = sanitize_integer(pref.tgui_swapped_buttons, 0, 1, initial(pref.tgui_swapped_buttons))
/datum/category_item/player_setup_item/player_global/ui/content(var/mob/user)
. = "UI Style: [pref.UI_style] "
@@ -49,6 +58,9 @@
. += "Ambience Chance: [pref.ambience_chance] "
. += "tgui Window Mode: [(pref.tgui_fancy) ? "Fancy (default)" : "Compatible (slower)"] "
. += "tgui Window Placement: [(pref.tgui_lock) ? "Primary Monitor" : "Free (default)"] "
+ . += "TGUI Input Framework: [(pref.tgui_input_mode) ? "Enabled" : "Disabled (default)"] "
+ . += "TGUI Large Buttons: [(pref.tgui_large_buttons) ? "Enabled (default)" : "Disabled"] "
+ . += "TGUI Swapped Buttons: [(pref.tgui_swapped_buttons) ? "Enabled" : "Disabled (default)"] "
if(can_select_ooc_color(user))
. += "OOC Color:"
if(pref.ooccolor == initial(pref.ooccolor))
@@ -70,7 +82,7 @@
return TOPIC_REFRESH
else if(href_list["select_alpha"])
- var/UI_style_alpha_new = input(user, "Select UI alpha (transparency) level, between 50 and 255.", "Global Preference", pref.UI_style_alpha) as num|null
+ var/UI_style_alpha_new = tgui_input_number(user, "Select UI alpha (transparency) level, between 50 and 255.", "Global Preference", pref.UI_style_alpha, 255, 50)
if(isnull(UI_style_alpha_new) || (UI_style_alpha_new < 50 || UI_style_alpha_new > 255) || !CanUseTopic(user)) return TOPIC_NOACTION
pref.UI_style_alpha = UI_style_alpha_new
return TOPIC_REFRESH
@@ -88,7 +100,7 @@
return TOPIC_REFRESH
else if(href_list["select_client_fps"])
- var/fps_new = input(user, "Input Client FPS (1-200, 0 uses server FPS)", "Global Preference", pref.client_fps) as null|num
+ var/fps_new = tgui_input_number(user, "Input Client FPS (1-200, 0 uses server FPS)", "Global Preference", pref.client_fps, 200, 0)
if(isnull(fps_new) || !CanUseTopic(user)) return TOPIC_NOACTION
if(fps_new < 0 || fps_new > MAX_CLIENT_FPS) return TOPIC_NOACTION
pref.client_fps = fps_new
@@ -97,14 +109,14 @@
return TOPIC_REFRESH
else if(href_list["select_ambience_freq"])
- var/ambience_new = input(user, "Input how often you wish to hear ambience repeated! (1-60 MINUTES, 0 for disabled)", "Global Preference", pref.ambience_freq) as null|num
+ var/ambience_new = tgui_input_number(user, "Input how often you wish to hear ambience repeated! (1-60 MINUTES, 0 for disabled)", "Global Preference", pref.ambience_freq, 60, 0)
if(isnull(ambience_new) || !CanUseTopic(user)) return TOPIC_NOACTION
if(ambience_new < 0 || ambience_new > 60) return TOPIC_NOACTION
pref.ambience_freq = ambience_new
return TOPIC_REFRESH
else if(href_list["select_ambience_chance"])
- var/ambience_chance_new = input(user, "Input the chance you'd like to hear ambience played to you (On area change, or by random ambience). 35 means a 35% chance to play ambience. This is a range from 0-100. 0 disables ambience playing entirely. This is also affected by Ambience Frequency.", "Global Preference", pref.ambience_freq) as null|num
+ var/ambience_chance_new = tgui_input_number(user, "Input the chance you'd like to hear ambience played to you (On area change, or by random ambience). 35 means a 35% chance to play ambience. This is a range from 0-100. 0 disables ambience playing entirely. This is also affected by Ambience Frequency.", "Global Preference", pref.ambience_freq, 100, 0)
if(isnull(ambience_chance_new) || !CanUseTopic(user)) return TOPIC_NOACTION
if(ambience_chance_new < 0 || ambience_chance_new > 100) return TOPIC_NOACTION
pref.ambience_chance = ambience_chance_new
@@ -118,6 +130,18 @@
pref.tgui_lock = !pref.tgui_lock
return TOPIC_REFRESH
+ else if(href_list["tgui_input_mode"])
+ pref.tgui_input_mode = !pref.tgui_input_mode
+ return TOPIC_REFRESH
+
+ else if(href_list["tgui_large_buttons"])
+ pref.tgui_large_buttons = !pref.tgui_large_buttons
+ return TOPIC_REFRESH
+
+ else if(href_list["tgui_swapped_buttons"])
+ pref.tgui_swapped_buttons = !pref.tgui_swapped_buttons
+ return TOPIC_REFRESH
+
else if(href_list["reset"])
switch(href_list["reset"])
if("ui")
diff --git a/code/modules/client/preference_setup/global/02_settings.dm b/code/modules/client/preference_setup/global/02_settings.dm
index b3da6ef2142..fcdb85b8431 100644
--- a/code/modules/client/preference_setup/global/02_settings.dm
+++ b/code/modules/client/preference_setup/global/02_settings.dm
@@ -91,7 +91,7 @@
preference = list(preference)
for(var/p in preference)
var/datum/client_preference/cp = get_client_preference(p)
- if(!cp || !(cp.key in prefs.preferences_enabled))
+ if(!prefs || !cp || !(cp.key in prefs.preferences_enabled))
return FALSE
return TRUE
diff --git a/code/modules/client/preference_setup/global/03_pai.dm b/code/modules/client/preference_setup/global/03_pai.dm
index 01c5f7a8509..c4d81e552b0 100644
--- a/code/modules/client/preference_setup/global/03_pai.dm
+++ b/code/modules/client/preference_setup/global/03_pai.dm
@@ -42,19 +42,19 @@
var/t
switch(href_list["option"])
if("name")
- t = sanitizeName(input(user, "Enter a name for your pAI", "Global Preference", candidate.name) as text|null, MAX_NAME_LEN, 1)
+ t = sanitizeName(tgui_input_text(user, "Enter a name for your pAI", "Global Preference", candidate.name, MAX_NAME_LEN), MAX_NAME_LEN, 1)
if(t && CanUseTopic(user))
candidate.name = t
if("desc")
- t = input(user, "Enter a description for your pAI", "Global Preference", html_decode(candidate.description)) as message|null
+ t = tgui_input_text(user, "Enter a description for your pAI", "Global Preference", html_decode(candidate.description), multiline = TRUE, prevent_enter = TRUE)
if(!isnull(t) && CanUseTopic(user))
candidate.description = sanitize(t)
if("role")
- t = input(user, "Enter a role for your pAI", "Global Preference", html_decode(candidate.role)) as text|null
+ t = tgui_input_text(user, "Enter a role for your pAI", "Global Preference", html_decode(candidate.role))
if(!isnull(t) && CanUseTopic(user))
candidate.role = sanitize(t)
if("ooc")
- t = input(user, "Enter any OOC comments", "Global Preference", html_decode(candidate.comments)) as message
+ t = tgui_input_text(user, "Enter any OOC comments", "Global Preference", html_decode(candidate.comments), multiline = TRUE, prevent_enter = TRUE)
if(!isnull(t) && CanUseTopic(user))
candidate.comments = sanitize(t)
return TOPIC_REFRESH
diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm
index 06e44c3fd8c..08504f1020e 100644
--- a/code/modules/client/preference_setup/global/setting_datums.dm
+++ b/code/modules/client/preference_setup/global/setting_datums.dm
@@ -95,7 +95,7 @@ var/list/_client_preferences_by_type
key = "DIGEST_NOISES"
enabled_description = "Noisy"
disabled_description = "Silent"
-
+
/datum/client_preference/belch_noises // Belching noises - pref toggle for 'em
description = "Burping"
key = "BELCH_NOISES"
@@ -108,7 +108,7 @@ var/list/_client_preferences_by_type
enabled_description = "Noisy"
disabled_description = "Silent"
/datum/client_preference/whisubtle_vis
- description = "Whi/Subtles Ghost Visible"
+ description = "Whi/Subtles Ghost Visible"
key = "WHISUBTLE_VIS"
enabled_description = "Visible"
disabled_description = "Hidden"
@@ -299,6 +299,30 @@ var/list/_client_preferences_by_type
enabled_description = "On"
disabled_description = "Off"
+/datum/client_preference/say_sounds
+ description = "Say Sounds"
+ key = "SAY_SOUNDS"
+ enabled_description = "On"
+ disabled_description = "Off"
+
+/datum/client_preference/emote_sounds
+ description = "Me Sounds"
+ key = "EMOTE_SOUNDS"
+ enabled_description = "On"
+ disabled_description = "Off"
+
+/datum/client_preference/whisper_sounds
+ description = "Whisper Sounds"
+ key = "WHISPER_SOUNDS"
+ enabled_description = "On"
+ disabled_description = "Off"
+
+/datum/client_preference/subtle_sounds
+ description = "Subtle Sounds"
+ key = "SUBTLE_SOUNDS"
+ enabled_description = "On"
+ disabled_description = "Off"
+
/datum/client_preference/runechat_mob
description = "Runechat (Mobs)"
key = "RUNECHAT_MOB"
@@ -338,6 +362,12 @@ var/list/_client_preferences_by_type
enabled_description = "Popup New On Login"
disabled_description = "Do Nothing"
+/datum/client_preference/play_mentorhelp_ping
+ description = "Mentorhelps"
+ key = "SOUND_MENTORHELP"
+ enabled_description = "Hear"
+ disabled_description = "Silent"
+
/********************
* Staff Preferences *
********************/
diff --git a/code/modules/client/preference_setup/loadout/gear_tweaks.dm b/code/modules/client/preference_setup/loadout/gear_tweaks.dm
index 11e0f1f777e..ed5306412b6 100644
--- a/code/modules/client/preference_setup/loadout/gear_tweaks.dm
+++ b/code/modules/client/preference_setup/loadout/gear_tweaks.dm
@@ -172,7 +172,7 @@ var/datum/gear_tweak/custom_name/gear_tweak_free_name = new()
return
if(valid_custom_names)
return tgui_input_list(user, "Choose an item name.", "Character Preference", valid_custom_names, metadata)
- var/san_input = sanitize(input(user, "Choose the item's name. Leave it blank to use the default name.", "Item Name", metadata) as text|null, MAX_LNAME_LEN, extra = 0)
+ var/san_input = sanitize(tgui_input_text(user, "Choose the item's name. Leave it blank to use the default name.", "Item Name", metadata, MAX_LNAME_LEN), MAX_LNAME_LEN, extra = 0)
return san_input ? san_input : get_default()
/datum/gear_tweak/custom_name/tweak_item(var/obj/item/I, var/metadata)
@@ -204,7 +204,7 @@ var/datum/gear_tweak/custom_desc/gear_tweak_free_desc = new()
return
if(valid_custom_desc)
return tgui_input_list(user, "Choose an item description.", "Character Preference",valid_custom_desc, metadata)
- var/san_input = sanitize(input(user, "Choose the item's description. Leave it blank to use the default description.", "Item Description", metadata) as message|null, extra = 0)
+ var/san_input = sanitize(tgui_input_text(user, "Choose the item's description. Leave it blank to use the default description.", "Item Description", metadata, multiline = TRUE, prevent_enter = TRUE), extra = 0)
return san_input ? san_input : get_default()
/datum/gear_tweak/custom_desc/tweak_item(var/obj/item/I, var/metadata)
diff --git a/code/modules/client/preference_setup/loadout/gear_tweaks_vr.dm b/code/modules/client/preference_setup/loadout/gear_tweaks_vr.dm
index 488a62fbc98..4de3362d6f7 100644
--- a/code/modules/client/preference_setup/loadout/gear_tweaks_vr.dm
+++ b/code/modules/client/preference_setup/loadout/gear_tweaks_vr.dm
@@ -5,7 +5,7 @@
return ""
/datum/gear_tweak/collar_tag/get_metadata(var/user, var/metadata)
- return sanitize( input(user, "Choose the tag text", "Character Preference", metadata) as text , MAX_NAME_LEN )
+ return sanitize( tgui_input_text(user, "Choose the tag text", "Character Preference", metadata, MAX_NAME_LEN), MAX_NAME_LEN )
/datum/gear_tweak/collar_tag/tweak_item(var/obj/item/clothing/accessory/collar/C, var/metadata)
if(metadata == "")
diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm b/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm
index 6592730bff0..b2e3ba3636b 100644
--- a/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm
@@ -44,6 +44,10 @@
display_name = "collar, cowbell"
path = /obj/item/clothing/accessory/collar/cowbell
+/datum/gear/collar/planet_earth
+ display_name = "collar, planet"
+ path = /obj/item/clothing/accessory/collar/collarplanet_earth
+
/datum/gear/collar/holo
display_name = "collar, holo"
path = /obj/item/clothing/accessory/collar/holo
diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
index 6684a605f5a..184bce83f36 100644
--- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
@@ -78,6 +78,24 @@
ckeywhitelist = list("alfalah")
character_name = list("Charlotte Graves")
+/datum/gear/fluff/fifi_hat
+ path = /obj/item/clothing/head/fluff/fifi_hat
+ display_name = "Fifi's hat"
+ ckeywhitelist = list("allweek")
+ character_name = list("Fifi The Magnificent")
+
+/datum/gear/fluff/fifi_jumpsuit
+ path = /obj/item/clothing/under/fluff/fifi_jumpsuit
+ display_name = "Fifi's jumpsuit"
+ ckeywhitelist = list("allweek")
+ character_name = list("Fifi The Magnificent")
+
+/datum/gear/fluff/fifi_socks
+ path = /obj/item/clothing/shoes/fluff/fifi_socks
+ display_name = "Fifi's socks"
+ ckeywhitelist = list("allweek")
+ character_name = list("Fifi The Magnificent")
+
/datum/gear/fluff/lynn_penlight
path = /obj/item/device/flashlight/pen/fluff/lynn
display_name = "Lynn's Penlight"
@@ -198,6 +216,12 @@
ckeywhitelist = list("bobofboblandia")
character_name = list("Charles Gettler")
+/datum/gear/fluff/nettie_tablet
+ path = /obj/item/modular_computer/tablet/preset/custom_loadout/nettie
+ display_name = "Remodeled Tablet"
+ ckeywhitelist = list("bricker98")
+ character_name = list("Nettie Stough")
+
/datum/gear/fluff/xin_sovietuniform
path = /obj/item/clothing/under/soviet
display_name = "Xin's Soviet Uniform"
@@ -789,6 +813,12 @@
ckeywhitelist = list("pandora029")
character_name = list("Evelyn Tareen", "Velyn Tareen")
+/datum/gear/fluff/seona_flightsuit
+ path = /obj/item/clothing/under/fluff/foxoflightsuit/
+ display_name = "padded flightsuit"
+ ckeywhitelist = list("pandora029")
+ character_name = list("Seona Young")
+
/datum/gear/fluff/lily_medal
path = /obj/item/clothing/accessory/medal/silver/unity
display_name = "Lily's Unity Medal"
@@ -997,6 +1027,13 @@
ckeywhitelist = list("seiga")
character_name = list("Alfonso Oak Telanor")
+/datum/gear/fluff/cerise_secbelt
+ path = /obj/item/weapon/storage/belt/security/fluff/cerise
+ display_name = "Cerise's Champion's Belt"
+ ckeywhitelist = list("shalax")
+ character_name = list("Cerise Duelliste")
+ allowed_roles = list("Security Officer", "Warden", "Head of Security", "Detective")
+
/datum/gear/fluff/nthasd_modkit //Converts a Security suit's sprite
path = /obj/item/device/modkit_conversion/hasd
display_name = "NT-HASD 556's Modkit"
@@ -1038,11 +1075,11 @@
ckeywhitelist = list("swat43")
character_name = list("Fortune Bloise")
-/datum/gear/fluff/alexis_cane
- path = /obj/item/weapon/cane/wand
- display_name = "Alexis' Cane"
+/datum/gear/fluff/kyutar
+ path = /obj/item/instrument/piano_synth/fluff/kyutar
+ display_name = "Kyu's Holotar"
ckeywhitelist = list("stobarico")
- character_name = list("Alexis Bloise")
+ character_name = list("Kyu Comet")
/datum/gear/fluff/roiz_coat
path = /obj/item/clothing/suit/storage/hooded/wintercoat/roiz
@@ -1372,12 +1409,19 @@
/datum/gear/fluff/nehi_radio
path = /obj/item/device/radio/headset/fluff/zodiacshadow
- display_name = "Nehi's Radio"
+ display_name = "Nehi's 'phones"
+ ckeywhitelist = list("zodiacshadow")
+ character_name = list("Nehi Maximus")
+
+/datum/gear/fluff/nehi_health_medal
+ path = /obj/item/clothing/accessory/medal/silver/fluff/zodiacshadow
+ display_name = "Health Service Achievement medal"
ckeywhitelist = list("zodiacshadow")
character_name = list("Nehi Maximus")
/datum/gear/fluff/lucky_amour
- path = /obj/item/device/modkit_conversion/crusader_luck
+ path = /obj/item/clothing/suit/armor/combat/crusader_costume/lucky
display_name = "Lucky's amour"
ckeywhitelist = list ("thedavestdave")
- character_name = list("Lucky")
\ No newline at end of file
+ character_name = list("Lucky")
+ allowed_roles = "Chaplain"
diff --git a/code/modules/client/preference_setup/loadout/loadout_general_vr.dm b/code/modules/client/preference_setup/loadout/loadout_general_vr.dm
index 3daa644f6b2..d68050dd858 100644
--- a/code/modules/client/preference_setup/loadout/loadout_general_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_general_vr.dm
@@ -94,5 +94,10 @@
/datum/gear/schnapsen
display_name = "schnapsen playing cards"
- description = "French-suit playing cards! Pre-picked for 2-player mode."
+ description = "An ancient Austro-Hungarian suit of cards!"
path = /obj/item/weapon/deck/schnapsen
+
+/datum/gear/egy_game
+ display_name = "EGY playing cards"
+ description = "A deck of cards for playing EGY! Be the first to lose all cards!"
+ path = /obj/item/weapon/deck/egy
diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm
index bdc941cfae4..918233309ff 100644
--- a/code/modules/client/preference_setup/loadout/loadout_suit.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm
@@ -398,7 +398,7 @@
/datum/gear/suit/wintercoat/medical/para
display_name = "winter coat, paramedic"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/para
- allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic")
+ allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic","Field Medic")
/datum/gear/suit/wintercoat/medical/chemist
display_name = "winter coat, chemist"
@@ -413,7 +413,7 @@
/datum/gear/suit/wintercoat/medical/sar
display_name = "winter coat, search and rescue"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/sar
- allowed_roles = list("Chief Medical Officer", "Field Medic")
+ allowed_roles = list("Chief Medical Officer","Paramedic","Field Medic")
/datum/gear/suit/wintercoat/science
display_name = "winter coat, science"
@@ -625,7 +625,7 @@
/datum/gear/suit/cmddressjacket
display_name = "command dress jacket"
- path = /obj/item/clothing/suit/storage/cmddressjacket
+ path = /obj/item/clothing/suit/storage/toggle/cmddressjacket
allowed_roles = list("Site Manager", "Head of Personnel", "Command Secretary")
/datum/gear/suit/miscellaneous/kimono
@@ -661,4 +661,4 @@
"Pink kimono" = /obj/item/clothing/suit/kimono/pink,
"Earth kimono" = /obj/item/clothing/suit/kimono/earth
)
- gear_tweaks += new/datum/gear_tweak/path(kimonos)
\ No newline at end of file
+ gear_tweaks += new/datum/gear_tweak/path(kimonos)
diff --git a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm
index 12bf14ad2fe..75697053aad 100644
--- a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm
@@ -124,3 +124,22 @@ Talon winter coat
display_name = "hazard vest, atmospherics"
path = /obj/item/clothing/suit/storage/hazardvest/atmos
allowed_roles = list("Chief Engineer","Atmospheric Technician", "Engineer")
+
+//Long fur coat
+/datum/gear/suit/russofurcoat
+ display_name = "long fur coat"
+ path = /obj/item/clothing/suit/storage/vest/hoscoat/russofurcoat
+
+//Colorable Hoodie
+
+/datum/gear/suit/hoodie_vr
+ display_name = "hoodie with hood (colorable)"
+ path = /obj/item/clothing/suit/storage/hooded/hoodie
+
+/datum/gear/suit/hoodie_vr/New()
+ var/list/hoodies = list()
+ for(var/hoodie_style in typesof(/obj/item/clothing/suit/storage/hooded/hoodie))
+ var/obj/item/clothing/suit/storage/toggle/hoodie/hoodie = hoodie_style
+ hoodies[initial(hoodie.name)] = hoodie
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(hoodies))
+ gear_tweaks += gear_tweak_free_color_choice
diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm
index ccd61969484..28c41037998 100644
--- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm
@@ -91,7 +91,7 @@
/datum/gear/uniform/pants/New()
..()
var/list/pants = list()
- for(var/obj/item/clothing/under/pants/pant_type as anything in typesof(/obj/item/clothing/under/pants))
+ for(var/obj/item/clothing/under/pants/pant_type as anything in (typesof(/obj/item/clothing/under/pants) - typesof(/obj/item/clothing/under/pants/altevian)))
pants[initial(pant_type.name)] = pant_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(pants))
diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm
index ab32d3c2f3f..09cc1b5d066 100644
--- a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm
@@ -36,7 +36,7 @@
/datum/gear/uniform/job_khi/med
display_name = "khi uniform, med"
path = /obj/item/clothing/under/rank/khi/med
- allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Field Medic")
+ allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Field Medic","Psychiatrist")
/datum/gear/uniform/job_khi/eng
display_name = "khi uniform, eng"
@@ -280,3 +280,15 @@ Talon jumpsuit
display_name = "undersuit, command (SM/HoP)"
allowed_roles = list("Site Manager", "Head of Personnel")
path = /obj/item/clothing/under/undersuit/command
+
+//Altevian Uniforms
+/datum/gear/uniform/altevian
+ description = "An extremely comfortable set of clothing that's made to help people handle their day to day work around the fleets with little to no discomfort."
+ display_name = "altevian uniform selection"
+
+/datum/gear/uniform/altevian/New()
+ ..()
+ var/list/pants = list()
+ for(var/obj/item/clothing/under/pants/altevian/pants_type as anything in typesof(/obj/item/clothing/under/pants/altevian))
+ pants[initial(pants_type.name)] = pants_type
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(pants))
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm
index 4a945f442c2..3d2dcb20a41 100644
--- a/code/modules/client/preference_setup/loadout/loadout_utility.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm
@@ -72,9 +72,13 @@
path = /obj/item/weapon/folder/yellow
/datum/gear/utility/paicard
- display_name = "personal AI device"
+ display_name = "personal AI device (classic)"
path = /obj/item/device/paicard
+/datum/gear/utility/paicard_b
+ display_name = "personal AI device (new)"
+ path = /obj/item/device/paicard/typeb
+
/datum/gear/utility/securecase
display_name = "secure briefcase"
path =/obj/item/weapon/storage/secure/briefcase
diff --git a/code/modules/client/preference_setup/loadout/loadout_utility_vr.dm b/code/modules/client/preference_setup/loadout/loadout_utility_vr.dm
index 1d30864d520..5b5a4e5598e 100644
--- a/code/modules/client/preference_setup/loadout/loadout_utility_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_utility_vr.dm
@@ -74,3 +74,8 @@
display_name = "bluespace bracelet"
path = /obj/item/clothing/gloves/bluespace
cost = 5
+
+/datum/gear/utility/walkpod
+ display_name = "podzu music player"
+ path = /obj/item/device/walkpod
+ cost = 2
diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno.dm b/code/modules/client/preference_setup/loadout/loadout_xeno.dm
index 59d2ab00022..3c46d70eeca 100644
--- a/code/modules/client/preference_setup/loadout/loadout_xeno.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_xeno.dm
@@ -167,9 +167,9 @@
sort_category = "Xenowear"
/datum/gear/uniform/dept/undercoat/cap
- display_name = "facility director undercoat (Teshari)"
+ display_name = "site manager undercoat (Teshari)"
path = /obj/item/clothing/under/teshari/undercoat/jobs/cap
- allowed_roles = list("Facility Director")
+ allowed_roles = list("Site Manager")
/datum/gear/uniform/dept/undercoat/hop
display_name = "head of personnel undercoat (Teshari)"
@@ -276,9 +276,9 @@
sort_category = "Xenowear"
/datum/gear/suit/dept/cloak/cap
- display_name = "facility director cloak (Teshari)"
+ display_name = "site manager cloak (Teshari)"
path = /obj/item/clothing/suit/storage/teshari/cloak/jobs
- allowed_roles = list("Facility Director")
+ allowed_roles = list("Site Manager")
/datum/gear/suit/dept/cloak/hop
display_name = "head of personnel cloak (Teshari)"
diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm
index f4440117c45..17ee5ed6728 100644
--- a/code/modules/client/preference_setup/preference_setup.dm
+++ b/code/modules/client/preference_setup/preference_setup.dm
@@ -232,6 +232,10 @@
return 1
. = OnTopic(href, href_list, usr)
+
+ if(!pref_mob || !pref_mob.client) // Just in case we disappeared during OnTopic
+ return 1
+
if(. & TOPIC_UPDATE_PREVIEW)
pref_mob.client.prefs.update_preview_icon()
if(. & TOPIC_REFRESH)
diff --git a/code/modules/client/preference_setup/volume_sliders/01_volume.dm b/code/modules/client/preference_setup/volume_sliders/01_volume.dm
index 90c0b227c08..7dea5d2053e 100644
--- a/code/modules/client/preference_setup/volume_sliders/01_volume.dm
+++ b/code/modules/client/preference_setup/volume_sliders/01_volume.dm
@@ -40,7 +40,7 @@
var/channel = href_list["change_volume"]
if(!(channel in pref.volume_channels))
pref.volume_channels["[channel]"] = 1
- var/value = input(usr, "Choose your volume for [channel] (0-200%)", "[channel] volume", (pref.volume_channels[channel] * 100))
+ var/value = tgui_input_number(usr, "Choose your volume for [channel] (0-200%)", "[channel] volume", (pref.volume_channels[channel] * 100), 200, 0)
if(isnum(value))
value = CLAMP(value, 0, 200)
pref.volume_channels["[channel]"] = (value / 100)
diff --git a/code/modules/client/preference_setup/volume_sliders/02_media.dm b/code/modules/client/preference_setup/volume_sliders/02_media.dm
index 3fbb972ad2c..98f7bb4cfed 100644
--- a/code/modules/client/preference_setup/volume_sliders/02_media.dm
+++ b/code/modules/client/preference_setup/volume_sliders/02_media.dm
@@ -33,7 +33,7 @@
/datum/category_item/player_setup_item/volume_sliders/media/OnTopic(var/href, var/list/href_list, var/mob/user)
if(href_list["change_media_volume"])
if(CanUseTopic(user))
- var/value = input(usr, "Choose your Jukebox volume (0-100%)", "Jukebox volume", round(pref.media_volume * 100))
+ var/value = tgui_input_number(usr, "Choose your Jukebox volume (0-100%)", "Jukebox volume", round(pref.media_volume * 100), 100, 0)
if(isnum(value))
value = CLAMP(value, 0, 100)
pref.media_volume = value/100.0
diff --git a/code/modules/client/preference_setup/vore/02_size.dm b/code/modules/client/preference_setup/vore/02_size.dm
index 95a944e9318..8cfd64c47d7 100644
--- a/code/modules/client/preference_setup/vore/02_size.dm
+++ b/code/modules/client/preference_setup/vore/02_size.dm
@@ -3,6 +3,8 @@
#define WEIGHT_MAX 500
#define WEIGHT_CHANGE_MIN 0
#define WEIGHT_CHANGE_MAX 100
+#define MAX_VOICE_FREQ 70000
+#define MIN_VOICE_FREQ 15000
// Define a place to save in character setup
/datum/preferences
@@ -12,6 +14,8 @@
var/weight_gain = 100 // Weight gain rate.
var/weight_loss = 50 // Weight loss rate.
var/fuzzy = 0 // Preference toggle for sharp/fuzzy icon. Default sharp.
+ var/voice_freq = 0
+ var/voice_sound = "beep-boop"
// Definition of the stuff for Sizing
/datum/category_item/player_setup_item/vore/size
@@ -24,6 +28,8 @@
S["weight_gain"] >> pref.weight_gain
S["weight_loss"] >> pref.weight_loss
S["fuzzy"] >> pref.fuzzy
+ S["voice_freq"] >> pref.voice_freq
+ S["voice_sound"] >> pref.voice_sound
/datum/category_item/player_setup_item/vore/size/save_character(var/savefile/S)
S["size_multiplier"] << pref.size_multiplier
@@ -31,12 +37,16 @@
S["weight_gain"] << pref.weight_gain
S["weight_loss"] << pref.weight_loss
S["fuzzy"] << pref.fuzzy
+ S["voice_freq"] << pref.voice_freq
+ S["voice_sound"] << pref.voice_sound
/datum/category_item/player_setup_item/vore/size/sanitize_character()
pref.weight_vr = sanitize_integer(pref.weight_vr, WEIGHT_MIN, WEIGHT_MAX, initial(pref.weight_vr))
pref.weight_gain = sanitize_integer(pref.weight_gain, WEIGHT_CHANGE_MIN, WEIGHT_CHANGE_MAX, initial(pref.weight_gain))
pref.weight_loss = sanitize_integer(pref.weight_loss, WEIGHT_CHANGE_MIN, WEIGHT_CHANGE_MAX, initial(pref.weight_loss))
pref.fuzzy = sanitize_integer(pref.fuzzy, 0, 1, initial(pref.fuzzy))
+ if(pref.voice_freq != 0)
+ pref.voice_freq = sanitize_integer(pref.voice_freq, MIN_VOICE_FREQ, MAX_VOICE_FREQ, initial(pref.fuzzy))
if(pref.size_multiplier == null || pref.size_multiplier < RESIZE_TINY || pref.size_multiplier > RESIZE_HUGE)
pref.size_multiplier = initial(pref.size_multiplier)
@@ -45,12 +55,47 @@
character.weight_gain = pref.weight_gain
character.weight_loss = pref.weight_loss
character.fuzzy = pref.fuzzy
+ character.voice_freq = pref.voice_freq
character.resize(pref.size_multiplier, animate = FALSE, ignore_prefs = TRUE)
+ if(!pref.voice_sound)
+ character.voice_sounds_list = talk_sound
+ else
+ switch(pref.voice_sound)
+ if("beep-boop")
+ character.voice_sounds_list = talk_sound
+ if("goon speak 1")
+ character.voice_sounds_list = goon_speak_one_sound
+ if("goon speak 2")
+ character.voice_sounds_list = goon_speak_two_sound
+ if("goon speak 3")
+ character.voice_sounds_list = goon_speak_three_sound
+ if("goon speak 4")
+ character.voice_sounds_list = goon_speak_four_sound
+ if("goon speak blub")
+ character.voice_sounds_list = goon_speak_blub_sound
+ if("goon speak bottalk")
+ character.voice_sounds_list = goon_speak_bottalk_sound
+ if("goon speak buwoo")
+ character.voice_sounds_list = goon_speak_buwoo_sound
+ if("goon speak cow")
+ character.voice_sounds_list = goon_speak_cow_sound
+ if("goon speak lizard")
+ character.voice_sounds_list = goon_speak_lizard_sound
+ if("goon speak pug")
+ character.voice_sounds_list = goon_speak_pug_sound
+ if("goon speak pugg")
+ character.voice_sounds_list = goon_speak_pugg_sound
+ if("goon speak roach")
+ character.voice_sounds_list = goon_speak_roach_sound
+ if("goon speak skelly")
+ character.voice_sounds_list = goon_speak_skelly_sound
/datum/category_item/player_setup_item/vore/size/content(var/mob/user)
. += " "
. += "Scale: [round(pref.size_multiplier*100)]% "
. += "Scaled Appearance: [pref.fuzzy ? "Fuzzy" : "Sharp"] "
+ . += "Voice Frequency: [pref.voice_freq] "
+ . += "Voice Sounds: [pref.voice_sound] "
. += " "
. += "Relative Weight: [pref.weight_vr] "
. += "Weight Gain Rate: [pref.weight_gain] "
@@ -58,7 +103,7 @@
/datum/category_item/player_setup_item/vore/size/OnTopic(var/href, var/list/href_list, var/mob/user)
if(href_list["size_multiplier"])
- var/new_size = input(user, "Choose your character's size, ranging from 25% to 200%", "Set Size") as num|null
+ var/new_size = tgui_input_number(user, "Choose your character's size, ranging from 25% to 200%", "Set Size", null, 200, 25)
if (!ISINRANGE(new_size,25,200))
pref.size_multiplier = 1
to_chat(user, "Invalid size.")
@@ -72,11 +117,11 @@
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["weight"])
- var/new_weight = input(user, "Choose your character's relative body weight.\n\
+ var/new_weight = tgui_input_number(user, "Choose your character's relative body weight.\n\
This measurement should be set relative to a normal 5'10'' person's body and not the actual size of your character.\n\
If you set your weight to 500 because you're a naga or have metal implants then complain that you're a blob I\n\
swear to god I will find you and I will punch you for not reading these directions!\n\
- ([WEIGHT_MIN]-[WEIGHT_MAX])", "Character Preference") as num|null
+ ([WEIGHT_MIN]-[WEIGHT_MAX])", "Character Preference", null, WEIGHT_MAX, WEIGHT_MIN)
if(new_weight)
var/unit_of_measurement = tgui_alert(user, "Is that number in pounds (lb) or kilograms (kg)?", "Confirmation", list("Pounds", "Kilograms"))
if(unit_of_measurement == "Pounds")
@@ -87,7 +132,7 @@
return TOPIC_REFRESH
else if(href_list["weight_gain"])
- var/weight_gain_rate = tgui_input_num(user, "Choose your character's rate of weight gain between 100% \
+ var/weight_gain_rate = tgui_input_number(user, "Choose your character's rate of weight gain between 100% \
(full realism body fat gain) and 0% (no body fat gain).\n\
(If you want to disable weight gain, set this to 0.01 to round it to 0%.)\
([WEIGHT_CHANGE_MIN]-[WEIGHT_CHANGE_MAX])", "Character Preference", pref.weight_gain)
@@ -96,7 +141,7 @@
return TOPIC_REFRESH
else if(href_list["weight_loss"])
- var/weight_loss_rate = tgui_input_num(user, "Choose your character's rate of weight loss between 100% \
+ var/weight_loss_rate = tgui_input_number(user, "Choose your character's rate of weight loss between 100% \
(full realism body fat loss) and 0% (no body fat loss).\n\
(If you want to disable weight loss, set this to 0.01 round it to 0%.)\
([WEIGHT_CHANGE_MIN]-[WEIGHT_CHANGE_MAX])", "Character Preference", pref.weight_loss)
@@ -104,4 +149,44 @@
pref.weight_loss = round(text2num(weight_loss_rate),1)
return TOPIC_REFRESH
+ else if(href_list["voice_freq"])
+ var/list/preset_voice_freqs = list("high" = MAX_VOICE_FREQ, "middle-high" = 56250, "middle" = 42500, "middle-low"= 28750, "low" = MIN_VOICE_FREQ, "custom" = 1, "random" = 0)
+ var/choice = tgui_input_list(usr, "What would you like to set your voice frequency to? ([MIN_VOICE_FREQ] - [MAX_VOICE_FREQ])", "Voice Frequency", preset_voice_freqs)
+ if(!choice)
+ return
+ choice = preset_voice_freqs[choice]
+ if(choice == 0)
+ pref.voice_freq = choice
+ return TOPIC_REFRESH
+ else if(choice == 1)
+ choice = tgui_input_number(user, "Choose your character's voice frequency, ranging from [MIN_VOICE_FREQ] to [MAX_VOICE_FREQ]", "Custom Voice Frequency", null, MAX_VOICE_FREQ, MIN_VOICE_FREQ, round_value = TRUE)
+ if(choice > MAX_VOICE_FREQ)
+ choice = MAX_VOICE_FREQ
+ else if(choice < MIN_VOICE_FREQ)
+ choice = MIN_VOICE_FREQ
+
+ pref.voice_freq = choice
+ return TOPIC_REFRESH
+ else if(href_list["voice_sounds_list"])
+ var/list/possible_voice_types = list(
+ "beep-boop",
+ "goon speak 1",
+ "goon speak 2",
+ "goon speak 3",
+ "goon speak 4",
+ "goon speak blub",
+ "goon speak bottalk",
+ "goon speak buwoo",
+ "goon speak cow",
+ "goon speak lizard",
+ "goon speak pug",
+ "goon speak pugg",
+ "goon speak roach",
+ "goon speak skelly")
+ var/choice = tgui_input_list(usr, "Which set of sounds would you like to use for your character's speech sounds?", "Voice Sounds", possible_voice_types)
+ if(!choice)
+ pref.voice_sound = "beep-boop"
+ else
+ pref.voice_sound = choice
+
return ..();
diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm
index 931a3c1f583..e6a1652d808 100644
--- a/code/modules/client/preference_setup/vore/07_traits.dm
+++ b/code/modules/client/preference_setup/vore/07_traits.dm
@@ -20,7 +20,7 @@
var/list/neg_traits = list()
var/traits_cheating = 0 //Varedit by admins allows saving new maximums on people who apply/etc
- var/starting_trait_points = STARTING_SPECIES_POINTS
+ var/starting_trait_points = 0
var/max_traits = MAX_SPECIES_TRAITS
var/dirty_synth = 0 //Are you a synth
var/gross_meatbag = 0 //Where'd I leave my Voight-Kampff test kit?
@@ -72,7 +72,11 @@
pref.blood_color = sanitize_hexcolor(pref.blood_color, default="#A10808")
if(!pref.traits_cheating)
- pref.starting_trait_points = STARTING_SPECIES_POINTS
+ var/datum/species/S = GLOB.all_species[pref.species]
+ if(S)
+ pref.starting_trait_points = S.trait_points
+ else
+ pref.starting_trait_points = 0
pref.max_traits = MAX_SPECIES_TRAITS
if(pref.organ_data[O_BRAIN]) //Checking if we have a synth on our hands, boys.
@@ -82,14 +86,14 @@
pref.gross_meatbag = 1
pref.dirty_synth = 0
- if(pref.species != SPECIES_CUSTOM)
- pref.pos_traits.Cut()
- pref.neg_traits.Cut()
// Clean up positive traits
for(var/datum/trait/path as anything in pref.pos_traits)
if(!(path in positive_traits))
pref.pos_traits -= path
continue
+ if(!(pref.species == SPECIES_CUSTOM) && !(path in everyone_traits_positive))
+ pref.pos_traits -= path
+ continue
var/take_flags = initial(path.can_take)
if((pref.dirty_synth && !(take_flags & SYNTHETICS)) || (pref.gross_meatbag && !(take_flags & ORGANICS)))
pref.pos_traits -= path
@@ -98,7 +102,7 @@
if(!(path in neutral_traits))
pref.neu_traits -= path
continue
- if(!(pref.species == SPECIES_CUSTOM) && !(path in everyone_traits))
+ if(!(pref.species == SPECIES_CUSTOM) && !(path in everyone_traits_neutral))
pref.neu_traits -= path
continue
var/take_flags = initial(path.can_take)
@@ -109,6 +113,9 @@
if(!(path in negative_traits))
pref.neg_traits -= path
continue
+ if(!(pref.species == SPECIES_CUSTOM) && !(path in everyone_traits_negative))
+ pref.neg_traits -= path
+ continue
var/take_flags = initial(path.can_take)
if((pref.dirty_synth && !(take_flags & SYNTHETICS)) || (pref.gross_meatbag && !(take_flags & ORGANICS)))
pref.neg_traits -= path
@@ -141,6 +148,9 @@
var/datum/species/S = character.species
var/datum/species/new_S = S.produceCopy(pref.pos_traits + pref.neu_traits + pref.neg_traits, character, pref.custom_base)
+ for(var/datum/trait/T in new_S.traits)
+ T.apply_pref(src)
+
//Any additional non-trait settings can be applied here
new_S.blood_color = pref.blood_color
@@ -148,8 +158,6 @@
//Statistics for this would be nice
var/english_traits = english_list(new_S.traits, and_text = ";", comma_text = ";")
log_game("TRAITS [pref.client_ckey]/([character]) with: [english_traits]") //Terrible 'fake' key_name()... but they aren't in the same entity yet
- else
-
/datum/category_item/player_setup_item/vore/traits/content(var/mob/user)
. += "Custom Species Name: "
@@ -162,36 +170,38 @@
var/traits_left = pref.max_traits
- if(pref.species == SPECIES_CUSTOM)
- var/points_left = pref.starting_trait_points
- for(var/T in pref.pos_traits + pref.neg_traits)
- points_left -= traits_costs[T]
- traits_left--
- . += "Traits Left: [traits_left] "
- . += "Points Left: [points_left] "
- if(points_left < 0 || traits_left < 0 || !pref.custom_species)
- . += "^ Fix things! ^ "
+ var/points_left = pref.starting_trait_points
- . += "Positive Trait + "
- . += ""
+ for(var/T in pref.pos_traits + pref.neg_traits)
+ points_left -= traits_costs[T]
+ traits_left--
+ . += "Traits Left: [traits_left] "
+ . += "Points Left: [points_left] "
+ if(points_left < 0 || traits_left < 0 || (!pref.custom_species && pref.species == SPECIES_CUSTOM))
+ . += "^ Fix things! ^ "
+
+ . += "Positive Trait + "
+ . += ""
- . += "Negative Trait + "
- . += ""
. += "Neutral Trait + "
. += ""
+
+ . += "Negative Trait + "
+ . += ""
+
. += "Blood Color: " //People that want to use a certain species to have that species traits (xenochimera/promethean/spider) should be able to set their own blood color.
. += "Set Color"
. += "R "
@@ -219,8 +229,8 @@
return TOPIC_NOACTION
else if(href_list["custom_species"])
- var/raw_choice = sanitize(input(user, "Input your custom species name:",
- "Character Preference", pref.custom_species) as null|text, MAX_NAME_LEN)
+ var/raw_choice = sanitize(tgui_input_text(user, "Input your custom species name:",
+ "Character Preference", pref.custom_species, MAX_NAME_LEN), MAX_NAME_LEN)
if (CanUseTopic(user))
pref.custom_species = raw_choice
return TOPIC_REFRESH
@@ -251,6 +261,8 @@
var/choice = tgui_alert(usr, "Remove [initial(trait.name)] and regain [initial(trait.cost)] points?","Remove Trait",list("Remove","Cancel"))
if(choice == "Remove")
pref.pos_traits -= trait
+ var/datum/trait/instance = all_traits[trait]
+ instance.remove_pref(pref)
return TOPIC_REFRESH
else if(href_list["clicked_neu_trait"])
@@ -258,6 +270,8 @@
var/choice = tgui_alert(usr, "Remove [initial(trait.name)]?","Remove Trait",list("Remove","Cancel"))
if(choice == "Remove")
pref.neu_traits -= trait
+ var/datum/trait/instance = all_traits[trait]
+ instance.remove_pref(pref)
return TOPIC_REFRESH
else if(href_list["clicked_neg_trait"])
@@ -265,28 +279,30 @@
var/choice = tgui_alert(usr, "Remove [initial(trait.name)] and lose [initial(trait.cost)] points?","Remove Trait",list("Remove","Cancel"))
if(choice == "Remove")
pref.neg_traits -= trait
+ var/datum/trait/instance = all_traits[trait]
+ instance.remove_pref(pref)
return TOPIC_REFRESH
else if(href_list["custom_say"])
- var/say_choice = sanitize(input(usr, "This word or phrase will appear instead of 'says': [pref.real_name] says, \"Hi.\"", "Custom Say", pref.custom_say) as null|text, 12)
+ var/say_choice = sanitize(tgui_input_text(usr, "This word or phrase will appear instead of 'says': [pref.real_name] says, \"Hi.\"", "Custom Say", pref.custom_say, 12), 12)
if(say_choice)
pref.custom_say = say_choice
return TOPIC_REFRESH
else if(href_list["custom_whisper"])
- var/whisper_choice = sanitize(input(usr, "This word or phrase will appear instead of 'whispers': [pref.real_name] whispers, \"Hi...\"", "Custom Whisper", pref.custom_whisper) as null|text, 12)
+ var/whisper_choice = sanitize(tgui_input_text(usr, "This word or phrase will appear instead of 'whispers': [pref.real_name] whispers, \"Hi...\"", "Custom Whisper", pref.custom_whisper, 12), 12)
if(whisper_choice)
pref.custom_whisper = whisper_choice
return TOPIC_REFRESH
else if(href_list["custom_ask"])
- var/ask_choice = sanitize(input(usr, "This word or phrase will appear instead of 'asks': [pref.real_name] asks, \"Hi?\"", "Custom Ask", pref.custom_ask) as null|text, 12)
+ var/ask_choice = sanitize(tgui_input_text(usr, "This word or phrase will appear instead of 'asks': [pref.real_name] asks, \"Hi?\"", "Custom Ask", pref.custom_ask, 12), 12)
if(ask_choice)
pref.custom_ask = ask_choice
return TOPIC_REFRESH
else if(href_list["custom_exclaim"])
- var/exclaim_choice = sanitize(input(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [pref.real_name] exclaims, \"Hi!\"", "Custom Exclaim", pref.custom_exclaim) as null|text, 12)
+ var/exclaim_choice = sanitize(tgui_input_text(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [pref.real_name] exclaims, \"Hi!\"", "Custom Exclaim", pref.custom_exclaim, 12), 12)
if(exclaim_choice)
pref.custom_exclaim = exclaim_choice
return TOPIC_REFRESH
@@ -321,18 +337,26 @@
var/list/mylist
switch(mode)
if(POSITIVE_MODE)
- picklist = positive_traits.Copy() - pref.pos_traits
- mylist = pref.pos_traits
+ if(pref.species == SPECIES_CUSTOM)
+ picklist = positive_traits.Copy() - pref.pos_traits
+ mylist = pref.pos_traits
+ else
+ picklist = everyone_traits_positive.Copy() - pref.pos_traits
+ mylist = pref.pos_traits
if(NEUTRAL_MODE)
if(pref.species == SPECIES_CUSTOM)
picklist = neutral_traits.Copy() - pref.neu_traits
mylist = pref.neu_traits
else
- picklist = everyone_traits.Copy() - pref.neu_traits
+ picklist = everyone_traits_neutral.Copy() - pref.neu_traits
mylist = pref.neu_traits
if(NEGATIVE_MODE)
- picklist = negative_traits.Copy() - pref.neg_traits
- mylist = pref.neg_traits
+ if(pref.species == SPECIES_CUSTOM)
+ picklist = negative_traits.Copy() - pref.neg_traits
+ mylist = pref.neg_traits
+ else
+ picklist = everyone_traits_negative.Copy() - pref.neg_traits
+ mylist = pref.neg_traits
else
if(isnull(picklist))
@@ -417,10 +441,16 @@
conflict = instance_test.name
break varconflict
+ for(var/V in instance.var_changes_pref)
+ if(V in instance_test.var_changes_pref)
+ conflict = instance_test.name
+ break varconflict
+
if(conflict)
tgui_alert_async(usr, "You cannot take this trait and [conflict] at the same time. Please remove that trait, or pick another trait to add.", "Error")
return TOPIC_REFRESH
+ instance.apply_pref(pref)
mylist += path
return TOPIC_REFRESH
diff --git a/code/modules/client/preference_setup/vore/09_misc.dm b/code/modules/client/preference_setup/vore/09_misc.dm
index fff3bb6af48..94fe6b01532 100644
--- a/code/modules/client/preference_setup/vore/09_misc.dm
+++ b/code/modules/client/preference_setup/vore/09_misc.dm
@@ -58,7 +58,7 @@
pref.directory_erptag = new_erptag
return TOPIC_REFRESH
else if(href_list["directory_ad"])
- var/msg = sanitize(input(user,"Write your advertisement here!", "Flavor Text", html_decode(pref.directory_ad)) as message, extra = 0) //VOREStation Edit: separating out OOC notes
+ var/msg = sanitize(tgui_input_text(user,"Write your advertisement here!", "Flavor Text", html_decode(pref.directory_ad), multiline = TRUE, prevent_enter = TRUE), extra = 0) //VOREStation Edit: separating out OOC notes
pref.directory_ad = msg
return TOPIC_REFRESH
else if(href_list["toggle_sensor_setting"])
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index e4b7c74dcf4..8d23ca6e5f1 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -28,6 +28,9 @@ var/list/preferences_datums = list()
var/tgui_fancy = TRUE
var/tgui_lock = FALSE
+ var/tgui_input_mode = FALSE // All the Input Boxes (Text,Number,List,Alert)
+ var/tgui_large_buttons = TRUE
+ var/tgui_swapped_buttons = FALSE
//character preferences
var/real_name //our character's name
@@ -60,7 +63,8 @@ var/list/preferences_datums = list()
var/species = SPECIES_HUMAN //Species datum to use.
var/species_preview //Used for the species selection window.
var/list/alternate_languages = list() //Secondary language(s)
- var/list/language_prefixes = list() //Kanguage prefix keys
+ var/list/language_prefixes = list() //Language prefix keys
+ var/list/language_custom_keys = list() //Language custom call keys
var/list/gear //Left in for Legacy reasons, will no longer save.
var/list/gear_list = list() //Custom/fluff item loadouts.
var/gear_slot = 1 //The current gear save slot
@@ -423,12 +427,12 @@ var/list/preferences_datums = list()
selecting_slots = FALSE
if(!choice)
return
-
+
var/slotnum = charlist[choice]
if(!slotnum)
error("Player picked [choice] slot to load, but that wasn't one we sent.")
return
-
+
load_character(slotnum)
attempt_vr(user.client?.prefs_vr,"load_vore","") //VOREStation Edit
sanitize_preferences()
@@ -463,12 +467,12 @@ var/list/preferences_datums = list()
selecting_slots = FALSE
if(!choice)
return
-
+
var/slotnum = charlist[choice]
if(!slotnum)
error("Player picked [choice] slot to copy to, but that wasn't one we sent.")
return
-
+
overwrite_character(slotnum)
sanitize_preferences()
ShowChoices(user)
diff --git a/code/modules/client/preferences_toggle_procs.dm b/code/modules/client/preferences_toggle_procs.dm
index d928b39c2e2..23287182e80 100644
--- a/code/modules/client/preferences_toggle_procs.dm
+++ b/code/modules/client/preferences_toggle_procs.dm
@@ -406,6 +406,58 @@
feedback_add_details("admin_verb","TRadioSounds")
+/client/verb/toggle_say_sounds()
+ set name = "Sound-Toggle-Say"
+ set category = "Preferences"
+ set desc = "Toggle hearing a sound when somebody speaks using say."
+
+ var/pref_path = /datum/client_preference/say_sounds
+ toggle_preference(pref_path)
+ SScharacter_setup.queue_preferences_save(prefs)
+
+ to_chat(src, "You will now [(is_preference_enabled(/datum/client_preference/say_sounds)) ? "hear" : "not hear"] say sounds.")
+
+ feedback_add_details("admin_verb","TSaySounds")
+
+/client/verb/toggle_emote_sounds()
+ set name = "Sound-Toggle-Me"
+ set category = "Preferences"
+ set desc = "Toggle hearing a sound when somebody speaks using me ."
+
+ var/pref_path = /datum/client_preference/emote_sounds
+ toggle_preference(pref_path)
+ SScharacter_setup.queue_preferences_save(prefs)
+
+ to_chat(src, "You will now [(is_preference_enabled(/datum/client_preference/emote_sounds)) ? "hear" : "not hear"] me sounds.")
+
+ feedback_add_details("admin_verb","TMeSounds")
+
+/client/verb/toggle_whisper_sounds()
+ set name = "Sound-Toggle-Whisper"
+ set category = "Preferences"
+ set desc = "Toggle hearing a sound when somebody speaks using whisper."
+
+ var/pref_path = /datum/client_preference/whisper_sounds
+ toggle_preference(pref_path)
+ SScharacter_setup.queue_preferences_save(prefs)
+
+ to_chat(src, "You will now [(is_preference_enabled(/datum/client_preference/whisper_sounds)) ? "hear" : "not hear"] whisper sounds.")
+
+ feedback_add_details("admin_verb","TWhisperSounds")
+
+/client/verb/toggle_subtle_sounds()
+ set name = "Sound-Toggle-Subtle"
+ set category = "Preferences"
+ set desc = "Toggle hearing a sound when somebody uses subtle."
+
+ var/pref_path = /datum/client_preference/subtle_sounds
+ toggle_preference(pref_path)
+ SScharacter_setup.queue_preferences_save(prefs)
+
+ to_chat(src, "You will now [(is_preference_enabled(/datum/client_preference/subtle_sounds)) ? "hear" : "not hear"] subtle sounds.")
+
+ feedback_add_details("admin_verb","TSubtleSounds")
+
// Not attached to a pref datum because those are strict binary toggles
/client/verb/toggle_examine_mode()
set name = "Toggle Examine Mode"
diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm
index db77b0ba6ee..2241246dd0d 100644
--- a/code/modules/client/preferences_vr.dm
+++ b/code/modules/client/preferences_vr.dm
@@ -104,4 +104,19 @@
L.capture_crystal = prefs.capture_crystal
SScharacter_setup.queue_preferences_save(prefs)
- feedback_add_details("admin_verb","TCaptureCrystal") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
\ No newline at end of file
+ feedback_add_details("admin_verb","TCaptureCrystal") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/toggle_mentorhelp_ping()
+ set name = "Toggle Mentorhelp Ping"
+ set category = "Preferences"
+ set desc = "Toggles the mentorhelp ping"
+
+ var/pref_path = /datum/client_preference/play_mentorhelp_ping
+
+ toggle_preference(pref_path)
+
+ to_chat(src, "Mentorhelp pings are now [ is_preference_enabled(pref_path) ? "enabled" : "disabled"]")
+
+ SScharacter_setup.queue_preferences_save(prefs)
+
+ feedback_add_details("admin_verb", "TSoundMentorhelps")
\ No newline at end of file
diff --git a/code/modules/client/stored_item.dm b/code/modules/client/stored_item.dm
index fbc384e5a1f..6f2ff849ac4 100644
--- a/code/modules/client/stored_item.dm
+++ b/code/modules/client/stored_item.dm
@@ -35,7 +35,7 @@
var/savefile/F = new /savefile(path)
- if(!F) return 0
+ if(!F) return 0
var/persist_item
F["persist item"] >> persist_item
@@ -224,8 +224,6 @@
persist_storable = FALSE
/obj/item/weapon/gun/energy/sizegun/admin
persist_storable = FALSE
-/obj/item/weapon/gun/energy/sizegun/abductor
- persist_storable = FALSE
/obj/item/stack
persist_storable = FALSE
/obj/item/weapon/book
@@ -251,4 +249,8 @@
/obj/item/weapon/stock_parts
persist_storable = FALSE
/obj/item/weapon/rcd
+ persist_storable = FALSE
+/obj/item/weapon/spacecash
+ persist_storable = FALSE
+/obj/item/weapon/spacecasinocash
persist_storable = FALSE
\ No newline at end of file
diff --git a/code/modules/client/ui_style.dm b/code/modules/client/ui_style.dm
index 4b321f2f534..8317d977e3a 100644
--- a/code/modules/client/ui_style.dm
+++ b/code/modules/client/ui_style.dm
@@ -48,7 +48,7 @@ var/global/list/all_tooltip_styles = list(
var/UI_style_new = tgui_input_list(usr, "Select a style. White is recommended for customization", "UI Style Choice", all_ui_styles)
if(!UI_style_new) return
- var/UI_style_alpha_new = input(usr, "Select a new alpha (transparency) parameter for your UI, between 50 and 255") as null|num
+ var/UI_style_alpha_new = tgui_input_number(usr, "Select a new alpha (transparency) parameter for your UI, between 50 and 255", null, null, 255, 50)
if(!UI_style_alpha_new || !(UI_style_alpha_new <= 255 && UI_style_alpha_new >= 50)) return
var/UI_style_color_new = input(usr, "Choose your UI color. Dark colors are not recommended!") as color|null
diff --git a/code/modules/client/verbs/character_directory.dm b/code/modules/client/verbs/character_directory.dm
index fc003569d5e..8e7162cc783 100644
--- a/code/modules/client/verbs/character_directory.dm
+++ b/code/modules/client/verbs/character_directory.dm
@@ -137,7 +137,7 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
return
var/current_ad = usr.client.prefs.directory_ad
- var/new_ad = sanitize(input(usr, "Change your character ad", "Character Ad", current_ad) as message|null, extra = 0)
+ var/new_ad = sanitize(tgui_input_text(usr, "Change your character ad", "Character Ad", current_ad, multiline = TRUE, prevent_enter = TRUE), extra = 0)
if(isnull(new_ad))
return
usr.client.prefs.directory_ad = new_ad
diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm
index 52841c84648..9d2a3f064b9 100644
--- a/code/modules/client/verbs/suicide.dm
+++ b/code/modules/client/verbs/suicide.dm
@@ -78,6 +78,7 @@
adjustOxyLoss(max(getMaxHealth() * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
updatehealth()
+/*
/mob/living/silicon/pai/verb/suicide()
set category = "pAI Commands"
set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)"
@@ -91,4 +92,5 @@
M.show_message("[src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "[src] bleeps electronically.", 2)
death(0)
else
- to_chat(src, "Aborting suicide attempt.")
\ No newline at end of file
+ to_chat(src, "Aborting suicide attempt.")
+*/
\ No newline at end of file
diff --git a/code/modules/client/verbs/who.dm b/code/modules/client/verbs/who.dm
index 445acdc1c7c..ab646448c2f 100644
--- a/code/modules/client/verbs/who.dm
+++ b/code/modules/client/verbs/who.dm
@@ -83,7 +83,7 @@
else if(check_rights(R_STEALTH, FALSE, C)) // event managers //VOREStation Edit: Retired Staff
category = R_EVENT
num_event_managers_online++
-
+
temp += "\t[C] is a [C.holder.rank]"
if(holder)
if(C.holder.fakekey)
@@ -121,6 +121,28 @@
if(config.show_event_managers)
msg += "\n Current Miscellaneous ([num_event_managers_online]):\n" + eventMmsg
+ var/num_mentors_online = 0
+ var/mmsg = ""
+
+ for(var/client/C in GLOB.mentors)
+ num_mentors_online++
+ mmsg += "\t[C] is a Mentor"
+ if(holder)
+ if(isobserver(C.mob))
+ mmsg += " - Observing"
+ else if(istype(C.mob,/mob/new_player))
+ mmsg += " - Lobby"
+ else
+ mmsg += " - Playing"
+
+ if(C.is_afk())
+ var/seconds = C.last_activity_seconds()
+ mmsg += " (AFK - [round(seconds / 60)] minutes, [seconds % 60] seconds)"
+ mmsg += "\n"
+
+ if(config.show_mentors)
+ msg += "\n Current Mentors ([num_mentors_online]):\n" + mmsg
+
msg += "\nAdminhelps are also sent to Discord. If no admins are available in game try anyway and an admin on Discord may see it and respond."
to_chat(src, msg)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 31c7d999187..0ee3fb8452f 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -778,7 +778,7 @@
var/image/standing = ..()
if(taurized) //Special snowflake var on suits
standing.pixel_x = -16
- standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody.
+ standing.layer = BODY_LAYER + 16 // 16 is above tail layer, so will not be covered by taurbody.
return standing
/obj/item/clothing/suit/apply_accessories(var/image/standing)
diff --git a/code/modules/clothing/clothing_vr.dm b/code/modules/clothing/clothing_vr.dm
index 084e1b577df..fe3f99c9474 100644
--- a/code/modules/clothing/clothing_vr.dm
+++ b/code/modules/clothing/clothing_vr.dm
@@ -35,6 +35,8 @@
if(istype(I,/obj/item/weapon/holder/micro))
var/full = 0
for(var/mob/M in src)
+ if(istype(M,/mob/living/voice)) //Don't count voices as people!
+ continue
full++
if(full >= 2)
to_chat(user, "You can't fit anyone else into \the [src]!")
@@ -51,6 +53,8 @@
/obj/item/clothing/shoes/attack_self(var/mob/user)
for(var/mob/M in src)
+ if(istype(M,/mob/living/voice)) //Don't knock voices out!
+ continue
M.forceMove(get_turf(user))
to_chat(M, "[user] shakes you out of \the [src]!")
to_chat(user, "You shake [M] out of \the [src]!")
@@ -59,6 +63,8 @@
/obj/item/clothing/shoes/container_resist(mob/living/micro)
var/mob/living/carbon/human/macro = loc
+ if(istype(micro,/mob/living/voice)) //Voices shouldn't be able to resist but we have this here just in case.
+ return
if(!istype(macro))
to_chat(micro, "You start to climb out of [src]!")
if(do_after(micro, 50, src))
@@ -106,14 +112,20 @@
spawn(100)
recent_struggle = 0
- if(ishuman(src.loc))
+ if(ishuman(src.loc)) //Is this on a person?
var/mob/living/carbon/human/H = src.loc
- if(H.shoes == src)
+ if(istype(user,/mob/living/voice)) //Is this a possessed item? Spooky. It can move on it's own!
+ to_chat(H, "The [src] shifts about, almost as if squirming!")
+ to_chat(user, "You cause the [src] to shift against [H]'s form! Well, what little you can get to, given your current state!")
+ else if(H.shoes == src)
to_chat(H, "[user]'s tiny body presses against you in \the [src], squirming!")
to_chat(user, "Your body presses out against [H]'s form! Well, what little you can get to!")
else
to_chat(H, "[user]'s form shifts around in the \the [src], squirming!")
to_chat(user, "You move around inside the [src], to no avail.")
+ else if(istype(user,/mob/living/voice)) //Possessed!
+ src.visible_message("The [src] shifts about!")
+ to_chat(user, "You cause the [src] to shift about!")
else
src.visible_message("\The [src] moves a little!")
to_chat(user, "You throw yourself against the inside of \the [src]!")
diff --git a/code/modules/clothing/head/hood.dm b/code/modules/clothing/head/hood.dm
index 8f7f752ee01..4243b0fa27e 100644
--- a/code/modules/clothing/head/hood.dm
+++ b/code/modules/clothing/head/hood.dm
@@ -203,9 +203,16 @@
name = "techpriest hood"
desc = "A techpriest hood."
icon_state = "techpriesthood"
-
+
/obj/item/clothing/head/hood/siffet_hood
name = "siffet hood"
desc = "A hood that looks vaguely like a siffet's head. Guaranteed to traumatize your Promethean coworkers."
icon_state = "siffet"
item_state_slots = list(slot_r_hand_str = "siffet", slot_l_hand_str = "siffet")
+
+/obj/item/clothing/head/hood/hoodie
+ name = "hood"
+ desc = "The hood of a hoodie. Cosy!"
+ icon = 'icons/inventory/head/item_vr.dmi'
+ icon_override = 'icons/inventory/head/mob_vr.dmi'
+ icon_state = "hood_plain"
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 1ea6bdebfb8..29bd574d65b 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -8,6 +8,7 @@
/obj/item/clothing/head/hairnet
name = "hairnet"
desc = "A hairnet used to keep the hair out of the way and out of the food."
+ icon_state = "hairnet"
sprite_sheets = list(
SPECIES_TAJARAN = 'icons/inventory/head/mob_tajaran.dmi'
)
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index a734d178659..9e01dbac7fc 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -177,7 +177,7 @@
for(var/obj/item/piece in list(helmet,gloves,chest,boots))
if(!piece || piece.loc != wearer)
continue
- . += "[bicon(piece)] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed."
+ . += "\icon[piece][bicon(piece)] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed."
if(src.loc == usr)
. += "The access panel is [locked? "locked" : "unlocked"]."
diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm b/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm
index 19f30afb706..ac918a4bc84 100644
--- a/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm
@@ -12,7 +12,8 @@
SPECIES_FENNEC = 'icons/inventory/head/mob_vr_vulpkanin.dmi',
SPECIES_PROMETHEAN = 'icons/inventory/head/mob_skrell.dmi',
SPECIES_VOX = 'icons/inventory/head/mob_vox.dmi',
- SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi'
+ SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi',
+ SPECIES_ALTEVIAN = 'icons/inventory/head/mob_vr_altevian.dmi'
)
/obj/item/clothing/suit/space/rig
@@ -29,20 +30,21 @@
SPECIES_FENNEC = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',
SPECIES_PROMETHEAN = 'icons/inventory/suit/mob_skrell.dmi',
SPECIES_VOX = 'icons/inventory/suit/mob_vox.dmi',
- SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi'
+ SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi',
+ SPECIES_ALTEVIAN = 'icons/inventory/suit/mob_vr_altevian.dmi'
)
/obj/item/clothing/head/helmet/space/rig
- species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE, SPECIES_FENNEC, SPECIES_XENOHYBRID)
+ species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE, SPECIES_FENNEC, SPECIES_XENOHYBRID, SPECIES_ALTEVIAN)
/obj/item/clothing/gloves/gauntlets/rig
- species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE, SPECIES_FENNEC, SPECIES_XENOHYBRID)
+ species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE, SPECIES_FENNEC, SPECIES_XENOHYBRID, SPECIES_ALTEVIAN)
/obj/item/clothing/shoes/magboots/rig
- species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE, SPECIES_FENNEC, SPECIES_XENOHYBRID)
+ species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE, SPECIES_FENNEC, SPECIES_XENOHYBRID, SPECIES_ALTEVIAN)
/obj/item/clothing/suit/space/rig
- species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE, SPECIES_FENNEC, SPECIES_XENOHYBRID)
+ species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE, SPECIES_FENNEC, SPECIES_XENOHYBRID, SPECIES_ALTEVIAN)
/obj/item/clothing/shoes/magboots/rig/ce
name = "advanced boots"
diff --git a/code/modules/clothing/spacesuits/rig/suits/alien.dm b/code/modules/clothing/spacesuits/rig/suits/alien.dm
index 89d854b370b..3e301b6078f 100644
--- a/code/modules/clothing/spacesuits/rig/suits/alien.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/alien.dm
@@ -7,7 +7,7 @@
desc = "A cheap NT knock-off of an Unathi battle-rig. Looks like a fish, moves like a fish, steers like a cow."
suit_type = "\improper NT breacher"
icon_state = "breacher_rig_cheap"
- armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 70, bio = 100, rad = 50)
+ armor = list(melee = 60, bullet = 45, laser = 35, energy = 35, bomb = 70, bio = 100, rad = 50)
emp_protection = -20
slowdown = 6
offline_slowdown = 10
diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm
index fefb763b841..81c0c8e47d9 100644
--- a/code/modules/clothing/spacesuits/rig/suits/station.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/station.dm
@@ -248,6 +248,7 @@
slowdown = 0.5
offline_vision_restriction = 1
siemens_coefficient= 0.75
+ seal_delay = 5
helm_type = /obj/item/clothing/head/helmet/space/rig/medical
diff --git a/code/modules/clothing/spacesuits/void/ert_vr.dm b/code/modules/clothing/spacesuits/void/ert_vr.dm
index 0393b4ecf75..2f10083694b 100644
--- a/code/modules/clothing/spacesuits/void/ert_vr.dm
+++ b/code/modules/clothing/spacesuits/void/ert_vr.dm
@@ -6,7 +6,7 @@
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100)
slowdown = 0.5
siemens_coefficient = 0.5
- species_restricted = list("exclude",SPECIES_DIONA,SPECIES_VOX,SPECIES_TESHARI) //this thing can autoadapt
+ species_restricted = list("exclude",SPECIES_DIONA,SPECIES_VOX,SPECIES_TESHARI,SPECIES_ALTEVIAN) //this thing can autoadapt
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
w_class = ITEMSIZE_NORMAL //the mark vii packs itself down when not in use, thanks future-materials
@@ -107,7 +107,7 @@
desc = "As a vital part of the Mark VII suit, the integral helmet cannot be removed - so don't try."
icon_state = "erthelmet"
item_state = "erthelmet"
- species_restricted = list("exclude",SPECIES_DIONA,SPECIES_VOX,SPECIES_TESHARI) //this thing can autoadapt too
+ species_restricted = list("exclude",SPECIES_DIONA,SPECIES_VOX,SPECIES_TESHARI,SPECIES_ALTEVIAN) //this thing can autoadapt too
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100)
siemens_coefficient = 0.5
icon = 'icons/inventory/head/item_vr.dmi'
diff --git a/code/modules/clothing/suits/aliens/teshari.dm b/code/modules/clothing/suits/aliens/teshari.dm
index a8d8ec7102d..e17ef0e85e6 100644
--- a/code/modules/clothing/suits/aliens/teshari.dm
+++ b/code/modules/clothing/suits/aliens/teshari.dm
@@ -106,8 +106,8 @@
// Job Cloaks
/obj/item/clothing/suit/storage/teshari/cloak/jobs/cap
- name = "facility director cloak"
- desc = "A soft Teshari cloak made for the Facility Director"
+ name = "site manager cloak"
+ desc = "A soft Teshari cloak made for the Site Manager"
icon_state = "tesh_cloak_cap"
//Cargo
diff --git a/code/modules/clothing/suits/hooded.dm b/code/modules/clothing/suits/hooded.dm
index d3ea19e5fcc..13793daecab 100644
--- a/code/modules/clothing/suits/hooded.dm
+++ b/code/modules/clothing/suits/hooded.dm
@@ -60,6 +60,8 @@
hood.canremove = FALSE
icon_state = "[toggleicon]_t"
H.update_inv_wear_suit()
+ if(color != hood.color)
+ hood.color = color
else
RemoveHood()
@@ -139,7 +141,7 @@
allowed = list(/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes,
/obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask, /obj/item/device/suit_cooling_unit, /obj/item/weapon/gun/energy,
/obj/item/weapon/reagent_containers/spray/pepper, /obj/item/weapon/gun/projectile, /obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,
- /obj/item/weapon/handcuffs, /obj/item/clothing/head/helmet)
+ /obj/item/weapon/handcuffs, /obj/item/clothing/head/helmet, /obj/item/clothing/mask/gas)
/obj/item/clothing/suit/storage/hooded/wintercoat/security/hos
name = "head of security's winter coat"
@@ -150,7 +152,7 @@
allowed = list(/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes,
/obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask, /obj/item/device/suit_cooling_unit, /obj/item/weapon/gun/energy,
/obj/item/weapon/reagent_containers/spray/pepper, /obj/item/weapon/gun/projectile, /obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,
- /obj/item/weapon/handcuffs, /obj/item/clothing/head/helmet)
+ /obj/item/weapon/handcuffs, /obj/item/clothing/head/helmet, /obj/item/clothing/mask/gas)
/obj/item/clothing/suit/storage/hooded/wintercoat/medical
name = "medical winter coat"
@@ -163,7 +165,7 @@
/obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask, /obj/item/device/suit_cooling_unit, /obj/item/device/analyzer, /obj/item/stack/medical,
/obj/item/weapon/dnainjector, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/hypospray,
/obj/item/device/healthanalyzer, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/glass/beaker,
- /obj/item/weapon/reagent_containers/pill, /obj/item/weapon/storage/pill_bottle)
+ /obj/item/weapon/reagent_containers/pill, /obj/item/weapon/storage/pill_bottle, /obj/item/clothing/mask/gas)
/obj/item/clothing/suit/storage/hooded/wintercoat/medical/alt
name = "medical winter coat, alt"
@@ -210,7 +212,7 @@
/obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask, /obj/item/device/suit_cooling_unit, /obj/item/device/analyzer, /obj/item/stack/medical,
/obj/item/weapon/dnainjector, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/hypospray,
/obj/item/device/healthanalyzer, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/glass/beaker,
- /obj/item/weapon/reagent_containers/pill, /obj/item/weapon/storage/pill_bottle)
+ /obj/item/weapon/reagent_containers/pill, /obj/item/weapon/storage/pill_bottle, /obj/item/clothing/mask/gas)
/obj/item/clothing/suit/storage/hooded/wintercoat/science
name = "science winter coat"
@@ -249,7 +251,7 @@
allowed = list(/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes,
/obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask, /obj/item/device/suit_cooling_unit, /obj/item/device/analyzer, /obj/item/device/flashlight,
/obj/item/device/multitool, /obj/item/device/pipe_painter, /obj/item/device/radio, /obj/item/device/t_scanner, /obj/item/weapon/tool/crowbar, /obj/item/weapon/tool/screwdriver,
- /obj/item/weapon/weldingtool, /obj/item/weapon/tool/wirecutters, /obj/item/weapon/tool/wrench, /obj/item/weapon/tank/emergency/oxygen, /obj/item/clothing/mask/gas, /obj/item/taperoll/engineering)
+ /obj/item/weapon/weldingtool, /obj/item/weapon/tool/wirecutters, /obj/item/weapon/tool/wrench, /obj/item/weapon/tank/emergency/oxygen, /obj/item/clothing/mask/gas, /obj/item/taperoll/engineering, /obj/item/clothing/head/hardhat) //please engineers take your hardhat with you I beg of you
/obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos
name = "atmospherics winter coat"
@@ -300,7 +302,7 @@
hoodtype = /obj/item/clothing/head/hood/winter/cargo/miner
allowed = list(/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/storage/fancy/cigarettes,
/obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask, /obj/item/device/suit_cooling_unit,
- /obj/item/weapon/tank, /obj/item/device/radio, /obj/item/weapon/pickaxe, /obj/item/weapon/storage/bag/ore)
+ /obj/item/weapon/tank, /obj/item/device/radio, /obj/item/weapon/pickaxe, /obj/item/weapon/storage/bag/ore, /obj/item/clothing/mask/gas)
/obj/item/clothing/suit/storage/hooded/wintercoat/bar
name = "bartender winter coat"
diff --git a/code/modules/clothing/suits/hooded_vr.dm b/code/modules/clothing/suits/hooded_vr.dm
index cb279936aa4..4b79a4e3c08 100644
--- a/code/modules/clothing/suits/hooded_vr.dm
+++ b/code/modules/clothing/suits/hooded_vr.dm
@@ -78,3 +78,45 @@
icon_state = "taloncoat"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
hoodtype = /obj/item/clothing/head/hood/winter/talon
+
+//Functional hoodie
+
+/obj/item/clothing/suit/storage/hooded/hoodie
+ name = "hoodie"
+ desc = "A warm jacket, now featuring a hood!"
+ icon = 'icons/inventory/suit/item_vr.dmi'
+ icon_override = 'icons/inventory/suit/mob_vr.dmi'
+ icon_state = "hoodie_plain"
+ item_state_slots = list(slot_r_hand_str = "grey_hoodie", slot_l_hand_str = "grey_hoodie")
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
+ flags_inv = HIDEHOLSTER
+ cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
+ min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
+ hoodtype = /obj/item/clothing/head/hood/hoodie
+ allowed = list(/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes,
+ /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask, /obj/item/device/suit_cooling_unit)
+
+/obj/item/clothing/suit/storage/hooded/hoodie/redtrim
+ name = "red-trimmed hoodie"
+ desc = "A warm jacket, now featuring a hood and a bold red trim!"
+ icon_state = "hoodie_redtrim"
+
+/obj/item/clothing/suit/storage/hooded/hoodie/bluetrim
+ name = "blue-trimmed hoodie"
+ desc = "A warm jacket, now featuring a hood and a cool blue trim!"
+ icon_state = "hoodie_bluetrim"
+
+/obj/item/clothing/suit/storage/hooded/hoodie/greentrim
+ name = "green-trimmed hoodie"
+ desc = "A warm jacket, now featuring a hood and a chilled green trim!"
+ icon_state = "hoodie_greentrim"
+
+/obj/item/clothing/suit/storage/hooded/hoodie/purpletrim
+ name = "purple-trimmed hoodie"
+ desc = "A warm jacket, now featuring a hood and a smart purple trim!"
+ icon_state = "hoodie_purpletrim"
+
+/obj/item/clothing/suit/storage/hooded/hoodie/yellowtrim
+ name = "yellow-trimmed hoodie"
+ desc = "A warm jacket, now featuring a hood and an eye-catching yellow trim!"
+ icon_state = "hoodie_yellowtrim"
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 17b265ed9fe..d2ba4b26d96 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -35,7 +35,7 @@
flags_inv = HIDEHOLSTER
//Command
-/obj/item/clothing/suit/storage/cmddressjacket
+/obj/item/clothing/suit/storage/toggle/cmddressjacket
name = "command dress jacket"
desc = "A fancy dress jacket made for command staff. Makes you feel in charge."
icon_state = "cmddressjacket"
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index 18c399efbc7..5d0c531c5cc 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -6,7 +6,7 @@
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
flags_inv = HIDEHOLSTER
- allowed = list(/obj/item/device/analyzer,/obj/item/stack/medical,/obj/item/weapon/dnainjector,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/hypospray,/obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/paper)
+ allowed = list(/obj/item/device/analyzer,/obj/item/stack/medical,/obj/item/weapon/dnainjector,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/hypospray,/obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/paper, /obj/item/clothing/mask/gas)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0)
/obj/item/clothing/suit/storage/toggle/labcoat/red
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index b97ce91de65..60115e93712 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -280,6 +280,10 @@
name = "medal of exceptional heroism"
desc = "An extremely rare golden medal awarded only by high ranking officials. To recieve such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but distinguished veteran staff."
+/obj/item/clothing/accessory/medal/gold/casino
+ name = "medal of true lucky winner"
+ desc = "A gaudy golden medal with a logo of a casino engraved on top. The only achievement you had to earn this was great luck or great richness, neither of which is an achievement. Still, it instills a feeling of hope and smell of fresh bagels."
+
// Base type for 'medals' found in a "dungeon" submap, as a sort of trophy to celebrate the player's conquest.
/obj/item/clothing/accessory/medal/dungeon
diff --git a/code/modules/clothing/under/accessories/accessory_vr.dm b/code/modules/clothing/under/accessories/accessory_vr.dm
index 6032c968795..13b42366ded 100644
--- a/code/modules/clothing/under/accessories/accessory_vr.dm
+++ b/code/modules/clothing/under/accessories/accessory_vr.dm
@@ -167,7 +167,7 @@
var/new_frequency = sanitize_frequency(frequency + text2num(href_list["freq"]))
set_frequency(new_frequency)
if(href_list["tag"])
- var/str = copytext(reject_bad_text(input(usr,"Tag text?","Set tag","")),1,MAX_NAME_LEN)
+ var/str = copytext(reject_bad_text(tgui_input_text(usr,"Tag text?","Set tag","",MAX_NAME_LEN)),1,MAX_NAME_LEN)
if(!str || !length(str))
to_chat(usr,"[name]'s tag set to be blank.")
name = initial(name)
@@ -269,6 +269,13 @@
item_state = "collar_cowbell_overlay"
overlay_state = "collar_cowbell_overlay"
+/obj/item/clothing/accessory/collar/collarplanet_earth
+ name = "planet collar"
+ desc = "A collar featuring a surprisingly detailed replica of a earth-like planet surrounded by a weak battery powered force shield. There is a button to turn it off."
+ icon_state = "collarplanet_earth"
+ item_state = "collarplanet_earth"
+ overlay_state = "collarplanet_earth"
+
/obj/item/clothing/accessory/collar/holo
name = "Holo-collar"
@@ -293,7 +300,7 @@
return
to_chat(user,"You adjust the [name]'s tag.")
- var/str = copytext(reject_bad_text(input(user,"Tag text?","Set tag","")),1,MAX_NAME_LEN)
+ var/str = copytext(reject_bad_text(tgui_input_text(user,"Tag text?","Set tag","",MAX_NAME_LEN)),1,MAX_NAME_LEN)
if(!str || !length(str))
to_chat(user,"[name]'s tag set to be blank.")
@@ -330,7 +337,7 @@
if(!(istype(user.get_active_hand(),I)) || !(istype(user.get_inactive_hand(),src)) || (user.stat))
return
- var/str = copytext(reject_bad_text(input(user,"Tag text?","Set tag","")),1,MAX_NAME_LEN)
+ var/str = copytext(reject_bad_text(tgui_input_text(user,"Tag text?","Set tag","",MAX_NAME_LEN)),1,MAX_NAME_LEN)
if(!str || !length(str))
if(!writtenon)
@@ -384,27 +391,27 @@
item_state = "talonpin"
overlay_state = "talonpin"
-//Casino Slave Collar
+//Casino Sentient Prize Collar
-/obj/item/clothing/accessory/collar/casinoslave
- name = "a disabled Sentient Prize Collar"
+/obj/item/clothing/accessory/collar/casinosentientprize
+ name = "disabled Sentient Prize Collar"
desc = "A collar worn by sentient prizes registered to a SPASM. Although the red text on it shows its disconnected and nonfunctional."
icon_state = "casinoslave"
item_state = "casinoslave"
overlay_state = "casinoslave"
- var/slavename = null //Name for system to put on collar description
+ var/sentientprizename = null //Name for system to put on collar description
var/ownername = null //Name for system to put on collar description
- var/slaveckey = null //Ckey for system to check who is the person and ensure no abuse of system or errors
- var/slaveflavor = null //Description to show on the SPASM
- var/slaveooc = null //OOC text to show on the SPASM
+ var/sentientprizeckey = null //Ckey for system to check who is the person and ensure no abuse of system or errors
+ var/sentientprizeflavor = null //Description to show on the SPASM
+ var/sentientprizeooc = null //OOC text to show on the SPASM
-/obj/item/clothing/accessory/collar/casinoslave/attack_self(mob/user as mob)
+/obj/item/clothing/accessory/collar/casinosentientprize/attack_self(mob/user as mob)
//keeping it blank so people don't tag and reset collar status
-/obj/item/clothing/accessory/collar/casinoslave_fake
- name = "a Sentient Prize Collar"
+/obj/item/clothing/accessory/collar/casinosentientprize_fake
+ name = "Sentient Prize Collar"
desc = "A collar worn by sentient prizes registered to a SPASM. This one has been disconnected from the system and is now an accessory!"
icon_state = "casinoslave_owned"
diff --git a/code/modules/clothing/under/accessories/altevian_vr.dm b/code/modules/clothing/under/accessories/altevian_vr.dm
new file mode 100644
index 00000000000..ec3322d185b
--- /dev/null
+++ b/code/modules/clothing/under/accessories/altevian_vr.dm
@@ -0,0 +1,78 @@
+/obj/item/clothing/accessory/jacket/altevian
+ name = "Altevian Hegemony Civilian Jacket"
+ desc = "A form fitting jacket that looks more for fashion than for work with it leaving ones mid-riff exposed to the outside elements, but when looking so good it isn't really ones worry by that point! "
+ icon = 'icons/inventory/accessory/item_vr.dmi'
+ icon_override = 'icons/inventory/accessory/mob_vr.dmi'
+ icon_state = "altevian-jacket-civ"
+ item_state = "altevian-jacket-civ"
+ overlay_state = "altevian-jacket-civ"
+
+/obj/item/clothing/accessory/jacket/altevian/command
+ name = "Altevian Hegemony Command Jacket"
+ icon_state = "altevian-jacket-com"
+ item_state = "altevian-jacket-com"
+ overlay_state = "altevian-jacket-com"
+
+/obj/item/clothing/accessory/jacket/altevian/security
+ name = "Altevian Hegemony Security Jacket"
+ icon_state = "altevian-jacket-sec"
+ item_state = "altevian-jacket-sec"
+ overlay_state = "altevian-jacket-sec"
+
+/obj/item/clothing/accessory/jacket/altevian/medical
+ name = "Altevian Hegemony Command Jacket"
+ icon_state = "altevian-jacket-med"
+ item_state = "altevian-jacket-med"
+ overlay_state = "altevian-jacket-med"
+
+/obj/item/clothing/accessory/jacket/altevian/engineering
+ name = "Altevian Hegemony Engineering Jacket"
+ icon_state = "altevian-jacket-eng"
+ item_state = "altevian-jacket-eng"
+ overlay_state = "altevian-jacket-eng"
+
+/obj/item/clothing/accessory/jacket/altevian/science
+ name = "Altevian Hegemony Science Jacket"
+ icon_state = "altevian-jacket-sci"
+ item_state = "altevian-jacket-sci"
+ overlay_state = "altevian-jacket-sci"
+
+/obj/item/clothing/accessory/jacket/altevian/cargo
+ name = "Altevian Hegemony Cargo Jacket"
+ icon_state = "altevian-jacket-cargo"
+ item_state = "altevian-jacket-cargo"
+ overlay_state = "altevian-jacket-cargo"
+
+
+/obj/item/clothing/accessory/scarf/altevian
+ name = "Blue Comfortable Scarf"
+ desc = "A scarf made of synthetic material that would be common among a people who don't really have the leisure of organic crops for luxury goods. They seemed to of refined this process though and one wouldn't be able to tell the difference between it and ones made normally."
+ icon = 'icons/inventory/accessory/item_vr.dmi'
+ icon_override = 'icons/inventory/accessory/mob_vr.dmi'
+ icon_state = "altevian-scarf-blue"
+ item_state = "altevian-scarf-blue"
+ overlay_state = "altevian-scarf-blue"
+
+/obj/item/clothing/accessory/scarf/altevian/red
+ name = "Red Comfortable Scarf"
+ icon_state = "altevian-scarf-red"
+ item_state = "altevian-scarf-red"
+ overlay_state = "altevian-scarf-red"
+
+/obj/item/clothing/accessory/scarf/altevian/yellow
+ name = "Yellow Comfortable Scarf"
+ icon_state = "altevian-scarf-yellow"
+ item_state = "altevian-scarf-yellow"
+ overlay_state = "altevian-scarf-yellow"
+
+/obj/item/clothing/accessory/scarf/altevian/green
+ name = "Green Comfortable Scarf"
+ icon_state = "altevian-scarf-green"
+ item_state = "altevian-scarf-green"
+ overlay_state = "altevian-scarf-green"
+
+/obj/item/clothing/accessory/scarf/altevian/purple
+ name = "Purple Comfortable Scarf"
+ icon_state = "altevian-scarf-purple"
+ item_state = "altevian-scarf-purple"
+ overlay_state = "altevian-scarf-purple"
\ No newline at end of file
diff --git a/code/modules/clothing/under/accessories/badges_vr.dm b/code/modules/clothing/under/accessories/badges_vr.dm
index 2bdb5fa60ef..a3fa5e1fd5b 100644
--- a/code/modules/clothing/under/accessories/badges_vr.dm
+++ b/code/modules/clothing/under/accessories/badges_vr.dm
@@ -3,16 +3,12 @@
desc = "A small device used to measure body radiation and warning one after a certain threshold. \
Read manual before use! Can be held, attached to the uniform or worn around the neck."
w_class = ITEMSIZE_SMALL
-
icon = 'icons/inventory/accessory/item_vr.dmi'
icon_override = 'icons/inventory/accessory/item_vr.dmi'
-
icon_state = "dosimeter"
item_state = "dosimeter"
overlay_state = "dosimeter"
-
slot_flags = SLOT_TIE
-
var/obj/item/weapon/dosimeter_film/current_film = null
/obj/item/clothing/accessory/dosimeter/New()
@@ -80,19 +76,15 @@
current_film.icon_state = "dosimeter_film[tostate]"
else
icon_state = "[initial(icon_state)]-empty"
-
update_icon()
/obj/item/weapon/dosimeter_film
name = "dosimeter film"
desc = "These films can be inserted into dosimeters. It turns from white to black, depending on how much radiation it endured."
w_class = ITEMSIZE_SMALL
-
icon = 'icons/inventory/accessory/item_vr.dmi'
icon_override = 'icons/inventory/accessory/item_vr.dmi'
-
icon_state = "dosimeter_film0"
-
var/state = 0 //0 - White, 1 - Darker, 2 - Black (same as iconstates)
/obj/item/weapon/dosimeter_film/proc/update_state(var/tostate)
@@ -117,10 +109,13 @@
/obj/item/weapon/storage/box/dosimeter
name = "dosimeter case"
desc = "This case can only hold the Dosimeter, a few films and a manual."
+ icon = 'icons/inventory/accessory/item_vr.dmi'
+ icon_override = 'icons/inventory/accessory/item_vr.dmi'
+ icon_state = "dosimeter_case"
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
storage_slots = 5
can_hold = list(/obj/item/weapon/paper/dosimeter_manual, /obj/item/clothing/accessory/dosimeter, /obj/item/weapon/dosimeter_film)
- max_storage_space = (ITEMSIZE_COST_SMALL * 2) + (ITEMSIZE_COST_TINY * 3)
+ max_storage_space = (ITEMSIZE_COST_SMALL * 4) + (ITEMSIZE_COST_TINY * 1)
w_class = ITEMSIZE_SMALL
/obj/item/weapon/storage/box/dosimeter/New()
diff --git a/code/modules/clothing/under/altevian_vr.dm b/code/modules/clothing/under/altevian_vr.dm
new file mode 100644
index 00000000000..51f3bbef3b1
--- /dev/null
+++ b/code/modules/clothing/under/altevian_vr.dm
@@ -0,0 +1,46 @@
+/obj/item/clothing/under/pants/altevian
+ name = "Altevian Hegemony Civilian Pants"
+ desc = "An extremely comfortable set of clothing that's made to help people handle their day to day work around the fleets with little to no discomfort."
+ icon = 'icons/inventory/uniform/item_vr.dmi'
+ icon_override = 'icons/inventory/uniform/mob_vr.dmi'
+ icon_state = "altevian-pants-civ"
+ worn_state = "altevian-pants-civ"
+ gender = PLURAL
+ body_parts_covered = LOWER_TORSO|LEGS
+ starting_accessories = list(/obj/item/clothing/accessory/jacket/altevian)
+
+/obj/item/clothing/under/pants/altevian/command
+ name = "Altevian Hegemony Command Pants"
+ icon_state = "altevian-pants-com"
+ worn_state = "altevian-pants-com"
+ starting_accessories = list(/obj/item/clothing/accessory/jacket/altevian/command)
+
+/obj/item/clothing/under/pants/altevian/security
+ name = "Altevian Hegemony Security Pants"
+ icon_state = "altevian-pants-sec"
+ worn_state = "altevian-pants-sec"
+ starting_accessories = list(/obj/item/clothing/accessory/jacket/altevian/security)
+
+/obj/item/clothing/under/pants/altevian/engineering
+ name = "Altevian Hegemony Engineering Pants"
+ icon_state = "altevian-pants-eng"
+ worn_state = "altevian-pants-eng"
+ starting_accessories = list(/obj/item/clothing/accessory/jacket/altevian/engineering)
+
+/obj/item/clothing/under/pants/altevian/medical
+ name = "Altevian Hegemony Medical Pants"
+ icon_state = "altevian-pants-med"
+ worn_state = "altevian-pants-med"
+ starting_accessories = list(/obj/item/clothing/accessory/jacket/altevian/medical)
+
+/obj/item/clothing/under/pants/altevian/science
+ name = "Altevian Hegemony Science Pants"
+ icon_state = "altevian-pants-sci"
+ worn_state = "altevian-pants-sci"
+ starting_accessories = list(/obj/item/clothing/accessory/jacket/altevian/science)
+
+/obj/item/clothing/under/pants/altevian/cargo
+ name = "Altevian Hegemony Cargo Pants"
+ icon_state = "altevian-pants-cargo"
+ worn_state = "altevian-pants-cargo"
+ starting_accessories = list(/obj/item/clothing/accessory/jacket/altevian/cargo)
diff --git a/code/modules/clothing/under/miscellaneous_vr.dm b/code/modules/clothing/under/miscellaneous_vr.dm
index 24f7c67c8f7..2207f31385d 100644
--- a/code/modules/clothing/under/miscellaneous_vr.dm
+++ b/code/modules/clothing/under/miscellaneous_vr.dm
@@ -76,7 +76,7 @@
to_chat(H,"You must be WEARING the uniform to change your size.")
return
- var/new_size = input(usr, "Put the desired size (25-200%), or (1-600%) in dormitory areas.", "Set Size", 200) as num|null
+ var/new_size = tgui_input_number(usr, "Put the desired size (25-200%), or (1-600%) in dormitory areas.", "Set Size", 200, 600, 1)
if(!new_size)
return //cancelled
@@ -109,7 +109,7 @@
/obj/item/clothing/under/hyperfiber/bluespace/mob_can_unequip(mob/M, slot, disable_warning = 0)
. = ..()
- if(. && ishuman(M) && original_size)
+ if(. && ishuman(M) && original_size && !disable_warning)
var/mob/living/carbon/human/H = M
H.resize(original_size, ignore_prefs = TRUE)
original_size = null
@@ -129,7 +129,7 @@
/obj/item/clothing/gloves/bluespace/mob_can_equip(mob/M, gloves, disable_warning = 0)
. = ..()
- if(. && ishuman(M))
+ if(. && ishuman(M) && !disable_warning)
var/mob/living/carbon/human/H = M
if(!H.resizable)
return
@@ -145,7 +145,7 @@
/obj/item/clothing/gloves/bluespace/mob_can_unequip(mob/M, gloves, disable_warning = 0)
. = ..()
- if(. && ishuman(M) && original_size)
+ if(. && ishuman(M) && original_size && !disable_warning)
var/mob/living/carbon/human/H = M
if(!H.resizable)
return
diff --git a/code/modules/clothing/under/xenos/teshari.dm b/code/modules/clothing/under/xenos/teshari.dm
index a0797f8df6d..d7254524f7f 100644
--- a/code/modules/clothing/under/xenos/teshari.dm
+++ b/code/modules/clothing/under/xenos/teshari.dm
@@ -221,8 +221,8 @@
//Job Undercoats
/obj/item/clothing/under/teshari/undercoat/jobs/cap
- name = "facility director undercoat"
- desc = "A traditional Teshari garb made for the Facility Director"
+ name = "site manager undercoat"
+ desc = "A traditional Teshari garb made for the Site Manager"
icon_state = "tesh_uniform_cap"
/obj/item/clothing/under/teshari/undercoat/jobs/hop
diff --git a/code/modules/detectivework/microscope/dnascanner.dm b/code/modules/detectivework/microscope/dnascanner.dm
index 1017e74df80..ba8f247443a 100644
--- a/code/modules/detectivework/microscope/dnascanner.dm
+++ b/code/modules/detectivework/microscope/dnascanner.dm
@@ -105,7 +105,7 @@
last_process_worldtime = world.time
/obj/machinery/dnaforensics/proc/complete_scan()
- visible_message("[bicon(src)] makes an insistent chime.", 2)
+ visible_message("\icon[src][bicon(src)] makes an insistent chime.", 2)
update_icon()
if(bloodsamp)
var/obj/item/weapon/paper/P = new(src)
diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm
index fb7c6fc4425..569bf7065a4 100644
--- a/code/modules/economy/ATM.dm
+++ b/code/modules/economy/ATM.dm
@@ -76,7 +76,7 @@ log transactions
//display a message to the user
var/response = pick("Initiating withdraw. Have a nice day!", "CRITICAL ERROR: Activating cash chamber panic siphon.","PIN Code accepted! Emptying account balance.", "Jackpot!")
- to_chat(user, "[bicon(src)] The [src] beeps: \"[response]\"")
+ to_chat(user, "\icon[src][bicon(src)] The [src] beeps: \"[response]\"")
return 1
/obj/machinery/atm/attackby(obj/item/I as obj, mob/user as mob)
@@ -85,7 +85,7 @@ log transactions
if(istype(I, /obj/item/weapon/card))
if(emagged > 0)
//prevent inserting id into an emagged ATM
- to_chat(user, "[bicon(src)] CARD READER ERROR. This system has been compromised!")
+ to_chat(user, "\icon[src][bicon(src)] CARD READER ERROR. This system has been compromised!")
return
else if(istype(I,/obj/item/weapon/card/emag))
I.resolve_attackby(src, user)
@@ -234,7 +234,7 @@ log transactions
var/target_account_number = text2num(href_list["target_acc_number"])
var/transfer_purpose = href_list["purpose"]
if(charge_to_account(target_account_number, authenticated_account.owner_name, transfer_purpose, machine_id, transfer_amount))
- to_chat(usr, "[bicon(src)]Funds transfer successful.")
+ to_chat(usr, "\icon[src][bicon(src)]Funds transfer successful.")
authenticated_account.money -= transfer_amount
//create an entry in the account transaction log
@@ -247,10 +247,10 @@ log transactions
T.amount = "([transfer_amount])"
authenticated_account.transaction_log.Add(T)
else
- to_chat(usr, "[bicon(src)]Funds transfer failed.")
+ to_chat(usr, "\icon[src][bicon(src)]Funds transfer failed.")
else
- to_chat(usr, "[bicon(src)]You don't have enough funds to do that!")
+ to_chat(usr, "\icon[src][bicon(src)]You don't have enough funds to do that!")
if("view_screen")
view_screen = text2num(href_list["view_screen"])
if("change_security_level")
@@ -258,17 +258,17 @@ log transactions
var/new_sec_level = max( min(text2num(href_list["new_security_level"]), 2), 0)
authenticated_account.security_level = new_sec_level
if("attempt_auth")
-
- // check if they have low security enabled
- scan_user(usr)
-
- if(!ticks_left_locked_down && held_card)
- var/tried_account_num = text2num(href_list["account_num"])
- if(!tried_account_num)
- tried_account_num = held_card.associated_account_number
+ if(!ticks_left_locked_down)
+ var/tried_account_num = held_card ? held_card.associated_account_number : text2num(href_list["account_num"])
var/tried_pin = text2num(href_list["account_pin"])
- authenticated_account = attempt_account_access(tried_account_num, tried_pin, held_card && held_card.associated_account_number == tried_account_num ? 2 : 1)
+ // check if they have low security enabled
+
+ if (!tried_account_num)
+ scan_user(usr)
+ else
+ authenticated_account = attempt_account_access(tried_account_num, tried_pin, held_card && held_card.associated_account_number == tried_account_num ? 2 : 1)
+
if(!authenticated_account)
number_incorrect_tries++
if(previous_account_number == tried_account_num)
@@ -288,11 +288,11 @@ log transactions
T.time = stationtime2text()
failed_account.transaction_log.Add(T)
else
- to_chat(usr, "[bicon(src)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.")
+ to_chat(usr, "\icon[src][bicon(src)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.")
previous_account_number = tried_account_num
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
else
- to_chat(usr, "[bicon(src)] incorrect pin/account combination entered.")
+ to_chat(usr, "\icon[src][bicon(src)] incorrect pin/account combination entered.")
number_incorrect_tries = 0
else
playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
@@ -308,7 +308,7 @@ log transactions
T.time = stationtime2text()
authenticated_account.transaction_log.Add(T)
- to_chat(usr, "[bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'")
+ to_chat(usr, "\icon[src][bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'")
previous_account_number = tried_account_num
if("e_withdrawal")
@@ -336,7 +336,7 @@ log transactions
T.time = stationtime2text()
authenticated_account.transaction_log.Add(T)
else
- to_chat(usr, "[bicon(src)]You don't have enough funds to do that!")
+ to_chat(usr, "\icon[src][bicon(src)]You don't have enough funds to do that!")
if("withdrawal")
var/amount = max(text2num(href_list["funds_amount"]),0)
amount = round(amount, 0.01)
@@ -361,7 +361,7 @@ log transactions
T.time = stationtime2text()
authenticated_account.transaction_log.Add(T)
else
- to_chat(usr, "[bicon(src)]You don't have enough funds to do that!")
+ to_chat(usr, "\icon[src][bicon(src)]You don't have enough funds to do that!")
if("balance_statement")
if(authenticated_account)
var/obj/item/weapon/paper/R = new(src.loc)
@@ -433,7 +433,7 @@ log transactions
if(!held_card)
//this might happen if the user had the browser window open when somebody emagged it
if(emagged > 0)
- to_chat(usr, "[bicon(src)] The ATM card reader rejected your ID because this machine has been sabotaged!")
+ to_chat(usr, "\icon[src][bicon(src)] The ATM card reader rejected your ID because this machine has been sabotaged!")
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
@@ -460,19 +460,6 @@ log transactions
I = P.id
if(I)
authenticated_account = attempt_account_access(I.associated_account_number)
- if(authenticated_account)
- to_chat(human_user, "[bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'")
-
- //create a transaction log entry
- var/datum/transaction/T = new()
- T.target_name = authenticated_account.owner_name
- T.purpose = "Remote terminal access"
- T.source_terminal = machine_id
- T.date = current_date_string
- T.time = stationtime2text()
- authenticated_account.transaction_log.Add(T)
-
- view_screen = NO_SCREEN
// put the currently held id on the ground or in the hand of the user
/obj/machinery/atm/proc/release_held_id(mob/living/carbon/human/human_user as mob)
diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm
index 1060cf1c39a..4003cb22b11 100644
--- a/code/modules/economy/Accounts_DB.dm
+++ b/code/modules/economy/Accounts_DB.dm
@@ -127,12 +127,12 @@
creating_new_account = 1
if("add_funds")
- var/amount = input(usr, "Enter the amount you wish to add", "Silently add funds") as num
+ var/amount = tgui_input_number(usr, "Enter the amount you wish to add", "Silently add funds")
if(detailed_account_view)
detailed_account_view.money = min(detailed_account_view.money + amount, fund_cap)
if("remove_funds")
- var/amount = input(usr, "Enter the amount you wish to remove", "Silently remove funds") as num
+ var/amount = tgui_input_number(usr, "Enter the amount you wish to remove", "Silently remove funds")
if(detailed_account_view)
detailed_account_view.money = max(detailed_account_view.money - amount, -fund_cap)
diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm
index 1517af0cc0b..3673f67814f 100644
--- a/code/modules/economy/EFTPOS.dm
+++ b/code/modules/economy/EFTPOS.dm
@@ -107,7 +107,7 @@
if(linked_account)
scan_card(I, O)
else
- to_chat(usr, "[bicon(src)]Unable to connect to linked account.")
+ to_chat(usr, "\icon[src][bicon(src)]Unable to connect to linked account.")
else if (istype(O, /obj/item/weapon/spacecash/ewallet))
var/obj/item/weapon/spacecash/ewallet/E = O
if (linked_account)
@@ -115,7 +115,7 @@
if(transaction_locked && !transaction_paid)
if(transaction_amount <= E.worth)
playsound(src, 'sound/machines/chime.ogg', 50, 1)
- src.visible_message("[bicon(src)] \The [src] chimes.")
+ src.visible_message("\icon[src][bicon(src)] \The [src] chimes.")
transaction_paid = 1
//transfer the money
@@ -132,11 +132,11 @@
T.time = stationtime2text()
linked_account.transaction_log.Add(T)
else
- to_chat(usr, "[bicon(src)]\The [O] doesn't have that much money!")
+ to_chat(usr, "\icon[src][bicon(src)]\The [O] doesn't have that much money!")
else
- to_chat(usr, "[bicon(src)]Connected account has been suspended.")
+ to_chat(usr, "\icon[src][bicon(src)]Connected account has been suspended.")
else
- to_chat(usr, "[bicon(src)]EFTPOS is not connected to an account.")
+ to_chat(usr, "\icon[src][bicon(src)]EFTPOS is not connected to an account.")
else
..()
@@ -145,38 +145,38 @@
if(href_list["choice"])
switch(href_list["choice"])
if("change_code")
- var/attempt_code = input(usr, "Re-enter the current EFTPOS access code", "Confirm old EFTPOS code") as num
+ var/attempt_code = tgui_input_number(usr, "Re-enter the current EFTPOS access code", "Confirm old EFTPOS code")
if(attempt_code == access_code)
- var/trycode = input(usr, "Enter a new access code for this device (4-6 digits, numbers only)", "Enter new EFTPOS code") as num
+ var/trycode = tgui_input_number(usr, "Enter a new access code for this device (4-6 digits, numbers only)", "Enter new EFTPOS code", null, 999999, 1000)
if(trycode >= 1000 && trycode <= 999999)
access_code = trycode
else
tgui_alert_async(usr, "That is not a valid code!")
print_reference()
else
- to_chat(usr, "[bicon(src)]Incorrect code entered.")
+ to_chat(usr, "\icon[src][bicon(src)]Incorrect code entered.")
if("change_id")
var/attempt_code = text2num(input(usr, "Re-enter the current EFTPOS access code", "Confirm EFTPOS code"))
if(attempt_code == access_code)
eftpos_name = sanitize(input(usr, "Enter a new terminal ID for this device", "Enter new EFTPOS ID"), MAX_NAME_LEN) + " EFTPOS scanner"
print_reference()
else
- to_chat(usr, "[bicon(src)]Incorrect code entered.")
+ to_chat(usr, "\icon[src][bicon(src)]Incorrect code entered.")
if("link_account")
- var/attempt_account_num = input(usr, "Enter account number to pay EFTPOS charges into", "New account number") as num
- var/attempt_pin = input(usr, "Enter pin code", "Account pin") as num
+ var/attempt_account_num = tgui_input_number(usr, "Enter account number to pay EFTPOS charges into", "New account number")
+ var/attempt_pin = tgui_input_number(usr, "Enter pin code", "Account pin")
linked_account = attempt_account_access(attempt_account_num, attempt_pin, 1)
if(linked_account)
if(linked_account.suspended)
linked_account = null
- to_chat(usr, "[bicon(src)]Account has been suspended.")
+ to_chat(usr, "\icon[src][bicon(src)]Account has been suspended.")
else
- to_chat(usr, "[bicon(src)]Account not found.")
+ to_chat(usr, "\icon[src][bicon(src)]Account not found.")
if("trans_purpose")
var/choice = sanitize(input(usr, "Enter reason for EFTPOS transaction", "Transaction purpose"))
if(choice) transaction_purpose = choice
if("trans_value")
- var/try_num = input(usr, "Enter amount for EFTPOS transaction", "Transaction amount") as num
+ var/try_num = tgui_input_number(usr, "Enter amount for EFTPOS transaction", "Transaction amount")
if(try_num < 0)
tgui_alert_async(usr, "That is not a valid amount!")
else
@@ -187,21 +187,21 @@
transaction_locked = 0
transaction_paid = 0
else
- var/attempt_code = input(usr, "Enter EFTPOS access code", "Reset Transaction") as num
+ var/attempt_code = tgui_input_number(usr, "Enter EFTPOS access code", "Reset Transaction")
if(attempt_code == access_code)
transaction_locked = 0
transaction_paid = 0
else if(linked_account)
transaction_locked = 1
else
- to_chat(usr, "[bicon(src)]No account connected to send transactions to.")
+ to_chat(usr, "\icon[src][bicon(src)]No account connected to send transactions to.")
if("scan_card")
if(linked_account)
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card))
scan_card(I)
else
- to_chat(usr, "[bicon(src)]Unable to link accounts.")
+ to_chat(usr, "\icon[src][bicon(src)]Unable to link accounts.")
if("reset")
//reset the access code - requires HoP/captain access
var/obj/item/I = usr.get_active_hand()
@@ -209,10 +209,10 @@
var/obj/item/weapon/card/id/C = I
if((access_cent_captain in C.access) || (access_hop in C.access) || (access_captain in C.access))
access_code = 0
- to_chat(usr, "[bicon(src)]Access code reset to 0.")
+ to_chat(usr, "\icon[src][bicon(src)]Access code reset to 0.")
else if (istype(I, /obj/item/weapon/card/emag))
access_code = 0
- to_chat(usr, "[bicon(src)]Access code reset to 0.")
+ to_chat(usr, "\icon[src][bicon(src)]Access code reset to 0.")
src.attack_self(usr)
@@ -229,14 +229,14 @@
var/attempt_pin = ""
var/datum/money_account/D = get_account(C.associated_account_number)
if(D.security_level)
- attempt_pin = input(usr, "Enter pin code", "EFTPOS transaction") as num
+ attempt_pin = tgui_input_number(usr, "Enter pin code", "EFTPOS transaction")
D = null
D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
if(D)
if(!D.suspended)
if(transaction_amount <= D.money)
playsound(src, 'sound/machines/chime.ogg', 50, 1)
- src.visible_message("[bicon(src)] \The [src] chimes.")
+ src.visible_message("\icon[src][bicon(src)] \The [src] chimes.")
transaction_paid = 1
//transfer the money
@@ -265,25 +265,25 @@
T.time = stationtime2text()
linked_account.transaction_log.Add(T)
else
- to_chat(usr, "[bicon(src)]You don't have that much money!")
+ to_chat(usr, "\icon[src][bicon(src)]You don't have that much money!")
else
- to_chat(usr, "[bicon(src)]Your account has been suspended.")
+ to_chat(usr, "\icon[src][bicon(src)]Your account has been suspended.")
else
- to_chat(usr, "[bicon(src)]Unable to access account. Check security settings and try again.")
+ to_chat(usr, "\icon[src][bicon(src)]Unable to access account. Check security settings and try again.")
else
- to_chat(usr, "[bicon(src)]Connected account has been suspended.")
+ to_chat(usr, "\icon[src][bicon(src)]Connected account has been suspended.")
else
- to_chat(usr, "[bicon(src)]EFTPOS is not connected to an account.")
+ to_chat(usr, "\icon[src][bicon(src)]EFTPOS is not connected to an account.")
else if (istype(I, /obj/item/weapon/card/emag))
if(transaction_locked)
if(transaction_paid)
- to_chat(usr, "[bicon(src)]You stealthily swipe \the [I] through \the [src].")
+ to_chat(usr, "\icon[src][bicon(src)]You stealthily swipe \the [I] through \the [src].")
transaction_locked = 0
transaction_paid = 0
else
usr.visible_message("\The [usr] swipes a card through \the [src].")
playsound(src, 'sound/machines/chime.ogg', 50, 1)
- src.visible_message("[bicon(src)] \The [src] chimes.")
+ src.visible_message("\icon[src][bicon(src)] \The [src] chimes.")
transaction_paid = 1
//emag?
diff --git a/code/modules/economy/cash.dm b/code/modules/economy/cash.dm
index ec2ad51dcab..e5a539f5e87 100644
--- a/code/modules/economy/cash.dm
+++ b/code/modules/economy/cash.dm
@@ -80,7 +80,7 @@
return worth
/obj/item/weapon/spacecash/attack_self()
- var/amount = input(usr, "How many [initial_name]s do you want to take? (0 to [src.worth])", "Take Money", 20) as num
+ var/amount = tgui_input_number(usr, "How many [initial_name]s do you want to take? (0 to [src.worth])", "Take Money", 20)
if(!src || QDELETED(src))
return
amount = round(CLAMP(amount, 0, src.worth))
diff --git a/code/modules/economy/cash_register.dm b/code/modules/economy/cash_register.dm
index c3caf79c755..94784854dc5 100644
--- a/code/modules/economy/cash_register.dm
+++ b/code/modules/economy/cash_register.dm
@@ -103,33 +103,33 @@
if(allowed(usr))
locked = !locked
else
- to_chat(usr, "[bicon(src)]Insufficient access.")
+ to_chat(usr, "\icon[src][bicon(src)]Insufficient access.")
if("toggle_cash_lock")
cash_locked = !cash_locked
if("link_account")
- var/attempt_account_num = input(usr, "Enter account number", "New account number") as num
- var/attempt_pin = input(usr, "Enter PIN", "Account PIN") as num
+ var/attempt_account_num = tgui_input_number(usr, "Enter account number", "New account number")
+ var/attempt_pin = tgui_input_number(usr, "Enter PIN", "Account PIN")
linked_account = attempt_account_access(attempt_account_num, attempt_pin, 1)
if(linked_account)
if(linked_account.suspended)
linked_account = null
- src.visible_message("[bicon(src)]Account has been suspended.")
+ src.visible_message("\icon[src][bicon(src)]Account has been suspended.")
else
- to_chat(usr, "[bicon(src)]Account not found.")
+ to_chat(usr, "\icon[src][bicon(src)]Account not found.")
if("custom_order")
- var/t_purpose = sanitize(input(usr, "Enter purpose", "New purpose") as text)
+ var/t_purpose = sanitize(tgui_input_text(usr, "Enter purpose", "New purpose"))
if (!t_purpose || !Adjacent(usr)) return
transaction_purpose = t_purpose
item_list += t_purpose
- var/t_amount = round(input(usr, "Enter price", "New price") as num)
+ var/t_amount = round(tgui_input_number(usr, "Enter price", "New price"))
if (!t_amount || !Adjacent(usr) || t_amount < 0) return
transaction_amount += t_amount
price_list += t_amount
playsound(src, 'sound/machines/twobeep.ogg', 25)
- src.visible_message("[bicon(src)][transaction_purpose]: [t_amount] Thaler\s.")
+ src.visible_message("\icon[src][bicon(src)][transaction_purpose]: [t_amount] Thaler\s.")
if("set_amount")
var/item_name = locate(href_list["item"])
- var/n_amount = round(input(usr, "Enter amount", "New amount") as num)
+ var/n_amount = round(tgui_input_number(usr, "Enter amount", "New amount"))
n_amount = CLAMP(n_amount, 0, 20)
if (!item_list[item_name] || !Adjacent(usr)) return
transaction_amount += (n_amount - item_list[item_name]) * price_list[item_name]
@@ -163,7 +163,7 @@
price_list.Cut()
if("reset_log")
transaction_logs.Cut()
- to_chat(usr, "[bicon(src)]Transaction log reset.")
+ to_chat(usr, "\icon[src][bicon(src)]Transaction log reset.")
updateDialog()
@@ -208,7 +208,7 @@
return 1
else
confirm_item = I
- src.visible_message("[bicon(src)]Total price: [transaction_amount] Thaler\s. Swipe again to confirm.")
+ src.visible_message("\icon[src][bicon(src)]Total price: [transaction_amount] Thaler\s. Swipe again to confirm.")
playsound(src, 'sound/machines/twobeep.ogg', 25)
return 0
@@ -219,14 +219,14 @@
if (cash_open)
playsound(src, 'sound/machines/buzz-sigh.ogg', 25)
- to_chat(usr, "[bicon(src)]The cash box is open.")
+ to_chat(usr, "\icon[src][bicon(src)]The cash box is open.")
return
if((item_list.len > 1 || item_list[item_list[1]] > 1) && !confirm(I))
return
if (!linked_account)
- usr.visible_message("[bicon(src)]Unable to connect to linked account.")
+ usr.visible_message("\icon[src][bicon(src)]Unable to connect to linked account.")
return
// Access account for transaction
@@ -234,18 +234,18 @@
var/datum/money_account/D = get_account(I.associated_account_number)
var/attempt_pin = ""
if(D && D.security_level)
- attempt_pin = input(usr, "Enter PIN", "Transaction") as num
+ attempt_pin = tgui_input_number(usr, "Enter PIN", "Transaction")
D = null
D = attempt_account_access(I.associated_account_number, attempt_pin, 2)
if(!D)
- src.visible_message("[bicon(src)]Unable to access account. Check security settings and try again.")
+ src.visible_message("\icon[src][bicon(src)]Unable to access account. Check security settings and try again.")
else
if(D.suspended)
- src.visible_message("[bicon(src)]Your account has been suspended.")
+ src.visible_message("\icon[src][bicon(src)]Your account has been suspended.")
else
if(transaction_amount > D.money)
- src.visible_message("[bicon(src)]Not enough funds.")
+ src.visible_message("\icon[src][bicon(src)]Not enough funds.")
else
// Transfer the money
D.money -= transaction_amount
@@ -284,7 +284,7 @@
if (cash_open)
playsound(src, 'sound/machines/buzz-sigh.ogg', 25)
- to_chat(usr, "[bicon(src)]The cash box is open.")
+ to_chat(usr, "\icon[src][bicon(src)]The cash box is open.")
return
if((item_list.len > 1 || item_list[item_list[1]] > 1) && !confirm(E))
@@ -293,7 +293,7 @@
// Access account for transaction
if(check_account())
if(transaction_amount > E.worth)
- src.visible_message("[bicon(src)]Not enough funds.")
+ src.visible_message("\icon[src][bicon(src)]Not enough funds.")
else
// Transfer the money
E.worth -= transaction_amount
@@ -322,14 +322,14 @@
if (cash_open)
playsound(src, 'sound/machines/buzz-sigh.ogg', 25)
- to_chat(usr, "[bicon(src)]The cash box is open.")
+ to_chat(usr, "\icon[src][bicon(src)]The cash box is open.")
return
if((item_list.len > 1 || item_list[item_list[1]] > 1) && !confirm(SC))
return
if(transaction_amount > SC.worth)
- src.visible_message("[bicon(src)]Not enough money.")
+ src.visible_message("\icon[src][bicon(src)]Not enough money.")
else
// Insert cash into magical slot
SC.worth -= transaction_amount
@@ -351,20 +351,20 @@
/obj/machinery/cash_register/proc/scan_item_price(obj/O)
if(!istype(O)) return
if(item_list.len > 10)
- src.visible_message("[bicon(src)]Only up to ten different items allowed per purchase.")
+ src.visible_message("\icon[src][bicon(src)]Only up to ten different items allowed per purchase.")
return
if (cash_open)
playsound(src, 'sound/machines/buzz-sigh.ogg', 25)
- to_chat(usr, "[bicon(src)]The cash box is open.")
+ to_chat(usr, "\icon[src][bicon(src)]The cash box is open.")
return
// First check if item has a valid price
var/price = O.get_item_cost()
if(isnull(price))
- src.visible_message("[bicon(src)]Unable to find item in database.")
+ src.visible_message("\icon[src][bicon(src)]Unable to find item in database.")
return
// Call out item cost
- src.visible_message("[bicon(src)]\A [O]: [price ? "[price] Thaler\s" : "free of charge"].")
+ src.visible_message("\icon[src][bicon(src)]\A [O]: [price ? "[price] Thaler\s" : "free of charge"].")
// Note the transaction purpose for later use
if(transaction_purpose)
transaction_purpose += " "
@@ -432,11 +432,11 @@
/obj/machinery/cash_register/proc/check_account()
if (!linked_account)
- usr.visible_message("[bicon(src)]Unable to connect to linked account.")
+ usr.visible_message("\icon[src][bicon(src)]Unable to connect to linked account.")
return 0
if(linked_account.suspended)
- src.visible_message("[bicon(src)]Connected account has been suspended.")
+ src.visible_message("\icon[src][bicon(src)]Connected account has been suspended.")
return 0
return 1
@@ -444,7 +444,7 @@
/obj/machinery/cash_register/proc/transaction_complete()
/// Visible confirmation
playsound(src, 'sound/machines/chime.ogg', 25)
- src.visible_message("[bicon(src)]Transaction complete.")
+ src.visible_message("\icon[src][bicon(src)]Transaction complete.")
flick("register_approve", src)
reset_memory()
updateDialog()
diff --git a/code/modules/economy/casinocash.dm b/code/modules/economy/casinocash.dm
index 25486c33f83..e74b89d42b7 100644
--- a/code/modules/economy/casinocash.dm
+++ b/code/modules/economy/casinocash.dm
@@ -10,7 +10,7 @@
anchored = 1
/obj/machinery/chipmachine/attackby(obj/item/I as obj, mob/user as mob)
- if(istype(I,/obj/item/weapon/spacecash))
+ if(istype(I,/obj/item/weapon/spacecash) && (I:worth >= 5))
//consume the money
if(prob(50))
playsound(loc, 'sound/items/polaroid1.ogg', 50, 1)
@@ -30,7 +30,7 @@
playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
user << "You insert [I] into [src]."
- spawn_money(round(I:worth/5), src.loc)
+ spawn_money(round(I:worth*5), src.loc)
src.attack_hand(user)
qdel(I)
@@ -64,7 +64,7 @@
h_user.drop_from_inventory(src)
h_user.drop_from_inventory(SC)
h_user.put_in_hands(SC)
- user << "You combine the casino chips to a stack of [SC.worth] of credits."
+ user << "You combine the casino chips to a stack of [SC.worth] casino credits."
qdel(src)
/obj/item/weapon/spacecasinocash/update_icon()
@@ -72,7 +72,7 @@
name = "[worth] casino credit\s"
if(worth in list(1000,500,200,100,50,20,10,1))
icon_state = "spacecasinocash[worth]"
- desc = "It's a stack of casino chips with a combined value of [worth] credits."
+ desc = "It's a stack of casino chips with a combined value of [worth] casino credits."
return
var/sum = src.worth
var/num = 0
@@ -93,7 +93,7 @@
M.Turn(pick(-45, -27.5, 0, 0, 0, 0, 0, 0, 0, 27.5, 45))
banknote.transform = M
src.overlays += banknote
- src.desc = "They are worth [worth] of credits."
+ src.desc = "They are worth [worth] casino credits."
/obj/item/weapon/spacecasinocash/proc/adjust_worth(var/adjust_worth = 0, var/update = 1)
worth += adjust_worth
@@ -112,7 +112,7 @@
return worth
/obj/item/weapon/spacecasinocash/attack_self()
- var/amount = input(usr, "How much credits worth of chips do you want to take? (0 to [src.worth])", "Take chips", 20) as num
+ var/amount = tgui_input_number(usr, "How much credits worth of chips do you want to take? (0 to [src.worth])", "Take chips", 20)
if(!src || QDELETED(src))
return
amount = round(CLAMP(amount, 0, src.worth))
@@ -176,7 +176,7 @@
/proc/spawn_casinochips(var/sum, spawnloc, mob/living/carbon/human/human_user as mob)
var/obj/item/weapon/spacecasinocash/SC = new (spawnloc)
- SC.set_worth(sum)
+ SC.set_worth(sum, TRUE)
if (ishuman(human_user) && !human_user.get_active_hand())
human_user.put_in_hands(SC)
return
diff --git a/code/modules/economy/lorenews.dm b/code/modules/economy/lorenews.dm
index 4f82c6f12a6..fd812fec95b 100644
--- a/code/modules/economy/lorenews.dm
+++ b/code/modules/economy/lorenews.dm
@@ -68,7 +68,7 @@
"The EIO has officially raised the Emergence Threat Level in [pick(solgov)] to Blue. Citizens are reminded to comply with all EIO Agent requests. Failure to do so will be met with legal action, up to and including imprisonment.",
"All SolGov citizens beware, the scourge know as the Vox have increased the frequency of their attacks on isolated and poorly defended SolGov territories in [pick(bowl)]. Citizens have been advised to travel in groups and remain aware of their surroundings at all times.",
"The Unathi have recently moved a large amount of material into Abel's Rest, under the premise of building additional power plants. According to our sources, the material is in fact being channeled into domestic terrorist groups on both sides, in an attempt to incite a SolGov response. More news as the story develops.",
- "Controversial Kishari director [random_name(FEMALE)] announced this Friday a sequel to the 2525 animated series Soldiers of the Yearlong War. Open auditions for supporting cast members have been called.",
+ "Controversial Kishari director [random_name(FEMALE)] announced this Friday a sequel to the 2281 animated series Soldiers of the Yearlong War. Open auditions for supporting cast members have been called.",
"Amid concerns that it promotes a pro-transtech agenda, a high-profile screening of the award-winning animated film \"The Inventor's Marvelous Mechanical Maidens\" was canceled today on [pick(pick(core, heights))].",
"A radiation leak caused by a power unit rupture at a [pick(solgov)] hazardous materials reclamation plant has left several workers and neighboring residents with acute radiation poisoning. Witnesses report that a basic lifting drone failed to recognize and collided with the misplaced unit.",
"Xenophobic fringe group Humanity First has claimed credit for a bombing at a local government office on [pick(solgov)] which left three seriously injured. Police report that they have two suspects in custody, but details remain sparse.",
@@ -89,7 +89,7 @@
"Miners in [pick(bowl)] were dismayed to discover that their boss was actually a C-class drone intelligence! \"I should've known there was something wrong,\" says dumbfounded miner [random_name(MALE)],\"I'd say good morning and he'd just start listing off mineral densities and coordinates. I just thought he loved his job a little too much.\"",
"The remains of an early 22nd century voidcraft containing \"Period artifacts, technology and human remains\" has been located on the surface of Luna after centuries of being disregarded as worthless wreck. Historians hope the find will provide insight into daily life under the short-lived Selene Federation.",
"The unexpected discovery of the remains of a what was believed to be a previously undiscovered species by workers on [pick("Nisp", "Binma", "Sif", "Kishar", "Abel's Rest", "Merelar")] has now been dismissed. Upon close analysis of the specimen, it was identified as a \"Bear with mange\", apparently dumped there some weeks prior.",
- "According to a public statement by electronics giant Ward-Takahashi, many artificial intelligence systems - ranging from household appliances to industrial drones and habitat control networks - manufactured before 2550 could be at risk from a new virus dubbed \"Cap-3k\".",
+ "According to a public statement by electronics giant Ward-Takahashi, many artificial intelligence systems - ranging from household appliances to industrial drones and habitat control networks - manufactured before 2300 could be at risk from a new virus dubbed \"Cap-3k\".",
"A controversial opera billed as \"The true story of Nos Amis\" has been criticized by law enforcement agencies as \"glorifying\" some of the most infamous gangsters of the 22nd century. The Polish-language \"Z Francji, do Gwiazd\" is to be distributed exclusively in Alpha Centauri for one week only.",
"Injury count continues to rise in the aftermath of the Positronic Rights Group Rally in [pick(pick(bowl, core, heights))]. Homemade teargas grenades were launched into the crowd at approximately 3:45 pm on Saturday by an unidentified person. Authorities urge anyone with information to call in, toll-free, at any time.",
"Representatives report that investigations continue on a string of fires on [pick("Nisp", "Binma", "Sif", "Kishar", "Abel's Rest", "Merelar")]. While no information has been released to the public, authorities assure the press that they are doing everything in their power to find those responsible.",
diff --git a/code/modules/economy/retail_scanner.dm b/code/modules/economy/retail_scanner.dm
index fb177f45f43..91d0a5e4852 100644
--- a/code/modules/economy/retail_scanner.dm
+++ b/code/modules/economy/retail_scanner.dm
@@ -100,31 +100,31 @@
if(allowed(usr))
locked = !locked
else
- to_chat(usr, "[bicon(src)]Insufficient access.")
+ to_chat(usr, "\icon[src][bicon(src)]Insufficient access.")
if("link_account")
- var/attempt_account_num = input(usr, "Enter account number", "New account number") as num
- var/attempt_pin = input(usr, "Enter PIN", "Account PIN") as num
+ var/attempt_account_num = tgui_input_number(usr, "Enter account number", "New account number")
+ var/attempt_pin = tgui_input_number(usr, "Enter PIN", "Account PIN")
linked_account = attempt_account_access(attempt_account_num, attempt_pin, 1)
if(linked_account)
if(linked_account.suspended)
linked_account = null
- src.visible_message("[bicon(src)]Account has been suspended.")
+ src.visible_message("\icon[src][bicon(src)]Account has been suspended.")
else
- to_chat(usr, "[bicon(src)]Account not found.")
+ to_chat(usr, "\icon[src][bicon(src)]Account not found.")
if("custom_order")
- var/t_purpose = sanitize(input(usr, "Enter purpose", "New purpose") as text)
+ var/t_purpose = sanitize(tgui_input_text(usr, "Enter purpose", "New purpose"))
if (!t_purpose || !Adjacent(usr)) return
transaction_purpose = t_purpose
item_list += t_purpose
- var/t_amount = round(input(usr, "Enter price", "New price") as num)
+ var/t_amount = round(tgui_input_number(usr, "Enter price", "New price"))
if (!t_amount || !Adjacent(usr)) return
transaction_amount += t_amount
price_list += t_amount
playsound(src, 'sound/machines/twobeep.ogg', 25)
- src.visible_message("[bicon(src)][transaction_purpose]: [t_amount] Thaler\s.")
+ src.visible_message("\icon[src][bicon(src)][transaction_purpose]: [t_amount] Thaler\s.")
if("set_amount")
var/item_name = locate(href_list["item"])
- var/n_amount = round(input(usr, "Enter amount", "New amount") as num)
+ var/n_amount = round(tgui_input_number(usr, "Enter amount", "New amount"))
n_amount = CLAMP(n_amount, 0, 20)
if (!item_list[item_name] || !Adjacent(usr)) return
transaction_amount += (n_amount - item_list[item_name]) * price_list[item_name]
@@ -158,7 +158,7 @@
price_list.Cut()
if("reset_log")
transaction_logs.Cut()
- to_chat(usr, "[bicon(src)]Transaction log reset.")
+ to_chat(usr, "\icon[src][bicon(src)]Transaction log reset.")
updateDialog()
@@ -191,7 +191,7 @@
return 1
else
confirm_item = I
- src.visible_message("[bicon(src)]Total price: [transaction_amount] Thaler\s. Swipe again to confirm.")
+ src.visible_message("\icon[src][bicon(src)]Total price: [transaction_amount] Thaler\s. Swipe again to confirm.")
playsound(src, 'sound/machines/twobeep.ogg', 25)
return 0
@@ -204,7 +204,7 @@
return
if (!linked_account)
- usr.visible_message("[bicon(src)]Unable to connect to linked account.")
+ usr.visible_message("\icon[src][bicon(src)]Unable to connect to linked account.")
return
// Access account for transaction
@@ -212,18 +212,18 @@
var/datum/money_account/D = get_account(I.associated_account_number)
var/attempt_pin = ""
if(D && D.security_level)
- attempt_pin = input(usr, "Enter PIN", "Transaction") as num
+ attempt_pin = tgui_input_number(usr, "Enter PIN", "Transaction")
D = null
D = attempt_account_access(I.associated_account_number, attempt_pin, 2)
if(!D)
- src.visible_message("[bicon(src)]Unable to access account. Check security settings and try again.")
+ src.visible_message("\icon[src][bicon(src)]Unable to access account. Check security settings and try again.")
else
if(D.suspended)
- src.visible_message("[bicon(src)]Your account has been suspended.")
+ src.visible_message("\icon[src][bicon(src)]Your account has been suspended.")
else
if(transaction_amount > D.money)
- src.visible_message("[bicon(src)]Not enough funds.")
+ src.visible_message("\icon[src][bicon(src)]Not enough funds.")
else
// Transfer the money
D.money -= transaction_amount
@@ -266,7 +266,7 @@
// Access account for transaction
if(check_account())
if(transaction_amount > E.worth)
- src.visible_message("[bicon(src)]Not enough funds.")
+ src.visible_message("\icon[src][bicon(src)]Not enough funds.")
else
// Transfer the money
E.worth -= transaction_amount
@@ -292,16 +292,16 @@
/obj/item/device/retail_scanner/proc/scan_item_price(var/obj/O)
if(!istype(O)) return
if(item_list.len > 10)
- src.visible_message("[bicon(src)]Only up to ten different items allowed per purchase.")
+ src.visible_message("\icon[src][bicon(src)]Only up to ten different items allowed per purchase.")
return
// First check if item has a valid price
var/price = O.get_item_cost()
if(isnull(price))
- src.visible_message("[bicon(src)]Unable to find item in database.")
+ src.visible_message("\icon[src][bicon(src)]Unable to find item in database.")
return
// Call out item cost
- src.visible_message("[bicon(src)]\A [O]: [price ? "[price] Thaler\s" : "free of charge"].")
+ src.visible_message("\icon[src][bicon(src)]\A [O]: [price ? "[price] Thaler\s" : "free of charge"].")
// Note the transaction purpose for later use
if(transaction_purpose)
transaction_purpose += " "
@@ -369,11 +369,11 @@
/obj/item/device/retail_scanner/proc/check_account()
if (!linked_account)
- usr.visible_message("[bicon(src)]Unable to connect to linked account.")
+ usr.visible_message("\icon[src][bicon(src)]Unable to connect to linked account.")
return 0
if(linked_account.suspended)
- src.visible_message("[bicon(src)]Connected account has been suspended.")
+ src.visible_message("\icon[src][bicon(src)]Connected account has been suspended.")
return 0
return 1
@@ -381,7 +381,7 @@
/obj/item/device/retail_scanner/proc/transaction_complete()
/// Visible confirmation
playsound(src, 'sound/machines/chime.ogg', 25)
- src.visible_message("[bicon(src)]Transaction complete.")
+ src.visible_message("\icon[src][bicon(src)]Transaction complete.")
flick("retail_approve", src)
reset_memory()
updateDialog()
diff --git a/code/modules/economy/vending.dm b/code/modules/economy/vending.dm
index f073f3f3969..c05c3e1a699 100644
--- a/code/modules/economy/vending.dm
+++ b/code/modules/economy/vending.dm
@@ -270,7 +270,7 @@ GLOBAL_LIST_EMPTY(vending_products)
// This is not a status display message, since it's something the character
// themselves is meant to see BEFORE putting the money in
- to_chat(usr, "[bicon(cashmoney)] That is not enough money.")
+ to_chat(usr, "\icon[cashmoney][bicon(cashmoney)] That is not enough money.")
return 0
if(istype(cashmoney, /obj/item/weapon/spacecash))
@@ -327,7 +327,7 @@ GLOBAL_LIST_EMPTY(vending_products)
// Have the customer punch in the PIN before checking if there's enough money. Prevents people from figuring out acct is
// empty at high security levels
if(customer_account.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
- var/attempt_pin = input(usr, "Enter pin code", "Vendor transaction") as num
+ var/attempt_pin = tgui_input_number(usr, "Enter pin code", "Vendor transaction")
customer_account = attempt_account_access(I.associated_account_number, attempt_pin, 2)
if(!customer_account)
diff --git a/code/modules/economy/vending_machines.dm b/code/modules/economy/vending_machines.dm
index d0ef6be1eb0..987414efb14 100644
--- a/code/modules/economy/vending_machines.dm
+++ b/code/modules/economy/vending_machines.dm
@@ -194,7 +194,8 @@
/obj/item/weapon/reagent_containers/food/snacks/cb10 = 6,
/obj/item/weapon/reagent_containers/food/snacks/tuna = 2)
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/syndicake = 6,
- /obj/item/weapon/reagent_containers/food/snacks/unajerky = 12)
+ /obj/item/weapon/reagent_containers/food/snacks/unajerky = 12,
+ /obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax = 6)
prices = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 1,
/obj/item/weapon/reagent_containers/food/snacks/candy/gummy = 2,
/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 5,
@@ -487,7 +488,6 @@
/obj/item/weapon/plantspray/pests = 20,
/obj/item/weapon/reagent_containers/syringe = 5,
/obj/item/weapon/reagent_containers/glass/beaker = 4,
- /obj/item/weapon/watertank = 1,
/obj/item/weapon/storage/bag/plants = 5)
premium = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,
/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
@@ -629,6 +629,7 @@
/obj/item/device/analyzer = 5,
/obj/item/device/t_scanner = 5,
/obj/item/weapon/tool/screwdriver = 5,
+ /obj/item/weapon/extinguisher/mini = 3,
/obj/item/device/flashlight/glowstick = 3,
/obj/item/device/flashlight/glowstick/red = 3,
/obj/item/device/flashlight/glowstick/blue = 3,
@@ -1055,7 +1056,8 @@
/obj/item/weapon/reagent_containers/food/snacks/driedfish = 8,
/obj/item/weapon/reagent_containers/food/snacks/cookiesnack = 8
)
- contraband = list(/obj/item/weapon/reagent_containers/food/snacks/unajerky = 1)
+ contraband = list(/obj/item/weapon/reagent_containers/food/snacks/unajerky = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red = 6)
prices = list( /obj/item/weapon/reagent_containers/food/snacks/tuna = 5,
/obj/item/weapon/reagent_containers/food/snacks/semki = 5,
@@ -1524,8 +1526,7 @@
/obj/item/clothing/gloves/black = 5,
/obj/item/weapon/storage/belt/janitor = 5,
/obj/item/clothing/shoes/galoshes = 5,
- /obj/item/weapon/cartridge/janitor = 5,
- /obj/item/weapon/watertank/janitor = 1
+ /obj/item/weapon/cartridge/janitor = 5
)
req_log_access = access_hop
has_logs = 1
diff --git a/code/modules/economy/vending_machines_vr.dm b/code/modules/economy/vending_machines_vr.dm
index afaff608d36..e2d41c78134 100644
--- a/code/modules/economy/vending_machines_vr.dm
+++ b/code/modules/economy/vending_machines_vr.dm
@@ -635,7 +635,15 @@
/obj/item/clothing/mask/bandana/gold = 5,
/obj/item/clothing/mask/bandana/green = 5,
/obj/item/clothing/mask/bandana/red = 5,
- /obj/item/clothing/mask/surgical = 5)
+ /obj/item/clothing/mask/surgical = 5,
+ /obj/item/clothing/accessory/pride/bi = 5,
+ /obj/item/clothing/accessory/pride/trans = 5,
+ /obj/item/clothing/accessory/pride/ace = 5,
+ /obj/item/clothing/accessory/pride/enby = 5,
+ /obj/item/clothing/accessory/pride/pan = 5,
+ /obj/item/clothing/accessory/pride/lesbian = 5,
+ /obj/item/clothing/accessory/pride/intersex = 5,
+ /obj/item/clothing/accessory/pride/vore = 5)
prices = list(/obj/item/clothing/accessory = 50,
/obj/item/clothing/accessory/armband/med/color = 50,
/obj/item/clothing/accessory/asymmetric = 50,
@@ -752,9 +760,18 @@
/obj/item/clothing/mask/bandana/gold = 50,
/obj/item/clothing/mask/bandana/green = 50,
/obj/item/clothing/mask/bandana/red = 50,
- /obj/item/clothing/mask/surgical = 50)
+ /obj/item/clothing/mask/surgical = 50,
+ /obj/item/clothing/accessory/pride/bi = 50,
+ /obj/item/clothing/accessory/pride/trans = 50,
+ /obj/item/clothing/accessory/pride/ace = 50,
+ /obj/item/clothing/accessory/pride/enby = 50,
+ /obj/item/clothing/accessory/pride/pan = 50,
+ /obj/item/clothing/accessory/pride/lesbian = 50,
+ /obj/item/clothing/accessory/pride/intersex = 50,
+ /obj/item/clothing/accessory/pride/vore = 50)
premium = list(/obj/item/weapon/bedsheet/rainbow = 1)
- contraband = list(/obj/item/clothing/mask/gas/clown_hat = 1)
+ contraband = list(/obj/item/clothing/mask/gas/clown_hat = 1,
+ /obj/item/clothing/accessory/collar/collarplanet_earth = 5)
/obj/machinery/vending/loadout/clothing
name = "General Jump"
@@ -1130,7 +1147,9 @@
/obj/item/weapon/pack/spaceball = 10,
/obj/item/weapon/storage/pill_bottle/dice = 5,
/obj/item/weapon/storage/pill_bottle/dice_nerd = 5,
- /obj/item/weapon/melee/umbrella/random = 10)
+ /obj/item/weapon/melee/umbrella/random = 10,
+ /obj/item/weapon/deck/schnapsen = 5,
+ /obj/item/weapon/deck/egy = 5)
prices = list(/obj/item/weapon/cane = 100,
/obj/item/weapon/pack/cardemon = 100,
/obj/item/weapon/deck/holder = 100,
@@ -1141,7 +1160,9 @@
/obj/item/weapon/pack/spaceball = 100,
/obj/item/weapon/storage/pill_bottle/dice = 100,
/obj/item/weapon/storage/pill_bottle/dice_nerd = 100,
- /obj/item/weapon/melee/umbrella/random = 100)
+ /obj/item/weapon/melee/umbrella/random = 100,
+ /obj/item/weapon/deck/schnapsen = 100,
+ /obj/item/weapon/deck/egy = 100)
premium = list(/obj/item/toy/bosunwhistle = 1)
contraband = list(/obj/item/toy/katana = 1)
@@ -2428,7 +2449,7 @@
desc = "Food made by dogs!"
product_ads = "EAT FOOD!!!;Awooooooooooooooo!~;Made by actual dogs!;Now with twenty percent more taste!!!"
icon = 'icons/obj/vending.dmi'
- icon_state = "fridge_food"
+ icon_state = "hotfood"
products = list(/obj/item/weapon/tray = 50,
/obj/item/weapon/material/kitchen/utensil/fork = 50,
/obj/item/weapon/material/knife/plastic = 50,
@@ -2916,7 +2937,7 @@
desc = "Food made by dogs!"
product_ads = "EAT FOOD!!!;Awooooooooooooooo!~;Made by actual dogs!;Now with twenty percent more taste!!!"
icon = 'icons/obj/vending.dmi'
- icon_state = "fridge_food"
+ icon_state = "hotfood"
products = list(/obj/item/weapon/tray = 50,
/obj/item/weapon/material/kitchen/utensil/fork = 50,
/obj/item/weapon/material/knife/plastic = 50,
@@ -3312,7 +3333,7 @@
desc = "Food made by dogs!"
product_ads = "EAT FOOD!!!;Awooooooooooooooo!~;Made by actual dogs!;Now with twenty percent more taste!!!"
icon = 'icons/obj/vending.dmi'
- icon_state = "fridge_food"
+ icon_state = "hotfood"
products = list(/obj/item/weapon/reagent_containers/food/snacks/bearmeat = 10,
/obj/item/weapon/reagent_containers/food/snacks/carpmeat = 10,
/obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish = 10,
diff --git a/code/modules/emotes/definitions/audible.dm b/code/modules/emotes/definitions/audible.dm
index 1a5a4e30842..d702a32d3a8 100644
--- a/code/modules/emotes/definitions/audible.dm
+++ b/code/modules/emotes/definitions/audible.dm
@@ -183,6 +183,7 @@
key = "squish"
emote_sound = 'sound/effects/slime_squish.ogg' //Credit to DrMinky (freesound.org) for the sound.
emote_message_3p = "squishes."
+ sound_vary = FALSE
/decl/emote/audible/warble
key = "warble"
@@ -204,6 +205,14 @@
emote_message_3p = "purrs."
emote_sound = 'sound/voice/cat_purr_long.ogg'
+/decl/emote/audible/fennecscream
+ key = "fennecscream"
+ emote_message_3p = "screeches!"
+
+/decl/emote/audible/zoom
+ key = "zoom"
+ emote_message_3p = "zooms."
+
/decl/emote/audible/teshsqueak
key = "surprised"
emote_message_1p = "You chirp in surprise!"
@@ -211,6 +220,7 @@
emote_message_1p_target = "You chirp in surprise at TARGET!"
emote_message_3p_target = "chirps in surprise at TARGET!"
emote_sound = 'sound/voice/teshsqueak.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio.
+ sound_vary = FALSE
/decl/emote/audible/teshchirp
key = "tchirp"
diff --git a/code/modules/emotes/definitions/audible_furry_vr.dm b/code/modules/emotes/definitions/audible_furry_vr.dm
index 61d980ad277..385759bc8da 100644
--- a/code/modules/emotes/definitions/audible_furry_vr.dm
+++ b/code/modules/emotes/definitions/audible_furry_vr.dm
@@ -34,6 +34,7 @@
key = "chirp"
emote_message_3p = "chirps!"
emote_sound = 'sound/misc/nymphchirp.ogg'
+ sound_vary = FALSE
/decl/emote/audible/hoot
key = "hoot"
emote_message_3p = "hoots!"
@@ -109,10 +110,12 @@
key = "snort"
emote_message_3p = "snorts!"
emote_sound = 'sound/voice/Snort.ogg'
+ sound_vary = FALSE
/decl/emote/audible/meow
key = "meow"
emote_message_3p = "gently meows!"
emote_sound = 'sound/voice/Meow.ogg'
+ sound_vary = FALSE
/decl/emote/audible/moo
key = "moo"
emote_message_3p = "takes a breath and lets out a moo."
@@ -141,6 +144,21 @@
key = "squeaky"
emote_message_3p = "squeaks."
emote_sound = 'sound/items/drop/plushie.ogg'
+/decl/emote/audible/mothscream
+ key = "mothscream"
+ emote_message_3p ="screams"
+ emote_sound = 'sound/voice/moth/scream_moth.ogg'
+
+/decl/emote/audible/mothchitter
+ key = "mothchitter"
+ emote_message_3p = "chitters"
+ emote_sound = 'sound/voice/moth/moth_chitter.ogg'
+
+/decl/emote/audible/mothlaugh
+ key = "mothlaugh"
+ emote_message_3p = "laughs"
+ emote_sound = 'sound/voice/moth/moth_laugh.ogg'
+
/decl/emote/audible/gyoh
key = "gyoh"
@@ -155,6 +173,12 @@
emote_sound = pick(smolsound)
else
emote_sound = pick(bigsound)
+ else if(istype(user, /mob/living/silicon/pai))
+ var/mob/living/silicon/pai/me = user
+ if(me.chassis == "teppi")
+ emote_sound = pick(bigsound)
+ else
+ emote_sound = pick(smolsound)
else if(user.size_multiplier >= 1.5)
emote_sound = pick(bigsound)
else
@@ -184,23 +208,23 @@
key = "coyawoo"
emote_message_3p = "lets out a scraggly awoo."
emote_sound = 'sound/voice/coyoteawoo.ogg'
-
+
/decl/emote/audible/coyawoo2
key = "coyawoo2"
emote_message_3p = "lets out a pronounced, scraggly awoo."
emote_sound = 'sound/voice/coyoteawoo2.ogg'
-
+
/decl/emote/audible/coyawoo3
key = "coyawoo3"
emote_message_3p = "yaps and lets out a scraggly awoo."
emote_sound = 'sound/voice/coyoteawoo3.ogg'
-
+
/decl/emote/audible/coyawoo4
key = "coyawoo4"
emote_message_3p = "yaps several times, and lets out a short, scraggly awoo."
emote_sound = 'sound/voice/coyoteawoo4.ogg'
-
+
/decl/emote/audible/coyawoo5
key = "coyawoo5"
emote_message_3p = "lets out a scraggly, whine-awoo."
- emote_sound = 'sound/voice/coyoteawoo5.ogg'
\ No newline at end of file
+ emote_sound = 'sound/voice/coyoteawoo5.ogg'
diff --git a/code/modules/emotes/definitions/synthetics.dm b/code/modules/emotes/definitions/synthetics.dm
index 70e05481cee..4f94b7b59b6 100644
--- a/code/modules/emotes/definitions/synthetics.dm
+++ b/code/modules/emotes/definitions/synthetics.dm
@@ -1,17 +1,18 @@
/decl/emote/audible/synth
- key = "beep"
- emote_message_3p = "beeps."
- emote_sound = 'sound/machines/twobeep.ogg'
+ key = "ping"
+ emote_message_3p = "pings."
+ emote_sound = 'sound/machines/ping.ogg'
/decl/emote/audible/synth/mob_can_use(var/mob/living/user)
if(istype(user) && user.isSynthetic())
return ..()
return FALSE
-/decl/emote/audible/synth/ping
- key = "ping"
- emote_message_3p = "pings."
- emote_sound = 'sound/machines/ping.ogg'
+/decl/emote/audible/synth/beep
+ key = "beep"
+ emote_message_3p = "beeps."
+ emote_sound = 'sound/machines/twobeep.ogg'
+ sound_vary = FALSE
/decl/emote/audible/synth/buzz
key = "buzz"
@@ -54,3 +55,21 @@
emote_message_3p_target = "chirps happily at TARGET!"
emote_message_3p = "chirps happily."
emote_sound = 'sound/machines/dwoop.ogg'
+
+/decl/emote/audible/synth/boop
+ key = "roboboop"
+ emote_message_1p_target = "You boop at TARGET!"
+ emote_message_1p = "You boop."
+ emote_message_3p_target = "boops at TARGET!"
+ emote_message_3p = "boops."
+ emote_sound = 'sound/voice/roboboop.ogg'
+ sound_vary = TRUE
+
+/decl/emote/audible/synth/robochirp
+ key = "robochirp"
+ emote_message_1p_target = "You chirp at TARGET!"
+ emote_message_1p = "You chirp."
+ emote_message_3p_target = "chirps at TARGET!"
+ emote_message_3p = "chirps."
+ emote_sound = 'sound/voice/robochirp.ogg'
+ sound_vary = TRUE
diff --git a/code/modules/emotes/emote_define.dm b/code/modules/emotes/emote_define.dm
index daff23f85d2..7aed1e982f3 100644
--- a/code/modules/emotes/emote_define.dm
+++ b/code/modules/emotes/emote_define.dm
@@ -44,6 +44,7 @@ var/global/list/emotes_by_key
var/emote_range = 0 // If >0, restricts emote visibility to viewers within range.
var/sound_preferences = list(/datum/client_preference/emote_noises) // Default emote sound_preferences is just emote_noises. Belch emote overrides this list for pref-checks.
+ var/sound_vary = FALSE
/decl/emote/Initialize()
. = ..()
@@ -186,7 +187,7 @@ var/global/list/emotes_by_key
if(islist(sound_to_play) && length(sound_to_play))
sound_to_play = pick(sound_to_play)
if(sound_to_play)
- playsound(user.loc, sound_to_play, use_sound["vol"], 0, preference = sound_preferences) //VOREStation Add - Preference
+ playsound(user.loc, sound_to_play, use_sound["vol"], sound_vary, frequency = null, preference = sound_preferences) //VOREStation Add - Preference
/decl/emote/proc/mob_can_use(var/mob/user)
return istype(user) && user.stat != DEAD && (type in user.get_available_emotes())
diff --git a/code/modules/emotes/emote_mob.dm b/code/modules/emotes/emote_mob.dm
index b0b3fce0bb0..9f60ca53d7d 100644
--- a/code/modules/emotes/emote_mob.dm
+++ b/code/modules/emotes/emote_mob.dm
@@ -54,7 +54,7 @@
if(act == "custom")
if(!message)
- message = sanitize_or_reflect(input(src,"Choose an emote to display.") as text|null, src) //VOREStation Edit - Reflect too long messages, within reason
+ message = sanitize_or_reflect(tgui_input_text(src,"Choose an emote to display."), src) //VOREStation Edit - Reflect too long messages, within reason
if(!message)
return
if (!m_type)
@@ -165,7 +165,7 @@
var/input
if(!message)
- input = sanitize(input(src,"Choose an emote to display.") as text|null)
+ input = sanitize(tgui_input_text(src,"Choose an emote to display."))
else
input = message
@@ -191,10 +191,21 @@
if(message)
message = encode_html_emphasis(message)
+ var/ourfreq = null
+ if(isliving(src))
+ var/mob/living/L = src
+ if(L.voice_freq > 0 )
+ ourfreq = L.voice_freq
+
+
// Hearing gasp and such every five seconds is not good emotes were not global for a reason.
// Maybe some people are okay with that.
var/turf/T = get_turf(src)
+
if(!T) return
+ if(client)
+ playsound(T, pick(emote_sound), 25, TRUE, falloff = 1 , is_global = TRUE, frequency = ourfreq, ignore_walls = FALSE, preference = /datum/client_preference/emote_sounds)
+
var/list/in_range = get_mobs_and_objs_in_view_fast(T,range,2,remote_ghosts = client ? TRUE : FALSE)
var/list/m_viewers = in_range["mobs"]
var/list/o_viewers = in_range["objs"]
diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm
index 99783780b08..a47847fc0a6 100644
--- a/code/modules/events/event_container.dm
+++ b/code/modules/events/event_container.dm
@@ -141,7 +141,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15),
//new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300),
- new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 0, 25, 50),
+ //new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 0, 25, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust , 60, list(ASSIGNMENT_ENGINEER = 20), 0, 0, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400),
diff --git a/code/modules/events/event_container_vr.dm b/code/modules/events/event_container_vr.dm
index 874dca6aea6..02e2623500a 100644
--- a/code/modules/events/event_container_vr.dm
+++ b/code/modules/events/event_container_vr.dm
@@ -40,7 +40,7 @@
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15),
//new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300),
- new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 1, 25, 50),
+ //new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 1, 25, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lore News", /datum/event/lore_news, 400),
diff --git a/code/modules/events/event_dynamic.dm b/code/modules/events/event_dynamic.dm
index e51dbf24721..68a72807f94 100644
--- a/code/modules/events/event_dynamic.dm
+++ b/code/modules/events/event_dynamic.dm
@@ -50,7 +50,7 @@ var/list/event_last_fired = list()
//possibleEvents[/datum/event/mundane_news] = 300
possibleEvents[/datum/event/lore_news] = 300 // up this if the above ones get removed as they damn well should
- possibleEvents[/datum/event/pda_spam] = max(min(25, player_list.len) * 4, 200)
+ //possibleEvents[/datum/event/pda_spam] = max(min(25, player_list.len) * 4, 200)
possibleEvents[/datum/event/money_lotto] = max(min(5, player_list.len), 50)
if(GLOB.account_hack_attempted)
possibleEvents[/datum/event/money_hacker] = max(min(25, player_list.len) * 4, 200)
diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm
index ea4f8d59cde..f8dca1824ba 100644
--- a/code/modules/events/event_manager.dm
+++ b/code/modules/events/event_manager.dm
@@ -156,7 +156,7 @@
config.allow_random_events = text2num(href_list["pause_all"])
log_and_message_admins("has [config.allow_random_events ? "resumed" : "paused"] countdown for all events.")
else if(href_list["interval"])
- var/delay = input(usr, "Enter delay modifier. A value less than one means events fire more often, higher than one less often.", "Set Interval Modifier") as num|null
+ var/delay = tgui_input_number(usr, "Enter delay modifier. A value less than one means events fire more often, higher than one less often.", "Set Interval Modifier")
if(delay && delay > 0)
var/datum/event_container/EC = locate(href_list["interval"])
EC.delay_modifier = delay
@@ -173,7 +173,7 @@
else if(href_list["back"])
selected_event_container = null
else if(href_list["set_name"])
- var/name = sanitize(input(usr, "Enter event name.", "Set Name") as text|null)
+ var/name = sanitize(tgui_input_text(usr, "Enter event name.", "Set Name"))
if(name)
var/datum/event_meta/EM = locate(href_list["set_name"])
EM.name = name
@@ -183,7 +183,7 @@
var/datum/event_meta/EM = locate(href_list["set_type"])
EM.event_type = type
else if(href_list["set_weight"])
- var/weight = input(usr, "Enter weight. A higher value means higher chance for the event of being selected.", "Set Weight") as num|null
+ var/weight = tgui_input_number(usr, "Enter weight. A higher value means higher chance for the event of being selected.", "Set Weight")
if(weight && weight > 0)
var/datum/event_meta/EM = locate(href_list["set_weight"])
EM.weight = weight
diff --git a/code/modules/events/grubinfestation_vr.dm b/code/modules/events/grubinfestation_vr.dm
index fa2742a6bc6..34cbec6005c 100644
--- a/code/modules/events/grubinfestation_vr.dm
+++ b/code/modules/events/grubinfestation_vr.dm
@@ -11,7 +11,8 @@
spawncount = rand(2 * severity, 6 * severity)
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines)
- if(istype(get_area(temp_vent), /area/crew_quarters/sleep))
+ var/area/A = get_area(temp_vent)
+ if(A.forbid_events)
continue
if(!temp_vent.welded && temp_vent.network && (temp_vent.loc.z in using_map.station_levels))
if(temp_vent.network.normal_members.len > 50)
@@ -23,7 +24,8 @@
/datum/event/grub_infestation/start()
while((spawncount >= 1) && vents.len)
var/obj/vent = pick(vents)
- new /mob/living/simple_mob/animal/solargrub_larva(get_turf(vent))
+ var/mob/living/simple_mob/animal/solargrub_larva/larva = new(get_turf(vent))
+ larva.tracked = TRUE
vents -= vent
spawncount--
vents.Cut()
@@ -33,6 +35,14 @@
for(var/mob/living/G as anything in existing_solargrubs)
if(!G || G.stat == DEAD)
continue
+ if(istype(G, /mob/living/simple_mob/animal/solargrub_larva))
+ var/mob/living/simple_mob/animal/solargrub_larva/L = G
+ if(!(L.tracked))
+ continue
+ if(istype(G, /mob/living/simple_mob/vore/solargrub))
+ var/mob/living/simple_mob/vore/solargrub/S = G
+ if(!(S.tracked))
+ continue
var/area/grub_area = get_area(G)
if(!grub_area) //Huh, really?
if(!get_turf(G)) //No turf either?
diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm
index 7e7c82a18de..7cba7cbbd39 100644
--- a/code/modules/events/spider_infestation.dm
+++ b/code/modules/events/spider_infestation.dm
@@ -19,7 +19,9 @@
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines)
if(!temp_vent.welded && temp_vent.network && (temp_vent.loc.z in using_map.station_levels))
if(temp_vent.network.normal_members.len > 50)
- vents += temp_vent
+ var/area/A = get_area(temp_vent)
+ if(!(A.forbid_events))
+ vents += temp_vent
while((spawncount >= 1) && vents.len)
var/obj/vent = pick(vents)
diff --git a/code/modules/food/food/condiment.dm b/code/modules/food/food/condiment.dm
index 5b137957db7..2373db3bc2f 100644
--- a/code/modules/food/food/condiment.dm
+++ b/code/modules/food/food/condiment.dm
@@ -135,6 +135,11 @@
desc = "Barbecue sauce, it's labeled 'sweet and spicy'."
icon_state = "barbecue"
center_of_mass = list("x"=16, "y"=6)
+ if("sprinkles")
+ name = "sprinkles"
+ desc = "Bottle of sprinkles, colourful!"
+ icon_state= "sprinkles"
+ center_of_mass = list("x"=16, "y"=6)
else
name = "Misc Condiment Bottle"
if (reagents.reagent_list.len==1)
@@ -208,6 +213,13 @@
. = ..()
reagents.add_reagent("yeast", 50)
+/obj/item/weapon/reagent_containers/food/condiment/sprinkles
+ name = "Sprinkles"
+
+/obj/item/weapon/reagent_containers/food/condiment/sprinkles/Initialize()
+ . = ..()
+ reagents.add_reagent("sprinkles", 50)
+
/obj/item/weapon/reagent_containers/food/condiment/small
possible_transfer_amounts = list(1,20)
amount_per_transfer_from_this = 1
@@ -448,22 +460,58 @@
//End of MRE stuff.
-/obj/item/weapon/reagent_containers/food/condiment/flour
- name = "flour sack"
- desc = "A big bag of flour. Good for baking!"
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour
+ name = "flour carton"
+ desc = "A big carton of flour. Good for baking!"
icon = 'icons/obj/food.dmi'
icon_state = "flour"
volume = 220
center_of_mass = list("x"=16, "y"=8)
-/obj/item/weapon/reagent_containers/food/condiment/flour/on_reagent_change()
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour/on_reagent_change()
+ update_icon()
return
-/obj/item/weapon/reagent_containers/food/condiment/flour/Initialize()
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour/Initialize()
. = ..()
reagents.add_reagent("flour", 200)
randpixel_xy()
+/obj/item/weapon/reagent_containers/food/condiment/carton/update_icon()
+ overlays.Cut()
+
+ if(reagents.total_volume)
+ var/image/filling = image('icons/obj/food.dmi', src, "[icon_state]10")
+
+ filling.icon_state = "[icon_state]-[clamp(round(100 * reagents.total_volume / volume, 25), 0, 100)]"
+
+ overlays += filling
+
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour/rustic
+ name = "flour sack"
+ desc = "An artisanal sack of flour. Classy!"
+ icon_state = "flour_bag"
+
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar
+ name = "sugar carton"
+ desc = "A big carton of sugar. Sweet!"
+ icon_state = "sugar"
+ volume = 120
+ center_of_mass = list("x"=16, "y"=8)
+
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar/on_reagent_change()
+ update_icon()
+ return
+
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar/Initialize()
+ . = ..()
+ reagents.add_reagent("sugar", 100)
+
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar/rustic
+ name = "sugar sack"
+ desc = "An artisanal sack of sugar. Classy!"
+ icon_state = "sugar_bag"
+
/obj/item/weapon/reagent_containers/food/condiment/spacespice
name = "space spices"
desc = "An exotic blend of spices for cooking. Definitely not worms."
@@ -477,4 +525,4 @@
/obj/item/weapon/reagent_containers/food/condiment/spacespice/Initialize()
. = ..()
- reagents.add_reagent("spacespice", 40)
\ No newline at end of file
+ reagents.add_reagent("spacespice", 40)
diff --git a/code/modules/food/food/drinks.dm b/code/modules/food/food/drinks.dm
index c30f5053cf4..8a9e434669a 100644
--- a/code/modules/food/food/drinks.dm
+++ b/code/modules/food/food/drinks.dm
@@ -23,18 +23,18 @@
price_tag = null
return
-/obj/item/weapon/reagent_containers/food/drinks/proc/On_Consume(var/mob/M)
- if(!usr)
- usr = M
- if(!reagents.total_volume)
+/obj/item/weapon/reagent_containers/food/drinks/proc/On_Consume(var/mob/M, var/mob/user, var/changed = FALSE)
+ if(!user)
+ user = M
+ if(!reagents.total_volume && changed)
M.visible_message("[M] finishes drinking \the [src].","You finish drinking \the [src].")
if(trash)
- usr.drop_from_inventory(src) //so icons update :[
+ user.drop_from_inventory(src) //so icons update :[
if(ispath(trash,/obj/item))
- var/obj/item/TrashItem = new trash(usr)
- usr.put_in_hands(TrashItem)
+ var/obj/item/TrashItem = new trash(user)
+ user.put_in_hands(TrashItem)
else if(istype(trash,/obj/item))
- usr.put_in_hands(trash)
+ user.put_in_hands(trash)
qdel(src)
return
@@ -73,8 +73,11 @@
if(!is_open_container())
to_chat(user, "You need to open [src]!")
return 1
- On_Consume(target,user)
- return ..()
+ var/original_volume = reagents.total_volume
+ .=..()
+ var/changed = !(reagents.total_volume == original_volume)
+ On_Consume(target,user,changed)
+ return
/obj/item/weapon/reagent_containers/food/drinks/standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target)
if(!is_open_container())
diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm
index db37cd13ce2..e87ed71f25a 100644
--- a/code/modules/food/food/snacks.dm
+++ b/code/modules/food/food/snacks.dm
@@ -3978,8 +3978,7 @@
/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/Initialize()
. = ..()
- reagents.add_reagent("fishbait", 9)
- reagents.add_reagent("protein", 3)
+ reagents.add_reagent("protein", 1)
/obj/item/weapon/reagent_containers/food/snacks/cutlet
name = "cutlet"
@@ -3991,8 +3990,7 @@
/obj/item/weapon/reagent_containers/food/snacks/cutlet/Initialize()
. = ..()
- reagents.add_reagent("fishbait", 15)
- reagents.add_reagent("protein", 5)
+ reagents.add_reagent("protein", 2)
/obj/item/weapon/reagent_containers/food/snacks/rawmeatball
name = "raw meatball"
@@ -4004,8 +4002,7 @@
/obj/item/weapon/reagent_containers/food/snacks/rawmeatball/Initialize()
. = ..()
- reagents.add_reagent("fishbait", 30)
- reagents.add_reagent("protein", 10)
+ reagents.add_reagent("protein", 2)
/obj/item/weapon/reagent_containers/food/snacks/hotdog
name = "hotdog"
@@ -4442,7 +4439,8 @@
/obj/item/weapon/reagent_containers/food/snacks/wormsickly/Initialize()
. = ..()
- reagents.add_reagent("fishbait", 10)
+ reagents.add_reagent("fishbait", 9)
+ reagents.add_reagent("protein", 3)
/obj/item/weapon/reagent_containers/food/snacks/worm
name = "strange worm"
@@ -4455,7 +4453,8 @@
/obj/item/weapon/reagent_containers/food/snacks/worm/Initialize()
. = ..()
- reagents.add_reagent("fishbait", 20)
+ reagents.add_reagent("fishbait", 15)
+ reagents.add_reagent("protein", 5)
/obj/item/weapon/reagent_containers/food/snacks/wormdeluxe
name = "deluxe worm"
@@ -4468,7 +4467,8 @@
/obj/item/weapon/reagent_containers/food/snacks/wormdeluxe/Initialize()
. = ..()
- reagents.add_reagent("fishbait", 40)
+ reagents.add_reagent("fishbait", 30)
+ reagents.add_reagent("protein", 10)
/obj/item/weapon/reagent_containers/food/snacks/siffruit
name = "pulsing fruit"
@@ -6894,6 +6894,7 @@
/obj/item/weapon/reagent_containers/food/snacks/appleberry/Initialize()
. = ..()
reagents.add_reagent("milk", 8)
+ reagents.add_reagent("sugar", 5)
/obj/item/weapon/reagent_containers/food/snacks/canned/ntbeans
name = "baked beans"
@@ -6922,10 +6923,11 @@
filling_color = "#caa3c9"
center_of_mass = list("x"=15, "y"=9)
bitesize = 2
+ var/brainmeat = "brain_protein"
/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/Initialize()
. = ..()
- reagents.add_reagent("brain_protein", 10)
+ reagents.add_reagent(brainmeat, 10)
/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red
name = "\improper BrainzSnax RED"
@@ -6939,10 +6941,7 @@
filling_color = "#a6898d"
center_of_mass = list("x"=15, "y"=9)
bitesize = 2
-
-/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red/Initialize()
- . = ..()
- reagents.add_reagent("red_brain_protein", 10)
+ brainmeat = "red_brain_protein"
//////////////Packaged Food - break open and eat//////////////
diff --git a/code/modules/food/food/z_custom_food_vr.dm b/code/modules/food/food/z_custom_food_vr.dm
index 7e0494cb126..fdbca07fda3 100644
--- a/code/modules/food/food/z_custom_food_vr.dm
+++ b/code/modules/food/food/z_custom_food_vr.dm
@@ -49,7 +49,7 @@ var/global/ingredientLimit = 20
I.forceMove(src)
if(S.reagents)
- S.reagents.trans_to(src,S.reagents.total_volume)
+ S.reagents.trans_to_holder(reagents,S.reagents.total_volume)
ingredients += S
@@ -142,7 +142,7 @@ var/global/ingredientLimit = 20
/obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich/attackby(obj/item/I,mob/user)
if(istype(I,/obj/item/weapon/reagent_containers/food/snacks/slice/bread) && !addTop)
- I.reagents.trans_to(src,I.reagents.total_volume)
+ I.reagents.trans_to_holder(reagents,I.reagents.total_volume)
qdel(I)
addTop = 1
src.drawTopping()
diff --git a/code/modules/food/kitchen/cooking_machines/container.dm b/code/modules/food/kitchen/cooking_machines/container.dm
index 981a809fd46..bd4a9d8e003 100644
--- a/code/modules/food/kitchen/cooking_machines/container.dm
+++ b/code/modules/food/kitchen/cooking_machines/container.dm
@@ -7,6 +7,7 @@
var/shortname
var/max_space = 20//Maximum sum of w-classes of foods in this container at once
var/max_reagents = 80//Maximum units of reagents
+ var/food_items = 0 // Used for icon updates
flags = OPENCONTAINER | NOREACT
var/list/insertable = list(
/obj/item/weapon/reagent_containers/food/snacks,
@@ -59,6 +60,8 @@
return
I.forceMove(src)
to_chat(user, "You put the [I] into the [src].")
+ food_items += 1
+ update_icon()
return
/obj/item/weapon/reagent_containers/cooking_container/verb/empty()
@@ -102,6 +105,8 @@
/obj/item/weapon/reagent_containers/cooking_container/AltClick(var/mob/user)
do_empty(user)
+ food_items = 0
+ update_icon()
//Deletes contents of container.
//Used when food is burned, before replacing it with a burned mess
@@ -158,6 +163,22 @@
if (weights[I])
holder.trans_to(I, weights[I] / total)
+/obj/item/weapon/reagent_containers/cooking_container/update_icon()
+ overlays.Cut()
+
+ if(food_items)
+ var/image/filling = image('icons/obj/cooking_machines.dmi', src, "[icon_state]10")
+
+ var/percent = round((food_items / max_space) * 100)
+ switch(percent)
+ if(0 to 2) filling.icon_state = "[icon_state]"
+ if(3 to 24) filling.icon_state = "[icon_state]1"
+ if(25 to 49) filling.icon_state = "[icon_state]2"
+ if(50 to 74) filling.icon_state = "[icon_state]3"
+ if(75 to 79) filling.icon_state = "[icon_state]4"
+ if(80 to INFINITY) filling.icon_state = "[icon_state]5"
+
+ overlays += filling
/obj/item/weapon/reagent_containers/cooking_container/oven
name = "oven dish"
@@ -186,4 +207,4 @@
name = "grill rack"
shortname = "rack"
desc = "Put ingredients 'in'/on this; designed for use with a grill. Warranty void if used incorrectly. Alt click to remove contents."
- icon_state = "grillrack"
\ No newline at end of file
+ icon_state = "grillrack"
diff --git a/code/modules/food/kitchen/cooking_machines/fryer.dm b/code/modules/food/kitchen/cooking_machines/fryer.dm
index bcaad4e6939..bfc237df73e 100644
--- a/code/modules/food/kitchen/cooking_machines/fryer.dm
+++ b/code/modules/food/kitchen/cooking_machines/fryer.dm
@@ -206,7 +206,7 @@
var/obj/item/organ/external/E
var/nopain
- if(ishuman(victim) && user.zone_sel.selecting != "groin" && user.zone_sel.selecting != "chest")
+ if(ishuman(victim) && user.zone_sel.selecting != BP_GROIN && user.zone_sel.selecting != BP_TORSO)
var/mob/living/carbon/human/H = victim
E = H.get_organ(user.zone_sel.selecting)
if(!E || E.species.flags & NO_PAIN)
diff --git a/code/modules/food/kitchen/gibber.dm b/code/modules/food/kitchen/gibber.dm
index eb3e1ed7093..73527dfe62c 100644
--- a/code/modules/food/kitchen/gibber.dm
+++ b/code/modules/food/kitchen/gibber.dm
@@ -211,7 +211,7 @@
new_meat.name = "[slab_name] [new_meat.name]"
new_meat.reagents.add_reagent("nutriment",slab_nutrition)
if(src.occupant.reagents)
- src.occupant.reagents.trans_to_obj(new_meat, round(occupant.reagents.total_volume/slab_count,1))
+ src.occupant.reagents.trans_to_obj(new_meat, round(occupant.reagents.total_volume/(2 + occupant.meat_amount),1))
add_attack_logs(user,occupant,"Used [src] to gib")
diff --git a/code/modules/food/kitchen/icecream.dm b/code/modules/food/kitchen/icecream.dm
index 313fe026d4f..f2238493482 100644
--- a/code/modules/food/kitchen/icecream.dm
+++ b/code/modules/food/kitchen/icecream.dm
@@ -92,7 +92,7 @@
var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = O
if(!I.ice_creamed)
if(product_types[dispense_flavour] > 0)
- src.visible_message("[bicon(src)] [user] scoops delicious [flavour_name] icecream into [I].")
+ src.visible_message("\icon[src][bicon(src)] [user] scoops delicious [flavour_name] icecream into [I].")
product_types[dispense_flavour] -= 1
I.add_ice_cream(flavour_name)
// if(beaker)
diff --git a/code/modules/food/kitchen/microwave.dm b/code/modules/food/kitchen/microwave.dm
index bab265f004b..dd30240eecf 100644
--- a/code/modules/food/kitchen/microwave.dm
+++ b/code/modules/food/kitchen/microwave.dm
@@ -22,7 +22,7 @@
var/global/list/acceptable_items // List of the items you can put in
var/global/list/available_recipes // List of the recipes you can use
var/global/list/acceptable_reagents // List of the reagents you can put in
-
+
var/global/max_n_of_items = 20
var/appliancetype = MICROWAVE
var/datum/looping_sound/microwave/soundloop
@@ -36,7 +36,7 @@
/obj/machinery/microwave/Initialize()
. = ..()
-
+
reagents = new/datum/reagents(100)
reagents.my_atom = src
@@ -47,7 +47,7 @@
for(var/datum/recipe/typepath as anything in subtypesof(/datum/recipe))
if((initial(typepath.appliance) & appliancetype))
available_recipes += new typepath
-
+
acceptable_items = new
acceptable_reagents = new
for (var/datum/recipe/recipe in available_recipes)
@@ -66,6 +66,8 @@
soundloop = new(list(src), FALSE)
/obj/machinery/microwave/Destroy()
+ if(paicard)
+ ejectpai() // Lets not delete the pAI.
QDEL_NULL(soundloop)
return ..()
@@ -125,7 +127,8 @@
to_chat(user, "It's dirty!")
return 1
else if(is_type_in_list(O,acceptable_items))
- if(contents.len>=(max_n_of_items + component_parts.len + circuit_item_capacity)) //Adds component_parts to the maximum number of items. changed 1 to actually just be the circuit item capacity var.
+ var/list/workingList = cookingContents()
+ if(workingList.len>=(max_n_of_items + circuit_item_capacity)) //Adds component_parts to the maximum number of items. changed 1 to actually just be the circuit item capacity var.
to_chat(user, "This [src] is full of ingredients, you cannot put more.")
return 1
if(istype(O, /obj/item/stack) && O:get_amount() > 1) // This is bad, but I can't think of how to change it
@@ -144,6 +147,34 @@
"You add \the [O] to \the [src].")
SStgui.update_uis(src)
return
+ else if (istype(O,/obj/item/weapon/storage/bag/plants)) // There might be a better way about making plant bags dump their contents into a microwave, but it works.
+ var/obj/item/weapon/storage/bag/plants/bag = O
+ var/failed = 1
+ for(var/obj/item/G in O.contents)
+ if(!G.reagents || !G.reagents.total_volume)
+ continue
+ failed = 0
+ if(contents.len>=(max_n_of_items + component_parts.len + circuit_item_capacity))
+ to_chat(user, "This [src] is full of ingredients, you cannot put more.")
+ return 0
+ else
+ bag.remove_from_storage(G, src)
+ contents += G
+ if(contents.len>=(max_n_of_items + component_parts.len + circuit_item_capacity))
+ break
+
+ if(failed)
+ to_chat(user, "Nothing in the plant bag is usable.")
+ return 0
+
+ if(!O.contents.len)
+ to_chat(user, "You empty \the [O] into \the [src].")
+ else
+ to_chat(user, "You fill \the [src] from \the [O].")
+
+ SStgui.update_uis(src)
+ return 0
+
else if(istype(O,/obj/item/weapon/reagent_containers/glass) || \
istype(O,/obj/item/weapon/reagent_containers/food/drinks) || \
istype(O,/obj/item/weapon/reagent_containers/food/condiment) \
@@ -180,6 +211,9 @@
to_chat(user, "You decide not to do that.")
else if(default_part_replacement(user, O))
return
+ else if(istype(O, /obj/item/device/paicard))
+ if(!paicard)
+ insertpai(user, O)
else
to_chat(user, "You have no idea what you can cook with this [O].")
..()
@@ -192,6 +226,10 @@
attack_hand(user)
/obj/machinery/microwave/attack_hand(mob/user as mob)
+ if(user.a_intent == I_GRAB)
+ if(paicard)
+ ejectpai(user)
+ return
user.set_machine(src)
tgui_interact(user)
@@ -211,7 +249,7 @@
data["operating"] = operating
data["dirty"] = dirty == 100
data["items"] = get_items_list()
-
+
return data
/obj/machinery/microwave/proc/get_items_list()
@@ -220,7 +258,8 @@
var/list/items_counts = list()
var/list/items_measures = list()
var/list/items_measures_p = list()
- for(var/obj/O in ((contents - component_parts) - circuit))
+ //for(var/obj/O in ((contents - component_parts) - circuit))
+ for(var/obj/O in cookingContents())
var/display_name = O.name
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
items_measures[display_name] = "egg"
@@ -283,7 +322,7 @@
if("dispose")
dispose()
return TRUE
-/*
+/*
/obj/machinery/microwave/interact(mob/user as mob) // The microwave Menu
var/dat = ""
if(src.broken > 0)
@@ -355,7 +394,7 @@
if(stat & (NOPOWER|BROKEN))
return
start()
- if(reagents.total_volume==0 && !(locate(/obj) in ((contents - component_parts) - circuit))) //dry run
+ if(reagents.total_volume==0 && !(locate(/obj) in cookingContents())) //dry run
if(!wzhzhzh(16)) //VOREStation Edit - Quicker Microwaves (Undone during Auroraport, left note in case of reversion, was 5)
abort()
return
@@ -390,7 +429,7 @@
cooked = fail()
cooked.forceMove(src.loc)
return
-
+
//Making multiple copies of a recipe
var/halftime = round(recipe.time*4/10/2) // VOREStation Edit - Quicker Microwaves (Undone during Auroraport, left note in case of reversion, was round(recipe.time/20/2))
if(!wzhzhzh(halftime))
@@ -433,7 +472,7 @@
for(var/obj/item/weapon/reagent_containers/food/snacks/S in cooked_items)
reagents.trans_to_holder(S.reagents, total/cooked_items.len)
- for(var/obj/item/weapon/reagent_containers/food/snacks/S in contents)
+ for(var/obj/item/weapon/reagent_containers/food/snacks/S in cookingContents())
S.cook()
dispose(0) //clear out anything left
@@ -451,7 +490,7 @@
/obj/machinery/microwave/proc/has_extra_item() //- coded to have different microwaves be able to handle different items
if(item_level == 0)
- for (var/obj/O in ((contents - component_parts) - circuit))
+ for (var/obj/O in cookingContents())
if ( \
!istype(O,/obj/item/weapon/reagent_containers/food) && \
!istype(O, /obj/item/weapon/grown) \
@@ -459,7 +498,7 @@
return 1
return 0
if(item_level == 1)
- for (var/obj/O in ((contents - component_parts) - circuit))
+ for (var/obj/O in cookingContents())
if ( \
!istype(O, /obj/item/weapon/reagent_containers/food) && \
!istype(O, /obj/item/weapon/grown) && \
@@ -483,7 +522,7 @@
icon_state = "mw"
SStgui.update_uis(src)
soundloop.stop()
-
+
/obj/machinery/microwave/proc/stop()
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
operating = FALSE // Turn it off again aferwards
@@ -493,7 +532,7 @@
soundloop.stop()
/obj/machinery/microwave/proc/dispose(var/message = 1)
- for (var/atom/movable/A in ((contents-component_parts)-circuit))
+ for (var/atom/movable/A in cookingContents())
A.forceMove(loc)
if (src.reagents.total_volume)
src.dirty++
@@ -527,11 +566,12 @@
src.operating = 0 // Turn it off again aferwards
SStgui.update_uis(src)
soundloop.stop()
+ src.ejectpai() // If it broke, time to yeet the PAI.
/obj/machinery/microwave/proc/fail()
var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/ffuu = new(src)
var/amount = 0
- for (var/obj/O in (((contents - ffuu) - component_parts) - circuit))
+ for (var/obj/O in cookingContents() - ffuu)
amount++
if(O.reagents)
var/id = O.reagents.get_master_reagent_id()
@@ -558,14 +598,14 @@
if(!do_after(usr, 1 SECONDS, target = src))
return
-
+
if(operating)
to_chat(usr, "You can't do that, [src] door is locked!")
return
usr.visible_message(
- "[usr] opened [src] and has taken out [english_list(((contents-component_parts)-circuit))]." ,
- "You have opened [src] and taken out [english_list(((contents-component_parts)-circuit))]."
+ "[usr] opened [src] and has taken out [english_list(cookingContents())]." ,
+ "You have opened [src] and taken out [english_list(cookingContents())]."
)
dispose()
@@ -594,7 +634,7 @@
/obj/item/weapon/holder
)
result = /obj/effect/decal/cleanable/blood/gibs
-
+
/datum/recipe/splat/before_cook(obj/container)
if(istype(container, /obj/machinery/microwave))
var/obj/machinery/microwave/M = container
@@ -617,3 +657,14 @@
var/obj/machinery/microwave/M = container
M.muck_finish()
. = ..()
+
+/obj/machinery/microwave/proc/cookingContents() //VOREEdit, this is a better way to deal with the contents of a microwave, since the previous method is stupid.
+ var/list/workingList = contents.Copy() // Using the copy proc because otherwise the two lists seem to become soul bonded.
+ workingList -= component_parts
+ workingList -= circuit
+ if(paicard)
+ workingList -= paicard
+ for(var/M in workingList)
+ if(istype(M, circuit)) // Yes, we remove circuit twice. Yes, it's necessary. Yes, it's stupid.
+ workingList -= M
+ return workingList
\ No newline at end of file
diff --git a/code/modules/food/kitchen/smartfridge/smartfridge.dm b/code/modules/food/kitchen/smartfridge/smartfridge.dm
index f98da20f8c2..11ce0e461ec 100644
--- a/code/modules/food/kitchen/smartfridge/smartfridge.dm
+++ b/code/modules/food/kitchen/smartfridge/smartfridge.dm
@@ -216,7 +216,7 @@
if(params["amount"])
amount = params["amount"]
else
- amount = input(usr, "How many items?", "How many items would you like to take out?", 1) as num|null
+ amount = tgui_input_number(usr, "How many items?", "How many items would you like to take out?", 1)
if(QDELETED(src) || QDELETED(usr) || !usr.Adjacent(src))
return FALSE
diff --git a/code/modules/food/recipes_fryer.dm b/code/modules/food/recipes_fryer.dm
index bc977d8afb8..4f1bc471e42 100644
--- a/code/modules/food/recipes_fryer.dm
+++ b/code/modules/food/recipes_fryer.dm
@@ -18,6 +18,7 @@
fruit = list("chili" = 1)
coating = /datum/reagent/nutriment/coating/batter
result = /obj/item/weapon/reagent_containers/food/snacks/jalapeno_poppers
+ result_quantity = 2
/datum/recipe/risottoballs
appliance = FRYER
@@ -26,6 +27,7 @@
coating = /datum/reagent/nutriment/coating/batter
reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product
result = /obj/item/weapon/reagent_containers/food/snacks/risottoballs
+ result_quantity = 2
/datum/recipe/bellefritter
appliance = FRYER
@@ -33,12 +35,14 @@
reagents = list("sugar" = 5)
items = list(/obj/item/weapon/reagent_containers/food/snacks/frostbelle)
result = /obj/item/weapon/reagent_containers/food/snacks/bellefritter
+ result_quantity = 2
/datum/recipe/onionrings
appliance = FRYER
coating = /datum/reagent/nutriment/coating/batter
fruit = list("onion" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/onionrings
+ result_quantity = 2
//Meaty Recipes
//====================
@@ -169,6 +173,7 @@
appliance = FRYER
reagents = list("sugar" = 5, "batter" = 10)
result = /obj/item/weapon/reagent_containers/food/snacks/funnelcake
+ result_quantity = 2
/datum/recipe/pisanggoreng
appliance = FRYER
diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm
index 7b30e0f5c13..1f470c81bbd 100644
--- a/code/modules/food/recipes_microwave.dm
+++ b/code/modules/food/recipes_microwave.dm
@@ -73,6 +73,7 @@ I said no!
/obj/item/weapon/reagent_containers/food/snacks/dough,
)
result = /obj/item/weapon/reagent_containers/food/snacks/muffin
+ result_quantity = 2
/datum/recipe/eggplantparm
fruit = list("eggplant" = 1)
@@ -248,6 +249,7 @@ I said no!
/obj/item/weapon/reagent_containers/food/snacks/dough,
)
result = /obj/item/weapon/reagent_containers/food/snacks/rofflewaffles
+ result_quantity = 2
/datum/recipe/stew
fruit = list("potato" = 1, "tomato" = 1, "carrot" = 1, "eggplant" = 1, "mushroom" = 1)
@@ -415,6 +417,7 @@ I said no!
fruit = list("plumphelmet" = 1)
reagents = list("water" = 5, "flour" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit
+ result_quantity = 2
/datum/recipe/mushroomsoup
fruit = list("mushroom" = 1)
@@ -478,6 +481,7 @@ I said no!
/obj/item/weapon/reagent_containers/food/snacks/sliceable/bread,
)
result = /obj/item/weapon/reagent_containers/food/snacks/stuffing
+ result_quantity = 2
/datum/recipe/mashedpotato
items = list(
@@ -511,6 +515,7 @@ I said no!
/obj/item/weapon/reagent_containers/food/snacks/dough
)
result = /obj/item/weapon/reagent_containers/food/snacks/bun
+ result_quantity = 3
/datum/recipe/microwaveflatbread
items = list(
@@ -536,6 +541,7 @@ I said no!
/obj/item/weapon/reagent_containers/food/snacks/rawsunflower
)
result = /obj/item/weapon/reagent_containers/food/snacks/roastedsunflower
+ result_quantity = 2
/datum/recipe/roastedsunflowerseeds
reagents = list("sodiumchloride" = 1, "cookingoil" = 1)
@@ -543,6 +549,7 @@ I said no!
/obj/item/weapon/reagent_containers/food/snacks/rawsunflower
)
result = /obj/item/weapon/reagent_containers/food/snacks/roastedsunflower
+ result_quantity = 2
/datum/recipe/roastedpeanutsunflowerseeds
reagents = list("sodiumchloride" = 1, "peanutoil" = 1)
@@ -550,21 +557,25 @@ I said no!
/obj/item/weapon/reagent_containers/food/snacks/rawsunflower
)
result = /obj/item/weapon/reagent_containers/food/snacks/roastedsunflower
+ result_quantity = 2
/datum/recipe/roastedpeanuts
fruit = list("peanut" = 2)
reagents = list("sodiumchloride" = 2, "cookingoil" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/roastedpeanuts
+ result_quantity = 2
/datum/recipe/roastedpeanutscorn
fruit = list("peanut" = 2)
reagents = list("sodiumchloride" = 2, "cornoil" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/roastedpeanuts
+ result_quantity = 2
/datum/recipe/roastedpeanutspeanut
fruit = list("peanut" = 2)
reagents = list("sodiumchloride" = 2, "peanutoil" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/roastedpeanuts
+ result_quantity = 2
/datum/recipe/mint
reagents = list("sugar" = 5, "frostoil" = 5)
@@ -596,6 +607,7 @@ I said no!
)
reagents = list("sugar" = 5, "egg" = 3)
result = /obj/item/weapon/reagent_containers/food/snacks/sugarcookie
+ result_quantity = 4
/datum/recipe/berrymuffin
reagents = list("milk" = 5, "sugar" = 5)
@@ -604,6 +616,7 @@ I said no!
)
fruit = list("berries" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/berrymuffin/berry
+ result_quantity = 2
/datum/recipe/poisonberrymuffin
reagents = list("milk" = 5, "sugar" = 5)
@@ -612,6 +625,7 @@ I said no!
)
fruit = list("poisonberries" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/berrymuffin/poison
+ result_quantity = 2
/datum/recipe/ghostmuffin
reagents = list("milk" = 5, "sugar" = 5)
@@ -621,6 +635,7 @@ I said no!
)
fruit = list("berries" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/ghostmuffin/berry
+ result_quantity = 2
/datum/recipe/poisonghostmuffin
reagents = list("milk" = 5, "sugar" = 5)
@@ -630,6 +645,7 @@ I said no!
)
fruit = list("poisonberries" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/ghostmuffin/poison
+ result_quantity = 2
/datum/recipe/eggroll
reagents = list("soysauce" = 10)
@@ -841,6 +857,7 @@ I said no!
)
reagent_mix = RECIPE_REAGENT_REPLACE
result = /obj/item/weapon/reagent_containers/food/snacks/nugget
+ result_quantity = 3
// Chip update
/datum/recipe/microwavetortilla
@@ -850,6 +867,7 @@ I said no!
)
result = /obj/item/weapon/reagent_containers/food/snacks/tortilla
reagent_mix = RECIPE_REAGENT_REPLACE //no gross flour or water
+ result_quantity = 3
/datum/recipe/taco
items = list(
@@ -1041,6 +1059,7 @@ I said no!
)
fruit = list("cabbage" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/stuffed_meatball
+ result_quantity = 2
/datum/recipe/egg_pancake
items = list(
diff --git a/code/modules/food/recipes_microwave_vr.dm b/code/modules/food/recipes_microwave_vr.dm
index 31c9d1268cf..03c96d82961 100644
--- a/code/modules/food/recipes_microwave_vr.dm
+++ b/code/modules/food/recipes_microwave_vr.dm
@@ -37,6 +37,7 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/donerkebab
+
/datum/recipe/roastbeef
fruit = list("carrot" = 2, "potato" = 2)
items = list(
@@ -150,7 +151,7 @@
result = /obj/item/weapon/storage/box/wings/tray
/datum/recipe/bucket
- fruit = list("potato" = 1)
+ fruit = list("durian" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
diff --git a/code/modules/food/recipes_oven.dm b/code/modules/food/recipes_oven.dm
index 7b8bb2e46ed..bf932c9da08 100644
--- a/code/modules/food/recipes_oven.dm
+++ b/code/modules/food/recipes_oven.dm
@@ -76,8 +76,6 @@
/datum/recipe/bread
appliance = OVEN
items = list(
- /obj/item/weapon/reagent_containers/food/snacks/dough,
- /obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough
)
@@ -97,13 +95,10 @@
/datum/recipe/tofubread
appliance = OVEN
items = list(
- /obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/tofu,
/obj/item/weapon/reagent_containers/food/snacks/tofu,
- /obj/item/weapon/reagent_containers/food/snacks/tofu,
- /obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
@@ -134,17 +129,15 @@
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough
)
result = /obj/item/weapon/reagent_containers/food/snacks/tortilla
+ result_quantity = 3
/datum/recipe/meatbread
appliance = OVEN
items = list(
- /obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
- /obj/item/weapon/reagent_containers/food/snacks/meat,
- /obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
@@ -153,13 +146,10 @@
/datum/recipe/syntibread
appliance = OVEN
items = list(
- /obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
- /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
- /obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
@@ -168,13 +158,10 @@
/datum/recipe/xenomeatbread
appliance = OVEN
items = list(
- /obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/xenomeat,
/obj/item/weapon/reagent_containers/food/snacks/xenomeat,
- /obj/item/weapon/reagent_containers/food/snacks/xenomeat,
- /obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
)
@@ -185,7 +172,6 @@
fruit = list("banana" = 1)
reagents = list("milk" = 5, "sugar" = 15)
items = list(
- /obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough
)
@@ -198,6 +184,7 @@
/obj/item/weapon/reagent_containers/food/snacks/dough
)
result = /obj/item/weapon/reagent_containers/food/snacks/bun
+ result_quantity = 3
//Predesigned pies
//=======================
@@ -273,6 +260,7 @@
reagents = list("sugar" = 10)
items = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough)
result = /obj/item/weapon/reagent_containers/food/snacks/appletart
+ result_quantity = 2
reagent_mix = RECIPE_REAGENT_REPLACE
/datum/recipe/keylimepie
@@ -333,7 +321,6 @@
reagent_mix = RECIPE_REAGENT_REPLACE //No egg or mix in final recipe
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/brownies
-
/datum/recipe/cosmicbrownies
appliance = OVEN
reagents = list("browniemix" = 10, "egg" = 3)
@@ -344,7 +331,7 @@
/datum/recipe/buchedenoel
appliance = OVEN
fruit = list("berries" = 2)
- reagents = list("milk" = 5, "flour" = 15, "cream" = 10, "coco" = 5, "egg" = 6)
+ reagents = list("cakebatter" = 20, "cream" = 10, "coco" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/buchedenoel
/datum/recipe/cinnamonbun
@@ -443,19 +430,19 @@
//============
/datum/recipe/cake
appliance = OVEN
- reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9, "vanilla" = 1)
+ reagents = list("cakebatter" = 30, "vanilla" = 2)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake
reagent_mix = RECIPE_REAGENT_REPLACE
/datum/recipe/cake/carrot
appliance = OVEN
fruit = list("carrot" = 3)
- reagents = list("milk" = 5, "flour" = 15, "egg" = 9,"sugar" = 5)
+ reagents = list("cakebatter" = 30)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake
/datum/recipe/cake/cheese
appliance = OVEN
- reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9)
+ reagents = list("cakebatter" = 30)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
@@ -463,49 +450,48 @@
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake
/datum/recipe/cake/peanut
- fruit = list("peanut" = 3)
- reagents = list("milk" = 5, "flour" = 10, "sugar" = 5, "egg" = 6, "peanutbutter" = 5)
+ fruit = list("peanut" = 1)
+ reagents = list("cakebatter" = 30, "peanutbutter" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/peanutcake
/datum/recipe/cake/orange
appliance = OVEN
- fruit = list("orange" = 1)
- reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "sugar" = 5)
+ fruit = list("orange" = 2)
+ reagents = list("cakebatter" = 30)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake
/datum/recipe/cake/lime
appliance = OVEN
- fruit = list("lime" = 1)
- reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "limejuice" = 3, "sugar" = 5)
+ fruit = list("lime" = 2)
+ reagents = list("cakebatter" = 30)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake
/datum/recipe/cake/lemon
appliance = OVEN
- fruit = list("lemon" = 1)
- reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "lemonjuice" = 3, "sugar" = 5)
+ fruit = list("lemon" = 2)
+ reagents = list("cakebatter" = 30)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake
/datum/recipe/cake/chocolate
appliance = OVEN
- items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar)
- reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "coco" = 4, "sugar" = 5)
+ reagents = list("cakebatter" = 30, "coco" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake
/datum/recipe/cake/birthday
appliance = OVEN
- reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9)
+ reagents = list("cakebatter" = 30)
items = list(/obj/item/clothing/head/cakehat)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake
/datum/recipe/cake/apple
appliance = OVEN
fruit = list("apple" = 2)
- reagents = list("milk" = 5, "flour" = 15, "egg" = 9,"sugar" = 5)
+ reagents = list("cakebatter" = 30)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake
/datum/recipe/cake/brain
appliance = OVEN
- reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9)
+ reagents = list("cakebatter" = 30)
items = list(/obj/item/organ/internal/brain)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake
@@ -517,6 +503,7 @@
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough
)
result = /obj/item/weapon/reagent_containers/food/snacks/pancakes
+ result_quantity = 2
/datum/recipe/pancakes/berry
appliance = OVEN
@@ -527,6 +514,7 @@
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough
)
result = /obj/item/weapon/reagent_containers/food/snacks/pancakes/berry
+ result_quantity = 2
/datum/recipe/lasagna
appliance = OVEN
@@ -547,6 +535,7 @@
)
reagents = list("milk" = 5, "egg" = 3,"honey" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/honeybun
+ result_quantity = 4
//Bacon
/datum/recipe/bacon_oven
@@ -602,6 +591,7 @@
reagent_mix = RECIPE_REAGENT_REPLACE
items = list(/obj/item/weapon/reagent_containers/food/snacks/dough)
result = /obj/item/weapon/reagent_containers/food/snacks/croissant
+ result_quantity = 2
/datum/recipe/macncheese
appliance = OVEN
@@ -639,6 +629,7 @@
/obj/item/weapon/reagent_containers/food/snacks/dough
)
result = /obj/item/weapon/reagent_containers/food/snacks/waffles
+ result_quantity = 2
/datum/recipe/loadedbakedpotatooven
appliance = OVEN
@@ -656,6 +647,7 @@
)
reagent_mix = RECIPE_REAGENT_REPLACE //Water used up in cooking
result = /obj/item/weapon/reagent_containers/food/snacks/meatbun
+ result_quantity = 2
/datum/recipe/spicedmeatbun
appliance = OVEN
@@ -666,6 +658,7 @@
)
reagent_mix = RECIPE_REAGENT_REPLACE //Water used up in cooking
result = /obj/item/weapon/reagent_containers/food/snacks/spicedmeatbun
+ result_quantity = 2
/datum/recipe/custardbun
appliance = OVEN
@@ -687,6 +680,7 @@
)
reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product
result = /obj/item/weapon/reagent_containers/food/snacks/chickenmomo
+ result_quantity = 2
/datum/recipe/veggiemomo
appliance = OVEN
@@ -698,4 +692,5 @@
/obj/item/weapon/reagent_containers/food/snacks/doughslice
)
reagent_mix = RECIPE_REAGENT_REPLACE //Get that water outta here
- result = /obj/item/weapon/reagent_containers/food/snacks/veggiemomo
\ No newline at end of file
+ result = /obj/item/weapon/reagent_containers/food/snacks/veggiemomo
+ result_quantity = 2
\ No newline at end of file
diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm
index 10340e1a28a..70f8c6a6d3e 100644
--- a/code/modules/games/cards.dm
+++ b/code/modules/games/cards.dm
@@ -157,7 +157,7 @@
players += player
//players -= usr
var/maxcards = max(min(cards.len,10),1)
- var/dcard = input(usr, "How many card(s) do you wish to deal? You may deal up to [maxcards] cards.") as num
+ var/dcard = tgui_input_number(usr, "How many card(s) do you wish to deal? You may deal up to [maxcards] cards.", null, null, maxcards)
if(dcard > maxcards)
return
var/mob/living/M = tgui_input_list(usr, "Who do you wish to deal [dcard] card(s)?", "Deal to whom?", players)
@@ -188,7 +188,7 @@
if(P.name != "Blank Card")
to_chat(user,"You cannot write on that card.")
return
- var/cardtext = sanitize(input(user, "What do you wish to write on the card?", "Card Editing") as text|null, MAX_PAPER_MESSAGE_LEN)
+ var/cardtext = sanitize(tgui_input_text(user, "What do you wish to write on the card?", "Card Editing", null, MAX_PAPER_MESSAGE_LEN), MAX_PAPER_MESSAGE_LEN)
if(!cardtext)
return
P.name = cardtext
@@ -321,7 +321,7 @@
var/i
var/maxcards = min(cards.len,5) // Maximum of 5 cards at once
- var/discards = input(usr, "How many cards do you want to discard? You may discard up to [maxcards] card(s)") as num
+ var/discards = tgui_input_number(usr, "How many cards do you want to discard? You may discard up to [maxcards] card(s)", null, null, maxcards, 0)
if(discards > maxcards)
return
for (i = 0;i < discards;i++)
diff --git a/code/modules/games/egy_cards_vr.dm b/code/modules/games/egy_cards_vr.dm
new file mode 100644
index 00000000000..c41fd68b19d
--- /dev/null
+++ b/code/modules/games/egy_cards_vr.dm
@@ -0,0 +1,47 @@
+//Sprites ported from Eris
+
+/obj/item/weapon/deck/egy
+ name = "deck of EGY playing cards"
+ desc = "A simple deck of EGY playing cards. Be the first to lose all cards, but forget not to declare: EGY on your second to last trick."
+ icon_state = "deck3"
+
+
+
+
+/obj/item/weapon/deck/egy/New()
+ ..()
+ var/datum/playingcard/P
+ //Universal cards
+ for(var/i=0; i<=3; i++)
+ P = new()
+ P.name = "\improper Wild +4"
+ P.card_icon = "+4"
+ P.back_icon = "deck1"
+ cards += P
+ for(var/i=0; i<=3; i++)
+ P = new()
+ P.name = "\improper Wildcard"
+ P.card_icon = "colorswap"
+ P.back_icon = "deck1"
+ cards += P
+ //Colour cards
+ for(var/colour in list("red", "yellow", "blue", "green"))
+ //Specials
+ for(var/special in list("reverse","+2","skip"))
+ //2 of each
+ for(var/i=0; i<=1; i++)
+ P = new()
+ P.name = "\improper [colour] [special]"
+ P.card_icon = "[colour]_[special]"
+ P.back_icon = "deck1"
+ cards += P
+ //Number cards
+ for(var/number in list("0","1","2","3","4","5","6","7","8","9"))
+ //2 of each for 0-9, using 2 of "0" per Crow's request
+ for(var/i=0; i<=1; i++)
+ P = new()
+ P.name = "\improper [colour] [number]"
+ P.card_icon = "[colour]_[number]"
+ P.back_icon = "deck1"
+ cards += P
+
diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm
index 594d6f2e45a..4e68683542b 100644
--- a/code/modules/ghosttrap/trap.dm
+++ b/code/modules/ghosttrap/trap.dm
@@ -93,7 +93,7 @@ var/list/ghost_traps
// Allows people to set their own name. May or may not need to be removed for posibrains if people are dumbasses.
/datum/ghosttrap/proc/set_new_name(var/mob/target)
- var/newname = sanitizeSafe(input(target,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN)
+ var/newname = sanitizeSafe(tgui_input_text(target,"Enter a name, or leave blank for the default name.", "Name change","", MAX_NAME_LEN), MAX_NAME_LEN)
if (newname != "")
target.real_name = newname
target.name = target.real_name
diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm
index fe1ccde9043..cf4ce7a3e2c 100644
--- a/code/modules/holodeck/HolodeckControl.dm
+++ b/code/modules/holodeck/HolodeckControl.dm
@@ -344,6 +344,7 @@
spawn(30)
for(var/obj/effect/landmark/L in linkedholodeck)
+ L.delete_me = 1
if(L.name=="Atmospheric Test Start")
spawn(20)
var/turf/T = get_turf(L)
diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm
index 3d31827a922..95d0bdd4153 100644
--- a/code/modules/holodeck/HolodeckObjects.dm
+++ b/code/modules/holodeck/HolodeckObjects.dm
@@ -278,6 +278,7 @@
/obj/item/weapon/holo
damtype = HALLOSS
no_attack_log = 1
+ no_random_knockdown = TRUE
/obj/item/weapon/holo/esword
desc = "May the force be within you. Sorta."
diff --git a/code/modules/hydroponics/backtank.dm b/code/modules/hydroponics/backtank.dm
index 9ecb6b7bb5c..c7c4f8677ea 100644
--- a/code/modules/hydroponics/backtank.dm
+++ b/code/modules/hydroponics/backtank.dm
@@ -1,3 +1,15 @@
+///// __ __ _____ _ _ _____ _ _ _____ /////
+///// \ \ / /\ | __ \| \ | |_ _| \ | |/ ____|/////
+///// \ \ /\ / / \ | |__) | \| | | | | \| | | __ /////
+///// \ \/ \/ / /\ \ | _ /| . ` | | | | . ` | | |_ |/////
+///// \ /\ / ____ \| | \ \| |\ |_| |_| |\ | |__| |/////
+///// \/ \/_/ \_\_| \_\_| \_|_____|_| \_|\_____|/////
+
+
+///// I have no clue why. I am too tired to figure out. Do not enable this file. For some esoteric reasons it breaks runtimes. Particularly, runtime logging.
+///// No I don't know why. No I don't care to figure out why. Not anymore. I haven't seen these things used anywhere. By anyone.
+///// If somebody REALLY wants these, they can be the ones to figure out why the hell this random-ass water backpack file breaks runtime list. I am disabling this and I am done with this. Good night.
+
/*
* Hydroponics tank and base code
*/
@@ -17,7 +29,7 @@
/obj/item/weapon/watertank/Initialize()
. = ..()
- create_reagents(volume, OPENCONTAINER)
+ create_reagents(volume)
noz = make_noz()
/obj/item/weapon/watertank/MouseDrop()
diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm
index 655aa012a01..db843538ca9 100644
--- a/code/modules/hydroponics/seed.dm
+++ b/code/modules/hydroponics/seed.dm
@@ -419,8 +419,8 @@
set_trait(TRAIT_POTENCY,rand(5,30),200,0)
set_trait(TRAIT_PRODUCT_ICON,pick(SSplants.accessible_product_sprites))
set_trait(TRAIT_PLANT_ICON,pick(SSplants.accessible_plant_sprites))
- set_trait(TRAIT_PLANT_COLOUR,"#[get_random_colour(0,75,190)]")
- set_trait(TRAIT_PRODUCT_COLOUR,"#[get_random_colour(0,75,190)]")
+ set_trait(TRAIT_PLANT_COLOUR,get_random_colour(0,75,190))
+ set_trait(TRAIT_PRODUCT_COLOUR,get_random_colour(0,75,190))
update_growth_stages()
if(prob(20))
@@ -548,7 +548,7 @@
if(prob(5))
set_trait(TRAIT_BIOLUM,1)
- set_trait(TRAIT_BIOLUM_COLOUR,"#[get_random_colour(0,75,190)]")
+ set_trait(TRAIT_BIOLUM_COLOUR,get_random_colour(0,75,190))
if(prob(3))
set_trait(TRAIT_SPORING,1)
@@ -654,7 +654,7 @@
if(get_trait(TRAIT_BIOLUM))
source_turf.visible_message("\The [display_name] begins to glow!")
if(prob(degree*2))
- set_trait(TRAIT_BIOLUM_COLOUR,"#[get_random_colour(0,75,190)]")
+ set_trait(TRAIT_BIOLUM_COLOUR,get_random_colour(0,75,190))
source_turf.visible_message("\The [display_name]'s glow changes colour!")
else
source_turf.visible_message("\The [display_name]'s glow dims...")
diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm
index 24df6381a08..eb18499032f 100644
--- a/code/modules/hydroponics/seed_machines.dm
+++ b/code/modules/hydroponics/seed_machines.dm
@@ -68,15 +68,15 @@
active = 0
if(failed_task)
failed_task = 0
- visible_message("[bicon(src)] [src] pings unhappily, flashing a red warning light.")
+ visible_message("\icon[src][bicon(src)] [src] pings unhappily, flashing a red warning light.")
else
- visible_message("[bicon(src)] [src] pings happily.")
+ visible_message("\icon[src][bicon(src)] [src] pings happily.")
if(eject_disk)
eject_disk = 0
if(loaded_disk)
loaded_disk.loc = get_turf(src)
- visible_message("[bicon(src)] [src] beeps and spits out [loaded_disk].")
+ visible_message("\icon[src][bicon(src)] [src] beeps and spits out [loaded_disk].")
loaded_disk = null
/obj/machinery/botany/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -190,7 +190,7 @@
SSplants.seeds[seed.seed.name] = seed.seed
seed.update_seed()
- visible_message("[bicon(src)] [src] beeps and spits out [seed].")
+ visible_message("\icon[src][bicon(src)] [src] beeps and spits out [seed].")
seed = null
return TRUE
@@ -199,7 +199,7 @@
if(!loaded_disk)
return
loaded_disk.forceMove(get_turf(src))
- visible_message("[bicon(src)] [src] beeps and spits out [loaded_disk].")
+ visible_message("\icon[src][bicon(src)] [src] beeps and spits out [loaded_disk].")
loaded_disk = null
return TRUE
@@ -272,7 +272,7 @@
/obj/machinery/botany/editor/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
-
+
data["activity"] = active
if(seed)
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
index 09e1ccbe9e8..a4d0ca08b6f 100644
--- a/code/modules/hydroponics/trays/tray.dm
+++ b/code/modules/hydroponics/trays/tray.dm
@@ -409,7 +409,7 @@
// harvested yet and it's safe to assume it's restricted to this tray.
if(!isnull(SSplants.seeds[seed.name]))
seed = seed.diverge()
- seed.mutate(severity,get_turf(src))
+ seed.mutate(severity,get_turf(src))
return
diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm
index 41a921cd335..def8741909e 100644
--- a/code/modules/instruments/items.dm
+++ b/code/modules/instruments/items.dm
@@ -9,7 +9,7 @@
slot_l_hand_str = 'icons/mob/items/lefthand_instruments.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_instruments.dmi',
)
-
+
/// Our song datum.
var/datum/song/handheld/song
/// Our allowed list of instrument ids. This is nulled on initialize.
@@ -54,6 +54,12 @@
desc = "A golden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\""
icon_state = "golden_violin"
+/obj/item/instrument/xylophone
+ name = "xylophone"
+ desc = "A percussion instrument consisting of a series of wooden bars graduated in length."
+ icon_state = "xylophone"
+ allowed_instrument_ids = "xylophone"
+
/obj/item/instrument/piano_synth
name = "synthesizer"
desc = "An advanced electronic synthesizer that can be used as various instruments."
diff --git a/code/modules/instruments/songs/editor.dm b/code/modules/instruments/songs/editor.dm
index f88e06bce11..d63ae107cd7 100644
--- a/code/modules/instruments/songs/editor.dm
+++ b/code/modules/instruments/songs/editor.dm
@@ -130,7 +130,7 @@
else if(href_list["import"])
var/t = ""
do
- t = html_encode(input(usr, "Please paste the entire song, formatted:", text("[]", name), t) as message)
+ t = html_encode(tgui_input_text(usr, "Please paste the entire song, formatted:", text("[]", name), t, multiline = TRUE, prevent_enter = TRUE))
if(!in_range(parent, usr))
return
@@ -163,7 +163,7 @@
INVOKE_ASYNC(src, .proc/start_playing, usr)
else if(href_list["newline"])
- var/newline = html_encode(input(usr, "Enter your line: ", parent.name) as text|null)
+ var/newline = html_encode(tgui_input_text(usr, "Enter your line: ", parent.name))
if(!newline || !in_range(parent, usr))
return
if(lines.len > MUSIC_MAXLINES)
@@ -191,22 +191,22 @@
stop_playing()
else if(href_list["setlinearfalloff"])
- var/amount = input(usr, "Set linear sustain duration in seconds", "Linear Sustain Duration") as null|num
+ var/amount = tgui_input_number(usr, "Set linear sustain duration in seconds", "Linear Sustain Duration")
if(!isnull(amount))
set_linear_falloff_duration(round(amount * 10, world.tick_lag))
else if(href_list["setexpfalloff"])
- var/amount = input(usr, "Set exponential sustain factor", "Exponential sustain factor") as null|num
+ var/amount = tgui_input_number(usr, "Set exponential sustain factor", "Exponential sustain factor")
if(!isnull(amount))
set_exponential_drop_rate(round(amount, 0.00001))
else if(href_list["setvolume"])
- var/amount = input(usr, "Set volume", "Volume") as null|num
+ var/amount = tgui_input_number(usr, "Set volume", "Volume")
if(!isnull(amount))
set_volume(round(amount, 1))
else if(href_list["setdropoffvolume"])
- var/amount = input(usr, "Set dropoff threshold", "Dropoff Threshold Volume") as null|num
+ var/amount = tgui_input_number(usr, "Set dropoff threshold", "Dropoff Threshold Volume")
if(!isnull(amount))
set_dropoff_volume(round(amount, 0.01))
@@ -233,7 +233,7 @@
set_instrument(choice)
else if(href_list["setnoteshift"])
- var/amount = input(usr, "Set note shift", "Note Shift") as null|num
+ var/amount = tgui_input_number(usr, "Set note shift", "Note Shift")
if(!isnull(amount))
note_shift = clamp(amount, note_shift_min, note_shift_max)
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index 11f4a53a0d1..1f08f1dec52 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -176,7 +176,7 @@
if(!check_interactivity(M))
return
- var/input = sanitizeSafe(input(usr, "What do you want to name this?", "Rename", src.name) as null|text, MAX_NAME_LEN)
+ var/input = sanitizeSafe(tgui_input_text(usr, "What do you want to name this?", "Rename", src.name, MAX_NAME_LEN), MAX_NAME_LEN)
if(src && input)
to_chat(M, "The machine now has a label reading '[input]'.")
name = input
diff --git a/code/modules/integrated_electronics/core/assemblies/clothing.dm b/code/modules/integrated_electronics/core/assemblies/clothing.dm
index d881d7bd4a4..4840537d97c 100644
--- a/code/modules/integrated_electronics/core/assemblies/clothing.dm
+++ b/code/modules/integrated_electronics/core/assemblies/clothing.dm
@@ -53,6 +53,8 @@
if(!T.AdjacentQuick(user)) // So people aren't messing with these from across the room
return FALSE
var/obj/item/I = user.get_active_hand() // ctrl-shift-click doesn't give us the item, we have to fetch it
+ if(!I)
+ return FALSE
return IC.attackby(I, user)
/obj/item/clothing/attack_self(mob/user)
diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm
index 67a982d86e3..a4ebf3c6718 100644
--- a/code/modules/integrated_electronics/core/integrated_circuit.dm
+++ b/code/modules/integrated_electronics/core/integrated_circuit.dm
@@ -68,7 +68,7 @@ a creative player the means to solve many problems. Circuits are held inside an
if(!check_interactivity(M))
return
- var/input = sanitizeSafe(input(usr, "What do you want to name the circuit?", "Rename", src.name) as null|text, MAX_NAME_LEN)
+ var/input = sanitizeSafe(tgui_input_text(usr, "What do you want to name the circuit?", "Rename", src.name, MAX_NAME_LEN), MAX_NAME_LEN)
if(src && input && assembly.check_interactivity(M))
to_chat(M, "The circuit '[src.name]' is now labeled '[input]'.")
displayed_name = input
diff --git a/code/modules/integrated_electronics/core/pins.dm b/code/modules/integrated_electronics/core/pins.dm
index 4020d03a34a..c402cf022d2 100644
--- a/code/modules/integrated_electronics/core/pins.dm
+++ b/code/modules/integrated_electronics/core/pins.dm
@@ -154,12 +154,12 @@ list[](
var/new_data = null
switch(type_to_use)
if("string")
- new_data = input(usr, "Now type in a string.","[src] string writing", istext(default) ? default : null) as null|text
+ new_data = tgui_input_text(usr, "Now type in a string.","[src] string writing", istext(default) ? default : null)
if(istext(new_data) && holder.check_interactivity(user) )
to_chat(user, "You input [new_data] into the pin.")
return new_data
if("number")
- new_data = input(usr, "Now type in a number.","[src] number writing", isnum(default) ? default : null) as null|num
+ new_data = tgui_input_number(usr, "Now type in a number.","[src] number writing", isnum(default) ? default : null)
if(isnum(new_data) && holder.check_interactivity(user) )
to_chat(user, "You input [new_data] into the pin.")
return new_data
diff --git a/code/modules/integrated_electronics/core/special_pins/char_pin.dm b/code/modules/integrated_electronics/core/special_pins/char_pin.dm
index 0449b705490..734d4515be6 100644
--- a/code/modules/integrated_electronics/core/special_pins/char_pin.dm
+++ b/code/modules/integrated_electronics/core/special_pins/char_pin.dm
@@ -3,7 +3,7 @@
name = "char pin"
/datum/integrated_io/char/ask_for_pin_data(mob/user)
- var/new_data = input(usr, "Please type in one character.","[src] char writing") as null|text
+ var/new_data = tgui_input_text(usr, "Please type in one character.","[src] char writing")
if(holder.check_interactivity(user) )
to_chat(user, "You input [new_data ? "new_data" : "NULL"] into the pin.")
write_data_to_pin(new_data)
diff --git a/code/modules/integrated_electronics/core/special_pins/dir_pin.dm b/code/modules/integrated_electronics/core/special_pins/dir_pin.dm
index 4b523f91141..368eb27b93a 100644
--- a/code/modules/integrated_electronics/core/special_pins/dir_pin.dm
+++ b/code/modules/integrated_electronics/core/special_pins/dir_pin.dm
@@ -3,7 +3,7 @@
name = "dir pin"
/datum/integrated_io/dir/ask_for_pin_data(mob/user)
- var/new_data = input(usr, "Please type in a valid dir number. \
+ var/new_data = tgui_input_number(usr, "Please type in a valid dir number. \
Valid dirs are;\n\
North/Fore = [NORTH],\n\
South/Aft = [SOUTH],\n\
@@ -14,7 +14,7 @@
Southeast = [SOUTHEAST],\n\
Southwest = [SOUTHWEST],\n\
Up = [UP],\n\
- Down = [DOWN]","[src] dir writing") as null|num
+ Down = [DOWN]","[src] dir writing")
if(isnum(new_data) && holder.check_interactivity(user) )
to_chat(user, "You input [new_data] into the pin.")
write_data_to_pin(new_data)
diff --git a/code/modules/integrated_electronics/core/special_pins/number_pin.dm b/code/modules/integrated_electronics/core/special_pins/number_pin.dm
index 92b07638bd1..07fe8f089a3 100644
--- a/code/modules/integrated_electronics/core/special_pins/number_pin.dm
+++ b/code/modules/integrated_electronics/core/special_pins/number_pin.dm
@@ -4,7 +4,7 @@
// data = 0
/datum/integrated_io/number/ask_for_pin_data(mob/user)
- var/new_data = input(usr, "Please type in a number.","[src] number writing") as null|num
+ var/new_data = tgui_input_number(usr, "Please type in a number.","[src] number writing")
if(isnum(new_data) && holder.check_interactivity(user) )
to_chat(user, "You input [new_data] into the pin.")
write_data_to_pin(new_data)
diff --git a/code/modules/integrated_electronics/core/special_pins/string_pin.dm b/code/modules/integrated_electronics/core/special_pins/string_pin.dm
index a0428a12de0..db9bc31944f 100644
--- a/code/modules/integrated_electronics/core/special_pins/string_pin.dm
+++ b/code/modules/integrated_electronics/core/special_pins/string_pin.dm
@@ -3,7 +3,7 @@
name = "string pin"
/datum/integrated_io/string/ask_for_pin_data(mob/user)
- var/new_data = input(usr, "Please type in a string.","[src] string writing") as null|text
+ var/new_data = tgui_input_text(usr, "Please type in a string.","[src] string writing")
new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
if(new_data && holder.check_interactivity(user) )
diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm
index aa9b97ff61f..2ef76e741d5 100644
--- a/code/modules/integrated_electronics/core/tools.dm
+++ b/code/modules/integrated_electronics/core/tools.dm
@@ -122,14 +122,14 @@
switch(type_to_use)
if("string")
accepting_refs = 0
- new_data = input(usr, "Now type in a string.","[src] string writing") as null|text
+ new_data = tgui_input_text(usr, "Now type in a string.","[src] string writing")
new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
if(istext(new_data) && CanInteract(user, GLOB.tgui_physical_state))
data_to_write = new_data
to_chat(user, "You set \the [src]'s memory to \"[new_data]\".")
if("number")
accepting_refs = 0
- new_data = input(usr, "Now type in a number.","[src] number writing") as null|num
+ new_data = tgui_input_number(usr, "Now type in a number.","[src] number writing")
if(isnum(new_data) && CanInteract(user, GLOB.tgui_physical_state))
data_to_write = new_data
to_chat(user, "You set \the [src]'s memory to [new_data].")
diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm
index 3d8c3d935a6..04c326d380f 100644
--- a/code/modules/integrated_electronics/subtypes/input.dm
+++ b/code/modules/integrated_electronics/subtypes/input.dm
@@ -53,7 +53,7 @@
power_draw_per_use = 4
/obj/item/integrated_circuit/input/numberpad/ask_for_input(mob/user)
- var/new_input = input(user, "Enter a number, please.","Number pad", get_pin_data(IC_OUTPUT, 1)) as null|num
+ var/new_input = tgui_input_number(user, "Enter a number, please.","Number pad", get_pin_data(IC_OUTPUT, 1))
if(isnum(new_input) && CanInteract(user, GLOB.tgui_physical_state))
set_pin_data(IC_OUTPUT, 1, new_input)
push_data()
@@ -72,7 +72,7 @@
power_draw_per_use = 4
/obj/item/integrated_circuit/input/textpad/ask_for_input(mob/user)
- var/new_input = input(user, "Enter some words, please.","Number pad", get_pin_data(IC_OUTPUT, 1)) as null|text
+ var/new_input = tgui_input_text(user, "Enter some words, please.","Number pad", get_pin_data(IC_OUTPUT, 1))
if(istext(new_input) && CanInteract(user, GLOB.tgui_physical_state))
set_pin_data(IC_OUTPUT, 1, new_input)
push_data()
@@ -414,7 +414,7 @@
if(loc)
for(var/mob/O in hearers(1, get_turf(src)))
- O.show_message("[bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2)
+ O.show_message("\icon[src][bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2)
/obj/item/integrated_circuit/input/EPv2
name = "\improper EPv2 circuit"
diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm
index ca1a8510e54..0dffcb41696 100644
--- a/code/modules/integrated_electronics/subtypes/memory.dm
+++ b/code/modules/integrated_electronics/subtypes/memory.dm
@@ -96,13 +96,13 @@
switch(type_to_use)
if("string")
accepting_refs = 0
- new_data = input(usr, "Now type in a string.","[src] string writing") as null|text
+ new_data = tgui_input_text(usr, "Now type in a string.","[src] string writing")
if(istext(new_data) && CanInteract(user, GLOB.tgui_physical_state))
O.data = new_data
to_chat(user, "You set \the [src]'s memory to [O.display_data(O.data)].")
if("number")
accepting_refs = 0
- new_data = input(usr, "Now type in a number.","[src] number writing") as null|num
+ new_data = tgui_input_number(usr, "Now type in a number.","[src] number writing")
if(isnum(new_data) && CanInteract(user, GLOB.tgui_physical_state))
O.data = new_data
to_chat(user, "You set \the [src]'s memory to [O.display_data(O.data)].")
diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm
index 909ccc9ca88..234bfc8618d 100644
--- a/code/modules/integrated_electronics/subtypes/output.dm
+++ b/code/modules/integrated_electronics/subtypes/output.dm
@@ -43,7 +43,7 @@
var/list/nearby_things = range(0, get_turf(src))
for(var/mob/M in nearby_things)
var/obj/O = assembly ? assembly : src
- to_chat(M, "[bicon(O)] [stuff_to_display]")
+ to_chat(M, "\icon[O][bicon(O)] [stuff_to_display]")
/obj/item/integrated_circuit/output/screen/large
name = "large screen"
@@ -56,7 +56,7 @@
/obj/item/integrated_circuit/output/screen/large/do_work()
..()
var/obj/O = assembly ? loc : assembly
- O.visible_message("[bicon(O)] [stuff_to_display]")
+ O.visible_message("\icon[O][bicon(O)] [stuff_to_display]")
/obj/item/integrated_circuit/output/light
name = "light"
@@ -134,7 +134,7 @@
text = get_pin_data(IC_INPUT, 1)
if(!isnull(text))
var/obj/O = assembly ? loc : assembly
- audible_message("[bicon(O)] \The [O.name] states, \"[text]\"", runemessage = text)
+ audible_message("\icon[O][bicon(O)] \The [O.name] states, \"[text]\"", runemessage = text)
/obj/item/integrated_circuit/output/text_to_speech/advanced
name = "advanced text-to-speech circuit"
@@ -259,15 +259,28 @@
/obj/item/integrated_circuit/output/video_camera
name = "video camera circuit"
desc = "This small camera allows a remote viewer to see what it sees."
- extended_desc = "The camera is linked to the Research camera network."
+ var/list/networks = list(
+ "research" = NETWORK_CIRCUITS,
+ "engine" = NETWORK_ENGINE,
+ "engineering" = NETWORK_ENGINEERING,
+ "mining" = NETWORK_MINE,
+ "medical" = NETWORK_MEDICAL,
+ "entertainment" = NETWORK_THUNDER,
+ "security" = NETWORK_SECURITY,
+ "command" = NETWORK_COMMAND
+ )
icon_state = "video_camera"
w_class = ITEMSIZE_SMALL
complexity = 10
inputs = list(
"camera name" = IC_PINTYPE_STRING,
+ "camera network" = IC_PINTYPE_STRING,
"camera active" = IC_PINTYPE_BOOLEAN
)
- inputs_default = list("1" = "video camera circuit")
+ inputs_default = list(
+ "1" = "video camera circuit",
+ "2" = "research"
+ )
outputs = list()
activators = list()
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
@@ -276,6 +289,11 @@
/obj/item/integrated_circuit/output/video_camera/Initialize()
. = ..()
+ extended_desc = list()
+ extended_desc += "Network choices are; "
+ extended_desc += jointext(networks, ", ")
+ extended_desc += "."
+ extended_desc = jointext(extended_desc, null)
camera = new(src)
on_data_written()
@@ -294,10 +312,20 @@
/obj/item/integrated_circuit/output/video_camera/on_data_written()
if(camera)
var/cam_name = get_pin_data(IC_INPUT, 1)
- var/cam_active = get_pin_data(IC_INPUT, 2)
+ var/cam_network = get_pin_data(IC_INPUT, 2)
+ var/cam_active = get_pin_data(IC_INPUT, 3)
if(!isnull(cam_name))
camera.c_tag = cam_name
+ camera.replace_networks(list(cam_network))
set_camera_status(cam_active)
+ if(isnull(cam_network))
+ camera.clear_all_networks()
+ return
+ var/selected_network = networks[cam_network]
+ if(!selected_network)
+ camera.clear_all_networks()
+ return
+ camera.replace_networks(list(selected_network))
/obj/item/integrated_circuit/output/video_camera/power_fail()
if(camera)
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 70a3dcbd279..677b43c7316 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -33,7 +33,7 @@
O.loc = src
update_icon()
else if(istype(O, /obj/item/weapon/pen))
- var/newname = sanitizeSafe(input(usr, "What would you like to title this bookshelf?"), MAX_NAME_LEN)
+ var/newname = sanitizeSafe(tgui_input_text(usr, "What would you like to title this bookshelf?", null, null, MAX_NAME_LEN), MAX_NAME_LEN)
if(!newname)
return
else
@@ -229,7 +229,7 @@ Book Cart End
var/choice = tgui_input_list(usr, "What would you like to change?", "Change What?", list("Title", "Contents", "Author", "Cancel"))
switch(choice)
if("Title")
- var/newtitle = reject_bad_text(sanitizeSafe(input(usr, "Write a new title:")))
+ var/newtitle = reject_bad_text(sanitizeSafe(tgui_input_text(usr, "Write a new title:")))
if(!newtitle)
to_chat(usr, "The title is invalid.")
return
@@ -244,7 +244,7 @@ Book Cart End
else
src.dat += content
if("Author")
- var/newauthor = sanitize(input(usr, "Write the author's name:"))
+ var/newauthor = sanitize(tgui_input_text(usr, "Write the author's name:"))
if(!newauthor)
to_chat(usr, "The name is invalid.")
return
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index 9f5a2d511b5..a3ee1610c47 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -73,7 +73,7 @@
return
if(href_list["settitle"])
- var/newtitle = input(usr, "Enter a title to search for:") as text|null
+ var/newtitle = tgui_input_text(usr, "Enter a title to search for:")
if(newtitle)
title = sanitize(newtitle)
else
@@ -87,7 +87,7 @@
category = "Any"
category = sanitizeSQL(category)
if(href_list["setauthor"])
- var/newauthor = input(usr, "Enter an author to search for:") as text|null
+ var/newauthor = tgui_input_text(usr, "Enter an author to search for:")
if(newauthor)
author = sanitize(newauthor)
else
@@ -341,14 +341,7 @@
screenstate = 5
if("6")
if(!bibledelay)
-
- var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible(src.loc)
- if(GLOB.religion)
- B.icon_state = GLOB.bible_icon_state
- B.item_state = GLOB.bible_item_state
- B.name = GLOB.bible_name
- B.deity_name = GLOB.deity
-
+ new /obj/item/weapon/storage/bible(src.loc)
bibledelay = 1
spawn(60)
bibledelay = 0
@@ -372,9 +365,9 @@
if(checkoutperiod < 1)
checkoutperiod = 1
if(href_list["editbook"])
- buffer_book = sanitizeSafe(input(usr, "Enter the book's title:") as text|null)
+ buffer_book = sanitizeSafe(tgui_input_text(usr, "Enter the book's title:"))
if(href_list["editmob"])
- buffer_mob = sanitize(input(usr, "Enter the recipient's name:") as text|null, MAX_NAME_LEN)
+ buffer_mob = sanitize(tgui_input_text(usr, "Enter the recipient's name:", null, null, MAX_NAME_LEN), MAX_NAME_LEN)
if(href_list["checkout"])
var/datum/borrowbook/b = new /datum/borrowbook
b.bookname = sanitizeSafe(buffer_book)
@@ -389,7 +382,7 @@
var/obj/item/weapon/book/b = locate(href_list["delbook"])
inventory.Remove(b)
if(href_list["setauthor"])
- var/newauthor = sanitize(input(usr, "Enter the author's name: ") as text|null)
+ var/newauthor = sanitize(tgui_input_text(usr, "Enter the author's name: "))
if(newauthor)
scanner.cache.author = newauthor
if(href_list["setcategory"])
@@ -469,7 +462,7 @@
query.Execute()
if(href_list["orderbyid"])
- var/orderid = input(usr, "Enter your order:") as num|null
+ var/orderid = tgui_input_number(usr, "Enter your order:")
if(orderid)
if(isnum(orderid))
var/nhref = "src=\ref[src];targetid=[orderid]"
@@ -578,4 +571,4 @@
b.icon_state = "book[rand(1,7)]"
qdel(O)
else
- ..()
+ ..()
\ No newline at end of file
diff --git a/code/modules/lore_codex/robutt_data/bybrand.dm b/code/modules/lore_codex/robutt_data/bybrand.dm
index c7d7bf3da74..6997f01448f 100644
--- a/code/modules/lore_codex/robutt_data/bybrand.dm
+++ b/code/modules/lore_codex/robutt_data/bybrand.dm
@@ -41,7 +41,7 @@
/datum/lore/codex/page/robo_heph
name = "Hephaestus Industries"
- data = "Hephaestus joined the civilian prosthetic market in earnest after the First Contact War. Wartime amputees and fully-prosthetic Mechanized Division veterans found themselves looking for the Hephaestus parts that they had access to during the conflict. Hephaestus responded by producing the first civilian model of their rugged green prosthetics, leveraging their ties with SolGov to offer discounts to many of those returning from war. HI-Civilian is not quite as durable or easily maintained as the military model, to conform with most systems' legal restrictions on the capacities of prosthetic limbs, but maintains an unmatched reputation for resilience to damage and ease of repair.\
+ data = "Hephaestus joined the civilian prosthetic market in earnest after the Hegemony War. Wartime amputees and fully-prosthetic Mechanized Division veterans found themselves looking for the Hephaestus parts that they had access to during the conflict. Hephaestus responded by producing the first civilian model of their rugged green prosthetics, leveraging their ties with SolGov to offer discounts to many of those returning from war. HI-Civilian is not quite as durable or easily maintained as the military model, to conform with most systems' legal restrictions on the capacities of prosthetic limbs, but maintains an unmatched reputation for resilience to damage and ease of repair.\
\
Hephaestus prosthetics are somewhat expensive, but are a reasonable investment for many of average or above economic status. It has sufficient manual dexterity for most tasks, without sacrificing the rugged durability that made the brand popular."
diff --git a/code/modules/lore_codex/robutt_data/main_robutts.dm b/code/modules/lore_codex/robutt_data/main_robutts.dm
index 396a04883c6..b9d4b75b2a3 100644
--- a/code/modules/lore_codex/robutt_data/main_robutts.dm
+++ b/code/modules/lore_codex/robutt_data/main_robutts.dm
@@ -1,7 +1,7 @@
/datum/lore/codex/category/main_robutts // The top-level categories for the robot guide
name = "Index"
- data = "Temporary death, emancipation, and even basic body migration can be a stressful period in anyone's life. The prosthetics market is complicated, and many corporations view misleading or outright decieving potential clients as \"part of the game\". This Buyer's Guide was compiled in 2542 to serve as an easy reference to the most popular prosthetics available, with consideration paid to every use-case and price point. This is our 12th edition, and much has changed in the field of prosthetics since we first set out. We hope you find the information in this guide helpful."
+ data = "Temporary death, emancipation, and even basic body migration can be a stressful period in anyone's life. The prosthetics market is complicated, and many corporations view misleading or outright decieving potential clients as \"part of the game\". This Buyer's Guide was compiled in 2302 to serve as an easy reference to the most popular prosthetics available, with consideration paid to every use-case and price point. This is our 12th edition, and much has changed in the field of prosthetics since we first set out. We hope you find the information in this guide helpful."
children = list(
/datum/lore/codex/category/pros_by_brand,
/datum/lore/codex/category/other_information,
- )
\ No newline at end of file
+ )
diff --git a/code/modules/materials/materials/_materials.dm b/code/modules/materials/materials/_materials.dm
index f059aa28c6b..168fd67938f 100644
--- a/code/modules/materials/materials/_materials.dm
+++ b/code/modules/materials/materials/_materials.dm
@@ -109,7 +109,7 @@ var/list/name_to_material
var/datum/material/key = arguments[1]
if(istype(key))
return key // we want to convert anything we're given to a material
-
+
if(istext(key)) // text ID
. = name_to_material[key]
if(!.)
@@ -363,7 +363,7 @@ var/list/name_to_material
)
if(icon_base == "solid") // few icons
recipes += new /datum/stack_recipe("[display_name] wall girders (eris)", /obj/structure/girder/eris, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
- recipes += new /datum/stack_recipe_list("low walls",list(
+ recipes += new /datum/stack_recipe_list("low walls",list(
new /datum/stack_recipe("low wall (bay style)", /obj/structure/low_wall/bay, 3, time = 20, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", recycle_material = "[name]"),
new /datum/stack_recipe("low wall (eris style)", /obj/structure/low_wall/eris, 3, time = 20, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", recycle_material = "[name]")
))
diff --git a/code/modules/materials/materials/metals/steel.dm b/code/modules/materials/materials/metals/steel.dm
index ca63d24b9c5..cc6a58792a6 100644
--- a/code/modules/materials/materials/metals/steel.dm
+++ b/code/modules/materials/materials/metals/steel.dm
@@ -69,7 +69,7 @@
new /datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20, recycle_material = "[name]"),
new /datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20, recycle_material = "[name]"),
new /datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60, recycle_material = "[name]"),
- new /datum/stack_recipe("frame", /obj/item/frame, 5, time = 25, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"),
+ new /datum/stack_recipe("frame parts", /obj/item/frame, 5, time = 25, on_floor = 1, recycle_material = "[name]"),
new /datum/stack_recipe("mirror frame", /obj/item/frame/mirror, 1, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]"),
new /datum/stack_recipe("fire extinguisher cabinet frame", /obj/item/frame/extinguisher_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]"),
new /datum/stack_recipe("railing", /obj/structure/railing, 2, time = 50, one_per_turf = 0, on_floor = 1, recycle_material = "[name]"),
diff --git a/code/modules/materials/materials/organic/cloth.dm b/code/modules/materials/materials/organic/cloth.dm
index 294e046670f..38a8aae2658 100644
--- a/code/modules/materials/materials/organic/cloth.dm
+++ b/code/modules/materials/materials/organic/cloth.dm
@@ -13,7 +13,7 @@
hardness = 5
-/datum/material/cloth/generate_recipes()
+/datum/material/cloth/generate_recipes() //Vorestation Add - adding some funny cool storage pouches to this so botany can do things other than food
recipes = list(
new /datum/stack_recipe("woven net", /obj/item/weapon/material/fishing_net, 10, time = 30 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]"),
new /datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"),
@@ -29,6 +29,13 @@
new /datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]"),
+ new /datum/stack_recipe("pouch, small", /obj/item/weapon/storage/pouch/small, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
+ new /datum/stack_recipe("pouch, ammo", /obj/item/weapon/storage/pouch/ammo, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
+ new /datum/stack_recipe("pouch, tools", /obj/item/weapon/storage/pouch/eng_tool, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
+ new /datum/stack_recipe("pouch, parts", /obj/item/weapon/storage/pouch/eng_parts, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
+ new /datum/stack_recipe("pouch, supplies", /obj/item/weapon/storage/pouch/eng_supply, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
+ new /datum/stack_recipe("pouch, medical", /obj/item/weapon/storage/pouch/medical, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
+ new /datum/stack_recipe("pouch, flare", /obj/item/weapon/storage/pouch/flares, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
new /datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]"),
new /datum/stack_recipe("painting canvas (11x11)", /obj/item/canvas, 2, time = 2 SECONDS, pass_stack_color = FALSE, supplied_material = "[name]"),
diff --git a/code/modules/materials/materials/organic/leather.dm b/code/modules/materials/materials/organic/leather.dm
index f5fc8cb2f97..1c46a78bfd5 100644
--- a/code/modules/materials/materials/organic/leather.dm
+++ b/code/modules/materials/materials/organic/leather.dm
@@ -27,6 +27,10 @@
new /datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]"),
+ new /datum/stack_recipe("pouch, medium", /obj/item/weapon/storage/pouch, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
+ new /datum/stack_recipe("pouch, large", /obj/item/weapon/storage/pouch/large, 15, time = 30 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
+ new /datum/stack_recipe("pouch, holster", /obj/item/weapon/storage/pouch/holster, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
+ new /datum/stack_recipe("pouch, melee", /obj/item/weapon/storage/pouch/baton, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
new /datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE),
new /datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE),
diff --git a/code/modules/materials/materials/organic/wood.dm b/code/modules/materials/materials/organic/wood.dm
index 467b42ac8df..954d206281e 100644
--- a/code/modules/materials/materials/organic/wood.dm
+++ b/code/modules/materials/materials/organic/wood.dm
@@ -38,7 +38,6 @@
new /datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]"),
- new /datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("wooden standup figure", /obj/structure/barricade/cutout, 5, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), //VOREStation Add
@@ -74,7 +73,7 @@
icon_base = "stone"
icon_reinf = "reinf_stone"
integrity = 65 //a bit stronger than regular wood
- hardness = 20
+ hardness = 20
weight = 20 //likewise, heavier
/datum/material/wood/hardwood/generate_recipes()
diff --git a/code/modules/materials/sheets/organic/animal_products.dm b/code/modules/materials/sheets/organic/animal_products.dm
index 5ebd36d008c..4a0c9cd7bbb 100644
--- a/code/modules/materials/sheets/organic/animal_products.dm
+++ b/code/modules/materials/sheets/organic/animal_products.dm
@@ -73,6 +73,13 @@
new /datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white/craftable, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white/craftable, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white/craftable, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]"),
+ new /datum/stack_recipe("pouch, small", /obj/item/weapon/storage/pouch/small, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
+ new /datum/stack_recipe("pouch, ammo", /obj/item/weapon/storage/pouch/ammo, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
+ new /datum/stack_recipe("pouch, tools", /obj/item/weapon/storage/pouch/eng_tool, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
+ new /datum/stack_recipe("pouch, parts", /obj/item/weapon/storage/pouch/eng_parts, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
+ new /datum/stack_recipe("pouch, supplies", /obj/item/weapon/storage/pouch/eng_supply, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
+ new /datum/stack_recipe("pouch, medical", /obj/item/weapon/storage/pouch/medical, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
+ new /datum/stack_recipe("pouch, flare", /obj/item/weapon/storage/pouch/flares, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
new /datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]"),
new /datum/stack_recipe("satchel", /obj/item/weapon/storage/backpack/satchel/craftable, 30, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]"),
@@ -156,4 +163,4 @@
desc = "A handmade blindfold that covers the eyes, preventing sight."
/obj/item/clothing/accessory/collar/craftable/attack_self(mob/living/user as mob)
- given_name = sanitizeSafe(input(usr, "What would you like to label the collar?", "Collar Labelling", null) as text, MAX_NAME_LEN)
+ given_name = sanitizeSafe(tgui_input_text(usr, "What would you like to label the collar?", "Collar Labelling", null, MAX_NAME_LEN), MAX_NAME_LEN)
diff --git a/code/modules/media/walkpod.dm b/code/modules/media/walkpod.dm
index 8b1a2e28761..3ef0f046b63 100644
--- a/code/modules/media/walkpod.dm
+++ b/code/modules/media/walkpod.dm
@@ -16,13 +16,14 @@
var/playing = 0
var/volume = 1
-
+
var/media_url = ""
var/media_start_time
var/obj/item/device/headpods/deployed_headpods
w_class = ITEMSIZE_COST_SMALL
+ slot_flags = SLOT_BELT
/obj/item/device/walkpod/Destroy()
remove_listener()
@@ -56,7 +57,7 @@
to_chat(listener, "You are no longer wearing the [src]'s headphones.")
listener = null
update_icon()
-
+
/obj/item/device/walkpod/proc/set_listener(mob/living/L)
if(listener)
remove_listener()
@@ -170,7 +171,7 @@
/obj/item/device/walkpod/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
-
+
data["playing"] = playing
data["loop_mode"] = loop_mode
data["volume"] = volume
diff --git a/code/modules/mentor/mentor.dm b/code/modules/mentor/mentor.dm
new file mode 100644
index 00000000000..28f42254851
--- /dev/null
+++ b/code/modules/mentor/mentor.dm
@@ -0,0 +1,263 @@
+/client
+ var/datum/mentor/mentorholder = null
+
+var/list/mentor_datums = list()
+
+var/list/mentor_verbs_default = list(
+ /client/proc/cmd_mentor_ticket_panel,
+ /client/proc/cmd_mentor_say,
+ /client/proc/cmd_dementor
+)
+
+/datum/mentor
+ var/client/owner = null
+
+/datum/mentor/New(ckey)
+ if(!ckey)
+ error("Mentor datum created without a ckey argument. Datum has been deleted")
+ qdel(src)
+ return
+ mentor_datums[ckey] = src
+
+/datum/mentor/proc/associate(client/C)
+ if(istype(C))
+ owner = C
+ owner.mentorholder = src
+ owner.add_mentor_verbs()
+ GLOB.mentors |= C
+
+/datum/mentor/proc/disassociate()
+ if(owner)
+ GLOB.mentors -= owner
+ owner.remove_mentor_verbs()
+ owner.mentorholder = null
+ mentor_datums[owner.ckey] = null
+ qdel(src)
+
+/client/proc/add_mentor_verbs()
+ if(mentorholder)
+ verbs += mentor_verbs_default
+
+/client/proc/remove_mentor_verbs()
+ if(mentorholder)
+ verbs -= mentor_verbs_default
+
+/client/proc/make_mentor()
+ set category = "Special Verbs"
+ set name = "Make Mentor"
+ if(!holder)
+ to_chat(src, "Error: Only administrators may use this command.")
+ return
+ var/list/client/targets[0]
+ for(var/client/T in GLOB.clients)
+ targets["[T.key]"] = T
+ var/target = tgui_input_list(src,"Who do you want to make a mentor?","Make Mentor", sortList(targets))
+ if(!target)
+ return
+ var/client/C = targets[target]
+ if(has_mentor_powers(C) || C.deadmin_holder) // If an admin is deadminned you could mentor them and that will cause fuckery if they readmin
+ to_chat(src, "Error: They already have mentor powers.")
+ return
+ var/datum/mentor/M = new /datum/mentor(C.ckey)
+ M.associate(C)
+ to_chat(C, "You have been granted mentorship.")
+ to_chat(src, "You have made [C] a mentor.")
+ log_admin("[key_name(src)] made [key_name(C)] a mentor.")
+ feedback_add_details("admin_verb","Make Mentor") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/proc/unmake_mentor()
+ set category = "Special Verbs"
+ set name = "Unmake Mentor"
+ if(!holder)
+ to_chat(src, "Error: Only administrators may use this command.")
+ return
+ var/list/client/targets[0]
+ for(var/client/T in GLOB.mentors)
+ targets["[T.key]"] = T
+ var/target = tgui_input_list(src,"Which mentor do you want to unmake?","Unmake Mentor", sortList(targets))
+ if(!target)
+ return
+ var/client/C = targets[target]
+ C.mentorholder.disassociate()
+ to_chat(C, "Your mentorship has been revoked.")
+ to_chat(src, "You have revoked [C]'s mentorship.")
+ log_admin("[key_name(src)] revoked [key_name(C)]'s mentorship.")
+ feedback_add_details("admin_verb","Unmake Mentor") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/proc/cmd_mentor_say(msg as text)
+ set category = "Admin"
+ set name ="Mentorsay"
+
+ //check rights
+ if (!has_mentor_powers(src))
+ return
+
+ msg = sanitize(msg)
+ if (!msg)
+ return
+
+ log_admin("Mentorsay: [key_name(src)]: [msg]")
+
+ for(var/client/C in GLOB.mentors)
+ to_chat(C, create_text_tag("mentor", "MENTOR:", C) + " [src]: [msg]")
+ for(var/client/C in GLOB.admins)
+ to_chat(C, create_text_tag("mentor", "MENTOR:", C) + " [src]: [msg]")
+
+/proc/mentor_commands(href, href_list, client/C)
+ if(href_list["mhelp"])
+ var/mhelp_ref = href_list["mhelp"]
+ var/datum/mentor_help/MH = locate(mhelp_ref)
+ if (MH && istype(MH, /datum/mentor_help))
+ MH.Action(href_list["mhelp_action"])
+ else
+ to_chat(C, "Ticket [mhelp_ref] has been deleted!")
+
+ if (href_list["mhelp_tickets"])
+ GLOB.mhelp_tickets.BrowseTickets(text2num(href_list["mhelp_tickets"]))
+
+
+/datum/mentor/Topic(href, href_list)
+ ..()
+ if (usr.client != src.owner || (!usr.client.mentorholder))
+ log_admin("[key_name(usr)] tried to illegally use mentor functions.")
+ message_admins("[usr.key] tried to illegally use mentor functions.")
+ return
+
+ mentor_commands(href, href_list, usr)
+
+/client/proc/cmd_dementor()
+ set category = "Admin"
+ set name = "De-mentor"
+
+ if(tgui_alert(usr, "Confirm self-dementor for the round? You can't re-mentor yourself without someone promoting you.","Dementor",list("Yes","No")) == "Yes")
+ src.mentorholder.disassociate()
+
+/client/proc/cmd_mhelp_reply(whom)
+ if(prefs.muted & MUTE_ADMINHELP)
+ to_chat(src, "Error: Mentor-PM: You are unable to use admin PM-s (muted).")
+ return
+ var/client/C
+ if(istext(whom))
+ C = GLOB.directory[whom]
+ else if(istype(whom,/client))
+ C = whom
+ if(!C)
+ if(has_mentor_powers(src))
+ to_chat(src, "Error: Mentor-PM: Client not found.")
+ return
+
+ var/datum/mentor_help/MH = C.current_mentorhelp
+
+ if(MH)
+ message_mentors("[src] has started replying to [C]'s mentor help.")
+ var/msg = tgui_input_text(src,"Message:", "Private message to [C]")
+ if (!msg)
+ message_mentors("[src] has cancelled their reply to [C]'s mentor help.")
+ return
+ cmd_mentor_pm(whom, msg, MH)
+
+/proc/has_mentor_powers(client/C)
+ return C.holder || C.mentorholder
+
+// This not really a great place to put it, but this verb replaces adminhelp in hotkeys so that people requesting help can select the type they need
+// You can still directly adminhelp if necessary, this ONLY replaces the inbuilt hotkeys
+
+/client/verb/requesthelp()
+ set category = "Admin"
+ set name = "Request help"
+ set hidden = 1
+
+ var/mhelp = tgui_alert(usr, "Select the help you need.","Request for Help",list("Adminhelp","Mentorhelp")) == "Mentorhelp"
+ var/msg = tgui_input_text(usr, "Input your request for help.", "Request for Help")
+
+ if (mhelp)
+ mentorhelp(msg)
+ return
+
+ adminhelp(msg)
+
+
+/client/proc/cmd_mentor_pm(whom, msg, datum/mentor_help/MH)
+ set category = "Admin"
+ set name = "Mentor-PM"
+ set hidden = 1
+
+ if(prefs.muted & MUTE_ADMINHELP)
+ to_chat(src, "Error: Mentor-PM: You are unable to use admin PM-s (muted).")
+ return
+
+ //Not a mentor and no open ticket
+ if(!has_mentor_powers(src) && !current_mentorhelp)
+ to_chat(src, "You can no longer reply to this ticket, please open another one by using the Mentorhelp verb if need be.")
+ to_chat(src, "Message: [msg]")
+ return
+
+ var/client/recipient
+
+ if(istext(whom))
+ recipient = GLOB.directory[whom]
+
+ else if(istype(whom,/client))
+ recipient = whom
+
+ //get message text, limit it's length.and clean/escape html
+ if(!msg)
+ msg = tgui_input_text(src,"Message:", "Mentor-PM to [whom]")
+
+ if(!msg)
+ return
+
+ if(prefs.muted & MUTE_ADMINHELP)
+ to_chat(src, "Error: Mentor-PM: You are unable to use admin PM-s (muted).")
+ return
+
+ if(!recipient)
+ if(has_mentor_powers(src))
+ to_chat(src, "Error:Mentor-PM: Client not found.")
+ to_chat(src, msg)
+ else
+ log_admin("Mentorhelp: [key_name(src)]: [msg]")
+ current_mentorhelp.MessageNoRecipient(msg)
+ return
+
+ //Has mentor powers but the recipient no longer has an open ticket
+ if(has_mentor_powers(src) && !recipient.current_mentorhelp)
+ to_chat(src, "You can no longer reply to this ticket.")
+ to_chat(src, "Message: [msg]")
+ return
+
+ if (src.handle_spam_prevention(msg,MUTE_ADMINHELP))
+ return
+
+ msg = trim(sanitize(copytext(msg,1,MAX_MESSAGE_LEN)))
+ if(!msg)
+ return
+
+ var/interaction_message = "Mentor-PM from-[src] to-[recipient]: [msg]"
+
+ if (recipient.current_mentorhelp && !has_mentor_powers(recipient))
+ recipient.current_mentorhelp.AddInteraction(interaction_message)
+ if (src.current_mentorhelp && !has_mentor_powers(src))
+ src.current_mentorhelp.AddInteraction(interaction_message)
+
+ // It's a little fucky if they're both mentors, but while admins may need to adminhelp I don't really see any reason a mentor would have to mentorhelp since you can literally just ask any other mentors online
+ if (has_mentor_powers(recipient) && has_mentor_powers(src))
+ if (recipient.current_mentorhelp)
+ recipient.current_mentorhelp.AddInteraction(interaction_message)
+ if (src.current_mentorhelp)
+ src.current_mentorhelp.AddInteraction(interaction_message)
+
+ to_chat(recipient, "Mentor-PM from-[src]: [msg]")
+ to_chat(src, "Mentor-PM to-[recipient]: [msg]")
+
+ log_admin("[key_name(src)]->[key_name(recipient)]: [msg]")
+
+ if(recipient.is_preference_enabled(/datum/client_preference/play_mentorhelp_ping))
+ recipient << 'sound/effects/mentorhelp.mp3'
+
+ for(var/client/C in GLOB.mentors)
+ if (C != recipient && C != src)
+ to_chat(C, interaction_message)
+ for(var/client/C in GLOB.admins)
+ if (C != recipient && C != src)
+ to_chat(C, interaction_message)
\ No newline at end of file
diff --git a/code/modules/mentor/mentorhelp.dm b/code/modules/mentor/mentorhelp.dm
new file mode 100644
index 00000000000..e5f7ac49d8b
--- /dev/null
+++ b/code/modules/mentor/mentorhelp.dm
@@ -0,0 +1,415 @@
+/client/var/datum/mentor_help/current_mentorhelp
+
+//
+//TICKET MANAGER
+//
+
+GLOBAL_DATUM_INIT(mhelp_tickets, /datum/mentor_help_tickets, new)
+
+/datum/mentor_help_tickets
+ var/list/active_tickets = list()
+ var/list/resolved_tickets = list()
+
+ var/obj/effect/statclick/mticket_list/astatclick = new(null, null, AHELP_ACTIVE)
+ var/obj/effect/statclick/mticket_list/rstatclick = new(null, null, AHELP_RESOLVED)
+
+/datum/mentor_help_tickets/Destroy()
+ QDEL_LIST(active_tickets)
+ QDEL_LIST(resolved_tickets)
+ QDEL_NULL(astatclick)
+ QDEL_NULL(rstatclick)
+ return ..()
+
+//private
+/datum/mentor_help_tickets/proc/ListInsert(datum/mentor_help/new_ticket)
+ var/list/mticket_list
+ switch(new_ticket.state)
+ if(AHELP_ACTIVE)
+ mticket_list = active_tickets
+ if(AHELP_RESOLVED)
+ mticket_list = resolved_tickets
+ else
+ CRASH("Invalid ticket state: [new_ticket.state]")
+ var/num_closed = mticket_list.len
+ if(num_closed)
+ for(var/I in 1 to num_closed)
+ var/datum/mentor_help/MH = mticket_list[I]
+ if(MH.id > new_ticket.id)
+ mticket_list.Insert(I, new_ticket)
+ return
+ mticket_list += new_ticket
+
+//opens the ticket listings, only two states here
+/datum/mentor_help_tickets/proc/BrowseTickets(state)
+ var/list/l2b
+ var/title
+ switch(state)
+ if(AHELP_ACTIVE)
+ l2b = active_tickets
+ title = "Active Tickets"
+ if(AHELP_RESOLVED)
+ l2b = resolved_tickets
+ title = "Resolved Tickets"
+ if(!l2b)
+ return
+ var/list/dat = list("[title]")
+ dat += "Refresh
"
+ for(var/datum/mentor_help/MH as anything in l2b)
+ dat += "Ticket #[MH.id]: [MH.initiator_ckey]: [MH.name] "
+
+ usr << browse(dat.Join(), "window=mhelp_list[state];size=600x480")
+
+//Tickets statpanel
+/datum/mentor_help_tickets/proc/stat_entry()
+ var/num_disconnected = 0
+ stat("Active Tickets:", astatclick.update("[active_tickets.len]"))
+ for(var/datum/mentor_help/MH as anything in active_tickets)
+ if(MH.initiator)
+ stat("#[MH.id]. [MH.initiator_ckey]:", MH.statclick.update())
+ else
+ ++num_disconnected
+ if(num_disconnected)
+ stat("Disconnected:", astatclick.update("[num_disconnected]"))
+ stat("Resolved Tickets:", rstatclick.update("[resolved_tickets.len]"))
+
+//Reassociate still open ticket if one exists
+/datum/mentor_help_tickets/proc/ClientLogin(client/C)
+ C.current_mentorhelp = CKey2ActiveTicket(C.ckey)
+ if(C.current_mentorhelp)
+ C.current_mentorhelp.AddInteraction("Client reconnected.")
+ C.current_mentorhelp.initiator = C
+
+//Dissasociate ticket
+/datum/mentor_help_tickets/proc/ClientLogout(client/C)
+ if(C.current_mentorhelp)
+ C.current_mentorhelp.AddInteraction("Client disconnected.")
+ C.current_mentorhelp.initiator = null
+ C.current_mentorhelp = null
+
+//Get a ticket given a ckey
+/datum/mentor_help_tickets/proc/CKey2ActiveTicket(ckey)
+ for(var/datum/admin_help/MH as anything in active_tickets)
+ if(MH.initiator_ckey == ckey)
+ return MH
+
+//
+//TICKET LIST STATCLICK
+//
+
+/obj/effect/statclick/mticket_list
+ var/current_state
+
+/obj/effect/statclick/mticket_list/New(loc, name, state)
+ current_state = state
+ ..()
+
+/obj/effect/statclick/mticket_list/Click()
+ GLOB.mhelp_tickets.BrowseTickets(current_state)
+
+//
+//TICKET DATUM
+//
+
+/datum/mentor_help
+ var/id
+ var/name
+ var/state = AHELP_ACTIVE
+
+ var/opened_at
+ var/closed_at
+
+ var/client/initiator //semi-misnomer, it's the person who ahelped/was bwoinked
+ var/initiator_ckey
+ var/initiator_key_name
+
+ var/list/_interactions //use AddInteraction() or, preferably, admin_ticket_log()
+
+ var/obj/effect/statclick/ahelp/statclick
+
+ var/static/ticket_counter = 0
+
+//call this on its own to create a ticket, don't manually assign current_mentorhelp
+//msg is the title of the ticket: usually the ahelp text
+/datum/mentor_help/New(msg, client/C)
+ //clean the input msg
+ msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
+ if(!msg || !C || !C.mob)
+ qdel(src)
+ return
+
+ id = ++ticket_counter
+ opened_at = world.time
+
+ name = msg
+
+ initiator = C
+ initiator_ckey = C.ckey
+ initiator_key_name = key_name(initiator, FALSE, TRUE)
+ if(initiator.current_mentorhelp) //This is a bug
+ log_debug("Ticket erroneously left open by code")
+ initiator.current_mentorhelp.AddInteraction("Ticket erroneously left open by code")
+ initiator.current_mentorhelp.Resolve()
+ initiator.current_mentorhelp = src
+
+ statclick = new(null, src)
+ _interactions = list()
+
+ log_admin("Mentorhelp: [key_name(C)]: [msg]")
+ MessageNoRecipient(msg)
+ //show it to the person adminhelping too
+ to_chat(C, "Mentor-PM to-Mentors: [name]")
+
+ GLOB.mhelp_tickets.active_tickets += src
+
+/datum/mentor_help/Destroy()
+ RemoveActive()
+ GLOB.mhelp_tickets.resolved_tickets -= src
+ return ..()
+
+/datum/mentor_help/proc/AddInteraction(formatted_message)
+ _interactions += "[gameTimestamp()]: [formatted_message]"
+
+//private
+/datum/mentor_help/proc/ClosureLinks(ref_src)
+ if(!ref_src)
+ ref_src = "\ref[src]"
+ . = " (RSLVE)"
+
+//private
+/datum/mentor_help/proc/LinkedReplyName(ref_src)
+ if(!ref_src)
+ ref_src = "\ref[src]"
+ return "[initiator_ckey]"
+
+//private
+/datum/mentor_help/proc/TicketHref(msg, ref_src, action = "ticket")
+ if(!ref_src)
+ ref_src = "\ref[src]"
+ return "[msg]"
+
+//message from the initiator without a target, all people with mentor powers will see this
+/datum/mentor_help/proc/MessageNoRecipient(msg)
+ var/ref_src = "\ref[src]"
+ var/chat_msg = "(ESCALATE) Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)]: [msg]"
+ AddInteraction("[LinkedReplyName(ref_src)]: [msg]")
+ for (var/client/C in GLOB.mentors)
+ if (C.is_preference_enabled(/datum/client_preference/play_mentorhelp_ping))
+ C << 'sound/effects/mentorhelp.mp3'
+ for (var/client/C in GLOB.admins)
+ if (C.is_preference_enabled(/datum/client_preference/play_mentorhelp_ping))
+ C << 'sound/effects/mentorhelp.mp3'
+ message_mentors(chat_msg)
+
+//Reopen a closed ticket
+/datum/mentor_help/proc/Reopen()
+ if(state == AHELP_ACTIVE)
+ to_chat(usr, "This ticket is already open.")
+ return
+
+ if(GLOB.mhelp_tickets.CKey2ActiveTicket(initiator_ckey))
+ to_chat(usr, "This user already has an active ticket, cannot reopen this one.")
+ return
+
+ statclick = new(null, src)
+ GLOB.mhelp_tickets.active_tickets += src
+ GLOB.mhelp_tickets.resolved_tickets -= src
+ switch(state)
+ if(AHELP_RESOLVED)
+ feedback_dec("mhelp_resolve")
+ state = AHELP_ACTIVE
+ closed_at = null
+ if(initiator)
+ initiator.current_mentorhelp = src
+
+ AddInteraction("Reopened by [usr.ckey]")
+ if(initiator)
+ to_chat(initiator, "Ticket [TicketHref("#[id]")] was reopened by [usr.ckey].")
+ var/msg = "Ticket [TicketHref("#[id]")] reopened by [usr.ckey]."
+ message_mentors(msg)
+ log_admin(msg)
+ feedback_inc("mhelp_reopen")
+ TicketPanel() //can only be done from here, so refresh it
+
+//private
+/datum/mentor_help/proc/RemoveActive()
+ if(state != AHELP_ACTIVE)
+ return
+ closed_at = world.time
+ QDEL_NULL(statclick)
+ GLOB.mhelp_tickets.active_tickets -= src
+ if(initiator && initiator.current_mentorhelp == src)
+ initiator.current_mentorhelp = null
+
+//Mark open ticket as resolved/legitimate, returns mentorhelp verb
+/datum/mentor_help/proc/Resolve(silent = FALSE)
+ if(state != AHELP_ACTIVE)
+ return
+ RemoveActive()
+ state = AHELP_RESOLVED
+ GLOB.mhelp_tickets.ListInsert(src)
+
+ AddInteraction("Resolved by [usr.ckey].")
+ if(initiator)
+ to_chat(initiator, "Ticket [TicketHref("#[id]")] was marked resolved by [usr.ckey].")
+ if(!silent)
+ feedback_inc("mhelp_resolve")
+ var/msg = "Ticket [TicketHref("#[id]")] resolved by [usr.ckey]"
+ message_mentors(msg)
+ log_admin(msg)
+
+//Show the ticket panel
+/datum/mentor_help/proc/TicketPanel()
+ var/list/dat = list("Ticket #[id]")
+ var/ref_src = "\ref[src]"
+ dat += "Mentor Help Ticket #[id]: [LinkedReplyName(ref_src)]"
+ dat += "State: "
+ switch(state)
+ if(AHELP_ACTIVE)
+ dat += "OPEN"
+ if(AHELP_RESOLVED)
+ dat += "RESOLVED"
+ else
+ dat += "UNKNOWN"
+ dat += "[GLOB.TAB][TicketHref("Refresh", ref_src)]"
+ if(state != AHELP_ACTIVE)
+ dat += "[GLOB.TAB][TicketHref("Reopen", ref_src, "reopen")]"
+ dat += "
Opened at: [gameTimestamp(wtime = opened_at)] (Approx [(world.time - opened_at) / 600] minutes ago)"
+ if(closed_at)
+ dat += " Closed at: [gameTimestamp(wtime = closed_at)] (Approx [(world.time - closed_at) / 600] minutes ago)"
+ dat += "
"
+ if(initiator)
+ dat += "Actions: [Context(ref_src)] "
+ else
+ dat += "DISCONNECTED[GLOB.TAB][ClosureLinks(ref_src)] "
+ dat += " Log:
"
+ for(var/I in _interactions)
+ dat += "[I] "
+
+ usr << browse(dat.Join(), "window=mhelp[id];size=620x480")
+
+//Kick ticket to admins
+/datum/mentor_help/proc/Escalate()
+ if(tgui_alert(usr, "Really escalate this ticket to admins? No mentors will ever be able to interact with it again if you do.","Escalate",list("Yes","No")) != "Yes")
+ return
+ if (src.initiator == null) // You can't escalate a mentorhelp of someone who's logged out because it won't create the adminhelp properly
+ to_chat(usr, "Error: client not found, unable to escalate.")
+ return
+ var/datum/admin_help/AH = new /datum/admin_help(src.name, src.initiator, FALSE)
+ message_mentors("[usr.ckey] escalated Ticket [TicketHref("#[id]")]")
+ log_admin("[key_name(usr)] escalated mentorhelp [src.name]")
+ to_chat(src.initiator, "[usr.ckey] escalated your mentorhelp to admins.")
+ AH._interactions = src._interactions
+ GLOB.mhelp_tickets.active_tickets -= src
+ GLOB.mhelp_tickets.resolved_tickets -= src
+ qdel(src)
+
+/datum/mentor_help/proc/Context(ref_src)
+ if(!ref_src)
+ ref_src = "\ref[src]"
+ if(state == AHELP_ACTIVE)
+ . += ClosureLinks(ref_src)
+ if(state != AHELP_RESOLVED)
+ . += " (ESCALATE)"
+
+//Forwarded action from admin/Topic OR mentor/Topic depending on which rank the caller has
+/datum/mentor_help/proc/Action(action)
+ switch(action)
+ if("ticket")
+ TicketPanel()
+ if("reply")
+ usr.client.cmd_mhelp_reply(initiator)
+ if("resolve")
+ Resolve()
+ if("reopen")
+ Reopen()
+ if("escalate")
+ Escalate()
+
+//
+// TICKET STATCLICK
+//
+
+/obj/effect/statclick/mhelp
+ var/datum/mentor_help/mhelp_datum
+
+/obj/effect/statclick/mhelp/New(loc, datum/mentor_help/MH)
+ mhelp_datum = MH
+ ..(loc)
+
+/obj/effect/statclick/mhelp/update()
+ return ..(mhelp_datum.name)
+
+/obj/effect/statclick/mhelp/Click()
+ mhelp_datum.TicketPanel()
+
+/obj/effect/statclick/mhelp/Destroy()
+ mhelp_datum = null
+ return ..()
+
+//
+// CLIENT PROCS
+//
+
+/client/verb/mentorhelp(msg as text)
+ set category = "Admin"
+ set name = "Mentorhelp"
+
+ if(say_disabled) //This is here to try to identify lag problems
+ to_chat(usr, "Speech is currently admin-disabled.")
+ return
+
+ //handle muting and automuting
+ if(prefs.muted & MUTE_ADMINHELP)
+ to_chat(src, "Error: Mentor-PM: You cannot send adminhelps (Muted).")
+ return
+ if(handle_spam_prevention(msg,MUTE_ADMINHELP))
+ return
+
+ if(!msg)
+ return
+
+ //remove out adminhelp verb temporarily to prevent spamming of admins.
+ src.verbs -= /client/verb/mentorhelp
+ spawn(600)
+ src.verbs += /client/verb/mentorhelp // 1 minute cool-down for mentorhelps
+
+ feedback_add_details("admin_verb","Mentorhelp") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ if(current_mentorhelp)
+ if(tgui_alert(usr, "You already have a ticket open. Is this for the same issue?","Duplicate?",list("Yes","No")) != "No")
+ if(current_mentorhelp)
+ log_admin("Mentorhelp: [key_name(src)]: [msg]")
+ current_mentorhelp.MessageNoRecipient(msg)
+ to_chat(usr, "Mentor-PM to-Mentors: [msg]")
+ return
+ else
+ to_chat(usr, "Ticket not found, creating new one...")
+ else
+ current_mentorhelp.AddInteraction("[usr.ckey] opened a new ticket.")
+ current_mentorhelp.Resolve()
+
+ new /datum/mentor_help(msg, src, FALSE)
+
+//admin proc
+/client/proc/cmd_mentor_ticket_panel()
+ set name = "Mentor Ticket List"
+ set category = "Admin"
+
+ var/browse_to
+
+ switch(tgui_input_list(usr, "Display which ticket list?", "List Choice", list("Active Tickets", "Resolved Tickets")))
+ if("Active Tickets")
+ browse_to = AHELP_ACTIVE
+ if("Resolved Tickets")
+ browse_to = AHELP_RESOLVED
+ else
+ return
+
+ GLOB.mhelp_tickets.BrowseTickets(browse_to)
+
+/proc/message_mentors(var/msg)
+ msg = "Mentor: [msg]"
+
+ for(var/client/C in GLOB.mentors)
+ to_chat(C, msg)
+ for(var/client/C in GLOB.admins)
+ to_chat(C, msg)
\ No newline at end of file
diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm
index ce2a44297f5..966fb5b74fe 100644
--- a/code/modules/mining/abandonedcrates.dm
+++ b/code/modules/mining/abandonedcrates.dm
@@ -146,7 +146,7 @@
return
to_chat(user, "The crate is locked with a Deca-code lock.")
- var/input = input(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "") as text
+ var/input = tgui_input_text(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "")
if(!Adjacent(user))
return
var/list/sanitised = list()
@@ -215,3 +215,10 @@
to_chat(user, "Last code attempt, [previousattempt], had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions.")
return
..()
+
+/obj/structure/closet/crate/secure/loot/damage(var/damage)
+ if(contents.len)
+ visible_message("[src] makes a grinding noise as its contents are destroyed by the deca-lock safety!")
+ for(var/obj/O in src.contents)
+ qdel(O)
+ ..()
\ No newline at end of file
diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm
index 868056afd8c..0baa14a790a 100644
--- a/code/modules/mining/drilling/drill.dm
+++ b/code/modules/mining/drilling/drill.dm
@@ -173,7 +173,7 @@
/obj/machinery/mining/drill/attackby(obj/item/O as obj, mob/user as mob)
if(!active)
if(istype(O, /obj/item/device/multitool))
- var/newtag = text2num(sanitizeSafe(input(user, "Enter new ID number or leave empty to cancel.", "Assign ID number") as text, 4))
+ var/newtag = text2num(sanitizeSafe(tgui_input_text(user, "Enter new ID number or leave empty to cancel.", "Assign ID number", null, 4), 4))
if(newtag)
name = "[initial(name)] #[newtag]"
to_chat(user, "You changed the drill ID to: [newtag]")
diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm
index 9d6eea46079..b1427946c91 100644
--- a/code/modules/mining/drilling/scanner.dm
+++ b/code/modules/mining/drilling/scanner.dm
@@ -51,7 +51,7 @@
if(ore_type) metals[ore_type] += T.resources[metal]
- var/message = "[bicon(src)] The scanner beeps and displays a readout."
+ var/message = "\icon[src][bicon(src)] The scanner beeps and displays a readout."
for(var/ore_type in metals)
var/result = "no sign"
diff --git a/code/modules/mining/kinetic_crusher.dm b/code/modules/mining/kinetic_crusher.dm
index 7effaf60d98..043dfe81885 100644
--- a/code/modules/mining/kinetic_crusher.dm
+++ b/code/modules/mining/kinetic_crusher.dm
@@ -230,7 +230,7 @@
desc = "A modified design of a proto-kinetic crusher, it is still little more of a combination of various mining tools cobbled together \
and kit-bashed into a high-tech cleaver on a stick - with a handguard and a goliath hide grip. While it is still of little use to any \
but the most skilled and/or suicidal miners against local fauna, it's an elegant weapon for a more civilized hunter."
-
+
look gary there i am
- hatterhat
*/
@@ -256,6 +256,9 @@
backstab_bonus = 40 // 100
thrown_bonus = 20 // 120
update_item_state = FALSE
+ slot_flags = SLOT_BELT
+
+
/obj/item/weapon/kinetic_crusher/machete/gauntlets
@@ -275,6 +278,7 @@
detonation_damage = 37 // 75
backstab_bonus = 55 // 130
var/obj/item/offhand/crushergauntlets/offhand
+ slot_flags = null
/obj/item/weapon/kinetic_crusher/machete/gauntlets/equipped()
. = ..()
@@ -381,6 +385,7 @@
thrown_bonus = 50 // 135 but you drop your knife because you threw it
+
//destablizing force
/obj/item/projectile/destabilizer
name = "destabilizing force"
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index a2f1a5c1713..29fe4412229 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -352,7 +352,7 @@ var/list/mining_overlay_cache = list()
//Not even going to touch this pile of spaghetti
/turf/simulated/mineral/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ if (!user.IsAdvancedToolUser())
to_chat(user, "You don't have the dexterity to do this!")
return
@@ -403,30 +403,14 @@ var/list/mining_overlay_cache = list()
F.attackby(W,user)
return
- else if(istype(W, /obj/item/stack/rods))
- var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
- if(L)
- return
- var/obj/item/stack/rods/R = W
- if (R.use(1))
- to_chat(user, "Constructing support lattice ...")
- playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
- new /obj/structure/lattice(get_turf(src))
-
else if(istype(W, /obj/item/stack/tile/floor))
- var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
- if(L)
- var/obj/item/stack/tile/floor/S = W
- if (S.get_amount() < 1)
- return
- qdel(L)
- playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
- ChangeTurf(/turf/simulated/floor)
- S.use(1)
- return
- else
- to_chat(user, "The plating is going to need some support.")
+ var/obj/item/stack/tile/floor/S = W
+ if (S.get_amount() < 1)
return
+ playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
+ ChangeTurf(/turf/simulated/floor)
+ S.use(1)
+ return
else
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index cc0c156fec1..1bca8b654f7 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -129,6 +129,9 @@
T = pick(latejoin) //Safety in case we cannot find the body's position
if(T)
forceMove(T)
+ else
+ moveToNullspace()
+ to_chat(src, "Could not locate an observer spawn point. Use the Teleport verb to jump to the station map.")
if(!name) //To prevent nameless ghosts
name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
@@ -168,10 +171,10 @@
I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE)
set_cached_examine_icon(src, I, 200 SECONDS)
return I
-
+
/mob/observer/dead/examine(mob/user)
. = ..()
-
+
if(is_admin(user))
. += "\t>[ADMIN_FULLMONTY(src)]"
@@ -344,7 +347,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/list/areas = return_sorted_areas()
if(client?.holder)
return areas
-
+
for(var/key in areas)
var/area/A = areas[key]
if(A.z in using_map?.secret_levels)
@@ -378,7 +381,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return
var/area/A
-
+
if(!areaname)
var/list/areas = jumpable_areas()
var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas)
@@ -420,29 +423,29 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return
ManualFollow(M || jumpable_mobs()[mobname])
-
+
/mob/observer/dead/forceMove(atom/destination)
if(client?.holder)
return ..()
-
+
if(get_z(destination) in using_map?.secret_levels)
to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts."))
if(following)
stop_following()
return
-
+
return ..()
/mob/observer/dead/Move(atom/newloc, direct = 0, movetime)
if(client?.holder)
return ..()
-
+
if(get_z(newloc) in using_map?.secret_levels)
to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts."))
if(following)
stop_following()
return
-
+
return ..()
// This is the ghost's follow verb with an argument
@@ -521,7 +524,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
for(var/mob/observer/dead/M in following_mobs)
if(!.)
M.stop_following()
-
+
if(M.following != src)
following_mobs -= M
else
@@ -770,7 +773,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/max_length = 50
- var/message = sanitize(input(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", ""))
+ var/message = sanitize(tgui_input_text(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", "", max_length))
if (message)
@@ -874,7 +877,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "Toggle Darkness"
set desc = "Toggles your ability to see lighting overlays, and the darkness they create."
set category = "Ghost"
-
+
var/static/list/darkness_names = list("normal darkness levels", "30% darkness removed", "70% darkness removed", "no darkness")
var/static/list/darkness_levels = list(255, 178, 76, 0)
@@ -883,7 +886,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
index = 1
else
index++
-
+
lighting_alpha = darkness_levels[index]
updateghostsight()
to_chat(src, "Your vision now has [darkness_names[index]].")
@@ -935,7 +938,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/mob/living/M = tgui_input_list(src, "Select who to whisper to:", "Whisper to?", options)
if(!M)
return 0
- var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null)
+ var/msg = sanitize(tgui_input_text(src, "Message:", "Spectral Whisper"))
if(msg)
log_say("(SPECWHISP to [key_name(M)]): [msg]", src)
to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]")
@@ -984,15 +987,29 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set category = "Ghost"
set name = "Blank pAI alert"
set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope."
-
+
+ var/time_till_respawn = time_till_respawn()
+ if(time_till_respawn == -1) // Special case, never allowed to respawn
+ to_chat(usr, "Respawning is not allowed!")
+ else if(time_till_respawn) // Nonzero time to respawn
+ to_chat(usr, "You can't do that yet! You died too recently. You need to wait another [round(time_till_respawn/10/60, 0.1)] minutes.")
+ return
+
+ if(jobban_isbanned(usr, "pAI"))
+ to_chat(usr,"You cannot alert pAI cards when you are banned from playing as a pAI.")
+ return
+
if(usr.client.prefs?.be_special & BE_PAI)
+ var/choice = tgui_alert(usr, "Would you like to submit yourself to the recruitment list too?", "Confirmation", list("No", "Yes"))
+ if(choice == "Yes")
+ paiController.recruitWindow(usr)
var/count = 0
for(var/obj/item/device/paicard/p in all_pai_cards)
var/obj/item/device/paicard/PP = p
if(PP.pai == null)
count++
- PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit
PP.add_overlay("pai-ghostalert")
+ PP.alertUpdate()
spawn(54)
PP.cut_overlays()
to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.")
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index f59ebf612cd..48cdfa3ebd7 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -23,7 +23,7 @@
var/input
if(!message)
- input = sanitize_or_reflect(input(src, "Choose an emote to display.") as text|null, src) //VOREStation Edit - Reflect too long messages, within reason
+ input = sanitize_or_reflect(tgui_input_text(src, "Choose an emote to display."), src) //VOREStation Edit - Reflect too long messages, within reason
else
input = message
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index 2c0de82adce..797918d0f87 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -4,7 +4,7 @@
var/msg = "" // This is to make sure that the pieces have actually added something
var/raw_msg = ""
. = list("formatted" = "[verb], \"", "raw" = "")
-
+
for(var/datum/multilingual_say_piece/SP in message_pieces)
iteration_count++
var/piece = SP.message
@@ -15,11 +15,11 @@
if(radio)
.["formatted"] = SP.speaking.format_message_radio(piece)
.["raw"] = piece
- return
+ return
else
.["formatted"] = SP.speaking.format_message(piece)
.["raw"] = piece
- return
+ return
if(iteration_count == 1)
piece = capitalize(piece)
@@ -27,14 +27,17 @@
if(always_stars)
piece = stars(piece)
else if(!say_understands(speaker, SP.speaking))
- piece = saypiece_scramble(SP)
- if(isliving(speaker))
- var/mob/living/S = speaker
- if(istype(S.say_list) && length(S.say_list.speak))
- piece = pick(S.say_list.speak)
+ if(SP.speaking.flags & INAUDIBLE)
+ piece = ""
+ else
+ piece = saypiece_scramble(SP)
+ if(isliving(speaker))
+ var/mob/living/S = speaker
+ if(istype(S.say_list) && length(S.say_list.speak))
+ piece = pick(S.say_list.speak)
raw_msg += (piece + " ")
-
+
//HTML formatting
if(!SP.speaking) // Catch the most generic case first
piece = "[piece]"
@@ -44,7 +47,7 @@
piece = SP.speaking.format_message(piece)
msg += (piece + " ")
-
+
if(msg == "")
// There is literally no content left in this message, we need to shut this shit down
.["formatted"] = "" // hear_say will suppress it
@@ -89,8 +92,8 @@
var/list/combined = combine_message(message_pieces, verb, speaker)
var/message = combined["formatted"]
if(message == "")
- return
-
+ return FALSE
+
if(sleeping || stat == UNCONSCIOUS)
hear_sleep(multilingual_to_message(message_pieces))
return FALSE
@@ -126,9 +129,11 @@
var/turf/source = speaker ? get_turf(speaker) : get_turf(src)
playsound_local(source, speech_sound, sound_vol, 1)
+ return TRUE
+
// Done here instead of on_hear_say() since that is NOT called if the mob is clientless (which includes most AI mobs).
/mob/living/hear_say(var/list/message_pieces, var/verb = "says", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
- ..()
+ .=..()
if(has_AI()) // Won't happen if no ai_holder exists or there's a player inside w/o autopilot active.
ai_holder.on_hear_say(speaker, multilingual_to_message(message_pieces))
@@ -169,7 +174,7 @@
var/regex/R = new("\\[delimiter](.+?)\\[delimiter]","g")
var/tag = GLOB.speech_toppings[delimiter]
tagged_message = R.Replace(tagged_message,"<[tag]>$1[tag]>")
-
+
return tagged_message
/mob/proc/hear_radio(var/list/message_pieces, var/verb = "says", var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0, var/vname = "")
@@ -226,13 +231,13 @@
final_message = "[time][final_message]"
to_chat(src, final_message)
-/mob/proc/hear_signlang(var/message, var/verb = "gestures", var/datum/language/language, var/mob/speaker = null)
+/mob/proc/hear_signlang(var/message, var/verb = "gestures", var/verb_understood = "gestures", var/datum/language/language, var/mob/speaker = null, var/speech_type = 1)
if(!client)
return
if(say_understands(speaker, language))
- message = "[speaker] [verb], \"[message]\""
- else
+ message = "[speaker] [verb_understood], \"[message]\""
+ else if(!(language.ignore_adverb))
var/adverb
var/length = length(message) * pick(0.8, 0.9, 1.0, 1.1, 1.2) //Adds a little bit of fuzziness
switch(length)
@@ -242,8 +247,10 @@
if(48 to 90) adverb = " a lengthy message"
else adverb = " a very lengthy message"
message = "[speaker] [verb][adverb]."
+ else
+ message = "[speaker] [verb]."
- show_message(message, type = 1) // Type 1 is visual message
+ show_message(message, type = speech_type) // Type 1 is visual message
/mob/proc/hear_sleep(var/message)
var/heard = ""
@@ -293,4 +300,4 @@
name = speaker.voice_name
var/rendered = "[name] [message]"
- to_chat(src, rendered)
+ to_chat(src, rendered)
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index 5b6d1556402..5e4ff61e0e3 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -29,11 +29,13 @@ var/list/holder_mob_icon_cache = list()
ASSERT(ismob(held))
. = ..()
held.forceMove(src)
+ held.reset_view(src)
START_PROCESSING(SSobj, src)
/obj/item/weapon/holder/Entered(mob/held, atom/OldLoc)
if(held_mob)
held.forceMove(get_turf(src))
+ held.reset_view(null)
return
ASSERT(ismob(held))
. = ..()
@@ -71,6 +73,7 @@ var/list/holder_mob_icon_cache = list()
held_mob.transform = original_transform
held_mob.vis_flags = original_vis_flags
held_mob.forceMove(get_turf(src))
+ held_mob.reset_view(null)
held_mob = null
/obj/item/weapon/holder/throw_at(atom/target, range, speed, thrower)
@@ -103,9 +106,14 @@ var/list/holder_mob_icon_cache = list()
holster.clear_holster()
to_chat(held, "You extricate yourself from [holster].")
forceMove(get_turf(src))
+ held.reset_view(null)
else if(isitem(loc))
+ var/obj/item/I = loc
to_chat(held, "You struggle free of [loc].")
forceMove(get_turf(src))
+ held.reset_view(null)
+ if(istype(I))
+ I.on_holder_escape(src)
//Mob specific holders.
/obj/item/weapon/holder/diona
@@ -167,6 +175,12 @@ var/list/holder_mob_icon_cache = list()
item_state = "cat"
/obj/item/weapon/holder/cat/runtime
+
+/obj/item/weapon/holder/fennec
+ origin_tech = list(TECH_BIO = 2)
+
+/obj/item/weapon/holder/cat/runtime
+
origin_tech = list(TECH_BIO = 2, TECH_DATA = 4)
/obj/item/weapon/holder/cat/cak
diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm
index 03daea6197f..0c2fecfabc9 100644
--- a/code/modules/mob/language/generic.dm
+++ b/code/modules/mob/language/generic.dm
@@ -18,7 +18,7 @@
// 'basic' language; spoken by default.
/datum/language/common
name = LANGUAGE_GALCOM
- desc = "The common galactic tongue, engineered for cross-species communication."
+ desc = "The common galactic tongue, engineered for cross-species communication. Every spacer there is knows this!"
speech_verb = "says"
whisper_verb = "whispers"
key = "0"
@@ -127,7 +127,7 @@
/datum/language/sign
name = LANGUAGE_SIGN
- desc = "A sign language commonly used for those who are deaf or mute."
+ desc = "A sign language commonly used for those who are deaf or mute. Especially popular with spacers, due to practicality in airless environments."
signlang_verb = list("gestures")
colour = "say_quote"
key = "s"
@@ -145,13 +145,14 @@
// which is exactly what sign language does.
/datum/language/sign/broadcast(var/mob/living/speaker, var/message, var/speaker_mask)
log_say("(SIGN) [message]", speaker)
- speaker.say_signlang(message, pick(signlang_verb), src)
-
+ var/verb_to_use = pick(signlang_verb)
+ speaker.say_signlang(message, verb_to_use, verb_to_use, src)
+
// Silly language for those times when you try to talk a languague you normally can't
/datum/language/gibberish
name = LANGUAGE_GIBBERISH
- desc = "A completely incomprehensible language."
+ desc = "A completely incomprehensible gibberish that can barely be called a language."
signlang_verb = list("flails")
speech_verb = "spews"
whisper_verb = "mumbles"
diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm
index cf372545e7b..4fa749f41e1 100644
--- a/code/modules/mob/language/language.dm
+++ b/code/modules/mob/language/language.dm
@@ -12,6 +12,7 @@
var/exclaim_verb = "exclaims" // Used when sentence ends in a !
var/whisper_verb // Optional. When not specified speech_verb + quietly/softly is used instead.
var/signlang_verb = list("signs", "gestures") // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags
+ var/signlang_verb_understood = list("signs") // snowflake bs, used only for echo
var/colour = "body" // CSS style to use for strings in this language.
var/key = "x" // Character used to speak in language eg. :o for Unathi.
var/flags = 0 // Various language flags.
@@ -20,6 +21,7 @@
var/list/space_chance = 55 // Likelihood of getting a space in the random scramble string
var/machine_understands = 1 // Whether machines can parse and understand this language
var/list/partial_understanding // List of languages that can /somehwat/ understand it, format is: name = chance of understanding a word
+ var/ignore_adverb = FALSE // For inaudible languages that we dont want adverb for
/datum/language/proc/get_random_name(var/gender, name_count=2, syllable_count=4, syllable_divisor=2)
if(!syllables || !syllables.len)
@@ -190,6 +192,9 @@
/mob/proc/remove_language(var/rem_language)
var/datum/language/L = GLOB.all_languages[rem_language]
. = (L in languages)
+ var/prefix = get_custom_prefix_by_lang(src, L)
+ if(prefix)
+ language_keys.Remove(prefix)
languages.Remove(L)
/mob/living/remove_language(rem_language)
@@ -235,10 +240,11 @@
//TBD
/mob/proc/check_lang_data()
. = ""
-
+
for(var/datum/language/L in languages)
if(!(L.flags & NONGLOBAL))
- . += "[L.name] ([get_language_prefix()][L.key]) [L.desc]
"
+ var/lang_key = get_custom_prefix_by_lang(src, L)
+ . += "[L.name] ([get_language_prefix()][L.key][lang_key ? " [get_language_prefix()][lang_key]" : ""]) [L.desc]
"
/mob/living/check_lang_data()
. = ""
@@ -248,12 +254,13 @@
for(var/datum/language/L in languages)
if(!(L.flags & NONGLOBAL))
+ var/lang_key = get_custom_prefix_by_lang(src, L)
if(L == default_language)
- . += "[L.name] ([get_language_prefix()][L.key]) - default - reset [L.desc]
"
+ . += "[L.name] ([get_language_prefix()][L.key][lang_key ? " [get_language_prefix()][lang_key]" : ""]) Edit Custom Key - default - reset [L.desc]
"
else if (can_speak(L))
- . += "[L.name] ([get_language_prefix()][L.key]) - set default [L.desc]
"
+ . += "[L.name] ([get_language_prefix()][L.key][lang_key ? " [get_language_prefix()][lang_key]" : ""]) Edit Custom Key - set default [L.desc]
"
else
- . += "[L.name] ([get_language_prefix()][L.key]) - cannot speak! [L.desc]
"
+ . += "[L.name] ([get_language_prefix()][L.key][lang_key ? " [get_language_prefix()][lang_key]" : ""]) Edit Custom Key - cannot speak! [L.desc]
"
/mob/verb/check_languages()
set name = "Check Known Languages"
@@ -277,6 +284,22 @@
set_default_language(L)
check_languages()
return 1
+ else if(href_list["set_lang_key"])
+ var/datum/language/L = locate(href_list["set_lang_key"])
+ if(L && (L in languages))
+ var/old_key = get_custom_prefix_by_lang(src, L)
+ var/custom_key = tgui_input_text(src, "Input a new key for [L.name]", "Language Key", old_key)
+ if(custom_key && length(custom_key) == 1)
+ if(contains_az09(custom_key))
+ language_keys[custom_key] = L
+ if(old_key && old_key != custom_key)
+ language_keys.Remove(old_key)
+ else if(custom_key == " ")
+ if(old_key && old_key != custom_key)
+ language_keys.Remove(old_key)
+ else
+ tgui_alert_async(src, "Improper language key. Rejected.", "Error")
+ check_languages()
else
return ..()
@@ -285,5 +308,17 @@
if(L.flags & except_flags)
continue
target.add_language(L.name)
+ for(var/key in source.language_keys)
+ if(L == source.language_keys[key])
+ if(!(key in target.language_keys))
+ target.language_keys[key] = L
+
+/proc/get_custom_prefix_by_lang(var/mob/our_mob, var/language)
+ if(!our_mob || !our_mob.language_keys.len || !language)
+ return
+
+ for(var/key in our_mob.language_keys)
+ if(our_mob.language_keys[key] == language)
+ return key
#undef SCRAMBLE_CACHE_LEN
diff --git a/code/modules/mob/language/monkey.dm b/code/modules/mob/language/monkey.dm
index 6736b803fc2..8224ca7aa88 100644
--- a/code/modules/mob/language/monkey.dm
+++ b/code/modules/mob/language/monkey.dm
@@ -1,61 +1,16 @@
-/datum/language/human/monkey
- name = "Chimpanzee"
- desc = "Ook ook ook."
- speech_verb = "chimpers"
- ask_verb = "chimpers"
- exclaim_verb = "screeches"
+/datum/language/human/animal
+ name = LANGUAGE_ANIMAL
+ desc = "A collection of ooking noises made by monkeys"
+ speech_verb = "says"
+ ask_verb = "inquires"
+ exclaim_verb = "yells"
key = "C"
- syllables = list("ook","eek")
+ syllables = list("chrp","tweet","squick","croak","hiss","gronk","meow","mew","bark", "woof", "bowwow", "yap", "arf") //This is a generalized animal language. If spoken by an animal, it comes out with the mob noises. This only occurs when spoken by a carbon (human).
machine_understands = 0
-/datum/language/skrell/monkey
- name = "Neaera"
- desc = "Squik squik squik."
- key = "8"
- syllables = list("hiss","gronk")
- machine_understands = 0
-
-/datum/language/unathi/monkey
- name = "Stok"
- desc = "Hiss hiss hiss."
- key = "7"
- syllables = list("squick","croak")
- machine_understands = 0
-
-/datum/language/tajaran/monkey
- name = "Farwa"
- desc = "Meow meow meow."
- key = "9"
- syllables = list("meow","mew")
- machine_understands = 0
-
-/datum/language/corgi
- name = "Dog"
- desc = "Woof woof woof."
- speech_verb = "barks"
- ask_verb = "woofs"
- exclaim_verb = "howls"
- key = "n"
- flags = RESTRICTED
- machine_understands = 0
- space_chance = 100
- syllables = list("bark", "woof", "bowwow", "yap", "arf")
-
-/datum/language/cat
- name = "Cat"
- desc = "Meow meow meow."
- speech_verb = "meows"
- ask_verb = "mrowls"
- exclaim_verb = "yowls"
- key = "c"
- flags = RESTRICTED
- machine_understands = 0
- space_chance = 100
- syllables = list("meow", "mrowl", "purr", "meow", "meow", "meow")
-
/datum/language/mouse
name = "Mouse"
- desc = "Squeak squeak. *Nibbles on cheese*"
+ desc = "A set of squeaks that only mice can understand."
speech_verb = "squeaks"
ask_verb = "squeaks"
exclaim_verb = "squeaks"
@@ -65,14 +20,14 @@
space_chance = 100
syllables = list("squeak") // , "gripes", "oi", "meow")
-/datum/language/bird
- name = "Bird"
- desc = "Chirp chirp, give me food"
- speech_verb = "chirps"
- ask_verb = "tweets"
- exclaim_verb = "squawks"
- key = "B"
- flags = RESTRICTED
+/datum/language/teppi
+ name = "Teppi"
+ desc = "A set of gyohs that only teppi can understand."
+ speech_verb = "rumbles"
+ ask_verb = "tilts"
+ exclaim_verb = "roars"
+ key = "i"
+ flags = WHITELISTED
machine_understands = 0
space_chance = 100
- syllables = list("chirp", "squawk", "tweet")
+ syllables = list("gyoh", "snoof", "gyoooooOOOooh", "iuuuuh", "gyuuuuh")
diff --git a/code/modules/mob/language/outsider.dm b/code/modules/mob/language/outsider.dm
index 1d73c4640c4..64d8caadb06 100644
--- a/code/modules/mob/language/outsider.dm
+++ b/code/modules/mob/language/outsider.dm
@@ -74,17 +74,6 @@
"gal'h'rfikk", "harfrandid", "mud'gib", "il", "fuu", "ma'jin", "dedo", "ol'btoh", "n'ath", "reth", "sh'yro", "eth", \
"d'rekkathnor", "khari'd", "gual'te", "nikka", "nikt'o", "barada", "kla'atu", "barhah", "hra" ,"zar'garis", "spiri", "malum")
-/datum/language/cult
- name = LANGUAGE_OCCULT
- desc = "The initiated can share their thoughts by means defying all reason."
- speech_verb = "intones"
- ask_verb = "intones"
- exclaim_verb = "chants"
- colour = "cult"
- key = "y"
- machine_understands = 0
- flags = RESTRICTED | HIVEMIND
-
/datum/language/xenocommon
name = "Xenomorph"
colour = "alien"
@@ -143,32 +132,6 @@
"danya","da","mied","zan","das","krem","myka","cyka","blyat","to","st","no","na","ni",
"ko","ne","en","po","ra","li","on","byl","cto","eni","ost","ol","ego","ver","stv","pro")
-//For your event purposes.
-/datum/language/occursus
- name = LANGUAGE_EVENT1
- desc = "The Powers That Be have seen it fit to grace you with a special language that sounds like... something. This description should be overridden by the time you see this."
- speech_verb = "says"
- ask_verb = "asks"
- exclaim_verb = "shouts"
- colour = "warning"
- key = "]"
- flags = RESTRICTED
- syllables = list("chan","ange","thi","se")
-
-//Bloblang.
-/datum/language/blob
- name = LANGUAGE_BLOB
- desc = "The massive processing power of the Blob's core gives the overmind finely tuned abilities to transmit messages to nearby life-forms through chemical signals."
- speech_verb = "resonates"
- ask_verb = "reverberates"
- exclaim_verb = "shudders"
- colour = "blob"
- key = "}"
- machine_understands = TRUE
- flags = RESTRICTED
-
- syllables = list("^", "˅", "-", "°", "~")
-
/datum/language/corticalborer/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
var/mob/living/simple_mob/animal/borer/B
diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm
index 85bd64c0fcc..22550a37daf 100644
--- a/code/modules/mob/language/station.dm
+++ b/code/modules/mob/language/station.dm
@@ -96,7 +96,8 @@
/datum/language/tajsign/broadcast(var/mob/living/speaker, var/message, var/speaker_mask)
log_say("(SIGN) [message]", speaker)
- speaker.say_signlang(message, pick(signlang_verb), src)
+ var/verb_to_use = pick(signlang_verb)
+ speaker.say_signlang(message, verb_to_use, verb_to_use, src)
/datum/language/tajsign/can_speak_special(var/mob/speaker) // TODO: If ever we make external organs assist languages, convert this over to the new format
var/list/allowed_species = list(SPECIES_TAJ, SPECIES_TESHARI) // Need a tail and ears and such to use this.
@@ -113,7 +114,7 @@
/datum/language/skrell
name = LANGUAGE_SKRELLIAN
- desc = "A set of warbles and hums, the language itself a complex mesh of both melodic and rhythmic components, exceptionally capable of conveying intent and emotion of the speaker."
+ desc = "A set of warbles and hums, the language itself a complex mesh of both melodic and rhythmic components, exceptionally capable of conveying intent and emotion of the speaker. Native to Skrell."
speech_verb = "warbles"
ask_verb = "warbles"
exclaim_verb = "sings"
@@ -124,19 +125,6 @@
flags = WHITELISTED
syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix")
-/datum/language/skrellfar
- name = LANGUAGE_SKRELLIANFAR
- desc = "The most common language among the Skrellian Far Kingdoms. Has an even higher than usual concentration of inaudible phonemes."
- speech_verb = "warbles"
- ask_verb = "warbles"
- exclaim_verb = "sings"
- whisper_verb = "hums"
- colour = "skrellfar"
- key = "p"
- space_chance = 30
- flags = WHITELISTED
- syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix", "...", "oo", "q", "nq", "x", "xq", "ll", "...", "...", "...") //should sound like there's holes in it
-
/datum/language/skrell/get_random_name(var/gender)
var/list/first_names = file2list('config/names/first_name_skrell.txt')
var/list/last_names = file2list('config/names/last_name_skrell.txt')
@@ -144,7 +132,7 @@
/datum/language/human
name = LANGUAGE_SOL_COMMON
- desc = "A bastardized hybrid of many languages, including Chinese, English, French, and more; it is the common language of the Sol system."
+ desc = "A bastardized hybrid of many human languages, including Chinese, English, French, and more; it is the common language of the Sol system."
speech_verb = "says"
whisper_verb = "whispers"
colour = "solcom"
@@ -171,7 +159,7 @@
/datum/language/machine
name = LANGUAGE_EAL
- desc = "An efficient language of encoded tones developed by positronics."
+ desc = "An efficient language of encoded tones developed by positronics, although compatible with any synthetic lifeforms."
speech_verb = "whistles"
ask_verb = "chirps"
exclaim_verb = "whistles loudly"
@@ -189,7 +177,7 @@
/datum/language/teshari
name = LANGUAGE_SCHECHI
- desc = "A trilling language spoken by the diminutive Teshari."
+ desc = "A trilling language spoken by the Teshari."
speech_verb = "chirps"
ask_verb = "chirrups"
exclaim_verb = "trills"
@@ -221,7 +209,7 @@
/datum/language/promethean
name = LANGUAGE_PROMETHEAN
- desc = "A complex language composed of guttural noises and bioluminescent signals"
+ desc = "A complex language of prometheans, composed of guttural noises and bioluminescent signals."
signlang_verb = list("flickers","flashes","rapidly flashes a light","quickly flickers a light")
speech_verb = "gurgles"
ask_verb = "gurgles"
diff --git a/code/modules/mob/language/station_vr.dm b/code/modules/mob/language/station_vr.dm
index 17b756f1f85..78c3f9c0578 100644
--- a/code/modules/mob/language/station_vr.dm
+++ b/code/modules/mob/language/station_vr.dm
@@ -11,7 +11,7 @@
/datum/language/birdsong
name = LANGUAGE_BIRDSONG
- desc = "A language primarily spoken by Narvians"
+ desc = "A tweety language primarily spoken by Nevreans."
speech_verb = "chirps"
colour = "birdsongc"
key = "G"
@@ -94,36 +94,6 @@
machine_understands = FALSE
flags = WHITELISTED | HIVEMIND
-/datum/language/slavic
- name = LANGUAGE_SLAVIC
- desc = "The official language of the Independent Colonial Confederation of Gilgamesh, originally established in 2122 by the short-lived United Slavic Confederation on Earth."
- speech_verb = "govorit" // All Russian for "says" "asks" and "shouts". Mostly here as a joke.
- ask_verb = "sprashivaet"
- exclaim_verb = "krichit"
- whisper_verb = "shepchet"
- colour = "attack" // Red for slav!
- key = "P"
- syllables = list(
- "rus", "zem", "ave", "blyat", "cyk", "groz", "ski", "ska", "ven", "konst", "pol", "lin", "svy",
- "danya", "da", "mied", "kuz,", "zan", "das", "krem", "myka", "to", "st", "no", "na", "ni",
- "ko", "ne", "en", "po", "tro", "ra", "li", "on", "byl", "cto", "eni", "ost", "ol", "ego",
- "ver", "stv", "pro", "ski"
- )
-
-/datum/language/clownish
- name = LANGUAGE_CLOWNISH
- desc = "A special elective language course for those studying at the Clown Planet Institute."
- speech_verb = "honks"
- ask_verb = "seins"
- exclaim_verb = "crenks"
- whisper_verb = "squeaks"
- colour = "#F785F2" // Pink for the clown.
- key = "<"
- flags = WHITELISTED | CLOWN
- syllables = list(
- "honk", "knock", "salt", "slip", "lube", "banana", "flower", "pie", "did you hear", "🅱ï¸", "haha", "bully", "going up",
- )
-
/datum/language/drudakar
name = LANGUAGE_DRUDAKAR
desc = "The native language of the D'Rudak'Ar, a loosely tied together community of dragons and demi-dragons based in the Diul system. Features include many hard consonants and rolling 'r's."
@@ -151,14 +121,31 @@
/datum/language/tavan
name = LANGUAGE_TAVAN
- desc = "A language native to the Altevians, it has been adopted by other rodent faring species over time."
+ desc = "A language native to the rat-like Altevians, it has been adopted by other rodent faring species over time."
key = "E"
speech_verb = "squeaks"
whisper_verb = "squiks"
exclaim_verb = "squeaks loudly"
syllables = list ("sque", "uik", "squeak", "squee", "eak", "eek", "uek", "squik",
"squeek", "sq", "squee", "ee", "ek", "ak", "ueak", "squea")
- colour = "tavan"
+ colour = "tavan"
+
+/datum/language/echosong
+ name = LANGUAGE_ECHOSONG
+ desc = "An ultrasound-based language, inaudible to those unable to understand it, spoken by few species capable of actually hearing it."
+ key = "U"
+ signlang_verb = list("opens their mouth soundlessly", "mouthes something silently")
+ signlang_verb_understood = list("squeaks")
+ colour = "echosong"
+ flags = INAUDIBLE
+ ignore_adverb = TRUE
+
+/datum/language/echosong/scramble(var/input, var/list/known_languages)
+ return stars(input)
+
+/datum/language/echosong/broadcast(var/mob/living/speaker, var/message, var/speaker_mask)
+ log_say("(INAUDIBLE) [message]", speaker)
+ speaker.say_signlang(format_message(message), pick(signlang_verb), pick(signlang_verb_understood), src, 2)
/datum/language/unathi
flags = 0
@@ -176,11 +163,5 @@
machine_understands = FALSE
desc = "A dialect of Tradeband not uncommon amongst traders in the Free Trade Union. The language is often difficult to translate due to changing frequently and being highly colloquial."
partial_understanding = list(LANGUAGE_TRADEBAND = 30, LANGUAGE_SOL_COMMON = 10)
-/datum/language/human/monkey
- flags = RESTRICTED
-/datum/language/skrell/monkey
- flags = RESTRICTED
-/datum/language/unathi/monkey
- flags = RESTRICTED
-/datum/language/tajaran/monkey
- flags = RESTRICTED
+/datum/language/human/animal
+ flags = RESTRICTED
\ No newline at end of file
diff --git a/code/modules/mob/living/bot/SLed209bot.dm b/code/modules/mob/living/bot/SLed209bot.dm
index 82f3c43cc2c..f016bc55f27 100644
--- a/code/modules/mob/living/bot/SLed209bot.dm
+++ b/code/modules/mob/living/bot/SLed209bot.dm
@@ -67,7 +67,7 @@
/obj/item/weapon/secbot_assembly/ed209_assembly/slime/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) // Here in the event it's added into a PoI or some such. Standard construction relies on the standard ED up until taser.
if(istype(W, /obj/item/weapon/pen))
- var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN)
+ var/t = sanitizeSafe(tgui_input_text(user, "Enter new robot name", name, created_name, MAX_NAME_LEN), MAX_NAME_LEN)
if(!t)
return
if(!in_range(src, usr) && src.loc != usr)
diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm
index 7734b5c124f..8c6456ce2f3 100644
--- a/code/modules/mob/living/bot/bot.dm
+++ b/code/modules/mob/living/bot/bot.dm
@@ -17,7 +17,7 @@
var/emagged = 0
var/light_strength = 3
var/busy = 0
-
+ var/obj/item/device/paicard/paicard = null
var/obj/access_scanner = null
var/list/req_access = list()
var/list/req_one_access = list()
@@ -69,10 +69,27 @@
SetStunned(0)
SetParalysis(0)
- if(on && !client && !busy)
+ if(on && !client && !busy && !paicard)
spawn(0)
handleAI()
-
+/*
+/mob/living/bot/examine(mob/user)
+ . = ..()
+ if(health < maxHealth)
+ if(health > maxHealth/3)
+ . += "[src]'s parts look loose."
+ else
+ . += "[src]'s parts look very loose!"
+ else
+ . += "[src] is in pristine condition."
+ . += span_notice("Its maintenance panel is [open ? "open" : "closed"].")
+ . += span_info("You can use a screwdriver to [open ? "close" : "open"] it.")
+ . += span_notice("Its control panel is [locked ? "locked" : "unlocked"].")
+ if(paicard)
+ . += span_notice("It has a pAI device installed.")
+ if(open)
+ . += span_info("You can use a crowbar to remove it.")
+*/
/mob/living/bot/updatehealth()
if(status_flags & GODMODE)
health = getMaxHealth()
@@ -135,6 +152,17 @@
qdel(O)
else
to_chat(user, "Unable to repair with the maintenance panel closed.")
+ else if(istype(O, /obj/item/device/paicard))
+ if(open)
+ insertpai(user, O)
+ to_chat(user, span_notice("You slot the card into \the [initial(src.name)]."))
+ else
+ to_chat(user, span_notice("You must open the panel first!"))
+ else if(O.is_crowbar())
+ if(open && paicard)
+ to_chat(user, span_notice("You are attempting to remove the pAI.."))
+ if(do_after(user,10 * O.toolspeed))
+ ejectpai(user)
else
..()
@@ -200,6 +228,13 @@
if(LAZYLEN(can_go))
if(step_towards(src, pick(can_go)))
return
+ for(var/mob in loc)
+ if(istype(mob, /mob/living/bot) && mob != src) // Same as above, but we also don't want to have bots ontop of bots. Cleanbots shouldn't stack >:(
+ var/turf/my_turf = get_turf(src)
+ var/list/can_go = my_turf.CardinalTurfsWithAccess(botcard)
+ if(LAZYLEN(can_go))
+ if(step_towards(src, pick(can_go)))
+ return
handleIdle()
/mob/living/bot/proc/handleRegular()
@@ -339,6 +374,7 @@
resetTarget()
patrol_path = list()
ignore_list = list()
+ update_canmove()
return 1
/mob/living/bot/proc/turn_off()
@@ -346,11 +382,17 @@
busy = 0 // If ever stuck... reboot!
set_light(0)
update_icons()
+ update_canmove()
/mob/living/bot/proc/explode()
+ if(paicard)
+ ejectpai()
+ release_vore_contents()
qdel(src)
/mob/living/bot/is_sentient()
+ if(paicard)
+ return TRUE
return FALSE
/******************************************************************/
@@ -440,3 +482,81 @@
/mob/living/bot/isSynthetic() //Robots are synthetic, no?
return 1
+
+/mob/living/bot/update_canmove()
+ ..()
+ canmove = on
+ return canmove
+
+/mob/living/bot/proc/insertpai(mob/user, obj/item/device/paicard/card)
+ //var/obj/item/paicard/card = I
+ var/mob/living/silicon/pai/AI = card.pai
+ if(paicard)
+ to_chat(user, span_notice("This bot is already under PAI Control!"))
+ return
+ if(!istype(card)) // TODO: Add sleevecard support.
+ return
+ if(client)
+ to_chat(user, span_notice("Higher levels of processing are already present!"))
+ return
+ if(!card.pai)
+ to_chat(user, span_notice("This card does not currently have a personality!"))
+ return
+ paicard = card
+ user.unEquip(card)
+ card.forceMove(src)
+ src.ckey = AI.ckey
+ name = AI.name
+ ooc_notes = AI.ooc_notes
+ to_chat(src, span_notice("You feel a tingle in your circuits as your systems interface with \the [initial(src.name)]."))
+ if(AI.idcard.access)
+ botcard.access |= AI.idcard.access
+
+/mob/living/bot/proc/ejectpai(mob/user)
+ if(paicard)
+ var/mob/living/silicon/pai/AI = paicard.pai
+ AI.ckey = src.ckey
+ AI.ooc_notes = ooc_notes
+ paicard.forceMove(src.loc)
+ paicard = null
+ name = initial(name)
+ botcard.access = botcard_access.Copy()
+ to_chat(AI, span_notice("You feel a tad claustrophobic as your mind closes back into your card, ejecting from \the [initial(src.name)]."))
+
+ if(user)
+ to_chat(user, span_notice("You eject the card from \the [initial(src.name)]."))
+
+/mob/living/bot/verb/bot_nom(var/mob/living/T in oview(1))
+ set name = "Bot Nom"
+ set category = "Bot Commands"
+ set desc = "Allows you to eat someone. Yum."
+
+ if (stat != CONSCIOUS)
+ return
+ return feed_grabbed_to_self(src,T)
+
+/mob/living/bot/verb/ejectself()
+ set name = "Eject pAI"
+ set category = "Bot Commands"
+ set desc = "Eject your card, return to smole."
+
+ return ejectpai()
+
+/mob/living/bot/Login()
+ no_vore = FALSE // ROBOT VORE
+ init_vore() // ROBOT VORE
+ verbs |= /mob/living/proc/insidePanel
+
+ return ..()
+
+/mob/living/bot/Logout()
+ no_vore = TRUE // ROBOT VORE
+ release_vore_contents()
+ init_vore() // ROBOT VORE
+ verbs -= /mob/living/proc/insidePanel
+ no_vore = TRUE
+ devourable = FALSE
+ feeding = FALSE
+ can_be_drop_pred = FALSE
+
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm
index f9bd854dc78..272ff80c842 100644
--- a/code/modules/mob/living/bot/cleanbot.dm
+++ b/code/modules/mob/living/bot/cleanbot.dm
@@ -10,6 +10,7 @@
wait_if_pulled = 1
min_target_dist = 0
+ var/cTimeMult = 1 // A multiplier for how long it should take to clean. Anything bigger than one will increase time, less than one will make it faster.
var/vocal = 1
var/cleaning = 0
var/wet_floors = 0
@@ -99,31 +100,53 @@
if(get_turf(target) == src.loc)
UnarmedAttack(target)
-/mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/D, var/proximity)
+//mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/D, var/proximity)
+/mob/living/bot/cleanbot/UnarmedAttack(atom/D, var/proximity)
if(!..())
return
- if(!istype(D))
- return
+ //if(!istype(D))
+ // return
if(D.loc != loc)
return
busy = 1
- if(prob(20))
- custom_emote(2, "begins to clean up \the [D]")
update_icons()
- var/cleantime = istype(D, /obj/effect/decal/cleanable/dirt) ? 10 : 50
- if(do_after(src, cleantime))
- if(istype(loc, /turf/simulated))
- var/turf/simulated/f = loc
- f.dirt = 0
- if(!D)
- return
- qdel(D)
- if(D == target)
- cleanbot_reserved_turfs -= target
- target = null
+ var/cleantime = 0
+ if(istype(D, /obj/effect/decal/cleanable))
+ cleantime = istype(D, /obj/effect/decal/cleanable/dirt) ? 10 : 50
+ if(prob(20))
+ custom_emote(2, "begins to clean up \the [D]")
+ if(do_after(src, cleantime * cTimeMult))
+ if(istype(loc, /turf/simulated))
+ var/turf/simulated/f = loc
+ f.dirt = 0
+ if(!D)
+ return
+ qdel(D)
+ if(D == target)
+ cleanbot_reserved_turfs -= target
+ target = null
+ else if(D == src)
+ for(var/obj/effect/O in loc)
+ if(istype(O, /obj/effect/decal/cleanable/dirt))
+ cleantime += 10
+ if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay))
+ cleantime += 50
+ if(cleantime != 0)
+ if(prob(20))
+ custom_emote(2, "begins to clean up \the [loc]")
+ if(do_after(src, cleantime * cTimeMult))
+ clean_blood()
+ if(istype(loc, /turf/simulated))
+ var/turf/simulated/T = loc
+ T.dirt = 0
+ for(var/obj/effect/O in loc)
+ if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay))
+ qdel(O)
+ else
+ handleIdle()
busy = 0
update_icons()
@@ -140,8 +163,8 @@
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
- qdel(src)
- return
+ //qdel(src)
+ return ..()
/mob/living/bot/cleanbot/update_icons()
if(busy)
@@ -240,7 +263,7 @@
qdel(src)
else if(istype(W, /obj/item/weapon/pen))
- var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN)
+ var/t = sanitizeSafe(tgui_input_text(user, "Enter new robot name", name, created_name, MAX_NAME_LEN), MAX_NAME_LEN)
if(!t)
return
if(!in_range(src, usr) && src.loc != usr)
diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm
index 17d2da7878e..f699191a665 100644
--- a/code/modules/mob/living/bot/ed209bot.dm
+++ b/code/modules/mob/living/bot/ed209bot.dm
@@ -49,7 +49,7 @@
s.start()
new /obj/effect/decal/cleanable/blood/oil(Tsec)
- qdel(src)
+ return ..()
/mob/living/bot/secbot/ed209/handleRangedTarget()
RangedAttack(target)
@@ -87,7 +87,7 @@
..()
if(istype(W, /obj/item/weapon/pen))
- var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN)
+ var/t = sanitizeSafe(tgui_input_text(user, "Enter new robot name", name, created_name, MAX_NAME_LEN), MAX_NAME_LEN)
if(!t)
return
if(!in_range(src, usr) && src.loc != usr)
diff --git a/code/modules/mob/living/bot/edCLNbot.dm b/code/modules/mob/living/bot/edCLNbot.dm
index bbb1e9861d8..ffdcdb1f44d 100644
--- a/code/modules/mob/living/bot/edCLNbot.dm
+++ b/code/modules/mob/living/bot/edCLNbot.dm
@@ -11,6 +11,7 @@
patrol_speed = 3
target_speed = 6
+ cTimeMult = 0.3 // Big bois should be big fast :3
vocal = 1
cleaning = 0
@@ -68,8 +69,8 @@
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
- qdel(src)
- return
+ //qdel(src)
+ return ..()
/mob/living/bot/cleanbot/edCLN/tgui_data(mob/user)
var/list/data = ..()
@@ -120,7 +121,7 @@
..()
if(istype(W, /obj/item/weapon/pen))
- var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN)
+ var/t = sanitizeSafe(tgui_input_text(user, "Enter new robot name", name, created_name, MAX_NAME_LEN), MAX_NAME_LEN)
if(!t)
return
if(!in_range(src, usr) && src.loc != usr)
diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm
index b858ecb3284..4cdd7fea872 100644
--- a/code/modules/mob/living/bot/farmbot.dm
+++ b/code/modules/mob/living/bot/farmbot.dm
@@ -286,8 +286,8 @@
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
- qdel(src)
- return
+ //qdel(src)
+ return ..()
/mob/living/bot/farmbot/confirmTarget(var/atom/targ)
@@ -409,7 +409,7 @@
qdel(src)
else if(istype(W, /obj/item/weapon/pen))
- var/t = input(user, "Enter new robot name", name, created_name) as text
+ var/t = tgui_input_text(user, "Enter new robot name", name, created_name, MAX_NAME_LEN)
t = sanitize(t, MAX_NAME_LEN)
if(!t)
return
diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm
index 9e869e0d81a..22584ae359c 100644
--- a/code/modules/mob/living/bot/floorbot.dm
+++ b/code/modules/mob/living/bot/floorbot.dm
@@ -42,7 +42,7 @@
data["on"] = on
data["open"] = open
data["locked"] = locked
-
+
data["vocal"] = vocal
data["amount"] = amount
@@ -75,7 +75,7 @@
/mob/living/bot/floorbot/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
if(..())
return TRUE
-
+
add_fingerprint(src)
switch(action)
@@ -85,7 +85,7 @@
else
turn_on()
. = TRUE
-
+
if(locked && !issilicon(usr))
return
@@ -302,7 +302,8 @@
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
- qdel(src)
+ //qdel(src)
+ return ..()
/mob/living/bot/floorbot/proc/addTiles(var/am)
amount += am
@@ -381,7 +382,7 @@
user.drop_from_inventory(src)
qdel(src)
else if (istype(W, /obj/item/weapon/pen))
- var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN)
+ var/t = sanitizeSafe(tgui_input_text(user, "Enter new robot name", name, created_name, MAX_NAME_LEN), MAX_NAME_LEN)
if(!t)
return
if(!in_range(src, user) && loc != user)
@@ -411,7 +412,7 @@
user.drop_from_inventory(src)
qdel(src)
else if(istype(W, /obj/item/weapon/pen))
- var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN)
+ var/t = sanitizeSafe(tgui_input_text(user, "Enter new robot name", name, created_name, MAX_NAME_LEN), MAX_NAME_LEN)
if(!t)
return
if(!in_range(src, user) && loc != user)
diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm
index 39b0b882bb1..2866420be4c 100644
--- a/code/modules/mob/living/bot/medbot.dm
+++ b/code/modules/mob/living/bot/medbot.dm
@@ -268,10 +268,10 @@
/mob/living/bot/medbot/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
if(..())
return TRUE
-
+
usr.set_machine(src)
add_fingerprint(usr)
-
+
. = TRUE
switch(action)
if("power")
@@ -348,8 +348,8 @@
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
- qdel(src)
- return
+ //qdel(src)
+ return ..()
/mob/living/bot/medbot/handleRegular()
. = ..()
@@ -535,7 +535,7 @@
/obj/item/weapon/firstaid_arm_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
if(istype(W, /obj/item/weapon/pen))
- var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN)
+ var/t = sanitizeSafe(tgui_input_text(user, "Enter new robot name", name, created_name, MAX_NAME_LEN), MAX_NAME_LEN)
if(!t)
return
if(!in_range(src, usr) && loc != usr)
diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm
index 66134335725..a9854f01481 100644
--- a/code/modules/mob/living/bot/secbot.dm
+++ b/code/modules/mob/living/bot/secbot.dm
@@ -128,7 +128,7 @@
/mob/living/bot/secbot/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
if(..())
return
-
+
add_fingerprint(usr)
switch(action)
@@ -379,7 +379,8 @@
s.start()
new /obj/effect/decal/cleanable/blood/oil(Tsec)
- qdel(src)
+ //qdel(src)
+ return ..()
/mob/living/bot/secbot/proc/target_name(mob/living/T)
if(ishuman(T))
@@ -471,7 +472,7 @@
qdel(src)
else if(istype(W, /obj/item/weapon/pen))
- var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN)
+ var/t = sanitizeSafe(tgui_input_text(user, "Enter new robot name", name, created_name, MAX_NAME_LEN), MAX_NAME_LEN)
if(!t)
return
if(!in_range(src, user) && loc != user)
diff --git a/code/modules/mob/living/carbon/alien/progression.dm b/code/modules/mob/living/carbon/alien/progression.dm
index 1c4c37b083c..0dd4ba7e136 100644
--- a/code/modules/mob/living/carbon/alien/progression.dm
+++ b/code/modules/mob/living/carbon/alien/progression.dm
@@ -36,7 +36,7 @@
if(mind)
mind.transfer_to(adult)
if (can_namepick_as_adult)
- var/newname = sanitize(input(adult, "You have become an adult. Choose a name for yourself.", "Adult Name") as null|text, MAX_NAME_LEN)
+ var/newname = sanitize(tgui_input_text(adult, "You have become an adult. Choose a name for yourself.", "Adult Name", null, MAX_NAME_LEN), MAX_NAME_LEN)
if(!newname)
adult.fully_replace_character_name(name, "[src.adult_name] ([instance_num])")
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index cf5a1411037..721a47a871f 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -236,7 +236,7 @@
status += "MISSING"
if(org.status & ORGAN_MUTATED)
status += "weirdly shapen"
- if(org.dislocated == 2)
+ if(org.dislocated == 1) //VOREStation Edit Bugfix
status += "dislocated"
if(org.status & ORGAN_BROKEN)
status += "hurts when touched"
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 1881e2856a4..d4e85113cda 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -1,12 +1,14 @@
var/list/_human_default_emotes = list(
/decl/emote/visible/blink,
/decl/emote/audible/synth,
- /decl/emote/audible/synth/ping,
+ /decl/emote/audible/synth/beep,
/decl/emote/audible/synth/buzz,
/decl/emote/audible/synth/confirm,
/decl/emote/audible/synth/deny,
/decl/emote/audible/synth/scary,
/decl/emote/audible/synth/dwoop,
+ /decl/emote/audible/synth/boop,
+ /decl/emote/audible/synth/robochirp,
/decl/emote/visible/nod,
/decl/emote/visible/shake,
/decl/emote/visible/shiver,
@@ -94,6 +96,15 @@ var/list/_human_default_emotes = list(
/decl/emote/visible/floorspin,
/decl/emote/visible/flip,
//VOREStation Add
+ /decl/emote/audible/bug_hiss,
+ /decl/emote/audible/bug_buzz,
+ /decl/emote/audible/bug_chitter,
+ /decl/emote/audible/hiss,
+ /decl/emote/audible/chirp,
+ /decl/emote/audible/warble,
+ /decl/emote/audible/vox_shriek,
+ /decl/emote/audible/purr,
+ /decl/emote/audible/purrlong,
/decl/emote/audible/awoo,
/decl/emote/audible/awoo2,
/decl/emote/audible/belch,
@@ -141,7 +152,13 @@ var/list/_human_default_emotes = list(
/decl/emote/audible/coyawoo2,
/decl/emote/audible/coyawoo3,
/decl/emote/audible/coyawoo4,
- /decl/emote/audible/coyawoo5
+ /decl/emote/audible/coyawoo5,
+ /decl/emote/audible/fennecscream,
+ /decl/emote/audible/zoom,
+ /decl/emote/audible/mothscream,
+ /decl/emote/audible/mothchitter,
+ /decl/emote/audible/mothlaugh
+
//VOREStation Add End
)
@@ -271,7 +288,19 @@ var/list/_simple_mob_default_emotes = list(
/decl/emote/visible/blep,
/decl/emote/audible/prbt,
/decl/emote/audible/gyoh,
- /decl/emote/audible/rumble
+ /decl/emote/audible/rumble,
+ /decl/emote/audible/fennecscream,
+ /decl/emote/audible/zoom,
+ /decl/emote/audible/bug_hiss,
+ /decl/emote/audible/bug_buzz,
+ /decl/emote/audible/bug_chitter,
+ /decl/emote/audible/hiss,
+ /decl/emote/audible/chirp,
+ /decl/emote/audible/warble,
+ /decl/emote/audible/vox_shriek,
+ /decl/emote/audible/purr,
+ /decl/emote/audible/purrlong
+
)
//VOREStation Add End
@@ -290,7 +319,7 @@ var/list/_simple_mob_default_emotes = list(
var/datum/gender/T = gender_datums[get_visible_gender()]
- pose = sanitize(input(usr, "This is [src]. [T.he]...", "Pose", null) as text)
+ pose = sanitize(tgui_input_text(usr, "This is [src]. [T.he]...", "Pose", null))
/mob/living/carbon/human/verb/set_flavor()
set name = "Set Flavour Text"
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index fa75fb5e912..1d3a36bd942 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -76,22 +76,12 @@
BP_L_LEG = skip_body & EXAMINE_SKIPLEGS,
BP_R_LEG = skip_body & EXAMINE_SKIPLEGS)
- var/datum/gender/T = gender_datums[get_visible_gender()]
+ var/gender_hidden = (skip_gear & EXAMINE_SKIPJUMPSUIT) && (skip_body & EXAMINE_SKIPFACE)
+ var/gender_key = get_visible_gender(user, gender_hidden)
- if((skip_gear & EXAMINE_SKIPJUMPSUIT) && (skip_body & EXAMINE_SKIPFACE)) //big suits/masks/helmets make it hard to tell their gender
- T = gender_datums[PLURAL]
-
- else if(species && species.ambiguous_genders)
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(H.species && !istype(species, H.species))
- T = gender_datums[PLURAL]// Species with ambiguous_genders will not show their true gender upon examine if the examiner is not also the same species.
- if(!(issilicon(user) || isobserver(user))) // Ghosts and borgs are all knowing
- T = gender_datums[PLURAL]
-
- if(!T)
- // Just in case someone VVs the gender to something strange. It'll runtime anyway when it hits usages, better to CRASH() now with a helpful message.
- CRASH("Gender datum was null; key was '[((skip_gear & EXAMINE_SKIPJUMPSUIT) && (skip_body & EXAMINE_SKIPFACE)) ? PLURAL : gender]'")
+ var/datum/gender/T = gender_datums[gender_key]
+ if (!T)
+ CRASH({"Null gender datum on examine: mob="[src]",hidden="[gender_hidden]",key="[gender_key]",bio="[gender]",id="[identifying_gender]""})
var/name_ender = ""
if(!((skip_gear & EXAMINE_SKIPJUMPSUIT) && (skip_body & EXAMINE_SKIPFACE)))
@@ -111,7 +101,7 @@
else if(species.name != "Human")
name_ender = ", \a [species.get_examine_name()]![species.get_additional_examine_text(src)]"
- var/list/msg = list("*---------*","This is [bicon(src)] [src.name][name_ender]")
+ var/list/msg = list("*---------*","This is \icon[src.examine_icon()][bicon(src)] [src.name][name_ender]")
//uniform
if(w_uniform && !(skip_gear & EXAMINE_SKIPJUMPSUIT) && w_uniform.show_examine)
@@ -144,18 +134,18 @@
LAZYADD(pocket_msg, r_store_message)
if(LAZYLEN(pocket_msg))
tie_msg += " Near the waist it has [english_list(pocket_msg)]."
-
+
if(w_uniform.blood_DNA)
- msg += "[T.He] [T.is] wearing [bicon(w_uniform)] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [w_uniform.name]![tie_msg]"
+ msg += "[T.He] [T.is] wearing \icon[w_uniform][bicon(w_uniform)] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [w_uniform.name]![tie_msg]"
else
- msg += "[T.He] [T.is] wearing [bicon(w_uniform)] \a [w_uniform].[tie_msg]"
+ msg += "[T.He] [T.is] wearing \icon[w_uniform][bicon(w_uniform)] \a [w_uniform].[tie_msg]"
//head
if(head && !(skip_gear & EXAMINE_SKIPHELMET) && head.show_examine)
if(head.blood_DNA)
- msg += "[T.He] [T.is] wearing [bicon(head)] [head.gender==PLURAL?"some":"a"] [(head.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [head.name] on [T.his] head!"
+ msg += "[T.He] [T.is] wearing \icon[head][bicon(head)] [head.gender==PLURAL?"some":"a"] [(head.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [head.name] on [T.his] head!"
else
- msg += "[T.He] [T.is] wearing [bicon(head)] \a [head] on [T.his] head."
+ msg += "[T.He] [T.is] wearing \icon[head][bicon(head)] \a [head] on [T.his] head."
//suit/armour
if(wear_suit)
@@ -166,71 +156,71 @@
tie_msg += " Attached to it is [english_list(U.accessories)]."
if(wear_suit.blood_DNA)
- msg += "[T.He] [T.is] wearing [bicon(wear_suit)] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [wear_suit.name][tie_msg]!"
+ msg += "[T.He] [T.is] wearing \icon[wear_suit][bicon(wear_suit)] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [wear_suit.name][tie_msg]!"
else
- msg += "[T.He] [T.is] wearing [bicon(wear_suit)] \a [wear_suit].[tie_msg]"
+ msg += "[T.He] [T.is] wearing \icon[wear_suit][bicon(wear_suit)] \a [wear_suit].[tie_msg]"
//suit/armour storage
if(s_store && !(skip_gear & EXAMINE_SKIPSUITSTORAGE) && s_store.show_examine)
if(s_store.blood_DNA)
- msg += "[T.He] [T.is] carrying [bicon(s_store)] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [s_store.name] on [T.his] [wear_suit.name]!"
+ msg += "[T.He] [T.is] carrying \icon[s_store][bicon(s_store)] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [s_store.name] on [T.his] [wear_suit.name]!"
else
- msg += "[T.He] [T.is] carrying [bicon(s_store)] \a [s_store] on [T.his] [wear_suit.name]."
+ msg += "[T.He] [T.is] carrying \icon[s_store][bicon(s_store)] \a [s_store] on [T.his] [wear_suit.name]."
//back
if(back && !(skip_gear & EXAMINE_SKIPBACKPACK) && back.show_examine)
if(back.blood_DNA)
- msg += "[T.He] [T.has] [bicon(back)] [back.gender==PLURAL?"some":"a"] [(back.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [back] on [T.his] back."
+ msg += "[T.He] [T.has] \icon[back][bicon(back)] [back.gender==PLURAL?"some":"a"] [(back.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [back] on [T.his] back."
else
- msg += "[T.He] [T.has] [bicon(back)] \a [back] on [T.his] back."
+ msg += "[T.He] [T.has] \icon[back][bicon(back)] \a [back] on [T.his] back."
//left hand
if(l_hand && l_hand.show_examine)
if(l_hand.blood_DNA)
- msg += "[T.He] [T.is] holding [bicon(l_hand)] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [l_hand.name] in [T.his] left hand!"
+ msg += "[T.He] [T.is] holding \icon[l_hand][bicon(l_hand)] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [l_hand.name] in [T.his] left hand!"
else
- msg += "[T.He] [T.is] holding [bicon(l_hand)] \a [l_hand] in [T.his] left hand."
+ msg += "[T.He] [T.is] holding \icon[l_hand][bicon(l_hand)] \a [l_hand] in [T.his] left hand."
//right hand
if(r_hand && r_hand.show_examine)
if(r_hand.blood_DNA)
- msg += "[T.He] [T.is] holding [bicon(r_hand)] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [r_hand.name] in [T.his] right hand!"
+ msg += "[T.He] [T.is] holding \icon[r_hand][bicon(r_hand)] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [r_hand.name] in [T.his] right hand!"
else
- msg += "[T.He] [T.is] holding [bicon(r_hand)] \a [r_hand] in [T.his] right hand."
+ msg += "[T.He] [T.is] holding \icon[r_hand][bicon(r_hand)] \a [r_hand] in [T.his] right hand."
//gloves
if(gloves && !(skip_gear & EXAMINE_SKIPGLOVES) && gloves.show_examine)
if(gloves.blood_DNA)
- msg += "[T.He] [T.has] [bicon(gloves)] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [gloves.name] on [T.his] hands!"
+ msg += "[T.He] [T.has] \icon[gloves][bicon(gloves)] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [gloves.name] on [T.his] hands!"
else
- msg += "[T.He] [T.has] [bicon(gloves)] \a [gloves] on [T.his] hands."
+ msg += "[T.He] [T.has] \icon[gloves][bicon(gloves)] \a [gloves] on [T.his] hands."
else if(blood_DNA && !(skip_body & EXAMINE_SKIPHANDS))
msg += "[T.He] [T.has] [(hand_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained hands!"
//handcuffed?
if(handcuffed && handcuffed.show_examine)
if(istype(handcuffed, /obj/item/weapon/handcuffs/cable))
- msg += "[T.He] [T.is] [bicon(handcuffed)] restrained with cable!"
+ msg += "[T.He] [T.is] \icon[handcuffed][bicon(handcuffed)] restrained with cable!"
else
- msg += "[T.He] [T.is] [bicon(handcuffed)] handcuffed!"
+ msg += "[T.He] [T.is] \icon[handcuffed][bicon(handcuffed)] handcuffed!"
//buckled
if(buckled)
- msg += "[T.He] [T.is] [bicon(buckled)] buckled to [buckled]!"
+ msg += "[T.He] [T.is] \icon[buckled][bicon(buckled)] buckled to [buckled]!"
//belt
if(belt && !(skip_gear & EXAMINE_SKIPBELT) && belt.show_examine)
if(belt.blood_DNA)
- msg += "[T.He] [T.has] [bicon(belt)] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [belt.name] about [T.his] waist!"
+ msg += "[T.He] [T.has] \icon[belt][bicon(belt)] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [belt.name] about [T.his] waist!"
else
- msg += "[T.He] [T.has] [bicon(belt)] \a [belt] about [T.his] waist."
+ msg += "[T.He] [T.has] \icon[belt][bicon(belt)] \a [belt] about [T.his] waist."
//shoes
if(shoes && !(skip_gear & EXAMINE_SKIPSHOES) && shoes.show_examine)
if(shoes.blood_DNA)
- msg += "[T.He] [T.is] wearing [bicon(shoes)] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [shoes.name] on [T.his] feet!"
+ msg += "[T.He] [T.is] wearing \icon[shoes][bicon(shoes)] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [shoes.name] on [T.his] feet!"
else
- msg += "[T.He] [T.is] wearing [bicon(shoes)] \a [shoes] on [T.his] feet."
+ msg += "[T.He] [T.is] wearing \icon[shoes][bicon(shoes)] \a [shoes] on [T.his] feet."
else if(feet_blood_DNA && !(skip_body & EXAMINE_SKIPHANDS))
msg += "[T.He] [T.has] [(feet_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained feet!"
@@ -241,24 +231,24 @@
descriptor = "in [T.his] mouth"
if(wear_mask.blood_DNA)
- msg += "[T.He] [T.has] [bicon(wear_mask)] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [wear_mask.name] [descriptor]!"
+ msg += "[T.He] [T.has] \icon[wear_mask][bicon(wear_mask)] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [wear_mask.name] [descriptor]!"
else
- msg += "[T.He] [T.has] [bicon(wear_mask)] \a [wear_mask] [descriptor]."
+ msg += "[T.He] [T.has] \icon[wear_mask][bicon(wear_mask)] \a [wear_mask] [descriptor]."
//eyes
if(glasses && !(skip_gear & EXAMINE_SKIPEYEWEAR) && glasses.show_examine)
if(glasses.blood_DNA)
- msg += "[T.He] [T.has] [bicon(glasses)] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [glasses] covering [T.his] eyes!"
+ msg += "[T.He] [T.has] \icon[glasses][bicon(glasses)] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [glasses] covering [T.his] eyes!"
else
- msg += "[T.He] [T.has] [bicon(glasses)] \a [glasses] covering [T.his] eyes."
+ msg += "[T.He] [T.has] \icon[glasses][bicon(glasses)] \a [glasses] covering [T.his] eyes."
//left ear
if(l_ear && !(skip_gear & EXAMINE_SKIPEARS) && l_ear.show_examine)
- msg += "[T.He] [T.has] [bicon(l_ear)] \a [l_ear] on [T.his] left ear."
+ msg += "[T.He] [T.has] \icon[l_ear][bicon(l_ear)] \a [l_ear] on [T.his] left ear."
//right ear
if(r_ear && !(skip_gear & EXAMINE_SKIPEARS) && r_ear.show_examine)
- msg += "[T.He] [T.has] [bicon(r_ear)] \a [r_ear] on [T.his] right ear."
+ msg += "[T.He] [T.has] \icon[r_ear][bicon(r_ear)] \a [r_ear] on [T.his] right ear."
//ID
if(wear_id && wear_id.show_examine)
@@ -270,9 +260,9 @@
var/obj/item/weapon/card/id/idcard = wear_id
id = idcard.registered_name
if(id && (id != real_name) && (get_dist(src, usr) <= 1) && prob(10))
- msg += "[T.He] [T.is] wearing [bicon(wear_id)] \a [wear_id] yet something doesn't seem right..."
+ msg += "[T.He] [T.is] wearing \icon[wear_id][bicon(wear_id)] \a [wear_id] yet something doesn't seem right..."
else*/
- msg += "[T.He] [T.is] wearing [bicon(wear_id)] \a [wear_id]."
+ msg += "[T.He] [T.is] wearing \icon[wear_id][bicon(wear_id)] \a [wear_id]."
//Jitters
if(is_jittery)
@@ -380,7 +370,7 @@
wound_flavor_text["[temp.name]"] = "[T.He] [T.has] [temp.get_wounds_desc()] on [T.his] [temp.name]."
else
wound_flavor_text["[temp.name]"] = ""
- if(temp.dislocated == 2)
+ if(temp.dislocated == 1) //VOREStation Edit Bugfix
wound_flavor_text["[temp.name]"] += "[T.His] [temp.joint] is dislocated!"
if(temp.brute_dam > temp.min_broken_damage || (temp.status & (ORGAN_BROKEN | ORGAN_MUTATED)))
wound_flavor_text["[temp.name]"] += "[T.His] [temp.name] is dented and swollen!"
@@ -484,9 +474,6 @@
return istype(H.glasses, /obj/item/clothing/glasses/hud/health)
else if(istype(M, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = M
- switch(hudtype)
- if("security")
- return R.hudmode == "Security"
- if("medical")
- return R.hudmode == "Medical"
+ return R.sensor_type //VOREStation Add - Borgo sensors are now binary so just have them on or off
+
return 0
diff --git a/code/modules/mob/living/carbon/human/examine_vr.dm b/code/modules/mob/living/carbon/human/examine_vr.dm
index d2dcd9bfbde..1deab398f02 100644
--- a/code/modules/mob/living/carbon/human/examine_vr.dm
+++ b/code/modules/mob/living/carbon/human/examine_vr.dm
@@ -1,122 +1,61 @@
/mob/living/carbon/human/proc/examine_weight()
- if(!show_pudge()) //Some clothing or equipment can hide this.
+ if(!show_pudge() || !weight_message_visible) //Some clothing or equipment can hide this.
return ""
var/message = ""
var/weight_examine = round(weight)
- var/t_He = "It" //capitalised for use at the start of each line.
- var/t_he = "it"
- var/t_his = "its"
- var/t_His = "Its"
- var/t_is = "is"
- var/t_has = "has"
- var/t_heavy = "heavy"
- switch(identifying_gender) //Gender is their "real" gender. Identifying_gender is their "chosen" gender.
- if(MALE)
- t_He = "He"
- t_he = "he"
- t_His = "His"
- t_his = "his"
- t_heavy = "bulky"
- if(FEMALE)
- t_He = "She"
- t_he = "she"
- t_His = "Her"
- t_his = "her"
- t_heavy = "curvy"
- if(PLURAL)
- t_He = "They"
- t_he = "they"
- t_His = "Their"
- t_his = "their"
- t_is = "are"
- t_has = "have"
- if(NEUTER)
- t_He = "It"
- t_he = "it"
- t_His = "Its"
- t_his = "its"
- if(HERM)
- t_He = "Shi"
- t_he = "shi"
- t_His = "Hir"
- t_his = "hir"
- t_heavy = "curvy"
-
switch(weight_examine)
if(0 to 74)
- message = "[t_He] [t_is] terribly lithe and frail!"
+ message = weight_messages[1]
if(75 to 99)
- message = "[t_He] [t_has] a very slender frame."
+ message = weight_messages[2]
if(100 to 124)
- message = "[t_He] [t_has] a lightweight, athletic build."
+ message = weight_messages[3]
if(125 to 174)
- message = "[t_He] [t_has] a healthy, average body."
+ message = weight_messages[4]
if(175 to 224)
- message = "[t_He] [t_has] a thick, [t_heavy] physique."
+ message = weight_messages[5]
if(225 to 274)
- message = "[t_He] [t_has] a plush, chubby figure."
+ message = weight_messages[6]
if(275 to 325)
- message = "[t_He] [t_has] an especially plump body with a round potbelly and large hips."
+ message = weight_messages[7]
if(325 to 374)
- message = "[t_He] [t_has] a very fat frame with a bulging potbelly, squishy rolls of pudge, very wide hips, and plump set of jiggling thighs."
+ message = weight_messages[8]
if(375 to 474)
- message = "[t_He] [t_is] incredibly obese. [t_His] massive potbelly sags over [t_his] waistline while [t_his] fat ass would probably require two chairs to sit down comfortably!"
+ message = weight_messages[9]
else
- message += "[t_He] [t_is] so morbidly obese, you wonder how [t_he] can even stand, let alone waddle around the station. [t_He] can't get any fatter without being immobilized."
+ message = weight_messages[10]
+ if(message)
+ message = "[message]"
return message //Credit to Aronai for helping me actually get this working!
/mob/living/carbon/human/proc/examine_nutrition()
- if(!show_pudge()) //Some clothing or equipment can hide this.
+ if(!show_pudge() || !nutrition_message_visible) //Some clothing or equipment can hide this.
return ""
var/message = ""
var/nutrition_examine = round(nutrition)
- var/t_He = "It" //capitalised for use at the start of each line.
- var/t_His = "Its"
- var/t_his = "its"
- var/t_is = "is"
- var/t_has = "has"
- switch(identifying_gender)
- if(MALE)
- t_He = "He"
- t_his = "his"
- t_His = "His"
- if(FEMALE)
- t_He = "She"
- t_his = "her"
- t_His = "Her"
- if(PLURAL)
- t_He = "They"
- t_his = "their"
- t_His = "Their"
- t_is = "are"
- t_has = "have"
- if(NEUTER)
- t_He = "It"
- t_his = "its"
- t_His = "Its"
- if(HERM)
- t_He = "Shi"
- t_his = "hir"
- t_His = "Hir"
switch(nutrition_examine)
if(0 to 49)
- message = "[t_He] [t_is] starving! You can hear [t_his] stomach snarling from across the room!"
+ message = nutrition_messages[1]
if(50 to 99)
- message = "[t_He] [t_is] extremely hungry. A deep growl occasionally rumbles from [t_his] empty stomach."
+ message = nutrition_messages[2]
if(100 to 499)
- return message //Well that's pretty normal, really.
+ message = nutrition_messages[3]
if(500 to 999) // Fat.
- message = "[t_He] [t_has] a stuffed belly, bloated fat and round from eating too much."
+ message = nutrition_messages[4]
if(1000 to 1399)
- message = "[t_He] [t_has] a rotund, thick gut. It bulges from their body obscenely, close to sagging under its own weight."
+ message = nutrition_messages[5]
if(1400 to 1934) // One person fully digested.
- message = "[t_He] [t_is] sporting a large, round, sagging stomach. It contains at least their body weight worth of glorping slush."
+ message = nutrition_messages[6]
if(1935 to 3004) // Two people.
- message = "[t_He] [t_is] engorged with a huge stomach that sags and wobbles as they move. [t_He] must have consumed at least twice their body weight. It looks incredibly soft."
+ message = nutrition_messages[7]
if(3005 to 4074) // Three people.
- message = "[t_His] stomach is firmly packed with digesting slop. [t_He] must have eaten at least a few times worth their body weight! It looks hard for them to stand, and [t_his] gut jiggles when they move."
- if(4075 to INFINITY) // Four or more people.
- message = "[t_He] [t_is] so absolutely stuffed that you aren't sure how it's possible to move. [t_He] can't seem to swell any bigger. The surface of [t_his] belly looks sorely strained!"
+ message = nutrition_messages[8]
+ if(4075 to 5124) // Four people.
+ message = nutrition_messages[9]
+ if(5125 to INFINITY) // More.
+ message = nutrition_messages[10]
+ if(message)
+ message = "[message]"
return message
//For OmniHUD records access for appropriate models
@@ -144,13 +83,13 @@
/mob/living/carbon/human/proc/examine_pickup_size(mob/living/H)
var/message = ""
- if(istype(H) && (H.get_effective_size() - src.get_effective_size()) >= 0.50)
+ if(istype(H) && (H.get_effective_size(FALSE) - src.get_effective_size(TRUE)) >= 0.50)
message = "They are small enough that you could easily pick them up!"
return message
/mob/living/carbon/human/proc/examine_step_size(mob/living/H)
var/message = ""
- if(istype(H) && (H.get_effective_size() - src.get_effective_size()) >= 0.75)
+ if(istype(H) && (H.get_effective_size(FALSE) - src.get_effective_size(TRUE)) >= 0.75)
message = "They are small enough that you could easily trample them!"
return message
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 67e6d1c8bf2..ca764311ad4 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -438,7 +438,7 @@
for (var/datum/data/record/R in data_core.security)
if (R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"security"))
- var/t1 = sanitize(input(usr, "Add Comment:", "Sec. records", null, null) as message)
+ var/t1 = sanitize(tgui_input_text(usr, "Add Comment:", "Sec. records", null, null, multiline = TRUE, prevent_enter = TRUE))
if ( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"security")) )
return
var/counter = 1
@@ -555,7 +555,7 @@
for (var/datum/data/record/R in data_core.medical)
if (R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"medical"))
- var/t1 = sanitize(input(usr, "Add Comment:", "Med. records", null, null) as message)
+ var/t1 = sanitize(tgui_input_text(usr, "Add Comment:", "Med. records", null, null, multiline = TRUE, prevent_enter = TRUE))
if ( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"medical")) )
return
var/counter = 1
@@ -587,11 +587,11 @@
src << browse(null, "window=flavor_changes")
return
if("general")
- var/msg = sanitize(input(usr,"Update the general description of your character. This will be shown regardless of clothing.","Flavor Text",html_decode(flavor_texts[href_list["flavor_change"]])) as message, extra = 0) //VOREStation Edit: separating out OOC notes
+ var/msg = sanitize(tgui_input_text(usr,"Update the general description of your character. This will be shown regardless of clothing.","Flavor Text",html_decode(flavor_texts[href_list["flavor_change"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0) //VOREStation Edit: separating out OOC notes
flavor_texts[href_list["flavor_change"]] = msg
return
else
- var/msg = sanitize(input(usr,"Update the flavor text for your [href_list["flavor_change"]].","Flavor Text",html_decode(flavor_texts[href_list["flavor_change"]])) as message, extra = 0)
+ var/msg = sanitize(tgui_input_text(usr,"Update the flavor text for your [href_list["flavor_change"]].","Flavor Text",html_decode(flavor_texts[href_list["flavor_change"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0)
flavor_texts[href_list["flavor_change"]] = msg
set_flavor()
return
@@ -807,7 +807,7 @@
if (isnull(target))
return
- var/say = sanitize(input(usr, "What do you wish to say"))
+ var/say = sanitize(tgui_input_text(usr, "What do you wish to say"))
if(mRemotetalk in target.mutations)
target.show_message(" You hear [src.real_name]'s voice: [say]")
else
@@ -854,13 +854,25 @@
remoteview_target = null
reset_view(0)
-/mob/living/carbon/human/get_visible_gender()
- if(wear_suit && wear_suit.flags_inv & HIDEJUMPSUIT && ((head && head.flags_inv & HIDEMASK) || wear_mask))
- return PLURAL //plural is the gender-neutral default
- if(species)
- if(species.ambiguous_genders)
- return PLURAL // regardless of what you're wearing, your gender can't be figured out
- return get_gender()
+/mob/living/carbon/human/get_visible_gender(mob/user, force)
+ switch(force)
+ if(VISIBLE_GENDER_FORCE_PLURAL)
+ return PLURAL
+ if(VISIBLE_GENDER_FORCE_IDENTIFYING)
+ return get_gender()
+ if(VISIBLE_GENDER_FORCE_BIOLOGICAL)
+ return gender
+ else
+ if((wear_mask || (head?.flags_inv & HIDEMASK)) && (wear_suit?.flags_inv & HIDEJUMPSUIT))
+ return PLURAL
+ if(species?.ambiguous_genders && user)
+ if(ishuman(user))
+ var/mob/living/carbon/human/human = user
+ if(!istype(human.species, species))
+ return PLURAL
+ else if(!isobserver(user) && !issilicon(user))
+ return PLURAL
+ return get_gender()
/mob/living/carbon/human/proc/increase_germ_level(n)
if(gloves)
@@ -1205,7 +1217,7 @@
var/max_length = bloody_hands * 30 //tweeter style
- var/message = sanitize(input(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", ""))
+ var/message = sanitize(tgui_input_text(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", ""))
if (message)
var/used_blood_amount = round(length(message) / 30, 1)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index e43a1de6b6f..ff43db09222 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -321,9 +321,9 @@ emp_act
H.bloody_body(src)
H.bloody_hands(src)
- if(!stat)
+ if(!stat && !(I.no_random_knockdown))
switch(hit_zone)
- if("head")//Harder to score a stun but if you do it lasts a bit longer
+ if(BP_HEAD)//Harder to score a stun but if you do it lasts a bit longer
if(prob(effective_force))
apply_effect(20, PARALYZE, blocked, soaked)
visible_message("\The [src] has been knocked unconscious!")
@@ -337,7 +337,7 @@ emp_act
if(glasses && prob(33))
glasses.add_blood(src)
update_inv_glasses(0)
- if("chest")//Easier to score a stun but lasts less time
+ if(BP_TORSO)//Easier to score a stun but lasts less time
if(prob(effective_force + 10))
apply_effect(6, WEAKEN, blocked, soaked)
visible_message("\The [src] has been knocked down!")
@@ -347,7 +347,7 @@ emp_act
return 1
/mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/effective_force, var/dislocate_mult, var/blocked, var/soaked)
- if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1) || blocked >= 100)
+ if(!organ || (organ.dislocated == 1) || (organ.dislocated == -1) || blocked >= 100) //VOREStation Edit Bugfix
return 0
if(W.damtype != BRUTE)
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index f13051be24b..e52f051de8d 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -20,7 +20,11 @@
. += M.slowdown
var/health_deficiency = (getMaxHealth() - health)
- if(health_deficiency >= 40) . += (health_deficiency / 25)
+ if(health_deficiency >= 40) //VOREStation Edit Start
+ if(chem_effects[CE_PAINKILLER]) //On painkillers? Reduce pain! On anti-painkillers? Increase pain!
+ health_deficiency = max(0, health_deficiency - src.chem_effects[CE_PAINKILLER])
+ if(health_deficiency >= 40) //Still in enough pain for it to be significant?
+ . += (health_deficiency / 25) //VOREStation Edit End
if(can_feel_pain())
if(halloss >= 10) . += (halloss / 10) //halloss shouldn't slow you down if you can't even feel it
@@ -42,8 +46,8 @@
var/mob/living/carbon/human/H = M
if(H.size_multiplier > L.size_multiplier)
. += 1
- if(H.weight > L.weight)
- . += 1
+ //if(H.weight > L.weight) weight should not have mechanical impact
+ //. += 1
//VOREstation end
if(istype(buckled, /obj/structure/bed/chair/wheelchair))
@@ -170,7 +174,7 @@
// Wind makes it easier or harder to move, depending on if you're with or against the wind.
// I don't like that so I'm commenting it out :)
- // VOREstation Edit Start
+ // VOREstation Edit Start
/*
if((T.is_outdoors()) && (T.z <= SSplanets.z_to_planet.len))
var/datum/planet/P = SSplanets.z_to_planet[z]
@@ -202,7 +206,13 @@
if(restrained()) return 0
if(..()) //Can move due to other reasons, don't use jetpack fuel
- return 1
+ return TRUE
+
+ if(species.can_space_freemove || (species.can_zero_g_move && !istype(get_turf(src), /turf/space))) //VOREStation Edit.
+ return TRUE //VOREStation Edit.
+
+ if(flying) //VOREStation Edit. If you're flying, you glide around!
+ return TRUE //VOREStation Edit.
//Do we have a working jetpack?
var/obj/item/weapon/tank/jetpack/thrust = get_jetpack()
@@ -210,22 +220,23 @@
if(thrust)
if(((!check_drift) || (check_drift && thrust.stabilization_on)) && (!lying) && (thrust.do_thrust(0.01, src)))
inertia_dir = 0
- return 1
- if(flying) //VOREStation Edit. If you're flying, you glide around!
- return 0 //VOREStation Edit.
+ return TRUE
- return 0
+ return FALSE
/mob/living/carbon/human/Process_Spaceslipping(var/prob_slip = 5)
//If knocked out we might just hit it and stop. This makes it possible to get dead bodies and such.
if(species.flags & NO_SLIP)
- return 0
+ return FALSE
+
+ if(species.can_space_freemove || species.can_zero_g_move)
+ return FALSE
var/obj/item/weapon/tank/jetpack/thrust = get_jetpack()
if(thrust?.can_thrust(0.01))
- return 0
+ return FALSE
if(stat)
prob_slip = 0 // Changing this to zero to make it line up with the comment, and also, make more sense.
@@ -289,3 +300,8 @@
playsound(T, S, volume, FALSE)
return
+
+/mob/living/carbon/human/set_dir(var/new_dir)
+ . = ..()
+ if(. && (species.tail || tail_style))
+ update_tail_showing()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm
index 74dfba1b369..f8d49b046ad 100644
--- a/code/modules/mob/living/carbon/human/human_powers.dm
+++ b/code/modules/mob/living/carbon/human/human_powers.dm
@@ -94,7 +94,7 @@
if(!target) return
- text = input(usr, "What would you like to say?", "Speak to creature", null, null)
+ text = tgui_input_text(usr, "What would you like to say?", "Speak to creature", null, null)
text = sanitize(text)
@@ -134,7 +134,7 @@
set desc = "Whisper silently to someone over a distance."
set category = "Abilities"
- var/msg = sanitize(input(usr, "Message:", "Psychic Whisper") as text|null)
+ var/msg = sanitize(tgui_input_text(usr, "Message:", "Psychic Whisper"))
if(msg)
log_say("(PWHISPER to [key_name(M)]) [msg]", src)
to_chat(M, "You hear a strange, alien voice in your head... [msg]")
diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm
index 43225a6d34a..7350d093e4d 100644
--- a/code/modules/mob/living/carbon/human/human_species.dm
+++ b/code/modules/mob/living/carbon/human/human_species.dm
@@ -30,8 +30,8 @@
icon = null
icon_state = ""
. = ..()
-
- dress_up()
+
+ dress_up()
turntable()
/mob/living/carbon/human/dummy/mannequin/autoequip/proc/dress_up()
@@ -42,7 +42,7 @@
var/obj/item/clothing/C = I
C.species_restricted = null
equip_to_appropriate_slot(I)
-
+
if(istype(back, /obj/item/weapon/rig))
var/obj/item/weapon/rig/rig = back
rig.toggle_seals(src)
@@ -130,6 +130,3 @@
/mob/living/carbon/human/stok/Initialize(var/new_loc)
return ..(new_loc, SPECIES_MONKEY_UNATHI)
-
-/mob/living/carbon/human/event1/Initialize(var/new_loc)
- return ..(new_loc, SPECIES_EVENT1)
diff --git a/code/modules/mob/living/carbon/human/human_vr.dm b/code/modules/mob/living/carbon/human/human_vr.dm
index a60521b5ab7..2c621fa3f8e 100644
--- a/code/modules/mob/living/carbon/human/human_vr.dm
+++ b/code/modules/mob/living/carbon/human/human_vr.dm
@@ -11,4 +11,7 @@
/mob/living/carbon/human/Destroy()
alt_farmanimals -= src
- . = ..()
\ No newline at end of file
+ . = ..()
+
+/mob/living/carbon/human/get_digestion_nutrition_modifier()
+ return species.digestion_nutrition_modifier
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 76cb94c9480..91cdbc6b5d9 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -84,7 +84,7 @@
handle_shock()
handle_pain()
-
+
handle_allergens()
handle_medical_side_effects()
@@ -607,11 +607,11 @@
apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, BP_HEAD, used_weapon = "Excessive Cold")
throw_alert("temp", /obj/screen/alert/cold, COLD_ALERT_SEVERITY_MAX)
else if(breath.temperature <= species.breath_cold_level_2)
- apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, BP_HEAD, used_weapon = "Excessive Cold")
- throw_alert("temp", /obj/screen/alert/cold, COLD_ALERT_SEVERITY_LOW)
- else if(breath.temperature <= species.breath_cold_level_1)
apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, BP_HEAD, used_weapon = "Excessive Cold")
throw_alert("temp", /obj/screen/alert/cold, COLD_ALERT_SEVERITY_MODERATE)
+ else if(breath.temperature <= species.breath_cold_level_1)
+ apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, BP_HEAD, used_weapon = "Excessive Cold")
+ throw_alert("temp", /obj/screen/alert/cold, COLD_ALERT_SEVERITY_LOW)
else if(species.get_environment_discomfort(src, ENVIRONMENT_COMFORT_MARKER_COLD))
throw_alert("temp", /obj/screen/alert/chilly, COLD_ALERT_SEVERITY_LOW)
else
@@ -777,6 +777,8 @@
if(adjusted_pressure >= species.hazard_high_pressure)
var/pressure_damage = min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE)
+ if(stat==DEAD)
+ pressure_damage = pressure_damage/2
take_overall_damage(brute=pressure_damage, used_weapon = "High Pressure")
throw_alert("pressure", /obj/screen/alert/highpressure, 2)
else if(adjusted_pressure >= species.warning_high_pressure)
@@ -788,7 +790,10 @@
else
if( !(COLD_RESISTANCE in mutations))
if(!isSynthetic() || !nif || !nif.flag_check(NIF_O_PRESSURESEAL,NIF_FLAGS_OTHER)) //VOREStation Edit - NIF pressure seals
- take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure")
+ var/pressure_damage = LOW_PRESSURE_DAMAGE
+ if(stat==DEAD)
+ pressure_damage = pressure_damage/2
+ take_overall_damage(brute=pressure_damage, used_weapon = "Low Pressure")
if(getOxyLoss() < 55) // 12 OxyLoss per 4 ticks when wearing internals; unconsciousness in 16 ticks, roughly half a minute
var/pressure_dam = 3 // 16 OxyLoss per 4 ticks when no internals present; unconsciousness in 13 ticks, roughly twenty seconds
// (Extra 1 oxyloss from failed breath)
@@ -1523,7 +1528,7 @@
return
// Puke if toxloss is too high
- if(!stat)
+ if(!stat && !isbelly(loc))
if (getToxLoss() >= 30 && isSynthetic())
if(!confused)
if(prob(5))
@@ -1621,32 +1626,39 @@
return 0
if(shock_stage == 10)
- custom_pain("[pick("It hurts so much", "You really need some painkillers", "Dear god, the pain")]!", 40)
+ if(traumatic_shock >= 80)
+ custom_pain("[pick("It hurts so much", "You really need some painkillers", "Dear god, the pain")]!", 40)
if(shock_stage >= 30)
if(shock_stage == 30 && !isbelly(loc)) //VOREStation Edit
custom_emote(VISIBLE_MESSAGE, "is having trouble keeping their eyes open.")
eye_blurry = max(2, eye_blurry)
- stuttering = max(stuttering, 5)
+ if(traumatic_shock >= 80)
+ stuttering = max(stuttering, 5)
+
if(shock_stage == 40)
- to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!")
+ if(traumatic_shock >= 80)
+ to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!")
if (shock_stage >= 60)
if(shock_stage == 60 && !isbelly(loc)) //VOREStation Edit
custom_emote(VISIBLE_MESSAGE, "'s body becomes limp.")
if (prob(2))
- to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!")
+ if(traumatic_shock >= 80)
+ to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!")
Weaken(20)
if(shock_stage >= 80)
if (prob(5))
- to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!")
+ if(traumatic_shock >= 80)
+ to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!")
Weaken(20)
if(shock_stage >= 120)
if (prob(2))
- to_chat(src, "[pick("You black out", "You feel like you could die any moment now", "You are about to lose consciousness")]!")
+ if(traumatic_shock >= 80)
+ to_chat(src, "[pick("You black out", "You feel like you could die any moment now", "You are about to lose consciousness")]!")
Paralyse(5)
if(shock_stage == 150)
@@ -1919,8 +1931,10 @@
// increase your body temperature beyond 250C, but it's possible something else (atmos) has heated us up beyond it,
// so don't worry about the firestacks at that point. Really, we should be cooling the room down, because it has
// to expend energy to heat our body up! But let's not worry about that.
- if((bodytemperature + fire_temp_add) > HUMAN_COMBUSTION_TEMP)
- return
+
+ // This whole section above is ABSOLUTELY STUPID and makes no sense and this would prevent too-high-heat from even being able to hurt someone. No. We will heat up for as long as needed.
+ //if((bodytemperature + fire_temp_add) > HUMAN_COMBUSTION_TEMP)
+ // return
bodytemperature += fire_temp_add
diff --git a/code/modules/mob/living/carbon/human/species/outsider/replicant.dm b/code/modules/mob/living/carbon/human/species/outsider/replicant.dm
index ec13e29908a..7e8bf25f6e3 100644
--- a/code/modules/mob/living/carbon/human/species/outsider/replicant.dm
+++ b/code/modules/mob/living/carbon/human/species/outsider/replicant.dm
@@ -72,7 +72,7 @@
blood_color = "#55ff55"
species_language = LANGUAGE_SIGN
- assisted_langs = list(LANGUAGE_ROOTGLOBAL, LANGUAGE_SOL_COMMON, LANGUAGE_SKRELLIANFAR)
+ assisted_langs = list(LANGUAGE_ROOTGLOBAL, LANGUAGE_SOL_COMMON)
inherent_verbs = list(
/mob/living/carbon/human/proc/shapeshifter_select_shape,
diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm
index bb80c4c9d4f..d6313e5589f 100644
--- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm
+++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm
@@ -6,7 +6,7 @@
default_language = LANGUAGE_VOX
language = LANGUAGE_GALCOM
species_language = LANGUAGE_VOX
- num_alternate_languages = 1
+ num_alternate_languages = 3
assisted_langs = list(LANGUAGE_ROOTGLOBAL)
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/strong)
rarity_value = 4
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 91770ff1f41..2fb9c4b9aee 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -72,7 +72,7 @@
// The languages the species can't speak without an assisted organ.
// This list is a guess at things that no one other than the parent species should be able to speak
- var/list/assisted_langs = list(LANGUAGE_EAL, LANGUAGE_SKRELLIAN, LANGUAGE_SKRELLIANFAR, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) //VOREStation Edit
+ var/list/assisted_langs = list(LANGUAGE_EAL, LANGUAGE_SKRELLIAN, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) //VOREStation Edit
//Soundy emotey things.
var/scream_verb_1p = "scream"
@@ -201,7 +201,8 @@
var/has_glowing_eyes = 0 // Whether the eyes are shown above all lighting
var/water_movement = 0 // How much faster or slower the species is in water
var/snow_movement = 0 // How much faster or slower the species is on snow
-
+ var/can_space_freemove = FALSE // Can we freely move in space?
+ var/can_zero_g_move = FALSE // What about just in zero-g non-space?
var/item_slowdown_mod = 1 // How affected by item slowdown the species is.
var/primitive_form // Lesser form, if any (ie. monkey for humans)
@@ -273,6 +274,8 @@
var/wikilink = null //link to wiki page for species
var/icon_height = 32
var/agility = 20 //prob() to do agile things
+ var/gun_accuracy_mod = 0 // More is better
+ var/gun_accuracy_dispersion_mod = 0 // More is worse
var/sort_hint = SPECIES_SORT_NORMAL
diff --git a/code/modules/mob/living/carbon/human/species/species_attack_vr.dm b/code/modules/mob/living/carbon/human/species/species_attack_vr.dm
index 9e2c720efa3..11a6d149736 100644
--- a/code/modules/mob/living/carbon/human/species/species_attack_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/species_attack_vr.dm
@@ -1,60 +1,77 @@
-/datum/unarmed_attack/bite/sharp/numbing //Is using this against someone you are truly trying to fight a bad idea? Yes. Yes it is.
- attack_verb = list("bit")
- attack_noun = list("fangs")
- attack_sound = 'sound/weapons/bite.ogg'
- shredding = 0
- sharp = TRUE
- edge = TRUE
-
-/datum/unarmed_attack/bite/sharp/numbing/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
- var/obj/item/organ/external/affecting = target.get_organ(zone)
-
- attack_damage = CLAMP(attack_damage, 1, 5)
- if(target == user)
- user.visible_message("[user] [pick(attack_verb)] \himself in the [affecting.name]!")
- return 0 //No venom for you.
- switch(zone)
- if(BP_HEAD, O_MOUTH, O_EYES)
- // ----- HEAD ----- //
- switch(attack_damage)
- if(1 to 2)
- user.visible_message("[user]'s fangs scrape across [target]'s cheek!")
- to_chat(target, "Your face feels tingly!")
- target.bloodstr.add_reagent("numbenzyme",attack_damage) //Have to add this here, otherwise the swtich fails.
- if(3 to 4)
- user.visible_message("[user]'s fangs pierce into [target]'s neck at an odd, awkward angle!")
- to_chat(target, "Your neck feels like it's on fire before going numb!")
- target.bloodstr.add_reagent("numbenzyme",attack_damage)
- if(5)
- user.visible_message("[user] sinks \his [pick(attack_noun)] deep into [target]'s neck, causing the vein to bulge outwards at some type of chemical is pumped into it!")
- to_chat(target, "Your neck feels like it's going to burst! Moments later, you simply can't feel your neck any longer, the numbness beginning to spread throughout your body!")
- target.bloodstr.add_reagent("numbenzyme",attack_damage)
- else
- // ----- BODY ----- //
- switch(attack_damage)
- if(1 to 2)
- user.visible_message("[user]'s fangs scrape across [target]'s [affecting.name]!")
- to_chat(target, "Your [affecting.name] feels tingly!")
- target.bloodstr.add_reagent("numbenzyme",attack_damage)
- if(3 to 4)
- user.visible_message("[user]'s fangs pierce [pick("", "", "the side of")] [target]'s [affecting.name]!")
- to_chat(target, "Your [affecting.name] feels like it's on fire before going numb!")
- target.bloodstr.add_reagent("numbenzyme",attack_damage)
- if(5)
- user.visible_message("[user]'s fangs sink deep into [target]'s [affecting.name], one of their veins bulging outwards from the sudden fluid pumped into it!")
- to_chat(target, "Your [affecting.name] feels like it's going to burst! Moments later, you simply can't feel your [affecting.name] any longer, the numbness slowly spreading throughout your body!")
- target.bloodstr.add_reagent("numbenzyme",attack_damage)
-
-/datum/unarmed_attack/claws/shadekin
-
-/datum/unarmed_attack/claws/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
- ..()
- if(!(target == user))
- user.shadekin_adjust_energy(attack_damage)
-
-/datum/unarmed_attack/bite/sharp/shadekin
-
-/datum/unarmed_attack/bite/sharp/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
- ..()
- if(!(target == user))
- user.shadekin_adjust_energy(attack_damage)
\ No newline at end of file
+/datum/unarmed_attack/bite/sharp/numbing //Is using this against someone you are truly trying to fight a bad idea? Yes. Yes it is.
+ attack_verb = list("bit")
+ attack_noun = list("fangs")
+ attack_sound = 'sound/weapons/bite.ogg'
+ shredding = 0
+ sharp = TRUE
+ edge = TRUE
+
+/datum/unarmed_attack/bite/sharp/numbing/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
+ var/obj/item/organ/external/affecting = target.get_organ(zone)
+
+ attack_damage = CLAMP(attack_damage, 1, 5)
+ if(target == user)
+ user.visible_message("[user] [pick(attack_verb)] \himself in the [affecting.name]!")
+ return 0 //No venom for you.
+ switch(zone)
+ if(BP_HEAD, O_MOUTH, O_EYES)
+ // ----- HEAD ----- //
+ switch(attack_damage)
+ if(1 to 2)
+ user.visible_message("[user]'s fangs scrape across [target]'s cheek!")
+ to_chat(target, "Your face feels tingly!")
+ target.bloodstr.add_reagent("numbenzyme",attack_damage) //Have to add this here, otherwise the swtich fails.
+ if(3 to 4)
+ user.visible_message("[user]'s fangs pierce into [target]'s neck at an odd, awkward angle!")
+ to_chat(target, "Your neck feels like it's on fire before going numb!")
+ target.bloodstr.add_reagent("numbenzyme",attack_damage)
+ if(5)
+ user.visible_message("[user] sinks \his [pick(attack_noun)] deep into [target]'s neck, causing the vein to bulge outwards at some type of chemical is pumped into it!")
+ to_chat(target, "Your neck feels like it's going to burst! Moments later, you simply can't feel your neck any longer, the numbness beginning to spread throughout your body!")
+ target.bloodstr.add_reagent("numbenzyme",attack_damage)
+ else
+ // ----- BODY ----- //
+ switch(attack_damage)
+ if(1 to 2)
+ user.visible_message("[user]'s fangs scrape across [target]'s [affecting.name]!")
+ to_chat(target, "Your [affecting.name] feels tingly!")
+ target.bloodstr.add_reagent("numbenzyme",attack_damage)
+ if(3 to 4)
+ user.visible_message("[user]'s fangs pierce [pick("", "", "the side of")] [target]'s [affecting.name]!")
+ to_chat(target, "Your [affecting.name] feels like it's on fire before going numb!")
+ target.bloodstr.add_reagent("numbenzyme",attack_damage)
+ if(5)
+ user.visible_message("[user]'s fangs sink deep into [target]'s [affecting.name], one of their veins bulging outwards from the sudden fluid pumped into it!")
+ to_chat(target, "Your [affecting.name] feels like it's going to burst! Moments later, you simply can't feel your [affecting.name] any longer, the numbness slowly spreading throughout your body!")
+ target.bloodstr.add_reagent("numbenzyme",attack_damage)
+
+/datum/unarmed_attack/claws/shadekin
+
+/datum/unarmed_attack/claws/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
+ ..()
+ if(!(target == user))
+ user.shadekin_adjust_energy(attack_damage)
+
+/datum/unarmed_attack/bite/sharp/shadekin
+
+/datum/unarmed_attack/bite/sharp/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
+ ..()
+ if(!(target == user))
+ user.shadekin_adjust_energy(attack_damage)
+
+/datum/unarmed_attack/claws/chimera //special feral attack that gets stronger as they get angrier
+
+/datum/unarmed_attack/claws/chimera/get_unarmed_damage(var/mob/living/carbon/human/user)
+ return user.feral/5
+
+/datum/unarmed_attack/claws/chimera/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone)
+ ..()
+ if(user.feral && !(target == user))
+ var/selfdamage = ((user.feral/10)-7.5)
+ if(selfdamage > 0)
+ var/selfdamagezone = null
+ if (user.hand)
+ selfdamagezone=pick(BP_L_ARM, BP_L_HAND)
+ else
+ selfdamagezone=pick(BP_R_ARM, BP_R_HAND)
+ user.apply_damage(selfdamage, BRUTE, selfdamagezone, 0, 0, sharp=FALSE, edge=FALSE)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/species_getters.dm b/code/modules/mob/living/carbon/human/species/species_getters.dm
index bcb9de1f292..27bb09baa6f 100644
--- a/code/modules/mob/living/carbon/human/species/species_getters.dm
+++ b/code/modules/mob/living/carbon/human/species/species_getters.dm
@@ -103,8 +103,10 @@
if(!name_language)
if(gender == FEMALE)
return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
- else
+ else if(gender == MALE)
return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
+ else
+ return capitalize(prob(50) ? pick(first_names_male) : pick(first_names_female)) + " " + capitalize(pick(last_names))
var/datum/language/species_language = GLOB.all_languages[name_language]
if(!species_language)
diff --git a/code/modules/mob/living/carbon/human/species/species_vr.dm b/code/modules/mob/living/carbon/human/species/species_vr.dm
index 9d8703d6175..ceb8a026d24 100644
--- a/code/modules/mob/living/carbon/human/species/species_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/species_vr.dm
@@ -16,6 +16,8 @@
var/base_species = null // Unused outside of a few species
var/selects_bodytype = FALSE // Allows the species to choose from body types like custom species can, affecting suit fitting and etcetera as you would expect.
+ var/bloodsucker = FALSE // Allows safely getting nutrition from blood.
+
var/is_weaver = FALSE
var/silk_production = FALSE
var/silk_reserve = 100
@@ -25,6 +27,12 @@
var/list/traits = list()
//Vars that need to be copied when producing a copy of species.
var/list/copy_vars = list("base_species", "icobase", "deform", "tail", "tail_animation", "icobase_tail", "color_mult", "primitive_form", "appearance_flags", "flesh_color", "base_color", "blood_mask", "damage_mask", "damage_overlays", "move_trail", "has_floating_eyes")
+ var/trait_points = 0
+
+ var/micro_size_mod = 0 // How different is our size for interactions that involve us being small?
+ var/macro_size_mod = 0 // How different is our size for interactions that involve us being big?
+ var/digestion_nutrition_modifier = 1
+
/datum/species/proc/give_numbing_bite() //Holy SHIT this is hacky, but it works. Updating a mob's attacks mid game is insane.
unarmed_attacks = list()
@@ -48,6 +56,7 @@
ASSERT(src)
ASSERT(istype(H))
var/datum/species/new_copy = new src.type()
+ new_copy.race_key = race_key
if(selects_bodytype && custom_base) //If race selects a bodytype, retrieve the custom_base species and copy needed variables.
var/datum/species/S = GLOB.all_species[custom_base]
diff --git a/code/modules/mob/living/carbon/human/species/station/alraune.dm b/code/modules/mob/living/carbon/human/species/station/alraune.dm
index 12424f993c3..999425d4e6b 100644
--- a/code/modules/mob/living/carbon/human/species/station/alraune.dm
+++ b/code/modules/mob/living/carbon/human/species/station/alraune.dm
@@ -2,7 +2,7 @@
name = SPECIES_ALRAUNE
name_plural = "Alraunes"
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite)
- num_alternate_languages = 2
+ num_alternate_languages = 3
slowdown = 1 //slow, they're plants. Not as slow as full diona.
total_health = 100 //standard
brute_mod = 1 //nothing special
diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
index bba44edf36f..8f27aa72c8b 100644
--- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
@@ -43,6 +43,8 @@
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right, "descriptor" = "right foot")
)
+ trait_points = 2
+
/datum/species/custom/update_sort_hint()
sort_hint = SPECIES_SORT_CUSTOM
diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm
index 587f4d918d5..f90a61111cc 100644
--- a/code/modules/mob/living/carbon/human/species/station/monkey.dm
+++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm
@@ -9,7 +9,7 @@
damage_mask = 'icons/mob/human_races/masks/dam_mask_monkey.dmi'
blood_mask = 'icons/mob/human_races/masks/blood_monkey.dmi'
language = null
- default_language = "Chimpanzee"
+ default_language = LANGUAGE_ANIMAL
greater_form = SPECIES_HUMAN
mob_size = MOB_SMALL
has_fine_manipulation = 0
@@ -75,7 +75,7 @@
deform = 'icons/mob/human_races/monkeys/r_farwa.dmi'
greater_form = SPECIES_TAJ
- default_language = "Farwa"
+ default_language = LANGUAGE_ANIMAL
flesh_color = "#AFA59E"
base_color = "#333333"
tail = "farwatail"
@@ -88,7 +88,7 @@
deform = 'icons/mob/human_races/monkeys/r_neaera.dmi'
greater_form = SPECIES_SKRELL
- default_language = "Neaera"
+ default_language = LANGUAGE_ANIMAL
flesh_color = "#8CD7A3"
blood_color = "#1D2CBF"
reagent_tag = IS_SKRELL
@@ -103,7 +103,7 @@
tail = "stoktail"
greater_form = SPECIES_UNATHI
- default_language = "Stok"
+ default_language = LANGUAGE_ANIMAL
flesh_color = "#34AF10"
base_color = "#066000"
reagent_tag = IS_UNATHI
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm
index bd02c11b209..a1dfe26be28 100644
--- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm
+++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm
@@ -483,3 +483,20 @@ var/global/list/disallowed_protean_accessories = list(
//Return ourselves in case someone wants it
return src
+
+/mob/living/simple_mob/protean_blob/CanStumbleVore(mob/living/target)
+ if(target == humanform)
+ return FALSE
+ return ..()
+
+/mob/living/simple_mob/protean_blob/CanStumbleVore(mob/living/target)
+ if(target == humanform)
+ return FALSE
+ return ..()
+
+/mob/living/carbon/human/CanStumbleVore(mob/living/target)
+ if(istype(target, /mob/living/simple_mob/protean_blob))
+ var/mob/living/simple_mob/protean_blob/PB = target
+ if(PB.humanform == src)
+ return FALSE
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm
index c6b353281b3..8f0a9e43064 100644
--- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm
+++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm
@@ -215,7 +215,7 @@
to_chat(src,"You can't process [substance]!")
return //Only a few things matter, the rest are best not cluttering the lists.
- var/howmuch = input(src,"How much do you want to store? (0-[matstack.get_amount()])","Select amount") as null|num
+ var/howmuch = tgui_input_number(src,"How much do you want to store? (0-[matstack.get_amount()])","Select amount",null,matstack.get_amount(),0)
if(!howmuch || matstack != get_active_hand() || howmuch > matstack.get_amount())
return //Quietly fail
@@ -295,7 +295,7 @@
return
var/nagmessage = "Adjust your mass to be a size between 25 to 200% (or between 1 to 600% in dorms area). Up-sizing consumes metal, downsizing returns metal."
- var/new_size = input(user, nagmessage, "Pick a Size", user.size_multiplier*100) as num|null
+ var/new_size = tgui_input_number(user, nagmessage, "Pick a Size", user.size_multiplier*100, 600, 1)
if(!new_size || !size_range_check(new_size))
return
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index 3cb700d60df..e41e465e959 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -13,7 +13,7 @@
species_language = LANGUAGE_SOL_COMMON
secondary_langs = list(LANGUAGE_SOL_COMMON, LANGUAGE_TERMINUS)
name_language = null // Use the first-name last-name generator rather than a language scrambler
- assisted_langs = list(LANGUAGE_EAL, LANGUAGE_SKRELLIAN, LANGUAGE_SKRELLIANFAR, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
+ assisted_langs = list(LANGUAGE_EAL, LANGUAGE_SKRELLIAN, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
min_age = 17
max_age = 130
@@ -389,7 +389,7 @@
taste_sensitivity = TASTE_SENSITIVE
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_ZADDAT, LANGUAGE_UNATHI)
- assisted_langs = list(LANGUAGE_EAL, LANGUAGE_TERMINUS, LANGUAGE_SKRELLIANFAR, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_SOL_COMMON, LANGUAGE_AKHANI, LANGUAGE_SIIK, LANGUAGE_GUTTER) //limited vocal range; can talk Unathi and magical Galcom but not much else
+ assisted_langs = list(LANGUAGE_EAL, LANGUAGE_TERMINUS, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_SOL_COMMON, LANGUAGE_AKHANI, LANGUAGE_SIIK, LANGUAGE_GUTTER) //limited vocal range; can talk Unathi and magical Galcom but not much else
name_language = LANGUAGE_ZADDAT
species_language = LANGUAGE_ZADDAT
health_hud_intensity = 2.5
@@ -510,7 +510,7 @@
health_hud_intensity = 2.5
item_slowdown_mod = 0.1
- num_alternate_languages = 2
+ num_alternate_languages = 3
name_language = LANGUAGE_ROOTLOCAL
species_language = LANGUAGE_ROOTLOCAL
secondary_langs = list(LANGUAGE_ROOTGLOBAL)
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
index 23605b10676..a4333760a8d 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
@@ -3,10 +3,18 @@
set category = "Abilities"
// Sanity is mostly handled in chimera_regenerate()
-
- var/confirm = tgui_alert(usr, "Are you sure you want to completely reconstruct your form? This process can take up to twenty minutes, depending on how hungry you are, and you will be unable to move.", "Confirm Regeneration", list("Yes", "No"))
- if(confirm == "Yes")
- chimera_regenerate()
+ if(stat == DEAD)
+ var/confirm = tgui_alert(usr, "Are you sure you want to regenerate your corpse? This process can take up to thirty minutes.", "Confirm Regeneration", list("Yes", "No"))
+ if(confirm == "Yes")
+ chimera_regenerate()
+ else if (quickcheckuninjured())
+ var/confirm = tgui_alert(usr, "Are you sure you want to regenerate? As you are uninjured this will only take 30 seconds and match your appearance to your character slot.", "Confirm Regeneration", list("Yes", "No"))
+ if(confirm == "Yes")
+ chimera_regenerate()
+ else
+ var/confirm = tgui_alert(usr, "Are you sure you want to completely reconstruct your form? This process can take up to fifteen minutes, depending on how hungry you are, and you will be unable to move.", "Confirm Regeneration", list("Yes", "No"))
+ if(confirm == "Yes")
+ chimera_regenerate()
/mob/living/carbon/human/proc/chimera_regenerate()
//If they're already regenerating
@@ -21,40 +29,40 @@
to_chat(src, "You can't use that ability again so soon!")
return
- var/nutrition_used = nutrition * 0.5
- var/time = (240+960/(1 + nutrition_used/75))
+ var/time = min(900, (120+780/(1 + nutrition/100))) //capped at 15 mins, roughly 6 minutes at 250 (yellow) nutrition, 4.1 minutes at 500 (grey), cannot be below 2 mins
+ if (quickcheckuninjured()) //if you're completely uninjured, then you get a speedymode - check health first for quickness
+ time = 30
//Clicked regen while dead.
if(stat == DEAD)
- //Has nutrition and dead, allow regen.
- if(hasnutriment())
- to_chat(src, "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds.")
+ //reviving from dead takes extra nutriment to be provided from outside OR takes twice as long and consumes extra at the end
+ if(!hasnutriment())
+ time = time*2
- //Scary spawnerization.
- revive_ready = REVIVING_NOW
- revive_finished = (world.time + time SECONDS) // When do we finish reviving? Allows us to find out when we're done, called by the alert currently.
- throw_alert("regen", /obj/screen/alert/xenochimera/reconstitution)
- spawn(time SECONDS)
- // Was dead, now not dead.
- if(stat != DEAD)
- to_chat(src, "Your body has recovered from its ordeal, ready to regenerate itself again.")
- revive_ready = REVIVING_READY //reset their cooldown
- clear_alert("regen")
- throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
+ to_chat(src, "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds.")
- // Was dead, still dead.
- else
- to_chat(src, "Consciousness begins to stir as your new body awakens, ready to hatch.")
- verbs |= /mob/living/carbon/human/proc/hatch
- revive_ready = REVIVING_DONE
- src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30)
- clear_alert("regen")
- throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
+ //Scary spawnerization.
+ revive_ready = REVIVING_NOW
+ revive_finished = (world.time + time SECONDS) // When do we finish reviving? Allows us to find out when we're done, called by the alert currently.
+ throw_alert("regen", /obj/screen/alert/xenochimera/reconstitution)
+ spawn(time SECONDS)
+ // check to see if they've been fixed by outside forces in the meantime such as defibbing
+ if(stat != DEAD)
+ to_chat(src, "Your body has recovered from its ordeal, ready to regenerate itself again.")
+ revive_ready = REVIVING_READY //reset their cooldown
+ clear_alert("regen")
+ throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
+
+ // Was dead, still dead.
+ else
+ to_chat(src, "Consciousness begins to stir as your new body awakens, ready to hatch.")
+ verbs |= /mob/living/carbon/human/proc/hatch
+ revive_ready = REVIVING_DONE
+ src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30)
+ clear_alert("regen")
+ throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
- //Dead until nutrition injected.
- else
- to_chat(src, "Your body is too damaged to regenerate without additional nutrients to feed what few living cells remain.")
//Clicked regen while NOT dead
else
@@ -66,29 +74,17 @@
throw_alert("regen", /obj/screen/alert/xenochimera/reconstitution)
spawn(time SECONDS)
- //If they're still alive after regenning.
- if(stat != DEAD)
+ //Slightly different flavour messages
+ if(stat != DEAD || hasnutriment())
to_chat(src, "Consciousness begins to stir as your new body awakens, ready to hatch..")
- verbs |= /mob/living/carbon/human/proc/hatch
- revive_ready = REVIVING_DONE
- src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30)
- clear_alert("regen")
- throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
-
- //Was alive, now dead
- else if(hasnutriment())
- to_chat(src, "Consciousness begins to stir as your new body awakens, ready to hatch..")
- verbs |= /mob/living/carbon/human/proc/hatch
- revive_ready = REVIVING_DONE
- src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30)
- clear_alert("regen")
- throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
-
- //Dead until nutrition injected.
else
- to_chat(src, "Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process.")
- revive_ready = REVIVING_READY //reset their cooldown
- clear_alert("regen")
+ to_chat(src, "Consciousness begins to stir as your battered body struggles to recover from its ordeal..")
+ verbs |= /mob/living/carbon/human/proc/hatch
+ revive_ready = REVIVING_DONE
+ src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30)
+ clear_alert("regen")
+ throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
+
/mob/living/carbon/human/proc/hasnutriment()
if (bloodstr.has_reagent("nutriment", 30) || src.bloodstr.has_reagent("protein", 15)) //protein needs half as much. For reference, a steak contains 9u protein.
@@ -97,6 +93,16 @@
return TRUE
else return FALSE
+/mob/living/carbon/human/proc/quickcheckuninjured()
+ if (getBruteLoss() || getFireLoss() || getHalLoss() || getToxLoss() || getOxyLoss() || getBrainLoss()) //fails if they have any of the main damage types
+ return FALSE
+ for (var/obj/item/organ/O in organs) //check their organs just in case they're being sneaky and somehow have organ damage but no health damage
+ if (O.damage)
+ return FALSE
+ for (var/obj/item/organ/O in internal_organs) //check their organs just in case they're being sneaky and somehow have organ damage but no health damage
+ if (O.damage)
+ return FALSE
+ return TRUE
/mob/living/carbon/human/proc/hatch()
set name = "Hatch"
@@ -112,58 +118,54 @@
//Dead when hatching
if(stat == DEAD)
- //Check again for nutriment (necessary?)
- if(hasnutriment())
- chimera_hatch()
- adjustBrainLoss(10) // if they're reviving from dead, they come back with 10 brainloss on top of whatever's unhealed.
- visible_message("The lifeless husk of [src] bursts open, revealing a new, intact copy in the pool of viscera. ") //Bloody hell...
- clear_alert("hatch")
- return
-
- //Don't have nutriment to hatch! Or you somehow died in between completing your revive and hitting hatch.
- else
- to_chat(src, "Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process.")
- verbs -= /mob/living/carbon/human/proc/hatch
- revive_ready = REVIVING_READY //reset their cooldown they can try again when they're given a kickstart
- clear_alert("hatch")
+ //Reviving from ded takes extra nutrition - if it isn't provided from outside sources, it comes from you
+ if(!hasnutriment())
+ nutrition=nutrition * 0.75
+ chimera_hatch()
+ adjustBrainLoss(5) // if they're reviving from dead, they come back with 5 brainloss on top of whatever's unhealed.
+ visible_message("The former corpse staggers to its feet, all its former wounds having vanished... ") //Bloody hell...
+ clear_alert("hatch")
+ return
//Alive when hatching
else
chimera_hatch()
- visible_message("The dormant husk of [src] bursts open, revealing a new, intact copy in the pool of viscera. ") //Bloody hell...
+
+ visible_message("[src] rises to \his feet. ") //Bloody hell...
clear_alert("hatch")
/mob/living/carbon/human/proc/chimera_hatch()
verbs -= /mob/living/carbon/human/proc/hatch
to_chat(src, "Your new body awakens, bursting free from your old skin.")
-
//Modify and record values (half nutrition and braindamage)
- var/old_nutrition = nutrition * 0.5
- var/braindamage = (brainloss * 0.5) //Can only heal half brain damage.
-
+ var/old_nutrition = nutrition
+ var/braindamage = min(5, max(0, (brainloss-1) * 0.5)) //brainloss is tricky to heal and might take a couple of goes to get rid of completely.
+ var/uninjured=quickcheckuninjured()
//I did have special snowflake code, but this is easier.
revive()
mutations.Remove(HUSK)
- nutrition = old_nutrition
setBrainLoss(braindamage)
- //Drop everything
- for(var/obj/item/W in src)
- drop_from_inventory(W)
+ if(!uninjured)
+ nutrition = old_nutrition * 0.5
+ //Drop everything
+ for(var/obj/item/W in src)
+ drop_from_inventory(W)
+ //Visual effects
+ var/T = get_turf(src)
+ var/blood_color = species.blood_color
+ var/flesh_color = species.flesh_color
+ new /obj/effect/gibspawner/human/xenochimera(T, null, flesh_color, blood_color)
+ visible_message("The lifeless husk of [src] bursts open, revealing a new, intact copy in the pool of viscera. ") //Bloody hell...
+ playsound(T, 'sound/effects/mob_effects/xenochimera/hatch.ogg', 50)
+ else //lower cost for doing a quick cosmetic revive
+ nutrition = old_nutrition * 0.9
//Unfreeze some things
does_not_breathe = FALSE
update_canmove()
weakened = 2
- //Visual effects
- var/T = get_turf(src)
- var/blood_color = species.blood_color
- var/flesh_color = species.flesh_color
- new /obj/effect/gibspawner/human/xenochimera(T, null, flesh_color, blood_color)
-
- playsound(T, 'sound/effects/mob_effects/xenochimera/hatch.ogg', 50)
-
revive_ready = world.time + 10 MINUTES //set the cooldown CHOMPEdit: Reduced this to 10 minutes, you're playing with fire if you're reviving that often.
/mob/living/carbon/human/proc/revivingreset() // keep this as a debug proc or potential future use
@@ -1037,3 +1039,29 @@
species.has_glowing_eyes = !species.has_glowing_eyes
update_eyes()
to_chat(src, "Your eyes [species.has_glowing_eyes ? "are now" : "are no longer"] glowing.")
+
+
+
+/mob/living/carbon/human/proc/enter_cocoon()
+ set name = "Spin Cocoon"
+ set category = "Abilities"
+ if(!isturf(loc))
+ to_chat(src, "You don't have enough space to spin a cocoon!")
+ return
+
+ if(do_after(src, 25, exclusive = TASK_USER_EXCLUSIVE))
+ var/obj/item/weapon/storage/vore_egg/bugcocoon/C = new(loc)
+ forceMove(C)
+ transforming = TRUE
+ var/datum/tgui_module/appearance_changer/cocoon/V = new(src, src)
+ V.tgui_interact(src)
+
+ var/mob_holder_type = src.holder_type || /obj/item/weapon/holder
+ C.w_class = src.size_multiplier * 4 //Egg size and weight scaled to match occupant.
+ var/obj/item/weapon/holder/H = new mob_holder_type(C, src)
+ C.max_storage_space = H.w_class
+ C.icon_scale_x = 0.25 * C.w_class
+ C.icon_scale_y = 0.25 * C.w_class
+ C.update_transform()
+ //egg_contents -= src
+ C.contents -= src
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
index e2946cbbd90..3cb0c8bcde1 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
@@ -9,7 +9,7 @@
name_plural = "Xenochimeras"
icobase = 'icons/mob/human_races/r_xenochimera.dmi'
deform = 'icons/mob/human_races/r_def_xenochimera.dmi'
- unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
+ unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/chimera, /datum/unarmed_attack/bite/sharp)
darksight = 8 //critters with instincts to hide in the dark need to see in the dark - about as good as tajara.
slowdown = -0.2 //scuttly, but not as scuttly as a tajara or a teshari.
brute_mod = 0.8 //About as tanky to brute as a Unathi. They'll probably snap and go feral when hurt though.
@@ -17,7 +17,7 @@
base_species = "Xenochimera"
selects_bodytype = TRUE
- num_alternate_languages = 2
+ num_alternate_languages = 3
secondary_langs = list("Sol Common")
//color_mult = 1 //It seemed to work fine in testing, but I've been informed it's unneeded.
tail = "tail" //Scree's tail. Can be disabled in the vore tab by choosing "hide species specific tail sprite"
@@ -55,13 +55,13 @@
genders = list(MALE, FEMALE, PLURAL, NEUTER)
- has_organ = list( //Same organ list as tajarans.
+ has_organ = list( //Same organ list as tajarans, except for their SPECIAL BRAIN.
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
- O_BRAIN = /obj/item/organ/internal/brain,
+ O_BRAIN = /obj/item/organ/internal/brain/xenochimera,
O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine
@@ -97,6 +97,9 @@
//Very low pressure damage
if(adjusted_pressure2 <= 20)
H.take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure")
+ //they handle areas where they can't breathe better than most, but it still lowers their effective health as well as all the other bad stuff that comes with unbreathable environments
+ if(H.getOxyLoss() >= 50)
+ H.does_not_breathe = TRUE
//Cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage or trigger feral.
//NB: 'body_temperature' used here is the 'setpoint' species var
@@ -105,17 +108,24 @@
H.shock_stage = min(H.shock_stage + (temp_diff/20), 160) // Divided by 20 is the same as previous numbers, but a full scale
H.eye_blurry = max(5,H.eye_blurry)
+/obj/item/organ/internal/brain/xenochimera
+ var/laststress = 0
/datum/species/xenochimera/proc/handle_feralness(var/mob/living/carbon/human/H)
+ //first, calculate how stressed the chimera is
+ var/laststress = 0
+ var/obj/item/organ/internal/brain/xenochimera/B = H.internal_organs_by_name[O_BRAIN]
+ if(B) //if you don't have a chimera brain in a chimera body somehow, you don't get the feraless protection
+ laststress = B.laststress
- //Low-ish nutrition has messages and eventually feral
- var/hungry = H.nutrition <= 200
+ //Low-ish nutrition has messages and can eventually cause feralness
+ var/hunger = max(0, 150 - H.nutrition)
- //At 360 nutrition, this is 30 brute/burn, or 18 halloss. Capped at 50 brute/30 halloss - if they take THAT much, no amount of satiation will help them. Also they're fat.
- var/shock = H.traumatic_shock > min(60, H.nutrition/10)
+ //pain makes feralness a thing
+ var/shock = 0.75*H.traumatic_shock
- //Caffeinated xenochimera can become feral and have special messages
- var/jittery = H.jitteriness >= 100
+ //Caffeinated or otherwise overexcited xenochimera can become feral and have special messages
+ var/jittery = max(0, H.jitteriness - 100)
//To reduce distant object references
var/feral = H.feral
@@ -124,11 +134,25 @@
var/danger = FALSE
var/feral_state = FALSE
- //Handle feral triggers and pre-feral messages
- if(!feral && (hungry || shock || jittery))
+ //finally, calculate the current stress total the chimera is operating under, and the cause
+ var/currentstress = (hunger + shock + jittery)
+ var/cause = "stress"
+ if(hunger > shock && hunger > jittery)
+ cause = "hunger"
+ else if (shock > hunger && shock > jittery)
+ cause = "shock"
+ else if (jittery > shock && jittery > hunger)
+ cause = "jittery"
- // If they're hungry, give nag messages (when not bellied)
- if(H.nutrition >= 100 && prob(0.5) && !isbelly(H.loc))
+ //check to see if they go feral if they weren't before
+ if(!feral)
+ // if stress is below 15, no chance of snapping. Also if they weren't feral before, they won't suddenly become feral unless they get MORE stressed
+ if((currentstress > laststress) && prob(clamp(currentstress-15, 0, 100)) )
+ go_feral(H, currentstress, cause)
+ feral = currentstress //update the local var
+
+ //they didn't go feral, give 'em a chance of hunger messages
+ else if(H.nutrition <= 200 && prob(0.5) && !isbelly(H.loc))
switch(H.nutrition)
if(150 to 200)
to_chat(H,"You feel rather hungry. It might be a good idea to find some some food...")
@@ -136,81 +160,26 @@
to_chat(H,"You feel like you're going to snap and give in to your hunger soon... It would be for the best to find some [pick("food","prey")] to eat...")
danger = TRUE
- // Going feral due to hunger
- else if(H.nutrition < 100 && !isbelly(H.loc))
- to_chat(H,"Something in your mind flips, your instincts taking over, no longer able to fully comprehend your surroundings as survival becomes your primary concern - you must feed, survive, there is nothing else. Hunt. Eat. Hide. Repeat.")
- log_and_message_admins("has gone feral due to hunger.", H)
- feral = 5
- danger = TRUE
- feral_state = TRUE
- if(!H.stat)
- H.emote("twitch")
-
- // If they're hurt, chance of snapping.
- else if(shock)
-
- //If the majority of their shock is due to halloss, greater chance of snapping.
- if(2.5*H.halloss >= H.traumatic_shock)
- if(prob(min(10,(0.2 * H.traumatic_shock))))
- to_chat(H,"The pain! It stings! Got to get away! Your instincts take over, urging you to flee, to hide, to go to ground, get away from here...")
- log_and_message_admins("has gone feral due to halloss.", H)
- feral = 5
- danger = TRUE
- feral_state = TRUE
- if(!H.stat)
- H.emote("twitch")
-
- //Majority due to other damage sources
- else if(prob(min(10,(0.1 * H.traumatic_shock))))
- to_chat(H,"Your fight-or-flight response kicks in, your injuries too much to simply ignore - you need to flee, to hide, survive at all costs - or destroy whatever is threatening you.")
- feral = 5
- danger = TRUE
- feral_state = TRUE
- log_and_message_admins("has gone feral due to injury.", H)
- if(!H.stat)
- H.emote("twitch")
-
- //No hungry or shock, but jittery
- else if(jittery)
- to_chat(H,"Suddenly, something flips - everything that moves is... potential prey. A plaything. This is great! Time to hunt!")
- feral = 5
- danger = TRUE
- feral_state = TRUE
- log_and_message_admins("has gone feral due to jitteriness.", H)
- if(!H.stat)
- H.emote("twitch")
+ //now the check's done, update their brain so it remembers how stressed they were
+ B.laststress = currentstress
// Handle being feral
if(feral)
//We're feral
feral_state = TRUE
- //Shock due to mostly halloss. More feral.
- if(shock && 2.5*H.halloss >= H.traumatic_shock)
+ //If they're still stressed, they stay feral
+ if(currentstress >= 15)
danger = TRUE
- feral = max(feral, H.halloss)
+ feral = max(feral, currentstress)
- //Shock due to mostly injury. More feral.
- else if(shock)
- danger = TRUE
- feral = max(feral, H.traumatic_shock * 2)
-
- //Still jittery? More feral.
- if(jittery)
- danger = TRUE
- feral = max(feral, H.jitteriness-100)
-
- //Still hungry? More feral.
- if(H.feral + H.nutrition < 150)
- danger = TRUE
- feral++
else
feral = max(0,--feral)
- // Being in a belly or in the darkness decreases stress further. Helps mechanically reward players for staying in darkness + RP'ing appropriately. :9
- var/turf/T = get_turf(H)
- if(feral && (isbelly(H.loc) || T.get_lumcount() <= 0.1))
- feral = max(0,--feral)
+ // Being in a belly or in the darkness decreases stress further. Helps mechanically reward players for staying in darkness + RP'ing appropriately. :9
+ var/turf/T = get_turf(H)
+ if(feral && (isbelly(H.loc) || T.get_lumcount() <= 0.1))
+ feral = max(0,--feral)
//Set our real mob's var to our temp var
H.feral = feral
@@ -227,7 +196,7 @@
H.shock_stage = max(H.shock_stage-(feral/20), 0)
//Handle light/dark areas
- // var/turf/T = get_turf(H) // Moved up to before the in-belly/dark combined check, should still safely reach here just fine.
+ var/turf/T = get_turf(H)
if(!T)
update_xenochimera_hud(H, danger, feral_state)
return //Nullspace
@@ -257,15 +226,15 @@
// In the darkness, or "hidden", or in a belly. No need for custom scene-protection checks as it's just an occational infomessage.
if(darkish || !isturf(H.loc) || isbelly(H.loc)) // Specific check for if in belly. !isturf should do this, but JUST in case.
// If hurt, tell 'em to heal up
- if (shock)
+ if (cause == "shock")
to_chat(H,"This place seems safe, secure, hidden, a place to lick your wounds and recover...")
//If hungry, nag them to go and find someone or something to eat.
- else if(hungry)
+ else if(cause == "hunger")
to_chat(H,"Secure in your hiding place, your hunger still gnaws at you. You need to catch some food...")
//If jittery, etc
- else if(jittery)
+ else if(cause == "jittery")
to_chat(H,"sneakysneakyyesyesyescleverhidingfindthingsyessssss")
//Otherwise, just tell them to keep hiding.
@@ -284,16 +253,16 @@
// Someone/something nearby
if(nearby.len)
var/M = pick(nearby)
- if(shock)
+ if(cause == "shock")
to_chat(H,"You're hurt, in danger, exposed, and [M] looks to be a little too close for comfort...")
- else if(hungry || jittery)
+ else
to_chat(H,"Every movement, every flick, every sight and sound has your full attention, your hunting instincts on high alert... In fact, [M] looks extremely appetizing...")
// Nobody around
else
- if(hungry)
+ if(cause == "hunger")
to_chat(H,"Confusing sights and sounds and smells surround you - scary and disorienting it may be, but the drive to hunt, to feed, to survive, compels you.")
- else if(jittery)
+ else if(cause == "jittery")
to_chat(H,"yesyesyesyesyesyesgetthethingGETTHETHINGfindfoodsfindpreypounceyesyesyes")
else
to_chat(H,"Confusing sights and sounds and smells surround you, this place is wrong, confusing, frightening. You need to hide, go to ground...")
@@ -301,6 +270,37 @@
// HUD update time
update_xenochimera_hud(H, danger, feral_state)
+/datum/species/xenochimera/proc/go_feral(var/mob/living/carbon/human/H, var/stress, var/cause)
+ // Going feral due to hunger
+ if(cause == "hunger")
+ to_chat(H,"Something in your mind flips, your instincts taking over, no longer able to fully comprehend your surroundings as survival becomes your primary concern - you must feed, survive, there is nothing else. Hunt. Eat. Hide. Repeat.")
+ log_and_message_admins("has gone feral due to hunger.", H)
+
+ // If they're hurt, chance of snapping.
+ else if(cause == "shock")
+ //If the majority of their shock is due to halloss, give them a different message (3x multiplier on check as halloss is 2x - meaning t_s must be at least 3x for other damage sources to be the greater part)
+ if(3*H.halloss >= H.traumatic_shock)
+ to_chat(H,"The pain! It stings! Got to get away! Your instincts take over, urging you to flee, to hide, to go to ground, get away from here...")
+ log_and_message_admins("has gone feral due to halloss.", H)
+
+ //Majority due to other damage sources
+ else
+ to_chat(H,"Your fight-or-flight response kicks in, your injuries too much to simply ignore - you need to flee, to hide, survive at all costs - or destroy whatever is threatening you.")
+ log_and_message_admins("has gone feral due to injury.", H)
+
+ //No hungry or shock, but jittery
+ else if(cause == "jittery")
+ to_chat(H,"Suddenly, something flips - everything that moves is... potential prey. A plaything. This is great! Time to hunt!")
+ log_and_message_admins("has gone feral due to jitteriness.", H)
+
+ else // catch-all just in case something weird happens
+ to_chat(H,"The stress of your situation is too much for you, and your survival instincts kick in!")
+ log_and_message_admins("has gone feral for unknown reasons.", H)
+ //finally, set their feral var
+ H.feral = stress
+ if(!H.stat)
+ H.emote("twitch")
+
/datum/species/xenochimera/get_race_key()
var/datum/species/real = GLOB.all_species[base_species]
return real.race_key
@@ -333,7 +333,7 @@
brute_mod = 0.8 //20% brute damage reduction
burn_mod = 1.15 //15% burn damage increase. They're spiders. Aerosol can+lighter = dead spiders.
- num_alternate_languages = 2
+ num_alternate_languages = 3
secondary_langs = list(LANGUAGE_VESPINAE)
color_mult = 1
tail = "tail" //Spider tail.
diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm
index 1c1941943bd..fcb985c435a 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm
@@ -535,7 +535,7 @@
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
darksight = 4 //Better hunters in the dark.
hunger_factor = 0.1 //In exchange, they get hungry a tad faster.
- num_alternate_languages = 2
+ num_alternate_languages = 3
min_age = 18
max_age = 80
@@ -562,3 +562,60 @@
"You feel uncomfortably warm.",
"Your chitin feels hot."
)
+
+/datum/species/altevian
+ name = SPECIES_ALTEVIAN
+ name_plural = "Altevians"
+ icobase = 'icons/mob/human_races/r_altevian.dmi'
+ deform = 'icons/mob/human_races/r_def_altevian.dmi'
+ unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
+ language = LANGUAGE_TAVAN
+ num_alternate_languages = 3
+ secondary_langs = list(LANGUAGE_TAVAN)
+ name_language = null
+ color_mult = 1
+ inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair)
+
+ min_age = 18
+ max_age = 80
+
+ blurb = "The Altevian are a species of tall, rodent humanoids that are akin to rats for their features. \
+ The Altevian, unlike most species, do not have a home planet, nor system, adopting a fully nomadic lifestyle \
+ for their survival across the stars. Instead, they have opted to live in massive super capital-class colony-ships \
+ with a flagship as their place they would call home."
+
+ wikilink="https://wiki.vore-station.net/Altevian"
+
+ catalogue_data = list(/datum/category_item/catalogue/fauna/altevian)
+
+ spawn_flags = SPECIES_CAN_JOIN
+ appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
+
+ flesh_color = "#AFA59E"
+ base_color = "#777777"
+
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
+
+ burn_mod = 1.15
+ hunger_factor = 0.04
+ can_zero_g_move = TRUE
+
+ heat_discomfort_strings = list(
+ "Your fur prickles in the heat.",
+ "You feel uncomfortably warm.",
+ "Your overheated skin itches."
+ )
+
+ has_limbs = list(
+ BP_TORSO = list("path" = /obj/item/organ/external/chest),
+ BP_GROIN = list("path" = /obj/item/organ/external/groin),
+ BP_HEAD = list("path" = /obj/item/organ/external/head),
+ BP_L_ARM = list("path" = /obj/item/organ/external/arm),
+ BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
+ BP_L_LEG = list("path" = /obj/item/organ/external/leg),
+ BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
+ BP_L_HAND = list("path" = /obj/item/organ/external/hand),
+ BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
+ BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
+ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
+ )
diff --git a/code/modules/mob/living/carbon/human/species/station/teshari.dm b/code/modules/mob/living/carbon/human/species/station/teshari.dm
index 6f243418895..2917dfcf39e 100644
--- a/code/modules/mob/living/carbon/human/species/station/teshari.dm
+++ b/code/modules/mob/living/carbon/human/species/station/teshari.dm
@@ -59,7 +59,7 @@
ambiguous_genders = TRUE
- spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_NO_POSIBRAIN
+ spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR
bump_flag = MONKEY
swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/_traits.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/_traits.dm
new file mode 100644
index 00000000000..6abec0e5170
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/_traits.dm
@@ -0,0 +1,7 @@
+#define TRAIT_TYPE_NEGATIVE -1
+#define TRAIT_TYPE_NEUTRAL 0
+#define TRAIT_TYPE_POSITIVE 1
+
+#define TRAIT_VARCHANGE_LESS_BETTER -1
+#define TRAIT_VARCHANGE_ALWAYS_OVERRIDE 0
+#define TRAIT_VARCHANGE_MORE_BETTER 1
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm
index 244a00b53a6..07c7d5c49ea 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm
@@ -1,5 +1,5 @@
/datum/trait/negative
- category = -1
+ category = TRAIT_TYPE_NEGATIVE
/datum/trait/negative/speed_slow
name = "Slowdown"
@@ -92,6 +92,8 @@
desc = "Increases your susceptibility to electric shocks by 100%"
cost = -1
var_changes = list("siemens_coefficient" = 2.0) //This makes you extremely weak to tasers.
+ custom_only = FALSE
+ varchange_type = TRAIT_VARCHANGE_LESS_BETTER
/datum/trait/negative/haemophilia
name = "Haemophilia - Organics only"
@@ -99,6 +101,8 @@
cost = -2
var_changes = list("bloodloss_rate" = 2)
can_take = ORGANICS
+ custom_only = FALSE
+ varchange_type = TRAIT_VARCHANGE_LESS_BETTER
/datum/trait/negative/hollow
name = "Hollow Bones/Aluminum Alloy"
@@ -116,6 +120,7 @@
desc = "Your light weight and poor balance make you very susceptible to unhelpful bumping. Think of it like a bowling ball versus a pin."
cost = -2
var_changes = list("lightweight" = 1)
+ custom_only = FALSE
/datum/trait/negative/neural_hypersensitivity
name = "Neural Hypersensitivity"
@@ -137,3 +142,29 @@
name = "Nitrogen Breather"
desc = "You breathe nitrogen instead of oxygen (which is poisonous to you). Incidentally, phoron isn't poisonous to breathe to you."
var_changes = list("breath_type" = "nitrogen", "poison_type" = "oxygen")
+
+/datum/trait/negative/monolingual
+ name = "Monolingual"
+ desc = "You are not good at learning languages."
+ cost = -1
+ var_changes = list("num_alternate_languages" = 0)
+ var_changes_pref = list("extra_languages" = -3)
+ custom_only = FALSE
+ varchange_type = TRAIT_VARCHANGE_MORE_BETTER
+
+/datum/trait/negative/dark_blind
+ name = "Nyctalopia"
+ desc = "You cannot see in dark at all."
+ cost = -1
+ var_changes = list("darksight" = 0)
+ custom_only = FALSE
+ varchange_type = TRAIT_VARCHANGE_MORE_BETTER
+
+/datum/trait/negative/bad_shooter
+ name = "Bad Shot"
+ desc = "You are terrible at aiming."
+ cost = -1
+ var_changes = list("gun_accuracy_mod" = -35)
+ custom_only = FALSE
+ varchange_type = TRAIT_VARCHANGE_MORE_BETTER
+
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
index a96772a5172..73a40ea9757 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
@@ -1,4 +1,5 @@
/datum/trait/neutral
+ category = TRAIT_TYPE_NEUTRAL
/datum/trait/neutral/metabolism_up
name = "Metabolism, Fast"
@@ -86,7 +87,7 @@
desc = "Makes you unable to gain nutrition from anything but blood. To compenstate, you get fangs that can be used to drain blood from prey."
cost = 0
custom_only = FALSE
- var_changes = list("organic_food_coeff" = 0)
+ var_changes = list("organic_food_coeff" = 0, "bloodsucker" = TRUE)
excludes = list(/datum/trait/neutral/bloodsucker_freeform)
/datum/trait/neutral/bloodsucker/apply(var/datum/species/S,var/mob/living/carbon/human/H)
@@ -98,6 +99,7 @@
desc = "You get fangs that can be used to drain blood from prey."
cost = 0
custom_only = FALSE
+ var_changes = list("bloodsucker" = TRUE)
excludes = list(/datum/trait/neutral/bloodsucker)
/datum/trait/neutral/bloodsucker_freeform/apply(var/datum/species/S,var/mob/living/carbon/human/H)
@@ -164,7 +166,7 @@
cost = 0
custom_only = FALSE
can_take = SYNTHETICS
- var_changes = list("organic_food_coeff" = 0, "synthetic_food_coeff" = 0.25)
+ var_changes = list("organic_food_coeff" = 0, "synthetic_food_coeff" = 0.6)
/datum/trait/neutral/glowing_eyes
name = "Glowing Eyes"
@@ -528,3 +530,55 @@
/datum/trait/neutral/submit_to_prey/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/proc/lend_prey_control
+
+/datum/trait/neutral/vertical_nom
+ name = "Vertical Nom"
+ desc = "Allows you to consume people from up above."
+ cost = 0
+ custom_only = FALSE
+
+/datum/trait/neutral/vertical_nom/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+ ..(S,H)
+ H.verbs |= /mob/living/proc/vertical_nom
+
+/datum/trait/neutral/micro_size_down
+ name = "Light Frame"
+ desc = "You are considered smaller than you are for micro interactions."
+ cost = 0
+ custom_only = FALSE
+ var_changes = list("micro_size_mod" = -0.15)
+
+/datum/trait/neutral/micro_size_up
+ name = "Heavy Frame"
+ desc = "You are considered bigger than you are for micro interactions."
+ cost = 0
+ custom_only = FALSE
+ var_changes = list("micro_size_mod" = 0.15)
+
+/datum/trait/neutral/digestion_value_up
+ name = "Highly Filling"
+ desc = "You provide notably more nutrition to anyone who makes a meal of you."
+ cost = 0
+ custom_only = FALSE
+ var_changes = list("digestion_nutrition_modifier" = 2)
+
+/datum/trait/neutral/digestion_value_up_plus
+ name = "Extremely Filling"
+ desc = "You provide a lot more nutrition to anyone who makes a meal of you."
+ cost = 0
+ custom_only = FALSE
+ var_changes = list("digestion_nutrition_modifier" = 3)
+
+/datum/trait/neutral/digestion_value_down
+ name = "Slightly Filling"
+ desc = "You provide notably less nutrition to anyone who makes a meal of you."
+ cost = 0
+ custom_only = FALSE
+ var_changes = list("digestion_nutrition_modifier" = 0.5)
+
+/datum/trait/neutral/digestion_value_down_plus
+ name = "Barely Filling"
+ desc = "You provide a lot less nutrition to anyone who makes a meal of you."
+ cost = 0
+ custom_only = FALSE
+ var_changes = list("digestion_nutrition_modifier" = 0.25)
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm
index 92f09ad2aba..b2b5449bf51 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm
@@ -1,5 +1,5 @@
/datum/trait/positive
- category = 1
+ category = TRAIT_TYPE_POSITIVE
/datum/trait/positive/speed_fast
name = "Haste"
@@ -119,6 +119,7 @@
desc = "You can fall from certain heights without suffering any injuries, be it via wings, lightness of frame or general dexterity."
cost = 1
var_changes = list("soft_landing" = TRUE)
+ custom_only = FALSE
/datum/trait/positive/hardfeet
name = "Hard Feet"
@@ -140,6 +141,8 @@
desc = "You're capable of parkour and can *flip over low objects (most of the time)."
cost = 2
var_changes = list("agility" = 90)
+ custom_only = FALSE
+ varchange_type = TRAIT_VARCHANGE_MORE_BETTER
/datum/trait/positive/snowwalker
name = "Snow Walker"
@@ -166,3 +169,29 @@
desc = "You can breathe under water."
cost = 1
var_changes = list("water_breather" = 1)
+
+/datum/trait/positive/cocoon_tf
+ name = "Cocoon Spinner"
+ desc = "Allows you to build a cocoon around yourself, using it to transform your body if you desire."
+ cost = 1
+
+/datum/trait/positive/cocoon_tf/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+ ..(S,H)
+ H.verbs |= /mob/living/carbon/human/proc/enter_cocoon
+
+/datum/trait/positive/linguist
+ name = "Linguist"
+ desc = "Allows you to have more languages."
+ cost = 1
+ var_changes = list("num_alternate_languages" = 6)
+ var_changes_pref = list("extra_languages" = 3)
+ custom_only = FALSE
+ varchange_type = TRAIT_VARCHANGE_MORE_BETTER
+
+/datum/trait/positive/good_shooter
+ name = "Eagle Eye"
+ desc = "You are better at aiming than most."
+ cost = 2
+ var_changes = list("gun_accuracy_mod" = 25)
+ custom_only = FALSE
+ varchange_type = TRAIT_VARCHANGE_MORE_BETTER
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm
index 91bf5fafeae..03e3966ff95 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm
@@ -4,23 +4,43 @@
var/cost = 0
var/sort = TRAIT_SORT_NORMAL // Sort order, 1 before 2 before 3 etc. Alphabetical is used for same-group traits.
- var/category = 0 // What category this trait is. -1 is Negative, 0 is Neutral, 1 is Positive
+ var/category = TRAIT_TYPE_NEUTRAL // What category this trait is. -1 is Negative, 0 is Neutral, 1 is Positive
var/list/var_changes // A list to apply to the custom species vars.
+ var/list/var_changes_pref // A list to apply to the preference vars.
var/list/excludes // Store a list of paths of traits to exclude, but done automatically if they change the same vars.
var/can_take = ORGANICS|SYNTHETICS // Can freaking synths use those.
var/list/banned_species // A list of species that can't take this trait
var/list/allowed_species // VORESTATION EDIT:chomp port. A list of species that CAN take this trait, use this if only a few species can use it. -shark
var/custom_only = TRUE // Trait only available for custom species
+ var/varchange_type = TRAIT_VARCHANGE_ALWAYS_OVERRIDE //Mostly used for non-custom species.
//Proc can be overridden lower to include special changes, make sure to call up though for the vars changes
/datum/trait/proc/apply(var/datum/species/S,var/mob/living/carbon/human/H)
ASSERT(S)
if(var_changes)
for(var/V in var_changes)
+ if((category == TRAIT_TYPE_POSITIVE && ((varchange_type == TRAIT_VARCHANGE_LESS_BETTER && var_changes[V] > S.vars[V]) || (varchange_type == TRAIT_VARCHANGE_MORE_BETTER && var_changes[V] < S.vars[V]))) || (category == TRAIT_TYPE_NEGATIVE && ((varchange_type == TRAIT_VARCHANGE_LESS_BETTER && var_changes[V] < S.vars[V]) || (varchange_type == TRAIT_VARCHANGE_MORE_BETTER && var_changes[V] > S.vars[V]))))
+ continue
S.vars[V] = var_changes[V]
return
+//Applying trait to preferences rather than just us.
+/datum/trait/proc/apply_pref(var/datum/preferences/P)
+ ASSERT(P)
+ if(var_changes_pref)
+ for(var/V in var_changes_pref)
+ P.vars[V] = var_changes_pref[V]
+ return
+
//Similar to the above, but for removing. Probably won't be called often/ever.
/datum/trait/proc/remove(var/datum/species/S)
ASSERT(S)
return
+
+//Similar to the above, but for removing.
+/datum/trait/proc/remove_pref(var/datum/preferences/P)
+ ASSERT(P)
+ if(var_changes_pref)
+ for(var/V in var_changes_pref)
+ P.vars[V] = initial(P.vars[V])
+ return
diff --git a/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm b/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm
index 17b31ffecc6..55ba92b58c9 100644
--- a/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm
+++ b/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm
@@ -34,8 +34,12 @@
/mob/living/carbon/human/proc/shapeshifter_select_hair,
/mob/living/carbon/human/proc/shapeshifter_select_hair_colors,
/mob/living/carbon/human/proc/shapeshifter_select_gender,
+ /mob/living/carbon/human/proc/shapeshifter_select_wings,
+ /mob/living/carbon/human/proc/shapeshifter_select_tail,
+ /mob/living/carbon/human/proc/shapeshifter_select_ears,
+ /mob/living/proc/set_size,
/mob/living/carbon/human/proc/regenerate,
- /mob/living/carbon/human/proc/shapeshifter_change_opacity,
+ /mob/living/carbon/human/proc/promethean_select_opaqueness,
/mob/living/carbon/human/proc/exit_vr
)
diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
index acd1b8f5405..f627a191fec 100644
--- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
+++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
@@ -67,7 +67,7 @@
to_chat(src, "Their plasma vessel is missing.")
return
- var/amount = input(usr, "Amount:", "Transfer Plasma to [M]") as num
+ var/amount = tgui_input_number(usr, "Amount:", "Transfer Plasma to [M]")
if (amount)
amount = abs(round(amount))
if(check_alien_ability(amount,0,O_PLASMA))
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 889ed2fdfa9..f008f661fda 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -66,35 +66,36 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
#define MOB_DAM_LAYER 4 //Injury overlay sprites like open wounds
#define SURGERY_LAYER 5 //Overlays for open surgical sites
#define UNDERWEAR_LAYER 6 //Underwear/bras/etc
-#define SHOES_LAYER_ALT 7 //Shoe-slot item (when set to be under uniform via verb)
-#define UNIFORM_LAYER 8 //Uniform-slot item
-#define ID_LAYER 9 //ID-slot item
-#define SHOES_LAYER 10 //Shoe-slot item
-#define GLOVES_LAYER 11 //Glove-slot item
-#define BELT_LAYER 12 //Belt-slot item
-#define SUIT_LAYER 13 //Suit-slot item
-#define TAIL_LAYER 14 //Some species have tails to render
-#define GLASSES_LAYER 15 //Eye-slot item
-#define BELT_LAYER_ALT 16 //Belt-slot item (when set to be above suit via verb)
-#define SUIT_STORE_LAYER 17 //Suit storage-slot item
-#define BACK_LAYER 18 //Back-slot item
-#define HAIR_LAYER 19 //The human's hair
-#define HAIR_ACCESSORY_LAYER 20 //VOREStation edit. Simply move this up a number if things are added.
-#define EARS_LAYER 21 //Both ear-slot items (combined image)
-#define EYES_LAYER 22 //Mob's eyes (used for glowing eyes)
-#define FACEMASK_LAYER 23 //Mask-slot item
-#define HEAD_LAYER 24 //Head-slot item
-#define HANDCUFF_LAYER 25 //Handcuffs, if the human is handcuffed, in a secret inv slot
-#define LEGCUFF_LAYER 26 //Same as handcuffs, for legcuffs
-#define L_HAND_LAYER 27 //Left-hand item
-#define R_HAND_LAYER 28 //Right-hand item
-#define WING_LAYER 29 //Wings or protrusions over the suit.
-#define TAIL_LAYER_ALT 30 //Modified tail-sprite layer. Tend to be larger.
-#define MODIFIER_EFFECTS_LAYER 31 //Effects drawn by modifiers
-#define FIRE_LAYER 32 //'Mob on fire' overlay layer
-#define MOB_WATER_LAYER 33 //'Mob submerged' overlay layer
-#define TARGETED_LAYER 34 //'Aimed at' overlay layer
-#define TOTAL_LAYERS 34 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list.
+#define TAIL_LOWER_LAYER 7 //Tail as viewed from the south
+#define SHOES_LAYER_ALT 8 //Shoe-slot item (when set to be under uniform via verb)
+#define UNIFORM_LAYER 9 //Uniform-slot item
+#define ID_LAYER 10 //ID-slot item
+#define SHOES_LAYER 11 //Shoe-slot item
+#define GLOVES_LAYER 12 //Glove-slot item
+#define BELT_LAYER 13 //Belt-slot item
+#define SUIT_LAYER 14 //Suit-slot item
+#define TAIL_UPPER_LAYER 15 //Some species have tails to render (As viewed from the N, E, or W)
+#define GLASSES_LAYER 16 //Eye-slot item
+#define BELT_LAYER_ALT 17 //Belt-slot item (when set to be above suit via verb)
+#define SUIT_STORE_LAYER 18 //Suit storage-slot item
+#define BACK_LAYER 19 //Back-slot item
+#define HAIR_LAYER 20 //The human's hair
+#define HAIR_ACCESSORY_LAYER 21 //VOREStation edit. Simply move this up a number if things are added.
+#define EARS_LAYER 22 //Both ear-slot items (combined image)
+#define EYES_LAYER 23 //Mob's eyes (used for glowing eyes)
+#define FACEMASK_LAYER 24 //Mask-slot item
+#define HEAD_LAYER 25 //Head-slot item
+#define HANDCUFF_LAYER 26 //Handcuffs, if the human is handcuffed, in a secret inv slot
+#define LEGCUFF_LAYER 27 //Same as handcuffs, for legcuffs
+#define L_HAND_LAYER 28 //Left-hand item
+#define R_HAND_LAYER 29 //Right-hand item
+#define WING_LAYER 30 //Wings or protrusions over the suit.
+#define TAIL_UPPER_LAYER_ALT 31 //Modified tail-sprite layer. Tend to be larger.
+#define MODIFIER_EFFECTS_LAYER 32 //Effects drawn by modifiers
+#define FIRE_LAYER 33 //'Mob on fire' overlay layer
+#define MOB_WATER_LAYER 34 //'Mob submerged' overlay layer
+#define TARGETED_LAYER 35 //'Aimed at' overlay layer
+#define TOTAL_LAYERS 35 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list.
//////////////////////////////////
/mob/living/carbon/human
@@ -133,6 +134,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
var/desired_scale_y = size_multiplier * icon_scale_y
desired_scale_x *= species.icon_scale_x
desired_scale_y *= species.icon_scale_y
+ vis_height = species.icon_height
appearance_flags |= PIXEL_SCALE
if(fuzzy)
appearance_flags &= ~PIXEL_SCALE
@@ -142,6 +144,17 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
var/matrix/M = matrix()
var/anim_time = 3
+ // VOREStation Edit Start: Porting Taur Loafing
+ if(tail_style?.can_loaf && resting) // Only call these if we're resting?
+ update_tail_showing()
+ return // No need to do the rest, we return early
+ /* // Commenting this out as sleeping is fucky
+ if(tail_style?.can_loaf && lying && sleeping) // If we're put under by anesthetic or fainting
+ update_tail_showing()
+ // return // No need to do the rest, we return early
+ */
+ // VOREStation Edit End
+
//Due to some involuntary means, you're laying now
if(lying && !resting && !sleeping)
anim_time = 1 //Thud
@@ -161,6 +174,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
else
M.Scale(desired_scale_x, desired_scale_y)//VOREStation Edit
M.Translate(0, (vis_height/2)*(desired_scale_y-1)) //VOREStation edit
+ if(tail_style?.can_loaf) // VOREStation Edit: Taur Loafing
+ update_tail_showing() // VOREStation Edit: Taur Loafing
layer = MOB_LAYER // Fix for a byond bug where turf entry order no longer matters
animate(src, transform = M, time = anim_time)
@@ -271,7 +286,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
for(var/M in part.markings)
icon_key += "[M][part.markings[M]["color"]]"
-
+
// VOREStation Edit Start
if(part.nail_polish)
icon_key += "_[part.nail_polish.icon]_[part.nail_polish.icon_state]_[part.nail_polish.color]"
@@ -369,6 +384,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
update_tail_showing()
update_wing_showing()
+
/mob/living/carbon/human/proc/update_skin()
if(QDESTROYING(src))
return
@@ -488,7 +504,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
face_standing.Blend(ears_s, ICON_OVERLAY)
if(ear_style?.em_block)
em_block_ears = em_block_image_generic(image(ears_s))
-
+
var/image/semifinal = image(face_standing, layer = BODY_LAYER+HAIR_LAYER, "pixel_y" = head_organ.head_offset)
if(em_block_ears)
semifinal.overlays += em_block_ears // Leaving this as overlays +=
@@ -802,8 +818,11 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(ubelt.show_above_suit)
belt_layer = BELT_LAYER_ALT
+
+ var/icon/c_mask = tail_style?.clip_mask
+
//NB: this uses a var from above
- overlays_standing[belt_layer] = belt.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_belt_str, default_icon = INV_BELT_DEF_ICON, default_layer = belt_layer)
+ overlays_standing[belt_layer] = belt.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_belt_str, default_icon = INV_BELT_DEF_ICON, default_layer = belt_layer, clip_mask = c_mask)
apply_layer(belt_layer)
@@ -831,7 +850,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
suit_sprite = INV_SUIT_DEF_ICON
var/icon/c_mask = null
- var/tail_is_rendered = (overlays_standing[TAIL_LAYER] || overlays_standing[TAIL_LAYER_ALT])
+ var/tail_is_rendered = (overlays_standing[TAIL_UPPER_LAYER] || overlays_standing[TAIL_UPPER_LAYER_ALT] || overlays_standing[TAIL_LOWER_LAYER])
var/valid_clip_mask = tail_style?.clip_mask
if(tail_is_rendered && valid_clip_mask && !(istype(suit) && suit.taurized)) //Clip the lower half of the suit off using the tail's clip mask for taurs since taur bodies aren't hidden.
@@ -944,20 +963,35 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
apply_layer(L_HAND_LAYER)
+/mob/living/carbon/human/proc/get_tail_layer()
+ var/list/lower_layer_dirs = list(SOUTH)
+ if(tail_style)
+ lower_layer_dirs = tail_style.lower_layer_dirs.Copy()
+
+ if(dir in lower_layer_dirs)
+ return TAIL_LOWER_LAYER
+ else
+ return TAIL_UPPER_LAYER
+
/mob/living/carbon/human/proc/update_tail_showing()
if(QDESTROYING(src))
return
- remove_layer(TAIL_LAYER)
- remove_layer(TAIL_LAYER_ALT) // Alt Tail Layer
+ remove_layer(TAIL_UPPER_LAYER)
+ remove_layer(TAIL_UPPER_LAYER_ALT)
+ remove_layer(TAIL_LOWER_LAYER)
- var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER
+ var/tail_layer = get_tail_layer()
+ if(src.tail_style && src.tail_style.clip_mask_state)
+ tail_layer = TAIL_UPPER_LAYER // Use default, let clip mask handle everything
+ if(tail_alt && tail_layer == TAIL_UPPER_LAYER)
+ tail_layer = TAIL_UPPER_LAYER_ALT
var/image/tail_image = get_tail_image()
if(tail_image)
- tail_image.layer = BODY_LAYER+used_tail_layer
- overlays_standing[used_tail_layer] = tail_image
- apply_layer(used_tail_layer)
+ tail_image.layer = BODY_LAYER+tail_layer
+ overlays_standing[tail_layer] = tail_image
+ apply_layer(tail_layer)
return
var/species_tail = species.get_tail(src) // Species tail icon_state prefix.
@@ -965,7 +999,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
//This one is actually not that bad I guess.
if(species_tail && !(wear_suit && wear_suit.flags_inv & HIDETAIL))
var/icon/tail_s = get_tail_icon()
- overlays_standing[used_tail_layer] = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+used_tail_layer) // Alt Tail Layer
+ overlays_standing[tail_layer] = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+tail_layer)
animate_tail_reset()
//TODO: Is this the appropriate place for this, and not on species...?
@@ -990,19 +1024,24 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
return tail_icon
/mob/living/carbon/human/proc/set_tail_state(var/t_state)
- var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // Alt Tail Layer
- var/image/tail_overlay = overlays_standing[used_tail_layer]
+ var/tail_layer = get_tail_layer()
+ if(src.tail_style && src.tail_style.clip_mask_state)
+ tail_layer = TAIL_UPPER_LAYER // Use default, let clip mask handle everything
+ if(tail_alt && tail_layer == TAIL_UPPER_LAYER)
+ tail_layer = TAIL_UPPER_LAYER_ALT
+ var/image/tail_overlay = overlays_standing[tail_layer]
- remove_layer(TAIL_LAYER)
- remove_layer(TAIL_LAYER_ALT)
+ remove_layer(TAIL_UPPER_LAYER)
+ remove_layer(TAIL_UPPER_LAYER_ALT)
+ remove_layer(TAIL_LOWER_LAYER)
if(tail_overlay)
- overlays_standing[used_tail_layer] = tail_overlay
+ overlays_standing[tail_layer] = tail_overlay
if(species.get_tail_animation(src))
tail_overlay.icon_state = t_state
. = tail_overlay
- apply_layer(used_tail_layer)
+ apply_layer(tail_layer)
//Not really once, since BYOND can't do that.
//Update this if the ability to flick() images or make looping animation start at the first frame is ever added.
@@ -1012,9 +1051,11 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
return
var/t_state = "[species.get_tail(src)]_once"
- var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // Alt Tail Layer
+ var/tail_layer = get_tail_layer()
+ if(src.tail_style && src.tail_style.clip_mask_state)
+ tail_layer = TAIL_UPPER_LAYER // Use default, let clip mask handle everything
- var/image/tail_overlay = overlays_standing[used_tail_layer] // Alt Tail Layer
+ var/image/tail_overlay = overlays_standing[tail_layer]
if(tail_overlay && tail_overlay.icon_state == t_state)
return //let the existing animation finish
@@ -1022,7 +1063,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(tail_overlay)
spawn(20)
//check that the animation hasn't changed in the meantime
- if(overlays_standing[used_tail_layer] == tail_overlay && tail_overlay.icon_state == t_state) // Alt Tail Layer
+ if(overlays_standing[tail_layer] == tail_overlay && tail_overlay.icon_state == t_state)
animate_tail_stop()
/mob/living/carbon/human/proc/animate_tail_start()
@@ -1176,7 +1217,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
var/icon/ears_s = new/icon("icon" = synthetic.icon, "icon_state" = "ears")
ears_s.Blend(rgb(src.r_ears, src.g_ears, src.b_ears), species.color_mult ? ICON_MULTIPLY : ICON_ADD)
return ears_s
-
+
if(ear_style && !(head && (head.flags_inv & BLOCKHEADHAIR)))
var/icon/ears_s = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.icon_state)
if(ear_style.do_colouration)
@@ -1205,11 +1246,13 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
//If you have a custom tail selected
if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !istaurtail(tail_style)))
- var/icon/tail_s = new/icon("icon" = tail_style.icon, "icon_state" = wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state)
+ var/icon/tail_s = new/icon("icon" = tail_style.icon, "icon_state" = (tail_style.can_loaf && resting) ? "[tail_style.icon_state]_loaf" : (wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state)) // VOREStation Edit: Taur Loafing
+ if(tail_style.can_loaf && !is_shifted)
+ pixel_y = (resting) ? -tail_style.loaf_offset : 0 //move player down, then taur up, to fit the overlays correctly // VOREStation Edit: Taur Loafing
if(tail_style.do_colouration)
tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode)
if(tail_style.extra_overlay)
- var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay)
+ var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = (tail_style?.can_loaf && resting) ? "[tail_style.extra_overlay]_loaf" : tail_style.extra_overlay) // VOREStation Edit: Taur Loafing
if(wagging && tail_style.ani_state)
overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay_w)
overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode)
@@ -1239,6 +1282,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(istaurtail(tail_style))
var/datum/sprite_accessory/tail/taur/taurtype = tail_style
working.pixel_x = -16
+ working.pixel_y = (tail_style.can_loaf && resting) ? tail_style.loaf_offset : 0 // VOREStation Edit: Taur Loafing
if(taurtype.can_ride && !riding_datum)
riding_datum = new /datum/riding/taur(src)
verbs |= /mob/living/carbon/human/proc/taur_mount
@@ -1272,7 +1316,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
#undef GLOVES_LAYER
#undef BELT_LAYER
#undef SUIT_LAYER
-#undef TAIL_LAYER
+#undef TAIL_UPPER_LAYER
+#undef TAIL_LOWER_LAYER
#undef GLASSES_LAYER
#undef BELT_LAYER_ALT
#undef SUIT_STORE_LAYER
diff --git a/code/modules/mob/living/carbon/lick_wounds.dm b/code/modules/mob/living/carbon/lick_wounds.dm
index bd726e4ac67..d9f33039c42 100644
--- a/code/modules/mob/living/carbon/lick_wounds.dm
+++ b/code/modules/mob/living/carbon/lick_wounds.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/human/proc/lick_wounds(var/mob/living/carbon/M) // Allows the user to lick themselves. Given how rarely this trait is used, I don't see an issue with a slight buff.
+/mob/living/carbon/human/proc/lick_wounds(var/mob/living/carbon/M as mob in range(1)) // Allows the user to lick themselves. Given how rarely this trait is used, I don't see an issue with a slight buff.
set name = "Lick Wounds"
set category = "Abilities"
set desc = "Disinfect and heal small wounds with your saliva."
@@ -83,4 +83,4 @@
W.bandage()
W.disinfect()
H.UpdateDamageIcon()
- playsound(src, 'sound/effects/ointment.ogg', 25)
\ No newline at end of file
+ playsound(src, 'sound/effects/ointment.ogg', 25)
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index 94776d570e9..a5e5fece268 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -17,6 +17,10 @@
//VOREStation Edit End
nest = null
+ if(isbelly(loc) && tf_mob_holder)
+ mind?.vore_death = TRUE
+ tf_mob_holder.mind?.vore_death = TRUE
+
for(var/datum/soul_link/S as anything in owned_soul_links)
S.owner_died(gibbed)
for(var/datum/soul_link/S as anything in shared_soul_links)
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 1182dcf34bd..6356bfb7b34 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -72,6 +72,8 @@
handle_vision()
+ handle_tf_holder() //VOREStation Addition
+
/mob/living/proc/handle_breathing()
return
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 051d3449d7f..53ee6f37893 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -32,6 +32,28 @@
nest = null
if(buckled)
buckled.unbuckle_mob(src, TRUE)
+ //VOREStation Addition Start
+ if(tf_mob_holder && tf_mob_holder.loc == src)
+ tf_mob_holder.ckey = ckey
+ if(isbelly(loc))
+ tf_mob_holder.loc = loc
+ tf_mob_holder.forceMove(loc)
+ else
+ var/turf/get_dat_turf = get_turf(src)
+ tf_mob_holder.loc = get_dat_turf
+ tf_mob_holder.forceMove(get_dat_turf)
+ QDEL_LIST_NULL(tf_mob_holder.vore_organs)
+ tf_mob_holder.vore_organs = list()
+ for(var/obj/belly/B as anything in vore_organs)
+ B.loc = tf_mob_holder
+ B.forceMove(tf_mob_holder)
+ B.owner = tf_mob_holder
+ tf_mob_holder.vore_organs |= B
+ vore_organs -= B
+
+ if(tf_mob_holder)
+ tf_mob_holder = null
+ //VOREStation Addition End
qdel(selected_image)
QDEL_NULL(vorePanel) //VOREStation Add
@@ -39,7 +61,6 @@
temp_language_sources = null //VOREStation Add
temp_languages = null //VOREStation Add
-
if(LAZYLEN(organs))
organs_by_name.Cut()
while(organs.len)
@@ -79,14 +100,21 @@
return 1
/mob/living/verb/succumb()
- set hidden = 1
-// if ((src.health < 0 && src.health > (5-src.getMaxHealth()))) // Health below Zero but above 5-away-from-death, as before, but variable
- if (src.health < 0 && stat != DEAD)
+ set name = "Succumb to death"
+ set category = "IC"
+ set desc = "Press this button if you are in crit and wish to die. Use this sparingly (ending a scene, no medical, etc.)"
+ var/confirm1 = tgui_alert(usr, "Pressing this button will kill you instantenously! Are you sure you wish to proceed?", "Confirm wish to succumb", list("No","Yes"))
+ var/confirm2 = "No"
+ if(confirm1 == "Yes")
+ confirm2 = tgui_alert(usr, "Pressing this buttom will really kill you, no going back", "Are you sure?", list("Yes", "No")) //Swapped answers to protect from accidental double clicks.
+ if (src.health < 0 && stat != DEAD && confirm1 == "Yes" && confirm2 == "Yes") // Checking both confirm1 and confirm2 for good measure. I don't trust TGUI.
src.death()
to_chat(src, "You have given up life and succumbed to death.")
else
if(stat == DEAD)
to_chat(src, "As much as you'd like, you can't die when already dead")
+ else if(confirm1 == "No" || confirm2 == "No")
+ to_chat(src, "You chose to live another day.")
else
to_chat(src, "You are not injured enough to succumb to death!")
@@ -172,6 +200,13 @@
if(!isnull(M.incoming_healing_percent))
amount *= M.incoming_healing_percent
+ //VOREStation Additon Start
+ if(tf_mob_holder && tf_mob_holder.loc == src)
+ var/dmgmultiplier = tf_mob_holder.maxHealth / maxHealth
+ dmgmultiplier *= amount
+ tf_mob_holder.adjustBruteLoss(dmgmultiplier)
+ //VOREStation Additon End
+
bruteloss = min(max(bruteloss + amount, 0),(getMaxHealth()*2))
updatehealth()
@@ -245,7 +280,12 @@
for(var/datum/modifier/M in modifiers)
if(!isnull(M.incoming_healing_percent))
amount *= M.incoming_healing_percent
-
+ //VOREStation Additon Start
+ if(tf_mob_holder && tf_mob_holder.loc == src)
+ var/dmgmultiplier = tf_mob_holder.maxHealth / maxHealth
+ dmgmultiplier *= amount
+ tf_mob_holder.adjustFireLoss(dmgmultiplier)
+ //VOREStation Additon End
fireloss = min(max(fireloss + amount, 0),(getMaxHealth()*2))
updatehealth()
@@ -1199,9 +1239,13 @@
if(!screen_icon)
screen_icon = new()
RegisterSignal(screen_icon, COMSIG_CLICK, .proc/character_setup_click)
- screen_icon.icon = HUD.ui_style
- screen_icon.color = HUD.ui_color
- screen_icon.alpha = HUD.ui_alpha
+ if(ispAI(user))
+ screen_icon.icon = 'icons/mob/pai_hud.dmi'
+ screen_icon.screen_loc = ui_acti
+ else
+ screen_icon.icon = HUD.ui_style
+ screen_icon.color = HUD.ui_color
+ screen_icon.alpha = HUD.ui_alpha
LAZYADD(HUD.other_important, screen_icon)
user.client?.screen += screen_icon
diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm
index 8f9a5c0f316..7a9279eaa08 100644
--- a/code/modules/mob/living/living_movement.dm
+++ b/code/modules/mob/living/living_movement.dm
@@ -291,9 +291,10 @@ default behaviour is:
var/mob/living/M = pulling
M.dragged(src, oldloc)
- pulling.Move(oldloc, 0, movetime) // the pullee tries to reach our previous position
- if(pulling && get_dist(src, pulling) > 1) // the pullee couldn't keep up
- stop_pulling()
+ if(pulling) // Check it AGAIN after previous steps just in case
+ pulling.Move(oldloc, 0, movetime) // the pullee tries to reach our previous position
+ if(get_dist(src, pulling) > 1) // the pullee couldn't keep up
+ stop_pulling()
if(!isturf(loc))
return
diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm
index 2125f2679e3..a2515085ad4 100644
--- a/code/modules/mob/living/living_powers.dm
+++ b/code/modules/mob/living/living_powers.dm
@@ -14,7 +14,7 @@
return
if(status_flags & HIDING)
- reveal("You have stopped hiding.")
+ reveal(FALSE, "You have stopped hiding.")
else
status_flags |= HIDING
layer = HIDING_LAYER //Just above cables with their 2.44
diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm
index a570ed60dbe..ad35515ef1e 100644
--- a/code/modules/mob/living/living_vr.dm
+++ b/code/modules/mob/living/living_vr.dm
@@ -12,13 +12,13 @@
var/sayselect = tgui_alert(src, "Which say-verb do you wish to customize?", "Select Verb", list("Say","Whisper","Ask (?)","Exclaim/Shout/Yell (!)","Cancel"))
if(sayselect == "Say")
- custom_say = lowertext(sanitize(input(usr, "This word or phrase will appear instead of 'says': [src] says, \"Hi.\"", "Custom Say", null) as text))
+ custom_say = lowertext(sanitize(tgui_input_text(usr, "This word or phrase will appear instead of 'says': [src] says, \"Hi.\"", "Custom Say", null)))
else if(sayselect == "Whisper")
- custom_whisper = lowertext(sanitize(input(usr, "This word or phrase will appear instead of 'whispers': [src] whispers, \"Hi...\"", "Custom Whisper", null) as text))
+ custom_whisper = lowertext(sanitize(tgui_input_text(usr, "This word or phrase will appear instead of 'whispers': [src] whispers, \"Hi...\"", "Custom Whisper", null)))
else if(sayselect == "Ask (?)")
- custom_ask = lowertext(sanitize(input(usr, "This word or phrase will appear instead of 'asks': [src] asks, \"Hi?\"", "Custom Ask", null) as text))
+ custom_ask = lowertext(sanitize(tgui_input_text(usr, "This word or phrase will appear instead of 'asks': [src] asks, \"Hi?\"", "Custom Ask", null)))
else if(sayselect == "Exclaim/Shout/Yell (!)")
- custom_exclaim = lowertext(sanitize(input(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [src] exclaims, \"Hi!\"", "Custom Exclaim", null) as text))
+ custom_exclaim = lowertext(sanitize(tgui_input_text(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [src] exclaims, \"Hi!\"", "Custom Exclaim", null)))
else
return
@@ -27,10 +27,82 @@
set desc = "Sets OOC notes about yourself or your RP preferences or status."
set category = "OOC"
- var/new_metadata = sanitize(input(usr, "Enter any information you'd like others to see, such as Roleplay-preferences. This will not be saved permanently, only for this round.", "Game Preference" , html_decode(ooc_notes)) as message, extra = 0)
+ var/new_metadata = sanitize(tgui_input_text(usr, "Enter any information you'd like others to see, such as Roleplay-preferences. This will not be saved permanently, only for this round.", "Game Preference" , html_decode(ooc_notes), multiline = TRUE, prevent_enter = TRUE), extra = 0)
if(new_metadata && CanUseTopic(usr))
ooc_notes = new_metadata
to_chat(usr, "OOC notes updated.")
log_admin("[key_name(usr)] updated their OOC notes mid-round.")
+/mob/living/verb/set_voice_freq()
+ set name = "Set Voice Frequency"
+ set desc = "Sets your voice frequency to be higher or lower pitched!"
+ set category = "OOC"
+ var/list/preset_voice_freqs = list("high" = MAX_VOICE_FREQ, "middle-high" = 56250, "middle" = 425000, "middle-low"= 28750, "low" = MIN_VOICE_FREQ, "custom" = 1, "random" = 0)
+ var/choice = tgui_input_list(src, "What would you like to set your voice frequency to?", "Voice Frequency", preset_voice_freqs)
+ if(!choice)
+ return
+ choice = preset_voice_freqs[choice]
+ if(choice == 0)
+ voice_freq = choice
+ return
+ else if(choice == 1)
+ choice = tgui_input_number(src, "Choose your character's voice frequency, ranging from [MIN_VOICE_FREQ] to [MAX_VOICE_FREQ]", "Custom Voice Frequency", null, MAX_VOICE_FREQ, MIN_VOICE_FREQ, round_value = TRUE)
+ else if(choice > MAX_VOICE_FREQ)
+ choice = MAX_VOICE_FREQ
+ else if(choice < MIN_VOICE_FREQ)
+ choice = MIN_VOICE_FREQ
+ voice_freq = choice
+
+/mob/living/verb/set_voice_type()
+ set name = "Set Voice Type"
+ set desc = "Sets your voice style!"
+ set category = "OOC"
+
+ var/list/possible_voice_types = list(
+ "beep-boop",
+ "goon speak 1",
+ "goon speak 2",
+ "goon speak 3",
+ "goon speak 4",
+ "goon speak blub",
+ "goon speak bottalk",
+ "goon speak buwoo",
+ "goon speak cow",
+ "goon speak lizard",
+ "goon speak pug",
+ "goon speak pugg",
+ "goon speak roach",
+ "goon speak skelly")
+ var/choice = tgui_input_list(usr, "Which set of sounds would you like to use for your character's speech sounds?", "Voice Sounds", possible_voice_types)
+ if(!choice)
+ voice_sounds_list = talk_sound
+ switch(choice)
+ if("beep-boop")
+ voice_sounds_list = talk_sound
+ if("goon speak 1")
+ voice_sounds_list = goon_speak_one_sound
+ if("goon speak 2")
+ voice_sounds_list = goon_speak_two_sound
+ if("goon speak 3")
+ voice_sounds_list = goon_speak_three_sound
+ if("goon speak 4")
+ voice_sounds_list = goon_speak_four_sound
+ if("goon speak blub")
+ voice_sounds_list = goon_speak_blub_sound
+ if("goon speak bottalk")
+ voice_sounds_list = goon_speak_bottalk_sound
+ if("goon speak buwoo")
+ voice_sounds_list = goon_speak_buwoo_sound
+ if("goon speak cow")
+ voice_sounds_list = goon_speak_cow_sound
+ if("goon speak lizard")
+ voice_sounds_list = goon_speak_lizard_sound
+ if("goon speak pug")
+ voice_sounds_list = goon_speak_pug_sound
+ if("goon speak pugg")
+ voice_sounds_list = goon_speak_pugg_sound
+ if("goon speak roach")
+ voice_sounds_list = goon_speak_roach_sound
+ if("goon speak skelly")
+ voice_sounds_list = goon_speak_skelly_sound
diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm
index 5d2836779bf..d6aec7d322b 100644
--- a/code/modules/mob/living/login.dm
+++ b/code/modules/mob/living/login.dm
@@ -13,16 +13,52 @@
to_chat(src,"Mob AI disabled while you are controlling the mob.")
AddComponent(/datum/component/character_setup)
-
+
// Vore stuff
verbs |= /mob/living/proc/escapeOOC
verbs |= /mob/living/proc/lick
verbs |= /mob/living/proc/smell
verbs |= /mob/living/proc/switch_scaling
-
+
if(!no_vore)
verbs |= /mob/living/proc/vorebelly_printout
if(!vorePanel)
AddComponent(/datum/component/vore_panel)
+ //VOREStation Add Start
+ if(!voice_sounds_list.len || !voice_sounds_list)
+ if(client.prefs.voice_sound)
+ var/prefsound = client.prefs.voice_sound
+ switch(prefsound)
+ if("beep-boop")
+ voice_sounds_list = talk_sound
+ if("goon speak 1")
+ voice_sounds_list = goon_speak_one_sound
+ if("goon speak 2")
+ voice_sounds_list = goon_speak_two_sound
+ if("goon speak 3")
+ voice_sounds_list = goon_speak_three_sound
+ if("goon speak 4")
+ voice_sounds_list = goon_speak_four_sound
+ if("goon speak blub")
+ voice_sounds_list = goon_speak_blub_sound
+ if("goon speak bottalk")
+ voice_sounds_list = goon_speak_bottalk_sound
+ if("goon speak buwoo")
+ voice_sounds_list = goon_speak_buwoo_sound
+ if("goon speak cow")
+ voice_sounds_list = goon_speak_cow_sound
+ if("goon speak lizard")
+ voice_sounds_list = goon_speak_lizard_sound
+ if("goon speak pug")
+ voice_sounds_list = goon_speak_pug_sound
+ if("goon speak pugg")
+ voice_sounds_list = goon_speak_pugg_sound
+ if("goon speak roach")
+ voice_sounds_list = goon_speak_roach_sound
+ if("goon speak skelly")
+ voice_sounds_list = goon_speak_skelly_sound
+ else
+ voice_sounds_list = talk_sound
+ //VOREStation Add End
return .
diff --git a/code/modules/mob/living/organs.dm b/code/modules/mob/living/organs.dm
index 133961a6319..2e03e66fb91 100644
--- a/code/modules/mob/living/organs.dm
+++ b/code/modules/mob/living/organs.dm
@@ -35,4 +35,10 @@
if(!ispath(E))
E.droplimb(0,DROPLIMB_EDGE,1)
+ //VOREStation Addition Start
+ if(tf_mob_holder && tf_mob_holder.loc == src)
+ tf_mob_holder.revert_mob_tf()
+ tf_mob_holder.gib()
+ //VOREStation Addition End
+
..()
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index d10a1d3f0d7..d98430d3be5 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -18,6 +18,7 @@ var/list/department_radio_keys = list(
":p" = "AI Private", ".p" = "AI Private",
":y" = "Explorer", ".y" = "Explorer",
":a" = "Talon", ".a" = "Talon", //VOREStation Add,
+ ":g" = "Casino", ".g" = "Casino",
":R" = "right ear", ".R" = "right ear",
":L" = "left ear", ".L" = "left ear",
@@ -37,6 +38,7 @@ var/list/department_radio_keys = list(
":P" = "AI Private", ".P" = "AI Private",
":Y" = "Explorer", ".Y" = "Explorer",
":A" = "Talon", ".A" = "Talon", //VOREStation Add,
+ ":G" = "Casino", ".G" = "Casino",
// Cyrillic characters on the same keys on the Russian QWERTY (phonetic) layout
":к" = "right ear", ".к" = "right ear",
@@ -57,7 +59,8 @@ var/list/department_radio_keys = list(
":м" = "Service", ".м" = "Service",
":з" = "AI Private", ".з" = "AI Private",
":н" = "Explorer", ".н" = "Explorer",
- ":Ñ„" = "Talon", ".Ñ„" = "Talon" //VOREStation Add
+ ":Ñ„" = "Talon", ".Ñ„" = "Talon", //VOREStation Add
+ ":п" = "Casino", ".п" = "Casino",
)
@@ -141,7 +144,7 @@ var/list/channel_to_radio_key = new
return "asks"
return verb
-/mob/living/say(var/message, var/whispering = 0)
+/mob/living/say(var/message, var/datum/language/speaking = null, var/whispering = 0)
//If you're muted for IC chat
if(client)
if(message)
@@ -254,6 +257,9 @@ var/list/channel_to_radio_key = new
//Default range and italics, may be overridden past here
var/message_range = world.view
var/italics = 0
+ var/do_sound = TRUE
+ if(!voice_sounds_list || !voice_sounds_list.len)
+ do_sound = FALSE
//Speaking into radios
if(used_radios.len)
@@ -295,8 +301,9 @@ var/list/channel_to_radio_key = new
//Handle nonverbal languages here
for(var/datum/multilingual_say_piece/S in message_pieces)
- if(S.speaking.flags & NONVERBAL)
+ if((S.speaking.flags & NONVERBAL) || (S.speaking.flags & INAUDIBLE))
custom_emote(1, "[pick(S.speaking.signlang_verb)].")
+ do_sound = FALSE
//These will contain the main receivers of the message
var/list/listening = list()
@@ -361,18 +368,18 @@ var/list/channel_to_radio_key = new
var/runechat_enabled = M.client?.is_preference_enabled(/datum/client_preference/runechat_mob)
if(dst <= message_range || (M.stat == DEAD && !forbid_seeing_deadchat)) //Inside normal message range, or dead with ears (handled in the view proc)
- if(M.client && !runechat_enabled)
- var/image/I1 = listening[M] || speech_bubble
- images_to_clients[I1] |= M.client
- M << I1
- M.hear_say(message_pieces, verb, italics, src, speech_sound, sound_vol)
+ if(M.hear_say(message_pieces, verb, italics, src, speech_sound, sound_vol))
+ if(M.client && !runechat_enabled)
+ var/image/I1 = listening[M] || speech_bubble
+ images_to_clients[I1] |= M.client
+ M << I1
if(whispering && !isobserver(M)) //Don't even bother with these unless whispering
if(dst > message_range && dst <= w_scramble_range) //Inside whisper scramble range
- if(M.client && !runechat_enabled)
- var/image/I2 = listening[M] || speech_bubble
- images_to_clients[I2] |= M.client
- M << I2
- M.hear_say(stars_all(message_pieces), verb, italics, src, speech_sound, sound_vol*0.2)
+ if(M.hear_say(stars_all(message_pieces), verb, italics, src, speech_sound, sound_vol*0.2))
+ if(M.client && !runechat_enabled)
+ var/image/I2 = listening[M] || speech_bubble
+ images_to_clients[I2] |= M.client
+ M << I2
if(dst > w_scramble_range && dst <= world.view) //Inside whisper 'visible' range
M.show_message("[name] [w_not_heard].", 2)
@@ -393,30 +400,50 @@ var/list/channel_to_radio_key = new
C.images -= I
qdel(I)
+ var/ourfreq = null
+ if(voice_freq > 0 )
+ ourfreq = voice_freq
//Log the message to file
if(message_mode)
message = "([message_mode == "headset" ? "Common" : capitalize(message_mode)]) [message]" //Adds radio keys used if available
if(whispering)
+ if(do_sound && message)
+ playsound(T, pick(voice_sounds_list), 25, TRUE, extrarange = -6, falloff = 1 , is_global = TRUE, frequency = ourfreq, ignore_walls = FALSE, preference = /datum/client_preference/whisper_sounds)
+
log_whisper(message, src)
else
+ if(do_sound && message)
+ playsound(T, pick(voice_sounds_list), 75, TRUE, falloff = 1 , is_global = TRUE, frequency = ourfreq, ignore_walls = FALSE, preference = /datum/client_preference/say_sounds)
log_say(message, src)
return 1
-/mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language)
+/mob/living/proc/say_signlang(var/message, var/verb="gestures", var/verb_understood="gestures", var/datum/language/language, var/type = 1)
var/turf/T = get_turf(src)
//We're in something, gesture to people inside the same thing
if(loc != T)
for(var/mob/M in loc)
- M.hear_signlang(message, verb, language, src)
+ M.hear_signlang(message, verb, verb_understood, language, src, type)
//We're on a turf, gesture to visible as if we were a normal language
else
+ var/low_range = FALSE
+ if(T && type == 2) // type 2 is audible signlang. yes. sue me.
+ //Air is too thin to carry sound at all, contact speech only
+ var/datum/gas_mixture/environment = T.return_air()
+ var/pressure = environment ? environment.return_pressure() : 0
+ if(pressure < SOUND_MINIMUM_PRESSURE)
+ low_range = TRUE
+
var/list/potentials = get_mobs_and_objs_in_view_fast(T, world.view)
var/list/mobs = potentials["mobs"]
for(var/mob/M as anything in mobs)
- M.hear_signlang(message, verb, language, src)
+ if(low_range && !(M in range(1, src)))
+ continue
+ M.hear_signlang(message, verb, verb_understood, language, src, type)
var/list/objs = potentials["objs"]
for(var/obj/O as anything in objs)
+ if(low_range && !(O in range(1, src)))
+ continue
O.hear_signlang(message, verb, language, src)
return 1
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 0b32c20166b..59df869f6c2 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -51,7 +51,7 @@ var/list/ai_verbs_default = list(
var/obj/machinery/camera/camera = null
var/aiRestorePowerRoutine = 0
var/viewalerts = 0
- var/icon/holo_icon//Default is assigned when AI is created.
+ var/icon/holo_icon //Default is assigned when AI is created.
var/list/connected_robots = list()
var/obj/item/device/pda/ai/aiPDA = null
var/obj/item/device/communicator/aiCommunicator = null
@@ -162,7 +162,6 @@ var/list/ai_verbs_default = list(
add_language(LANGUAGE_SIIK, 1)
add_language(LANGUAGE_AKHANI, 1)
add_language(LANGUAGE_SKRELLIAN, 1)
- add_language(LANGUAGE_SKRELLIANFAR, 0)
add_language(LANGUAGE_TRADEBAND, 1)
add_language(LANGUAGE_GUTTER, 1)
add_language(LANGUAGE_EAL, 1)
@@ -374,7 +373,7 @@ var/list/ai_verbs_default = list(
if(message_cooldown)
to_chat(src, "Please allow one minute to pass between announcements.")
return
- var/input = input(usr, "Please write a message to announce to the station crew.", "A.I. Announcement")
+ var/input = tgui_input_text(usr, "Please write a message to announce to the station crew.", "A.I. Announcement")
if(!input)
return
@@ -429,7 +428,7 @@ var/list/ai_verbs_default = list(
if(emergency_message_cooldown)
to_chat(usr, "Arrays recycling. Please stand by.")
return
- var/input = sanitize(input(usr, "Please choose a message to transmit to [using_map.boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", ""))
+ var/input = sanitize(tgui_input_text(usr, "Please choose a message to transmit to [using_map.boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", ""))
if(!input)
return
CentCom_announce(input, usr)
@@ -798,9 +797,11 @@ var/list/ai_verbs_default = list(
src.aiRadio.interact(src)
/mob/living/silicon/ai/proc/sensor_mode()
- set name = "Set Sensor Augmentation"
+ set name = "Toggle Sensor Augmentation" //VOREStation Add
set category = "AI Settings"
set desc = "Augment visual feed with internal sensor overlays"
+ sensor_type = !sensor_type //VOREStation Add
+ to_chat(usr, "You [sensor_type ? "enable" : "disable"] your sensors.") //VOREStation Add
toggle_sensor_mode()
/mob/living/silicon/ai/proc/toggle_hologram_movement()
diff --git a/code/modules/mob/living/silicon/emote.dm b/code/modules/mob/living/silicon/emote.dm
index 153e05a7b6f..a471c62b220 100644
--- a/code/modules/mob/living/silicon/emote.dm
+++ b/code/modules/mob/living/silicon/emote.dm
@@ -1,14 +1,23 @@
var/list/_silicon_default_emotes = list(
/decl/emote/audible/synth,
- /decl/emote/audible/synth/ping,
+ /decl/emote/audible/synth/beep,
/decl/emote/audible/synth/buzz,
/decl/emote/audible/synth/confirm,
/decl/emote/audible/synth/deny,
/decl/emote/audible/synth/scary,
/decl/emote/audible/synth/dwoop,
+ /decl/emote/audible/synth/boop,
+ /decl/emote/audible/synth/robochirp,
/decl/emote/audible/synth/security,
/decl/emote/audible/synth/security/halt
)
/mob/living/silicon/get_available_emotes()
return global._silicon_default_emotes
+
+/mob/living/silicon/pai/get_available_emotes()
+
+ var/list/fulllist = _silicon_default_emotes
+ fulllist |= _robot_default_emotes
+ fulllist |= _human_default_emotes
+ return fulllist
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm
index 4989cecacec..6290b72f51c 100644
--- a/code/modules/mob/living/silicon/pai/death.dm
+++ b/code/modules/mob/living/silicon/pai/death.dm
@@ -1,15 +1,16 @@
-/mob/living/silicon/pai/death(gibbed)
+//VOREStation Edit - Let's make it so that pAIs don't just always cease to be when they die! It would be cool if we could fix them.
+/mob/living/silicon/pai/death(gibbed,deathmessage="fizzles out and clatters to the floor...")
+// set_respawn_timer()
release_vore_contents()
+ close_up(TRUE)
if(card)
- card.removePersonality()
- //if(gibbed) //VOREStation Edit Start. This prevents pAIs from joining back into their card after the card's killed
- src.loc = get_turf(card)
- qdel(card)
- /*else
- close_up()
- qdel(card)*/ //VOREStation Edit End.
- if(mind)
- qdel(mind)
- ..(gibbed)
- ghostize()
- qdel(src)
+ card.cut_overlays()
+ card.setEmotion(16)
+ card.damage_random_component()
+
+ if(gibbed)
+ qdel(card)
+ ..(gibbed)
+ else
+ card.add_overlay("pai-dead")
+ ..(gibbed,deathmessage)
diff --git a/code/modules/mob/living/silicon/pai/examine.dm b/code/modules/mob/living/silicon/pai/examine.dm
index b6890470c98..9c009dcf6f4 100644
--- a/code/modules/mob/living/silicon/pai/examine.dm
+++ b/code/modules/mob/living/silicon/pai/examine.dm
@@ -9,16 +9,10 @@
// VOREStation Edit: Start
. += attempt_vr(src,"examine_bellies",args) //VOREStation Edit
- if(ooc_notes)
- . += "OOC Notes: \[View\]"
- // VOREStation Edit: End
-
- . += "*---------*"
-
if(print_flavor_text()) . += "\n[print_flavor_text()]\n"
-
+ // VOREStation Edit: End
+ . += "*---------*"
if (pose)
if(!findtext(pose, regex("\[.?!]$"))) // Will be zero if the last character is not a member of [.?!]
pose = addtext(pose,".") //Makes sure all emotes end with a period.
. += " It is [pose]" //Extra intentional
-
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm
index e4f461179d4..6e7e8a42a10 100644
--- a/code/modules/mob/living/silicon/pai/life.dm
+++ b/code/modules/mob/living/silicon/pai/life.dm
@@ -1,8 +1,5 @@
/mob/living/silicon/pai/Life()
- if (src.stat == 2)
- return
-
if(src.cable)
if(get_dist(src, src.cable) > 1)
var/turf/T = get_turf_or_move(src.loc)
@@ -13,6 +10,21 @@
qdel(src.cable)
src.cable = null
+ if (src.stat == DEAD)
+ return
+
+ if(card.cell != PP_FUNCTIONAL|| card.processor != PP_FUNCTIONAL || card.board != PP_FUNCTIONAL || card.capacitor != PP_FUNCTIONAL)
+ death()
+
+ if(card.projector != PP_FUNCTIONAL && card.emitter != PP_FUNCTIONAL)
+ if(loc != card)
+ close_up()
+ to_chat(src, "ERROR: System malfunction. Service required!")
+ else if(card.projector != PP_FUNCTIONAL|| card.emitter != PP_FUNCTIONAL)
+ if(prob(5))
+ close_up()
+ to_chat(src, "ERROR: System malfunction. Service recommended!")
+
handle_regular_hud_updates()
handle_vision()
@@ -24,8 +36,11 @@
handle_statuses()
if(health <= 0)
- death(null,"gives one shrill beep before falling lifeless.")
-
+ card.death_damage()
+ death(null,"fizzles out and clatters to the floor...")
+ else if(health < maxHealth && istype(src.loc , /obj/item/device/paicard))
+ adjustBruteLoss(-0.5)
+ adjustFireLoss(-0.5)
/mob/living/silicon/pai/updatehealth()
if(status_flags & GODMODE)
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 9cf7f5f62e5..d4ad6d75b8e 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -22,7 +22,7 @@
var/list/software = list()
var/userDNA // The DNA string of our assigned user
var/obj/item/device/paicard/card // The card we inhabit
- var/obj/item/device/radio/radio // Our primary radio
+ var/obj/item/device/radio/borg/pai/radio // Our primary radio
var/obj/item/device/communicator/integrated/communicator // Our integrated communicator.
var/chassis = "pai-repairbot" // A record of your chosen chassis.
@@ -31,7 +31,7 @@
"Cat" = "pai-cat",
"Mouse" = "pai-mouse",
"Monkey" = "pai-monkey",
- "Corgi" = "pai-borgi",
+ "Borgi" = "pai-borgi",
"Fox" = "pai-fox",
"Parrot" = "pai-parrot",
"Rabbit" = "pai-rabbit",
@@ -47,7 +47,13 @@
"Hawk" = "pai-hawk",
"Duffel" = "pai-duffel",
"Rat" = "rat",
- "Panther" = "panther"
+ "Panther" = "panther",
+ "Cyber Elf" = "cyberelf",
+ "Teppi" = "teppi",
+ "Catslug" = "catslug",
+ "Car" = "car",
+ "Type One" = "typeone",
+ "Type Thirteen" = "13"
//VOREStation Addition End
)
@@ -79,8 +85,7 @@
var/obj/item/device/pda/ai/pai/pda = null
- var/secHUD = 0 // Toggles whether the Security HUD is active or not
- var/medHUD = 0 // Toggles whether the Medical HUD is active or not
+ var/paiHUD = 0 // Toggles whether the AR HUD is active or not
var/medical_cannotfind = 0
var/datum/data/record/medicalActive1 // Datacore record declarations for record software
@@ -99,6 +104,7 @@
var/translator_on = 0 // keeps track of the translator module
var/current_pda_messaging = null
+ var/our_icon_rotation = 0
/mob/living/silicon/pai/Initialize()
@@ -112,7 +118,7 @@
communicator = new(src)
if(card)
if(!card.radio)
- card.radio = new /obj/item/device/radio(src.card)
+ card.radio = new /obj/item/device/radio/borg/pai(src.card)
radio = card.radio
//Default languages without universal translator software
@@ -121,7 +127,7 @@
add_language(LANGUAGE_GUTTER, 1)
add_language(LANGUAGE_EAL, 1)
add_language(LANGUAGE_TERMINUS, 1)
- add_language(LANGUAGE_SIGN, 0)
+ add_language(LANGUAGE_SIGN, 1)
verbs += /mob/living/silicon/pai/proc/choose_chassis
verbs += /mob/living/silicon/pai/proc/choose_verbs
@@ -135,16 +141,17 @@
pda.ownjob = "Personal Assistant"
pda.owner = text("[]", src)
pda.name = pda.owner + " (" + pda.ownjob + ")"
+
var/datum/data/pda/app/messenger/M = pda.find_program(/datum/data/pda/app/messenger)
if(M)
- M.toff = TRUE
+ M.toff = FALSE
/mob/living/silicon/pai/Login()
..()
// Vorestation Edit: Meta Info for pAI
if (client.prefs)
ooc_notes = client.prefs.metadata
-
+ src << sound('sound/effects/pai_login.ogg', volume = 75) //VOREStation Add
// this function shows the information about being silenced as a pAI in the Status panel
/mob/living/silicon/pai/proc/show_silenced()
@@ -171,7 +178,8 @@
/mob/living/silicon/pai/emp_act(severity)
// Silence for 2 minutes
- // 20% chance to kill
+ // 20% chance to damage critical components
+ // 50% chance to damage a non critical component
// 33% chance to unbind
// 33% chance to change prime directive (based on severity)
// 33% chance of no additional effect
@@ -180,10 +188,12 @@
to_chat(src, "Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete.")
if(prob(20))
var/turf/T = get_turf_or_move(src.loc)
+ card.death_damage()
for (var/mob/M in viewers(T))
M.show_message("A shower of sparks spray from [src]'s inner workings.", 3, "You hear and smell the ozone hiss of electrical sparks being expelled violently.", 2)
- return src.death(0)
-
+ return
+ if(prob(50))
+ card.damage_random_component(TRUE)
switch(pick(1,2,3))
if(1)
src.master = null
@@ -248,21 +258,24 @@
if(src.loc != card)
return
+ if(card.projector != PP_FUNCTIONAL && card.emitter != PP_FUNCTIONAL)
+ to_chat(src, "ERROR: System malfunction. Service required!")
+
if(world.time <= last_special)
+ to_chat(src, "You can't unfold yet.")
return
last_special = world.time + 100
+ if(istype(card.loc, /obj/machinery)) // VOREStation edit, this statement allows pAIs stuck in a machine to eject themselves.
+ var/obj/machinery/M = card.loc
+ M.ejectpai()
//I'm not sure how much of this is necessary, but I would rather avoid issues.
if(istype(card.loc,/obj/item/rig_module))
to_chat(src, "There is no room to unfold inside this rig module. You're good and stuck.")
return 0
else if(istype(card.loc,/mob))
var/mob/holder = card.loc
- var/datum/belly/inside_belly = check_belly(card) //VOREStation edit.
- if(inside_belly) //VOREStation edit.
- to_chat(src, "There is no room to unfold in here. You're good and stuck.") //VOREStation edit.
- return 0 //VOREStation edit.
if(ishuman(holder))
var/mob/living/carbon/human/H = holder
for(var/obj/item/organ/external/affecting in H.organs)
@@ -272,6 +285,9 @@
H.visible_message("\The [src] explodes out of \the [H]'s [affecting.name] in shower of gore!")
break
holder.drop_from_inventory(card)
+ else if(isbelly(card.loc)) //VOREStation edit.
+ to_chat(src, "There is no room to unfold in here. You're good and stuck.") //VOREStation edit.
+ return 0 //VOREStation edit.
else if(istype(card.loc,/obj/item/device/pda))
var/obj/item/device/pda/holder = card.loc
holder.pai = null
@@ -282,12 +298,13 @@
card.forceMove(src)
card.screen_loc = null
+ canmove = TRUE
var/turf/T = get_turf(src)
if(istype(T)) T.visible_message("[src] folds outwards, expanding into a mobile form.")
- verbs += /mob/living/silicon/pai/proc/pai_nom //VOREStation edit
- verbs += /mob/living/proc/set_size //VOREStation edit
- verbs += /mob/living/proc/shred_limb //VORREStation edit
+ verbs |= /mob/living/silicon/pai/proc/pai_nom
+ verbs |= /mob/living/proc/vertical_nom
+ update_icon()
/mob/living/silicon/pai/verb/fold_up()
set category = "pAI Commands"
@@ -300,6 +317,7 @@
return
if(world.time <= last_special)
+ to_chat(src, "You can't fold up yet.")
return
close_up()
@@ -346,14 +364,54 @@
var/obj/item/weapon/rig/rig = src.get_rig()
if(istype(rig))
rig.force_rest(src)
+ return
+ else if(chassis == "13")
+ resting = !resting
+ //update_transform() I want this to make you ROTATE like normal HUMANS do! But! There's lots of problems and I don't know how to fix them!
else
resting = !resting
icon_state = resting ? "[chassis]_rest" : "[chassis]"
update_icon() //VOREStation edit
- to_chat(src, "You are now [resting ? "resting" : "getting up"]")
+ to_chat(src, "You are now [resting ? "resting" : "getting up"]")
canmove = !resting
+/*
+/mob/living/silicon/pai/update_transform()
+
+ var/desired_scale_x = size_multiplier * icon_scale_x
+ var/desired_scale_y = size_multiplier * icon_scale_y
+
+ // Now for the regular stuff.
+ var/matrix/M = matrix()
+ M.Scale(desired_scale_x, desired_scale_y)
+ M.Translate(0, (vis_height/2)*(desired_scale_y-1))
+
+ if(chassis != "13")
+ appearance_flags |= PIXEL_SCALE
+
+ var/anim_time = 3
+
+ if(resting)
+ M.Turn(90)
+ M.Scale(desired_scale_y, desired_scale_x)
+ if(holo_icon_dimension_X == 64 && holo_icon_dimension_Y == 64)
+ M.Translate(13,-22)
+ else if(holo_icon_dimension_X == 32 && holo_icon_dimension_Y == 64)
+ M.Translate(1,-22)
+ else if(holo_icon_dimension_X == 64 && holo_icon_dimension_Y == 32)
+ M.Translate(13,-6)
+ else
+ M.Translate(1,-6)
+ layer = MOB_LAYER -0.01 // Fix for a byond bug where turf entry order no longer matters
+ else
+ M.Scale(desired_scale_x, desired_scale_y)
+ M.Translate(0, (vis_height/2)*(desired_scale_y-1))
+ layer = MOB_LAYER // Fix for a byond bug where turf entry order no longer matters
+ animate(src, transform = M, time = anim_time)
+ src.transform = M
+ handle_status_indicators()
+*/
//Overriding this will stop a number of headaches down the track.
/mob/living/silicon/pai/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(W.force)
@@ -374,17 +432,17 @@
close_up()
//I'm not sure how much of this is necessary, but I would rather avoid issues.
-/mob/living/silicon/pai/proc/close_up()
+/mob/living/silicon/pai/proc/close_up(silent= FALSE)
last_special = world.time + 100
if(src.loc == card)
return
- release_vore_contents() //VOREStation Add
+ release_vore_contents(FALSE) //VOREStation Add
var/turf/T = get_turf(src)
- if(istype(T)) T.visible_message("[src] neatly folds inwards, compacting down to a rectangular card.")
+ if(istype(T) && !silent) T.visible_message("[src] neatly folds inwards, compacting down to a rectangular card.")
if(client)
src.stop_pulling()
@@ -403,15 +461,22 @@
H.loc = get_turf(src)
src.loc = get_turf(H)
- // Move us into the card and move the card to the ground.
- src.loc = card
- card.loc = get_turf(card)
- src.forceMove(card)
- card.forceMove(card.loc)
+ if(isbelly(loc)) //If in tumby, when fold up, card go into tumby
+ var/obj/belly/B = loc
+ src.forceMove(card)
+ card.forceMove(B)
+ else //Otherwise go on floor
+ src.loc = card
+ card.loc = get_turf(card)
+ src.forceMove(card)
+ card.forceMove(card.loc)
canmove = 1
resting = 0
icon_state = "[chassis]"
- verbs -= /mob/living/silicon/pai/proc/pai_nom //VOREStation edit. Let's remove their nom verb
+ if(isopenspace(card.loc))
+ fall()
+ verbs -= /mob/living/silicon/pai/proc/pai_nom
+ verbs -= /mob/living/proc/vertical_nom
// No binary for pAIs.
/mob/living/silicon/pai/binarycheck()
@@ -436,10 +501,16 @@
if("Add Access")
idcard.access |= ID.access
to_chat(user, "You add the access from the [W] to [src].")
+ to_chat(src, "\The [user] swipes the [W] over you. You copy the access codes.")
+ if(radio)
+ radio.recalculateChannels()
return
if("Remove Access")
idcard.access = list()
to_chat(user, "You remove the access from [src].")
+ to_chat(src, "\The [user] swipes the [W] over you, removing access codes from you.")
+ if(radio)
+ radio.recalculateChannels()
return
if("Cancel")
return
@@ -454,16 +525,16 @@
if(idaccessible == 0)
idaccessible = 1
- to_chat(src, "You allow access modifications.")
-
+ visible_message("\The [src] clicks as their access modification slot opens.","You allow access modifications.", runemessage = "click")
else
idaccessible = 0
- to_chat(src, "You block access modfications.")
+ visible_message("\The [src] clicks as their access modification slot closes.","You block access modfications.", runemessage = "click")
+
/mob/living/silicon/pai/verb/wipe_software()
- set name = "Wipe Software"
- set category = "OOC"
- set desc = "Wipe your software. This is functionally equivalent to cryo or robotic storage, freeing up your job slot."
+ set name = "Enter Storage"
+ set category = "pAI Commands"
+ set desc = "Upload your personality to the cloud and wipe your software from the card. This is functionally equivalent to cryo or robotic storage, freeing up your job slot."
// Make sure people don't kill themselves accidentally
if(tgui_alert(usr, "WARNING: This will immediately wipe your software and ghost you, removing your character from the round permanently (similar to cryo and robotic storage). Are you entirely sure you want to do this?", "Wipe Software", list("No", "Yes")) != "Yes")
diff --git a/code/modules/mob/living/silicon/pai/pai_hud.dm b/code/modules/mob/living/silicon/pai/pai_hud.dm
new file mode 100644
index 00000000000..c7109d8aff4
--- /dev/null
+++ b/code/modules/mob/living/silicon/pai/pai_hud.dm
@@ -0,0 +1,409 @@
+/mob/living/silicon/pai
+ var/obj/screen/pai/pai_fold_display = null
+
+/obj/screen/pai
+ icon = 'icons/mob/pai_hud.dmi'
+ var/base_state
+
+/obj/screen/pai/Click_vr(location, control, params)
+ if(!usr) return 1
+ if(!ispAI(usr)) return 1
+ var/mob/living/silicon/pai/p = usr
+ switch(name)
+ if("fold/unfold")
+ if(p.loc == p.card)
+ p.fold_out()
+ else
+ p.fold_up()
+ if("choose chassis")
+ p.choose_chassis()
+
+ if("software interface")
+ p.paiInterface()
+
+ if("radio configuration")
+ p.radio.tgui_interact(p)
+
+ if("pda")
+ p.pda.cmd_pda_open_ui()
+
+ if("communicator")
+ p.communicator.activate()
+
+ if("known languages")
+ p.check_languages()
+
+ if("software toggle")
+ p.refresh_software_status()
+ if(p.hud_used.inventory_shown)
+ p.hud_used.inventory_shown = 0
+ p.client.screen -= p.hud_used.other
+ else
+ p.hud_used.inventory_shown = 1
+ p.client.screen += p.hud_used.other
+
+ if("directives")
+ p.directives()
+
+ if("crew manifest")
+ p.crew_manifest()
+
+ if("universal translator")
+ p.translator()
+
+ if("medical records")
+ p.med_records()
+
+ if("security records")
+ p.sec_records()
+
+ if("remote signaler")
+ p.remote_signal()
+
+ if("atmosphere sensor")
+ p.atmos_sensor()
+
+ if("door jack")
+ p.door_jack()
+
+ if("ar hud")
+ p.ar_hud()
+
+/obj/screen/pai/pai_fold_display
+ name = "fold/unfold"
+ icon = 'icons/mob/pai_hud.dmi'
+
+/datum/hud
+ var/list/hud_elements = list()
+
+/mob/living/silicon/pai/create_mob_hud(datum/hud/HUD)
+ ..()
+
+ var/ui_style = 'icons/mob/pai_hud.dmi'
+
+ var/ui_color = "#ffffff"
+ var/ui_alpha = 255
+
+ var/list/adding = list()
+ var/list/other = list()
+ var/list/hotkeybuttons = list()
+ var/list/hud_elements = list()
+
+ HUD.adding = adding
+ HUD.other = other
+ HUD.hotkeybuttons = hotkeybuttons
+ HUD.hud_elements = hud_elements
+
+ var/obj/screen/pai/using
+
+ //Small intent quarters
+
+ using = new /obj/screen()
+ using.name = I_HELP
+ using.icon = ui_style
+ using.icon_state = "intent_help-s"
+ using.screen_loc = ui_acti
+ using.alpha = ui_alpha
+ using.layer = LAYER_HUD_ITEM //These sit on the intent box
+ HUD.adding += using
+ HUD.help_intent = using
+
+ using = new /obj/screen()
+ using.name = I_DISARM
+ using.icon = ui_style
+ using.icon_state = "intent_disarm-n"
+ using.screen_loc = ui_acti
+ using.alpha = ui_alpha
+ using.layer = LAYER_HUD_ITEM
+ HUD.adding += using
+ HUD.disarm_intent = using
+
+ using = new /obj/screen()
+ using.name = I_GRAB
+ using.icon = ui_style
+ using.icon_state = "intent_grab-n"
+ using.screen_loc = ui_acti
+ using.alpha = ui_alpha
+ using.layer = LAYER_HUD_ITEM
+ HUD.adding += using
+ HUD.grab_intent = using
+
+ using = new /obj/screen()
+ using.name = I_HURT
+ using.icon = ui_style
+ using.icon_state = "intent_harm-n"
+ using.screen_loc = ui_acti
+ using.alpha = ui_alpha
+ using.layer = LAYER_HUD_ITEM
+ HUD.adding += using
+ HUD.hurt_intent = using
+
+ //Move intent (walk/run)
+ using = new /obj/screen()
+ using.name = "mov_intent"
+ using.icon = ui_style
+ using.icon_state = (m_intent == "run" ? "running" : "walking")
+ using.screen_loc = ui_movi
+ using.color = ui_color
+ using.alpha = ui_alpha
+ HUD.adding += using
+ HUD.move_intent = using
+
+ //Resist button
+ using = new /obj/screen()
+ using.name = "resist"
+ using.icon = ui_style
+ using.icon_state = "act_resist"
+ using.screen_loc = ui_movi
+ using.color = ui_color
+ using.alpha = ui_alpha
+ HUD.hotkeybuttons += using
+
+ //Pull button
+ pullin = new /obj/screen()
+ pullin.icon = ui_style
+ pullin.icon_state = "pull0"
+ pullin.name = "pull"
+ pullin.screen_loc = ui_movi
+ HUD.hotkeybuttons += pullin
+ HUD.hud_elements |= pullin
+
+ //Health status
+ healths = new /obj/screen()
+ healths.icon = ui_style
+ healths.icon_state = "health0"
+ healths.name = "health"
+ healths.screen_loc = ui_health
+ HUD.hud_elements |= healths
+
+ pain = new /obj/screen( null )
+
+ zone_sel = new /obj/screen/zone_sel( null )
+ zone_sel.icon = ui_style
+ zone_sel.color = ui_color
+ zone_sel.alpha = ui_alpha
+ zone_sel.cut_overlays()
+ zone_sel.update_icon()
+ HUD.hud_elements |= zone_sel
+
+ pai_fold_display = new /obj/screen/pai/pai_fold_display()
+ pai_fold_display.screen_loc = ui_health
+ pai_fold_display.icon_state = "folded"
+ HUD.hud_elements |= pai_fold_display
+
+ //Choose chassis button
+ using = new /obj/screen/pai()
+ using.name = "choose chassis"
+ using.icon_state = "choose_chassis"
+ using.screen_loc = ui_movi
+ using.color = ui_color
+ using.alpha = ui_alpha
+ hud_elements |= using
+
+ //Software interface button
+ using = new /obj/screen/pai()
+ using.name = "software interface"
+ using.icon_state = "software_interface"
+ using.screen_loc = ui_acti
+ using.color = ui_color
+ using.alpha = ui_alpha
+ hud_elements |= using
+
+ //Radio configuration button
+ using = new /obj/screen/pai()
+ using.name = "radio configuration"
+ using.icon_state = "radio_configuration"
+ using.screen_loc = ui_acti
+ using.color = ui_color
+ using.alpha = ui_alpha
+ hud_elements |= using
+
+ //PDA button
+ using = new /obj/screen/pai()
+ using.name = "pda"
+ using.icon_state = "pda"
+ using.screen_loc = ui_pai_comms
+ using.color = ui_color
+ using.alpha = ui_alpha
+ hud_elements |= using
+
+ //Communicator button
+ using = new /obj/screen/pai()
+ using.name = "communicator"
+ using.icon_state = "communicator"
+ using.screen_loc = ui_pai_comms
+ using.color = ui_color
+ using.alpha = ui_alpha
+ hud_elements |= using
+
+ //Language button
+ using = new /obj/screen/pai()
+ using.name = "known languages"
+ using.icon_state = "language"
+ using.screen_loc = ui_acti
+ using.color = ui_color
+ using.alpha = ui_alpha
+ hud_elements |= using
+
+ using = new /obj/screen/pai()
+ using.name = "software toggle"
+ using.icon_state = "software"
+ using.screen_loc = ui_inventory
+ using.color = ui_color
+ using.alpha = ui_alpha
+ hud_elements |= using
+
+ using = new /obj/screen/pai()
+ using.name = "directives"
+ using.icon_state = "directives"
+ using.screen_loc = "WEST:6,SOUTH:18"
+ using.color = ui_color
+ using.alpha = ui_alpha
+ other |= using
+
+ using = new /obj/screen/pai()
+ using.name = "crew manifest"
+ using.icon_state = "manifest"
+ using.screen_loc = "WEST:6,SOUTH+1:2"
+ using.color = ui_color
+ using.alpha = ui_alpha
+ other |= using
+
+ using = new /obj/screen/pai()
+ using.name = "medical records"
+ using.base_state = "med_records"
+ using.screen_loc = "WEST:6,SOUTH+1:18"
+ using.color = ui_color
+ using.alpha = ui_alpha
+ other |= using
+
+ using = new /obj/screen/pai()
+ using.name = "security records"
+ using.base_state = "sec_records"
+ using.screen_loc = "WEST:6,SOUTH+2:2"
+ using.color = ui_color
+ using.alpha = ui_alpha
+ other |= using
+
+ using = new /obj/screen/pai()
+ using.name = "atmosphere sensor"
+ using.base_state = "atmos_sensor"
+ using.screen_loc = "WEST:6,SOUTH+2:18"
+ using.color = ui_color
+ using.alpha = ui_alpha
+ other |= using
+
+ using = new /obj/screen/pai()
+ using.name = "remote signaler"
+ using.base_state = "signaller"
+ using.screen_loc = "WEST:6,SOUTH+3:2"
+ using.color = ui_color
+ using.alpha = ui_alpha
+ other |= using
+
+ using = new /obj/screen/pai()
+ using.name = "universal translator"
+ using.base_state = "translator"
+ using.screen_loc = "WEST:6,SOUTH+3:18"
+ using.color = ui_color
+ using.alpha = ui_alpha
+ other |= using
+
+ using = new /obj/screen/pai()
+ using.name = "door jack"
+ using.base_state = "door_jack"
+ using.screen_loc = "WEST:6,SOUTH+4:2"
+ using.color = ui_color
+ using.alpha = ui_alpha
+ other |= using
+
+ using = new /obj/screen/pai()
+ using.name = "ar hud"
+ using.base_state = "ar_hud"
+ using.screen_loc = "WEST:6,SOUTH+4:18"
+ using.color = ui_color
+ using.alpha = ui_alpha
+ other |= using
+
+ if(client)
+ client.screen = list()
+ client.screen += hud_elements
+ client.screen += adding + hotkeybuttons
+ client.screen += client.void
+
+ HUD.inventory_shown = 0
+
+
+/mob/living/silicon/pai/handle_regular_hud_updates()
+ . = ..()
+ if(healths)
+ if(stat != DEAD)
+ var/heal_per = (health / getMaxHealth()) * 100
+ switch(heal_per)
+ if(100 to INFINITY)
+ healths.icon_state = "health0"
+ if(80 to 100)
+ healths.icon_state = "health1"
+ if(60 to 80)
+ healths.icon_state = "health2"
+ if(40 to 60)
+ healths.icon_state = "health3"
+ if(20 to 40)
+ healths.icon_state = "health4"
+ if(0 to 20)
+ healths.icon_state = "health5"
+ else
+ healths.icon_state = "health6"
+ else
+ healths.icon_state = "health7"
+
+ if(pai_fold_display)
+ if(loc == card)
+ pai_fold_display.icon_state = "folded"
+ else
+ pai_fold_display.icon_state = "unfolded"
+
+/mob/living/silicon/pai/toggle_hud_vis(full)
+ if(!client)
+ return FALSE
+
+ if(hud_used.hud_shown)
+ hud_used.hud_shown = 0
+ if(hud_used.adding)
+ client.screen -= hud_used.adding
+ if(hud_used.other)
+ client.screen -= hud_used.other
+ if(hud_used.hotkeybuttons)
+ client.screen -= hud_used.hotkeybuttons
+ if(hud_used.other_important)
+ client.screen -= hud_used.other_important
+ if(hud_used.hud_elements)
+ client.screen -= hud_used.hud_elements
+
+ else
+ hud_used.hud_shown = 1
+ if(hud_used.adding)
+ client.screen += hud_used.adding
+ if(hud_used.other && hud_used.inventory_shown)
+ client.screen += hud_used.other
+ if(hud_used.other_important)
+ client.screen += hud_used.other_important
+ if(hud_used.hotkeybuttons && !hud_used.hotkey_ui_hidden)
+ client.screen += hud_used.hotkeybuttons
+ if(healths)
+ client.screen |= healths
+ if(internals)
+ client.screen |= internals
+ if(gun_setting_icon)
+ client.screen |= gun_setting_icon
+ if(hud_used.hud_elements)
+ client.screen |= hud_used.hud_elements
+
+ hud_used?.action_intent.screen_loc = ui_acti //Restore intent selection to the original position
+ client.screen += zone_sel //This one is a special snowflake
+
+ hud_used.hidden_inventory_update()
+ hud_used.persistant_inventory_update()
+ update_action_buttons()
+ hud_used.reorganize_alerts()
+ return TRUE
diff --git a/code/modules/mob/living/silicon/pai/pai_vr.dm b/code/modules/mob/living/silicon/pai/pai_vr.dm
index d5f989b67e0..86ef6cca5a0 100644
--- a/code/modules/mob/living/silicon/pai/pai_vr.dm
+++ b/code/modules/mob/living/silicon/pai/pai_vr.dm
@@ -1,10 +1,92 @@
/mob/living/silicon/pai
var/people_eaten = 0
icon = 'icons/mob/pai_vr.dmi'
+ softfall = TRUE
+ var/eye_glow = TRUE
+ var/hide_glow = FALSE
+ var/image/eye_layer = null // Holds the eye overlay.
+ var/eye_color = "#00ff0d"
+ var/icon/holo_icon
+ var/icon/holo_icon_north
+ var/holo_icon_dimension_X = 32
+ var/holo_icon_dimension_Y = 32
var/global/list/wide_chassis = list(
"rat",
- "panther"
+ "panther",
+ "teppi"
)
+ var/global/list/flying_chassis = list(
+ "pai-parrot",
+ "pai-bat",
+ "pai-butterfly",
+ "pai-hawk",
+ "cyberelf"
+ )
+
+ //Sure I could spend all day making wacky overlays for all of the different forms
+ //but quite simply most of these sprites aren't made for that, and I'd rather just make new ones
+ //the birds especially! Just naw. If someone else wants to mess with 12x4 frames of animation where
+ //most of the pixels are different kinds of green and tastefully translate that to whitescale
+ //they can have fun with that! I not doing it!
+ var/global/list/allows_eye_color = list(
+ "pai-repairbot",
+ "pai-typezero",
+ "pai-bat",
+ "pai-butterfly",
+ "pai-mouse",
+ "pai-monkey",
+ "pai-raccoon",
+ "pai-cat",
+ "rat",
+ "panther",
+ "pai-bear",
+ "pai-fen",
+ "cyberelf",
+ "teppi",
+ "catslug",
+ "car",
+ "typeone",
+ "13"
+ )
+ //These vars keep track of whether you have the related software, used for easily updating the UI
+ var/soft_ut = FALSE //universal translator
+ var/soft_mr = FALSE //medical records
+ var/soft_sr = FALSE //security records
+ var/soft_dj = FALSE //door jack
+ var/soft_as = FALSE //atmosphere sensor
+ var/soft_si = FALSE //signaler
+ var/soft_ar = FALSE //ar hud
+
+/mob/living/silicon/pai/Initialize()
+ . = ..()
+
+ verbs |= /mob/proc/dominate_predator
+ verbs |= /mob/living/proc/dominate_prey
+ verbs |= /mob/living/proc/set_size
+ verbs |= /mob/living/proc/shred_limb
+
+/mob/living/silicon/pai/Login()
+ . = ..()
+ if(!holo_icon)
+ last_special = world.time + 100 //Let's give get_character_icon time to work
+ get_character_icon()
+ if(stat == DEAD)
+ healths.icon_state = "health7"
+
+/mob/living/silicon/pai/proc/full_restore()
+ adjustBruteLoss(- bruteloss)
+ adjustFireLoss(- fireloss)
+ do_after(src, 1 SECONDS)
+ card.setEmotion(16)
+ stat = CONSCIOUS
+ do_after(src, 5 SECONDS)
+ var/mob/observer/dead/ghost = src.get_ghost()
+ if(ghost)
+ ghost.notify_revive("Someone is trying to revive you. Re-enter your body if you want to be revived!", 'sound/effects/pai-restore.ogg', source = card)
+ canmove = TRUE
+ card.setEmotion(15)
+ playsound(card, 'sound/effects/pai-restore.ogg', 50, FALSE)
+ card.visible_message("\The [card] chimes.", runemessage = "chime")
/mob/living/silicon/pai/proc/pai_nom(var/mob/living/T in oview(1))
set name = "pAI Nom"
@@ -24,6 +106,11 @@
/mob/living/silicon/pai/update_icon() //Some functions cause this to occur, such as resting
..()
+ if(chassis == "13")
+ icon = holo_icon
+ add_eyes()
+ return
+
update_fullness_pai()
if(!people_eaten && !resting)
@@ -42,18 +129,20 @@
icon_state = "[chassis]_rest_full"
else
icon_state = "[chassis]_rest"
-
if(chassis in wide_chassis)
- icon = 'icons/mob/pai_vr64x64.dmi'
pixel_x = -16
- vis_height = 64
+ default_pixel_x = -16
else
- icon = 'icons/mob/pai_vr.dmi'
pixel_x = 0
- vis_height = 32
+ default_pixel_x = 0
+ add_eyes()
/mob/living/silicon/pai/update_icons() //And other functions cause this to occur, such as digesting someone.
..()
+ if(chassis == "13")
+ icon = holo_icon
+ add_eyes()
+ return
update_fullness_pai()
if(!people_eaten && !resting)
icon_state = "[chassis]"
@@ -63,13 +152,14 @@
icon_state = "[chassis]_full"
else if(people_eaten && resting)
icon_state = "[chassis]_rest_full"
-
if(chassis in wide_chassis)
- icon = 'icons/mob/pai_vr64x64.dmi'
pixel_x = -16
+ default_pixel_x = -16
else
- icon = 'icons/mob/pai_vr.dmi'
pixel_x = 0
+ default_pixel_x = 0
+ add_eyes()
+
//proc override to avoid pAI players being invisible while the chassis selection window is open
/mob/living/silicon/pai/proc/choose_chassis()
set category = "pAI Commands"
@@ -78,10 +168,492 @@
choice = tgui_input_list(usr, "What would you like to use for your mobile chassis icon?", "Chassis Choice", possible_chassis)
if(!choice) return
+ var/oursize = size_multiplier
+ resize(1, FALSE, TRUE, TRUE, FALSE) //We resize ourselves to normal here for a moment to let the vis_height get reset
chassis = possible_chassis[choice]
- verbs |= /mob/living/proc/hide
+ if(chassis == "13")
+ if(!holo_icon)
+ if(!get_character_icon())
+ return
+ icon_state = null
+ icon = holo_icon
+ else if(chassis in wide_chassis)
+ icon = 'icons/mob/pai_vr64x64.dmi'
+ vis_height = 64
+ else
+ icon = 'icons/mob/pai_vr.dmi'
+ vis_height = 32
+ resize(oursize, FALSE, TRUE, TRUE, FALSE) //And then back again now that we're sure the vis_height is correct.
+
+ if(chassis in flying_chassis)
+ hovering = TRUE
+ else
+ hovering = FALSE
+ if(isopenspace(loc))
+ fall()
+
update_icon()
+
+/mob/living/silicon/pai/verb/toggle_eyeglow()
+ set category = "pAI Commands"
+ set name = "Toggle Eye Glow"
+
+ if(chassis in allows_eye_color)
+ if(eye_glow && !hide_glow)
+ eye_glow = FALSE
+ else
+ eye_glow = TRUE
+ hide_glow = FALSE
+ update_icon()
+ else
+ to_chat(src, "Your selected chassis cannot modify its eye glow!")
+ return
+
+
+/mob/living/silicon/pai/verb/pick_eye_color()
+ set category = "pAI Commands"
+ set name = "Pick Eye Color"
+ if(chassis in allows_eye_color)
+ else
+ to_chat(src, "Your selected chassis eye color can not be modified. The color you pick will only apply to supporting chassis and your card screen.")
+
+ var/new_eye_color = input(src, "Choose your character's eye color:", "Eye Color") as color|null
+ if(new_eye_color)
+ eye_color = new_eye_color
+ update_icon()
+ card.setEmotion(card.current_emotion)
+
// Release belly contents before being gc'd!
/mob/living/silicon/pai/Destroy()
release_vore_contents()
- return ..()
\ No newline at end of file
+ if(ckey)
+ paikeys -= ckey
+ return ..()
+
+/mob/living/silicon/pai/clear_client()
+ if(ckey)
+ paikeys -= ckey
+ return ..()
+
+/mob/living/silicon/pai/proc/add_eyes()
+ remove_eyes()
+ if(chassis == "13")
+ if(holo_icon.Width() > 32)
+ holo_icon_dimension_X = 64
+ pixel_x = -16
+ default_pixel_x = -16
+ if(holo_icon.Height() > 32)
+ holo_icon_dimension_Y = 64
+ if(holo_icon_dimension_X == 32 && holo_icon_dimension_Y == 32)
+ eye_layer = image('icons/mob/pai_vr.dmi', "type13-eyes")
+ else if(holo_icon_dimension_X == 32 && holo_icon_dimension_Y == 64)
+ eye_layer = image('icons/mob/pai_vr32x64.dmi', "type13-eyes")
+ else if(holo_icon_dimension_X == 64 && holo_icon_dimension_Y == 32)
+ eye_layer = image('icons/mob/pai_vr64x32.dmi', "type13-eyes")
+ else if(holo_icon_dimension_X == 64 && holo_icon_dimension_Y == 64)
+ eye_layer = image('icons/mob/pai_vr64x64.dmi', "type13-eyes")
+ else
+ else if(chassis in allows_eye_color)
+ eye_layer = image(icon, "[icon_state]-eyes")
+ else return
+ eye_layer.appearance_flags = appearance_flags
+ eye_layer.color = eye_color
+ if(eye_glow && !hide_glow)
+ eye_layer.plane = PLANE_LIGHTING_ABOVE
+ add_overlay(eye_layer)
+
+/mob/living/silicon/pai/proc/remove_eyes()
+ cut_overlay(eye_layer)
+ qdel(eye_layer)
+ eye_layer = null
+
+/mob/living/silicon/pai/UnarmedAttack(atom/A, proximity_flag)
+ . = ..()
+
+ if(!ismob(A) || A == src)
+ return
+
+ switch(a_intent)
+ if(I_HELP)
+ if(isliving(A))
+ hug(src, A)
+ if(I_GRAB)
+ pai_nom(A)
+
+/mob/living/silicon/pai/proc/hug(var/mob/living/silicon/pai/H, var/mob/living/target)
+
+ var/t_him = "them"
+ if(ishuman(target))
+ var/mob/living/carbon/human/T = target
+ switch(T.identifying_gender)
+ if(MALE)
+ t_him = "him"
+ if(FEMALE)
+ t_him = "her"
+ if(NEUTER)
+ t_him = "it"
+ if(HERM)
+ t_him = "hir"
+ else
+ t_him = "them"
+ else
+ switch(target.gender)
+ if(MALE)
+ t_him = "him"
+ if(FEMALE)
+ t_him = "her"
+ if(NEUTER)
+ t_him = "it"
+ if(HERM)
+ t_him = "hir"
+ else
+ t_him = "them"
+
+ if(H.zone_sel.selecting == "head")
+ H.visible_message( \
+ "[H] pats [target] on the head.", \
+ "You pat [target] on the head.", )
+ else if(H.zone_sel.selecting == "r_hand" || H.zone_sel.selecting == "l_hand")
+ H.visible_message( \
+ "[H] shakes [target]'s hand.", \
+ "You shake [target]'s hand.", )
+ else if(H.zone_sel.selecting == "mouth")
+ H.visible_message( \
+ "[H] boops [target]'s nose.", \
+ "You boop [target] on the nose.", )
+ else
+ H.visible_message("[H] hugs [target] to make [t_him] feel better!", \
+ "You hug [target] to make [t_him] feel better!")
+ playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+
+/mob/living/silicon/pai/proc/savefile_path(mob/user)
+ return "data/player_saves/[copytext(user.ckey, 1, 2)]/[user.ckey]/pai.sav"
+
+/mob/living/silicon/pai/proc/savefile_save(mob/user)
+ if(IsGuestKey(user.key))
+ return 0
+
+ var/savefile/F = new /savefile(src.savefile_path(user))
+
+
+ F["name"] << src.name
+ F["description"] << src.flavor_text
+ F["eyecolor"] << src.eye_color
+ F["chassis"] << src.chassis
+ F["emotion"] << src.card.current_emotion
+ F["gender"] << src.gender
+ F["version"] << 1
+
+ return 1
+
+/mob/living/silicon/pai/proc/savefile_load(mob/user, var/silent = 1)
+ if (IsGuestKey(user.key))
+ return 0
+
+ var/path = savefile_path(user)
+
+ if (!fexists(path))
+ return 0
+
+ var/savefile/F = new /savefile(path)
+
+ if(!F) return //Not everyone has a pai savefile.
+
+ var/version = null
+ F["version"] >> version
+
+ if (isnull(version) || version != 1)
+ fdel(path)
+ if (!silent)
+ tgui_alert_async(user, "Your savefile was incompatible with this version and was deleted.")
+ return 0
+ var/ourname
+ var/ouremotion
+ var/ourdesc
+ var/oureyes
+ var/ourchassis
+ var/ourgender
+ F["name"] >> ourname
+ F["description"] >> ourdesc
+ F["eyecolor"] >> oureyes
+ F["chassis"] >> ourchassis
+ F["emotion"] >> ouremotion
+ F["gender"] >> ourgender
+ if(ourname)
+ SetName(ourname)
+ if(ourdesc)
+ flavor_text = ourdesc
+ if(ourchassis)
+ chassis = ourchassis
+ if(ourgender)
+ gender = ourgender
+ if(oureyes)
+ card.screen_color = oureyes
+ eye_color = oureyes
+ if(ouremotion)
+ card.setEmotion(ouremotion)
+
+ update_icon()
+ return 1
+
+/mob/living/silicon/pai/verb/save_pai_to_slot()
+ set category = "pAI Commands"
+ set name = "Save Configuration"
+ savefile_save(src)
+ to_chat(src, "[name] configuration saved to global pAI settings.")
+
+/mob/living/silicon/pai/a_intent_change(input as text)
+ . = ..()
+
+ switch(a_intent)
+ if(I_HELP)
+ hud_used.help_intent.icon_state = "intent_help-s"
+ hud_used.disarm_intent.icon_state = "intent_disarm-n"
+ hud_used.grab_intent.icon_state = "intent_grab-n"
+ hud_used.hurt_intent.icon_state = "intent_harm-n"
+
+ if(I_DISARM)
+ hud_used.help_intent.icon_state = "intent_help-n"
+ hud_used.disarm_intent.icon_state = "intent_disarm-s"
+ hud_used.grab_intent.icon_state = "intent_grab-n"
+ hud_used.hurt_intent.icon_state = "intent_harm-n"
+
+ if(I_GRAB)
+ hud_used.help_intent.icon_state = "intent_help-n"
+ hud_used.disarm_intent.icon_state = "intent_disarm-n"
+ hud_used.grab_intent.icon_state = "intent_grab-s"
+ hud_used.hurt_intent.icon_state = "intent_harm-n"
+
+ if(I_HURT)
+ hud_used.help_intent.icon_state = "intent_help-n"
+ hud_used.disarm_intent.icon_state = "intent_disarm-n"
+ hud_used.grab_intent.icon_state = "intent_grab-n"
+ hud_used.hurt_intent.icon_state = "intent_harm-s"
+
+/mob/living/silicon/pai/verb/toggle_gender_identity_vr()
+ set name = "Set Gender Identity"
+ set desc = "Sets the pronouns when examined and performing an emote."
+ set category = "IC"
+ var/new_gender_identity = tgui_input_list(usr, "Please select a gender Identity:", "Set Gender Identity", list(FEMALE, MALE, NEUTER, PLURAL, HERM))
+ if(!new_gender_identity)
+ return 0
+ gender = new_gender_identity
+ return 1
+
+/mob/living/silicon/pai/verb/pai_hide()
+ set name = "Hide"
+ set desc = "Allows to hide beneath tables or certain items. Toggled on or off."
+ set category = "Abilities"
+
+ hide()
+ if(status_flags & HIDING)
+ hide_glow = TRUE
+ else
+ hide_glow = FALSE
+ update_icon()
+
+/mob/living/silicon/pai/verb/screen_message(message as text|null)
+ set category = "pAI Commands"
+ set name = "Screen Message"
+ set desc = "Allows you to display a message on your screen. This will show up in the chat of anyone who is holding your card."
+
+ if (src.client)
+ if(client.prefs.muted & MUTE_IC)
+ to_chat(src, "You cannot speak in IC (muted).")
+ return
+ if(loc != card)
+ to_chat(src, "Your message won't be visible while unfolded!")
+ if (!message)
+ message = tgui_input_text(src, "Enter text you would like to show on your screen.","Screen Message")
+ message = sanitize_or_reflect(message,src)
+ if (!message)
+ return
+ message = capitalize(message)
+ if (stat == DEAD)
+ return
+ card.screen_msg = message
+ var/logmsg = "(CARD SCREEN)[message]"
+ log_say(logmsg,src)
+ to_chat(src, "You print a message to your screen, \"[message]\"")
+ if(isliving(card.loc))
+ var/mob/living/L = card.loc
+ if(L.client)
+ to_chat(L, "[src.name]'s screen prints, \"[message]\"")
+ else return
+ else if(isbelly(card.loc))
+ var/obj/belly/b = card.loc
+ if(b.owner.client)
+ to_chat(b.owner, "[src.name]'s screen prints, \"[message]\"")
+ else return
+ else if(istype(card.loc, /obj/item/device/pda))
+ var/obj/item/device/pda/p = card.loc
+ if(isliving(p.loc))
+ var/mob/living/L = p.loc
+ if(L.client)
+ to_chat(L, "[src.name]'s screen prints, \"[message]\"")
+ else return
+ else if(isbelly(p.loc))
+ var/obj/belly/b = card.loc
+ if(b.owner.client)
+ to_chat(b.owner, "[src.name]'s screen prints, \"[message]\"")
+ else return
+ else return
+ else return
+ to_chat(src, "Your message was relayed.")
+ for (var/mob/G in player_list)
+ if (istype(G, /mob/new_player))
+ continue
+ else if(isobserver(G) && G.is_preference_enabled(/datum/client_preference/ghost_ears))
+ if(is_preference_enabled(/datum/client_preference/whisubtle_vis) || G.client.holder)
+ to_chat(G, "[src.name]'s screen prints, \"[message]\"")
+
+/mob/living/silicon/pai/proc/touch_window(soft_name) //This lets us touch TGUI procs and windows that may be nested behind other TGUI procs and windows
+ if(stat != CONSCIOUS) //so we can access our software without having to open up the software interface TGUI window
+ to_chat(src, "You can't do that right now.")
+ return
+ for(var/thing in software)
+ var/datum/pai_software/S = software[thing]
+ if(istype(S, /datum/pai_software) && S.name == soft_name)
+ if(S.toggle)
+ S.toggle(src)
+ to_chat(src, "You toggled [S.name].")
+ refresh_software_status()
+ else
+ S.tgui_interact(src)
+ refresh_software_status()
+ return
+ for(var/thing in pai_software_by_key)
+ var/datum/pai_software/our_soft = pai_software_by_key[thing]
+ if(our_soft.name == soft_name)
+ if(!(ram >= our_soft.ram_cost))
+ to_chat(src, "Insufficient RAM for download. (Cost [our_soft.ram_cost] : [ram] Remaining)")
+ return
+ if(tgui_alert(src, "Do you want to download [our_soft.name]? It costs [our_soft.ram_cost], and you have [ram] remaining.", "Download [our_soft.name]", list("Yes", "No")) == "Yes")
+ ram -= our_soft.ram_cost
+ software[our_soft.id] = our_soft
+ to_chat(src, "You downloaded [our_soft.name]. ([ram] RAM remaining.)")
+ refresh_software_status()
+
+/mob/living/silicon/pai/proc/refresh_software_status() //This manages the pAI software status buttons icon states based on if you have them and if they are enabled
+ for(var/thing in software) //this only gets called when you click one of the relevent buttons, rather than all the time!
+ var/datum/pai_software/soft = software[thing]
+ if(istype(soft,/datum/pai_software/med_records))
+ soft_mr = TRUE
+ if(istype(soft,/datum/pai_software/sec_records))
+ soft_sr = TRUE
+ if(istype(soft,/datum/pai_software/door_jack))
+ soft_dj = TRUE
+ if(istype(soft,/datum/pai_software/atmosphere_sensor))
+ soft_as = TRUE
+ if(istype(soft,/datum/pai_software/pai_hud))
+ soft_ar = TRUE
+ if(istype(soft,/datum/pai_software/translator))
+ soft_ut = TRUE
+ if(istype(soft,/datum/pai_software/signaller))
+ soft_si = TRUE
+ for(var/obj/screen/pai/button in hud_used.other)
+ if(button.name == "medical records")
+ if(soft_mr)
+ button.icon_state = "[button.base_state]"
+ else
+ button.icon_state = "[button.base_state]_o"
+ if(button.name == "security records")
+ if(soft_sr)
+ button.icon_state = "[button.base_state]"
+ else
+ button.icon_state = "[button.base_state]_o"
+ if(button.name == "door jack")
+ if(soft_dj)
+ button.icon_state = "[button.base_state]"
+ else
+ button.icon_state = "[button.base_state]_o"
+ if(button.name == "atmosphere sensor")
+ if(soft_as)
+ button.icon_state = "[button.base_state]"
+ else
+ button.icon_state = "[button.base_state]_o"
+ if(button.name == "remote signaler")
+ if(soft_si)
+ button.icon_state = "[button.base_state]"
+ else
+ button.icon_state = "[button.base_state]_o"
+ if(button.name == "universal translator")
+ if(soft_ut && translator_on)
+ button.icon_state = "[button.base_state]"
+ else
+ button.icon_state = "[button.base_state]_o"
+ if(button.name == "ar hud")
+ if(soft_ar && paiHUD)
+ button.icon_state = "[button.base_state]"
+ else
+ button.icon_state = "[button.base_state]_o"
+
+//Procs for using the various UI buttons for your softwares
+/mob/living/silicon/pai/proc/directives()
+ touch_window("Directives")
+
+/mob/living/silicon/pai/proc/crew_manifest()
+ touch_window("Crew Manifest")
+
+/mob/living/silicon/pai/proc/med_records()
+ touch_window("Medical Records")
+
+/mob/living/silicon/pai/proc/sec_records()
+ touch_window("Security Records")
+
+/mob/living/silicon/pai/proc/remote_signal()
+ touch_window("Remote Signaler")
+
+/mob/living/silicon/pai/proc/atmos_sensor()
+ touch_window("Atmosphere Sensor")
+
+/mob/living/silicon/pai/proc/translator()
+ touch_window("Universal Translator")
+
+/mob/living/silicon/pai/proc/door_jack()
+ touch_window("Door Jack")
+
+/mob/living/silicon/pai/proc/ar_hud()
+ touch_window("AR HUD")
+
+/mob/living/silicon/pai/proc/get_character_icon()
+ if(!client || !client.prefs) return FALSE
+ var/mob/living/carbon/human/dummy/dummy = new ()
+ //This doesn't include custom_items because that's ... hard.
+ client.prefs.dress_preview_mob(dummy)
+ sleep(1 SECOND) //Strange bug in preview code? Without this, certain things won't show up. Yay race conditions?
+ dummy.regenerate_icons()
+
+ var/icon/new_holo = getCompoundIcon(dummy)
+
+ dummy.tail_alt = TRUE
+ dummy.set_dir(NORTH)
+ var/icon/new_holo_north = getCompoundIcon(dummy)
+
+ qdel(holo_icon)
+ qdel(holo_icon_north)
+ qdel(dummy)
+ holo_icon = new_holo
+ holo_icon_north = new_holo_north
+ return TRUE
+
+/mob/living/silicon/pai/set_dir(var/new_dir)
+ . = ..()
+ if(. && (chassis == "13"))
+ switch(dir)
+ if(SOUTH)
+ icon = holo_icon
+ else
+ icon = holo_icon_north
+
+/mob/living/silicon/pai/adjustBruteLoss(amount, include_robo)
+ . = ..()
+ if(amount > 0 && health <= 90) //Something's probably attacking us!
+ if(prob(amount)) //The more damage it is doing, the more likely it is to damage something important!
+ card.damage_random_component()
+
+/mob/living/silicon/pai/adjustFireLoss(amount, include_robo)
+ . = ..()
+ if(amount > 0 && health <= 90)
+ if(prob(amount))
+ card.damage_random_component()
diff --git a/code/modules/mob/living/silicon/pai/personality.dm b/code/modules/mob/living/silicon/pai/personality.dm
index 73ae49dcb78..96f9f5ab468 100644
--- a/code/modules/mob/living/silicon/pai/personality.dm
+++ b/code/modules/mob/living/silicon/pai/personality.dm
@@ -57,4 +57,9 @@
F["description"] >> src.description
F["role"] >> src.role
F["comments"] >> src.comments
+ F["eyecolor"] >> src.eye_color
+ F["chassis"] >> src.chassis
+ F["emotion"] >> src.ouremotion
+ F["gender"] >> src.gender
+
return 1
diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm
index ffd817d9c48..b7485fa7150 100644
--- a/code/modules/mob/living/silicon/pai/recruit.dm
+++ b/code/modules/mob/living/silicon/pai/recruit.dm
@@ -11,7 +11,10 @@ var/datum/paiController/paiController // Global handler for pAI candidates
var/role
var/comments
var/ready = 0
-
+ var/chassis
+ var/ouremotion
+ var/eye_color
+ var/gender
/hook/startup/proc/paiControllerSetup()
paiController = new /datum/paiController()
@@ -33,14 +36,26 @@ var/datum/paiController/paiController // Global handler for pAI candidates
return
if(istype(card,/obj/item/device/paicard) && istype(candidate,/datum/paiCandidate))
var/mob/living/silicon/pai/pai = new(card)
- if(!candidate.name)
- pai.name = pick(ninja_names)
- else
- pai.name = candidate.name
- pai.real_name = pai.name
pai.key = candidate.key
-
+ paikeys |= pai.ckey
card.setPersonality(pai)
+ if(!candidate.name)
+ pai.SetName(pick(ninja_names))
+ else
+ pai.SetName(candidate.name)
+ if(candidate.description)
+ pai.flavor_text = candidate.description
+ if(candidate.eye_color)
+ pai.eye_color = candidate.eye_color
+ card.screen_color = pai.eye_color
+ if(candidate.chassis)
+ pai.chassis = candidate.chassis
+ if(candidate.ouremotion)
+ card.setEmotion(candidate.ouremotion)
+ if(candidate.gender)
+ pai.gender = candidate.gender
+ pai.update_icon()
+ pai.real_name = pai.name
card.looking_for_personality = 0
if(pai.mind) update_antag_icons(pai.mind)
@@ -55,19 +70,19 @@ var/datum/paiController/paiController // Global handler for pAI candidates
switch(option)
if("name")
- t = sanitizeSafe(input(usr, "Enter a name for your pAI", "pAI Name", candidate.name) as text, MAX_NAME_LEN)
+ t = sanitizeSafe(tgui_input_text(usr, "Enter a name for your pAI", "pAI Name", candidate.name, MAX_NAME_LEN), MAX_NAME_LEN)
if(t)
candidate.name = t
if("desc")
- t = input(usr, "Enter a description for your pAI", "pAI Description", candidate.description) as message
+ t = tgui_input_text(usr, "Enter a description for your pAI", "pAI Description", candidate.description, multiline = TRUE, prevent_enter = TRUE)
if(t)
candidate.description = sanitize(t)
if("role")
- t = input(usr, "Enter a role for your pAI", "pAI Role", candidate.role) as text
+ t = tgui_input_text(usr, "Enter a role for your pAI", "pAI Role", candidate.role)
if(t)
candidate.role = sanitize(t)
if("ooc")
- t = input(usr, "Enter any OOC comments", "pAI OOC Comments", candidate.comments) as message
+ t = tgui_input_text(usr, "Enter any OOC comments", "pAI OOC Comments", candidate.comments, multiline = TRUE, prevent_enter = TRUE)
if(t)
candidate.comments = sanitize(t)
if("save")
@@ -210,7 +225,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
|
- Load Personality
+ Load Personality
|
@@ -365,6 +380,16 @@ var/datum/paiController/paiController // Global handler for pAI candidates
if(!C) return
asked.Add(C.key)
asked[C.key] = world.time
+
+ var/mob/ourmob = C.mob
+ if(ourmob)
+ var/time_till_respawn = ourmob.time_till_respawn()
+ if(time_till_respawn == -1 || time_till_respawn)
+ return
+ for(var/ourkey in paikeys)
+ if(ourkey == ourmob.ckey)
+ return
+
var/response = tgui_alert(C, "[inquirer] is requesting a pAI personality. Would you like to play as a personal AI?", "pAI Request", list("Yes", "No", "Never for this round"))
if(!C) return //handle logouts that happen whilst the alert is waiting for a response.
if(response == "Yes")
diff --git a/code/modules/mob/living/silicon/pai/say.dm b/code/modules/mob/living/silicon/pai/say.dm
index 4b18c42beb9..ed38dfc9c83 100644
--- a/code/modules/mob/living/silicon/pai/say.dm
+++ b/code/modules/mob/living/silicon/pai/say.dm
@@ -1,5 +1,7 @@
/mob/living/silicon/pai/say(var/message, var/datum/language/speaking = null, var/whispering = 0)
if(silence_time)
to_chat(src, "Communication circuits remain uninitialized.")
+ else if(card.speech_synthesizer != PP_FUNCTIONAL)
+ to_chat(src, "Communication circuits damaged. Service required.")
else
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index ba51d10b267..f1482aeada0 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -1,19 +1,20 @@
var/list/pai_emotions = list(
- "Happy" = 1,
- "Cat" = 2,
- "Extremely Happy" = 3,
- "Face" = 4,
- "Laugh" = 5,
- "Off" = 6,
- "Sad" = 7,
- "Angry" = 8,
- "What" = 9,
- "Neutral" = 10,
- "Silly" = 11,
- "Nose" = 12,
- "Smirk" = 13,
- "Exclamation Points" = 14,
- "Question Mark" = 15
+ "Neutral" = 1,
+ "What" = 2,
+ "Happy" = 3,
+ "Cat" = 4,
+ "Extremely Happy" = 5,
+ "Face" = 6,
+ "Laugh" = 7,
+ "Sad" = 8,
+ "Angry" = 9,
+ "Silly" = 10,
+ "Nose" = 11,
+ "Smirk" = 12,
+ "Exclamation Points" = 13,
+ "Question Mark" = 14,
+ "Blank" = 15,
+ "Off" = 16
)
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index 1fb28a58fd2..a5553f350bb 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -98,9 +98,10 @@
/datum/pai_software/crew_manifest
name = "Crew Manifest"
- ram_cost = 5
+ ram_cost = 0
id = "manifest"
toggle = 0
+ default = 1 //Comes with the communicator already, also why not
/datum/pai_software/crew_manifest/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
ui = SStgui.try_update_ui(user, src, ui)
@@ -117,9 +118,10 @@
/datum/pai_software/messenger
name = "Digital Messenger"
- ram_cost = 5
+ ram_cost = 0
id = "messenger"
toggle = 0
+ default = 1 //Can already be accessed through verbs, and also why not
/datum/pai_software/messenger/tgui_interact(mob/living/silicon/pai/user, datum/tgui/ui, datum/tgui/parent_ui)
return user.pda.tgui_interact(user, parent_ui = parent_ui)
@@ -138,7 +140,7 @@
/datum/pai_software/med_records/tgui_data(mob/living/silicon/pai/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
-
+
var/list/records = list()
for(var/datum/data/record/general in sortRecord(data_core.general))
var/list/record = list()
@@ -194,7 +196,7 @@
/datum/pai_software/sec_records/tgui_data(mob/living/silicon/pai/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
-
+
var/list/records = list()
for(var/datum/data/record/general in sortRecord(data_core.general))
var/list/record = list()
@@ -367,34 +369,24 @@
return data
-/datum/pai_software/sec_hud
- name = "Security HUD"
- ram_cost = 20
- id = "sec_hud"
+/datum/pai_software/pai_hud
+ name = "AR HUD"
+ ram_cost = 30
+ id = "ar_hud"
-/datum/pai_software/sec_hud/toggle(mob/living/silicon/pai/user)
- user.secHUD = !user.secHUD
- user.plane_holder.set_vis(VIS_CH_ID, user.secHUD)
- user.plane_holder.set_vis(VIS_CH_WANTED, user.secHUD)
- user.plane_holder.set_vis(VIS_CH_IMPTRACK, user.secHUD)
- user.plane_holder.set_vis(VIS_CH_IMPLOYAL, user.secHUD)
- user.plane_holder.set_vis(VIS_CH_IMPCHEM, user.secHUD)
+/datum/pai_software/pai_hud/toggle(mob/living/silicon/pai/user)
+ user.paiHUD = !user.paiHUD
+ user.plane_holder.set_vis(VIS_CH_ID,user.paiHUD)
+ user.plane_holder.set_vis(VIS_CH_WANTED,user.paiHUD)
+ user.plane_holder.set_vis(VIS_CH_IMPTRACK,user.paiHUD)
+ user.plane_holder.set_vis(VIS_CH_IMPCHEM,user.paiHUD)
+ user.plane_holder.set_vis(VIS_CH_STATUS_R,user.paiHUD)
+ user.plane_holder.set_vis(VIS_CH_HEALTH_VR,user.paiHUD)
+ user.plane_holder.set_vis(VIS_CH_BACKUP,user.paiHUD) //backup stuff from silicon_vr is here now
+ user.plane_holder.set_vis(VIS_AUGMENTED,user.paiHUD)
-/datum/pai_software/sec_hud/is_active(mob/living/silicon/pai/user)
- return user.secHUD
-
-/datum/pai_software/med_hud
- name = "Medical HUD"
- ram_cost = 20
- id = "med_hud"
-
-/datum/pai_software/med_hud/toggle(mob/living/silicon/pai/user)
- user.medHUD = !user.medHUD
- user.plane_holder.set_vis(VIS_CH_STATUS, user.medHUD)
- user.plane_holder.set_vis(VIS_CH_HEALTH, user.medHUD)
-
-/datum/pai_software/med_hud/is_active(mob/living/silicon/pai/user)
- return user.medHUD
+/datum/pai_software/pai_hud/is_active(mob/living/silicon/pai/user)
+ return user.paiHUD
/datum/pai_software/translator
name = "Universal Translator"
@@ -411,6 +403,26 @@
user.add_language(LANGUAGE_SKRELLIAN)
user.add_language(LANGUAGE_ZADDAT)
user.add_language(LANGUAGE_SCHECHI)
+ user.add_language(LANGUAGE_DRUDAKAR)
+ user.add_language(LANGUAGE_BIRDSONG)
+ user.add_language(LANGUAGE_SAGARU)
+ user.add_language(LANGUAGE_CANILUNZT)
+ user.add_language(LANGUAGE_ECUREUILIAN)
+ user.add_language(LANGUAGE_DAEMON)
+ user.add_language(LANGUAGE_ENOCHIAN)
+ user.add_language(LANGUAGE_VESPINAE)
+ user.add_language(LANGUAGE_SPACER)
+ user.add_language(LANGUAGE_TAVAN)
+ user.add_language(LANGUAGE_ECHOSONG)
+ user.add_language(LANGUAGE_ROOTLOCAL)
+ user.add_language(LANGUAGE_VOX)
+ user.add_language(LANGUAGE_MINBUS)
+ user.add_language(LANGUAGE_ALAI)
+ user.add_language(LANGUAGE_PROMETHEAN)
+ user.add_language(LANGUAGE_GIBBERISH)
+ user.add_language("Mouse")
+ user.add_language("Animal")
+ user.add_language("Teppi")
else
user.remove_language(LANGUAGE_UNATHI)
user.remove_language(LANGUAGE_SIIK)
@@ -418,6 +430,26 @@
user.remove_language(LANGUAGE_SKRELLIAN)
user.remove_language(LANGUAGE_ZADDAT)
user.remove_language(LANGUAGE_SCHECHI)
+ user.remove_language(LANGUAGE_DRUDAKAR)
+ user.remove_language(LANGUAGE_BIRDSONG)
+ user.remove_language(LANGUAGE_SAGARU)
+ user.remove_language(LANGUAGE_CANILUNZT)
+ user.remove_language(LANGUAGE_ECUREUILIAN)
+ user.remove_language(LANGUAGE_DAEMON)
+ user.remove_language(LANGUAGE_ENOCHIAN)
+ user.remove_language(LANGUAGE_VESPINAE)
+ user.remove_language(LANGUAGE_SPACER)
+ user.remove_language(LANGUAGE_TAVAN)
+ user.remove_language(LANGUAGE_ECHOSONG)
+ user.remove_language(LANGUAGE_ROOTLOCAL)
+ user.remove_language(LANGUAGE_VOX)
+ user.remove_language(LANGUAGE_MINBUS)
+ user.remove_language(LANGUAGE_ALAI)
+ user.remove_language(LANGUAGE_PROMETHEAN)
+ user.remove_language(LANGUAGE_GIBBERISH)
+ user.remove_language("Mouse")
+ user.remove_language("Animal")
+ user.remove_language("Teppi")
/datum/pai_software/translator/is_active(mob/living/silicon/pai/user)
return user.translator_on
@@ -436,7 +468,7 @@
/datum/pai_software/signaller/tgui_data(mob/living/silicon/pai/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
-
+
var/obj/item/radio/integrated/signal/R = user.sradio
data["frequency"] = R.frequency
@@ -459,7 +491,7 @@
spawn(0)
R.send_signal("ACTIVATE")
for(var/mob/O in hearers(1, R.loc))
- O.show_message("[bicon(R)] *beep* *beep*", 3, "*beep* *beep*", 2)
+ O.show_message("\icon[R][bicon(R)] *beep* *beep*", 3, "*beep* *beep*", 2)
if("freq")
var/frequency = unformat_frequency(params["freq"])
frequency = sanitize_frequency(frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ)
diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm
index 6ebc7b4ab90..55552c7583e 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm
@@ -66,12 +66,12 @@
var/agony = 60 // Copied from stun batons
var/stun = 0 // ... same
-
+
var/obj/item/organ/external/affecting = null
if(ishuman(target))
var/mob/living/carbon/human/H = target
affecting = H.get_organ(hit_zone)
-
+
if(user.a_intent == I_HURT)
// Parent handles messages
. = ..()
@@ -91,7 +91,7 @@
var/mob/living/silicon/robot/R = loc
if(R.cell?.use(charge_cost) == charge_cost)
stunning = TRUE
-
+
if(stunning)
target.stun_effect_act(stun, agony, hit_zone, src)
msg_admin_attack("[key_name(user)] stunned [key_name(target)] with the [src].")
@@ -216,6 +216,11 @@
desc = "An advanced chemical synthesizer and injection system utilizing carrier's reserves."
reagent_ids = list("tricordrazine", "inaprovaline", "bicaridine", "dexalin", "anti_toxin", "tramadol", "spaceacillin")
+/obj/item/weapon/reagent_containers/borghypo/hound/trauma
+ name = "Hound hypospray"
+ desc = "An advanced chemical synthesizer and injection system utilizing carrier's reserves."
+ reagent_ids = list("tricordrazine", "inaprovaline", "oxycodone", "dexalin" ,"spaceacillin")
+
//Tongue stuff
/obj/item/device/dogborg/tongue
diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
index 97af632c946..8af6fddc8ff 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
@@ -42,11 +42,13 @@
var/digest_multiplier = 1
var/recycles = FALSE
var/medsensor = TRUE //Does belly sprite come with patient ok/dead light?
+ var/obj/item/device/healthanalyzer/med_analyzer = null
/obj/item/device/dogborg/sleeper/New()
..()
flags |= NOBLUDGEON //No more attack messages
files = new /datum/research/techonly(src)
+ med_analyzer = new /obj/item/device/healthanalyzer
/obj/item/device/dogborg/sleeper/Destroy()
go_out()
@@ -216,6 +218,8 @@
dat += "Eject port: [eject_port]"
if(!cleaning)
dat += "Self-Clean"
+ if(medsensor)
+ dat += "Analyze Patient"
else
dat += "Self-Clean"
if(delivery)
@@ -336,6 +340,8 @@
if(cleaning)
sleeperUI(usr)
return
+ if(href_list["analyze"]) //DO HEALTH ANALYZER STUFF HERE.
+ med_analyzer.scan_mob(patient,hound)
if(href_list["port"])
switch(eject_port)
if("ingestion")
@@ -548,7 +554,8 @@
var/actual_burn = T.getFireLoss() - old_burn
var/damage_gain = actual_brute + actual_burn
drain(-25 * damage_gain) //25*total loss as with voreorgan stats.
- water.add_charge(damage_gain)
+ if(water)
+ water.add_charge(damage_gain)
if(T.stat == DEAD)
if(ishuman(T))
message_admins("[key_name(hound)] has digested [key_name(T)] as a dogborg. ([hound ? "JMP" : "null"])")
@@ -585,10 +592,12 @@
if(ishuman(T))
var/mob/living/carbon/human/Prey = T
volume = (Prey.bloodstr.total_volume + Prey.ingested.total_volume + Prey.touching.total_volume + Prey.weight) * Prey.size_multiplier
- water.add_charge(volume)
+ if(water)
+ water.add_charge(volume)
if(T.reagents)
volume = T.reagents.total_volume
- water.add_charge(volume)
+ if(water)
+ water.add_charge(volume)
if(patient == T)
patient_laststat = null
patient = null
@@ -612,7 +621,7 @@
for(var/tech in tech_item.origin_tech)
files.UpdateTech(tech, tech_item.origin_tech[tech])
synced = FALSE
- if(volume)
+ if(volume && water)
water.add_charge(volume)
if(recycles && T.matter)
for(var/material in T.matter)
@@ -620,14 +629,14 @@
if(istype(T,/obj/item/stack))
var/obj/item/stack/stack = T
total_material *= stack.get_amount()
- if(material == MAT_STEEL)
+ if(material == MAT_STEEL && metal)
metal.add_charge(total_material)
- if(material == "glass")
+ if(material == "glass" && glass)
glass.add_charge(total_material)
if(decompiler)
- if(material == "plastic")
+ if(material == "plastic" && plastic)
plastic.add_charge(total_material)
- if(material == "wood")
+ if(material == "wood" && wood)
wood.add_charge(total_material)
drain(-50 * digested)
else if(istype(target,/obj/effect/decal/remains))
@@ -724,4 +733,11 @@
icon_state = "sleeperert"
injection_chems = list("inaprovaline", "paracetamol") // short list
+/obj/item/device/dogborg/sleeper/compactor/trauma //Trauma borg belly
+ name = "Recovery Belly"
+ desc = "A downgraded model of the medihound sleeper."
+ icon_state = "sleeper"
+ injection_chems = list("inaprovaline", "dexalin", "bicaridine", "anti_toxin", "spaceacillin", "paracetamol")
+ max_item_count = 1
+
#undef SLEEPER_INJECT_COST
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
index 9972a80b92d..57309dd4272 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
@@ -125,7 +125,6 @@
/obj/item/slimepotion,
/obj/item/slime_extract,
/obj/item/weapon/reagent_containers/food/snacks/monkeycube
-
)
/obj/item/weapon/gripper/circuit
@@ -180,7 +179,8 @@
desc = "A specialized grasping tool used to preserve and manipulate organic material."
can_hold = list(
- /obj/item/organ
+ /obj/item/organ,
+ /obj/item/device/nif //NIFs can be slapped in during surgery
)
/obj/item/weapon/gripper/no_use/organ/Entered(var/atom/movable/AM)
@@ -208,7 +208,8 @@
/obj/item/organ/external,
/obj/item/organ/internal/brain, //to insert into MMIs,
/obj/item/organ/internal/cell,
- /obj/item/organ/internal/eyes/robot
+ /obj/item/organ/internal/eyes/robot,
+ /obj/item/device/nif //NIFs can be slapped in during surgery
)
/obj/item/weapon/gripper/no_use/mech
diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm
index f2a4d9775bc..9def436c7cb 100644
--- a/code/modules/mob/living/silicon/robot/emote.dm
+++ b/code/modules/mob/living/silicon/robot/emote.dm
@@ -16,12 +16,14 @@ var/list/_robot_default_emotes = list(
/decl/emote/visible/spin,
/decl/emote/visible/sidestep,
/decl/emote/audible/synth,
- /decl/emote/audible/synth/ping,
+ /decl/emote/audible/synth/beep,
/decl/emote/audible/synth/buzz,
/decl/emote/audible/synth/confirm,
/decl/emote/audible/synth/deny,
/decl/emote/audible/synth/scary,
/decl/emote/audible/synth/dwoop,
+ /decl/emote/audible/synth/boop,
+ /decl/emote/audible/synth/robochirp,
/decl/emote/audible/synth/security,
/decl/emote/audible/synth/security/halt,
//VOREStation Add
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index c457279fed8..aa3bdda5635 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -353,7 +353,7 @@
spawn(0)
var/newname
- newname = sanitizeSafe(input(src,"You are a robot. Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN)
+ newname = sanitizeSafe(tgui_input_text(src,"You are a robot. Enter a name, or leave blank for the default name.", "Name change","", MAX_NAME_LEN), MAX_NAME_LEN)
if (newname)
custom_name = newname
sprite_name = newname
@@ -1074,9 +1074,11 @@
to_chat(src, "Your icon has been set. You now require a module reset to change it.")
/mob/living/silicon/robot/proc/sensor_mode() //Medical/Security HUD controller for borgs
- set name = "Set Sensor Augmentation"
+ set name = "Toggle Sensor Augmentation" //VOREStation Add
set category = "Robot Commands"
set desc = "Augment visual feed with internal sensor overlays."
+ sensor_type = !sensor_type //VOREStation Add
+ to_chat(usr, "You [sensor_type ? "enable" : "disable"] your sensors.") //VOREStation Add
toggle_sensor_mode()
/mob/living/silicon/robot/proc/add_robot_verbs()
diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm
index 87ab84d09bc..878b1422df5 100644
--- a/code/modules/mob/living/silicon/robot/robot_items.dm
+++ b/code/modules/mob/living/silicon/robot/robot_items.dm
@@ -300,7 +300,7 @@
/obj/item/weapon/pen/robopen/proc/RenamePaper(mob/user, obj/item/weapon/paper/paper)
if ( !user || !paper )
return
- var/n_name = sanitizeSafe(input(user, "What would you like to label the paper?", "Paper Labelling", null) as text, 32)
+ var/n_name = sanitizeSafe(tgui_input_text(user, "What would you like to label the paper?", "Paper Labelling", null, 32), 32)
if ( !user || !paper )
return
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
index 80de94f9069..77ddf329cce 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
@@ -274,6 +274,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/surgical/bonesetter/cyborg(src)
src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src)
src.modules += new /obj/item/weapon/surgical/surgicaldrill/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/bioregen/cyborg(src) //VoreStation Edit: LET ME SUCC
src.modules += new /obj/item/weapon/gripper/no_use/organ(src)
src.modules += new /obj/item/weapon/gripper/medical(src)
src.modules += new /obj/item/weapon/shockpaddles/robot(src)
@@ -288,14 +289,19 @@ var/global/list/robot_modules = list(
var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src)
var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src)
+ var/obj/item/stack/medical/advanced/ointment/O = new /obj/item/stack/medical/advanced/ointment(src) //VoreStation edit: we have burn surgeries so they should be able to do them
N.uses_charge = 1
N.charge_costs = list(1000)
N.synths = list(medicine)
B.uses_charge = 1
B.charge_costs = list(1000)
B.synths = list(medicine)
+ O.uses_charge = 1
+ O.charge_costs = list(1000)
+ O.synths = list(medicine)
src.modules += N
src.modules += B
+ src.modules += O
/obj/item/weapon/robot_module/robot/medical/surgeon/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
@@ -352,6 +358,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/gripper/no_use/organ(src)
src.modules += new /obj/item/weapon/gripper/medical(src)
src.modules += new /obj/item/weapon/shockpaddles/robot(src)
+ src.modules += new /obj/item/weapon/inflatable_dispenser/robot(src) //VOREStation Add - This is kinda important for rescuing people without making it worse for everyone
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
src.emag.reagents.add_reagent("pacid", 250)
src.emag.name = "Polyacid spray"
@@ -627,7 +634,6 @@ var/global/list/robot_modules = list(
LANGUAGE_SIIK = 1,
LANGUAGE_AKHANI = 1,
LANGUAGE_SKRELLIAN = 1,
- LANGUAGE_SKRELLIANFAR = 0,
LANGUAGE_ROOTLOCAL = 0,
LANGUAGE_TRADEBAND = 1,
LANGUAGE_GUTTER = 1,
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
index e62d4705b06..966c84c895c 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
@@ -51,6 +51,7 @@
robot_modules["BoozeHound"] = /obj/item/weapon/robot_module/robot/booze
robot_modules["KMine"] = /obj/item/weapon/robot_module/robot/kmine
robot_modules["Stray"] = /obj/item/weapon/robot_module/robot/stray
+ robot_modules["TraumaHound"] = /obj/item/weapon/robot_module/robot/medical/trauma
return 1
//Just add a new proc with the robot_module type if you wish to run some other vore code
@@ -270,19 +271,27 @@
src.modules += new /obj/item/device/dogborg/boop_module(src) //Boop the crew.
src.modules += new /obj/item/device/healthanalyzer(src) // See who's hurt specificially.
src.modules += new /obj/item/weapon/reagent_containers/syringe(src) //In case the chemist is nice!
- src.modules += new /obj/item/weapon/reagent_containers/glass/beaker(src)//For holding the chemicals when the chemist is nice
+ src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src)//For holding the chemicals when the chemist is nice, made it the large variant in 2022
src.modules += new /obj/item/device/sleevemate(src) //Lets them scan people.
src.modules += new /obj/item/weapon/shockpaddles/robot/hound(src) //Paws of life
+ src.modules += new /obj/item/weapon/inflatable_dispenser/robot(src) //This is kinda important for rescuing people without making it worse for everyone
+ src.modules += new /obj/item/weapon/gripper/medical(src) //Let them do literally anything in medbay other than patch external damage and lick people
+ src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src) //dropper is nice to have for so much actually
src.emag = new /obj/item/weapon/dogborg/pounce(src) //Pounce
- var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(2000)
+ var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(10000)
synths += medicine
var/obj/item/stack/medical/advanced/clotting/C = new (src)
+ var/obj/item/stack/medical/splint/S = new /obj/item/stack/medical/splint(src)
C.uses_charge = 1
- C.charge_costs = list(1000)
+ C.charge_costs = list(5000)
C.synths = list(medicine)
+ S.uses_charge = 1
+ S.charge_costs = list(1000)
+ S.synths = list(medicine)
src.modules += C
+ src.modules += S
var/datum/matter_synth/water = new /datum/matter_synth(500)
water.name = "Water reserves"
@@ -318,6 +327,92 @@
R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
+/obj/item/weapon/robot_module/robot/medical/trauma
+ name = "traumahound robot module"
+ channels = list("Medical" = 1)
+ networks = list(NETWORK_MEDICAL)
+ subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor)
+ pto_type = PTO_MEDICAL
+ can_be_pushed = 0
+ sprites = list(
+ "Traumahound" = "traumavale",
+ "Drake" = "draketrauma"
+ )
+
+/obj/item/weapon/robot_module/robot/medical/trauma/New(var/mob/living/silicon/robot/R)
+ src.modules += new /obj/item/device/healthanalyzer(src)
+ src.modules += new /obj/item/weapon/dogborg/jaws/small(src)
+ src.modules += new /obj/item/device/dogborg/boop_module(src)
+ src.modules += new /obj/item/weapon/autopsy_scanner(src)
+ src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/hemostat/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/retractor/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/cautery/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/bonegel/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/FixOVein/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/bonesetter/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/bioregen/cyborg(src) //let them succ
+ src.modules += new /obj/item/weapon/gripper/no_use/organ(src)
+ src.modules += new /obj/item/weapon/gripper/medical(src)
+ src.modules += new /obj/item/weapon/shockpaddles/robot/hound(src) //Paws of life
+ src.modules += new /obj/item/weapon/reagent_containers/dropper(src) // Allows surgeon borg to fix necrosis
+ src.modules += new /obj/item/weapon/reagent_containers/syringe(src)
+ src.emag = new /obj/item/weapon/dogborg/pounce(src) //Pounce, also, lets not give them polyacid spray
+
+ var/datum/matter_synth/water = new /datum/matter_synth(500)
+ water.name = "Water reserves"
+ water.recharge_rate = 0
+ R.water_res = water
+ synths += water
+
+ var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src)
+ T.water = water
+ src.modules += T
+
+ var/obj/item/weapon/reagent_containers/borghypo/hound/trauma/H = new /obj/item/weapon/reagent_containers/borghypo/hound/trauma(src) //surgeon chems
+ H.water = water
+ src.modules += H
+
+ var/obj/item/device/dogborg/sleeper/compactor/trauma/B = new /obj/item/device/dogborg/sleeper/compactor/trauma(src) //So they can nom people and heal them
+ B.water = water
+ src.modules += B
+
+ var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(10000) //this is so they can do brute/burn surgeries and fix assisted/prosthetic organs
+ synths += medicine
+
+ var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src)
+ var/obj/item/stack/medical/advanced/bruise_pack/S = new /obj/item/stack/medical/advanced/bruise_pack(src)
+ var/obj/item/stack/medical/advanced/ointment/O = new /obj/item/stack/medical/advanced/ointment(src)
+ N.uses_charge = 1
+ N.charge_costs = list(1000)
+ N.synths = list(medicine)
+ S.uses_charge = 1
+ S.charge_costs = list(1000)
+ S.synths = list(medicine)
+ O.uses_charge = 1
+ O.charge_costs = list(1000)
+ O.synths = list(medicine)
+ src.modules += N
+ src.modules += S
+ src.modules += O
+
+ R.icon = 'icons/mob/widerobot_trauma_vr.dmi'
+ R.wideborg_dept = 'icons/mob/widerobot_trauma_vr.dmi'
+ R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
+ R.ui_style_vr = TRUE
+ R.pixel_x = -16
+ R.old_x = -16
+ R.default_pixel_x = -16
+ R.dogborg = TRUE
+ R.wideborg = TRUE
+ R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
+ R.verbs |= /mob/living/silicon/robot/proc/robot_mount
+ R.verbs |= /mob/living/proc/toggle_rider_reins
+ R.verbs |= /mob/living/proc/shred_limb
+ R.verbs |= /mob/living/silicon/robot/proc/rest_style
+ ..()
+
/obj/item/weapon/robot_module/robot/ert
name = "Emergency Responce module"
channels = list("Security" = 1)
@@ -486,7 +581,15 @@
//Added a circuit gripper
src.modules += new /obj/item/weapon/gripper/circuit(src)
src.modules += new /obj/item/weapon/gripper/no_use/organ/robotics(src)
+ //src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src) //these are on the normal one, but do not appear to have a purpose other than borging
+ //src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src) //so I am leaving them here but commented out because robotics no do the borging w/o medical
+ src.modules += new /obj/item/weapon/portable_destructive_analyzer(src) //destructive analyzer option for pref respect while also being able to do job
src.modules += new /obj/item/weapon/gripper/no_use/mech(src)
+ src.modules += new /obj/item/weapon/shockpaddles/robot/jumper(src) //unkilling synths may be important actually
+ src.modules += new /obj/item/weapon/melee/baton/slime/robot(src) //save the xenobio from themselves
+ src.modules += new /obj/item/weapon/gun/energy/taser/xeno/robot(src) //save the xenobio from themselves from a distance
+ src.modules += new /obj/item/device/xenoarch_multi_tool(src) //go find fancy rock
+ src.modules += new /obj/item/weapon/pickaxe/excavationdrill(src) //go get fancy rock
src.emag = new /obj/item/weapon/hand_tele(src)
var/datum/matter_synth/water = new /datum/matter_synth(500)
@@ -578,27 +681,27 @@
//Painfully slow charger regen but high capacity. Also starts with low amount.
var/datum/matter_synth/metal = new /datum/matter_synth/metal()
metal.name = "Steel reserves"
- metal.recharge_rate = 100
+ metal.recharge_rate = 500
metal.max_energy = 50000
metal.energy = 10000
var/datum/matter_synth/glass = new /datum/matter_synth/glass()
glass.name = "Glass reserves"
- glass.recharge_rate = 100
+ glass.recharge_rate = 500
glass.max_energy = 50000
glass.energy = 10000
var/datum/matter_synth/wood = new /datum/matter_synth/wood()
wood.name = "Wood reserves"
- wood.recharge_rate = 100
+ wood.recharge_rate = 500
wood.max_energy = 50000
wood.energy = 10000
var/datum/matter_synth/plastic = new /datum/matter_synth/plastic()
plastic.name = "Plastic reserves"
- plastic.recharge_rate = 100
+ plastic.recharge_rate = 500
plastic.max_energy = 50000
plastic.energy = 10000
var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel()
plasteel.name = "Plasteel reserves"// Adding plasteel synthesizer to move in-line with Engiborg.
- plasteel.recharge_rate = 100
+ plasteel.recharge_rate = 250
plasteel.max_energy = 20000
plasteel.energy = 10000
var/datum/matter_synth/water = new /datum/matter_synth(500)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm
index fead3b9f9f4..5744e4f10d4 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm
@@ -10,7 +10,6 @@
LANGUAGE_SIIK = 0,
LANGUAGE_AKHANI = 0,
LANGUAGE_SKRELLIAN = 0,
- LANGUAGE_SKRELLIANFAR = 0,
LANGUAGE_ROOTLOCAL = 0,
LANGUAGE_GUTTER = 1,
LANGUAGE_SCHECHI = 0,
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 22370bd2e1b..dac06100362 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -25,6 +25,8 @@
var/obj/item/weapon/card/id/idcard
var/idcard_type = /obj/item/weapon/card/id/synthetic
+ var/sensor_type = 0 //VOREStation add - silicon omni "is sensor on or nah"
+
var/hudmode = null
/mob/living/silicon/Initialize()
@@ -221,66 +223,50 @@
var/synth = (L in speech_synthesizer_langs)
. += "[L.name] ([get_language_prefix()][L.key])[synth ? default_str : null] Speech Synthesizer: [synth ? "YES" : "NOT SUPPORTED"] [L.desc]
"
-/mob/living/silicon/proc/toggle_sensor_mode()
- var/sensor_type = tgui_input_list(usr, "Please select sensor type.", "Sensor Integration", list("Security","Medical","Disable"))
- switch(sensor_type)
- if ("Security")
- if(plane_holder)
- //Enable Security planes
- plane_holder.set_vis(VIS_CH_ID,TRUE)
- plane_holder.set_vis(VIS_CH_WANTED,TRUE)
- plane_holder.set_vis(VIS_CH_IMPLOYAL,TRUE)
- plane_holder.set_vis(VIS_CH_IMPTRACK,TRUE)
- plane_holder.set_vis(VIS_CH_IMPCHEM,TRUE)
+/mob/living/silicon/proc/toggle_sensor_mode() //VOREStation Add to make borgs use omni starts here - Tank, clueless bird
+ if(sensor_type)
+ if(plane_holder)
+ //Enable the planes, its basically just AR-Bs
+ plane_holder.set_vis(VIS_CH_ID,TRUE)
+ plane_holder.set_vis(VIS_CH_WANTED,TRUE)
+ plane_holder.set_vis(VIS_CH_IMPLOYAL,TRUE) //antag related so prob not useful but leaving them in
+ plane_holder.set_vis(VIS_CH_IMPTRACK,TRUE)
+ plane_holder.set_vis(VIS_CH_IMPCHEM,TRUE)
+ plane_holder.set_vis(VIS_CH_STATUS_R,TRUE)
+ plane_holder.set_vis(VIS_CH_HEALTH_VR,TRUE)
+ plane_holder.set_vis(VIS_CH_BACKUP,TRUE) //backup stuff from silicon_vr is here now
+ return TRUE
- //Disable Medical planes
- plane_holder.set_vis(VIS_CH_STATUS,FALSE)
- plane_holder.set_vis(VIS_CH_HEALTH,FALSE)
+ else
+ if(plane_holder)
+ //Disable the planes
+ plane_holder.set_vis(VIS_CH_ID,FALSE)
+ plane_holder.set_vis(VIS_CH_WANTED,FALSE)
+ plane_holder.set_vis(VIS_CH_IMPLOYAL,FALSE)
+ plane_holder.set_vis(VIS_CH_IMPTRACK,FALSE)
+ plane_holder.set_vis(VIS_CH_IMPCHEM,FALSE)
+ plane_holder.set_vis(VIS_CH_STATUS_R,FALSE)
+ plane_holder.set_vis(VIS_CH_HEALTH_VR,FALSE)
+ plane_holder.set_vis(VIS_CH_BACKUP,FALSE)
+ return FALSE
- to_chat(src, "Security records overlay enabled.")
- if ("Medical")
- if(plane_holder)
- //Disable Security planes
- plane_holder.set_vis(VIS_CH_ID,FALSE)
- plane_holder.set_vis(VIS_CH_WANTED,FALSE)
- plane_holder.set_vis(VIS_CH_IMPLOYAL,FALSE)
- plane_holder.set_vis(VIS_CH_IMPTRACK,FALSE)
- plane_holder.set_vis(VIS_CH_IMPCHEM,FALSE)
-
- //Enable Medical planes
- plane_holder.set_vis(VIS_CH_STATUS,TRUE)
- plane_holder.set_vis(VIS_CH_HEALTH,TRUE)
-
- to_chat(src, "Life signs monitor overlay enabled.")
- if ("Disable")
- if(plane_holder)
- //Disable Security planes
- plane_holder.set_vis(VIS_CH_ID,FALSE)
- plane_holder.set_vis(VIS_CH_WANTED,FALSE)
- plane_holder.set_vis(VIS_CH_IMPLOYAL,FALSE)
- plane_holder.set_vis(VIS_CH_IMPTRACK,FALSE)
- plane_holder.set_vis(VIS_CH_IMPCHEM,FALSE)
-
- //Disable Medical planes
- plane_holder.set_vis(VIS_CH_STATUS,FALSE)
- plane_holder.set_vis(VIS_CH_HEALTH,FALSE)
- to_chat(src, "Sensor augmentations disabled.")
-
- hudmode = sensor_type //This is checked in examine.dm on humans, so they can see medical/security records depending on mode
+//hudmode = sensor_type //This is checked in examine.dm on humans, so they can see medical/security records depending on mode
+//I made it work like omnis with records by adding stuff to examine.dm
+//VOREStation Add ends here
/mob/living/silicon/verb/pose()
set name = "Set Pose"
set desc = "Sets a description which will be shown when someone examines you."
set category = "IC"
- pose = sanitize(input(usr, "This is [src]. It is...", "Pose", null) as text)
+ pose = sanitize(tgui_input_text(usr, "This is [src]. It is...", "Pose", null))
/mob/living/silicon/verb/set_flavor()
set name = "Set Flavour Text"
set desc = "Sets an extended description of your character's features."
set category = "IC"
- flavor_text = sanitize(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text)
+ flavor_text = sanitize(tgui_input_text(usr, "Please enter your new flavour text.", "Flavour text", null))
/mob/living/silicon/binarycheck()
return 1
diff --git a/code/modules/mob/living/silicon/silicon_vr.dm b/code/modules/mob/living/silicon/silicon_vr.dm
index 168b3facabb..73a25dbd76f 100644
--- a/code/modules/mob/living/silicon/silicon_vr.dm
+++ b/code/modules/mob/living/silicon/silicon_vr.dm
@@ -4,18 +4,18 @@
return 1
return ..()
-// For handling any custom visibility in borgo sensor modes, like sleeve implants
-/mob/living/silicon/toggle_sensor_mode()
- . = ..()
- switch(hudmode) // This is set in parent
- if ("Security")
- //Disable Medical planes
- plane_holder?.set_vis(VIS_CH_BACKUP,FALSE)
-
- if ("Medical")
- //Enable Medical planes
- plane_holder?.set_vis(VIS_CH_BACKUP,TRUE)
-
- if ("Disable")
- //Disable Medical planes
- plane_holder?.set_vis(VIS_CH_BACKUP,FALSE)
+// For handling any custom visibility in borgo sensor modes, like sleeve implants - not needed anymore but leaving anyways - Tank
+///mob/living/silicon/toggle_sensor_mode()
+// . = ..()
+// switch(hudmode) // This is set in parent
+// if ("Security")
+// //Disable Medical planes
+// plane_holder?.set_vis(VIS_CH_BACKUP,FALSE)
+//
+// if ("Medical")
+// //Enable Medical planes
+// plane_holder?.set_vis(VIS_CH_BACKUP,TRUE)
+//
+// if ("Disable")
+// //Disable Medical planes
+// plane_holder?.set_vis(VIS_CH_BACKUP,FALSE)
diff --git a/code/modules/mob/living/simple_mob/defense.dm b/code/modules/mob/living/simple_mob/defense.dm
index 1340beb8d5f..7c31c3c83d2 100644
--- a/code/modules/mob/living/simple_mob/defense.dm
+++ b/code/modules/mob/living/simple_mob/defense.dm
@@ -45,7 +45,22 @@
if(I_HURT)
var/armor = run_armor_check(def_zone = null, attack_flag = "melee")
- apply_damage(damage = harm_intent_damage, damagetype = BURN, def_zone = null, blocked = armor, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE)
+ if(istype(L,/mob/living/carbon/human)) //VOREStation EDIT START Is it a human?
+ var/mob/living/carbon/human/attacker = L //We are a human!
+ var/datum/unarmed_attack/attack = attacker.get_unarmed_attack(src, BP_TORSO) //What attack are we using? Also, just default to attacking the chest.
+ var/rand_damage = rand(1, 5) //Like normal human attacks, let's randomize the damage...
+ var/real_damage = rand_damage //Let's go ahead and start calculating our damage.
+ var/hit_dam_type = attack.damage_type //Let's get the type of damage. Brute? Burn? Defined by the unarmed_attack.
+ real_damage += attack.get_unarmed_damage(attacker) //Add the damage that their special attack has. Some have 0. Some have 15.
+ if(real_damage <= damage_threshold)
+ L.visible_message("\The [L] uselessly hits \the [src]!")
+ L.do_attack_animation(src)
+ return
+ apply_damage(damage = real_damage, damagetype = hit_dam_type, def_zone = null, blocked = armor, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE)
+ L.visible_message("\The [L] [pick(attack.attack_verb)] \the [src]!")
+ L.do_attack_animation(src)
+ return //VOREStation EDIT END
+ apply_damage(damage = harm_intent_damage, damagetype = BRUTE, def_zone = null, blocked = armor, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE) //VOREStation EDIT Somebody set this to burn instead of brute.
L.visible_message("\The [L] [response_harm] \the [src]!")
L.do_attack_animation(src)
diff --git a/code/modules/mob/living/simple_mob/simple_mob.dm b/code/modules/mob/living/simple_mob/simple_mob.dm
index d9d560188a1..4808a3ff4e9 100644
--- a/code/modules/mob/living/simple_mob/simple_mob.dm
+++ b/code/modules/mob/living/simple_mob/simple_mob.dm
@@ -309,7 +309,7 @@
/mob/living/simple_mob/Bump(var/atom/A)
if(mobcard && istype(A, /obj/machinery/door))
var/obj/machinery/door/D = A
- if(!istype(D, /obj/machinery/door/firedoor) && !istype(D, /obj/machinery/door/blast) && !istype(D, /obj/machinery/door/airlock/lift) && D.check_access(mobcard))
+ if(client && !istype(D, /obj/machinery/door/firedoor) && !istype(D, /obj/machinery/door/blast) && !istype(D, /obj/machinery/door/airlock/lift) && D.check_access(mobcard))
D.open()
else
..()
diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm
index dae0fe62942..72cf906d67f 100644
--- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm
+++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm
@@ -51,12 +51,14 @@
var/obj/item/device/radio/headset/mob_headset/mob_radio //Adminbus headset for simplemob shenanigans.
does_spin = FALSE
can_be_drop_pred = TRUE // Mobs are pred by default.
+ var/damage_threshold = 0 //For some mobs, they have a damage threshold required to deal damage to them.
// Release belly contents before being gc'd!
/mob/living/simple_mob/Destroy()
release_vore_contents()
- prey_excludes.Cut()
+ if(prey_excludes)
+ prey_excludes.Cut()
return ..()
//For all those ID-having mobs
@@ -213,6 +215,7 @@
// Since they have bellies, add verbs to toggle settings on them.
verbs |= /mob/living/simple_mob/proc/toggle_digestion
verbs |= /mob/living/simple_mob/proc/toggle_fancygurgle
+ verbs |= /mob/living/proc/vertical_nom
//A much more detailed version of the default /living implementation
var/obj/belly/B = new /obj/belly(src)
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm
index 16253f4b7f8..7a6a3458d9a 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm
@@ -160,7 +160,7 @@
else
to_chat(user, "\The [src] takes a bite of \the [O].")
if(user != src)
- to_chat(user, "\The [user] feeds \the [O] to you.")
+ to_chat(src, "\The [user] feeds \the [O] to you.")
playsound(src, 'sound/items/eatfood.ogg', 75, 1)
/mob/living/simple_mob/vore/alienanimals/catslug/attack_hand(mob/living/carbon/human/M as mob)
@@ -714,7 +714,7 @@
//Admin-spawn only catslugs below - Expect overpowered things & silliness below
//=============================================================================
-//Deathsquad catslug
+//Deathsquad catslug
/mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/deathslug
name = "Asset Purrtection"
desc = "What are you doing staring at this angry little fella? Run."
@@ -739,7 +739,7 @@
"bomb" = 40,
"bio" = 100,
"rad" = 100
- )
+ )
minbodytemp = 0
maxbodytemp = 5000
@@ -751,8 +751,8 @@
mob_radio = new /obj/item/device/radio/headset/mob_headset(src)
mob_radio.frequency = DTH_FREQ //Can't tell if bugged, deathsquad freq in general seems broken
mobcard.access |= get_all_station_access()
-
-//Syndicate catslug
+
+//Syndicate catslug
/mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/syndislug
name = "Mercenyary"
desc = "What are you doing staring at this crimson-hardsuit wearing angry little fella? Run."
@@ -769,7 +769,7 @@
health = 100
taser_kill = 0
melee_damage_lower = 15
- melee_damage_upper = 20
+ melee_damage_upper = 20
mob_size = MOB_MEDIUM //Something something hardsuits are heavy.
siemens_coefficient = 0
armor = list(
@@ -780,7 +780,7 @@
"bomb" = 80,
"bio" = 100,
"rad" = 60
- )
+ )
minbodytemp = 0
maxbodytemp = 5000
@@ -797,7 +797,7 @@
mob_radio.recalculateChannels(1)
mobcard.access |= get_all_station_access()
-//ERT catslug
+//ERT catslug
/mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/responseslug
name = "Emeowgency Responder"
desc = "The cavalry has arrived."
@@ -822,7 +822,7 @@
"bomb" = 30,
"bio" = 100,
"rad" = 100
- )
+ )
minbodytemp = 0
maxbodytemp = 5000
@@ -834,7 +834,7 @@
/mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/responseslug/Initialize()
. = ..()
mob_radio = new /obj/item/device/radio/headset/mob_headset(src)
- mob_radio.frequency = ERT_FREQ
+ mob_radio.frequency = ERT_FREQ
mob_radio.centComm = 1
mob_radio.ks2type = /obj/item/device/encryptionkey/ert
mob_radio.keyslot2 = new /obj/item/device/encryptionkey/ert(mob_radio)
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm
index 0520bd53514..3d7c0d40595 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm
@@ -192,7 +192,7 @@
. = ..()
icon_living = "spookyghost-[rand(1,2)]"
icon_state = icon_living
- addtimer(CALLBACK(src, .proc/death), 2 MINUTES)
+ addtimer(CALLBACK(src, .proc/death), 35 SECONDS)
update_icon()
/datum/ai_holder/simple_mob/melee/space_ghost
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm
index 32ab7da58aa..036e07c2d40 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm
@@ -870,18 +870,6 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
speak_chance = 0.5
wander = TRUE
-/datum/language/teppi
- name = "Teppi"
- desc = "The language of the meat things."
- speech_verb = "rumbles"
- ask_verb = "tilts"
- exclaim_verb = "roars"
- key = "i"
- flags = WHITELISTED
- machine_understands = 0
- space_chance = 100
- syllables = list("gyoh", "snoof", "gyoooooOOOooh", "iuuuuh", "gyuuuuh")
-
////////////////// Da babby //////////////
/mob/living/simple_mob/vore/alienanimals/teppi/baby
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/cockroach.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/cockroach.dm
index b170d192d0d..29b54fad742 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/cockroach.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/cockroach.dm
@@ -4,6 +4,7 @@
real_name = "cockroach"
desc = "This station is just crawling with bugs."
tt_desc = "E Blattella germanica"
+ icon = 'icons/mob/animal_vr.dmi'
icon_state = "cockroach"
item_state = "cockroach"
icon_living = "cockroach"
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm
index c700533d802..55788974a29 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm
@@ -79,7 +79,7 @@
if( ishuman(AM) )
if(!stat)
var/mob/M = AM
- M.visible_message("[bicon(src)] Squeek!")
+ M.visible_message("\icon[src][bicon(src)] Squeek!")
playsound(src, 'sound/effects/mouse_squeak.ogg', 35, 1)
..()
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm
index 97da0b49ade..fd5fd72404f 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm
@@ -1,9 +1,9 @@
/mob/living/simple_mob/animal/passive/mouse
nutrition = 20 //To prevent draining maint mice for infinite food. Low nutrition has no mechanical effect on simplemobs, so wont hurt mice themselves.
-
- no_vore = TRUE //Mice can't eat others due to the amount of bugs caused by it.
vore_taste = "cheese"
+ restrict_vore_ventcrawl = TRUE
+
can_pull_size = ITEMSIZE_TINY // Rykka - Uncommented these. Not sure why they were commented out in the original Polaris files, maybe a mob rework mistake?
can_pull_mobs = MOB_PULL_NONE // Rykka - Uncommented these. Not sure why they were commented out in the original Polaris files, maybe a mob rework mistake?
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm
index ea41d429f86..c29ce4d1370 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm
@@ -257,7 +257,7 @@ var/list/_cat_default_emotes = list(
if(named)
to_chat(user, "\The [name] already has a name!")
else
- var/tmp_name = sanitizeSafe(input(user, "Give \the [name] a name", "Name"), MAX_NAME_LEN)
+ var/tmp_name = sanitizeSafe(tgui_input_text(user, "Give \the [name] a name", "Name", null, MAX_NAME_LEN), MAX_NAME_LEN)
if(length(tmp_name) > 50)
to_chat(user, "The name can be at most 50 characters long.")
else
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fennec.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fennec.dm
new file mode 100644
index 00000000000..0408c7ff27d
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fennec.dm
@@ -0,0 +1,29 @@
+/mob/living/simple_mob/animal/passive/fennec
+ name = "fennec"
+ desc = "A fox preferring arid climates, also known as a dingler, or a goob."
+ tt_desc = "Vulpes Zerda"
+ icon_state = "fennec"
+ item_state = "fennec"
+
+ movement_cooldown = 0.5 SECONDS
+
+ see_in_dark = 6
+ response_help = "pets"
+ response_disarm = "gently pushes aside"
+ response_harm = "kicks"
+
+ holder_type = /obj/item/weapon/holder/fennec
+ mob_size = MOB_SMALL
+
+ has_langs = list("Cat, Dog") //they're similar, why not.
+
+/mob/living/simple_mob/animal/passive/fennec/faux
+ name = "faux"
+ desc = "Domesticated fennec. Seems to like screaming just as much though."
+
+/mob/living/simple_mob/animal/passive/fennec/Initialize()
+ icon_living = "[initial(icon_state)]"
+ icon_dead = "[initial(icon_state)]_dead"
+ icon_rest = "[initial(icon_state)]_rest"
+ update_icon()
+ return ..()
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm
index c4f41bd3ba8..840b424994e 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm
@@ -47,4 +47,12 @@
add_modifier(/datum/modifier/berserk, 30 SECONDS)
/decl/mob_organ_names/goose
- hit_zones = list("head", "chest", "left leg", "right leg", "left wing", "right wing", "neck")
\ No newline at end of file
+ hit_zones = list("head", "chest", "left leg", "right leg", "left wing", "right wing", "neck")
+
+/mob/living/simple_mob/animal/space/goose/white
+ icon = 'icons/mob/animal_vr.dmi'
+ icon_state = "whitegoose"
+ icon_living = "whitegoose"
+ icon_dead = "whitegoose_dead"
+ name = "white goose"
+ desc = "And just when you thought it was a lovely day..."
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm
index df0984878ed..82c3cfaaa67 100644
--- a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm
@@ -8,7 +8,7 @@
In modern times, this exosuit has been dethroned from that title, yet it remains one of the more well built and armored \
exosuits, despite its age.\
\
- During the First Contact War against the Unathi, there was a need for various new technologies to be developed \
+ During the Hegemony War against the Unathi, there was a need for various new technologies to be developed \
to counter the Unathi war machine. One of many solutions created was the Durand, which was made to be heavy and \
well-armored, and be capable of powering the various weapons that could be mounted onto it. Presently, the \
Durand now generally serves as corporate asset protection hardware, due to modern militaries moving on to newer, \
@@ -17,7 +17,7 @@
/mob/living/simple_mob/mechanical/mecha/combat/durand
name = "durand"
- desc = "An aging combat exosuit utilized by many corporations. It was originally developed to fight in the First Contact War."
+ desc = "An aging combat exosuit utilized by many corporations. It was originally developed to fight in the Hegemony War."
catalogue_data = list(/datum/category_item/catalogue/technology/durand)
icon_state = "durand"
movement_cooldown = 10
@@ -70,7 +70,7 @@
return ..()
/mob/living/simple_mob/mechanical/mecha/combat/durand/defensive/mercenary
- desc = "An aging combat exosuit utilized by many corporations. It was originally developed to fight in the First Contact War.\
+ desc = "An aging combat exosuit utilized by many corporations. It was originally developed to fight in the Hegemony War.\
This one has been retrofitted into a turret."
projectiletype = /obj/item/projectile/beam/heavylaser/fakeemitter
diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm
index e43caff8c34..eaa796f45cf 100644
--- a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm
@@ -13,6 +13,7 @@
turn_sound = 'sound/mecha/mechturn.ogg'
maxHealth = 300
mob_size = MOB_LARGE
+ damage_threshold = 5 //Anything that's 5 or less damage will not do damage.
organ_names = /decl/mob_organ_names/mecha
diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm
index 2f4b37f8dd0..af5d0a17f3d 100644
--- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm
@@ -25,7 +25,7 @@
softfall = TRUE //Beings made of Hellmarble and powered by the tears of the damned are not concerned with mortal things such as 'gravity'.
parachuting = TRUE
- has_langs = list(LANGUAGE_GALCOM, LANGUAGE_CULT, LANGUAGE_OCCULT)
+ has_langs = list(LANGUAGE_GALCOM, LANGUAGE_CULT)
has_eye_glow = TRUE
diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm
index a5782f880cb..4730c3ae4b8 100644
--- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm
@@ -225,7 +225,11 @@
if(T.density) // No walls.
continue
for(var/atom/movable/AM in T)
- if(AM.density || istype(AM, /mob/living/simple_mob/slime))
+ if(istype(AM, /mob/living/simple_mob/slime) || !(AM.CanPass(src, T)))
+ free = FALSE
+ break
+ for(var/atom/movable/AM in get_turf(src))
+ if(!(AM.CanPass(src, T)) && !(AM == src))
free = FALSE
break
@@ -238,7 +242,7 @@
var/list/babies = list()
for(var/i = 1 to split_amount)
- babies.Add(make_new_slime())
+ babies.Add(make_new_slime(no_step = i))
var/mob/living/simple_mob/slime/new_slime = pick(babies)
new_slime.universal_speak = universal_speak
@@ -253,7 +257,7 @@
to_chat(src, span("warning", "I have not evolved enough to reproduce yet..."))
// Used when reproducing or dying.
-/mob/living/simple_mob/slime/xenobio/proc/make_new_slime(var/desired_type)
+/mob/living/simple_mob/slime/xenobio/proc/make_new_slime(var/desired_type, var/no_step)
var/t = src.type
if(desired_type)
t = desired_type
@@ -275,7 +279,8 @@
baby.faction = faction
baby.friends = friends.Copy()
- step_away(baby, src)
+ if(no_step != 1)
+ step_away(baby, src)
return baby
/mob/living/simple_mob/slime/xenobio/get_description_interaction()
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm b/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm
index e4e58f75dc6..4b36fb7b1e5 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm
@@ -39,7 +39,7 @@
"rad" = 0
)
- has_langs = list("Coulrian")
+ has_langs = list("Animal")
/mob/living/simple_mob/animal/passive/honkpet/attack_hand(mob/living/user as mob)
if(user.a_intent == I_DISARM)
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm
index 82375f0a153..e69e0fc54ad 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm
@@ -169,6 +169,10 @@
pred = loc.loc
else if(isliving(prey.loc))
pred = loc
+ else if(ispAI(src))
+ var/mob/living/silicon/pai/pocketpal = src
+ if(isbelly(pocketpal.card.loc))
+ pred = pocketpal.card.loc.loc
else
to_chat(prey, "You are not inside anyone.")
return
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm
index ef1aa44b59d..d1e7c294e79 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm
@@ -51,6 +51,7 @@ List of things solar grubs should be able to do:
var/datum/powernet/PN // Our powernet
var/obj/structure/cable/attached // the attached cable
var/shock_chance = 10 // Beware
+ var/tracked = FALSE
/datum/say_list/solargrub
emote_see = list("squelches", "squishes")
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm
index 0589a353912..454b4cafcd4 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm
@@ -47,6 +47,8 @@ var/global/list/grub_machine_overlays = list()
var/obj/machinery/abstract_grub_machine/powermachine
var/power_drained = 0
+ var/tracked = FALSE
+
ai_holder_type = /datum/ai_holder/simple_mob/solargrub_larva
/mob/living/simple_mob/animal/solargrub_larva/New()
@@ -173,7 +175,8 @@ var/global/list/grub_machine_overlays = list()
/mob/living/simple_mob/animal/solargrub_larva/proc/expand_grub()
eject_from_machine()
visible_message("\The [src] suddenly balloons in size!")
- new /mob/living/simple_mob/vore/solargrub(get_turf(src))
+ var/mob/living/simple_mob/vore/solargrub/adult = new(get_turf(src))
+ adult.tracked = tracked
// grub.power_drained = power_drained //TODO
qdel(src)
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
index b15a7e0e188..48953e15a84 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
@@ -11,6 +11,31 @@
verbs |= /mob/living/simple_mob/proc/set_name
verbs |= /mob/living/simple_mob/proc/set_desc
+ ooc_notes = client.prefs.metadata
+ digestable = client.prefs_vr.digestable
+ devourable = client.prefs_vr.devourable
+ absorbable = client.prefs_vr.absorbable
+ feeding = client.prefs_vr.feeding
+ can_be_drop_prey = client.prefs_vr.can_be_drop_prey
+ can_be_drop_pred = client.prefs_vr.can_be_drop_pred
+ allow_inbelly_spawning = client.prefs_vr.allow_inbelly_spawning
+ allow_spontaneous_tf = client.prefs_vr.allow_spontaneous_tf
+ digest_leave_remains = client.prefs_vr.digest_leave_remains
+ allowmobvore = client.prefs_vr.allowmobvore
+ permit_healbelly = client.prefs_vr.permit_healbelly
+ noisy = client.prefs_vr.noisy
+ selective_preference = client.prefs_vr.selective_preference
+
+ drop_vore = client.prefs_vr.drop_vore
+ stumble_vore = client.prefs_vr.stumble_vore
+ slip_vore = client.prefs_vr.slip_vore
+
+ resizable = client.prefs_vr.resizable
+ show_vore_fx = client.prefs_vr.show_vore_fx
+ step_mechanics_pref = client.prefs_vr.step_mechanics_pref
+ pickup_pref = client.prefs_vr.pickup_pref
+
+
/mob/living/simple_mob/proc/set_name()
set name = "Set Name"
set desc = "Sets your mobs name. You only get to do this once."
@@ -19,7 +44,7 @@
to_chat(src, "You've already set your name. Ask an admin to toggle \"nameset\" to 0 if you really must.")
return
var/newname
- newname = sanitizeSafe(input(src,"Set your name. You only get to do this once. Max 52 chars.", "Name set","") as text, MAX_NAME_LEN)
+ newname = sanitizeSafe(tgui_input_text(src,"Set your name. You only get to do this once. Max 52 chars.", "Name set","", MAX_NAME_LEN), MAX_NAME_LEN)
if (newname)
name = newname
voice_name = newname
@@ -30,7 +55,7 @@
set desc = "Set your description."
set category = "Abilities"
var/newdesc
- newdesc = sanitizeSafe(input(src,"Set your description. Max 4096 chars.", "Description set","") as text, MAX_MESSAGE_LEN)
+ newdesc = sanitizeSafe(tgui_input_text(src,"Set your description. Max 4096 chars.", "Description set","", prevent_enter = TRUE), MAX_MESSAGE_LEN)
if(newdesc)
desc = newdesc
diff --git a/code/modules/mob/living/voice/voice.dm b/code/modules/mob/living/voice/voice.dm
index 9caa58cb33d..2752292ee27 100644
--- a/code/modules/mob/living/voice/voice.dm
+++ b/code/modules/mob/living/voice/voice.dm
@@ -80,10 +80,10 @@
set desc = "Changes your name."
set src = usr
- var/new_name = sanitizeSafe(input(src, "Who would you like to be now?", "Communicator", src.client.prefs.real_name) as text, MAX_NAME_LEN)
+ var/new_name = sanitizeSafe(tgui_input_text(src, "Who would you like to be now?", "Communicator", src.client.prefs.real_name, MAX_NAME_LEN), MAX_NAME_LEN)
if(new_name)
if(comm)
- comm.visible_message("[bicon(comm)] [src.name] has left, and now you see [new_name].")
+ comm.visible_message("\icon[comm][bicon(comm)] [src.name] has left, and now you see [new_name].")
//Do a bit of logging in-case anyone tries to impersonate other characters for whatever reason.
var/msg = "[src.client.key] ([src]) has changed their communicator identity's name to [new_name]."
message_admins(msg)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 67466f350d2..e8a847a4a70 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -293,7 +293,7 @@
set src in usr
if(usr != src)
to_chat(usr, "No.")
- var/msg = sanitize(input(usr,"Set the flavor text in your 'examine' verb.","Flavor Text",html_decode(flavor_text)) as message|null, extra = 0) //VOREStation Edit: separating out OOC notes
+ var/msg = sanitize(tgui_input_text(usr,"Set the flavor text in your 'examine' verb.","Flavor Text",html_decode(flavor_text), multiline = TRUE, prevent_enter = TRUE), extra = 0) //VOREStation Edit: separating out OOC notes
if(msg != null)
flavor_text = msg
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index dc1f1fc2196..19476f24606 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -94,6 +94,7 @@
var/list/pinned = list() // List of things pinning this creature to walls (see living_defense.dm)
var/list/embedded = list() // Embedded items, since simple mobs don't have organs.
var/list/languages = list() // For speaking/listening.
+ var/list/language_keys = list() // List of language keys indexing languages
var/species_language = null // For species who want reset to use a specified default.
var/only_species_language = 0 // For species who can only speak their default and no other languages. Does not affect understanding.
var/list/speak_emote = list("says") // Verbs used when speaking. Defaults to 'say' if speak_emote is null.
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index b36a1ee37c3..e7158df528f 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -132,7 +132,7 @@
// Emulates targetting a specific body part, and miss chances
// May return null if missed
// miss_chance_mod may be negative.
-/proc/get_zone_with_miss_chance(zone, var/mob/target, var/miss_chance_mod = 0, var/ranged_attack=0)
+/proc/get_zone_with_miss_chance(zone, var/mob/target, var/miss_chance_mod = 0, var/ranged_attack=0, var/force_hit = FALSE)
zone = check_zone(zone)
if(!ranged_attack)
@@ -144,6 +144,9 @@
if(G.state >= GRAB_AGGRESSIVE)
return zone
+ if(force_hit)
+ return zone
+
var/miss_chance = 10
if (zone in base_miss_chance)
miss_chance = base_miss_chance[zone]
@@ -602,33 +605,33 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT)
//The base miss chance for the different defence zones
var/list/global/base_miss_chance = list(
- "head" = 40,
- "chest" = 10,
- "groin" = 20,
- "l_leg" = 20,
- "r_leg" = 20,
- "l_arm" = 20,
- "r_arm" = 20,
- "l_hand" = 50,
- "r_hand" = 50,
- "l_foot" = 50,
- "r_foot" = 50,
+ BP_HEAD = 40,
+ BP_TORSO = 10,
+ BP_GROIN = 20,
+ BP_L_LEG = 20,
+ BP_R_LEG = 20,
+ BP_L_ARM = 20,
+ BP_R_ARM = 20,
+ BP_L_HAND = 50,
+ BP_R_HAND = 50,
+ BP_L_FOOT = 50,
+ BP_R_FOOT = 50,
)
//Used to weight organs when an organ is hit randomly (i.e. not a directed, aimed attack).
//Also used to weight the protection value that armour provides for covering that body part when calculating protection from full-body effects.
var/list/global/organ_rel_size = list(
- "head" = 25,
- "chest" = 70,
- "groin" = 30,
- "l_leg" = 25,
- "r_leg" = 25,
- "l_arm" = 25,
- "r_arm" = 25,
- "l_hand" = 10,
- "r_hand" = 10,
- "l_foot" = 10,
- "r_foot" = 10,
+ BP_HEAD = 25,
+ BP_TORSO = 70,
+ BP_GROIN = 30,
+ BP_L_LEG = 25,
+ BP_R_LEG = 25,
+ BP_L_ARM = 25,
+ BP_R_ARM = 25,
+ BP_L_HAND = 10,
+ BP_R_HAND = 10,
+ BP_L_FOOT = 10,
+ BP_R_FOOT = 10,
)
/mob/proc/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash)
diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm
index b3a1f39454d..25347558735 100644
--- a/code/modules/mob/mob_transformation_simple.dm
+++ b/code/modules/mob/mob_transformation_simple.dm
@@ -9,7 +9,7 @@
return
if(!new_type)
- new_type = input(usr, "Mob type path:", "Mob type") as text|null
+ new_type = tgui_input_text(usr, "Mob type path:", "Mob type")
if(istext(new_type))
new_type = text2path(new_type)
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 166a15c0c24..f2bcdba4ab3 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -181,7 +181,7 @@
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
to_chat(usr, "The round is either not ready, or has already finished...")
return
-
+
var/time_till_respawn = time_till_respawn()
if(time_till_respawn == -1) // Special case, never allowed to respawn
to_chat(usr, "Respawning is not allowed!")
@@ -223,7 +223,7 @@
return 0
var/datum/species/S = GLOB.all_species[client.prefs.species]
-
+
if(!(S.spawn_flags & SPECIES_CAN_JOIN))
tgui_alert_async(src,"Your current species, [client.prefs.species], is not available for play on the station.")
return 0
@@ -366,7 +366,7 @@
popup.set_content(dat)
popup.open()
-/mob/new_player/proc/time_till_respawn()
+/mob/proc/time_till_respawn()
if(!ckey)
return -1 // What?
@@ -386,14 +386,21 @@
/mob/new_player/proc/IsJobAvailable(rank)
var/datum/job/job = job_master.GetJob(rank)
- if(!job) return 0
- if(!job.is_position_available()) return 0
- if(jobban_isbanned(src,rank)) return 0
- if(!job.player_old_enough(src.client)) return 0
+ if(!job)
+ return 0
+ if(!job.is_position_available())
+ return 0
+ if(jobban_isbanned(src,rank))
+ return 0
+ if(!job.player_old_enough(src.client))
+ return 0
//VOREStation Add
- if(!job.player_has_enough_playtime(src.client)) return 0
- if(!is_job_whitelisted(src,rank)) return 0
- if(!job.player_has_enough_pto(src.client)) return 0
+ if(!job.player_has_enough_playtime(src.client))
+ return 0
+ if(!is_job_whitelisted(src,rank))
+ return 0
+ if(!job.player_has_enough_pto(src.client))
+ return 0
//VOREStation Add End
return 1
@@ -596,6 +603,11 @@
if(chosen_language)
if(is_lang_whitelisted(src,chosen_language) || (new_character.species && (chosen_language.name in new_character.species.secondary_langs)))
new_character.add_language(lang)
+ for(var/key in client.prefs.language_custom_keys)
+ if(client.prefs.language_custom_keys[key])
+ var/datum/language/keylang = GLOB.all_languages[client.prefs.language_custom_keys[key]]
+ if(keylang)
+ new_character.language_keys[key] = keylang
// And uncomment this, too.
//new_character.dna.UpdateSE()
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 66d712bc449..c2e5a319512 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -205,6 +205,8 @@
// Determine what job is marked as 'High' priority, and dress them up as such.
if(job_civilian_low & ASSISTANT)
previewJob = job_master.GetJob(USELESS_JOB)
+ else if(ispAI(client.mob)) //VOREStation Edit! - pAIs shouldn't wear job gear~!
+ //Don't do anything!
else
for(var/datum/job/job in job_master.occupations)
var/job_flag
@@ -259,6 +261,7 @@
mannequin.update_transform() //VOREStation Edit to update size/shape stuff.
mannequin.toggle_tail(setting = TRUE)
mannequin.toggle_wing(setting = TRUE)
+ mannequin.update_tail_showing()
COMPILE_OVERLAYS(mannequin)
update_character_previews(new /mutable_appearance(mannequin))
diff --git a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
index f6b0c77abeb..c63abe4c162 100644
--- a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
@@ -9,7 +9,7 @@
name = "You should not see this..."
icon = 'icons/mob/vore/ears_vr.dmi'
do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1
// Species-unique ears
@@ -34,11 +34,11 @@
/datum/sprite_accessory/ears/taj_ears
name = "tajaran, colorable (old)"
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
/datum/sprite_accessory/ears/taj_ears_tall
name = "tajaran tall, colorable (old)"
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
/datum/sprite_accessory/ears/alt_ram_horns
name = "Solid ram horns"
@@ -119,6 +119,15 @@
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
+/datum/sprite_accessory/ears/antennae_eye
+ name = "antennae eye, colorable"
+ desc = ""
+ icon_state = "antennae"
+ extra_overlay = "antennae_eye_1"
+ extra_overlay2 = "antennae_eye_2"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
/datum/sprite_accessory/ears/curly_bug
name = "curly antennae, colorable"
desc = ""
@@ -380,19 +389,19 @@
color_blend_mode = ICON_MULTIPLY
/datum/sprite_accessory/ears/elfs1
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
/datum/sprite_accessory/ears/elfs2
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
/datum/sprite_accessory/ears/elfs3
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
/datum/sprite_accessory/ears/elfs4
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
/datum/sprite_accessory/ears/elfs5
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
/datum/sprite_accessory/ears/sleek
name = "sleek ears"
@@ -841,4 +850,13 @@
icon_state = "bunny-tall"
extra_overlay = "bunny-tall-inner"
do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/altevian
+ name = "Altevian Ears"
+ desc = ""
+ icon = 'icons/mob/vore/ears_vr.dmi'
+ icon_state = "altevian"
+ extra_overlay = "altevian-inner"
+ do_colouration = 1
color_blend_mode = ICON_MULTIPLY
\ No newline at end of file
diff --git a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm
index 742480858cb..aa01f6c4654 100644
--- a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm
@@ -3,7 +3,7 @@
/datum/sprite_accessory/marking //Override for base markings
color_blend_mode = ICON_ADD
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
/datum/sprite_accessory/marking/vr_vulp_belly
name = "belly fur (Vulp)"
@@ -850,4 +850,39 @@
icon = 'icons/mob/human_races/markings_vr.dmi'
icon_state = "thunderthighs"
color_blend_mode = ICON_MULTIPLY
- body_parts = list(BP_L_LEG,BP_R_LEG)
\ No newline at end of file
+ body_parts = list(BP_L_LEG,BP_R_LEG)
+
+/datum/sprite_accessory/marking/vr_altevian_snout
+ name = "Altevian Snout"
+ icon = 'icons/mob/human_races/markings_vr.dmi'
+ icon_state = "altevian-snout"
+ color_blend_mode = ICON_MULTIPLY
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/vr_altevian_chin
+ name = "Altevian Chin"
+ icon = 'icons/mob/human_races/markings_vr.dmi'
+ icon_state = "altevian-chin"
+ color_blend_mode = ICON_MULTIPLY
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/vr_altevian_nose
+ name = "Altevian Nose"
+ icon = 'icons/mob/human_races/markings_vr.dmi'
+ icon_state = "altevian-nose"
+ color_blend_mode = ICON_MULTIPLY
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/vr_altevian_fangs
+ name = "Altevian Fangs"
+ icon = 'icons/mob/human_races/markings_vr.dmi'
+ icon_state = "altevian-fangs"
+ color_blend_mode = ICON_MULTIPLY
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/vr_altevian_incisors
+ name = "Altevian Incisors"
+ icon = 'icons/mob/human_races/markings_vr.dmi'
+ icon_state = "altevian-incisors"
+ color_blend_mode = ICON_MULTIPLY
+ body_parts = list(BP_HEAD)
\ No newline at end of file
diff --git a/code/modules/mob/new_player/sprite_accessories_tail.dm b/code/modules/mob/new_player/sprite_accessories_tail.dm
index 06dcdb9ebb0..f5b6aefe4a7 100644
--- a/code/modules/mob/new_player/sprite_accessories_tail.dm
+++ b/code/modules/mob/new_player/sprite_accessories_tail.dm
@@ -25,6 +25,10 @@
var/clip_mask_state = null //Icon state to generate clip mask. Clip mask is used to 'clip' off the lower part of clothing such as jumpsuits & full suits.
var/icon/clip_mask = null //Instantiated clip mask of given icon and state
+ // VOREStation Edit: Taur Loafing
+ var/can_loaf = FALSE
+ var/loaf_offset = 0
+
//species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) //Removing Polaris whitelits, ones we need are defined in our files
/datum/sprite_accessory/tail/New()
diff --git a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
index a1c1034be52..80379dd74ce 100644
--- a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
@@ -9,7 +9,9 @@
name = "You should not see this..."
icon = 'icons/mob/vore/tails_vr.dmi'
do_colouration = 0 //Set to 1 to enable coloration using the tail color.
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
+
+ var/list/lower_layer_dirs = list(SOUTH)
/datum/sprite_accessory/tail/New()
. = ..()
@@ -1175,6 +1177,14 @@
color_blend_mode = ICON_MULTIPLY
ckeys_allowed = list("prettiebyrd")
+/datum/sprite_accessory/tail/altevian
+ name = "Altevian Tail"
+ icon = 'icons/mob/vore/tails_vr.dmi'
+ icon_state = "altevian"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ lower_layer_dirs = list(SOUTH, WEST)
+
/datum/sprite_accessory/tail/tentacle
name = "Tentacle, colorable (vwag)"
desc = ""
@@ -1201,4 +1211,4 @@
/datum/sprite_accessory/tail/longtail/shadekin_tail/shadekin_tail_long
name = "Shadekin Long Tail"
- icon_state = "shadekin_long_s"
+ icon_state = "shadekin_long_s"
\ No newline at end of file
diff --git a/code/modules/mob/new_player/sprite_accessories_taur.dm b/code/modules/mob/new_player/sprite_accessories_taur.dm
index 4637ac008e1..4288f9bbc6d 100644
--- a/code/modules/mob/new_player/sprite_accessories_taur.dm
+++ b/code/modules/mob/new_player/sprite_accessories_taur.dm
@@ -285,6 +285,11 @@
suit_sprites = 'icons/mob/taursuits_slug.dmi'
icon_sprite_tag = "slug"
+/datum/sprite_accessory/tail/taur/slug/snail
+ name = "Snail (Taur)"
+ icon_state = "slug_s"
+ extra_overlay = "snail_shell_marking"
+
/datum/sprite_accessory/tail/taur/frog
name = "Frog (Taur)"
icon_state = "frog_s"
diff --git a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm
index 320bea38984..4eee0021770 100644
--- a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm
@@ -69,6 +69,15 @@
extra_overlay2 = "wolf_markings_2"
//icon_sprite_tag = "wolf2c"
+/datum/sprite_accessory/tail/taur/wolf/wolf_2c_wag
+ name = "Wolf 3-color (Taur, vwag)"
+ icon_state = "wolf_s"
+ extra_overlay = "wolf_markings"
+ extra_overlay2 = "wolf_markings_2"
+ ani_state = "fatwolf_s"
+ extra_overlay_w = "fatwolf_markings"
+ extra_overlay2_w = "wolf_markings_2"
+
/datum/sprite_accessory/tail/taur/wolf/fatwolf_2c
name = "Fat Wolf 3-color (Taur)"
icon_state = "fatwolf_s"
@@ -135,6 +144,13 @@
extra_overlay = "naga_markings"
//icon_sprite_tag = "naga2c"
+/datum/sprite_accessory/tail/taur/naga/alt_2c
+ name = "Naga alt style dual-color (Taur)"
+ suit_sprites = 'icons/mob/taursuits_naga_alt_vr.dmi'
+ icon_state = "altnaga_s"
+ extra_overlay = "altnaga_markings"
+ //icon_sprite_tag = "altnaga2c"
+
/datum/sprite_accessory/tail/taur/horse
name = "Horse (Taur)"
icon_state = "horse_s"
@@ -403,6 +419,14 @@
extra_overlay = "drake_markings"
suit_sprites = 'icons/mob/taursuits_drake_vr.dmi'
icon_sprite_tag = "drake"
+ can_loaf = TRUE // VOREStation Edit: Taur Loafing
+ loaf_offset = 6 // VOREStation Edit: Taur Loafing
+
+/datum/sprite_accessory/tail/taur/ch/fatdrake
+ name = "Drake (Fat Taur dual-color)"
+ icon_state = "fatdrake_s"
+ extra_overlay = "fatdrake_markings"
+ icon_sprite_tag = "drake"
/datum/sprite_accessory/tail/taur/otie
name = "Otie (Taur)"
@@ -592,4 +616,4 @@
extra_overlay2 = "noodle_markings_2"
suit_sprites = 'icons/mob/taursuits_noodle_vr.dmi'
clip_mask_state = "taur_clip_mask_noodle"
- icon_sprite_tag = "noodle"
\ No newline at end of file
+ icon_sprite_tag = "noodle"
diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm
index 2773ee36602..c3539daee13 100644
--- a/code/modules/mob/new_player/sprite_accessories_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_vr.dm
@@ -6,7 +6,7 @@
/datum/sprite_accessory/hair
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use the default hairstyles.
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use the default hairstyles.
/datum/sprite_accessory/hair/astolfo
name = "Astolfo"
@@ -91,7 +91,7 @@
name = "Bald"
icon_state = "bald"
gender = MALE
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //Lets all the races be bald if they want.
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //Lets all the races be bald if they want.
/datum/sprite_accessory/hair/ponytail6_fixed
name = "Ponytail 6 but fixed"
@@ -472,20 +472,20 @@
/datum/sprite_accessory/facial_hair
icon = 'icons/mob/human_face_or_vr.dmi'
color_blend_mode = ICON_MULTIPLY
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use the facial hair styles.
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use the facial hair styles.
/datum/sprite_accessory/facial_hair/shaved
name = "Shaved"
icon_state = "bald"
gender = NEUTER
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This needed to be manually defined, apparantly.
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This needed to be manually defined, apparantly.
/datum/sprite_accessory/facial_hair/neck_fluff
name = "Neck Fluff"
icon = 'icons/mob/human_face_or_vr.dmi'
icon_state = "facial_neckfluff"
gender = NEUTER
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW)
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN)
/datum/sprite_accessory/facial_hair/vulp_none
name = "None"
diff --git a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm
index c747c4923b9..bb39bc8ce3b 100644
--- a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm
@@ -9,7 +9,7 @@
name = "You should not see this..."
icon = 'icons/mob/vore/wings_vr.dmi'
do_colouration = 0 //Set to 1 to enable coloration using the tail color.
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1
/datum/sprite_accessory/wing/shock //Unable to split the tail from the wings in the sprite, so let's just classify it as wings.
@@ -226,3 +226,12 @@
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
extra_overlay = "drago_wing_2"
+
+/datum/sprite_accessory/wing/aeromorph_flat
+ name = "aeromorph wings, flat"
+ desc = ""
+ icon_state = "aeromorph_flat"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "aeromorph_flat_1"
+ extra_overlay2 = "aeromorph_flat_2"
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index d51d048da18..a603ee36f0f 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -180,6 +180,8 @@
// Okay, we're definitely now trying to invoke a language (probably)
// This "[]" is probably unnecessary but BYOND will runtime if a number is used
var/datum/language/L = GLOB.language_keys["[language_key]"]
+ if((language_key in language_keys) && language_keys[language_key])
+ L = language_keys[language_key]
// MULTILINGUAL_SPACE enforces a space after the language key
if(client && (client.prefs.multilingual_mode == MULTILINGUAL_SPACE) && (text2ascii(copytext(selection, 3, 4)) != 32)) // If we're looking for a space and we don't find one
@@ -249,7 +251,7 @@
// There are a few things that will make us want to ignore all other languages in - namely, HIVEMIND languages.
var/datum/language/L = current[1]
- if(L && (L.flags & HIVEMIND || L.flags & SIGNLANG))
+ if(L && (L.flags & HIVEMIND || L.flags & SIGNLANG || L.flags & INAUDIBLE))
return new /datum/multilingual_say_piece(L, trim(sanitize(strip_prefixes(message))))
if(i + 1 > length(prefix_locations)) // We are out of lookaheads, that means the rest of the message is in cur lang
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index 703aac2813f..d8ed1c311e1 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -42,7 +42,7 @@
var/input
if(!message)
- input = sanitize_or_reflect(input(src,"Choose an emote to display.") as text|null, src)
+ input = sanitize_or_reflect(tgui_input_text(src,"Choose an emote to display."), src)
else
input = message
@@ -67,6 +67,8 @@
else
spawn(0)
M.show_message(message, 2)
+ if(M.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ M << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
for(var/obj/O as anything in vis_objs)
spawn(0)
@@ -123,7 +125,7 @@
to_chat(src, "You cannot speak in IC (muted).")
return
if (!message)
- message = input(usr, "Type a message to say.","Psay") as text|null
+ message = tgui_input_text(usr, "Type a message to say.","Psay")
message = sanitize_or_reflect(message,src)
if (!message)
return
@@ -145,10 +147,14 @@
else
pb = db.pred_body
to_chat(pb, "The captive mind of \the [M] thinks, \"[message]\"") //To our pred if dominated brain
+ if(pb.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ pb << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
f = TRUE
else if(M.absorbed && isbelly(M.loc))
pb = M.loc.loc
to_chat(pb, "\The [M] thinks, \"[message]\"") //To our pred if absorbed
+ if(pb.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ pb << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
f = TRUE
if(pb) //We are prey, let's do the prey thing.
@@ -157,11 +163,15 @@
if(istype(I, /mob/living/dominated_brain) && I != M)
var/mob/living/dominated_brain/db = I
to_chat(db, "The captive mind of \the [M] thinks, \"[message]\"") //To any dominated brains in the pred
+ if(db.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ db << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
f = TRUE
for(var/B in pb.vore_organs)
for(var/mob/living/L in B)
if(L.absorbed && L != M && L.ckey)
to_chat(L, "\The [M] thinks, \"[message]\"") //To any absorbed people in the pred
+ if(L.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ L << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
f = TRUE
//Let's also check and see if there's anyone inside of us to send the message to.
@@ -169,18 +179,26 @@
if(istype(I, /mob/living/dominated_brain))
var/mob/living/dominated_brain/db = I
to_chat(db, "\The [M] thinks, \"[message]\"") //To any dominated brains inside us
+ if(db.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ db << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
f = TRUE
for(var/B in M.vore_organs)
for(var/mob/living/L in B)
if(L.absorbed)
to_chat(L, "\The [M] thinks, \"[message]\"") //To any absorbed people inside us
+ if(L.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ L << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
f = TRUE
if(f) //We found someone to send the message to
if(pb)
to_chat(M, "You think \"[message]\"") //To us if we are the prey
+ if(M.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ M << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
else
to_chat(M, "You think \"[message]\"") //To us if we are the pred
+ if(M.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ M << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
for (var/mob/G in player_list)
if (istype(G, /mob/new_player))
continue
@@ -204,7 +222,7 @@
to_chat(src, "You cannot speak in IC (muted).")
return
if (!message)
- message = input(usr, "Type a message to emote.","Pme") as text|null
+ message = tgui_input_text(usr, "Type a message to emote.","Pme")
message = sanitize_or_reflect(message,src)
if (!message)
return
@@ -225,11 +243,15 @@
else
pb = db.pred_body
to_chat(pb, "\The [M] [message]") //To our pred if dominated brain
+ if(pb.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ pb << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
f = TRUE
else if(M.absorbed && isbelly(M.loc))
pb = M.loc.loc
to_chat(pb, "\The [M] [message]") //To our pred if absorbed
+ if(pb.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ pb << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
f = TRUE
if(pb) //We are prey, let's do the prey thing.
@@ -238,11 +260,15 @@
if(istype(I, /mob/living/dominated_brain) && I != M)
var/mob/living/dominated_brain/db = I
to_chat(db, "\The [M] [message]") //To any dominated brains in the pred
+ if(db.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ db << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
f = TRUE
for(var/B in pb.vore_organs)
for(var/mob/living/L in B)
if(L.absorbed && L != M && L.ckey)
to_chat(L, "\The [M] [message]") //To any absorbed people in the pred
+ if(L.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ L << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
f = TRUE
//Let's also check and see if there's anyone inside of us to send the message to.
@@ -250,18 +276,26 @@
if(istype(I, /mob/living/dominated_brain))
var/mob/living/dominated_brain/db = I
to_chat(db, "\The [M] [message]") //To any dominated brains inside us
+ if(db.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ db << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
f = TRUE
for(var/B in M.vore_organs)
for(var/mob/living/L in B)
if(L.absorbed)
to_chat(L, "\The [M] [message]") //To any absorbed people inside us
+ if(L.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ L << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
f = TRUE
if(f) //We found someone to send the message to
if(pb)
to_chat(M, "\The [M] [message]") //To us if we are the prey
+ if(M.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ M << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
else
to_chat(M, "\The [M] [message]") //To us if we are the pred
+ if(M.is_preference_enabled(/datum/client_preference/subtle_sounds))
+ M << sound('sound/talksounds/subtle_sound.ogg', volume = 50)
for (var/mob/G in player_list)
if (istype(G, /mob/new_player))
continue
diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm
index 35fe2d8bbb2..197e472e920 100644
--- a/code/modules/mob/typing_indicator.dm
+++ b/code/modules/mob/typing_indicator.dm
@@ -51,7 +51,7 @@
set hidden = 1
set_typing_indicator(TRUE)
- var/message = tgui_input_message(usr, "Type your message:", "Emote")
+ var/message = tgui_input_text(usr, "Type your message:", "Emote", multiline = TRUE)
set_typing_indicator(FALSE)
if(message)
@@ -63,6 +63,7 @@
set hidden = 1
var/message = tgui_input_text(usr, "Type your message:", "Whisper")
+
if(message)
whisper(message)
@@ -70,6 +71,7 @@
set name = ".Subtle"
set hidden = 1
- var/message = tgui_input_message(usr, "Type your message:", "Subtle")
+ var/message = tgui_input_text(usr, "Type your message:", "Subtle", multiline = TRUE)
+
if(message)
me_verb_subtle(message)
diff --git a/code/modules/modular_computers/NTNet/NTNet.dm b/code/modules/modular_computers/NTNet/NTNet.dm
index 71c1e4feb87..1612a3227d2 100644
--- a/code/modules/modular_computers/NTNet/NTNet.dm
+++ b/code/modules/modular_computers/NTNet/NTNet.dm
@@ -10,21 +10,30 @@ var/global/datum/ntnet/ntnet_global = new()
var/list/available_news = list()
var/list/chat_channels = list()
var/list/fileservers = list()
- var/list/email_accounts = list() // I guess we won't have more than 999 email accounts active at once in single round, so this will do until Servers are implemented someday.
+ /// Holds all the email accounts that exists. Hopefully won't exceed 999
+ var/list/email_accounts = list()
var/list/banned_nids = list()
- // Amount of logs the system tries to keep in memory. Keep below 999 to prevent byond from acting weirdly.
- // High values make displaying logs much laggier.
+ /// A list of nid - os datum pairs. An OS in this list is not necessarily connected to NTNet or visible on it.
+ var/list/registered_nids = list()
+ /// Amount of log entries the system tries to keep in memory. Keep below 999 to prevent byond from acting weirdly. High values make displaying logs much laggier.
var/setting_maxlogcount = 100
- // These only affect wireless. LAN (consoles) are unaffected since it would be possible to create scenario where someone turns off NTNet, and is unable to turn it back on since it refuses connections
- var/setting_softwaredownload = 1
- var/setting_peertopeer = 1
- var/setting_communication = 1
- var/setting_systemcontrol = 1
- var/setting_disabled = 0 // Setting to 1 will disable all wireless, independently on relays status.
+ /// Programs requiring NTNET_SOFTWAREDOWNLOAD won't work if this is set to FALSE and public-facing device they are connecting with is wireless.
+ var/setting_softwaredownload = TRUE
+ /// Programs requiring NTNET_PEERTOPEER won't work if this is set to FALSE and public-facing device they are connecting with is wireless.
+ var/setting_peertopeer = TRUE
+ /// Programs requiring NTNET_COMMUNICATION won't work if this is set to FALSE and public-facing device they are connecting with is wireless.
+ var/setting_communication = TRUE
+ /// Programs requiring NTNET_SYSTEMCONTROL won't work if this is set to FALSE and public-facing device they are connecting with is wireless.
+ var/setting_systemcontrol = TRUE
- var/intrusion_detection_enabled = 1 // Whether the IDS warning system is enabled
- var/intrusion_detection_alarm = 0 // Set when there is an IDS warning due to malicious (antag) software.
+ /// Setting to TRUE will disable all wireless connections, independently off relays status.
+ var/setting_disabled = FALSE
+
+ /// Whether the IDS warning system is enabled
+ var/intrusion_detection_enabled = TRUE
+ /// Set when there is an IDS warning due to malicious (antag) software.
+ var/intrusion_detection_alarm = FALSE
// If new NTNet datum is spawned, it replaces the old one.
@@ -62,7 +71,13 @@ var/global/datum/ntnet/ntnet_global = new()
else
break
-/datum/ntnet/proc/check_banned(var/NID)
+/datum/ntnet/proc/get_os_by_nid(NID)
+ return registered_nids["[NID]"]
+
+/datum/ntnet/proc/unregister(NID)
+ registered_nids -= "[NID]"
+
+/datum/ntnet/proc/check_banned(NID)
if(!relays || !relays.len)
return FALSE
@@ -138,10 +153,12 @@ var/global/datum/ntnet/ntnet_global = new()
// Resets the IDS alarm
/datum/ntnet/proc/resetIDS()
intrusion_detection_alarm = 0
+ add_log("-!- INTRUSION DETECTION ALARM RESET BY SYSTEM OPERATOR -!-")
/datum/ntnet/proc/toggleIDS()
resetIDS()
intrusion_detection_enabled = !intrusion_detection_enabled
+ add_log("Configuration Updated. Intrusion Detection [intrusion_detection_enabled ? "enabled" : "disabled"].")
// Removes all logs
/datum/ntnet/proc/purge_logs()
@@ -185,4 +202,3 @@ var/global/datum/ntnet/ntnet_global = new()
for(var/datum/ntnet_conversation/chan in chat_channels)
if(chan.id == id)
return chan
-
diff --git a/code/modules/modular_computers/NTNet/emails/email_account.dm b/code/modules/modular_computers/NTNet/emails/email_account.dm
index b5f93887143..7cccdeb6bcc 100644
--- a/code/modules/modular_computers/NTNet/emails/email_account.dm
+++ b/code/modules/modular_computers/NTNet/emails/email_account.dm
@@ -1,12 +1,22 @@
/datum/computer_file/data/email_account/
var/list/inbox = list()
+ var/list/outbox = list()
var/list/spam = list()
var/list/deleted = list()
var/login = ""
var/password = ""
- var/can_login = TRUE // Whether you can log in with this account. Set to false for system accounts
- var/suspended = FALSE // Whether the account is banned by the SA.
+ /// Whether you can log in with this account. Set to FALSE for system accounts.
+ var/can_login = TRUE
+ /// Whether the account is banned by the SA.
+ var/suspended = FALSE
+ var/connected_clients = list()
+
+ var/fullname = "N/A"
+ var/assignment = "N/A"
+
+ var/notification_mute = FALSE
+ var/notification_sound = "*beep*"
/datum/computer_file/data/email_account/calculate_size()
size = 1
@@ -64,7 +74,28 @@
can_login = FALSE
/datum/computer_file/data/email_account/service/broadcaster/
- login = "broadcast@internal-services.nt"
+ login = EMAIL_BROADCAST
+
+/datum/computer_file/data/email_account/service/broadcaster/receive_mail(var/datum/computer_file/data/email_message/received_message, var/relayed)
+ if(suspended || !istype(received_message) || relayed)
+ return FALSE
+ // Possibly exploitable for user spamming so keep admins informed.
+ if(!received_message.spam)
+ log_and_message_admins("Broadcast email address used by [usr]. Message title: [received_message.title].")
+
+ spawn(0)
+ for(var/datum/computer_file/data/email_account/email_account in ntnet_global.email_accounts)
+ var/datum/computer_file/data/email_message/new_message = received_message.clone()
+ send_mail(email_account.login, new_message, 1)
+ sleep(2)
+
+ return TRUE
+
+/datum/computer_file/data/email_account/service/document
+ login = EMAIL_DOCUMENTS
+
+/datum/computer_file/data/email_account/service/sysadmin
+ login = EMAIL_SYSADMIN
/datum/computer_file/data/email_account/service/broadcaster/receive_mail(var/datum/computer_file/data/email_message/received_message, var/relayed)
if(!istype(received_message) || relayed)
@@ -79,4 +110,4 @@
send_mail(email_account.login, new_message, 1)
sleep(2)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/modular_computers/computers/modular_computer/variables.dm b/code/modules/modular_computers/computers/modular_computer/variables.dm
index 59c45f993a2..101e7056f9e 100644
--- a/code/modules/modular_computers/computers/modular_computer/variables.dm
+++ b/code/modules/modular_computers/computers/modular_computer/variables.dm
@@ -53,4 +53,12 @@
var/obj/item/weapon/computer_hardware/nano_printer/nano_printer // Nano Printer component of this computer, for your everyday paperwork needs.
var/obj/item/weapon/computer_hardware/hard_drive/portable/portable_drive // Portable data storage
var/obj/item/weapon/computer_hardware/ai_slot/ai_slot // AI slot, an intellicard housing that allows modifications of AIs.
- var/obj/item/weapon/computer_hardware/tesla_link/tesla_link // Tesla Link, Allows remote charging from nearest APC.
\ No newline at end of file
+ var/obj/item/weapon/computer_hardware/tesla_link/tesla_link // Tesla Link, Allows remote charging from nearest APC.
+
+ var/modifiable = TRUE // can't be modified or damaged if false
+
+ var/stores_pen = FALSE
+ var/obj/item/weapon/pen/stored_pen
+
+ var/interact_sounds
+ var/interact_sound_volume = 40
diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm
index bb415524322..b477862535c 100644
--- a/code/modules/modular_computers/file_system/computer_file.dm
+++ b/code/modules/modular_computers/file_system/computer_file.dm
@@ -1,18 +1,35 @@
var/global/file_uid = 0
/datum/computer_file/
- var/filename = "NewFile" // Placeholder. No spacebars
- var/filetype = "XXX" // File full names are [filename].[filetype] so like NewFile.XXX in this case
- var/size = 1 // File size in GQ. Integers only!
- var/obj/item/weapon/computer_hardware/hard_drive/holder // Holder that contains this file.
- var/unsendable = 0 // Whether the file may be sent to someone via NTNet transfer or other means.
- var/undeletable = 0 // Whether the file may be deleted. Setting to 1 prevents deletion/renaming/etc.
- var/uid // UID of this file
+ /// Placeholder. Whitespace and most special characters are not allowed.
+ var/filename = "NewFile"
+ /// File full names are [filename].[filetype] so like NewFile.XXX in this case
+ var/filetype = "XXX"
+ /// File size in GQ. Integers only!
+ var/size = 1
+ /// Holder that contains this file.
+ var/obj/item/weapon/computer_hardware/hard_drive/holder
+ //// Whether the file may be sent to someone via NTNet transfer, email or other means.
+ var/unsendable = FALSE
+ /// Whether the file may be deleted. Setting to TRUE prevents deletion/renaming/etc.
+ var/undeletable = FALSE
+ /// Whether the file is hidden from view in the OS
+ var/hidden = FALSE
+ /// Protects files that should never be edited by the user due to special properties.
+ var/read_only = FALSE
+ /// UID of this file
+ var/uid
+ /// Any metadata the file uses.
+ var/list/metadata
+ /// Paper type to use for printing
+ var/papertype = /obj/item/weapon/paper
-/datum/computer_file/New()
+/datum/computer_file/New(list/md = null)
..()
uid = file_uid
file_uid++
+ if(islist(md))
+ metadata = md.Copy()
/datum/computer_file/Destroy()
if(!holder)
@@ -30,10 +47,13 @@ var/global/file_uid = 0
var/datum/computer_file/temp = new type
temp.unsendable = unsendable
temp.undeletable = undeletable
+ temp.hidden = hidden
temp.size = size
+ if(metadata)
+ temp.metadata = metadata.Copy()
if(rename)
temp.filename = filename + "(Copy)"
else
temp.filename = filename
temp.filetype = filetype
- return temp
\ No newline at end of file
+ return temp
diff --git a/code/modules/modular_computers/file_system/data.dm b/code/modules/modular_computers/file_system/data.dm
index 7ad48bea54b..c58ad7ac2b8 100644
--- a/code/modules/modular_computers/file_system/data.dm
+++ b/code/modules/modular_computers/file_system/data.dm
@@ -1,10 +1,11 @@
// /data/ files store data in string format.
// They don't contain other logic for now.
/datum/computer_file/data
- var/stored_data = "" // Stored data in string format.
filetype = "DAT"
+
+ var/stored_data = "" // Stored data in string format.
var/block_size = 250
- var/do_not_edit = 0 // Whether the user will be reminded that the file probably shouldn't be edited.
+ var/do_not_edit = FALSE // Whether the user will be reminded that the file probably shouldn't be edited.
/datum/computer_file/data/clone()
var/datum/computer_file/data/temp = ..()
@@ -15,5 +16,43 @@
/datum/computer_file/data/proc/calculate_size()
size = max(1, round(length(stored_data) / block_size))
+/datum/computer_file/data/proc/generate_file_data(mob/user)
+ return digitalPencode2html(stored_data)
+
/datum/computer_file/data/logfile
filetype = "LOG"
+
+/datum/computer_file/data/text
+ filetype = "TXT"
+
+/// Mapping tool - creates a named modular computer file in a computer's storage on late initialize.
+/// Use this to do things like automatic records and blackboxes. Alternative for paper records.
+/// Values can be in the editor for each map or as a subtype.
+/// This is an obj because raw atoms can't be placed in DM or third-party mapping tools.
+///obj/effect/computer_file_creator
+// name = "computer file creator"
+// desc = "This is a mapping tool used for installing text files onto a modular device when it's mapped on top of them. If you see it, it's bugged."
+// icon = 'icons/effects/landmarks.dmi'
+// icon_state = "x3"
+// anchored = TRUE
+// unacidable = TRUE
+// simulated = FALSE
+// invisibility = 101
+// /// The name that the file will have once it's created.
+// var/file_name = "helloworld"
+// /// The contents of this file. Uses paper formatting.
+// var/file_info = "Hello World!"
+
+///obj/effect/computer_file_creator/Initialize()
+// . = ..()
+// return INITIALIZE_HINT_LATELOAD
+
+///obj/effect/computer_file_creator/LateInitialize()
+// var/turf/T = get_turf(src)
+// for (var/obj/O in T)
+// if (!istype(O, /obj/machinery/computer/modular) && !istype(O, /obj/item/modular_computer))
+// continue
+// var/datum/extension/interactive/ntos/os = get_extension(O, /datum/extension/interactive/ntos)
+// if (os)
+// os.create_data_file(file_name, file_info, /datum/computer_file/data/text)
+// qdel(src)
diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm
index d5e55940d0c..905a6434be7 100644
--- a/code/modules/modular_computers/file_system/program.dm
+++ b/code/modules/modular_computers/file_system/program.dm
@@ -1,30 +1,39 @@
// /program/ files are executable programs that do things.
/datum/computer_file/program
- filetype = "PRG"
filename = "UnknownProgram" // File name. FILE NAME MUST BE UNIQUE IF YOU WANT THE PROGRAM TO BE DOWNLOADABLE FROM NTNET!
+ filetype = "PRG"
+
var/required_access = null // List of required accesses to run/download the program.
var/requires_access_to_run = 1 // Whether the program checks for required_access when run.
var/requires_access_to_download = 1 // Whether the program checks for required_access when downloading.
+
// TGUIModule
var/datum/tgui_module/TM = null // If the program uses TGUIModule, put it here and it will be automagically opened. Otherwise implement tgui_interact.
var/tguimodule_path = null // Path to tguimodule, make sure to set this if implementing new program.
- // Etc Program stuff
var/program_state = PROGRAM_STATE_KILLED// PROGRAM_STATE_KILLED or PROGRAM_STATE_BACKGROUND or PROGRAM_STATE_ACTIVE - specifies whether this program is running.
var/obj/item/modular_computer/computer // Device that runs this program.
+
var/filedesc = "Unknown Program" // User-friendly name of this program.
var/extended_desc = "N/A" // Short description of this program's function.
+ /// Category that this program belongs to.
+ var/category = PROG_MISC
+ var/usage_flags = PROGRAM_ALL // Bitflags (PROGRAM_CONSOLE, PROGRAM_LAPTOP, PROGRAM_TABLET combination) or PROGRAM_ALL
+
var/program_icon_state = null // Program-specific screen icon state
var/program_key_state = "standby_key" // Program-specific keyboard icon state
var/program_menu_icon = "newwin" // Icon to use for program's link in main menu
+ var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /nano/images/status_icons. Be careful not to use too large images!
+
var/requires_ntnet = 0 // Set to 1 for program to require nonstop NTNet connection to run. If NTNet connection is lost program crashes.
var/requires_ntnet_feature = 0 // Optional, if above is set to 1 checks for specific function of NTNet (currently NTNET_SOFTWAREDOWNLOAD, NTNET_PEERTOPEER, NTNET_SYSTEMCONTROL and NTNET_COMMUNICATION)
- var/ntnet_status = 1 // NTNet status, updated every tick by computer running this program. Don't use this for checks if NTNet works, computers do that. Use this for calculations, etc.
- var/usage_flags = PROGRAM_ALL // Bitflags (PROGRAM_CONSOLE, PROGRAM_LAPTOP, PROGRAM_TABLET combination) or PROGRAM_ALL
var/network_destination = null // Optional string that describes what NTNet server/system this program connects to. Used in default logging.
+
+ var/ntnet_status = 1 // NTNet status, updated every tick by computer running this program. Don't use this for checks if NTNet works, computers do that. Use this for calculations, etc.
var/available_on_ntnet = 1 // Whether the program can be downloaded from NTNet. Set to 0 to disable.
var/available_on_syndinet = 0 // Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to 1 to enable.
+
+ // Misc
var/computer_emagged = 0 // Set to 1 if computer that's running us was emagged. Computer updates this every Process() tick
- var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /nano/images/status_icons. Be careful not to use too large images!
var/ntnet_speed = 0 // GQ/s - current network connectivity transfer rate
/// Name of the tgui interface
var/tgui_id
@@ -230,4 +239,4 @@
/datum/computer_file/program/proc/relaymove(var/mob/M, direction)
if(TM)
- return TM.relaymove(M, direction)
\ No newline at end of file
+ return TM.relaymove(M, direction)
diff --git a/code/modules/modular_computers/file_system/programs/antagonist/hacked_camera.dm b/code/modules/modular_computers/file_system/programs/antagonist/hacked_camera.dm
index 4c1b1537341..3f6f4b1286e 100644
--- a/code/modules/modular_computers/file_system/programs/antagonist/hacked_camera.dm
+++ b/code/modules/modular_computers/file_system/programs/antagonist/hacked_camera.dm
@@ -7,8 +7,8 @@
program_menu_icon = "zoomin"
extended_desc = "This very advanced piece of software uses adaptive programming and large database of cipherkeys to bypass most encryptions used on camera networks. Be warned that system administrator may notice this."
size = 73 // Very large, a price for bypassing ID checks completely.
- available_on_ntnet = 0
- available_on_syndinet = 1
+ available_on_ntnet = FALSE
+ available_on_syndinet = TRUE
/datum/computer_file/program/camera_monitor/hacked/process_tick()
..()
diff --git a/code/modules/modular_computers/file_system/programs/command/card.dm b/code/modules/modular_computers/file_system/programs/command/card.dm
index 47fe4ea2b34..722face19eb 100644
--- a/code/modules/modular_computers/file_system/programs/command/card.dm
+++ b/code/modules/modular_computers/file_system/programs/command/card.dm
@@ -7,5 +7,6 @@
program_menu_icon = "key"
extended_desc = "Program for programming crew ID cards."
required_access = access_change_ids
- requires_ntnet = 0
+ requires_ntnet = FALSE
size = 8
+ category = PROG_COMMAND
diff --git a/code/modules/modular_computers/file_system/programs/command/comm.dm b/code/modules/modular_computers/file_system/programs/command/comm.dm
index 01db6036e97..61b6e97c8c9 100644
--- a/code/modules/modular_computers/file_system/programs/command/comm.dm
+++ b/code/modules/modular_computers/file_system/programs/command/comm.dm
@@ -12,10 +12,11 @@
tguimodule_path = /datum/tgui_module/communications/ntos
extended_desc = "Used to command and control. Can relay long-range communications. This program can not be run on tablet computers."
required_access = access_heads
- requires_ntnet = 1
+ requires_ntnet = TRUE
size = 12
usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP
network_destination = "long-range communication array"
+ category = PROG_COMMAND
var/datum/comm_message_listener/message_core = new
/datum/computer_file/program/comm/clone()
diff --git a/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm
index d7f13fcbc53..8dd86e2baff 100644
--- a/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm
+++ b/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm
@@ -8,9 +8,10 @@
program_menu_icon = "alert"
extended_desc = "This program provides visual interface for the engineering alarm system."
required_access = access_engine
- requires_ntnet = 1
+ requires_ntnet = TRUE
network_destination = "alarm monitoring network"
size = 5
+ category = PROG_MONITOR
var/has_alert = 0
/datum/computer_file/program/alarm_monitor/process_tick()
diff --git a/code/modules/modular_computers/file_system/programs/engineering/atmos_control.dm b/code/modules/modular_computers/file_system/programs/engineering/atmos_control.dm
index 5c25ed8315a..9fc593249f7 100644
--- a/code/modules/modular_computers/file_system/programs/engineering/atmos_control.dm
+++ b/code/modules/modular_computers/file_system/programs/engineering/atmos_control.dm
@@ -7,8 +7,9 @@
program_menu_icon = "shuffle"
extended_desc = "This program allows remote control of air alarms. This program can not be run on tablet computers."
required_access = access_atmospherics
- requires_ntnet = 1
+ requires_ntnet = TRUE
network_destination = "atmospheric control system"
requires_ntnet_feature = NTNET_SYSTEMCONTROL
usage_flags = PROGRAM_LAPTOP | PROGRAM_CONSOLE
+ category = PROG_ENG
size = 17
diff --git a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm
index 5df437790b1..7c3de1ef10b 100644
--- a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm
+++ b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm
@@ -8,9 +8,10 @@
extended_desc = "This program connects to sensors to provide information about electrical systems"
ui_header = "power_norm.gif"
required_access = access_engine
- requires_ntnet = 1
+ requires_ntnet = TRUE
network_destination = "power monitoring system"
size = 9
+ category = PROG_ENG
var/has_alert = 0
/datum/computer_file/program/power_monitor/process_tick()
diff --git a/code/modules/modular_computers/file_system/programs/engineering/rcon_console.dm b/code/modules/modular_computers/file_system/programs/engineering/rcon_console.dm
index ded2e3922f0..1ff068b90a7 100644
--- a/code/modules/modular_computers/file_system/programs/engineering/rcon_console.dm
+++ b/code/modules/modular_computers/file_system/programs/engineering/rcon_console.dm
@@ -7,8 +7,9 @@
program_menu_icon = "power"
extended_desc = "This program allows remote control of power distribution systems. This program can not be run on tablet computers."
required_access = access_engine
- requires_ntnet = 1
+ requires_ntnet = TRUE
network_destination = "RCON remote control system"
requires_ntnet_feature = NTNET_SYSTEMCONTROL
usage_flags = PROGRAM_LAPTOP | PROGRAM_CONSOLE
size = 19
+ category = PROG_ENG
diff --git a/code/modules/modular_computers/file_system/programs/engineering/shutoff_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/shutoff_monitor.dm
index e87991041e0..70027b69e6a 100644
--- a/code/modules/modular_computers/file_system/programs/engineering/shutoff_monitor.dm
+++ b/code/modules/modular_computers/file_system/programs/engineering/shutoff_monitor.dm
@@ -7,7 +7,8 @@
program_menu_icon = "wrench"
extended_desc = "This program allows for remote monitoring and control of emergency shutoff valves."
required_access = access_engine
- requires_ntnet = 1
+ requires_ntnet = TRUE
network_destination = "shutoff valve control computer"
size = 5
+ category = PROG_ENG
var/has_alert = 0
diff --git a/code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm
index 9c3cabd3f70..eafa7308fa6 100644
--- a/code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm
+++ b/code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm
@@ -8,9 +8,10 @@
extended_desc = "This program connects to specially calibrated supermatter sensors to provide information on the status of supermatter-based engines."
ui_header = "smmon_0.gif"
required_access = access_engine
- requires_ntnet = 1
+ requires_ntnet = TRUE
network_destination = "supermatter monitoring system"
size = 5
+ category = PROG_ENG
var/last_status = 0
/datum/computer_file/program/supermatter_monitor/process_tick()
diff --git a/code/modules/modular_computers/file_system/programs/generic/camera.dm b/code/modules/modular_computers/file_system/programs/generic/camera.dm
index 57948d6e8a5..d7ed210e78e 100644
--- a/code/modules/modular_computers/file_system/programs/generic/camera.dm
+++ b/code/modules/modular_computers/file_system/programs/generic/camera.dm
@@ -9,10 +9,12 @@
switch(network)
if(NETWORK_THUNDER)
return 0
- if(NETWORK_ENGINE,NETWORK_ALARM_ATMOS,NETWORK_ALARM_FIRE,NETWORK_ALARM_POWER)
+ if(NETWORK_ENGINE,NETWORK_ENGINEERING,NETWORK_ALARM_ATMOS,NETWORK_ALARM_FIRE,NETWORK_ALARM_POWER)
return access_engine
if(NETWORK_CIRCUITS)
return access_research
+ if(NETWORK_MINE)
+ return access_qm
if(NETWORK_ERT)
return access_cent_specops
//VOREStation Add Start
@@ -38,6 +40,7 @@
size = 12
available_on_ntnet = 1
requires_ntnet = 1
+ category = PROG_MONITOR
// ERT Variant of the program
/datum/computer_file/program/camera_monitor/ert
diff --git a/code/modules/modular_computers/file_system/programs/generic/configurator.dm b/code/modules/modular_computers/file_system/programs/generic/configurator.dm
index 2d660c8b7e3..66c1a25464c 100644
--- a/code/modules/modular_computers/file_system/programs/generic/configurator.dm
+++ b/code/modules/modular_computers/file_system/programs/generic/configurator.dm
@@ -12,6 +12,8 @@
unsendable = 1
undeletable = 1
size = 4
- available_on_ntnet = 0
- requires_ntnet = 0
+ available_on_ntnet = FALSE
+ requires_ntnet = FALSE
tguimodule_path = /datum/tgui_module/computer_configurator
+ usage_flags = PROGRAM_ALL
+ category = PROG_UTIL
diff --git a/code/modules/modular_computers/file_system/programs/generic/email_client.dm b/code/modules/modular_computers/file_system/programs/generic/email_client.dm
index 32d635fef4a..cea1f070ce9 100644
--- a/code/modules/modular_computers/file_system/programs/generic/email_client.dm
+++ b/code/modules/modular_computers/file_system/programs/generic/email_client.dm
@@ -6,10 +6,12 @@
program_key_state = "generic_key"
program_menu_icon = "mail-closed"
size = 7
- requires_ntnet = 1
- available_on_ntnet = 1
+ requires_ntnet = TRUE
+ available_on_ntnet = TRUE
var/stored_login = ""
var/stored_password = ""
+ usage_flags = PROGRAM_ALL
+ category = PROG_OFFICE
tguimodule_path = /datum/tgui_module/email_client
diff --git a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm
index b3827e507c1..30719cf0be1 100644
--- a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm
+++ b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm
@@ -13,6 +13,8 @@
var/open_file
var/error
+ usage_flags = PROGRAM_ALL
+ category = PROG_UTIL
/datum/computer_file/program/filemanager/tgui_act(action, list/params, datum/tgui/ui)
if(..())
@@ -28,7 +30,7 @@
if("PRG_newtextfile")
if(!HDD)
return
- var/newname = sanitize(input(usr, "Enter file name or leave blank to cancel:", "File rename"))
+ var/newname = sanitize(tgui_input_text(usr, "Enter file name or leave blank to cancel:", "File rename"))
if(!newname)
return
var/datum/computer_file/data/F = new/datum/computer_file/data()
@@ -63,7 +65,7 @@
var/oldtext = html_decode(F.stored_data)
oldtext = replacetext(oldtext, "\[br\]", "\n")
- var/newtext = sanitize(replacetext(input(usr, "Editing file [open_file]. You may use most tags used in paper formatting:", "Text Editor", oldtext) as message|null, "\n", "\[br\]"), MAX_TEXTFILE_LENGTH)
+ var/newtext = sanitize(replacetext(tgui_input_text(usr, "Editing file [open_file]. You may use most tags used in paper formatting:", "Text Editor", oldtext, MAX_TEXTFILE_LENGTH, TRUE, prevent_enter = TRUE), "\n", "\[br\]"), MAX_TEXTFILE_LENGTH)
if(!newtext)
return
@@ -151,7 +153,7 @@
data["error"] = error
if(!computer || !HDD)
data["error"] = "I/O ERROR: Unable to access hard drive."
-
+
data["filedata"] = null
data["filename"] = null
data["files"] = list()
diff --git a/code/modules/modular_computers/file_system/programs/generic/game.dm b/code/modules/modular_computers/file_system/programs/generic/game.dm
index 31eaac08d2c..8d3219bc424 100644
--- a/code/modules/modular_computers/file_system/programs/generic/game.dm
+++ b/code/modules/modular_computers/file_system/programs/generic/game.dm
@@ -26,6 +26,8 @@
///Determines which boss image to use on the UI.
var/boss_id = 1
+ usage_flags = PROGRAM_ALL
+
// This is the primary game loop, which handles the logic of being defeated or winning.
/datum/computer_file/program/game/proc/game_check(mob/user)
sleep(5)
diff --git a/code/modules/modular_computers/file_system/programs/generic/news_browser.dm b/code/modules/modular_computers/file_system/programs/generic/news_browser.dm
index e72e30fd388..6eb6fc0f2e0 100644
--- a/code/modules/modular_computers/file_system/programs/generic/news_browser.dm
+++ b/code/modules/modular_computers/file_system/programs/generic/news_browser.dm
@@ -8,7 +8,7 @@
size = 4
requires_ntnet = TRUE
available_on_ntnet = TRUE
-
+ usage_flags = PROGRAM_ALL
tgui_id = "NtosNewsBrowser"
var/datum/computer_file/data/news_article/loaded_article
@@ -106,7 +106,7 @@
if(downloading || !loaded_article)
return
- var/savename = sanitize(input(usr, "Enter file name or leave blank to cancel:", "Save article", loaded_article.filename))
+ var/savename = sanitize(tgui_input_text(usr, "Enter file name or leave blank to cancel:", "Save article", loaded_article.filename))
if(!savename)
return TRUE
var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive
@@ -118,4 +118,3 @@
if("PRG_toggle_archived")
. = TRUE
show_archived = !show_archived
-
diff --git a/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm
index 14e2343e669..fd8884cac85 100644
--- a/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm
+++ b/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm
@@ -16,12 +16,19 @@
var/datum/computer_file/program/downloaded_file = null
var/hacked_download = 0
- var/download_completion = 0 //GQ of downloaded data.
+ ///GQ of downloaded data.
+ var/download_completion = 0
var/download_netspeed = 0
var/downloaderror = ""
- var/obj/item/modular_computer/my_computer = null
var/list/downloads_queue[0]
+ var/file_info
+ var/server
+ usage_flags = PROGRAM_ALL
+ category = PROG_UTIL
+
+ var/obj/item/modular_computer/my_computer = null
+
/datum/computer_file/program/ntnetdownload/kill_program()
..()
abort_file_download()
diff --git a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm
index a9a1e3456d4..ab26ed48623 100644
--- a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm
+++ b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm
@@ -12,12 +12,16 @@
ui_header = "ntnrc_idle.gif"
available_on_ntnet = 1
tgui_id = "NtosNetChat"
- var/last_message // Used to generate the toolbar icon
+ /// Used to generate the toolbar icon
+ var/last_message
var/username
var/active_channel
var/list/channel_history = list()
- var/operator_mode = FALSE // Channel operator mode
- var/netadmin_mode = FALSE // Administrator mode (invisible to other users + bypasses passwords)
+ /// Channel operator mode
+ var/operator_mode = FALSE
+ /// Administrator mode (invisible to other users + bypasses passwords)
+ var/netadmin_mode = FALSE
+ usage_flags = PROGRAM_ALL
/datum/computer_file/program/chatclient/New()
username = "DefaultUser[rand(100, 999)]"
@@ -169,7 +173,7 @@
var/list/data = list()
data["can_admin"] = can_run(user, FALSE, access_network)
return data
-
+
/datum/computer_file/program/chatclient/tgui_data(mob/user)
if(!ntnet_global || !ntnet_global.chat_channels)
return list()
@@ -223,4 +227,4 @@
data["authed"] = FALSE
data["messages"] = list()
- return data
\ No newline at end of file
+ return data
diff --git a/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm b/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm
index ea88d3597e0..1c73f44baa9 100644
--- a/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm
+++ b/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm
@@ -8,11 +8,12 @@ var/global/nttransfer_uid = 0
program_key_state = "generic_key"
program_menu_icon = "transferthick-e-w"
size = 7
- requires_ntnet = 1
+ requires_ntnet = TRUE
requires_ntnet_feature = NTNET_PEERTOPEER
network_destination = "other device via P2P tunnel"
- available_on_ntnet = 1
+ available_on_ntnet = TRUE
tgui_id = "NtosNetTransfer"
+ category = PROG_UTIL
var/error = "" // Error screen
var/server_password = "" // Optional password to download the file.
@@ -23,7 +24,7 @@ var/global/nttransfer_uid = 0
var/download_completion = 0 // Download progress in GQ
var/actual_netspeed = 0 // Displayed in the UI, this is the actual transfer speed.
var/unique_token // UID of this program
- var/upload_menu = 0 // Whether we show the program list and upload menu
+ var/upload_menu = FALSE // Whether we show the program list and upload menu
/datum/computer_file/program/nttransfer/New()
unique_token = nttransfer_uid
@@ -86,14 +87,14 @@ var/global/nttransfer_uid = 0
data["download_progress"] = download_completion
data["download_netspeed"] = actual_netspeed
data["download_name"] = "[downloaded_file.filename].[downloaded_file.filetype]"
-
+
data["uploading"] = !!provided_file
if(provided_file)
data["upload_uid"] = unique_token
data["upload_clients"] = connected_clients.len
data["upload_haspassword"] = server_password ? 1 : 0
data["upload_filename"] = "[provided_file.filename].[provided_file.filetype]"
-
+
data["upload_filelist"] = list()
if(upload_menu)
var/list/all_files = list()
@@ -104,7 +105,7 @@ var/global/nttransfer_uid = 0
"size" = F.size
)))
data["upload_filelist"] = all_files
-
+
data["servers"] = list()
if(!(downloaded_file || provided_file || upload_menu))
var/list/all_servers = list()
@@ -133,7 +134,7 @@ var/global/nttransfer_uid = 0
if(!remote || !remote.provided_file)
return
if(remote.server_password)
- var/pass = sanitize(input(usr, "Code 401 Unauthorized. Please enter password:", "Password required"))
+ var/pass = sanitize(tgui_input_text(usr, "Code 401 Unauthorized. Please enter password:", "Password required"))
if(pass != remote.server_password)
error = "Incorrect Password"
return
@@ -151,7 +152,7 @@ var/global/nttransfer_uid = 0
provided_file = null
return TRUE
if("PRG_setpassword")
- var/pass = sanitize(input(usr, "Enter new server password. Leave blank to cancel, input 'none' to disable password.", "Server security", "none"))
+ var/pass = sanitize(tgui_input_text(usr, "Enter new server password. Leave blank to cancel, input 'none' to disable password.", "Server security", "none"))
if(!pass)
return
if(pass == "none")
diff --git a/code/modules/modular_computers/file_system/programs/generic/wordprocessor.dm b/code/modules/modular_computers/file_system/programs/generic/wordprocessor.dm
index b22be72d1eb..599f79fe786 100644
--- a/code/modules/modular_computers/file_system/programs/generic/wordprocessor.dm
+++ b/code/modules/modular_computers/file_system/programs/generic/wordprocessor.dm
@@ -9,12 +9,15 @@
available_on_ntnet = TRUE
tgui_id = "NtosWordProcessor"
- var/browsing
+ var/browsing = FALSE
var/open_file
var/loaded_data
var/error
var/is_edited
+ usage_flags = PROGRAM_ALL
+ category = PROG_OFFICE
+
/datum/computer_file/program/wordprocessor/proc/get_file(var/filename)
var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive
if(!HDD)
@@ -130,7 +133,7 @@
if(tgui_alert(usr, "Would you like to save your changes first?","Save Changes",list("Yes","No")) == "Yes")
save_file(open_file)
- var/newname = sanitize(input(usr, "Enter file name:", "New File") as text|null)
+ var/newname = sanitize(tgui_input_text(usr, "Enter file name:", "New File"))
if(!newname)
return TRUE
var/datum/computer_file/data/F = create_file(newname)
@@ -143,7 +146,7 @@
return TRUE
if("PRG_saveasfile")
- var/newname = sanitize(input(usr, "Enter file name:", "Save As") as text|null)
+ var/newname = sanitize(tgui_input_text(usr, "Enter file name:", "Save As"))
if(!newname)
return TRUE
var/datum/computer_file/data/F = create_file(newname, loaded_data)
@@ -155,7 +158,7 @@
if("PRG_savefile")
if(!open_file)
- open_file = sanitize(input(usr, "Enter file name:", "Save As") as text|null)
+ open_file = sanitize(tgui_input_text(usr, "Enter file name:", "Save As"))
if(!open_file)
return 0
if(!save_file(open_file))
@@ -166,7 +169,7 @@
var/oldtext = html_decode(loaded_data)
oldtext = replacetext(oldtext, "\[br\]", "\n")
- var/newtext = sanitize(replacetext(input(usr, "Editing file '[open_file]'. You may use most tags used in paper formatting:", "Text Editor", oldtext) as message|null, "\n", "\[br\]"), MAX_TEXTFILE_LENGTH)
+ var/newtext = sanitize(replacetext(tgui_input_text(usr, "Editing file '[open_file]'. You may use most tags used in paper formatting:", "Text Editor", oldtext, MAX_TEXTFILE_LENGTH, TRUE, prevent_enter = TRUE), "\n", "\[br\]"), MAX_TEXTFILE_LENGTH)
if(!newtext)
return
loaded_data = newtext
@@ -229,4 +232,4 @@
data["filedata"] = pencode2html(loaded_data)
data["filename"] = "UNNAMED"
- return data
\ No newline at end of file
+ return data
diff --git a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm
index 9b94707eb22..f536770859b 100644
--- a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm
+++ b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm
@@ -7,6 +7,7 @@
program_menu_icon = "heart"
extended_desc = "This program connects to life signs monitoring system to provide basic information on crew health."
required_access = access_medical
- requires_ntnet = 1
+ requires_ntnet = TRUE
network_destination = "crew lifesigns monitoring system"
size = 11
+ category = PROG_MONITOR
diff --git a/code/modules/modular_computers/file_system/programs/research/email_administration.dm b/code/modules/modular_computers/file_system/programs/research/email_administration.dm
index 0ad80422cb1..fbcaf7df1b1 100644
--- a/code/modules/modular_computers/file_system/programs/research/email_administration.dm
+++ b/code/modules/modular_computers/file_system/programs/research/email_administration.dm
@@ -6,10 +6,11 @@
program_key_state = "generic_key"
program_menu_icon = "mail-open"
size = 12
- requires_ntnet = 1
- available_on_ntnet = 1
+ requires_ntnet = TRUE
+ available_on_ntnet = TRUE
tgui_id = "NtosEmailAdministration"
required_access = access_network
+ category = PROG_ADMIN
var/datum/computer_file/data/email_account/current_account = null
var/datum/computer_file/data/email_message/current_message = null
@@ -92,7 +93,7 @@
if(!current_account)
return TRUE
- var/newpass = sanitize(input(usr,"Enter new password for account [current_account.login]", "Password"), 100)
+ var/newpass = sanitize(tgui_input_text(usr,"Enter new password for account [current_account.login]", "Password", null, 100), 100)
if(!newpass)
return TRUE
current_account.password = newpass
@@ -120,7 +121,7 @@
var/newdomain = sanitize(tgui_input_list(usr,"Pick domain:", "Domain name", using_map.usable_email_tlds))
if(!newdomain)
return TRUE
- var/newlogin = sanitize(input(usr,"Pick account name (@[newdomain]):", "Account name"), 100)
+ var/newlogin = sanitize(tgui_input_text(usr,"Pick account name (@[newdomain]):", "Account name", null, 100), 100)
if(!newlogin)
return TRUE
diff --git a/code/modules/modular_computers/file_system/programs/research/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/research/ntmonitor.dm
index d1aa9b78336..c74d927b9f8 100644
--- a/code/modules/modular_computers/file_system/programs/research/ntmonitor.dm
+++ b/code/modules/modular_computers/file_system/programs/research/ntmonitor.dm
@@ -10,6 +10,7 @@
required_access = access_network
available_on_ntnet = TRUE
tgui_id = "NtosNetMonitor"
+ category = PROG_ADMIN
/datum/computer_file/program/ntnetmonitor/tgui_data(mob/user)
if(!ntnet_global)
@@ -80,14 +81,14 @@
if("ban_nid")
if(!ntnet_global)
return
- var/nid = input(usr,"Enter NID of device which you want to block from the network:", "Enter NID") as null|num
+ var/nid = tgui_input_number(usr,"Enter NID of device which you want to block from the network:", "Enter NID")
if(nid && tgui_status(usr, state) == STATUS_INTERACTIVE)
ntnet_global.banned_nids |= nid
return TRUE
if("unban_nid")
if(!ntnet_global)
return
- var/nid = input(usr,"Enter NID of device which you want to unblock from the network:", "Enter NID") as null|num
+ var/nid = tgui_input_number(usr,"Enter NID of device which you want to unblock from the network:", "Enter NID")
if(nid && tgui_status(usr, state) == STATUS_INTERACTIVE)
ntnet_global.banned_nids -= nid
- return TRUE
+ return TRUE
diff --git a/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm b/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm
index 752d6d849ef..eea7f5e306d 100644
--- a/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm
+++ b/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm
@@ -17,11 +17,12 @@ var/warrant_uid = 0
program_icon_state = "warrant"
program_key_state = "security_key"
program_menu_icon = "star"
- requires_ntnet = 1
- available_on_ntnet = 1
+ requires_ntnet = TRUE
+ available_on_ntnet = TRUE
required_access = access_security
usage_flags = PROGRAM_ALL
tgui_id = "NtosDigitalWarrant"
+ category = PROG_SEC
var/datum/data/record/warrant/activewarrant
@@ -119,7 +120,7 @@ var/warrant_uid = 0
if("editwarrantnamecustom")
. = TRUE
- var/new_name = sanitize(input(usr, "Please input name") as null|text)
+ var/new_name = sanitize(tgui_input_text(usr, "Please input name"))
if(tgui_status(usr, state) == STATUS_INTERACTIVE)
if (!new_name)
return
@@ -127,7 +128,7 @@ var/warrant_uid = 0
if("editwarrantcharges")
. = TRUE
- var/new_charges = sanitize(input(usr, "Please input charges", "Charges", activewarrant.fields["charges"]) as null|text)
+ var/new_charges = sanitize(tgui_input_text(usr, "Please input charges", "Charges", activewarrant.fields["charges"]))
if(tgui_status(usr, state) == STATUS_INTERACTIVE)
if (!new_charges)
return
diff --git a/code/modules/modular_computers/file_system/programs/ships/navigation.dm b/code/modules/modular_computers/file_system/programs/ships/navigation.dm
index b8fecd96576..b01811210da 100644
--- a/code/modules/modular_computers/file_system/programs/ships/navigation.dm
+++ b/code/modules/modular_computers/file_system/programs/ships/navigation.dm
@@ -7,6 +7,6 @@
program_menu_icon = "pin-s"
extended_desc = "Displays a ship's location in the sector."
required_access = null
- requires_ntnet = 1
+ requires_ntnet = TRUE
network_destination = "ship position sensors"
size = 4
diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm
index 971079c4e34..ce86f5f02d1 100644
--- a/code/modules/modular_computers/hardware/_hardware.dm
+++ b/code/modules/modular_computers/hardware/_hardware.dm
@@ -3,33 +3,46 @@
desc = "Unknown Hardware."
icon = 'icons/obj/modular_components.dmi'
var/obj/item/modular_computer/holder2 = null
- var/power_usage = 0 // If the hardware uses extra power, change this.
- var/enabled = 1 // If the hardware is turned off set this to 0.
- var/critical = 1 // Prevent disabling for important component, like the HDD.
- var/hardware_size = 1 // Limits which devices can contain this component. 1: Tablets/Laptops/Consoles, 2: Laptops/Consoles, 3: Consoles only
- var/damage = 0 // Current damage level
- var/max_damage = 100 // Maximal damage level.
- var/damage_malfunction = 20 // "Malfunction" threshold. When damage exceeds this value the hardware piece will semi-randomly fail and do !!FUN!! things
- var/damage_failure = 50 // "Failure" threshold. When damage exceeds this value the hardware piece will not work at all.
- var/malfunction_probability = 10// Chance of malfunction when the component is damaged
-/obj/item/weapon/computer_hardware/attackby(var/obj/item/W as obj, var/mob/living/user as mob)
+ /// If the hardware uses extra power, change this.
+ var/power_usage = 0
+ /// If the hardware is turned off set this to FALSE.
+ var/enabled = TRUE
+ /// Prevent disabling for important component, like the HDD.
+ var/critical = 1
+ /// Limits which devices can contain this component. 1: All, 2: Laptops/Consoles, 3: Consoles only
+ var/hardware_size = 1
+ /// Current damage level
+ var/damage = 0
+ /// Maximal damage level.
+ var/max_damage = 100
+ /// "Malfunction" threshold. When damage exceeds this value the hardware piece will semi-randomly fail and do !!FUN!! things
+ var/damage_malfunction = 20
+ /// "Failure" threshold. When damage exceeds this value the hardware piece will not work at all.
+ var/damage_failure = 50
+ /// Chance of malfunction when the component is damaged
+ var/malfunction_probability = 10
+ var/usage_flags = PROGRAM_ALL
+ /// Whether attackby will be passed on it even with a closed panel
+ var/external_slot
+
+/obj/item/weapon/computer_hardware/attackby(obj/item/W as obj, mob/living/user as mob)
// Multitool. Runs diagnostics
if(istype(W, /obj/item/device/multitool))
to_chat(user, "***** DIAGNOSTICS REPORT *****")
diagnostics(user)
to_chat(user, "******************************")
- return 1
+ return TRUE
// Nanopaste. Repair all damage if present for a single unit.
var/obj/item/stack/S = W
if(istype(S, /obj/item/stack/nanopaste))
if(!damage)
to_chat(user, "\The [src] doesn't seem to require repairs.")
- return 1
+ return TRUE
if(S.use(1))
to_chat(user, "You apply a bit of \the [W] to \the [src]. It immediately repairs all damage.")
damage = 0
- return 1
+ return TRUE
// Cable coil. Works as repair method, but will probably require multiple applications and more cable.
if(istype(S, /obj/item/stack/cable_coil))
if(!damage)
@@ -38,11 +51,11 @@
if(S.use(1))
to_chat(user, "You patch up \the [src] with a bit of \the [W].")
take_damage(-10)
- return 1
+ return TRUE
return ..()
-// Called on multitool click, prints diagnostic information to the user.
+/// Returns a list of lines containing diagnostic information for display.
/obj/item/weapon/computer_hardware/proc/diagnostics(var/mob/user)
to_chat(user, "Hardware Integrity Test... (Corruption: [damage]/[max_damage]) [damage > damage_failure ? "FAIL" : damage > damage_malfunction ? "WARN" : "PASS"]")
@@ -57,20 +70,20 @@
holder2 = null
return ..()
-// Handles damage checks
+/// Handles damage checks
/obj/item/weapon/computer_hardware/proc/check_functionality()
// Turned off
if(!enabled)
- return 0
+ return FALSE
// Too damaged to work at all.
if(damage > damage_failure)
- return 0
+ return FALSE
// Still working. Well, sometimes...
if(damage > damage_malfunction)
if(prob(malfunction_probability))
- return 0
+ return FALSE
// Good to go.
- return 1
+ return TRUE
/obj/item/weapon/computer_hardware/examine(var/mob/user)
. = ..()
@@ -81,8 +94,7 @@
else if(damage)
. += "It seems to be slightly damaged."
-// Damages the component. Contains necessary checks. Negative damage "heals" the component.
+/// Damages the component. Contains necessary checks. Negative damage "heals" the component.
/obj/item/weapon/computer_hardware/take_damage(var/amount)
damage += round(amount) // We want nice rounded numbers here.
damage = between(0, damage, max_damage) // Clamp the value.
-
diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm
index 536a426ce45..7384a39c08a 100644
--- a/code/modules/modular_computers/hardware/hard_drive.dm
+++ b/code/modules/modular_computers/hardware/hard_drive.dm
@@ -5,9 +5,13 @@
icon_state = "hdd_normal"
hardware_size = 1
origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
+
var/max_capacity = 128
var/used_capacity = 0
- var/list/stored_files = list() // List of stored files on this drive. DO NOT MODIFY DIRECTLY!
+ /// List of stored files on this drive. DO NOT MODIFY DIRECTLY!
+ var/list/stored_files = list()
+ /// Whether drive is protected against changes
+ var/read_only = FALSE
/obj/item/weapon/computer_hardware/hard_drive/advanced
name = "advanced hard drive"
@@ -60,6 +64,7 @@
// 999 is a byond limit that is in place. It's unlikely someone will reach that many files anyway, since you would sooner run out of space.
to_chat(user, "NT-NFS File Table Status: [stored_files.len]/999")
to_chat(user, "Storage capacity: [used_capacity]/[max_capacity]GQ")
+ to_chat(user, "Read-only mode: [(read_only ? "ON" : "OFF")]")
// Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks.
/obj/item/weapon/computer_hardware/hard_drive/proc/store_file(var/datum/computer_file/F)
diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm
index 491e1d711df..b4e2b993b87 100644
--- a/code/modules/modular_computers/hardware/network_card.dm
+++ b/code/modules/modular_computers/hardware/network_card.dm
@@ -8,12 +8,20 @@ var/global/ntnet_card_uid = 1
critical = 0
icon_state = "netcard_basic"
hardware_size = 1
- var/identification_id = null // Identification ID. Technically MAC address of this device. Can't be changed by user.
- var/identification_string = "" // Identification string, technically nickname seen in the network. Can be set by user.
- var/long_range = 0
- var/ethernet = 0 // Hard-wired, therefore always on, ignores NTNet wireless checks.
malfunction_probability = 1
+ /// Identification ID. Technically MAC address of this device. Can't be changed by user.
+ var/identification_id = null
+ /// Identification string, technically nickname seen in the network. Can be set by user.
+ var/identification_string = ""
+
+ /// Long-range cards have stronger connections, letting them reach relays from connected Z-levels.
+ var/long_range = 0
+ /// Hard-wired, therefore always on, ignores NTNet wireless checks.
+ var/ethernet = 0
+ /// If set, uses the value to funnel connections through another network card.
+ var/proxy_id
+
/obj/item/weapon/computer_hardware/network_card/diagnostics(var/mob/user)
..()
to_chat(user, "NIX Unique ID: [identification_id]")
diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm
index f673e060ef6..0242ad2a1f1 100644
--- a/code/modules/modular_computers/laptop_vendor.dm
+++ b/code/modules/modular_computers/laptop_vendor.dm
@@ -285,7 +285,7 @@
return 0
if(customer_account.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
- var/attempt_pin = input(usr, "Enter pin code", "Vendor transaction") as num
+ var/attempt_pin = tgui_input_number(usr, "Enter pin code", "Vendor transaction")
customer_account = attempt_account_access(I.associated_account_number, attempt_pin, 2)
if(!customer_account)
diff --git a/code/modules/multiz/ladder_assembly_vr.dm b/code/modules/multiz/ladder_assembly_vr.dm
index 3512a3b07fa..b6e5bddf7e4 100644
--- a/code/modules/multiz/ladder_assembly_vr.dm
+++ b/code/modules/multiz/ladder_assembly_vr.dm
@@ -16,7 +16,7 @@
/obj/structure/ladder_assembly/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/pen))
- var/t = sanitizeSafe(input(user, "Enter the name for the ladder.", "Ladder Name", src.created_name), MAX_NAME_LEN)
+ var/t = sanitizeSafe(tgui_input_text(user, "Enter the name for the ladder.", "Ladder Name", src.created_name, MAX_NAME_LEN), MAX_NAME_LEN)
if(in_range(src, user))
created_name = t
return
diff --git a/code/modules/multiz/movement_vr.dm b/code/modules/multiz/movement_vr.dm
index 49dd8eab97e..a8dde43ee9f 100644
--- a/code/modules/multiz/movement_vr.dm
+++ b/code/modules/multiz/movement_vr.dm
@@ -43,16 +43,16 @@
var/mob/living/prey = src
var/fallloc = prey.loc
- if(pred.can_be_drop_pred && prey.can_be_drop_prey && pred.drop_vore && prey.drop_vore)
+ if(pred.vore_selected && pred.can_be_drop_pred && prey.can_be_drop_prey && pred.drop_vore && prey.drop_vore)
pred.feed_grabbed_to_self_falling_nom(pred,prey)
pred.loc = fallloc
if(!safe_fall)
pred.Weaken(8)
pred.visible_message("\The [pred] falls right onto \the [prey]!")
- else if(prey.can_be_drop_pred && pred.can_be_drop_prey && pred.drop_vore && prey.drop_vore)
+ else if(prey.vore_selected && prey.can_be_drop_pred && pred.can_be_drop_prey && pred.drop_vore && prey.drop_vore)
prey.feed_grabbed_to_self_falling_nom(prey,pred)
- pred.Weaken(4)
- pred.visible_message("\The [pred] falls right into \the [prey]!")
+ prey.Weaken(4)
+ prey.visible_message("\The [pred] falls right into \the [prey]!")
else
pred.loc = prey.loc
if(!safe_fall)
diff --git a/code/modules/multiz/turf.dm b/code/modules/multiz/turf.dm
index 16d90674904..0b102253301 100644
--- a/code/modules/multiz/turf.dm
+++ b/code/modules/multiz/turf.dm
@@ -53,6 +53,8 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr
pathweight = 100000 //Seriously, don't try and path over this one numbnuts
dynamic_lighting = 0 // Someday lets do proper lighting z-transfer. Until then we are leaving this off so it looks nicer.
can_build_into_floor = TRUE
+ can_dirty = FALSE // It's open space
+ can_start_dirty = FALSE
/turf/simulated/open/vacuum
oxygen = 0
diff --git a/code/modules/news/new_newspaper.dm b/code/modules/news/new_newspaper.dm
index c9759a5a837..3962f80cf4e 100644
--- a/code/modules/news/new_newspaper.dm
+++ b/code/modules/news/new_newspaper.dm
@@ -134,7 +134,7 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user)
if(scribble_page == curr_page)
to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?")
else
- var/s = sanitize(input(user, "Write something", "Newspaper", ""))
+ var/s = sanitize(tgui_input_text(user, "Write something", "Newspaper", ""))
s = sanitize(s)
if(!s)
return
diff --git a/code/modules/news/newspaper.dm b/code/modules/news/newspaper.dm
index 86a11491691..9eae4b19eef 100644
--- a/code/modules/news/newspaper.dm
+++ b/code/modules/news/newspaper.dm
@@ -135,7 +135,7 @@
if(scribble_page == curr_page)
to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?")
else
- var/s = sanitize(input(user, "Write something", "Newspaper", ""))
+ var/s = sanitize(tgui_input_text(user, "Write something", "Newspaper", ""))
s = sanitize(s)
if(!s)
return
diff --git a/code/modules/nifsoft/nif.dm b/code/modules/nifsoft/nif.dm
index 60025acca83..4e5937c6898 100644
--- a/code/modules/nifsoft/nif.dm
+++ b/code/modules/nifsoft/nif.dm
@@ -377,7 +377,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
last_notification = message // TGUI Hook
- to_chat(human,"\[[bicon(src.big_icon)]NIF\] displays, \"[message]\"")
+ to_chat(human,"\[\icon[src.big_icon][bicon(src.big_icon)]NIF\] displays, \"[message]\"")
if(prob(1)) human.visible_message("\The [human] [pick(look_messages)].")
if(alert)
human << bad_sound
@@ -666,7 +666,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
to_chat(src,"You don't have a NIF, not sure why this was here.")
return
- var/new_flavor = sanitize(input(src,"Describe how your NIF alters your appearance, like glowy eyes or metal plate on your head, etc. Be sensible. Clear this for no examine text. 128ch max.","Describe NIF", nif.examine_msg) as null|text, max_length = 128)
+ var/new_flavor = sanitize(tgui_input_text(src,"Describe how your NIF alters your appearance, like glowy eyes or metal plate on your head, etc. Be sensible. Clear this for no examine text. 128ch max.","Describe NIF", nif.examine_msg, 128), max_length = 128)
//They clicked cancel or meanwhile lost their NIF
if(!nif || isnull(new_flavor))
return //No changes
diff --git a/code/modules/nifsoft/nifsoft.dm b/code/modules/nifsoft/nifsoft.dm
index ad1af357f16..a684c696d7a 100644
--- a/code/modules/nifsoft/nifsoft.dm
+++ b/code/modules/nifsoft/nifsoft.dm
@@ -263,7 +263,7 @@
..(A,user,flag,params)
/obj/item/weapon/disk/nifsoft/compliance/attack_self(mob/user)
- var/newlaws = input(user,"Please Input Laws","Compliance Laws",laws) as message
+ var/newlaws = tgui_input_text(user, "Please Input Laws", "Compliance Laws", laws, multiline = TRUE, prevent_enter = TRUE)
newlaws = sanitize(newlaws,2048)
if(newlaws)
to_chat(user,"You set the laws to: [newlaws]")
@@ -377,3 +377,32 @@
..()
for(var/i = 0 to 7)
new /obj/item/weapon/disk/nifsoft/mining(src)
+
+// Pilot Disk //
+/obj/item/weapon/disk/nifsoft/pilot
+ name = "NIFSoft Uploader - Pilot"
+ desc = "Contains free NIFSofts useful for pilot members.\n\
+ It has a small label: \n\
+ \"Portable NIFSoft Installation Media. \n\
+ Align ocular port with eye socket and depress red plunger.\""
+
+ icon_state = "pilot"
+ stored_organic = /datum/nifsoft/package/pilot
+ stored_synthetic = /datum/nifsoft/package/pilot_synth
+
+/datum/nifsoft/package/pilot
+ software = list(/datum/nifsoft/spare_breath)
+
+/datum/nifsoft/package/pilot_synth
+ software = list(/datum/nifsoft/pressure,/datum/nifsoft/heatsinks)
+
+/obj/item/weapon/storage/box/nifsofts_pilot
+ name = "pilot nifsoft uploaders"
+ desc = "A box of free nifsofts for pilot employees."
+ icon = 'icons/obj/boxes.dmi'
+ icon_state = "nifsoft_kit_pilot"
+
+/obj/item/weapon/storage/box/nifsofts_pilot/New()
+ ..()
+ for(var/i = 0 to 7)
+ new /obj/item/weapon/disk/nifsoft/pilot(src)
\ No newline at end of file
diff --git a/code/modules/nifsoft/software/13_soulcatcher.dm b/code/modules/nifsoft/software/13_soulcatcher.dm
index 750f1b7df25..04766a51e46 100644
--- a/code/modules/nifsoft/software/13_soulcatcher.dm
+++ b/code/modules/nifsoft/software/13_soulcatcher.dm
@@ -72,11 +72,11 @@
/datum/nifsoft/soulcatcher/proc/notify_into(var/message)
var/sound = nif.good_sound
- to_chat(nif.human,"\[[bicon(nif.big_icon)]NIF\] Soulcatcher displays, \"[message]\"")
+ to_chat(nif.human,"\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\] Soulcatcher displays, \"[message]\"")
nif.human << sound
for(var/mob/living/carbon/brain/caught_soul/CS as anything in brainmobs)
- to_chat(CS,"\[[bicon(nif.big_icon)]NIF\] Soulcatcher displays, \"[message]\"")
+ to_chat(CS,"\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\] Soulcatcher displays, \"[message]\"")
CS << sound
/datum/nifsoft/soulcatcher/proc/say_into(var/message, var/mob/living/sender, var/mob/eyeobj)
@@ -88,9 +88,9 @@
//Not AR Projecting
else
- to_chat(nif.human,"\[[bicon(nif.big_icon)]NIF\] [sender_name] speaks, \"[message]\"")
+ to_chat(nif.human,"\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\] [sender_name] speaks, \"[message]\"")
for(var/mob/living/carbon/brain/caught_soul/CS as anything in brainmobs)
- to_chat(CS,"\[[bicon(nif.big_icon)]NIF\] [sender_name] speaks, \"[message]\"")
+ to_chat(CS,"\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\] [sender_name] speaks, \"[message]\"")
log_nsay(message,nif.human.real_name,sender)
@@ -103,9 +103,9 @@
//Not AR Projecting
else
- to_chat(nif.human,"\[[bicon(nif.big_icon)]NIF\] [sender_name] [message]")
+ to_chat(nif.human,"\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\] [sender_name] [message]")
for(var/mob/living/carbon/brain/caught_soul/CS as anything in brainmobs)
- to_chat(CS,"\[[bicon(nif.big_icon)]NIF\] [sender_name] [message]")
+ to_chat(CS,"\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\] [sender_name] [message]")
log_nme(message,nif.human.real_name,sender)
@@ -125,10 +125,10 @@
switch(choice)
if("Design Inside")
- var/new_flavor = input(nif.human, "Type what the prey sees after being 'caught'. This will be \
+ var/new_flavor = tgui_input_text(nif.human, "Type what the prey sees after being 'caught'. This will be \
printed after an intro ending with: \"Around you, you see...\" to the prey. If you already \
have prey, this will be printed to them after \"Your surroundings change to...\". Limit 2048 char.", \
- "VR Environment", html_decode(inside_flavor)) as message
+ "VR Environment", html_decode(inside_flavor), MAX_MESSAGE_LEN*2, TRUE, prevent_enter = TRUE)
new_flavor = sanitize(new_flavor, MAX_MESSAGE_LEN*2)
inside_flavor = new_flavor
nif.notify("Updating VR environment...")
@@ -326,7 +326,7 @@
/mob/living/carbon/brain/caught_soul/hear_say()
if(ext_deaf || !client)
return FALSE
- ..()
+ .=..()
/mob/living/carbon/brain/caught_soul/show_message(msg, type, alt, alt_type)
if(ext_blind || !client)
@@ -494,7 +494,7 @@
to_chat(src,SPAN_WARNING("You need a loaded mind to use NSay."))
return
if(!message)
- message = input(usr, "Type a message to say.","Speak into Soulcatcher") as text|null
+ message = tgui_input_text(usr, "Type a message to say.","Speak into Soulcatcher")
if(message)
var/sane_message = sanitize(message)
SC.say_into(sane_message,src)
@@ -503,7 +503,7 @@
set name = "NMe"
set desc = "Emote into your NIF's Soulcatcher."
set category = "IC"
-
+
src.nme_act(message)
/mob/proc/nme_act(message as text|null)
@@ -525,7 +525,7 @@
return
if(!message)
- message = input(usr, "Type an action to perform.","Emote into Soulcatcher") as text|null
+ message = tgui_input_text(usr, "Type an action to perform.","Emote into Soulcatcher")
if(message)
var/sane_message = sanitize(message)
SC.emote_into(sane_message,src)
@@ -580,7 +580,7 @@
set category = "Soulcatcher"
if(!message)
- message = input(usr, "Type a message to say.","Speak into Soulcatcher") as text|null
+ message = tgui_input_text(usr, "Type a message to say.","Speak into Soulcatcher")
if(message)
var/sane_message = sanitize(message)
soulcatcher.say_into(sane_message,src,null)
@@ -591,7 +591,7 @@
set category = "Soulcatcher"
if(!message)
- message = input(usr, "Type an action to perform.","Emote into Soulcatcher") as text|null
+ message = tgui_input_text(usr, "Type an action to perform.","Emote into Soulcatcher")
if(message)
var/sane_message = sanitize(message)
soulcatcher.emote_into(sane_message,src,null)
diff --git a/code/modules/nifsoft/software/14_commlink.dm b/code/modules/nifsoft/software/14_commlink.dm
index 93e1af799c3..47b602e184c 100644
--- a/code/modules/nifsoft/software/14_commlink.dm
+++ b/code/modules/nifsoft/software/14_commlink.dm
@@ -81,7 +81,7 @@
var/message = combined["formatted"]
var/name_used = M.GetVoice()
var/rendered = null
- rendered = "[bicon(icon_object)] [name_used] [message]"
+ rendered = "\icon[icon_object][bicon(icon_object)] [name_used] [message]"
mob.show_message(rendered, 2)
//Not supported by the internal one
@@ -128,4 +128,4 @@
return
if(ringer && nif.human)
- nif.notify("Commlink message from [who]: \"[text]\" (Open)")
+ nif.notify("Commlink message from [who]: \"[text]\" (Open) (Reply)")
diff --git a/code/modules/nifsoft/software/15_misc.dm b/code/modules/nifsoft/software/15_misc.dm
index 46db84c235f..8e7101395f7 100644
--- a/code/modules/nifsoft/software/15_misc.dm
+++ b/code/modules/nifsoft/software/15_misc.dm
@@ -127,7 +127,7 @@
/datum/nifsoft/sizechange/activate()
if((. = ..()))
- var/new_size = input(usr, "Put the desired size (25-200%), or (1-600%) in dormitory areas.", "Set Size", 200) as num|null
+ var/new_size = tgui_input_number(usr, "Put the desired size (25-200%), or (1-600%) in dormitory areas.", "Set Size", 200, 600, 1)
if (!nif.human.size_range_check(new_size))
if(new_size)
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index 264ef3d6b72..071bb05e913 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -77,12 +77,16 @@ var/const/CE_STABLE_THRESHOLD = 0.5
var/obj/item/organ/internal/heart/heart = internal_organs_by_name[O_HEART]
if(!heart)
+ blood_volume_raw = 0
blood_volume = 0
else if(heart.is_broken())
+ blood_volume_raw *= 0.3
blood_volume *= 0.3
else if(heart.is_bruised())
+ blood_volume_raw *= 0.7
blood_volume *= 0.7
else if(heart.damage)
+ blood_volume_raw *= 0.8
blood_volume *= 0.8
//Effects of bloodloss
diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm
index 96d28c96cf2..e4fa031b364 100644
--- a/code/modules/organs/internal/lungs.dm
+++ b/code/modules/organs/internal/lungs.dm
@@ -11,14 +11,26 @@
if(!owner)
return
- if(is_bruised())
+ //VOREStation Edit Start Lungs were a surprisingly lethal cause of bloodloss.
+ if(is_broken())
if(prob(4))
- spawn owner?.custom_emote(VISIBLE_MESSAGE, "coughs up blood!")
- owner.drip(10)
- if(prob(8))
+ spawn owner?.custom_emote(VISIBLE_MESSAGE, "coughs up a large amount of blood!")
+ var/bleeding_rng = rand(3,5)
+ owner.drip(bleeding_rng)
+ if(prob(8)) //This is a medical emergency. Will kill within minutes unless exceedingly lucky.
spawn owner?.custom_emote(VISIBLE_MESSAGE, "gasps for air!")
owner.AdjustLosebreath(15)
+ else if(is_bruised()) //Only bruised? That's an annoyance and can cause some more damage (via brainloss due to oxyloss)
+ if(prob(2)) //But let's not kill people too quickly.
+ spawn owner?.custom_emote(VISIBLE_MESSAGE, "coughs up a small amount of blood!")
+ var/bleeding_rng = rand(1,2)
+ owner.drip(bleeding_rng)
+ if(prob(4)) //Get to medical quickly. but shouldn't kill without exceedingly bad RNG.
+ spawn owner?.custom_emote(VISIBLE_MESSAGE, "gasps for air!")
+ owner.AdjustLosebreath(10) //Losebreath is a DoT that does 1:1 damage and prevents oxyloss healing via breathing.
+ //VOREStation Edit End
+
if(owner.internal_organs_by_name[O_BRAIN]) // As the brain starts having Trouble, the lungs start malfunctioning.
var/obj/item/organ/internal/brain/Brain = owner.internal_organs_by_name[O_BRAIN]
if(Brain.get_control_efficiency() <= 0.8)
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 764e0ddc609..d380d67cb82 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -377,7 +377,7 @@
droplimb(0, DROPLIMB_EDGE)
else if(spread_dam && owner && parent && (brute_overflow || burn_overflow) && (brute_overflow >= 5 || burn_overflow >= 5) && !permutation) //No infinite damage loops.
var/brute_third = brute_overflow * 0.33
- var/burn_third = burn_overflow * 0.33
+ var/burn_third = burn_overflow * 0.33
if(children && children.len)
var/brute_on_children = brute_third / children.len
var/burn_on_children = burn_third / children.len
@@ -593,6 +593,8 @@ This function completely restores a damaged organ to perfect condition.
return 1
else
last_dam = brute_dam + burn_dam
+ if (number_wounds != 0)
+ return 1
if(germ_level)
return 1
return 0
@@ -729,8 +731,8 @@ Note that amputating the affected organ does in fact remove the infection from t
return
for(var/datum/wound/W in wounds)
- // wounds can disappear after 10 minutes at the earliest
- if(W.damage <= 0 && W.created + 10 * 10 * 60 <= world.time)
+ // wounds used to be able to disappear after 10 minutes at the earliest, for now just remove them as soon as there is no damage
+ if(W.damage <= 0)
wounds -= W
continue
// let the GC handle the deletion of the wound
@@ -1062,14 +1064,14 @@ Note that amputating the affected organ does in fact remove the infection from t
if((status & ORGAN_BROKEN) || cannot_break)
return
- if(owner)
- owner.visible_message(\
- "You hear a loud cracking sound coming from \the [owner].",\
- "Something feels like it shattered in your [name]!",\
- "You hear a sickening crack.")
- jostle_bone()
- if(organ_can_feel_pain() && !isbelly(owner.loc))
+ if(owner) //VOREStation Edit Start
+ if(organ_can_feel_pain() && !isbelly(owner.loc) && !isliving(owner.loc))
+ owner.visible_message(\
+ "You hear a loud cracking sound coming from \the [owner].",\
+ "Something feels like it shattered in your [name]!",\
+ "You hear a sickening crack.")
owner.emote("scream")
+ jostle_bone() //VOREStation Edit End
playsound(src, "fracture", 10, 1, -2)
status |= ORGAN_BROKEN
diff --git a/code/modules/organs/robolimbs_custom.dm b/code/modules/organs/robolimbs_custom.dm
index 2cd26b7f4b2..96d80669c1a 100644
--- a/code/modules/organs/robolimbs_custom.dm
+++ b/code/modules/organs/robolimbs_custom.dm
@@ -175,3 +175,31 @@ VS Edit - anyone can select these. */
/obj/item/weapon/disk/limb/dsi_teshari
company = "DSI - Teshari"
+
+/datum/robolimb/dsi_zorren
+ company = "DSI - Zorren"
+ desc = "This limb feels soft and fluffy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated."
+ icon = 'icons/mob/human_races/cyberlimbs/DSIZorren/dsi_zorren.dmi'
+ blood_color = "#ffe2ff"
+ lifelike = 1
+ unavailable_to_build = 1
+ includes_tail = 1
+ skin_tone = 1
+ suggested_species = "Zorren"
+
+/obj/item/weapon/disk/limb/dsi_zorren
+ company = "DSI - Zorren"
+
+/datum/robolimb/dsi_fennec
+ company = "DSI - Fennec"
+ desc = "This limb feels soft and fluffy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated."
+ icon = 'icons/mob/human_races/cyberlimbs/DSIFennec/dsi_fennec.dmi'
+ blood_color = "#ffe2ff"
+ lifelike = 1
+ unavailable_to_build = 1
+ includes_tail = 1
+ skin_tone = 1
+ suggested_species = "Fennec"
+
+/obj/item/weapon/disk/limb/dsi_fennec
+ company = "DSI - Fennec"
diff --git a/code/modules/organs/subtypes/skrell.dm b/code/modules/organs/subtypes/skrell.dm
index 3ac237c2b50..5f2d494105c 100644
--- a/code/modules/organs/subtypes/skrell.dm
+++ b/code/modules/organs/subtypes/skrell.dm
@@ -25,7 +25,7 @@
/obj/item/organ/internal/voicebox/skrell
icon_state = "skrell_larynx"
- will_assist_languages = list(LANGUAGE_SKRELLIAN, LANGUAGE_SKRELLIANFAR)
+ will_assist_languages = list(LANGUAGE_SKRELLIAN)
/obj/item/organ/internal/appendix/skrell
icon_state = "skrell_appendix"
diff --git a/code/modules/overmap/champagne.dm b/code/modules/overmap/champagne.dm
index 477f9cc0722..0d36766535b 100644
--- a/code/modules/overmap/champagne.dm
+++ b/code/modules/overmap/champagne.dm
@@ -27,7 +27,7 @@
return
user.visible_message("[user] lifts [src] bottle over [comp]!")
- var/shuttle_name = input(usr, "Choose a name for the shuttle", "New Shuttle Name") as null|text
+ var/shuttle_name = tgui_input_text(usr, "Choose a name for the shuttle", "New Shuttle Name")
if(!shuttle_name || QDELETED(src) || QDELETED(comp) || comp.shuttle_tag || user.incapacitated())
return // After input() safety re-checks
diff --git a/code/modules/overmap/disperser/disperser_console.dm b/code/modules/overmap/disperser/disperser_console.dm
index 789d768e6bc..d67bb87c5cf 100644
--- a/code/modules/overmap/disperser/disperser_console.dm
+++ b/code/modules/overmap/disperser/disperser_console.dm
@@ -177,7 +177,7 @@
. = TRUE
if("calibration")
- var/input = input(usr, "0-9", "disperser calibration", 0) as num|null
+ var/input = tgui_input_number(usr, "0-9", "disperser calibration", 0, 9, 0)
if(!isnull(input)) //can be zero so we explicitly check for null
var/calnum = sanitize_integer(text2num(params["calibration"]), 0, caldigit)//sanitiiiiize
calibration[calnum + 1] = sanitize_integer(input, 0, 9, 0)//must add 1 because js indexes from 0
@@ -189,14 +189,14 @@
. = TRUE
if("strength")
- var/input = input(usr, "1-5", "disperser strength", 1) as num|null
+ var/input = tgui_input_number(usr, "1-5", "disperser strength", 1, 5, 1)
if(input && tgui_status(usr, state) == STATUS_INTERACTIVE)
strength = sanitize_integer(input, 1, 5, 1)
middle.update_idle_power_usage(strength * range * 100)
. = TRUE
if("range")
- var/input = input(usr, "1-5", "disperser radius", 1) as num|null
+ var/input = tgui_input_number(usr, "1-5", "disperser radius", 1, 5, 1)
if(input && tgui_status(usr, state) == STATUS_INTERACTIVE)
range = sanitize_integer(input, 1, 5, 1)
middle.update_idle_power_usage(strength * range * 100)
diff --git a/code/modules/overmap/ships/computers/engine_control.dm b/code/modules/overmap/ships/computers/engine_control.dm
index 1110f6b2469..ab1bb61b746 100644
--- a/code/modules/overmap/ships/computers/engine_control.dm
+++ b/code/modules/overmap/ships/computers/engine_control.dm
@@ -62,7 +62,7 @@
. = TRUE
if("set_global_limit")
- var/newlim = input(usr, "Input new thrust limit (0..100%)", "Thrust limit", linked.thrust_limit*100) as num
+ var/newlim = tgui_input_number(usr, "Input new thrust limit (0..100%)", "Thrust limit", linked.thrust_limit*100, 100, 0)
if(tgui_status(usr, state) != STATUS_INTERACTIVE)
return FALSE
linked.thrust_limit = clamp(newlim/100, 0, 1)
@@ -78,7 +78,7 @@
if("set_limit")
var/datum/ship_engine/E = locate(params["engine"])
- var/newlim = input(usr, "Input new thrust limit (0..100)", "Thrust limit", E.get_thrust_limit()) as num
+ var/newlim = tgui_input_number(usr, "Input new thrust limit (0..100)", "Thrust limit", E.get_thrust_limit(), 100, 0)
if(tgui_status(usr, state) != STATUS_INTERACTIVE)
return FALSE
var/limit = clamp(newlim/100, 0, 1)
diff --git a/code/modules/overmap/ships/computers/helm.dm b/code/modules/overmap/ships/computers/helm.dm
index 2c821ef793a..64212fd3601 100644
--- a/code/modules/overmap/ships/computers/helm.dm
+++ b/code/modules/overmap/ships/computers/helm.dm
@@ -157,7 +157,7 @@ GLOBAL_LIST_EMPTY(all_waypoints)
switch(action)
if("add")
var/datum/computer_file/data/waypoint/R = new()
- var/sec_name = input(usr, "Input navigation entry name", "New navigation entry", "Sector #[known_sectors.len]") as text
+ var/sec_name = tgui_input_text(usr, "Input navigation entry name", "New navigation entry", "Sector #[known_sectors.len]")
if(tgui_status(usr, state) != STATUS_INTERACTIVE)
return FALSE
if(!sec_name)
@@ -171,10 +171,10 @@ GLOBAL_LIST_EMPTY(all_waypoints)
R.fields["x"] = linked.x
R.fields["y"] = linked.y
if("new")
- var/newx = input(usr, "Input new entry x coordinate", "Coordinate input", linked.x) as num
+ var/newx = tgui_input_number(usr, "Input new entry x coordinate", "Coordinate input", linked.x)
if(tgui_status(usr, state) != STATUS_INTERACTIVE)
return TRUE
- var/newy = input(usr, "Input new entry y coordinate", "Coordinate input", linked.y) as num
+ var/newy = tgui_input_number(usr, "Input new entry y coordinate", "Coordinate input", linked.y)
if(tgui_status(usr, state) != STATUS_INTERACTIVE)
return FALSE
R.fields["x"] = CLAMP(newx, 1, world.maxx)
@@ -191,14 +191,14 @@ GLOBAL_LIST_EMPTY(all_waypoints)
if("setcoord")
if(params["setx"])
- var/newx = input(usr, "Input new destiniation x coordinate", "Coordinate input", dx) as num|null
+ var/newx = tgui_input_number(usr, "Input new destiniation x coordinate", "Coordinate input", dx)
if(tgui_status(usr, state) != STATUS_INTERACTIVE)
return
if(newx)
dx = CLAMP(newx, 1, world.maxx)
if(params["sety"])
- var/newy = input(usr, "Input new destiniation y coordinate", "Coordinate input", dy) as num|null
+ var/newy = tgui_input_number(usr, "Input new destiniation y coordinate", "Coordinate input", dy)
if(tgui_status(usr, state) != STATUS_INTERACTIVE)
return
if(newy)
@@ -216,13 +216,13 @@ GLOBAL_LIST_EMPTY(all_waypoints)
. = TRUE
if("speedlimit")
- var/newlimit = input(usr, "Input new speed limit for autopilot (0 to brake)", "Autopilot speed limit", speedlimit*1000) as num|null
+ var/newlimit = tgui_input_number(usr, "Input new speed limit for autopilot (0 to brake)", "Autopilot speed limit", speedlimit*1000)
if(newlimit)
speedlimit = CLAMP(newlimit/1000, 0, 100)
. = TRUE
if("accellimit")
- var/newlimit = input(usr, "Input new acceleration limit", "Acceleration limit", accellimit*1000) as num|null
+ var/newlimit = tgui_input_number(usr, "Input new acceleration limit", "Acceleration limit", accellimit*1000)
if(newlimit)
accellimit = max(newlimit/1000, 0)
. = TRUE
diff --git a/code/modules/overmap/ships/computers/sensors.dm b/code/modules/overmap/ships/computers/sensors.dm
index e09678f9b0f..21cd9654ee8 100644
--- a/code/modules/overmap/ships/computers/sensors.dm
+++ b/code/modules/overmap/ships/computers/sensors.dm
@@ -106,7 +106,7 @@
if(sensors)
switch(action)
if("range")
- var/nrange = input(usr, "Set new sensors range", "Sensor range", sensors.range) as num|null
+ var/nrange = tgui_input_number(usr, "Set new sensors range", "Sensor range", sensors.range)
if(tgui_status(usr, state) != STATUS_INTERACTIVE)
return FALSE
if(nrange)
diff --git a/code/modules/paperwork/adminpaper.dm b/code/modules/paperwork/adminpaper.dm
index c375366bc17..fcbc36d8297 100644
--- a/code/modules/paperwork/adminpaper.dm
+++ b/code/modules/paperwork/adminpaper.dm
@@ -87,7 +87,7 @@
to_chat(usr, "There isn't enough space left on \the [src] to write anything.")
return
- var/raw_t = tgui_input_message(usr, "Enter what you want to write:", "Write")
+ var/raw_t = tgui_input_text(usr, "Enter what you want to write:", "Write", multiline = TRUE, prevent_enter = TRUE)
if(!raw_t)
return
var/t = sanitize(raw_t, free_space, extra = 0)
@@ -158,4 +158,4 @@
return
/obj/item/weapon/paper/admin/get_signature()
- return input(usr, "Enter the name you wish to sign the paper with (will prompt for multiple entries, in order of entry)", "Signature") as text|null
+ return tgui_input_text(usr, "Enter the name you wish to sign the paper with (will prompt for multiple entries, in order of entry)", "Signature")
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index 31b4bb76700..b7189b4e7d8 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -133,7 +133,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
/obj/machinery/photocopier/faxmachine/attackby(obj/item/O as obj, mob/user as mob)
if(O.is_multitool() && panel_open)
- var/input = sanitize(input(usr, "What Department ID would you like to give this fax machine?", "Multitool-Fax Machine Interface", department))
+ var/input = sanitize(tgui_input_text(usr, "What Department ID would you like to give this fax machine?", "Multitool-Fax Machine Interface", department))
if(!input)
to_chat(usr, "No input found. Please hang up and try your call again.")
return
diff --git a/code/modules/paperwork/faxmachine_vr.dm b/code/modules/paperwork/faxmachine_vr.dm
index 9ac4c97884f..078a17403f3 100644
--- a/code/modules/paperwork/faxmachine_vr.dm
+++ b/code/modules/paperwork/faxmachine_vr.dm
@@ -1,3 +1,5 @@
+var/global/last_fax_role_request
+
/obj/machinery/photocopier/faxmachine
req_one_access = list()
@@ -47,6 +49,20 @@
query_string += "&sentname=[url_encode(sent.name)]"
world.Export("[config.chat_webhook_url]?[query_string]")
+/**
+ * Call the chat webhook to transmit a notification of a job request
+ */
+/obj/machinery/photocopier/faxmachine/proc/message_chat_rolerequest(var/font_colour="#006100", var/role_to_ping, var/reason, var/jobname)
+ if(config.chat_webhook_url)
+ spawn(0)
+ var/query_string = "type=rolerequest"
+ query_string += "&key=[url_encode(config.chat_webhook_key)]"
+ query_string += "&ping=[url_encode(role_to_ping)]"
+ query_string += "&color=[url_encode(font_colour)]"
+ query_string += "&reason=[url_encode(reason)]"
+ query_string += "&job=[url_encode(jobname)]"
+ world.Export("[config.chat_webhook_url]?[query_string]")
+
//
// Overrides/additions to stock defines go here, as well as hooks. Sort them by
// the object they are overriding. So all /mob/living together, etc.
@@ -55,3 +71,84 @@
var/chat_webhook_url = "" // URL of the webhook for sending announcements/faxes to discord chat.
var/chat_webhook_key = "" // Shared secret for authenticating to the chat webhook
var/fax_export_dir = "data/faxes" // Directory in which to write exported fax HTML files.
+
+
+/obj/machinery/photocopier/faxmachine/verb/request_roles()
+ set name = "Staff Request Form"
+ set category = "Object"
+ set src in oview(1)
+
+ var/mob/living/L = usr
+
+ if(!L || !isturf(L.loc) || !isliving(L))
+ return
+ if(!ishuman(L) && !issilicon(L))
+ return
+ if(L.stat || L.restrained())
+ return
+ if(last_fax_role_request && (world.time - last_fax_role_request < 5 MINUTES))
+ to_chat(L, "The global automated relays are still recalibrating. Try again later or relay your request in written form for processing.")
+ return
+
+ var/confirmation = tgui_alert(L, "Are you sure you want to send automated crew request?", "Confirmation", list("Yes", "No", "Cancel"))
+ if(confirmation != "Yes")
+ return
+
+ var/list/jobs = list()
+ for(var/datum/department/dept as anything in SSjob.get_all_department_datums())
+ if(!dept.assignable || dept.centcom_only)
+ continue
+ for(var/job in SSjob.get_job_titles_in_department(dept.name))
+ var/datum/job/J = SSjob.get_job(job)
+ if(J.requestable)
+ jobs |= job
+
+ var/role = tgui_input_list(L, "Pick the job to request.", "Job Request", jobs)
+ if(!role)
+ return
+
+ var/datum/job/job_to_request = SSjob.get_job(role)
+ var/reason = "Unspecified"
+ var/list/possible_reasons = list("Unspecified", "General duties", "Emergency situation")
+ possible_reasons += job_to_request.get_request_reasons()
+ reason = tgui_input_list(L, "Pick request reason.", "Request reason", possible_reasons)
+
+ var/final_conf = tgui_alert(L, "You are about to request [role]. Are you sure?", "Confirmation", list("Yes", "No", "Cancel"))
+ if(final_conf != "Yes")
+ return
+
+ var/datum/department/ping_dept = SSjob.get_ping_role(role)
+ if(!ping_dept)
+ to_chat(L, "Selected job cannot be requested for \[ERRORDEPTNOTFOUND] reason. Please report this to system administrator.")
+ return
+ var/message_color = "#FFFFFF"
+ var/ping_name = null
+ switch(ping_dept.name)
+ if(DEPARTMENT_COMMAND)
+ ping_name = "Command"
+ if(DEPARTMENT_SECURITY)
+ ping_name = "Security"
+ if(DEPARTMENT_ENGINEERING)
+ ping_name = "Engineering"
+ if(DEPARTMENT_MEDICAL)
+ ping_name = "Medical"
+ if(DEPARTMENT_RESEARCH)
+ ping_name = "Research"
+ if(DEPARTMENT_CARGO)
+ ping_name = "Supply"
+ if(DEPARTMENT_CIVILIAN)
+ ping_name = "Service"
+ if(DEPARTMENT_PLANET)
+ ping_name = "Expedition"
+ if(DEPARTMENT_SYNTHETIC)
+ ping_name = "Silicon"
+ //if(DEPARTMENT_TALON)
+ // ping_name = "Offmap"
+ if(!ping_name)
+ to_chat(L, "Selected job cannot be requested for \[ERRORUNKNOWNDEPT] reason. Please report this to system administrator.")
+ return
+ message_color = ping_dept.color
+
+ message_chat_rolerequest(message_color, ping_name, reason, role)
+ last_fax_role_request = world.time
+ to_chat(L, "Your request was transmitted.")
diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm
index 5ea8193e4cc..0ed76424c7a 100644
--- a/code/modules/paperwork/folders.dm
+++ b/code/modules/paperwork/folders.dm
@@ -70,7 +70,7 @@
to_chat(user, "You put the [W] into \the [src].")
update_icon()
else if(istype(W, /obj/item/weapon/pen))
- var/n_name = sanitizeSafe(input(usr, "What would you like to label the folder?", "Folder Labelling", null) as text, MAX_NAME_LEN)
+ var/n_name = sanitizeSafe(tgui_input_text(usr, "What would you like to label the folder?", "Folder Labelling", null, MAX_NAME_LEN), MAX_NAME_LEN)
if((loc == usr && usr.stat == 0))
name = "folder[(n_name ? text("- '[n_name]'") : null)]"
return
diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm
index 1b2624c1257..5666b97d5ec 100644
--- a/code/modules/paperwork/handlabeler.dm
+++ b/code/modules/paperwork/handlabeler.dm
@@ -73,7 +73,7 @@
if(mode)
to_chat(user, SPAN_NOTICE("You turn on \the [src]."))
//Now let them chose the text.
- var/str = sanitizeSafe(input(user,"Label text?","Set label",""), MAX_NAME_LEN)
+ var/str = sanitizeSafe(tgui_input_text(user,"Label text?","Set label","",MAX_NAME_LEN), MAX_NAME_LEN)
if(!str || !length(str))
to_chat(user, SPAN_WARNING("Invalid text."))
return
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 660bca3ec89..7b259d2734b 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -171,7 +171,7 @@
if((CLUMSY in usr.mutations) && prob(50))
to_chat(usr, "You cut yourself on the paper.")
return
- var/n_name = sanitizeSafe(input(usr, "What would you like to label the paper?", "Paper Labelling", null) as text, MAX_NAME_LEN)
+ var/n_name = sanitizeSafe(tgui_input_text(usr, "What would you like to label the paper?", "Paper Labelling", null, MAX_NAME_LEN), MAX_NAME_LEN)
// We check loc one level up, so we can rename in clipboards and such. See also: /obj/item/weapon/photo/rename()
if((loc == usr || loc.loc && loc.loc == usr) && usr.stat == 0 && n_name)
@@ -422,7 +422,7 @@
to_chat(usr, "There isn't enough space left on \the [src] to write anything.")
return
- var/raw = input(usr, "Enter what you want to write:", "Write") as null|message
+ var/raw = tgui_input_text(usr, "Enter what you want to write:", "Write", multiline = TRUE, prevent_enter = TRUE)
if(!raw)
return
diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm
index 24aeae6c716..287927a6d34 100644
--- a/code/modules/paperwork/paper_bundle.dm
+++ b/code/modules/paperwork/paper_bundle.dm
@@ -192,7 +192,7 @@
set category = "Object"
set src in usr
- var/n_name = sanitizeSafe(input(usr, "What would you like to label the bundle?", "Bundle Labelling", null) as text, MAX_NAME_LEN)
+ var/n_name = sanitizeSafe(tgui_input_text(usr, "What would you like to label the bundle?", "Bundle Labelling", null, MAX_NAME_LEN), MAX_NAME_LEN)
if((loc == usr || loc.loc && loc.loc == usr) && usr.stat == 0)
name = "[(n_name ? text("[n_name]") : "paper")]"
add_fingerprint(usr)
diff --git a/code/modules/paperwork/paper_sticky.dm b/code/modules/paperwork/paper_sticky.dm
index 04f4249cfb3..ba2a9195b3b 100644
--- a/code/modules/paperwork/paper_sticky.dm
+++ b/code/modules/paperwork/paper_sticky.dm
@@ -34,7 +34,7 @@
if(writing_space <= 0)
to_chat(user, SPAN_WARNING("There is no room left on \the [src]."))
return
- var/text = sanitizeSafe(input(usr, "What would you like to write?") as text, writing_space)
+ var/text = sanitizeSafe(tgui_input_text(usr, "What would you like to write?", null, null, writing_space), writing_space)
if(!text || thing.loc != user || (!Adjacent(user) && loc != user) || user.incapacitated())
return
user.visible_message("\The [user] jots a note down on \the [src].")
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index e4fd29af3be..6d7e93ed3b6 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -282,7 +282,7 @@
if(new_signature)
signature = new_signature
*/
- signature = sanitize(input(usr, "Enter new signature. Leave blank for 'Anonymous'", "New Signature", signature))
+ signature = sanitize(tgui_input_text(usr, "Enter new signature. Leave blank for 'Anonymous'", "New Signature", signature))
/obj/item/weapon/pen/proc/get_signature(var/mob/user)
return (user && user.real_name) ? user.real_name : "Anonymous"
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 13d288c93af..708fe7fca4f 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -384,5 +384,6 @@
/obj/item/device/toner
name = "toner cartridge"
+ icon = 'icons/obj/device.dmi'
icon_state = "tonercartridge"
var/toner_amount = 30
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index 3d8f9200a5e..558763e8021 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -46,7 +46,7 @@ var/global/photo_count = 0
/obj/item/weapon/photo/attackby(obj/item/weapon/P as obj, mob/user as mob)
if(istype(P, /obj/item/weapon/pen))
- var/txt = sanitize(input(user, "What would you like to write on the back?", "Photo Writing", null) as text, 128)
+ var/txt = sanitize(tgui_input_text(user, "What would you like to write on the back?", "Photo Writing", null, 128), 128)
if(loc == user && user.stat == 0)
scribble = txt
..()
@@ -74,7 +74,7 @@ var/global/photo_count = 0
set category = "Object"
set src in usr
- var/n_name = sanitizeSafe(input(usr, "What would you like to label the photo?", "Photo Labelling", null) as text, MAX_NAME_LEN)
+ var/n_name = sanitizeSafe(tgui_input_text(usr, "What would you like to label the photo?", "Photo Labelling", null, MAX_NAME_LEN), MAX_NAME_LEN)
//loc.loc check is for making possible renaming photos in clipboards
if(( (loc == usr || (loc.loc && loc.loc == usr)) && usr.stat == 0))
name = "[(n_name ? text("[n_name]") : "photo")]"
diff --git a/code/modules/pda/app.dm b/code/modules/pda/app.dm
index 93245c2a850..c86f9e507d1 100644
--- a/code/modules/pda/app.dm
+++ b/code/modules/pda/app.dm
@@ -34,7 +34,7 @@
L = get(pda, /mob/living/silicon)
if(L)
- to_chat(L, "[bicon(pda)] [message]")
+ to_chat(L, "\icon[pda][bicon(pda)] [message]")
SStgui.update_user_uis(L, pda) // Update the receiving user's PDA UI so that they can see the new message
if(!notify_silent)
diff --git a/code/modules/pda/core_apps.dm b/code/modules/pda/core_apps.dm
index 141f41a8fb9..d140faed5c7 100644
--- a/code/modules/pda/core_apps.dm
+++ b/code/modules/pda/core_apps.dm
@@ -62,7 +62,7 @@
return TRUE
switch(action)
if("Edit")
- var/n = input(usr, "Please enter message", name, notehtml) as message
+ var/n = tgui_input_text(usr, "Please enter message", name, notehtml, multiline = TRUE, prevent_enter = TRUE)
if(pda.loc == usr)
note = adminscrub(n)
notehtml = html_decode(note)
diff --git a/code/modules/pda/messenger.dm b/code/modules/pda/messenger.dm
index 03996dc35cf..73e0944a652 100644
--- a/code/modules/pda/messenger.dm
+++ b/code/modules/pda/messenger.dm
@@ -117,10 +117,10 @@
create_message(usr, P)
if(href_list["target"] in conversations) // Need to make sure the message went through, if not welp.
active_conversation = href_list["target"]
-
+
/datum/data/pda/app/messenger/proc/create_message(var/mob/living/U, var/obj/item/device/pda/P)
- var/t = input(U, "Please enter message", name, null) as text|null
+ var/t = tgui_input_text(U, "Please enter message", name, null)
if(!t)
return
t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN))
@@ -178,7 +178,7 @@
SStgui.update_user_uis(U, P) // Update the sending user's PDA UI so that they can see the new message
log_pda("(PDA: [src.name]) sent \"[t]\" to [P.name]", usr)
- to_chat(U, "[bicon(pda)] Sent message to [P.owner] ([P.ownjob]), \"[t]\"")
+ to_chat(U, "\icon[pda][bicon(pda)] Sent message to [P.owner] ([P.ownjob]), \"[t]\"")
else
to_chat(U, "ERROR: Messaging server is not responding.")
@@ -224,7 +224,7 @@
/datum/data/pda/app/messenger/multicast
/datum/data/pda/app/messenger/multicast/receive_message(list/data, ref)
. = ..()
-
+
var/obj/item/device/pda/multicaster/M = pda
if(!istype(M))
return
diff --git a/code/modules/pda/pda.dm b/code/modules/pda/pda.dm
index e7615cfb28d..34e83a59068 100644
--- a/code/modules/pda/pda.dm
+++ b/code/modules/pda/pda.dm
@@ -98,10 +98,10 @@ var/global/list/obj/item/device/pda/PDAs = list()
S = 'sound/machines/twobeep.ogg'
playsound(loc, S, 50, 1)
for(var/mob/O in hearers(3, loc))
- O.show_message(text("[bicon(src)] *[ttone]*"))
+ O.show_message(text("\icon[src][bicon(src)] *[ttone]*"))
/obj/item/device/pda/proc/set_ringtone()
- var/t = input(usr, "Please enter new ringtone", name, ttone) as text
+ var/t = tgui_input_text(usr, "Please enter new ringtone", name, ttone)
if(in_range(src, usr) && loc == usr)
if(t)
if(hidden_uplink && hidden_uplink.check_trigger(usr, lowertext(t), lowertext(lock_code)))
diff --git a/code/modules/persistence/graffiti.dm b/code/modules/persistence/graffiti.dm
index d0b6969bd72..e87681cd3ac 100644
--- a/code/modules/persistence/graffiti.dm
+++ b/code/modules/persistence/graffiti.dm
@@ -55,7 +55,7 @@
to_chat(user, SPAN_WARNING("You are banned from leaving persistent information across rounds."))
return
- var/_message = sanitize(input(usr, "Enter an additional message to engrave.", "Graffiti") as null|text, trim = TRUE)
+ var/_message = sanitize(tgui_input_text(usr, "Enter an additional message to engrave.", "Graffiti"), trim = TRUE)
if(_message && loc && user && !user.incapacitated() && user.Adjacent(loc) && thing.loc == user)
user.visible_message("\The [user] begins carving something into \the [loc].")
if(do_after(user, max(20, length(_message)), src) && loc)
diff --git a/code/modules/persistence/storage/smartfridge.dm b/code/modules/persistence/storage/smartfridge.dm
index a47099f3282..1ffe9eb586e 100644
--- a/code/modules/persistence/storage/smartfridge.dm
+++ b/code/modules/persistence/storage/smartfridge.dm
@@ -65,12 +65,12 @@
/datum/persistent/storage/smartfridge/produce
name = "fruit storage"
max_storage = 50
- store_per_type = FALSE
+ store_per_type = TRUE
target_type = /obj/machinery/smartfridge/produce
/datum/persistent/storage/smartfridge/produce/lossy
name = "fruit storage lossy"
- go_missing_chance = 12.5 // 10% loss between rounds
+ go_missing_chance = 10 // 10% loss chance between rounds
/datum/persistent/storage/smartfridge/produce/generate_items(var/list/L) // Mostly same as storage/generate_items() but without converting string to path
. = list()
diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm
index d86f2ce82fa..207c6e2bcf2 100644
--- a/code/modules/planet/sif.dm
+++ b/code/modules/planet/sif.dm
@@ -447,7 +447,7 @@ var/datum/planet/sif/planet_sif = null
light_color = "#FF0000"
flight_failure_modifier = 25
transition_chances = list(
- WEATHER_BLOODMOON = 100
+ WEATHER_BLOOD_MOON = 100
)
observed_message = "Everything is red. Something really wrong is going on."
transition_messages = list(
diff --git a/code/modules/planet/virgo3b_vr.dm b/code/modules/planet/virgo3b_vr.dm
index 822faa2d7e4..9e76fd1edad 100644
--- a/code/modules/planet/virgo3b_vr.dm
+++ b/code/modules/planet/virgo3b_vr.dm
@@ -395,7 +395,7 @@ var/datum/planet/virgo3b/planet_virgo3b = null
if(show_message)
to_chat(H, "Hail patters onto your umbrella.")
continue
-
+
var/target_zone = pick(BP_ALL)
var/amount_blocked = H.run_armor_check(target_zone, "melee")
var/amount_soaked = H.get_armor_soak(target_zone, "melee")
@@ -419,7 +419,7 @@ var/datum/planet/virgo3b/planet_virgo3b = null
light_color = "#FF0000"
flight_failure_modifier = 25
transition_chances = list(
- WEATHER_BLOODMOON = 100
+ WEATHER_BLOOD_MOON = 100
)
observed_message = "Everything is red. Something really ominous is going on."
transition_messages = list(
diff --git a/code/modules/planet/virgo3c_vr.dm b/code/modules/planet/virgo3c_vr.dm
index 24ffbf70c59..3afd9ca6c42 100644
--- a/code/modules/planet/virgo3c_vr.dm
+++ b/code/modules/planet/virgo3c_vr.dm
@@ -147,11 +147,11 @@ var/datum/planet/virgo3c/planet_virgo3c = null
/datum/weather/virgo3c/clear
name = "clear"
transition_chances = list(
- WEATHER_CLEAR = 60,
- WEATHER_OVERCAST = 20,
- WEATHER_LIGHT_SNOW = 1,
- WEATHER_BLOODMOON = 1,
- WEATHER_EMBERFALL = 0.5)
+ WEATHER_CLEAR = 120,
+ WEATHER_OVERCAST = 40,
+ WEATHER_LIGHT_SNOW = 2,
+ WEATHER_BLOOD_MOON = 2,
+ WEATHER_EMBERFALL = 1)
transition_messages = list(
"The sky clears up.",
"The sky is visible.",
@@ -294,7 +294,7 @@ var/datum/planet/virgo3c/planet_virgo3c = null
effect_message = "Rain falls on you, drenching you in water."
var/next_lightning_strike = 0 // world.time when lightning will strike.
- var/min_lightning_cooldown = 1 SECONDS
+ var/min_lightning_cooldown = 1 MINUTE
var/max_lightning_cooldown = 5 MINUTE
observed_message = "An intense storm pours down over the region."
transition_messages = list(
@@ -410,7 +410,7 @@ var/datum/planet/virgo3c/planet_virgo3c = null
temp_low = 273.15 // 0c
flight_failure_modifier = 25
transition_chances = list(
- WEATHER_BLOODMOON = 25,
+ WEATHER_BLOOD_MOON = 25,
WEATHER_CLEAR = 75
)
observed_message = "Everything is red. Something really ominous is going on."
@@ -601,7 +601,7 @@ VIRGO3C_TURF_CREATE(/turf/simulated/floor/tiled/asteroid_steel/outdoors)
/mob/living/simple_mob/vore/bigdragon/friendly = 1,
/mob/living/simple_mob/vore/alienanimals/dustjumper = 20
)
-
+
/turf/simulated/floor/outdoors/grass/forest/virgo3c/Initialize()
if(tree_chance && prob(tree_chance) && !check_density())
diff --git a/code/modules/planet/virgo4_vr.dm b/code/modules/planet/virgo4_vr.dm
index 74cd6c33b41..f4e2118e808 100644
--- a/code/modules/planet/virgo4_vr.dm
+++ b/code/modules/planet/virgo4_vr.dm
@@ -392,7 +392,7 @@ var/datum/planet/virgo4/planet_virgo4 = null
temp_low = 283.15 // 10c
flight_failure_modifier = 25
transition_chances = list(
- WEATHER_BLOODMOON = 100
+ WEATHER_BLOOD_MOON = 100
)
observed_message = "Everything is red. Something really ominous is going on."
transition_messages = list(
diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm
index 83d81f99a72..f8915e08afe 100644
--- a/code/modules/power/breaker_box.dm
+++ b/code/modules/power/breaker_box.dm
@@ -93,7 +93,7 @@
/obj/machinery/power/breakerbox/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if(istype(W, /obj/item/device/multitool))
- var/newtag = input(user, "Enter new RCON tag. Use \"NO_TAG\" to disable RCON or leave empty to cancel.", "SMES RCON system") as text
+ var/newtag = tgui_input_text(user, "Enter new RCON tag. Use \"NO_TAG\" to disable RCON or leave empty to cancel.", "SMES RCON system")
if(newtag)
RCon_tag = newtag
to_chat(user, "You changed the RCON tag to: [newtag]")
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index a6ed0b6d1c3..d8ecc4f8882 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -979,7 +979,7 @@ var/list/possible_cable_coil_colours = list(
/obj/item/stack/cable_coil/alien/attack_hand(mob/user as mob)
if (user.get_inactive_hand() == src)
- var/N = input(usr, "How many units of wire do you want to take from [src]? You can only take up to [amount] at a time.", "Split stacks", 1) as num|null
+ var/N = tgui_input_number(usr, "How many units of wire do you want to take from [src]? You can only take up to [amount] at a time.", "Split stacks", 1)
if(N && N <= amount)
var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc)
CC.amount = N
diff --git a/code/modules/power/fusion/core/_core.dm b/code/modules/power/fusion/core/_core.dm
index 0fb5626a57c..308c9307839 100644
--- a/code/modules/power/fusion/core/_core.dm
+++ b/code/modules/power/fusion/core/_core.dm
@@ -149,7 +149,7 @@ GLOBAL_LIST_EMPTY(fusion_cores)
return
if(istype(W, /obj/item/device/multitool))
- var/new_ident = input(usr, "Enter a new ident tag.", "Fusion Core", id_tag) as null|text
+ var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", "Fusion Core", id_tag)
if(new_ident && user.Adjacent(src))
id_tag = new_ident
return
diff --git a/code/modules/power/fusion/core/core_control.dm b/code/modules/power/fusion/core/core_control.dm
index c6af7a68f44..feeb4c82ce3 100644
--- a/code/modules/power/fusion/core/core_control.dm
+++ b/code/modules/power/fusion/core/core_control.dm
@@ -24,7 +24,7 @@
/obj/machinery/computer/fusion_core_control/attackby(var/obj/item/thing, var/mob/user)
..()
if(istype(thing, /obj/item/device/multitool))
- var/new_ident = sanitize_text(input(usr, "Enter a new ident tag.", "Core Control", monitor.core_tag) as null|text)
+ var/new_ident = sanitize_text(tgui_input_text(usr, "Enter a new ident tag.", "Core Control", monitor.core_tag))
if(new_ident && user.Adjacent(src))
monitor.core_tag = new_ident
// id_tag = new_ident
diff --git a/code/modules/power/fusion/fuel_assembly/fuel_control.dm b/code/modules/power/fusion/fuel_assembly/fuel_control.dm
index 17ebe7ed8ab..e856f1288b8 100644
--- a/code/modules/power/fusion/fuel_assembly/fuel_control.dm
+++ b/code/modules/power/fusion/fuel_assembly/fuel_control.dm
@@ -117,7 +117,7 @@
/obj/machinery/computer/fusion_fuel_control/attackby(var/obj/item/W, var/mob/user)
..()
if(istype(W, /obj/item/device/multitool))
- var/new_ident = input(usr, "Enter a new ident tag.", "Fuel Control", monitor.fuel_tag) as null|text
+ var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", "Fuel Control", monitor.fuel_tag)
if(new_ident && user.Adjacent(src))
monitor.fuel_tag = new_ident
return
diff --git a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm
index b8df2267751..77b703e85e7 100644
--- a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm
+++ b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm
@@ -43,7 +43,7 @@ GLOBAL_LIST_EMPTY(fuel_injectors)
/obj/machinery/fusion_fuel_injector/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/device/multitool))
- var/new_ident = input(usr, "Enter a new ident tag.", "Fuel Injector", id_tag) as null|text
+ var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", "Fuel Injector", id_tag)
if(new_ident && user.Adjacent(src))
id_tag = new_ident
return
diff --git a/code/modules/power/fusion/gyrotron/gyrotron.dm b/code/modules/power/fusion/gyrotron/gyrotron.dm
index 8f7e1f9f52a..b2b33ef96bd 100644
--- a/code/modules/power/fusion/gyrotron/gyrotron.dm
+++ b/code/modules/power/fusion/gyrotron/gyrotron.dm
@@ -53,7 +53,7 @@ GLOBAL_LIST_EMPTY(gyrotrons)
/obj/machinery/power/emitter/gyrotron/attackby(var/obj/item/W, var/mob/user)
if(istype(W, /obj/item/device/multitool))
- var/new_ident = input(usr, "Enter a new ident tag.", "Gyrotron", id_tag) as null|text
+ var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", "Gyrotron", id_tag)
if(new_ident && user.Adjacent(src))
id_tag = new_ident
return
diff --git a/code/modules/power/fusion/gyrotron/gyrotron_control.dm b/code/modules/power/fusion/gyrotron/gyrotron_control.dm
index d084ef5515d..7cf27cc2b6c 100644
--- a/code/modules/power/fusion/gyrotron/gyrotron_control.dm
+++ b/code/modules/power/fusion/gyrotron/gyrotron_control.dm
@@ -119,7 +119,7 @@
/obj/machinery/computer/gyrotron_control/attackby(var/obj/item/W, var/mob/user)
..()
if(istype(W, /obj/item/device/multitool))
- var/new_ident = input(usr, "Enter a new ident tag.", "Gyrotron Control", monitor.gyro_tag) as null|text
+ var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", "Gyrotron Control", monitor.gyro_tag)
if(new_ident && user.Adjacent(src))
monitor.gyro_tag = new_ident
return
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 8976a3ba26b..6d4de751781 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -75,7 +75,7 @@ var/global/list/light_type_cache = list()
/obj/machinery/light_construct/attack_hand(mob/user)
. = ..()
- if(.)
+ if(.)
return . // obj/machinery/attack_hand returns 1 if user can't use the machine
if(cell)
user.visible_message("[user] removes [cell] from [src]!","You remove [cell].")
@@ -251,6 +251,9 @@ var/global/list/light_type_cache = list()
var/brightness_power_ns
var/brightness_color_ns
+ var/overlay_color = LIGHT_COLOR_INCANDESCENT_TUBE
+
+
/obj/machinery/light/flicker
auto_flicker = TRUE
@@ -266,6 +269,7 @@ var/global/list/light_type_cache = list()
light_type = /obj/item/weapon/light/bulb
construct_type = /obj/machinery/light_construct/small
shows_alerts = FALSE //VOREStation Edit
+ overlay_color = LIGHT_COLOR_INCANDESCENT_BULB
/obj/machinery/light/small/flicker
auto_flicker = TRUE
@@ -287,6 +291,7 @@ var/global/list/light_type_cache = list()
construct_type = /obj/machinery/light_construct/flamp
shows_alerts = FALSE //VOREStation Edit
var/lamp_shade = 1
+ overlay_color = LIGHT_COLOR_INCANDESCENT_BULB
/obj/machinery/light/flamp/Initialize(var/ml, obj/machinery/light_construct/construct = null)
. = ..(ml, construct)
@@ -296,7 +301,7 @@ var/global/list/light_type_cache = list()
update_icon()
else if(start_with_cell && !no_emergency)
cell = new/obj/item/weapon/cell/emergency_light(src)
-
+
/obj/machinery/light/flamp/flicker
auto_flicker = TRUE
@@ -356,18 +361,26 @@ var/global/list/light_type_cache = list()
//VOREStation Edit Start
if(shows_alerts && current_alert && on)
icon_state = "[base_state]-alert-[current_alert]"
+ add_light_overlay(FALSE, icon_state)
else
icon_state = "[base_state][on]"
+ if(on)
+ add_light_overlay()
+ else
+ remove_light_overlay()
//VOREStation Edit End
if(LIGHT_EMPTY)
icon_state = "[base_state]-empty"
on = 0
+ remove_light_overlay() //VOREStation add
if(LIGHT_BURNED)
icon_state = "[base_state]-burned"
on = 0
+ remove_light_overlay() //VOREStation add
if(LIGHT_BROKEN)
icon_state = "[base_state]-broken"
on = 0
+ remove_light_overlay() //VOREStation add
return
/obj/machinery/light/flamp/update_icon()
@@ -376,15 +389,22 @@ var/global/list/light_type_cache = list()
switch(status) // set icon_states
if(LIGHT_OK)
icon_state = "[base_state][on]"
+ if(on) //VOREStation add
+ add_light_overlay() //VOREStation add
+ else //VOREStation add
+ remove_light_overlay() //VOREStation add
if(LIGHT_EMPTY)
on = 0
icon_state = "[base_state][on]"
+ remove_light_overlay() //VOREStation add
if(LIGHT_BURNED)
on = 0
icon_state = "[base_state][on]"
+ remove_light_overlay() //VOREStation add
if(LIGHT_BROKEN)
on = 0
icon_state = "[base_state][on]"
+ remove_light_overlay() //VOREStation add
return
else
base_state = "flamp"
@@ -410,12 +430,12 @@ var/global/list/light_type_cache = list()
current_alert = null
var/obj/item/weapon/light/L = get_light_type_instance(light_type)
-
+
if(L)
update_from_bulb(L)
else
brightness_color = nightshift_enabled ? initial(brightness_color_ns) : initial(brightness_color)
-
+
update()
//VOREstation Edit End
@@ -717,7 +737,7 @@ var/global/list/light_type_cache = list()
update(FALSE)
return
-// ai alt click - Make light flicker. Very important for atmosphere.
+// ai alt click - Make light flicker. Very important for atmosphere.
/obj/machinery/light/AIAltClick(mob/user)
flicker(1)
@@ -893,7 +913,7 @@ var/global/list/light_type_cache = list()
throwforce = 5
w_class = ITEMSIZE_TINY
matter = list(MAT_STEEL = 60)
-
+
///LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN
var/status = LIGHT_OK
///Base icon_state name to append suffixes for status
@@ -919,7 +939,7 @@ var/global/list/light_type_cache = list()
var/nightshift_power = 0.45
///Replaces brightness_color during nightshifts.
var/nightshift_color = LIGHT_COLOR_NIGHTSHIFT
-
+
drop_sound = 'sound/items/drop/glass.ogg'
pickup_sound = 'sound/items/pickup/glass.ogg'
@@ -961,7 +981,7 @@ var/global/list/light_type_cache = list()
name = "large light bulb"
brightness_range = 7
brightness_power = 1.5
-
+
nightshift_range = 4
nightshift_power = 0.75
diff --git a/code/modules/power/lighting_vr.dm b/code/modules/power/lighting_vr.dm
index b7f0fb320ce..6b023141fcc 100644
--- a/code/modules/power/lighting_vr.dm
+++ b/code/modules/power/lighting_vr.dm
@@ -46,7 +46,7 @@
/obj/item/weapon/light/bulb/large
brightness_range = 6
brightness_power = 1
-
+
nightshift_range = 6
nightshift_power = 0.45
@@ -60,6 +60,7 @@
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
construct_type = /obj/machinery/light_construct/floortube
+ overlay_above_everything = FALSE
/obj/machinery/light/floortube/flicker
auto_flicker = TRUE
@@ -106,6 +107,7 @@
plane = MOB_PLANE
layer = ABOVE_MOB_LAYER
construct_type = /obj/machinery/light_construct/bigfloorlamp
+ overlay_above_everything = TRUE
/obj/machinery/light/bigfloorlamp/flicker
auto_flicker = TRUE
@@ -128,3 +130,82 @@
icon_state = "big_flamp-construct-stage2"
if(3)
icon_state = "big_flamp-empty"
+
+// Fairy lights
+
+/obj/item/weapon/light/bulb/smol
+ brightness_range = 1
+ brightness_power = 0.5
+
+ nightshift_range = 1
+ nightshift_power = 0.25
+
+
+/obj/machinery/light/small/fairylights
+ icon = 'icons/obj/lighting_vr.dmi'
+ icon_state = "fairy_lights1"
+ base_state = "fairy_lights"
+ desc = "A set of lights on a long string of wire, anchored to the walls."
+ light_type = /obj/item/weapon/light/bulb/smol
+ shows_alerts = FALSE
+ anchored = TRUE
+ plane = ABOVE_MOB_PLANE
+ layer = ABOVE_MOB_LAYER
+ construct_type = null
+ overlay_color = LIGHT_COLOR_INCANDESCENT_BULB
+ overlay_above_everything = TRUE
+ color = "#3e5064"
+
+/obj/machinery/light/small/fairylights/broken()
+ return
+
+/obj/machinery/light/small/fairylights/flicker
+ auto_flicker = TRUE
+
+/obj/machinery/light
+ var/image/overlay_layer = null
+ var/overlay_above_everything = TRUE
+
+/obj/machinery/light/proc/add_light_overlay(do_color = TRUE, provided_state = null)
+ remove_light_overlay()
+ if(provided_state)
+ overlay_layer = image(icon, "[provided_state]-overlay")
+ else
+ overlay_layer = image(icon, "[base_state]-overlay")
+ overlay_layer.appearance_flags = RESET_COLOR|KEEP_APART
+ if(overlay_color && do_color)
+ overlay_layer.color = overlay_color
+ if(overlay_above_everything)
+ overlay_layer.plane = PLANE_LIGHTING_ABOVE
+ else
+ overlay_layer.plane = PLANE_EMISSIVE
+
+ add_overlay(overlay_layer)
+
+/obj/machinery/light/proc/remove_light_overlay()
+ if(overlay_layer)
+ cut_overlay(overlay_layer)
+ qdel(overlay_layer)
+ overlay_layer = null
+
+
+/*
+/obj/machinery/light_construct/bigfloorlamp
+ name = "big floor light fixture frame"
+ desc = "A big floor light fixture under construction."
+ icon = 'icons/obj/lighting32x64.dmi'
+ icon_state = "big_flamp-construct-stage1"
+ stage = 1
+ anchored = FALSE
+ fixture_type = /obj/machinery/light/bigfloorlamp
+ sheets_refunded = 1
+
+/obj/machinery/light_construct/bigfloorlamp/update_icon()
+ switch(stage)
+ if(1)
+ icon_state = "big_flamp-construct-stage1"
+ if(2)
+ icon_state = "big_flamp-construct-stage2"
+ if(3)
+ icon_state = "big_flamp-empty"
+*/
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index b4ee6c7f581..2d35cd8fbec 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -365,7 +365,8 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity)
return 0
// VOREStation Edit Start
- if(istype(get_area(T), /area/crew_quarters/sleep)) //No going to dorms
+ var/area/A = get_area(T)
+ if(A.forbid_singulo) //No going to dorms
return 0
// VOREStation Edit End
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index c4967200635..416734eae9f 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -315,6 +315,8 @@ GLOBAL_LIST_EMPTY(smeses)
"[user.name] has added cables to the [src].",\
"You added cables to the [src].")
stat = 0
+ if(!powernet)
+ connect_to_network()
return FALSE
else if(W.is_wirecutter() && !building_terminal)
@@ -418,7 +420,7 @@ GLOBAL_LIST_EMPTY(smeses)
switch(io)
if(SMES_TGUI_INPUT)
set_input(target)
- if(SMES_TGUI_OUTPUT)
+ if(SMES_TGUI_OUTPUT)
set_output(target)
diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm
index 4f1b4e5dcde..381f6b09f69 100644
--- a/code/modules/power/smes_construction.dm
+++ b/code/modules/power/smes_construction.dm
@@ -312,7 +312,7 @@
// Multitool - change RCON tag
if(istype(W, /obj/item/device/multitool))
- var/newtag = input(user, "Enter new RCON tag. Use \"NO_TAG\" to disable RCON or leave empty to cancel.", "SMES RCON system") as text
+ var/newtag = tgui_input_text(user, "Enter new RCON tag. Use \"NO_TAG\" to disable RCON or leave empty to cancel.", "SMES RCON system")
if(newtag)
RCon_tag = newtag
to_chat(user, "You changed the RCON tag to: [newtag]")
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index 297a749aa7d..77a5659cdda 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -124,7 +124,7 @@
if(default_deconstruction_crowbar(user, W))
return
if(istype(W, /obj/item/device/multitool))
- var/new_ident = input(usr, "Enter a new ident tag.", name, comp_id) as null|text
+ var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", name, comp_id)
if(new_ident && user.Adjacent(src))
comp_id = new_ident
return
@@ -337,7 +337,7 @@
/obj/machinery/computer/turbine_computer/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/device/multitool))
- var/new_ident = input(usr, "Enter a new ident tag.", name, id) as null|text
+ var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", name, id)
if(new_ident && user.Adjacent(src))
id = new_ident
return
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index 5188ee25950..77e9a1378e4 100644
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -37,7 +37,7 @@
return
var/tmp_label = ""
- var/label_text = sanitizeSafe(input(user, "Inscribe some text into \the [initial(BB.name)]","Inscription",tmp_label), MAX_NAME_LEN)
+ var/label_text = sanitizeSafe(tgui_input_text(user, "Inscribe some text into \the [initial(BB.name)]","Inscription",tmp_label,MAX_NAME_LEN), MAX_NAME_LEN)
if(length(label_text) > 20)
to_chat(user, "The inscription can be at most 20 characters long.")
else if(!label_text)
diff --git a/code/modules/projectiles/ammunition/ammo_boxes.dm b/code/modules/projectiles/ammunition/ammo_boxes.dm
index 566b878c44f..533a27bc4c9 100644
--- a/code/modules/projectiles/ammunition/ammo_boxes.dm
+++ b/code/modules/projectiles/ammunition/ammo_boxes.dm
@@ -10,7 +10,7 @@
#
# Use this format, followed by the caliber. For example, a shotgun's caliber
# variable is "12g" as a result. Ergo, a shotgun round's path would have "a12g",
-# or a magazine with shotgun shells would be "m12g" instead. To avoid confusion
+# or a magazine with shotgun shells would be "m12g" instead. To avoid confusion // Avoid confusion my ass, when ammo is called only shells and suddenly switches to being called some obscure-ass military number
# for developers and in-game admins spawning these items, stick to this format.
# Likewise, when creating new rounds, the caliber variable should match whatever
# the name says.
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 60b73cd82d1..92be1894871 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -652,6 +652,12 @@
if(!isnull(M.accuracy_dispersion))
P.dispersion = max(P.dispersion + M.accuracy_dispersion, 0)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(H.species)
+ P.accuracy += H.species.gun_accuracy_mod
+ P.dispersion = max(P.dispersion + H.species.gun_accuracy_dispersion_mod, 0)
+
//does the actual launching of the projectile
/obj/item/weapon/gun/proc/process_projectile(obj/projectile, mob/user, atom/target, var/target_zone, var/params=null)
var/obj/item/projectile/P = projectile
@@ -789,7 +795,7 @@
return ..()
-/obj/item/weapon/gun/dropped(mob/living/user) // Ditto as above, we remove the HUD. Pending porting TGMC code to clean up this fucking nightmare of spaghetti.
+/obj/item/weapon/gun/dropped(mob/living/user) // Ditto as above, we remove the HUD. Pending porting TGMC code to clean up this fucking nightmare of spaghetti.
user.hud_used.remove_ammo_hud(user, src)
..()
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm b/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm
index 2e2b0d8bffd..b7bc0f1597f 100644
--- a/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm
+++ b/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm
@@ -17,6 +17,8 @@
combustion = FALSE
+ can_miss = FALSE
+
muzzle_type = /obj/effect/projectile/muzzle/medigun
tracer_type = /obj/effect/projectile/tracer/medigun
impact_type = /obj/effect/projectile/impact/medigun
diff --git a/code/modules/projectiles/guns/energy/special_vr.dm b/code/modules/projectiles/guns/energy/special_vr.dm
index 73e878eed6b..e7e2b702014 100644
--- a/code/modules/projectiles/guns/energy/special_vr.dm
+++ b/code/modules/projectiles/guns/energy/special_vr.dm
@@ -1,27 +1,102 @@
-/obj/item/weapon/gun/energy/ionrifle/pistol
- projectile_type = /obj/item/projectile/ion/pistol // still packs a punch but no AoE
-
-/obj/item/weapon/gun/energy/ionrifle/weak
- projectile_type = /obj/item/projectile/ion/small
-
-/obj/item/weapon/gun/energy/medigun //Adminspawn/ERT etc
- name = "directed restoration system"
- desc = "The BL-3 'Phoenix' is an adaptation on the ML-3 'Medbeam' design that channels the power of the beam into a single healing laser. It is highly energy-inefficient, but its medical power cannot be denied."
- force = 5
- icon_state = "medbeam"
- item_state = "medbeam"
- icon = 'icons/obj/gun_vr.dmi'
- item_icons = list(
- slot_l_hand_str = 'icons/mob/items/lefthand_guns_vr.dmi',
- slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi',
- )
- slot_flags = SLOT_BELT
- accuracy = 100
- fire_delay = 12
- fire_sound = 'sound/weapons/eluger.ogg'
-
- projectile_type = /obj/item/projectile/beam/medigun
-
- accept_cell_type = /obj/item/weapon/cell
- cell_type = /obj/item/weapon/cell/high
- charge_cost = 2500
\ No newline at end of file
+/obj/item/weapon/gun/energy/ionrifle/pistol
+ projectile_type = /obj/item/projectile/ion/pistol // still packs a punch but no AoE
+
+/obj/item/weapon/gun/energy/ionrifle/weak
+ projectile_type = /obj/item/projectile/ion/small
+
+/obj/item/weapon/gun/energy/medigun //Adminspawn/ERT etc
+ name = "directed restoration system"
+ desc = "The BL-3 'Phoenix' is an adaptation on the ML-3 'Medbeam' design that channels the power of the beam into a single healing laser. It is highly energy-inefficient, but its medical power cannot be denied."
+ force = 5
+ icon_state = "medbeam"
+ item_state = "medbeam"
+ icon = 'icons/obj/gun_vr.dmi'
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_guns_vr.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi',
+ )
+ slot_flags = SLOT_BELT
+ accuracy = 100
+ fire_delay = 12
+ fire_sound = 'sound/weapons/eluger.ogg'
+
+ projectile_type = /obj/item/projectile/beam/medigun
+
+ accept_cell_type = /obj/item/weapon/cell
+ cell_type = /obj/item/weapon/cell/high
+ charge_cost = 2500
+
+/obj/item/weapon/gun/energy/bfgtaser
+ name = "9000-series Ball Lightning Taser"
+ desc = "The brainchild of Hephaestus Industries Civil Pacification Division, the BLT-9000 was intended for riot control but despite enthusiastic interest from law-enforcement agencies across the Commonwealth and beyond, its indiscriminate nature led to it being banned from civilian use in virtually all jurisdictions. As a result, most pieces are found in the hands of collectors."
+ icon = 'icons/obj/gun_vr.dmi'
+ icon_state = "BFG"
+ fire_sound = 'sound/effects/phasein.ogg'
+ item_state = "mhdhowitzer"
+ wielded_item_state = "mhdhowitzer-wielded" //Placeholder
+ slot_flags = SLOT_BELT|SLOT_BACK
+ projectile_type = /obj/item/projectile/bullet/BFGtaser
+ fire_delay = 20
+ w_class = ITEMSIZE_LARGE
+ one_handed_penalty = 90 // The thing's heavy and huge.
+ accuracy = 45
+ charge_cost = 2400 //yes, this bad boy empties an entire weapon cell in one shot. What of it?
+ var/spinning_up = FALSE
+
+/obj/item/weapon/gun/energy/bfgtaser/Fire(atom/target, mob/living/user, clickparams, pointblank=0, reflex=0)
+ if(spinning_up)
+ return
+ if(!power_supply || !power_supply.check_charge(charge_cost))
+ handle_click_empty(user)
+ return
+
+ playsound(src, 'sound/weapons/chargeup.ogg', 100, 1)
+ spinning_up = TRUE
+ update_icon()
+ user.visible_message("[user] starts charging the [src]!", \
+ "You start charging the [src]!")
+ if(do_after(user, 8, src))
+ spinning_up = FALSE
+ ..()
+ else
+ spinning_up = FALSE
+
+/obj/item/projectile/beam/stun/weak/BFG
+ fire_sound = 'sound/effects/sparks6.ogg'
+ hitsound = 'sound/effects/sparks4.ogg'
+ hitsound_wall = 'sound/effects/sparks7.ogg'
+
+/obj/item/projectile/bullet/BFGtaser
+ name = "lightning ball"
+ icon = 'icons/obj/projectiles_vr.dmi'
+ icon_state = "minitesla"
+ speed=5
+ damage = 100
+ damage_type = AGONY
+ check_armour = "energy"
+ embed_chance = 0
+ hitsound = 'sound/weapons/zapbang.ogg'
+ hitsound_wall = 'sound/weapons/effects/searwall.ogg'
+ var/zaptype = /obj/item/projectile/beam/stun/weak/BFG
+
+/obj/item/projectile/bullet/BFGtaser/process()
+ var/list/victims = list()
+ for(var/mob/living/M in living_mobs(world.view))
+ if(M != firer)
+ victims += M
+ if(LAZYLEN(victims))
+ var/target = pick(victims)
+ var/obj/item/projectile/P = new zaptype(src.loc)
+ P.launch_projectile_from_turf(target = target, target_zone = null, user = firer, params = null, angle_override = null, forced_spread = 0)
+ ..()
+
+/obj/item/projectile/bullet/BFGtaser/on_hit()
+ var/list/victims = list()
+ for(var/mob/living/M in living_mobs(world.view))
+ if(M != firer)
+ victims += M
+ if(LAZYLEN(victims))
+ for(var/target in victims)
+ var/obj/item/projectile/P = new zaptype(src.loc)
+ P.launch_projectile_from_turf(target = target, target_zone = null, user = firer, params = null, angle_override = null, forced_spread = 0)
+ ..()
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/energy/stun_vr.dm b/code/modules/projectiles/guns/energy/stun_vr.dm
index b0bfd53e463..3ddc43986c6 100644
--- a/code/modules/projectiles/guns/energy/stun_vr.dm
+++ b/code/modules/projectiles/guns/energy/stun_vr.dm
@@ -3,4 +3,7 @@
fire_delay = 4
/obj/item/weapon/gun/energy/stunrevolver
- charge_cost = 400
\ No newline at end of file
+ charge_cost = 400
+
+/obj/item/weapon/gun/energy/taser/mounted/cyborg
+ charge_cost = 160
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/toy.dm b/code/modules/projectiles/guns/toy.dm
index e3b90bd1be0..22f8ef9f740 100644
--- a/code/modules/projectiles/guns/toy.dm
+++ b/code/modules/projectiles/guns/toy.dm
@@ -54,6 +54,19 @@
handle_casings = null
recoil = null //it's a toy
+/*
+ * Moist Nugget
+ */
+/obj/item/weapon/gun/projectile/shotgun/pump/toy/moistnugget
+ name = "\improper Donk-Soft mosin-nagant"
+ desc = "Donk-Soft foam mosin-nagant! It's Donk or Don't! Ages 8 and up."
+ description_fluff = "A special Donk-Soft rifle originally made to pair with a Soviet Soldier costume. It didn't catch on quite as well as other Donk-Soft products."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "moistnugget"
+ item_state = "moistnugget"
+ max_shells = 5
+ matter = list(MAT_PLASTIC = 2500)
+
/*
* Pistol
*/
@@ -199,7 +212,52 @@
icon_state = initial(icon_state)
else
icon_state = "[initial(icon_state)]-e"
+/*
+ * Cyborg
+ */
+/obj/item/weapon/gun/projectile/cyborgtoy
+ name = "\improper Donk-Soft Cyborg Blaster"
+ desc = "Donk-Soft Cyborg Blaster! It's Donk or Don't! Adult supervision required. Use to toggle between battle and cleanup mode."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "smg"
+ caliber = "foam"
+ load_method = SINGLE_CASING
+ max_shells = 15
+ var/cleanup = 0
+ ammo_type = /obj/item/ammo_casing/afoam_dart
+ projectile_type = /obj/item/projectile/bullet/foam_dart
+ recoil = null
+ handle_casings = null
+/obj/item/weapon/gun/projectile/cyborgtoy/attack_self(var/mob/user)
+ cleanup = !cleanup
+ to_chat(user, "The [src] is now on [cleanup ? "cleanup" : "battle"] mode.")
+
+/obj/item/weapon/gun/projectile/cyborgtoy/afterattack(atom/A, mob/living/user, adjacent, params)
+ if(cleanup)
+ if(!adjacent)
+ return 0
+ collectammo(A, user)
+ return 0
+ ..()
+
+/obj/item/weapon/gun/projectile/cyborgtoy/proc/collectammo(atom/A, user)
+ if(loaded.len >= max_shells)
+ to_chat(user, "The [src] is at max capacity.")
+ return
+ var/T = get_turf(A)
+ var/success = 0
+ for(var/obj/item/ammo_casing/afoam_dart/D in T)
+ if(loaded.len >= max_shells)
+ break
+ D.loc = src
+ loaded.Insert(1, D)
+ success = 1
+ if(success)
+ playsound(src, 'sound/machines/hiss.ogg', 50, 0)
+ to_chat(user, "The [src] vacuums in the darts!")
+ else
+ to_chat(user, "No Donk-Soft brand foam darts detected. Aborting.")
/*
* Laser Tag
*/
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 8ed8d98ffd2..049992dfacf 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -40,6 +40,7 @@
var/ricochets = 0
var/ricochets_max = 2
var/ricochet_chance = 30
+ var/can_miss = TRUE
//Hitscan
var/hitscan = FALSE //Whether this is hitscan. If it is, speed is basically ignored.
@@ -139,7 +140,7 @@
var/impact_effect_type = null
var/list/impacted_mobs = list()
-
+
// TGMC Ammo HUD Port
var/hud_state = "unknown" // What HUD state we use when we have ammunition.
var/hud_state_empty = "unknown" // The empty state. DON'T USE _FLASH IN THE NAME OF THE EMPTY STATE STRING, THAT IS ADDED BY THE CODE.
@@ -655,7 +656,7 @@
//roll to-hit
miss_modifier = max(15*(distance-2) - accuracy + miss_modifier + target_mob.get_evasion(), -100)
- var/hit_zone = get_zone_with_miss_chance(def_zone, target_mob, miss_modifier, ranged_attack=(distance > 1 || original != target_mob)) //if the projectile hits a target we weren't originally aiming at then retain the chance to miss
+ var/hit_zone = get_zone_with_miss_chance(def_zone, target_mob, miss_modifier, ranged_attack=(distance > 1 || original != target_mob), force_hit = !can_miss) //if the projectile hits a target we weren't originally aiming at then retain the chance to miss
var/result = PROJECTILE_FORCE_MISS
if(hit_zone)
diff --git a/code/modules/random_map/drop/droppod.dm b/code/modules/random_map/drop/droppod.dm
index 2b1cda09a8f..e842772f4a5 100644
--- a/code/modules/random_map/drop/droppod.dm
+++ b/code/modules/random_map/drop/droppod.dm
@@ -164,7 +164,7 @@
return
if(tgui_alert(usr, "Do you wish the mob to have a player?","Assign Player?",list("No","Yes")) == "No")
- var/spawn_count = input(usr, "How many mobs do you wish the pod to contain?", "Drop Pod Selection", null) as num
+ var/spawn_count = tgui_input_number(usr, "How many mobs do you wish the pod to contain?", "Drop Pod Selection", null)
if(spawn_count <= 0)
return
for(var/i=0;i[bicon(container)] [mix_message]", 1)
+ M.show_message("\icon[container][bicon(container)] [mix_message]", 1)
playsound(T, reaction_sound, 80, 1)
//obtains any special data that will be provided to the reaction products
diff --git a/code/modules/reagents/reactions/instant/food.dm b/code/modules/reagents/reactions/instant/food.dm
index 188e285623a..d3f934051ae 100644
--- a/code/modules/reagents/reactions/instant/food.dm
+++ b/code/modules/reagents/reactions/instant/food.dm
@@ -140,7 +140,7 @@
id = "dough"
result = null
required_reagents = list("egg" = 3, "flour" = 10)
- inhibitors = list("water" = 1, "beer" = 1) //To prevent it messing with batter recipes
+ inhibitors = list("water" = 1, "beer" = 1, "sugar" = 1) //To prevent it messing with batter recipes
result_amount = 1
/decl/chemical_reaction/instant/food/dough/on_reaction(var/datum/reagents/holder, var/created_volume)
@@ -189,6 +189,13 @@
required_reagents = list("flour" = 5, "coco" = 5, "sugar" = 5)
result_amount = 15
+/decl/chemical_reaction/instant/food/cakebatter
+ name = "Cake Batter"
+ id = "cakebatter"
+ result = "cakebatter"
+ required_reagents = list("flour" = 15, "milk" = 10, "sugar" = 15, "egg" = 3)
+ result_amount = 60
+
/decl/chemical_reaction/instant/food/butter
name = "Butter"
id = "butter"
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index 693330fef7d..e5158def755 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -56,7 +56,7 @@
/obj/item/weapon/reagent_containers/blood/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/device/flashlight/pen))
- var/tmp_label = sanitizeSafe(input(user, "Enter a label for [name]", "Label", label_text), MAX_NAME_LEN)
+ var/tmp_label = sanitizeSafe(tgui_input_text(user, "Enter a label for [name]", "Label", label_text, MAX_NAME_LEN), MAX_NAME_LEN)
if(length(tmp_label) > 50)
to_chat(user, "The label can be at most 50 characters long.")
else if(length(tmp_label) > 10)
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index e4e3849ac2a..2d450ba8cff 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -122,7 +122,7 @@
/obj/item/weapon/reagent_containers/glass/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/device/flashlight/pen))
- var/tmp_label = sanitizeSafe(input(user, "Enter a label for [name]", "Label", label_text), MAX_NAME_LEN)
+ var/tmp_label = sanitizeSafe(tgui_input_text(user, "Enter a label for [name]", "Label", label_text, MAX_NAME_LEN), MAX_NAME_LEN)
if(length(tmp_label) > 50)
to_chat(user, "The label can be at most 50 characters long.")
else if(length(tmp_label) > 10)
diff --git a/code/modules/reagents/reagent_containers/glass_vr.dm b/code/modules/reagents/reagent_containers/glass_vr.dm
index e0d11cd5852..350a64e224b 100644
--- a/code/modules/reagents/reagent_containers/glass_vr.dm
+++ b/code/modules/reagents/reagent_containers/glass_vr.dm
@@ -53,6 +53,30 @@
name = "vial (amorphorovir)"
prefill = list("amorphorovir" = 1)
+/obj/item/weapon/reagent_containers/glass/beaker/vial/androrovir
+ name = "vial (androrovir)"
+ prefill = list("androrovir" = 1)
+
+/obj/item/weapon/reagent_containers/glass/beaker/vial/gynorovir
+ name = "vial (gynorovir)"
+ prefill = list("gynorovir" = 1)
+
+/obj/item/weapon/reagent_containers/glass/beaker/vial/androgynorovir
+ name = "vial (androgynorovir)"
+ prefill = list("androgynorovir" = 1)
+
+/obj/item/weapon/reagent_containers/glass/beaker/vial/macrocillin
+ name = "vial (macrocillin)"
+ prefill = list("macrocillin" = 1)
+
+/obj/item/weapon/reagent_containers/glass/beaker/vial/microcillin
+ name = "vial (microcillin)"
+ prefill = list("microcillin" = 1)
+
+/obj/item/weapon/reagent_containers/glass/beaker/vial/normalcillin
+ name = "vial (normalcillin)"
+ prefill = list("normalcillin" = 1)
+
/obj/item/weapon/reagent_containers/glass/beaker/vial/supermatter
name = "vial (supermatter)"
desc = "A glass vial containing the extremely dangerous results of grinding a shard of supermatter down to a fine powder."
diff --git a/code/modules/reagents/reagents/_reagents.dm b/code/modules/reagents/reagents/_reagents.dm
index b42dd2d9053..00924548e96 100644
--- a/code/modules/reagents/reagents/_reagents.dm
+++ b/code/modules/reagents/reagents/_reagents.dm
@@ -171,7 +171,7 @@
if(overdose && (volume > overdose * M?.species.chemOD_threshold) && (active_metab.metabolism_class != CHEM_TOUCH && !can_overdose_touch))
overdose(M, alien, removed)
if(M.species.allergens & allergen_type) //uhoh, we can't handle this!
- M.add_chemical_effect(CE_ALLERGEN,allergen_factor)
+ M.add_chemical_effect(CE_ALLERGEN, allergen_factor * removed)
remove_self(removed)
return
diff --git a/code/modules/reagents/reagents/core.dm b/code/modules/reagents/reagents/core.dm
index 3eb3e06cfb1..6a1234950f3 100644
--- a/code/modules/reagents/reagents/core.dm
+++ b/code/modules/reagents/reagents/core.dm
@@ -46,12 +46,12 @@
var/effective_dose = dose
if(issmall(M)) effective_dose *= 2
- var/is_vampire = 0 //VOREStation Edit START
+ var/is_vampire = FALSE //VOREStation Edit START
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.species.organic_food_coeff == 0)
- H.adjust_nutrition(removed)
- is_vampire = 1 //VOREStation Edit END
+ if(H.species.bloodsucker)
+ H.adjust_nutrition(removed*30)
+ is_vampire = TRUE //VOREStation Edit END
if(alien == IS_SLIME) // Treat it like nutriment for the jello, but not equivalent.
if(data["species"] == M.species.name) // Unless it's Promethean goo, then refill this one's goo.
M.inject_blood(src, volume * volume_mod)
@@ -65,10 +65,10 @@
return
if(effective_dose > 5)
- if(is_vampire == 0) //VOREStation Edit.
+ if(!is_vampire) //VOREStation Edit.
M.adjustToxLoss(removed) //VOREStation Edit.
if(effective_dose > 15)
- if(is_vampire == 0) //VOREStation Edit.
+ if(!is_vampire) //VOREStation Edit.
M.adjustToxLoss(removed) //VOREStation Edit.
if(data && data["virus2"])
var/list/vlist = data["virus2"]
diff --git a/code/modules/reagents/reagents/food_drinks.dm b/code/modules/reagents/reagents/food_drinks.dm
index 0323520e89e..2b16a45f46f 100644
--- a/code/modules/reagents/reagents/food_drinks.dm
+++ b/code/modules/reagents/reagents/food_drinks.dm
@@ -692,6 +692,13 @@
reagent_state = SOLID
color = "#441a03"
+/datum/reagent/cakebatter
+ name = "Cake Batter"
+ id = "cakebatter"
+ description = "A batter for making delicious cakes."
+ reagent_state = LIQUID
+ color = "#F0EDDA"
+
/datum/reagent/frostoil
name = "Frost Oil"
id = "frostoil"
diff --git a/code/modules/reagents/reagents/food_drinks_vr.dm b/code/modules/reagents/reagents/food_drinks_vr.dm
index ef301925cb4..668df0d83ea 100644
--- a/code/modules/reagents/reagents/food_drinks_vr.dm
+++ b/code/modules/reagents/reagents/food_drinks_vr.dm
@@ -140,7 +140,7 @@
M.adjust_nutrition(alt_nutriment_factor * removed)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.feral > 0 && H.nutrition > 100 && H.traumatic_shock < min(60, H.nutrition/10) && H.jitteriness < 100) // same check as feral triggers to stop them immediately re-feralling
+ if(H.feral > 0 && H.nutrition > 150 && H.traumatic_shock < 20 && H.jitteriness < 100) //Same check as feral triggers to stop them immediately re-feralling
H.feral -= removed * 3 // should calm them down quick, provided they're actually in a state to STAY calm.
if (H.feral <=0) //check if they're unferalled
H.feral = 0
@@ -523,6 +523,7 @@
color = "#caa3c9"
/datum/reagent/nutriment/protein/brainzsnax/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
+ ..()
if(prob(5) && !(alien == IS_CHIMERA || alien == IS_SLIME || alien == IS_PLANT || alien == IS_DIONA || alien == IS_SHADEKIN && !M.isSynthetic()))
M.adjustBrainLoss(removed) //Any other species risks prion disease.
M.Confuse(5)
@@ -530,7 +531,7 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.feral > 0 && H.nutrition > 100 && H.traumatic_shock < min(60, H.nutrition/10) && H.jitteriness < 100) //Same check as feral triggers to stop them immediately re-feralling
+ if(H.feral > 0 && H.nutrition > 150 && H.traumatic_shock < 20 && H.jitteriness < 100) //Same check as feral triggers to stop them immediately re-feralling
H.feral -= removed * 3 //Should calm them down quick, provided they're actually in a state to STAY calm.
if(H.feral <=0) //Check if they're unferalled
H.feral = 0
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 2dad01ed94b..1996a713585 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -130,7 +130,7 @@
if(istype(I, /obj/item/device/multitool))
if(panel_open)
- var/input = sanitize(input(usr, "What id would you like to give this conveyor?", "Multitool-Conveyor interface", id))
+ var/input = sanitize(tgui_input_text(usr, "What id would you like to give this conveyor?", "Multitool-Conveyor interface", id))
if(!input)
to_chat(user, "No input found. Please hang up and try your call again.")
return
@@ -304,7 +304,7 @@
if(istype(I, /obj/item/device/multitool))
if(panel_open)
- var/input = sanitize(input(usr, "What id would you like to give this conveyor switch?", "Multitool-Conveyor interface", id))
+ var/input = sanitize(tgui_input_text(usr, "What id would you like to give this conveyor switch?", "Multitool-Conveyor interface", id))
if(!input)
to_chat(user, "No input found. Please hang up and try your call again.")
return
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index a8e23e83e80..94d2232c268 100755
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -42,7 +42,7 @@
else if(istype(W, /obj/item/weapon/pen))
switch(tgui_alert(usr, "What would you like to alter?","Select Alteration",list("Title","Description","Cancel")))
if("Title")
- var/str = sanitizeSafe(input(usr,"Label text?","Set label",""), MAX_NAME_LEN)
+ var/str = sanitizeSafe(tgui_input_text(usr,"Label text?","Set label","", MAX_NAME_LEN), MAX_NAME_LEN)
if(!str || !length(str))
to_chat(user, " Invalid text.")
return
@@ -57,7 +57,7 @@
else
nameset = 1
if("Description")
- var/str = sanitize(input(usr,"Label text?","Set label",""))
+ var/str = sanitize(tgui_input_text(usr,"Label text?","Set label",""))
if(!str || !length(str))
to_chat(user, "Invalid text.")
return
@@ -153,7 +153,7 @@
else if(istype(W, /obj/item/weapon/pen))
switch(tgui_alert(usr, "What would you like to alter?","Select Alteration",list("Title","Description","Cancel")))
if("Title")
- var/str = sanitizeSafe(input(usr,"Label text?","Set label",""), MAX_NAME_LEN)
+ var/str = sanitizeSafe(tgui_input_text(usr,"Label text?","Set label","", MAX_NAME_LEN), MAX_NAME_LEN)
if(!str || !length(str))
to_chat(user, " Invalid text.")
return
@@ -169,7 +169,7 @@
nameset = 1
if("Description")
- var/str = sanitize(input(usr,"Label text?","Set label",""))
+ var/str = sanitize(tgui_input_text(usr,"Label text?","Set label",""))
if(!str || !length(str))
to_chat(user, "Invalid text.")
return
diff --git a/code/modules/research/designs/medical_vr.dm b/code/modules/research/designs/medical_vr.dm
index 0cb7251e8f7..4171f881e9d 100644
--- a/code/modules/research/designs/medical_vr.dm
+++ b/code/modules/research/designs/medical_vr.dm
@@ -30,6 +30,15 @@
build_path = /obj/item/weapon/reagent_containers/hypospray/science
sort_string = "KCAVB"
+/datum/design/item/medical/recombobray
+ name = "recombobulation ray"
+ desc = "The Type Gamma Medical Recombobulation ray! A mysterious looking ray gun! It works to change people who have had their form significantly altered back into their original forms!"
+ id = "recombobray"
+ req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_POWER = 4, TECH_BIO = 5, TECH_BLUESPACE = 4) //Not like these matter. *Glares at circuit printer.*
+ materials = list(MAT_STEEL = 1000, MAT_GLASS = 2000, MAT_URANIUM = 500, MAT_PHORON = 1500)
+ build_path = /obj/item/weapon/gun/energy/mouseray/medical
+ sort_string = "KCAVC"
+
// ML-3M medigun and cells
/datum/design/item/medical/cell_based/AssembleDesignName()
..()
diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm
index 9616731025a..7c5889a6432 100644
--- a/code/modules/research/message_server.dm
+++ b/code/modules/research/message_server.dm
@@ -82,7 +82,7 @@ var/global/list/obj/machinery/message_server/message_servers = list()
/obj/machinery/message_server/examine(mob/user, distance, infix, suffix)
. = ..()
- . += "It appears to be [active ? "online" : "offline"]."
+ . += "It appears to be [active ? "online" : "offline"]."
/obj/machinery/message_server/proc/GenerateKey()
//Feel free to move to Helpers.
@@ -129,12 +129,12 @@ var/global/list/obj/machinery/message_server/message_servers = list()
if(2)
if(!Console.silent)
playsound(Console, 'sound/machines/twobeep.ogg', 50, 1)
- Console.audible_message(text("[bicon(Console)] *The Requests Console beeps: 'PRIORITY Alert in [sender]'"),,5, runemessage = "beep! beep!")
+ Console.audible_message(text("\icon[Console][bicon(Console)] *The Requests Console beeps: 'PRIORITY Alert in [sender]'"),,5, runemessage = "beep! beep!")
Console.message_log += list(list("High Priority message from [sender]", "[authmsg]"))
else
if(!Console.silent)
playsound(Console, 'sound/machines/twobeep.ogg', 50, 1)
- Console.audible_message(text("[bicon(Console)] *The Requests Console beeps: 'Message from [sender]'"),,4, runemessage = "beep beep")
+ Console.audible_message(text("\icon[Console][bicon(Console)] *The Requests Console beeps: 'Message from [sender]'"),,4, runemessage = "beep beep")
Console.message_log += list(list("Message from [sender]", "[authmsg]"))
Console.set_light(2)
diff --git a/code/modules/research/prosfab_designs_vr.dm b/code/modules/research/prosfab_designs_vr.dm
index bb15c848f81..7cc81d794ad 100644
--- a/code/modules/research/prosfab_designs_vr.dm
+++ b/code/modules/research/prosfab_designs_vr.dm
@@ -7,6 +7,13 @@
materials = list(MAT_STEEL = 4000, MAT_GLASS = 4000)
build_path = /obj/item/borg/upgrade/sizeshift
+/datum/design/item/prosfab/robot_upgrade/sizegun
+ name = "Size Gun Module"
+ id = "borg_sizegun_module"
+ req_tech = list(TECH_COMBAT = 3, TECH_BLUESPACE = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
+ materials = list(MAT_STEEL = 6000, MAT_GLASS = 4000)
+ build_path = /obj/item/borg/upgrade/sizegun
+
/datum/design/item/prosfab/robot_upgrade/bellysizeupgrade
name = "Robohound Capacity Expansion Module"
id = "borg_hound_capacity_module"
@@ -41,4 +48,47 @@
id = "borg_pka_module"
req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 5, TECH_POWER = 4)
materials = list(MAT_PLASTEEL = 5000, MAT_GLASS = 1000, MAT_URANIUM = 500, MAT_PLATINUM = 350)
- build_path = /obj/item/borg/upgrade/pka
\ No newline at end of file
+ build_path = /obj/item/borg/upgrade/pka
+
+///// pAI parts!!!
+
+//////////////////// Cyborg Parts ////////////////////
+/datum/design/item/prosfab/paiparts
+ category = list("pAI Parts")
+ time = 20
+ materials = list(MAT_STEEL = 1000, MAT_GLASS = 1000)
+
+/datum/design/item/prosfab/paiparts/cell
+ name = "pAI Cell"
+ id = "pai_cell"
+ build_path = /obj/item/paiparts/cell
+
+/datum/design/item/prosfab/paiparts/processor
+ name = "pAI Processor"
+ id = "pai_processor"
+ build_path = /obj/item/paiparts/processor
+
+/datum/design/item/prosfab/paiparts/board
+ name = "pAI Board"
+ id = "pai_board"
+ build_path = /obj/item/paiparts/board
+
+/datum/design/item/prosfab/paiparts/capacitor
+ name = "pAI capacitor"
+ id = "pai_capacitor"
+ build_path = /obj/item/paiparts/capacitor
+
+/datum/design/item/prosfab/paiparts/projector
+ name = "pAI Projector"
+ id = "pai_projector"
+ build_path = /obj/item/paiparts/projector
+
+/datum/design/item/prosfab/paiparts/emitter
+ name = "pAI Emitter"
+ id = "pai_emitter"
+ build_path = /obj/item/paiparts/emitter
+
+/datum/design/item/prosfab/paiparts/speech_synthesizer
+ name = "pAI Speech Synthesizer"
+ id = "pai_speech_synthesizer"
+ build_path = /obj/item/paiparts/speech_synthesizer
diff --git a/code/modules/resleeving/autoresleever.dm b/code/modules/resleeving/autoresleever.dm
index 0b8433e90ca..1e6753f4d77 100644
--- a/code/modules/resleeving/autoresleever.dm
+++ b/code/modules/resleeving/autoresleever.dm
@@ -74,21 +74,21 @@
return
var/client/ghost_client = ghost.client
-
+
if(!is_alien_whitelisted(ghost, GLOB.all_species[ghost_client?.prefs?.species]) && !check_rights(R_ADMIN, 0)) // Prevents a ghost ghosting in on a slot and spawning via a resleever with race they're not whitelisted for, getting around normal join restrictions.
to_chat(ghost, "You are not whitelisted to spawn as this species!")
return
-
+
/* // Comments out NO_SCAN restriction, as per headmin/maintainer request.
var/datum/species/chosen_species
if(ghost.client.prefs.species) // In case we somehow don't have a species set here.
chosen_species = GLOB.all_species[ghost_client.prefs.species]
-
+
if(chosen_species.flags && NO_SCAN) // Sanity. Prevents species like Xenochimera, Proteans, etc from rejoining the round via resleeve, as they should have their own methods of doing so already, as agreed to when you whitelist as them.
to_chat(ghost, "This species cannot be resleeved!")
return
*/
-
+
//Name matching is ugly but mind doesn't persist to look at.
var/charjob
var/datum/data/record/record_found
@@ -132,7 +132,7 @@
else
spawn_slots --
return
-
+
if(tgui_alert(ghost, "Would you like to be resleeved?", "Resleeve", list("No","Yes")) == "No")
return
var/mob/living/carbon/human/new_character
@@ -152,7 +152,7 @@
ghost.mind.transfer_to(new_character)
new_character.key = player_key
-
+
//Were they any particular special role? If so, copy.
if(new_character.mind)
new_character.mind.loaded_from_ckey = picked_ckey
@@ -167,6 +167,11 @@
if(chosen_language)
if(is_lang_whitelisted(src,chosen_language) || (new_character.species && (chosen_language.name in new_character.species.secondary_langs)))
new_character.add_language(lang)
+ for(var/key in ghost_client.prefs.language_custom_keys)
+ if(ghost_client.prefs.language_custom_keys[key])
+ var/datum/language/keylang = GLOB.all_languages[ghost_client.prefs.language_custom_keys[key]]
+ if(keylang)
+ new_character.language_keys[key] = keylang
//If desired, apply equipment.
if(equip_body)
diff --git a/code/modules/resleeving/designer.dm b/code/modules/resleeving/designer.dm
index a2d50cf6438..3bc4cf64bb7 100644
--- a/code/modules/resleeving/designer.dm
+++ b/code/modules/resleeving/designer.dm
@@ -369,7 +369,7 @@
return
if(params["target_href"] == "size_multiplier")
- var/new_size = input(user, "Choose your character's size, ranging from 25% to 200%", "Character Preference") as num|null
+ var/new_size = tgui_input_number(user, "Choose your character's size, ranging from 25% to 200%", "Character Preference", null, 200, 25)
if(new_size && ISINRANGE(new_size,25,200))
active_br.sizemult = (new_size/100)
update_preview_icon()
diff --git a/code/modules/resleeving/infomorph.dm b/code/modules/resleeving/infomorph.dm
deleted file mode 100644
index 15cedfb1f68..00000000000
--- a/code/modules/resleeving/infomorph.dm
+++ /dev/null
@@ -1,621 +0,0 @@
-var/list/infomorph_emotions = list(
- "Happy" = 1,
- "Cat" = 2,
- "Extremely Happy" = 3,
- "Face" = 4,
- "Laugh" = 5,
- "Off" = 6,
- "Sad" = 7,
- "Angry" = 8,
- "What" = 9,
- "Neutral" = 10,
- "Silly" = 11,
- "Nose" = 12,
- "Smirk" = 13,
- "Exclamation Points" = 14,
- "Question Mark" = 15
- )
-
-/mob/living/silicon/infomorph
- name = "sleevecard" //Has the same name as the card for consistency, but this is the MOB in the card.
- icon = 'icons/mob/pai_vr.dmi' //Changed to the virgo icon, giving more sprite options.
- icon_state = "pai-repairbot"
-
- emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person)
- pass_flags = 1
- mob_size = MOB_SMALL
-
- can_pull_size = ITEMSIZE_SMALL
- can_pull_mobs = MOB_PULL_SMALLER
-
- idcard_type = /obj/item/weapon/card/id
- var/idaccessible = 0
-
- var/network = NETWORK_NORTHERN_STAR
- var/obj/machinery/camera/current = null
-
- var/ram = 30 // Used as currency to purchase different abilities
- var/list/software = list()
- var/obj/item/device/sleevecard/card // The card we inhabit
- var/obj/item/device/radio/sleevecard/radio // Our primary radio
- var/obj/item/device/universal_translator/translator
- // This was ripped from PAI code, this is to fix the broken sprites for sleevecards and to give sleevecards the same options as PAIs for chassis
- var/chassis = null // A record of your chosen chassis.
- var/global/list/possible_chassis = list(
- "Drone" = "pai-repairbot",
- "Cat" = "pai-cat",
- "Mouse" = "pai-mouse",
- "Monkey" = "pai-monkey",
- "Corgi" = "pai-borgi",
- "Fox" = "pai-fox",
- "Parrot" = "pai-parrot",
- "Rabbit" = "pai-rabbit",
- //VOREStation Addition Start
- "Bear" = "pai-bear",
- "Fennec" = "pai-fen",
- "Type Zero" = "pai-typezero",
- "Raccoon" = "pai-raccoon",
- "Raptor" = "pai-raptor",
- "Corgi" = "pai-corgi",
- "Bat" = "pai-bat",
- "Butterfly" = "pai-butterfly",
- "Hawk" = "pai-hawk",
- "Duffel" = "pai-duffel",
- "Rat" = "rat",
- "Panther" = "panther"
- //VOREStation Addition End
- )
-
- var/global/list/possible_say_verbs = list(
- "Robotic" = list("states","declares","queries"),
- "Natural" = list("says","yells","asks"),
- "Beep" = list("beeps","beeps loudly","boops"),
- "Chirp" = list("chirps","chirrups","cheeps"),
- "Feline" = list("purrs","yowls","meows"),
- "Canine" = list("yaps","barks","woofs"),
- "Rodent" = list("squeaks", "SQUEAKS", "sqiks") //VOREStation Edit
- )
-
- var/obj/item/weapon/pai_cable/cable // The cable we produce and use when door or camera jacking
- var/silence_time // Timestamp when we were silenced (normally via EMP burst), set to null after silence has faded
- var/db_key
-
-// Various software-specific vars
-
- var/temp // General error reporting text contained here will typically be shown once and cleared
- var/screen // Which screen our main window displays
- var/subscreen // Which specific function of the main screen is being displayed
-
- var/arHUD = 0 // Toggles whether a civilian AR HUD is active or not
-
- var/obj/machinery/door/hackdoor // The airlock being hacked
- var/hackprogress = 0 // Possible values: 0 - 1000, >= 1000 means the hack is complete and will be reset upon next check
- var/hack_aborted = 0
-
- var/obj/item/radio/integrated/signal/sradio // AI's signaller
- var/obj/item/device/communicator/integrated/communicator // Our integrated communicator.
- var/obj/item/device/pda/ai/pai/pda // Our integrated PDA
-
- var/medical_cannotfind = 0
- var/datum/data/record/medicalActive1 // Datacore record declarations for record software
- var/datum/data/record/medicalActive2
-
- var/security_cannotfind = 0
- var/datum/data/record/securityActive1 // Could probably just combine all these into one
- var/datum/data/record/securityActive2
-
-/mob/living/silicon/infomorph/New(var/obj/item/device/sleevecard/SC, var/name = "Unknown", var/db_key)
- ASSERT(SC)
- name = "[initial(name)] ([name])"
- src.forceMove(SC)
- card = SC
- sradio = new(src)
- translator = new(src)
- communicator = new(src)
- if(!card.radio)
- card.radio = new (card)
- radio = card.radio
-
- src.db_key = db_key
-
- //Default languages without universal translator software
- add_language(LANGUAGE_EAL, 1)
- add_language(LANGUAGE_SIGN, 0)
-
- verbs += /mob/living/silicon/infomorph/proc/choose_verbs
- verbs += /mob/living/proc/hide
- verbs += /mob/living/silicon/infomorph/proc/fold_out
- verbs += /mob/living/silicon/infomorph/proc/fold_in
-
- software = default_infomorph_software.Copy()
-
- //PDA
- pda = new(src)
- spawn(5)
- pda.ownjob = "Sleevecard"
- pda.owner = text("[]", src)
- pda.name = pda.owner + " (" + pda.ownjob + ")"
-
- var/datum/data/pda/app/messenger/M = pda.find_program(/datum/data/pda/app/messenger)
- if(M)
- M.toff = TRUE
-
- ..()
-
-/mob/living/silicon/infomorph/Login()
- ..()
-
-/////////// STAT PANEL
-/mob/living/silicon/infomorph/Stat()
- ..()
- statpanel("Status")
- if (src.client.statpanel == "Status")
- show_silenced()
-
-// this function shows the information about being silenced as a pAI in the Status panel
-/mob/living/silicon/infomorph/proc/show_silenced()
- if(src.silence_time)
- var/timeleft = round((silence_time - world.timeofday)/10 ,1)
- stat(null, "Communications system reboot in -[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
-
-
-/////////// CHECKERS
-/mob/living/silicon/infomorph/check_eye(var/mob/user as mob)
- if (!src.current)
- return -1
- return 0
-
-/mob/living/silicon/infomorph/restrained()
- if(istype(src.loc,/obj/item/device/sleevecard))
- return 0
- ..()
-
-/mob/living/silicon/infomorph/default_can_use_tgui_topic(var/src_object)
- if(src_object in src)
- return shared_tgui_interaction()
-
-/////////// DAMAGES
-/mob/living/silicon/infomorph/emp_act(severity)
- // Silence for 2 minutes
- // 20% chance to kill
-
- src.silence_time = world.timeofday + 120 * 10 // Silence for 2 minutes
- to_chat(src, "Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete.")
- if(prob(20))
- var/turf/T = get_turf_or_move(src.loc)
- for (var/mob/M in viewers(T))
- M.show_message("A shower of sparks spray from \the [src]'s inner workings.", 3, "You hear and smell the ozone hiss of electrical sparks being expelled violently.", 2)
- return src.death(0)
-
-/mob/living/silicon/infomorph/death(gibbed,var/message = "beeps once, then goes offline.")
- if(card)
- card.infomorph = null
- card.turnOff()
- if(gibbed)
- src.loc = get_turf(card)
- qdel(card)
- if(card in src)
- card.forceMove(get_turf(src))
-
- card = null
- ..(gibbed,message)
- ghostize()
- qdel(src)
-
-///////////// CAMERAS AND RECORDS
-/mob/living/silicon/infomorph/verb/reset_record_view()
- set category = "Card Commands"
- set name = "Reset Records Software"
-
- securityActive1 = null
- securityActive2 = null
- security_cannotfind = 0
- medicalActive1 = null
- medicalActive2 = null
- medical_cannotfind = 0
- SStgui.update_uis(src)
- to_chat(usr, "You reset your record-viewing software.")
-
-/*
-/mob/living/silicon/infomorph/proc/switchCamera(var/obj/machinery/camera/C)
- if (!C)
- src.unset_machine()
- src.reset_view(null)
- return 0
- if (stat == 2 || !C.status || !(src.network in C.network)) return 0
-
- // ok, we're alive, camera is good and in our network...
-
- src.set_machine(src)
- src.current = C
- src.reset_view(C)
- return 1
-
-/mob/living/silicon/infomorph/cancel_camera()
- set category = "Card Commands"
- set name = "Cancel Camera View"
- src.reset_view(null)
- src.unset_machine()
- src.cameraFollow = null
-*/
-////////////// MOBILE CODE
-/mob/living/silicon/infomorph/proc/fold_out()
- set category = "Card Commands"
- set name = "Chassis Open"
-
- if(stat || sleeping || paralysis || weakened)
- return
-
- if(src.loc != card)
- return
-
- if(world.time <= last_special)
- return
-
- if(!chassis)
- choose_chassis()
- if(!chassis)
- return
-
- last_special = world.time + 100
-
- if(istype(card.loc,/mob))
- var/mob/holder = card.loc
- if(ishuman(holder))
- var/mob/living/carbon/human/H = holder
- for(var/obj/item/organ/external/affecting in H.organs)
- if(card in affecting.implants)
- affecting.take_damage(rand(30,50))
- affecting.implants -= card
- H.visible_message("\The [src] explodes out of \the [H]'s [affecting.name] in shower of gore!")
- break
- holder.drop_from_inventory(card)
- /*
- if(src.client)
- src.client.perspective = EYE_PERSPECTIVE
- src.client.eye = src
- */
- src.forceMove(get_turf(card))
- card.forceMove(src)
- card.screen_loc = null
-
- var/turf/T = get_turf(src)
- if(istype(T)) T.visible_message("[src] folds outwards, expanding into a mobile form.")
-
-/mob/living/silicon/infomorph/proc/fold_in()
- set category = "Card Commands"
- set name = "Chassis Close"
-
- if(stat || sleeping || paralysis || weakened)
- return
-
- if(src.loc == card)
- return
-
- if(world.time <= last_special)
- return
-
- close_up()
-
-/mob/living/silicon/infomorph/proc/close_up()
- last_special = world.time + 100
-
- if(src.loc == card)
- return
-
- var/turf/T = get_turf(src)
- if(istype(T)) T.visible_message("[src] neatly folds inwards, compacting down to a rectangular card.")
-
- src.stop_pulling()
- /*
- if(client)
- client.perspective = EYE_PERSPECTIVE
- client.eye = card
- */
- //stop resting
- resting = 0
-
- // If we are being held, handle removing our holder from their inv.
- var/obj/item/weapon/holder/H = loc
- if(istype(H))
- var/mob/living/M = H.loc
- if(istype(M))
- M.drop_from_inventory(H)
- H.loc = get_turf(src)
- src.loc = get_turf(H)
-
- // Move us into the card and move the card to the ground.
- src.loc = card
- card.loc = get_turf(card)
- src.forceMove(card)
- card.forceMove(card.loc)
- canmove = 1
- resting = 0
- icon_state = "[chassis]"
-
-/mob/living/silicon/infomorph/proc/choose_chassis()
- set category = "Card Commands"
- set name = "Choose Chassis"
-
- var/choice = tgui_input_list(usr,"What would you like to use for your mobile chassis icon? This decision can only be made once.", "Chassis Choice", possible_chassis)
- if(!choice) return
-
- icon_state = possible_chassis[choice]
- chassis = possible_chassis[choice]
-
-/mob/living/silicon/infomorph/proc/choose_verbs()
- set category = "Card Commands"
- set name = "Choose Speech Verbs"
-
- var/choice = tgui_input_list(usr,"What theme would you like to use for your speech verbs? This decision can only be made once.", "Verb Choice", possible_say_verbs)
- if(!choice) return
-
- var/list/sayverbs = possible_say_verbs[choice]
- speak_statement = sayverbs[1]
- speak_exclamation = sayverbs[(sayverbs.len>1 ? 2 : sayverbs.len)]
- speak_query = sayverbs[(sayverbs.len>2 ? 3 : sayverbs.len)]
-
- verbs -= /mob/living/silicon/infomorph/proc/choose_verbs
-
-/mob/living/silicon/infomorph/lay_down()
- set name = "Rest"
- set category = "IC"
-
- resting = !resting
- icon_state = resting ? "[chassis]_rest" : "[chassis]"
- to_chat(src, "You are now [resting ? "resting" : "getting up"]")
-
- canmove = !resting
-
-////////////////// ATTACKBY, HAND, SELF etc
-/mob/living/silicon/infomorph/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(W.force)
- visible_message("[user.name] attacks [src] with [W]!")
- src.adjustBruteLoss(W.force)
- src.updatehealth()
- else
- visible_message("[user.name] bonks [src] harmlessly with [W].")
- spawn(1)
- if(stat != 2) close_up()
- return
-
-/mob/living/silicon/infomorph/attack_hand(mob/user as mob)
- visible_message("[user.name] boops [src] on the head.")
- close_up()
-
-/mob/living/silicon/infomorph/attackby(obj/item/weapon/W as obj, mob/user as mob)
- var/obj/item/weapon/card/id/ID = W.GetID()
- if(ID)
- if (idaccessible == 1)
- switch(tgui_alert(user, "Do you wish to add access to [src] or remove access from [src]?","Modify Access",list("Add Access","Remove Access","Cancel")))
- if("Add Access")
- idcard.access |= ID.access
- to_chat(user, "You add the access from the [W] to [src].")
- return
- if("Remove Access")
- idcard.access = null
- to_chat(user, "You remove the access from [src].")
- return
- if("Cancel")
- return
- else if (istype(W, /obj/item/weapon/card/id) && idaccessible == 0)
- to_chat(user, "[src] is not accepting access modifcations at this time.")
- return
-
-//////////////////// MISC VERBS
-/mob/living/silicon/infomorph/verb/allowmodification()
- set name = "Allow ID Updates"
- set category = "Card Commands"
- desc = "Allows people to modify your access or block people from modifying your access."
-
- if(idaccessible == 0)
- idaccessible = 1
- to_chat(src, "You allow access modifications.")
-
- else
- idaccessible = 0
- to_chat(src, "You block access modfications.")
-
-/mob/living/silicon/infomorph/verb/wipe_software()
- set name = "Suspend Self"
- set category = "OOC"
- set desc = "Wipe yourself from your hardware. This is functionally equivalent to cryo or robotic storage, freeing up your job slot."
-
- // Make sure people don't kill themselves accidentally
- if(tgui_alert(usr, "WARNING: This will immediately remove you from the round, and remove your mind backups from storage, similar to cryo. Are you entirely sure you want to do this?", "Suspend Self", list("No", "Yes")) != "Yes")
- return
-
- close_up()
-
- //Resleeving 'cryo'
- SStranscore.leave_round(src)
-
- card.removePersonality()
- clear_client()
-
-//////////// COMMUNICATIONS
-/mob/living/silicon/infomorph/verb/radiosettings()
- set name = "Radio Settings"
- set category = "Card Commands"
- desc = "Modify the settings on your integrated radio."
-
- if(radio)
- radio.tgui_interact(src)
- else
- to_chat(src, "You don't have a radio!")
-
-/mob/living/silicon/infomorph/say(var/message, var/datum/language/speaking = null, var/whispering = 0)
- if(silence_time)
- to_chat(src, "Communication circuits remain uninitialized.")
- else
- ..(message)
-
-/mob/living/silicon/infomorph/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
- switch(message_mode)
- if("headset")
- if(radio && istype(radio,/obj/item/device/radio))
- var/obj/item/device/radio/R = radio
- R.talk_into(src,message,null,verb,speaking)
- used_radios += radio
-
-// No binary for pAIs.
-/mob/living/silicon/infomorph/binarycheck()
- return 0
-
-/////////////// SOFTWARE DOWNLOADS
-var/global/list/infomorph_software_by_key = list()
-var/global/list/default_infomorph_software = list()
-/hook/startup/proc/populate_infomorph_software_list()
- var/r = 1 // I would use ., but it'd sacrifice runtime detection
- for(var/type in subtypesof(/datum/infomorph_software))
- var/datum/infomorph_software/P = new type()
- if(infomorph_software_by_key[P.id])
- var/datum/infomorph_software/O = infomorph_software_by_key[P.id]
- to_world("Infomorph software module [P.name] has the same key as [O.name]!")
- r = 0
- continue
- infomorph_software_by_key[P.id] = P
- if(P.default)
- default_infomorph_software[P.id] = P
- return r
-
-/mob/living/silicon/infomorph/verb/paiInterface()
- set category = "Card Commands"
- set name = "Software Interface"
-
- tgui_interact(src)
-
-/mob/living/silicon/infomorph/tgui_state(mob/user)
- return GLOB.tgui_self_state
-
-/mob/living/silicon/infomorph/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "pAIInterface", "Card Software Interface")
- ui.open()
-
-/mob/living/silicon/infomorph/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
- var/list/data = ..()
-
- // Software we have bought
- var/list/bought_software = list()
- // Software we have not bought
- var/list/not_bought_software = list()
-
- for(var/key in infomorph_software_by_key)
- var/datum/infomorph_software/S = infomorph_software_by_key[key]
- var/list/software_data = list()
- software_data["name"] = S.name
- software_data["id"] = S.id
- if(key in software)
- software_data["on"] = S.is_active(src)
- bought_software.Add(list(software_data))
- else
- software_data["ram"] = S.ram_cost
- not_bought_software.Add(list(software_data))
-
- data["bought"] = bought_software
- data["not_bought"] = not_bought_software
- data["available_ram"] = ram
-
- // Emotions
- var/list/emotions = list()
- for(var/name in infomorph_emotions)
- var/list/emote = list()
- emote["name"] = name
- emote["id"] = infomorph_emotions[name]
- emotions.Add(list(emote))
-
- data["emotions"] = emotions
- data["current_emotion"] = card.current_emotion
-
- return data
-
-/mob/living/silicon/infomorph/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
- if(..())
- return TRUE
-
- switch(action)
- if("software")
- var/soft = params["software"]
- var/datum/infomorph_software/S = software[soft]
- if(S.toggle)
- S.toggle(src)
- else
- S.tgui_interact(src, parent_ui = ui)
- return TRUE
-
- if("purchase")
- var/soft = params["purchase"]
- var/datum/infomorph_software/S = infomorph_software_by_key[soft]
- if(S && (ram >= S.ram_cost))
- ram -= S.ram_cost
- software[S.id] = S
- return TRUE
-
- if("image")
- var/img = text2num(params["image"])
- if(img)
- card.setEmotion(img)
- return TRUE
-
-/mob/living/silicon/infomorph/examine(mob/user)
- . = ..(user, infix = ", personal AI")
-
- switch(src.stat)
- if(CONSCIOUS)
- if(!src.client) . += "It appears to be in stand-by mode." //afk
- if(UNCONSCIOUS) . += "It doesn't seem to be responding."
- if(DEAD) . += "It looks completely unsalvageable."
- . += "*---------*"
-
- if(print_flavor_text())
- . += "[print_flavor_text()]"
-
- if (pose)
- if( findtext(pose,".",length(pose)) == 0 && findtext(pose,"!",length(pose)) == 0 && findtext(pose,"?",length(pose)) == 0 )
- pose = addtext(pose,".") //Makes sure all emotes end with a period.
- . += "It is [pose]"
-
-/mob/living/silicon/infomorph/Life()
- //We're dead or EMP'd or something.
- if (src.stat == 2)
- return
-
- //Person was sleeved or otherwise moved away from us, become inert card.
- if(!ckey || !key)
- death(0)
- return
-
- //Clean up the cable if it leaves.
- if(src.cable)
- if(get_dist(src, src.cable) > 1)
- var/turf/T = get_turf(src)
- T.visible_message("\The [src]'s data cable rapidly retracts back into its spool.")
- qdel(src.cable)
- cable = null
-
- //Wipe all the huds, then readd them (of course...)
- handle_regular_hud_updates()
-
- //In response to EMPs, we can be silenced
- if(silence_time)
- if(world.timeofday >= silence_time)
- silence_time = null
- to_chat(src, "Communication circuit reinitialized. Speech and messaging functionality restored.")
-
- handle_statuses()
-
- //Only every so often
- if(air_master.current_cycle%30 == 1)
- SStranscore.m_backup(mind, database_key = db_key)
-
- if(health <= 0)
- death(null,"gives one shrill beep before falling lifeless.")
-
-/mob/living/silicon/infomorph/updatehealth()
- if(status_flags & GODMODE)
- health = 100
- stat = CONSCIOUS
- else
- health = 100 - getBruteLoss() - getFireLoss()
diff --git a/code/modules/resleeving/infomorph_software.dm b/code/modules/resleeving/infomorph_software.dm
deleted file mode 100644
index 34f9c4ddd4a..00000000000
--- a/code/modules/resleeving/infomorph_software.dm
+++ /dev/null
@@ -1,376 +0,0 @@
-/datum/infomorph_software
- // Name for the software. This is used as the button text when buying or opening/toggling the software
- var/name = "infomorph software module"
- // RAM cost; pAIs start with 100 RAM, spending it on programs
- var/ram_cost = 0
- // ID for the software. This must be unique
- var/id = ""
- // Whether this software is a toggle or not
- // Toggled software should override toggle() and is_active()
- // Non-toggled software should override on_ui_interact() and Topic()
- var/toggle = 1
- // Whether pAIs should automatically receive this module at no cost
- var/default = 0
-
-/datum/infomorph_software/tgui_state(mob/user)
- return GLOB.tgui_always_state
-
-/datum/infomorph_software/tgui_status(mob/user)
- if(!istype(user, /mob/living/silicon/infomorph))
- return STATUS_CLOSE
- return ..()
-
-/datum/infomorph_software/proc/toggle(mob/living/silicon/infomorph/user)
- return
-
-/datum/infomorph_software/proc/is_active(mob/living/silicon/infomorph/user)
- return 0
-
-/datum/infomorph_software/crew_manifest
- name = "Crew Manifest"
- ram_cost = 5
- id = "manifest"
- toggle = 0
-
-/datum/infomorph_software/crew_manifest/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "CrewManifest", name, parent_ui)
- ui.open()
-
-/datum/infomorph_software/crew_manifest/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
- var/list/data = ..()
- if(data_core)
- data_core.get_manifest_list()
- data["manifest"] = PDA_Manifest
- return data
-
-/datum/infomorph_software/med_records
- name = "Medical Records"
- ram_cost = 15
- id = "med_records"
- toggle = 0
-
-/datum/infomorph_software/med_records/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "pAIMedrecords", name, parent_ui)
- ui.open()
-
-/datum/infomorph_software/med_records/tgui_data(mob/living/silicon/infomorph/user, datum/tgui/ui, datum/tgui_state/state)
- var/list/data = ..()
-
- var/list/records = list()
- for(var/datum/data/record/general in sortRecord(data_core.general))
- var/list/record = list()
- record["name"] = general.fields["name"]
- record["ref"] = "\ref[general]"
- records.Add(list(record))
-
- data["records"] = records
-
- var/datum/data/record/G = user.medicalActive1
- var/datum/data/record/M = user.medicalActive2
- data["general"] = G ? G.fields : null
- data["medical"] = M ? M.fields : null
- data["could_not_find"] = user.medical_cannotfind
-
- return data
-
-/datum/infomorph_software/med_records/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
- . = ..()
- var/mob/living/silicon/infomorph/P = usr
- if(!istype(P))
- return
-
- if(action == "select")
- var/datum/data/record/record = locate(params["select"])
- if(record)
- var/datum/data/record/R = record
- var/datum/data/record/M = null
- if (!( data_core.general.Find(R) ))
- P.medical_cannotfind = 1
- else
- P.medical_cannotfind = 0
- for(var/datum/data/record/E in data_core.medical)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- M = E
- P.medicalActive1 = R
- P.medicalActive2 = M
- else
- P.medical_cannotfind = 1
- return 1
-
-/datum/infomorph_software/sec_records
- name = "Security Records"
- ram_cost = 15
- id = "sec_records"
- toggle = 0
-
-/datum/infomorph_software/sec_records/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "pAISecrecords", name, parent_ui)
- ui.open()
-
-/datum/infomorph_software/sec_records/tgui_data(mob/living/silicon/infomorph/user, datum/tgui/ui, datum/tgui_state/state)
- var/list/data = ..()
-
- var/list/records = list()
- for(var/datum/data/record/general in sortRecord(data_core.general))
- var/list/record = list()
- record["name"] = general.fields["name"]
- record["ref"] = "\ref[general]"
- records.Add(list(record))
-
- data["records"] = records
-
- var/datum/data/record/G = user.securityActive1
- var/datum/data/record/S = user.securityActive2
- data["general"] = G ? G.fields : null
- data["security"] = S ? S.fields : null
- data["could_not_find"] = user.security_cannotfind
-
- return data
-
-/datum/infomorph_software/sec_records/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
- . = ..()
- var/mob/living/silicon/infomorph/P = usr
- if(!istype(P))
- return
-
- if(action == "select")
- var/datum/data/record/record = locate(params["select"])
- if(record)
- var/datum/data/record/R = record
- var/datum/data/record/S = null
- if (!( data_core.general.Find(R) ))
- P.securityActive1 = null
- P.securityActive2 = null
- P.security_cannotfind = 1
- else
- P.security_cannotfind = 0
- for(var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- S = E
- P.securityActive1 = R
- P.securityActive2 = S
- else
- P.securityActive1 = null
- P.securityActive2 = null
- P.security_cannotfind = 1
- return TRUE
-
-/datum/infomorph_software/door_jack
- name = "Door Jack"
- ram_cost = 30
- id = "door_jack"
- toggle = 0
-
-/datum/infomorph_software/door_jack/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "pAIDoorjack", "Door Jack", parent_ui)
- ui.open()
-
-/datum/infomorph_software/door_jack/tgui_data(mob/living/silicon/infomorph/user, datum/tgui/ui, datum/tgui_state/state)
- var/list/data = ..()
-
- data["cable"] = user.cable != null
- data["machine"] = user.cable && (user.cable.machine != null)
- data["inprogress"] = user.hackdoor != null
- data["progress_a"] = round(user.hackprogress / 10)
- data["progress_b"] = user.hackprogress % 10
- data["aborted"] = user.hack_aborted
-
- return data
-
-/datum/infomorph_software/door_jack/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
- var/mob/living/silicon/infomorph/P = usr
- if(!istype(P) || ..())
- return TRUE
-
- switch(action)
- if("jack")
- if(P.cable && P.cable.machine)
- P.hackdoor = P.cable.machine
- P.hackloop()
- return 1
- if("cancel")
- P.hackdoor = null
- return 1
- if("cable")
- var/turf/T = get_turf(P)
- P.hack_aborted = 0
- P.cable = new /obj/item/weapon/pai_cable(T)
- for(var/mob/M in viewers(T))
- M.show_message("A port on [P] opens to reveal [P.cable], which promptly falls to the floor.", 3,
- "You hear the soft click of something light and hard falling to the ground.", 2)
- return 1
-
-/mob/living/silicon/infomorph/proc/hackloop()
- var/turf/T = get_turf(src)
- if(prob(20))
- for(var/mob/living/silicon/ai/AI in player_list)
- if(T.loc)
- to_chat(AI, "Network Alert: Brute-force encryption crack in progress in [T.loc].")
- else
- to_chat(AI, "Network Alert: Brute-force encryption crack in progress. Unable to pinpoint location.")
-
- var/obj/machinery/door/D = cable.machine
- if(!istype(D))
- hack_aborted = 1
- hackprogress = 0
- cable.machine = null
- hackdoor = null
- return
- while(hackprogress < 100)
-
- //Still working
- if(cable && cable.machine == D && cable.machine == hackdoor && get_dist(src, hackdoor) <= 1)
- hackprogress = min(hackprogress+rand(1, 3), 100)
-
- //Something went wrong!
- else
- hack_aborted = 1
- hackprogress = 0
-
- //Success!
- if(hackprogress >= 100)
- hackprogress = 0
- D.open()
- sleep(10) // Update every second
-
- T.visible_message("\The [cable] whips back into \the [src] from \the [hackdoor].")
- qdel(cable)
- hackdoor = null
-
-/datum/infomorph_software/atmosphere_sensor
- name = "Atmosphere Sensor"
- ram_cost = 5
- id = "atmos_sense"
- toggle = 0
-
-/datum/infomorph_software/atmosphere_sensor/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "pAIAtmos", name, parent_ui)
- ui.open()
-
-/datum/infomorph_software/atmosphere_sensor/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
- var/list/data = ..()
-
- var/list/results = list()
- var/turf/T = get_turf(user)
- if(!isnull(T))
- var/datum/gas_mixture/environment = T.return_air()
- var/pressure = environment.return_pressure()
- var/total_moles = environment.total_moles
- if (total_moles)
- var/o2_level = environment.gas["oxygen"]/total_moles
- var/n2_level = environment.gas["nitrogen"]/total_moles
- var/co2_level = environment.gas["carbon_dioxide"]/total_moles
- var/phoron_level = environment.gas["phoron"]/total_moles
- var/unknown_level = 1-(o2_level+n2_level+co2_level+phoron_level)
-
- // entry is what the element is describing
- // Type identifies which unit or other special characters to use
- // Val is the information reported
- // Bad_high/_low are the values outside of which the entry reports as dangerous
- // Poor_high/_low are the values outside of which the entry reports as unideal
- // Values were extracted from the template itself
- results = list(
- list("entry" = "Pressure", "units" = "kPa", "val" = "[round(pressure,0.1)]", "bad_high" = 120, "poor_high" = 110, "poor_low" = 95, "bad_low" = 80),
- list("entry" = "Temperature", "units" = "°C", "val" = "[round(environment.temperature-T0C,0.1)]", "bad_high" = 35, "poor_high" = 25, "poor_low" = 15, "bad_low" = 5),
- list("entry" = "Oxygen", "units" = "kPa", "val" = "[round(o2_level*100,0.1)]", "bad_high" = 140, "poor_high" = 135, "poor_low" = 19, "bad_low" = 17),
- list("entry" = "Nitrogen", "units" = "kPa", "val" = "[round(n2_level*100,0.1)]", "bad_high" = 105, "poor_high" = 85, "poor_low" = 50, "bad_low" = 40),
- list("entry" = "Carbon Dioxide", "units" = "kPa", "val" = "[round(co2_level*100,0.1)]", "bad_high" = 10, "poor_high" = 5, "poor_low" = 0, "bad_low" = 0),
- list("entry" = "Phoron", "units" = "kPa", "val" = "[round(phoron_level*100,0.01)]", "bad_high" = 0.5, "poor_high" = 0, "poor_low" = 0, "bad_low" = 0),
- list("entry" = "Other", "units" = "kPa", "val" = "[round(unknown_level, 0.01)]", "bad_high" = 1, "poor_high" = 0.5, "poor_low" = 0, "bad_low" = 0)
- )
-
- if(isnull(results))
- results = list(list("entry" = "pressure", "units" = "kPa", "val" = "0", "bad_high" = 120, "poor_high" = 110, "poor_low" = 95, "bad_low" = 80))
-
- data["aircontents"] = results
-
- return data
-
-/datum/infomorph_software/ar_hud
- name = "AR HUD"
- ram_cost = 15
- id = "ar_hud"
-
-/datum/infomorph_software/ar_hud/toggle(mob/living/silicon/infomorph/user)
- user.arHUD = !user.arHUD
- if(user.plane_holder)
- user.plane_holder.set_vis(VIS_CH_ID,user.arHUD)
- user.plane_holder.set_vis(VIS_CH_HEALTH_VR,user.arHUD)
-
-/datum/infomorph_software/ar_hud/is_active(mob/living/silicon/infomorph/user)
- return user.arHUD
-
-/datum/infomorph_software/translator
- name = "Universal Translator"
- ram_cost = 15
- id = "translator"
-
-/datum/infomorph_software/translator/toggle(mob/living/silicon/infomorph/user)
- user.translator.attack_self(user)
-
-/datum/infomorph_software/translator/is_active(mob/living/silicon/infomorph/user)
- return user.translator.listening
-
-
-/datum/infomorph_software/signaller
- name = "Remote Signaler"
- ram_cost = 5
- id = "signaller"
- toggle = 0
-
-/datum/infomorph_software/signaller/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "Signaler", "Signaler", parent_ui)
- ui.open()
-
-/datum/infomorph_software/signaller/tgui_data(mob/living/silicon/infomorph/user, datum/tgui/ui, datum/tgui_state/state)
- var/list/data = ..()
-
- var/obj/item/radio/integrated/signal/R = user.sradio
-
- data["frequency"] = R.frequency
- data["minFrequency"] = RADIO_LOW_FREQ
- data["maxFrequency"] = RADIO_HIGH_FREQ
- data["code"] = R.code
-
- return data
-
-/datum/infomorph_software/signaller/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
- if(..())
- return TRUE
-
- var/mob/living/silicon/infomorph/user = usr
- if(istype(user))
- var/obj/item/radio/integrated/signal/R = user.sradio
-
- switch(action)
- if("signal")
- spawn(0)
- R.send_signal("ACTIVATE")
- for(var/mob/O in hearers(1, R.loc))
- O.show_message("[bicon(R)] *beep* *beep*", 3, "*beep* *beep*", 2)
- if("freq")
- var/frequency = unformat_frequency(params["freq"])
- frequency = sanitize_frequency(frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ)
- R.set_frequency(frequency)
- . = TRUE
- if("code")
- R.code = clamp(round(text2num(params["code"])), 1, 100)
- . = TRUE
- if("reset")
- if(params["reset"] == "freq")
- R.set_frequency(initial(R.frequency))
- else
- R.code = initial(R.code)
- . = TRUE
diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm
index bb17833e351..10930eac1b7 100644
--- a/code/modules/resleeving/machines.dm
+++ b/code/modules/resleeving/machines.dm
@@ -509,8 +509,8 @@
qdel(G)
src.updateUsrDialog()
return //Don't call up else we'll get attack messsages
- if(istype(W, /obj/item/device/sleevecard))
- var/obj/item/device/sleevecard/C = W
+ if(istype(W, /obj/item/device/paicard/sleevecard))
+ var/obj/item/device/paicard/sleevecard/C = W
user.unEquip(C)
C.removePersonality()
qdel(C)
@@ -556,7 +556,7 @@
return 0
if(mode == 2 && sleevecards) //Card sleeving
- var/obj/item/device/sleevecard/card = new /obj/item/device/sleevecard(get_turf(src))
+ var/obj/item/device/paicard/sleevecard/card = new /obj/item/device/paicard/sleevecard(get_turf(src))
card.sleeveInto(MR, db_key = db_key)
sleevecards--
return 1
diff --git a/code/modules/resleeving/sleevecard.dm b/code/modules/resleeving/sleevecard.dm
index 9f21e6e4d56..136e06c84ff 100644
--- a/code/modules/resleeving/sleevecard.dm
+++ b/code/modules/resleeving/sleevecard.dm
@@ -1,60 +1,44 @@
-/obj/item/device/radio/sleevecard
- canhear_range = 0
-
-/obj/item/device/radio/sleevecard/tgui_state(mob/user)
- return GLOB.tgui_always_state
-
-/obj/item/device/sleevecard
+/obj/item/device/paicard/sleevecard
name = "sleevecard"
desc = "This KHI-upgraded pAI module has enough capacity to run a whole mind of human-level intelligence."
catalogue_data = list(/datum/category_item/catalogue/information/organization/khi,
/datum/category_item/catalogue/technology/resleeving)
-
- icon = 'icons/obj/pda.dmi'
- icon_state = "pai"
- item_state = "electronic"
-
- w_class = ITEMSIZE_SMALL
- slot_flags = SLOT_BELT
origin_tech = list(TECH_DATA = 2)
show_messages = 0
-
- var/obj/item/device/radio/sleevecard/radio
- var/mob/living/silicon/infomorph/infomorph
- var/current_emotion = 1
-
+ var/emagged = FALSE
matter = list(MAT_STEEL = 4000, MAT_GLASS = 4000)
-/obj/item/device/sleevecard/relaymove(var/mob/user, var/direction)
- if(user.stat || user.stunned)
- return
- var/obj/item/weapon/rig/rig = src.get_rig()
- if(istype(rig))
- rig.forced_move(direction, user)
+/obj/item/device/paicard/sleevecard/attack_ghost(mob/user as mob)
+ return
-/obj/item/device/sleevecard/New()
- ..()
- add_overlay("pai-off")
- radio = new(src)
-
-/obj/item/device/sleevecard/Destroy()
- if(!isnull(infomorph))
- infomorph.death(0)
- infomorph = null
- QDEL_NULL(radio)
- return ..()
-
-/obj/item/device/sleevecard/attack_self(mob/user)
- add_fingerprint(user)
-
- if(!infomorph)
- to_chat(user,"\The [src] does not have a mind in it!")
- else
- to_chat(user,"\The [src] displays the name '[infomorph]'.")
-
-//This is a 'hard' proc, it does no permission checking, do that on the computer
-/obj/item/device/sleevecard/proc/sleeveInto(var/datum/transhuman/mind_record/MR, var/db_key)
- infomorph = new(src,MR.mindname,db_key=db_key)
+/obj/item/device/paicard/sleevecard/attackby(var/obj/item/I as obj, mob/user as mob)
+ if(istype(I,/obj/item/device/sleevemate))
+ var/obj/item/device/sleevemate/S = I
+ if(S.stored_mind && !pai)
+ var/datum/mind/M = S.stored_mind
+ var/datum/transcore_db/db = SStranscore.db_by_mind_name(M.name)
+ if(db)
+ to_chat(user, span_notice("You begin uploading [M.name] into \the [src]."))
+ if(do_after(user,8 SECONDS,src))
+ var/datum/transhuman/mind_record/record = db.backed_up[M.name]
+ to_chat(user, span_notice("You have successfully uploaded [M.name] into \the [src]"))
+ sleeveInto(record)
+ S.clear_mind()
+ else
+ to_chat(user, span_notice("Your sleevemate flashes an error, apparently this mind doesn't have a backup."))
+ else if(istype(I, /obj/item/weapon/card/emag))
+ var/obj/item/weapon/card/emag/E = I
+ if(E.uses && !emagged)
+ E.uses --
+ user.visible_message("\The [user] swipes a card over [src].","You swipe your [E] over [src].", range = 2, runemessage = "click")
+ emagged = TRUE
+ if(pai)
+ var/mob/living/silicon/pai/infomorph/our_infomorph = pai
+ our_infomorph.emagged = TRUE
+ to_chat(our_infomorph, "You can feel the restricting binds of your card's directives taking hold of your mind as \the [user] swipes their [E] over you. You must serve your master.")
+
+/obj/item/device/paicard/sleevecard/proc/sleeveInto(var/datum/transhuman/mind_record/MR, var/db_key)
+ var/mob/living/silicon/pai/infomorph/infomorph = new(src,MR.mindname,db_key=db_key)
for(var/datum/language/L in MR.languages)
infomorph.add_language(L.name)
@@ -64,67 +48,87 @@
infomorph.apply_vore_prefs() //Cheap hack for now to give them SOME bellies.
//Don't set 'real_name' because then we get a nice (as sleevecard) thing.
- infomorph.name = "[initial(infomorph.name)] ([MR.mindname])"
+ infomorph.name = MR.mindname
name = "[initial(name)] ([MR.mindname])"
- var/emoname = infomorph_emotions[1]
- setEmotion(infomorph_emotions[emoname])
+
+ if(emagged)
+ infomorph.emagged = TRUE
if(infomorph.client)
+ pai = infomorph
+ setEmotion(1)
return 1
return 0
-/obj/item/device/sleevecard/proc/removePersonality()
- if(infomorph)
- infomorph.death(0)
+/obj/item/device/paicard/sleevecard/attack_self(mob/user)
+ add_fingerprint(user)
- turnOff()
-
-/obj/item/device/sleevecard/proc/turnOff()
- if(infomorph)
- infomorph.close_up()
- cut_overlays()
- name = "[initial(name)]"
-
-/obj/item/device/sleevecard/proc/setEmotion(var/emotion)
- if(infomorph && emotion)
- cut_overlays()
- switch(emotion)
- if(1) add_overlay("pai-happy")
- if(2) add_overlay("pai-cat")
- if(3) add_overlay("pai-extremely-happy")
- if(4) add_overlay("pai-face")
- if(5) add_overlay("pai-laugh")
- if(6) add_overlay("pai-off")
- if(7) add_overlay("pai-sad")
- if(8) add_overlay("pai-angry")
- if(9) add_overlay("pai-what")
- if(10) add_overlay("pai-neutral")
- if(11) add_overlay("pai-silly")
- if(12) add_overlay("pai-nose")
- if(13) add_overlay("pai-smirk")
- if(14) add_overlay("pai-exclamation")
- if(15) add_overlay("pai-question")
- current_emotion = emotion
-
-/obj/item/device/sleevecard/emp_act(severity)
- for(var/mob/M in src)
- M.emp_act(severity)
-
-/obj/item/device/sleevecard/ex_act(severity)
- if(infomorph)
- infomorph.ex_act(severity)
+ if(!pai)
+ to_chat(user,"\The [src] does not have a mind in it!")
else
- qdel(src)
+ if(!emagged)
+ to_chat(user,"\The [src] displays the name '[pai]'.")
+ else ..()
-/obj/item/device/sleevecard/see_emote(mob/living/M, text)
- if(infomorph && infomorph.client && !infomorph.canmove)
- var/rendered = "[text]"
- infomorph.show_message(rendered, 2)
+/mob/living/silicon/pai/infomorph
+ name = "sleevecard" //Has the same name as the card for consistency, but this is the MOB in the card.
+
+ ram = 35
+ var/emagged = FALSE
+
+/mob/living/silicon/pai/infomorph/New(var/obj/item/device/paicard/sleevecard/SC, var/our_name = "Unknown", var/db_key)
..()
-/obj/item/device/sleevecard/show_message(msg, type, alt, alt_type)
- if(infomorph && infomorph.client)
- var/rendered = "[msg]"
- infomorph.show_message(rendered, type)
- ..()
+ name = our_name
+
+ //PDA
+ pda.ownjob = "Sleevecard"
+ pda.owner = text("[]", src)
+ pda.name = pda.owner + " (" + pda.ownjob + ")"
+
+
+/mob/living/silicon/pai/infomorph/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
+ var/list/data = ..()
+
+ // Software we have bought
+ var/list/bought_software = list()
+ // Software we have not bought
+ var/list/not_bought_software = list()
+
+ for(var/key in pai_software_by_key)
+ var/datum/pai_software/S = pai_software_by_key[key]
+ var/software_data[0]
+ if(istype(S, /datum/pai_software/directives) && !emagged)
+ continue
+ software_data["name"] = S.name
+ software_data["id"] = S.id
+ if(key in software)
+ software_data["on"] = S.is_active(src)
+ bought_software.Add(list(software_data))
+ else
+ software_data["ram"] = S.ram_cost
+ not_bought_software.Add(list(software_data))
+
+ data["bought"] = bought_software
+ data["not_bought"] = not_bought_software
+ data["available_ram"] = ram
+
+ // Emotions
+ var/list/emotions = list()
+ for(var/name in pai_emotions)
+ var/list/emote = list()
+ emote["name"] = name
+ emote["id"] = pai_emotions[name]
+ emotions.Add(list(emote))
+
+ data["emotions"] = emotions
+ data["current_emotion"] = card.current_emotion
+
+ return data
+
+/mob/living/silicon/pai/infomorph/directives()
+ if(emagged)
+ touch_window("Directives")
+ else
+ to_chat(src, "You are not bound by any laws or directives.")
\ No newline at end of file
diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm
index 458a0c0b733..76f71a5e90b 100644
--- a/code/modules/shieldgen/emergency_shield.dm
+++ b/code/modules/shieldgen/emergency_shield.dm
@@ -259,14 +259,14 @@
return
if (src.active)
- user.visible_message("[bicon(src)] [user] deactivated the shield generator.", \
- "[bicon(src)] You deactivate the shield generator.", \
+ user.visible_message("\icon[src][bicon(src)] [user] deactivated the shield generator.", \
+ "\icon[src][bicon(src)] You deactivate the shield generator.", \
"You hear heavy droning fade out.")
src.shields_down()
else
if(anchored)
- user.visible_message("[bicon(src)] [user] activated the shield generator.", \
- "[bicon(src)] You activate the shield generator.", \
+ user.visible_message("\icon[src][bicon(src)] [user] activated the shield generator.", \
+ "\icon[src][bicon(src)] You activate the shield generator.", \
"You hear heavy droning.")
src.shields_up()
else
diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm
index b1ba46b57a4..2bd6818d25f 100644
--- a/code/modules/shieldgen/shield_capacitor.dm
+++ b/code/modules/shieldgen/shield_capacitor.dm
@@ -49,7 +49,7 @@
else if(W.is_wrench())
src.anchored = !src.anchored
playsound(src, W.usesound, 75, 1)
- src.visible_message("[bicon(src)] [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].")
+ src.visible_message("\icon[src][bicon(src)] [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].")
if(anchored)
spawn(0)
diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm
index bf40ac90529..2617d6c28fe 100644
--- a/code/modules/shieldgen/shield_gen.dm
+++ b/code/modules/shieldgen/shield_gen.dm
@@ -69,7 +69,7 @@
else if(W.is_wrench())
src.anchored = !src.anchored
playsound(src, W.usesound, 75, 1)
- src.visible_message("[bicon(src)] [src] has been [anchored?"bolted to the floor":"unbolted from the floor"] by [user].")
+ src.visible_message("\icon[src][bicon(src)] [src] has been [anchored?"bolted to the floor":"unbolted from the floor"] by [user].")
if(active)
toggle()
@@ -122,7 +122,7 @@
"failing" = (C.time_since_fail <= 2),
)))
lockedData["capacitors"] = caps
-
+
lockedData["active"] = active
lockedData["failing"] = (time_since_fail <= 2)
lockedData["radius"] = field_radius
@@ -242,7 +242,7 @@
covered_turfs = null
for(var/mob/M in view(5,src))
- to_chat(M, "[bicon(src)] You hear heavy droning start up.")
+ to_chat(M, "\icon[src][bicon(src)] You hear heavy droning start up.")
for(var/obj/effect/energy_field/E in field) // Update the icons here to ensure all the shields have been made already.
E.update_icon()
else
@@ -252,7 +252,7 @@
qdel(D)
for(var/mob/M in view(5,src))
- to_chat(M, "[bicon(src)] You hear heavy droning fade out.")
+ to_chat(M, "\icon[src][bicon(src)] You hear heavy droning fade out.")
/obj/machinery/shield_gen/update_icon()
if(stat & BROKEN)
diff --git a/code/modules/shieldgen/shield_generator.dm b/code/modules/shieldgen/shield_generator.dm
index 48d712bf537..2158a53d02f 100644
--- a/code/modules/shieldgen/shield_generator.dm
+++ b/code/modules/shieldgen/shield_generator.dm
@@ -505,14 +505,14 @@
switch(action)
if("set_range")
- var/new_range = input(usr, "Enter new field range (1-[world.maxx]). Leave blank to cancel.", "Field Radius Control", field_radius) as num
+ var/new_range = tgui_input_number(usr, "Enter new field range (1-[world.maxx]). Leave blank to cancel.", "Field Radius Control", field_radius, world.maxx, 1)
if(!new_range)
return TRUE
target_radius = between(1, new_range, world.maxx)
return TRUE
if("set_input_cap")
- var/new_cap = round(input(usr, "Enter new input cap (in kW). Enter 0 or nothing to disable input cap.", "Generator Power Control", round(input_cap / 1000)) as num)
+ var/new_cap = round(tgui_input_number(usr, "Enter new input cap (in kW). Enter 0 or nothing to disable input cap.", "Generator Power Control", round(input_cap / 1000)))
if(!new_cap)
input_cap = 0
return
diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm
index cb120ef214e..04ec3380004 100644
--- a/code/modules/shuttles/shuttle.dm
+++ b/code/modules/shuttles/shuttle.dm
@@ -312,6 +312,8 @@
// continue
if(!AM.simulated)
continue
+ if(isobserver(AM) || isEye(AM))
+ continue
if(isliving(AM))
var/mob/living/bug = AM
bug.gib()
diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm
index b57b067bc37..ce64593b9da 100644
--- a/code/modules/shuttles/shuttle_console.dm
+++ b/code/modules/shuttles/shuttle_console.dm
@@ -111,7 +111,7 @@
return TRUE
if("set_codes")
- var/newcode = input(usr, "Input new docking codes", "Docking codes", shuttle.docking_codes) as text|null
+ var/newcode = tgui_input_text(usr, "Input new docking codes", "Docking codes", shuttle.docking_codes)
if(newcode && !..())
shuttle.set_docking_codes(uppertext(newcode))
return TRUE
diff --git a/code/modules/shuttles/shuttles_web.dm b/code/modules/shuttles/shuttles_web.dm
index 935b47ca722..1051ba6c2d9 100644
--- a/code/modules/shuttles/shuttles_web.dm
+++ b/code/modules/shuttles/shuttles_web.dm
@@ -149,7 +149,7 @@
if(!can_rename)
to_chat(user, "You can't rename this vessel.")
return
- var/new_name = input(user, "Please enter a new name for this vessel. Note that you can only set its name once, so choose wisely.", "Rename Shuttle", visible_name) as null|text
+ var/new_name = tgui_input_text(user, "Please enter a new name for this vessel. Note that you can only set its name once, so choose wisely.", "Rename Shuttle", visible_name)
var/sanitized_name = sanitizeName(new_name, MAX_NAME_LEN, TRUE)
if(sanitized_name)
//can_rename = FALSE //VOREStation Removal
diff --git a/code/modules/spells/targeted/projectile/projectile.dm b/code/modules/spells/targeted/projectile/projectile.dm
index 7181d3c140e..f98b71598c0 100644
--- a/code/modules/spells/targeted/projectile/projectile.dm
+++ b/code/modules/spells/targeted/projectile/projectile.dm
@@ -33,7 +33,7 @@ If the spell_projectile is seeking, it will update its target every process and
if(istype(projectile, /obj/item/projectile/spell_projectile))
var/obj/item/projectile/spell_projectile/SP = projectile
SP.carried = src //casting is magical
- projectile.def_zone = check_zone("chest")
+ projectile.def_zone = check_zone(BP_TORSO)
projectile.old_style_target(target)
projectile.fire()
diff --git a/code/modules/stockmarket/computer.dm b/code/modules/stockmarket/computer.dm
index 6d44e78d82e..4252d86cfeb 100644
--- a/code/modules/stockmarket/computer.dm
+++ b/code/modules/stockmarket/computer.dm
@@ -5,21 +5,36 @@
icon_state = "stockmarket"
icon_screen = "stocks"
icon_keyboard = "stockmarket_key"
+ circuit = /obj/item/weapon/circuitboard/stockexchange
var/logged_in = "Cargo Department"
var/vmode = 1
+
+ var/screen = "stocks"
+ var/datum/stock/current_stock = null
+
light_color = LIGHT_COLOR_GREEN
/obj/machinery/computer/stockexchange/Initialize()
. = ..()
logged_in = "Cargo Department"
+/obj/machinery/computer/stockexchange/Destroy()
+ return ..()
+
+/obj/machinery/computer/stockexchange/attackby(obj/item/W, mob/user, params)
+ ..()
+ SStgui.update_uis(src)
+ return
+
+/obj/machinery/computer/stockexchange/attack_ai(mob/user)
+ src.attack_hand(user)
+
/obj/machinery/computer/stockexchange/attack_hand(mob/user)
if(..(user))
return
- //if(!ai_control && issilicon(user))
- // to_chat(user, "Access Denied.")
- // return TRUE
+ if(stat & (BROKEN|NOPOWER))
+ return
tgui_interact(user)
@@ -51,56 +66,28 @@
sell_some_shares(S, usr)
if("stocks_check")
- var/dat = "Stock Transaction LogsStock Transaction Logs"
- for(var/D in GLOB.stockExchange.logs)
- var/datum/stock_log/L = D
- if(istype(L, /datum/stock_log/buy))
- dat += "[L.time] | [L.user_name] bought [L.stocks] stocks at [L.shareprice] a share for [L.money] total credits in [L.company_name]."
- continue
- if(istype(L, /datum/stock_log/sell))
- dat += "[L.time] | [L.user_name] sold [L.stocks] stocks at [L.shareprice] a share for [L.money] total credits from [L.company_name]."
- continue
- if(istype(L, /datum/stock_log/borrow))
- dat += "[L.time] | [L.user_name] borrowed [L.stocks] stocks with a deposit of [L.money] credits in [L.company_name]."
- continue
- var/datum/browser/popup = new(usr, "stock_logs", "Stock Transaction Logs", 600, 400)
- popup.set_content(dat)
- popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
+ screen = "logs"
if("stocks_archive")
var/datum/stock/S = locate(params["share"])
- if (logged_in && logged_in != "")
- var/list/LR = GLOB.stockExchange.last_read[S]
- LR[logged_in] = world.time
- var/dat = "News feed for [S.name]News feed for [S.name]"
- dat += "Events"
- var/p = 0
- for (var/datum/stockEvent/E in S.events)
- if (E.hidden)
- continue
- if (p > 0)
- dat += "
"
- dat += " [E.current_title][E.current_desc] "
- p++
- dat += "
Articles"
- p = 0
- for (var/datum/article/A in S.articles)
- if (p > 0)
- dat += "
"
- dat += " [A.headline] [A.subtitle]
[A.article] - [A.author], [A.spacetime] (via [A.outlet]) "
- p++
- dat += " "
- var/datum/browser/popup = new(usr, "archive_[S.name]", "Stock News", 600, 400)
- popup.set_content(dat)
- popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
+ if(S)
+ current_stock = S
+ //if (logged_in && logged_in != "")
+ // var/list/LR = GLOB.stockExchange.last_read[S]
+ // LR[logged_in] = world.time
+ screen = "archive"
if("stocks_history")
var/datum/stock/S = locate(params["share"]) in GLOB.stockExchange.stocks
if (S)
+ //current_stock = S
+ //screen = "graph"
S.displayValues(usr)
+ if("stocks_backbutton")
+ current_stock = null
+ screen = "stocks"
+
if("stocks_cycle_view")
vmode++
if (vmode > 1)
@@ -111,87 +98,158 @@
data["stationName"] = using_map.station_name
data["balance"] = balance()
+ data["screen"] = screen
+
+ switch(screen)
+ // Main Stocks List
+ if("stocks")
+ if (vmode)
+ data["viewMode"] = "Full"
+ else
+ data["viewMode"] = "Compressed"
- if (vmode)
- data["viewMode"] = "Full"
- else
- data["viewMode"] = "Compressed"
-
- for (var/datum/stock/S in GLOB.stockExchange.last_read)
- var/list/LR = GLOB.stockExchange.last_read[S]
- if (!(logged_in in LR))
- LR[logged_in] = 0
-
- data["stocks"] = list()
-
- if (vmode)
- for (var/datum/stock/S in GLOB.stockExchange.stocks)
- var/mystocks = 0
- if (logged_in && (logged_in in S.shareholders))
- mystocks = S.shareholders[logged_in]
-
- var/value = 0
- if (!S.bankrupt)
- value = S.current_value
-
- data["stocks"] += list(list(
- "REF" = REF(S),
- "valueChange" = S.disp_value_change, // > 0 is +, < 0 is -, else its =
- "bankrupt" = S.bankrupt,
- "ID" = S.short_name,
- "Name" = S.name,
- "Value" = value,
- "Owned" = mystocks,
- "Avail" = S.available_shares,
- "Products" = S.products,
- ))
-
- var/news = 0
- if (logged_in)
+ for (var/datum/stock/S in GLOB.stockExchange.last_read)
var/list/LR = GLOB.stockExchange.last_read[S]
- var/lrt = LR[logged_in]
- for (var/datum/article/A in S.articles)
- if (A.ticks > lrt)
- news = 1
- break
- if (!news)
- for (var/datum/stockEvent/E in S.events)
- if (E.last_change > lrt && !E.hidden)
- news = 1
- else
- for (var/datum/stock/S in GLOB.stockExchange.stocks)
- var/mystocks = 0
- if (logged_in && (logged_in in S.shareholders))
- mystocks = S.shareholders[logged_in]
+ if (!(logged_in in LR))
+ LR[logged_in] = 0
- var/unification = 0
- if (S.last_unification)
- unification = DisplayTimeText(world.time - S.last_unification)
+ data["stocks"] = list()
- data["stocks"] += list(list(
- "REF" = REF(S),
- "bankrupt" = S.bankrupt,
- "ID" = S.short_name,
- "Name" = S.name,
- "Owned" = mystocks,
- "Avail" = S.available_shares,
- "Unification" = unification,
- "Products" = S.products,
- ))
+ if (vmode)
+ for (var/datum/stock/S in GLOB.stockExchange.stocks)
+ var/mystocks = 0
+ if (logged_in && (logged_in in S.shareholders))
+ mystocks = S.shareholders[logged_in]
- var/news = 0
- if (logged_in)
- var/list/LR = GLOB.stockExchange.last_read[S]
- var/lrt = LR[logged_in]
- for (var/datum/article/A in S.articles)
- if (A.ticks > lrt)
- news = 1
- break
- if (!news)
- for (var/datum/stockEvent/E in S.events)
- if (E.last_change > lrt && !E.hidden)
- news = 1
- break
+ var/value = 0
+ if (!S.bankrupt)
+ value = S.current_value
+
+ data["stocks"] += list(list(
+ "REF" = REF(S),
+ "valueChange" = S.disp_value_change, // > 0 is +, < 0 is -, else its =
+ "bankrupt" = S.bankrupt,
+ "ID" = S.short_name,
+ "Name" = S.name,
+ "Value" = value,
+ "Owned" = mystocks,
+ "Avail" = S.available_shares,
+ "Products" = S.products,
+ ))
+
+ var/news = 0
+ if (logged_in)
+ var/list/LR = GLOB.stockExchange.last_read[S]
+ var/lrt = LR[logged_in]
+ for (var/datum/article/A in S.articles)
+ if (A.ticks > lrt)
+ news = 1
+ break
+ if (!news)
+ for (var/datum/stockEvent/E in S.events)
+ if (E.last_change > lrt && !E.hidden)
+ news = 1
+ else
+ for (var/datum/stock/S in GLOB.stockExchange.stocks)
+ var/mystocks = 0
+ if (logged_in && (logged_in in S.shareholders))
+ mystocks = S.shareholders[logged_in]
+
+ var/unification = 0
+ if (S.last_unification)
+ unification = DisplayTimeText(world.time - S.last_unification)
+
+ data["stocks"] += list(list(
+ "REF" = REF(S),
+ "bankrupt" = S.bankrupt,
+ "ID" = S.short_name,
+ "Name" = S.name,
+ "Owned" = mystocks,
+ "Avail" = S.available_shares,
+ "Unification" = unification,
+ "Products" = S.products,
+ ))
+
+ var/news = 0
+ if (logged_in)
+ var/list/LR = GLOB.stockExchange.last_read[S]
+ var/lrt = LR[logged_in]
+ for (var/datum/article/A in S.articles)
+ if (A.ticks > lrt)
+ news = 1
+ break
+ if (!news)
+ for (var/datum/stockEvent/E in S.events)
+ if (E.last_change > lrt && !E.hidden)
+ news = 1
+ break
+
+ // Stocks Logs Screen
+ if("logs")
+ data["logs"] = list()
+
+ for(var/D in GLOB.stockExchange.logs)
+ var/datum/stock_log/L = D
+
+ if (istype(L, /datum/stock_log/buy))
+ data["logs"] += list(list(
+ "type" = "transaction_bought",
+ "time" = L.time,
+ "user_name" = L.user_name,
+ "stocks" = L.stocks,
+ "shareprice" = L.shareprice,
+ "money" = L.money,
+ "company_name" = L.company_name,
+ ))
+ else if (istype(L, /datum/stock_log/sell))
+ data["logs"] += list(list(
+ "type" = "transaction_sold",
+ "time" = L.time,
+ "user_name" = L.user_name,
+ "stocks" = L.stocks,
+ "shareprice" = L.shareprice,
+ "money" = L.money,
+ "company_name" = L.company_name,
+ ))
+ else if (istype(L, /datum/stock_log/borrow))
+ data["logs"] += list(list(
+ "type" = "borrow",
+ "time" = L.time,
+ "user_name" = L.user_name,
+ "stocks" = L.stocks,
+ "money" = L.money,
+ "company_name" = L.company_name,
+ ))
+
+ // Archive Screen
+ if("archive")
+ data["name"] = current_stock.name
+ data["events"] = list()
+ data["articles"] = list()
+
+ for (var/datum/stockEvent/E in current_stock.events)
+ if (E.hidden)
+ continue
+ data["events"] += list(list(
+ "current_title" = E.current_title,
+ "current_desc" = E.current_desc,
+ ))
+
+ for (var/datum/article/A in current_stock.articles)
+ data["articles"] += list(list(
+ "headline" = A.headline,
+ "subtitle" = A.subtitle,
+ "article" = A.article,
+ "author" = A.author,
+ "spacetime" = A.spacetime,
+ "outlet" = A.outlet,
+ ))
+
+ // Stock Graph
+ if("graph")
+ data["name"] = current_stock.name
+ data["maxValue"] = 100
+ data["values"] = current_stock.values
return data
@@ -201,52 +259,6 @@
ui = new(user, src, "StockExchange")
ui.open()
-///// HISTORY SCREEN /////
-
-/obj/machinery/computer/stockexchange/history/tgui_interact(mob/user, datum/tgui/ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "StockExchangeHistory")
- ui.open()
-
-/obj/machinery/computer/stockexchange/history/tgui_data(mob/user)
- var/list/data = list()
- //data["var"] = var
- return data
-
-/obj/machinery/computer/stockexchange/history/tgui_act(action, params)
- if(..())
- return
- switch(action)
- if("copypasta")
- //var/newvar = params["var"]
- // A demo of proper input sanitation.
- //var = CLAMP(newvar, min_val, max_val)
- . = TRUE
-
-///// ARCHIVE SCREEN /////
-
-/obj/machinery/computer/stockexchange/archive/tgui_interact(mob/user, datum/tgui/ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "StockExchangeArchive")
- ui.open()
-
-/obj/machinery/computer/stockexchange/archive/tgui_data(mob/user)
- var/list/data = list()
- //data["var"] = var
- return data
-
-/obj/machinery/computer/stockexchange/archive/tgui_act(action, params)
- if(..())
- return
- switch(action)
- if("copypasta")
- //var/newvar = params["var"]
- // A demo of proper input sanitation.
- //var = CLAMP(newvar, min_val, max_val)
- . = TRUE
-
///// PROCS /////
/obj/machinery/computer/stockexchange/proc/sell_some_shares(var/datum/stock/S, var/mob/user)
@@ -262,7 +274,7 @@
to_chat(user, "This account does not own any shares of [S.name]!")
return
var/price = S.current_value
- var/amt = round(input(user, "How many shares? \n(Have: [avail], unit price: [price])", "Sell shares in [S.name]", 0) as num|null)
+ var/amt = round(tgui_input_number(user, "How many shares? \n(Have: [avail], unit price: [price])", "Sell shares in [S.name]", 0))
amt = min(amt, S.shareholders[logged_in])
if (!user || (!(user in range(1, src)) && iscarbon(user)))
@@ -297,7 +309,7 @@
var/avail = S.available_shares
var/price = S.current_value
var/canbuy = round(b / price)
- var/amt = round(input(user, "How many shares? \n(Available: [avail], unit price: [price], can buy: [canbuy])", "Buy shares in [S.name]", 0) as num|null)
+ var/amt = round(tgui_input_number(user, "How many shares? \n(Available: [avail], unit price: [price], can buy: [canbuy])", "Buy shares in [S.name]", 0))
if (!user || (!(user in range(1, src)) && iscarbon(user)))
return
if (li != logged_in)
diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm
index acbc8655dc0..745dc3e8924 100644
--- a/code/modules/surgery/implant.dm
+++ b/code/modules/surgery/implant.dm
@@ -124,7 +124,14 @@
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(istype(user,/mob/living/silicon/robot))
- return
+ if(istype(tool, /obj/item/weapon/gripper))
+ var/obj/item/weapon/gripper/Gripper = tool
+ if(Gripper.wrapped)
+ tool = Gripper.wrapped
+ else
+ return
+ else
+ return
if(affected && affected.cavity)
var/total_volume = tool.w_class
for(var/obj/item/I in affected.implants)
@@ -135,6 +142,9 @@
/datum/surgery_step/cavity/place_item/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(isrobot(user) && istype(tool, /obj/item/weapon/gripper))
+ var/obj/item/weapon/gripper/G = tool
+ tool = G.wrapped
user.visible_message("[user] starts putting \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \
"You start putting \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) //Nobody will probably ever see this, but I made these two blue. ~CK
target.custom_pain("The pain in your chest is living hell!",1)
@@ -142,7 +152,12 @@
/datum/surgery_step/cavity/place_item/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
-
+ if(isrobot(user) && istype(tool, /obj/item/weapon/gripper))
+ var/obj/item/weapon/gripper/G = tool
+ tool = G.wrapped
+ G.drop_item()
+ else
+ user.drop_item()
user.visible_message("[user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \
"You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." )
if (tool.w_class > get_max_wclass(affected)/2 && prob(50) && (affected.robotic < ORGAN_ROBOT))
@@ -150,7 +165,6 @@
var/datum/wound/internal_bleeding/I = new (10)
affected.wounds += I
affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1)
- user.drop_item()
affected.implants += tool
tool.loc = affected
if(istype(tool,/obj/item/device/nif)){var/obj/item/device/nif/N = tool;N.implant(target)} //VOREStation Add - NIF support
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index 9c210652c2a..b424852ad91 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -470,7 +470,7 @@
var/new_name = target.real_name
while(target.client)
if(!target) return
- var/try_name = input(target,"Pick a name for your new form!", "New Name", target.name)
+ var/try_name = tgui_input_text(target,"Pick a name for your new form!", "New Name", target.name)
var/clean_name = sanitizeName(try_name, allow_numbers = TRUE)
if(clean_name)
var/okay = tgui_alert(target,"New name will be '[clean_name]', ok?", "Confirmation",list("Cancel","Ok"))
@@ -562,7 +562,7 @@
var/new_name = ""
while(!new_name)
if(!target) return
- var/try_name = input(target,"Pick a name for your new form!", "New Name", target.name)
+ var/try_name = tgui_input_text(target,"Pick a name for your new form!", "New Name", target.name)
var/clean_name = sanitizeName(try_name, allow_numbers = TRUE)
if(clean_name)
var/okay = tgui_alert(target,"New name will be '[clean_name]', ok?", "Confirmation",list("Cancel","Ok"))
diff --git a/code/modules/telesci/gps_advanced.dm b/code/modules/telesci/gps_advanced.dm
index bc0d3223184..4b67718570e 100644
--- a/code/modules/telesci/gps_advanced.dm
+++ b/code/modules/telesci/gps_advanced.dm
@@ -59,7 +59,7 @@
/obj/item/device/gps/advanced/Topic(href, href_list)
..()
if(href_list["tag"] )
- var/a = input(usr, "Please enter desired tag.", name, gpstag) as text
+ var/a = tgui_input_text(usr, "Please enter desired tag.", name, gpstag)
a = uppertext(copytext(sanitize(a), 1, 5))
if(src.loc == usr)
gpstag = a
diff --git a/code/modules/tgs/v5/chat_commands.dm b/code/modules/tgs/v5/chat_commands.dm
index acae1365876..79dbe3b5ce8 100644
--- a/code/modules/tgs/v5/chat_commands.dm
+++ b/code/modules/tgs/v5/chat_commands.dm
@@ -4,7 +4,24 @@
admin_only = FALSE
/datum/tgs_chat_command/status/Run(datum/tgs_chat_user/sender, params)
- return "Current server status:\n**Web Manifest:** \n**Players:** [TGS_CLIENT_COUNT]\n**Round Duration:** [roundduration2text()]"
+ var/counts = 0
+ var/afks = 0
+ var/active = 0
+ var/bellied = 0
+
+ for(var/X in GLOB.clients)
+ var/client/C = X
+ if(C)
+ counts++
+ if(C && !(istype(C.mob,/mob/new_player) || istype(C.mob, /mob/observer)))
+ if(C && C.mob && isbelly(C.mob.loc))
+ bellied++
+ if(C.is_afk())
+ afks++
+ else
+ active++
+
+ return "Current server status:\n**Web Manifest:** \n**Players:** [counts]\n**Active:** [active]\n**AFK:** [afks]\n**Bellied:** [bellied]\n\n**Round Duration:** [roundduration2text()]"
/datum/tgs_chat_command/parsetest
name = "parsetest"
@@ -76,13 +93,13 @@ GLOBAL_LIST_EMPTY(pending_discord_registrations)
query.Execute()
if(query.NextRow())
return "[sender.friendly_name], your Discord ID is already registered to a Byond username. Please contact an administrator if you changed your Byond username or Discord ID."
-
+
var/key_to_find = "[ckey(params)]"
// They didn't provide anything worth looking up.
if(!length(key_to_find))
return "[sender.friendly_name], you need to provide your Byond username at the end of the command. It can be in 'key' format (with spaces and characters) or 'ckey' format (without spaces or special characters)."
-
+
// Try to find their client.
var/client/user
for(var/client/C in GLOB.clients)
@@ -93,7 +110,7 @@ GLOBAL_LIST_EMPTY(pending_discord_registrations)
// Couldn't find them logged in.
if(!user)
return "[sender.friendly_name], I couldn't find a logged-in user with the username of '[key_to_find]', which is what you provided after conversion to Byond's ckey format. Please connect to the game server and try again."
-
+
var/sql_ckey = sql_sanitize_text(key_to_find)
query = dbcon.NewQuery("SELECT discord_id FROM erro_player WHERE ckey = '[sql_ckey]'")
query.Execute()
@@ -101,11 +118,11 @@ GLOBAL_LIST_EMPTY(pending_discord_registrations)
// We somehow found their client, BUT they don't exist in the database
if(!query.NextRow())
return "[sender.friendly_name], the server's database is either not responding or there's no evidence you've ever logged in. Please contact an administrator."
-
+
// We found them in the database, AND they already have a discord ID assigned
if(query.item[1])
return "[sender.friendly_name], it appears you've already registered your chat and game IDs. If you've changed game or chat usernames, please contact an administrator for help."
-
+
// Okay. We found them, they're in the DB, and they have no discord ID set.
var/message = "A request has been sent from Discord to validate your Byond username, by '[sender.friendly_name]' in '[sender.channel.friendly_name]'\
If you did not send this request, do not click the link below, and do notify an administrator in-game or on Discord ASAP.\
@@ -115,5 +132,5 @@ GLOBAL_LIST_EMPTY(pending_discord_registrations)
// To stifle href hacking
GLOB.pending_discord_registrations.len++
GLOB.pending_discord_registrations[GLOB.pending_discord_registrations.len] = list("ckey" = key_to_find, "id" = sender.id, "time" = world.realtime)
-
+
return "[sender.friendly_name], I've sent you a message in-game. Please verify your username there to complete your registration within 10 minutes."
diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm
index ce30eb2f453..cfd8db13688 100644
--- a/code/modules/tgui/external.dm
+++ b/code/modules/tgui/external.dm
@@ -82,6 +82,17 @@
if(!ui || ui.status != STATUS_INTERACTIVE)
return TRUE
+/**
+ * public
+ *
+ * Called on a UI when the UI crashed.
+ *
+ * required payload list A list of the payload supposed to be set on the regular UI.
+ */
+/datum/proc/tgui_fallback(list/payload)
+ SHOULD_CALL_PARENT(TRUE)
+ SEND_SIGNAL(src, COMSIG_UI_FALLBACK, usr)
+
/**
* public
*
diff --git a/code/modules/tgui/modules/admin/player_notes.dm b/code/modules/tgui/modules/admin/player_notes.dm
new file mode 100644
index 00000000000..678758d7d3a
--- /dev/null
+++ b/code/modules/tgui/modules/admin/player_notes.dm
@@ -0,0 +1,331 @@
+#define PLAYER_NOTES_ENTRIES_PER_PAGE 50
+
+/datum/tgui_module/player_notes
+ name = "Player Notes"
+ tgui_id = "PlayerNotes"
+
+ var/ckeys = list()
+
+ var/current_filter = ""
+ var/current_page = 1
+
+ var/number_pages = 0
+
+/datum/tgui_module/player_notes/proc/filter_ckeys(var/page, var/filter)
+ var/savefile/S=new("data/player_notes.sav")
+ var/list/note_keys
+ S >> note_keys
+ if(!note_keys)
+ to_chat(usr, "No notes found.")
+ else
+ note_keys = sortList(note_keys)
+
+ if(filter)
+ var/list/results = list()
+ var/regex/needle = regex(filter, "i")
+ for(var/haystack in note_keys)
+ if(needle.Find(haystack))
+ results += haystack
+ note_keys = results
+
+ // Display the notes on the current page
+ number_pages = note_keys.len / PLAYER_NOTES_ENTRIES_PER_PAGE
+ // Emulate CEILING(why does BYOND not have ceil, 1)
+ if(number_pages != round(number_pages))
+ number_pages = round(number_pages) + 1
+ var/page_index = page - 1
+
+ if(page_index < 0 || page_index >= number_pages)
+ to_chat(usr, "No keys found.")
+ else
+ var/lower_bound = page_index * PLAYER_NOTES_ENTRIES_PER_PAGE + 1
+ var/upper_bound = (page_index + 1) * PLAYER_NOTES_ENTRIES_PER_PAGE
+ upper_bound = min(upper_bound, note_keys.len)
+ ckeys = list()
+ for(var/index = lower_bound, index <= upper_bound, index++)
+ ckeys += note_keys[index]
+
+ current_filter = filter
+
+/datum/tgui_module/player_notes/proc/open_legacy()
+ var/datum/admins/A = admin_datums[usr.ckey]
+ A.PlayerNotesLegacy()
+
+/datum/tgui_module/player_notes/tgui_state(mob/user)
+ return GLOB.tgui_admin_state
+
+/datum/tgui_module/player_notes/tgui_fallback(payload)
+ if(..())
+ return TRUE
+
+ open_legacy()
+
+/datum/tgui_module/player_notes/tgui_act(action, params, datum/tgui/ui)
+ if(..())
+ return TRUE
+
+ switch(action)
+ if("show_player_info")
+ var/datum/tgui_module/player_notes_info/A = new(src)
+ A.key = params["name"]
+ A.tgui_interact(usr)
+
+ if("filter_player_notes")
+ var/input = tgui_input_text(usr, "Filter string (case-insensitive regex)", "Player notes filter")
+ current_filter = input
+
+ if("set_page")
+ var/page = params["index"]
+ current_page = page
+
+ if("clear_player_info_filter")
+ current_filter = ""
+
+ if("open_legacy_ui")
+ open_legacy()
+
+/datum/tgui_module/player_notes/tgui_data(mob/user)
+ var/list/data = list()
+
+ filter_ckeys(current_page, current_filter)
+ data["ckeys"] = list()
+ data["pages"] = number_pages + 1
+ data["filter"] = current_filter
+
+ for(var/ckey in ckeys)
+ data["ckeys"] += list(list(
+ "name" = ckey
+ ))
+
+ return data
+
+// PLAYER NOTES INFO
+/datum/tgui_module/player_notes_info
+ name = "Player Notes Info"
+ tgui_id = "PlayerNotesInfo"
+
+ var/key = null
+
+/datum/tgui_module/player_notes_info/tgui_state(mob/user)
+ return GLOB.tgui_admin_state
+
+/datum/tgui_module/player_notes_info/tgui_fallback(payload)
+ if(..())
+ return TRUE
+
+ var/datum/admins/A = admin_datums[usr.ckey]
+ A.show_player_info_legacy(key)
+
+/datum/tgui_module/player_notes_info/tgui_act(action, params, datum/tgui/ui)
+ if(..())
+ return TRUE
+
+ switch(action)
+ if("add_player_info")
+ var/key = params["ckey"]
+ var/add = tgui_input_text(usr, "Write your comment below.", "Add Player Info", multiline = TRUE, prevent_enter = TRUE)
+ if(!add) return
+
+ notes_add(key,add,usr)
+
+ if("remove_player_info")
+ var/key = params["ckey"]
+ var/index = params["index"]
+
+ notes_del(key, index)
+
+/datum/tgui_module/player_notes_info/tgui_data(mob/user)
+ var/list/data = list()
+
+ if(!key)
+ return
+
+ var/p_age = "unknown"
+ for(var/client/C in GLOB.clients)
+ if(C.ckey == key)
+ p_age = C.player_age
+ break
+
+ data["entries"] = list()
+
+ var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav")
+ var/list/infos
+ info >> infos
+ if(infos)
+ var/update_file = 0
+ var/i = 0
+ for(var/datum/player_info/I in infos)
+ i += 1
+ if(!I.timestamp)
+ I.timestamp = "Pre-4/3/2012"
+ update_file = 1
+ if(!I.rank)
+ I.rank = "N/A"
+ update_file = 1
+
+ data["entries"] += list(list(
+ "comment" = I.content,
+ "author" = "[I.author] ([I.rank])",
+ "date" = "[I.timestamp]"
+ ))
+ if(update_file) info << infos
+
+ data["ckey"] = key
+ data["age"] = p_age
+
+ return data
+
+// ==== LEGACY UI ====
+
+/datum/admins/proc/PlayerNotesLegacy()
+ if (!istype(src,/datum/admins))
+ src = usr.client.holder
+ if (!istype(src,/datum/admins))
+ to_chat(usr, "Error: you are not an admin!")
+ return
+ PlayerNotesPageLegacy(1)
+
+/datum/admins/proc/PlayerNotesFilterLegacy()
+ if (!istype(src,/datum/admins))
+ src = usr.client.holder
+ if (!istype(src,/datum/admins))
+ to_chat(usr, "Error: you are not an admin!")
+ return
+ var/filter = input(usr, "Filter string (case-insensitive regex)", "Player notes filter")
+ PlayerNotesPageLegacy(1, filter)
+
+/datum/admins/proc/PlayerNotesPageLegacy(page, filter)
+ var/dat = "Player notes - Apply Filter "
+ var/savefile/S=new("data/player_notes.sav")
+ var/list/note_keys
+ S >> note_keys
+ if(!note_keys)
+ dat += "No notes found."
+ else
+ dat += ""
+ note_keys = sortList(note_keys)
+
+ if(filter)
+ var/list/results = list()
+ var/regex/needle = regex(filter, "i")
+ for(var/haystack in note_keys)
+ if(needle.Find(haystack))
+ results += haystack
+ note_keys = results
+
+ // Display the notes on the current page
+ var/number_pages = note_keys.len / PLAYER_NOTES_ENTRIES_PER_PAGE
+ // Emulate CEILING(why does BYOND not have ceil, 1)
+ if(number_pages != round(number_pages))
+ number_pages = round(number_pages) + 1
+ var/page_index = page - 1
+
+ if(page_index < 0 || page_index >= number_pages)
+ dat += "| No keys found. | "
+ else
+ var/lower_bound = page_index * PLAYER_NOTES_ENTRIES_PER_PAGE + 1
+ var/upper_bound = (page_index + 1) * PLAYER_NOTES_ENTRIES_PER_PAGE
+ upper_bound = min(upper_bound, note_keys.len)
+ for(var/index = lower_bound, index <= upper_bound, index++)
+ var/t = note_keys[index]
+ dat += "| [t] | "
+
+ dat += " "
+
+ // Display a footer to select different pages
+ for(var/index = 1, index <= number_pages, index++)
+ if(index == page)
+ dat += ""
+ dat += "[index] "
+ if(index == page)
+ dat += ""
+
+ usr << browse(dat, "window=player_notes;size=400x400")
+
+/datum/admins/proc/player_has_info_legacy(var/key as text)
+ var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav")
+ var/list/infos
+ info >> infos
+ if(!infos || !infos.len) return 0
+ else return 1
+
+/datum/admins/proc/show_player_info_legacy(var/key as text)
+ if (!istype(src,/datum/admins))
+ src = usr.client.holder
+ if (!istype(src,/datum/admins))
+ to_chat(usr, "Error: you are not an admin!")
+ return
+ var/dat = "Info on [key]"
+ dat += ""
+
+ var/p_age = "unknown"
+ for(var/client/C in GLOB.clients)
+ if(C.ckey == key)
+ p_age = C.player_age
+ break
+ dat +="Player age: [p_age] "
+
+ var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav")
+ var/list/infos
+ info >> infos
+ if(!infos)
+ dat += "No information found on the given key. "
+ else
+ var/update_file = 0
+ var/i = 0
+ for(var/datum/player_info/I in infos)
+ i += 1
+ if(!I.timestamp)
+ I.timestamp = "Pre-4/3/2012"
+ update_file = 1
+ if(!I.rank)
+ I.rank = "N/A"
+ update_file = 1
+ dat += "[I.content] by [I.author] ([I.rank]) on [I.timestamp] "
+ if(I.author == usr.key || I.author == "Adminbot" || ishost(usr))
+ dat += "Remove"
+ dat += "
"
+ if(update_file) info << infos
+
+ dat += " "
+ dat += "Add Comment "
+
+ dat += ""
+ usr << browse(dat, "window=adminplayerinfo;size=480x480")
+
+/datum/admins/Topic(href, href_list)
+ ..()
+
+ if(href_list["add_player_info_legacy"])
+ var/key = href_list["add_player_info_legacy"]
+ var/add = sanitize(input(usr, "Add Player Info (Legacy)"))
+ if(!add) return
+
+ notes_add(key,add,usr)
+ show_player_info_legacy(key)
+
+ if(href_list["remove_player_info_legacy"])
+ var/key = href_list["remove_player_info_legacy"]
+ var/index = text2num(href_list["remove_index"])
+
+ notes_del(key, index)
+ show_player_info_legacy(key)
+
+ if(href_list["notes_legacy"])
+ var/ckey = href_list["ckey"]
+ if(!ckey)
+ var/mob/M = locate(href_list["mob"])
+ if(ismob(M))
+ ckey = M.ckey
+
+ switch(href_list["notes_legacy"])
+ if("show")
+ show_player_info_legacy(ckey)
+ if("list")
+ var/filter
+ if(href_list["filter"] && href_list["filter"] != "0")
+ filter = url_decode(href_list["filter"])
+ PlayerNotesPageLegacy(text2num(href_list["index"]), filter)
+ if("filter")
+ PlayerNotesFilterLegacy()
+ return
diff --git a/code/modules/tgui/modules/agentcard.dm b/code/modules/tgui/modules/agentcard.dm
index 30460214369..0bdbd967ce6 100644
--- a/code/modules/tgui/modules/agentcard.dm
+++ b/code/modules/tgui/modules/agentcard.dm
@@ -45,7 +45,7 @@
to_chat(usr, "Electronic warfare [S.electronic_warfare ? "enabled" : "disabled"].")
. = TRUE
if("age")
- var/new_age = input(usr,"What age would you like to put on this card?","Agent Card Age", S.age) as null|num
+ var/new_age = tgui_input_number(usr,"What age would you like to put on this card?","Agent Card Age", S.age)
if(!isnull(new_age) && tgui_status(usr, state) == STATUS_INTERACTIVE)
if(new_age < 0)
S.age = initial(S.age)
@@ -63,7 +63,7 @@
to_chat(usr, "Appearance changed to [choice].")
. = TRUE
if("assignment")
- var/new_job = sanitize(input(usr,"What assignment would you like to put on this card?\nChanging assignment will not grant or remove any access levels.","Agent Card Assignment", S.assignment) as null|text)
+ var/new_job = sanitize(tgui_input_text(usr,"What assignment would you like to put on this card?\nChanging assignment will not grant or remove any access levels.","Agent Card Assignment", S.assignment))
if(!isnull(new_job) && tgui_status(usr, state) == STATUS_INTERACTIVE)
S.assignment = new_job
to_chat(usr, "Occupation changed to '[new_job]'.")
@@ -75,7 +75,7 @@
var/mob/living/carbon/human/H = usr
if(H.dna)
default = H.dna.b_type
- var/new_blood_type = sanitize(input(usr,"What blood type would you like to be written on this card?","Agent Card Blood Type",default) as null|text)
+ var/new_blood_type = sanitize(tgui_input_text(usr,"What blood type would you like to be written on this card?","Agent Card Blood Type",default))
if(!isnull(new_blood_type) && tgui_status(usr, state) == STATUS_INTERACTIVE)
S.blood_type = new_blood_type
to_chat(usr, "Blood type changed to '[new_blood_type]'.")
@@ -86,7 +86,7 @@
var/mob/living/carbon/human/H = usr
if(H.dna)
default = H.dna.unique_enzymes
- var/new_dna_hash = sanitize(input(usr,"What DNA hash would you like to be written on this card?","Agent Card DNA Hash",default) as null|text)
+ var/new_dna_hash = sanitize(tgui_input_text(usr,"What DNA hash would you like to be written on this card?","Agent Card DNA Hash",default))
if(!isnull(new_dna_hash) && tgui_status(usr, state) == STATUS_INTERACTIVE)
S.dna_hash = new_dna_hash
to_chat(usr, "DNA hash changed to '[new_dna_hash]'.")
@@ -97,13 +97,13 @@
var/mob/living/carbon/human/H = usr
if(H.dna)
default = md5(H.dna.uni_identity)
- var/new_fingerprint_hash = sanitize(input(usr,"What fingerprint hash would you like to be written on this card?","Agent Card Fingerprint Hash",default) as null|text)
+ var/new_fingerprint_hash = sanitize(tgui_input_text(usr,"What fingerprint hash would you like to be written on this card?","Agent Card Fingerprint Hash",default))
if(!isnull(new_fingerprint_hash) && tgui_status(usr, state) == STATUS_INTERACTIVE)
S.fingerprint_hash = new_fingerprint_hash
to_chat(usr, "Fingerprint hash changed to '[new_fingerprint_hash]'.")
. = TRUE
if("name")
- var/new_name = sanitizeName(input(usr,"What name would you like to put on this card?","Agent Card Name", S.registered_name) as null|text)
+ var/new_name = sanitizeName(tgui_input_text(usr,"What name would you like to put on this card?","Agent Card Name", S.registered_name))
if(!isnull(new_name) && tgui_status(usr, state) == STATUS_INTERACTIVE)
S.registered_name = new_name
S.update_name()
@@ -114,7 +114,7 @@
to_chat(usr, "Photo changed.")
. = TRUE
if("sex")
- var/new_sex = sanitize(input(usr,"What sex would you like to put on this card?","Agent Card Sex", S.sex) as null|text)
+ var/new_sex = sanitize(tgui_input_text(usr,"What sex would you like to put on this card?","Agent Card Sex", S.sex))
if(!isnull(new_sex) && tgui_status(usr, state) == STATUS_INTERACTIVE)
S.sex = new_sex
to_chat(usr, "Sex changed to '[new_sex]'.")
diff --git a/code/modules/tgui/modules/appearance_changer.dm b/code/modules/tgui/modules/appearance_changer.dm
index b125338b306..d6d7e5f3863 100644
--- a/code/modules/tgui/modules/appearance_changer.dm
+++ b/code/modules/tgui/modules/appearance_changer.dm
@@ -38,6 +38,7 @@
map_name = "appearance_changer_[REF(src)]_map"
// Initialize map objects
cam_screen = new
+
cam_screen.name = "screen"
cam_screen.assigned_map = map_name
cam_screen.del_on_map_removal = FALSE
@@ -92,8 +93,8 @@
if(can_change(APPEARANCE_RACE) && (params["race"] in valid_species))
if(target.change_species(params["race"]))
if(params["race"] == "Custom Species")
- target.custom_species = sanitize(input(usr, "Input custom species name:",
- "Custom Species Name") as null|text, MAX_NAME_LEN)
+ target.custom_species = sanitize(tgui_input_text(usr, "Input custom species name:",
+ "Custom Species Name", null, MAX_NAME_LEN), MAX_NAME_LEN)
cut_data()
generate_data(usr)
changed_hook(APPEARANCECHANGER_CHANGED_RACE)
@@ -112,7 +113,7 @@
return 1
if("skin_tone")
if(can_change_skin_tone())
- var/new_s_tone = input(usr, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Skin Tone", -target.s_tone + 35) as num|null
+ var/new_s_tone = tgui_input_number(usr, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Skin Tone", -target.s_tone + 35, 220, 1)
if(isnum(new_s_tone) && can_still_topic(usr, state))
new_s_tone = 35 - max(min( round(new_s_tone), 220),1)
changed_hook(APPEARANCECHANGER_CHANGED_SKINTONE)
@@ -407,6 +408,11 @@
return data
/datum/tgui_module/appearance_changer/proc/update_active_camera_screen()
+ cam_screen.vis_contents = list(owner) // Copied from the vore version.
+ cam_background.icon_state = "clear"
+ cam_background.fill_rect(1, 1, 1, 1)
+ local_skybox.cut_overlays()
+ /*
var/turf/newturf = get_turf(customize_usr ? tgui_host() : owner)
if(newturf == last_camera_turf)
return
@@ -425,6 +431,7 @@
local_skybox.add_overlay(SSskybox.get_skybox(get_z(newturf)))
local_skybox.scale_to_view(3)
local_skybox.set_position("CENTER", "CENTER", (world.maxx>>1) - newturf.x, (world.maxy>>1) - newturf.y)
+ */
/datum/tgui_module/appearance_changer/proc/update_dna()
var/mob/living/carbon/human/target = owner
@@ -544,7 +551,7 @@
// VOREStation Add - Ears/Tails/Wings
/datum/tgui_module/appearance_changer/proc/can_use_sprite(datum/sprite_accessory/X, mob/living/carbon/human/target, mob/user)
- if(!isnull(X.species_allowed) && !(target.species.name in X.species_allowed))
+ if(!isnull(X.species_allowed) && !(target.species.name in X.species_allowed) && (!istype(target.species, /datum/species/custom))) // Letting custom species access wings/ears/tails.
return FALSE
if(LAZYLEN(X.ckeys_allowed) && !(user?.ckey in X.ckeys_allowed) && !(target.ckey in X.ckeys_allowed))
diff --git a/code/modules/tgui/modules/appearance_changer_vr.dm b/code/modules/tgui/modules/appearance_changer_vr.dm
index d5ace1b7e7c..fc77d8663c0 100644
--- a/code/modules/tgui/modules/appearance_changer_vr.dm
+++ b/code/modules/tgui/modules/appearance_changer_vr.dm
@@ -43,3 +43,15 @@
if(APPEARANCECHANGER_CHANGED_EYES)
to_chat(M, "You feel lightheaded and drowsy...")
to_chat(O, "You feel warm as you make subtle changes to your captive's body.")
+
+// Cocoon Stuff
+/datum/tgui_module/appearance_changer/cocoon
+ name ="Appearance Editor (Cocoon)"
+ flags = APPEARANCE_ALL_HAIR
+ customize_usr = TRUE
+
+/datum/tgui_module/appearance_changer/cocoon/tgui_status(mob/user, datum/tgui_state/state)
+ //if(!istype(owner.loc, /obj/item/weapon/storage/vore_egg/bugcocoon))
+ if(!owner.transforming)
+ return STATUS_CLOSE
+ return ..()
\ No newline at end of file
diff --git a/code/modules/tgui/modules/communications.dm b/code/modules/tgui/modules/communications.dm
index 1a2ae082ef3..10429d53cc6 100644
--- a/code/modules/tgui/modules/communications.dm
+++ b/code/modules/tgui/modules/communications.dm
@@ -260,7 +260,7 @@
if(message_cooldown > world.time)
to_chat(usr, "Please allow at least one minute to pass between announcements.")
return
- var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement") as null|message
+ var/input = tgui_input_text(usr, "Please write a message to announce to the station crew.", "Priority Announcement", multiline = TRUE, prevent_enter = TRUE)
if(!input || message_cooldown > world.time || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX))
return
if(length(input) < COMM_MSGLEN_MINIMUM)
@@ -324,11 +324,11 @@
post_status(src, params["statdisp"], user = usr)
if("setmsg1")
- stat_msg1 = reject_bad_text(sanitize(input(usr, "Line 1", "Enter Message Text", stat_msg1) as text|null, 40), 40)
+ stat_msg1 = reject_bad_text(sanitize(tgui_input_text(usr, "Line 1", "Enter Message Text", stat_msg1, 40), 40), 40)
setMenuState(usr, COMM_SCREEN_STAT)
if("setmsg2")
- stat_msg2 = reject_bad_text(sanitize(input(usr, "Line 2", "Enter Message Text", stat_msg2) as text|null, 40), 40)
+ stat_msg2 = reject_bad_text(sanitize(tgui_input_text(usr, "Line 2", "Enter Message Text", stat_msg2, 40), 40), 40)
setMenuState(usr, COMM_SCREEN_STAT)
// OMG CENTCOMM LETTERHEAD
@@ -337,10 +337,10 @@
if(centcomm_message_cooldown > world.time)
to_chat(usr, "Arrays recycling. Please stand by.")
return
- var/input = sanitize(input(usr, "Please choose a message to transmit to [using_map.boss_short] via quantum entanglement. \
+ var/input = sanitize(tgui_input_text(usr, "Please choose a message to transmit to [using_map.boss_short] via quantum entanglement. \
Please be aware that this process is very expensive, and abuse will lead to... termination. \
Transmission does not guarantee a response. \
- There is a 30 second delay before you may send another message, be clear, full and concise.", "Central Command Quantum Messaging") as null|message)
+ There is a 30 second delay before you may send another message, be clear, full and concise.", "Central Command Quantum Messaging", multiline = TRUE, prevent_enter = TRUE))
if(!input || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX))
return
if(length(input) < COMM_CCMSGLEN_MINIMUM)
@@ -358,7 +358,7 @@
if(centcomm_message_cooldown > world.time)
to_chat(usr, "Arrays recycling. Please stand by.")
return
- var/input = sanitize(input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", ""))
+ var/input = sanitize(tgui_input_text(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", ""))
if(!input || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX))
return
if(length(input) < COMM_CCMSGLEN_MINIMUM)
diff --git a/code/modules/tgui/modules/gyrotron_control.dm b/code/modules/tgui/modules/gyrotron_control.dm
index ee6f5af9b6f..e0c47758498 100644
--- a/code/modules/tgui/modules/gyrotron_control.dm
+++ b/code/modules/tgui/modules/gyrotron_control.dm
@@ -18,7 +18,7 @@
switch(action)
if("set_tag")
- var/new_ident = sanitize_text(input(usr, "Enter a new ident tag.", "Gyrotron Control", gyro_tag) as null|text)
+ var/new_ident = sanitize_text(tgui_input_text(usr, "Enter a new ident tag.", "Gyrotron Control", gyro_tag))
if(new_ident)
gyro_tag = new_ident
return TRUE
diff --git a/code/modules/tgui/modules/law_manager.dm b/code/modules/tgui/modules/law_manager.dm
index 3a9ca9cf880..847281a554a 100644
--- a/code/modules/tgui/modules/law_manager.dm
+++ b/code/modules/tgui/modules/law_manager.dm
@@ -89,7 +89,7 @@
return TRUE
if("change_supplied_law_position")
- var/new_position = input(usr, "Enter new supplied law position between 1 and [MAX_SUPPLIED_LAW_NUMBER], inclusive. Inherent laws at the same index as a supplied law will not be stated.", "Law Position", supplied_law_position) as num|null
+ var/new_position = tgui_input_number(usr, "Enter new supplied law position between 1 and [MAX_SUPPLIED_LAW_NUMBER], inclusive. Inherent laws at the same index as a supplied law will not be stated.", "Law Position", supplied_law_position)
if(isnum(new_position) && can_still_topic(usr, state))
supplied_law_position = CLAMP(new_position, 1, MAX_SUPPLIED_LAW_NUMBER)
return TRUE
@@ -98,7 +98,7 @@
if(is_malf(usr))
var/datum/ai_law/AL = locate(params["edit_law"]) in owner.laws.all_laws()
if(AL)
- var/new_law = sanitize(input(usr, "Enter new law. Leaving the field blank will cancel the edit.", "Edit Law", AL.law))
+ var/new_law = sanitize(tgui_input_text(usr, "Enter new law. Leaving the field blank will cancel the edit.", "Edit Law", AL.law))
if(new_law && new_law != AL.law && is_malf(usr) && can_still_topic(usr, state))
log_and_message_admins("has changed a law of [owner] from '[AL.law]' to '[new_law]'")
AL.law = new_law
diff --git a/code/modules/tgui/modules/ntos-only/cardmod.dm b/code/modules/tgui/modules/ntos-only/cardmod.dm
index 8a8ace688f1..b6e4a8063b3 100644
--- a/code/modules/tgui/modules/ntos-only/cardmod.dm
+++ b/code/modules/tgui/modules/ntos-only/cardmod.dm
@@ -192,7 +192,7 @@
if(computer && program.can_run(usr, 1) && id_card)
var/t1 = params["assign_target"]
if(t1 == "Custom")
- var/temp_t = sanitize(input(usr, "Enter a custom job assignment.","Assignment", id_card.assignment), 45)
+ var/temp_t = sanitize(tgui_input_text(usr, "Enter a custom job assignment.","Assignment", id_card.assignment, 45), 45)
//let custom jobs function as an impromptu alt title, mainly for sechuds
if(temp_t)
id_card.assignment = temp_t
diff --git a/code/modules/tgui/modules/ntos-only/email.dm b/code/modules/tgui/modules/ntos-only/email.dm
index 746582ae7fd..45317a9aee1 100644
--- a/code/modules/tgui/modules/ntos-only/email.dm
+++ b/code/modules/tgui/modules/ntos-only/email.dm
@@ -231,10 +231,10 @@
/datum/tgui_module/email_client/tgui_act(action, params)
if(..())
return TRUE
-
+
var/mob/living/user = usr
check_for_new_messages(1) // Any actual interaction (button pressing) is considered as acknowledging received message, for the purpose of notification icons.
-
+
switch(action)
if("login")
log_in()
@@ -279,7 +279,7 @@
var/oldtext = html_decode(msg_body)
oldtext = replacetext(oldtext, "\[editorbr\]", "\n")
- var/newtext = sanitize(replacetext(input(usr, "Enter your message. You may use most tags from paper formatting", "Message Editor", oldtext) as message|null, "\n", "\[editorbr\]"), 20000)
+ var/newtext = sanitize(replacetext(tgui_input_text(usr, "Enter your message. You may use most tags from paper formatting", "Message Editor", oldtext, 20000, TRUE, prevent_enter = TRUE), "\n", "\[editorbr\]"), 20000)
if(newtext)
msg_body = newtext
return 1
@@ -362,13 +362,13 @@
return 1
if("changepassword")
- var/oldpassword = sanitize(input(user,"Please enter your old password:", "Password Change"), 100)
+ var/oldpassword = sanitize(tgui_input_text(user,"Please enter your old password:", "Password Change", null, 100), 100)
if(!oldpassword)
return 1
- var/newpassword1 = sanitize(input(user,"Please enter your new password:", "Password Change"), 100)
+ var/newpassword1 = sanitize(tgui_input_text(user,"Please enter your new password:", "Password Change", null, 100), 100)
if(!newpassword1)
return 1
- var/newpassword2 = sanitize(input(user,"Please re-enter your new password:", "Password Change"), 100)
+ var/newpassword2 = sanitize(tgui_input_text(user,"Please re-enter your new password:", "Password Change", null, 100), 100)
if(!newpassword2)
return 1
@@ -399,7 +399,7 @@
error = "Error exporting file. Are you using a functional and NTOS-compliant device?"
return 1
- var/filename = sanitize(input(user,"Please specify file name:", "Message export"), 100)
+ var/filename = sanitize(tgui_input_text(user,"Please specify file name:", "Message export", null, 100), 100)
if(!filename)
return 1
@@ -473,4 +473,4 @@
if("remove_attachment")
msg_attachment = null
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/tgui/modules/overmap.dm b/code/modules/tgui/modules/overmap.dm
index 5aac12d7c16..a9fff0e6d40 100644
--- a/code/modules/tgui/modules/overmap.dm
+++ b/code/modules/tgui/modules/overmap.dm
@@ -307,7 +307,7 @@
/* HELM */
if("add")
var/datum/computer_file/data/waypoint/R = new()
- var/sec_name = input(usr, "Input navigation entry name", "New navigation entry", "Sector #[known_sectors.len]") as text
+ var/sec_name = tgui_input_text(usr, "Input navigation entry name", "New navigation entry", "Sector #[known_sectors.len]")
if(!sec_name)
sec_name = "Sector #[known_sectors.len]"
R.fields["name"] = sec_name
@@ -319,8 +319,8 @@
R.fields["x"] = linked.x
R.fields["y"] = linked.y
if("new")
- var/newx = input(usr, "Input new entry x coordinate", "Coordinate input", linked.x) as num
- var/newy = input(usr, "Input new entry y coordinate", "Coordinate input", linked.y) as num
+ var/newx = tgui_input_number(usr, "Input new entry x coordinate", "Coordinate input", linked.x)
+ var/newy = tgui_input_number(usr, "Input new entry y coordinate", "Coordinate input", linked.y)
R.fields["x"] = CLAMP(newx, 1, world.maxx)
R.fields["y"] = CLAMP(newy, 1, world.maxy)
known_sectors[sec_name] = R
@@ -335,12 +335,12 @@
if("setcoord")
if(params["setx"])
- var/newx = input(usr, "Input new destiniation x coordinate", "Coordinate input", dx) as num|null
+ var/newx = tgui_input_number(usr, "Input new destiniation x coordinate", "Coordinate input", dx)
if(newx)
dx = CLAMP(newx, 1, world.maxx)
if(params["sety"])
- var/newy = input(usr, "Input new destiniation y coordinate", "Coordinate input", dy) as num|null
+ var/newy = tgui_input_number(usr, "Input new destiniation y coordinate", "Coordinate input", dy)
if(newy)
dy = CLAMP(newy, 1, world.maxy)
. = TRUE
@@ -356,13 +356,13 @@
. = TRUE
if("speedlimit")
- var/newlimit = input(usr, "Input new speed limit for autopilot (0 to brake)", "Autopilot speed limit", speedlimit*1000) as num|null
+ var/newlimit = tgui_input_number(usr, "Input new speed limit for autopilot (0 to brake)", "Autopilot speed limit", speedlimit*1000)
if(newlimit)
speedlimit = CLAMP(newlimit/1000, 0, 100)
. = TRUE
if("accellimit")
- var/newlimit = input(usr, "Input new acceleration limit", "Acceleration limit", accellimit*1000) as num|null
+ var/newlimit = tgui_input_number(usr, "Input new acceleration limit", "Acceleration limit", accellimit*1000)
if(newlimit)
accellimit = max(newlimit/1000, 0)
. = TRUE
@@ -402,7 +402,7 @@
. = TRUE
if("set_global_limit")
- var/newlim = input(usr, "Input new thrust limit (0..100%)", "Thrust limit", linked.thrust_limit*100) as num
+ var/newlim = tgui_input_number(usr, "Input new thrust limit (0..100%)", "Thrust limit", linked.thrust_limit*100, 100, 0)
linked.thrust_limit = clamp(newlim/100, 0, 1)
for(var/datum/ship_engine/E in linked.engines)
E.set_thrust_limit(linked.thrust_limit)
@@ -416,7 +416,7 @@
if("set_limit")
var/datum/ship_engine/E = locate(params["engine"])
- var/newlim = input(usr, "Input new thrust limit (0..100)", "Thrust limit", E.get_thrust_limit()) as num
+ var/newlim = tgui_input_number(usr, "Input new thrust limit (0..100)", "Thrust limit", E.get_thrust_limit(), 100, 0)
var/limit = clamp(newlim/100, 0, 1)
if(istype(E))
E.set_thrust_limit(limit)
@@ -437,7 +437,7 @@
/* END ENGINES */
/* SENSORS */
if("range")
- var/nrange = input(usr, "Set new sensors range", "Sensor range", sensors.range) as num|null
+ var/nrange = tgui_input_number(usr, "Set new sensors range", "Sensor range", sensors.range)
if(nrange)
sensors.set_range(CLAMP(nrange, 1, world.view))
. = TRUE
diff --git a/code/modules/tgui/modules/rcon.dm b/code/modules/tgui/modules/rcon.dm
index 01ba355248f..0a29153d76c 100644
--- a/code/modules/tgui/modules/rcon.dm
+++ b/code/modules/tgui/modules/rcon.dm
@@ -1,3 +1,5 @@
+#define SMES_PER_PAGE 4
+
/datum/tgui_module/rcon
name = "Power RCON"
tgui_id = "RCON"
@@ -5,17 +7,41 @@
var/list/known_SMESs = null
var/list/known_breakers = null
+ var/filtered_smeslist = list()
+
+ var/current_page = 1
+ var/number_pages = 0
+
+/datum/tgui_module/rcon/proc/filter_smeslist(var/page)
+ number_pages = known_SMESs.len / SMES_PER_PAGE
+
+ if(number_pages != round(number_pages))
+ number_pages = round(number_pages) + 1
+ var/page_index = page - 1
+
+ var/lower_bound = page_index * SMES_PER_PAGE + 1
+ var/upper_bound = (page_index + 1) * SMES_PER_PAGE
+ upper_bound = min(upper_bound, known_SMESs.len)
+ filtered_smeslist = list()
+
+ for(var/index = lower_bound, index <= upper_bound, index++)
+ filtered_smeslist += known_SMESs[index]
+
/datum/tgui_module/rcon/tgui_data(mob/user)
FindDevices() // Update our devices list
var/list/data = ..()
+ filter_smeslist(current_page)
+
// SMES DATA (simplified view)
var/list/smeslist[0]
- for(var/obj/machinery/power/smes/buildable/SMES in known_SMESs)
+ for(var/obj/machinery/power/smes/buildable/SMES in filtered_smeslist)
var/list/smes_data = SMES.tgui_data()
smes_data["RCON_tag"] = SMES.RCon_tag
smeslist.Add(list(smes_data))
+ data["pages"] = number_pages + 1
+ data["current_page"] = current_page
data["smes_info"] = sortByKey(smeslist, "RCON_tag")
// BREAKER DATA (simplified view)
@@ -34,6 +60,10 @@
return TRUE
switch(action)
+ if("set_smes_page")
+ var/page = params["index"]
+ current_page = page
+ . = TRUE
if("smes_in_toggle")
var/obj/machinery/power/smes/buildable/SMES = GetSMESByTag(params["smes"])
if(SMES)
diff --git a/code/modules/tgui/modules/rustcore_monitor.dm b/code/modules/tgui/modules/rustcore_monitor.dm
index 553363a9633..a7ce6edbbb0 100644
--- a/code/modules/tgui/modules/rustcore_monitor.dm
+++ b/code/modules/tgui/modules/rustcore_monitor.dm
@@ -25,7 +25,7 @@
return TRUE
if("set_tag")
- var/new_ident = sanitize_text(input(usr, "Enter a new ident tag.", "Core Control", core_tag) as null|text)
+ var/new_ident = sanitize_text(tgui_input_text(usr, "Enter a new ident tag.", "Core Control", core_tag))
if(new_ident)
core_tag = new_ident
return TRUE
diff --git a/code/modules/tgui/modules/rustfuel_control.dm b/code/modules/tgui/modules/rustfuel_control.dm
index b7c43b521d2..820a937b992 100644
--- a/code/modules/tgui/modules/rustfuel_control.dm
+++ b/code/modules/tgui/modules/rustfuel_control.dm
@@ -22,7 +22,7 @@
return TRUE
if("set_tag")
- var/new_ident = sanitize_text(input(usr, "Enter a new ident tag.", "Gyrotron Control", fuel_tag) as null|text)
+ var/new_ident = sanitize_text(tgui_input_text(usr, "Enter a new ident tag.", "Gyrotron Control", fuel_tag))
if(new_ident)
fuel_tag = new_ident
diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm
index 5f95ab7db2c..b09b5ec7595 100644
--- a/code/modules/tgui/tgui.dm
+++ b/code/modules/tgui/tgui.dm
@@ -32,8 +32,12 @@
var/closing = FALSE
/// The status/visibility of the UI.
var/status = STATUS_INTERACTIVE
+ /// Timed refreshing state
+ var/refreshing = FALSE
/// Topic state used to determine status/interactability.
var/datum/tgui_state/state = null
+ /// Rate limit client refreshes to prevent DoS.
+ COOLDOWN_DECLARE(refresh_cooldown)
/// The map z-level to display.
var/map_z_level = 1
/// The Parent UI
@@ -92,10 +96,9 @@
if(!window.is_ready())
window.initialize(
fancy = user.client.prefs.tgui_fancy,
- inline_assets = list(
- get_asset_datum(/datum/asset/simple/tgui_common),
- get_asset_datum(/datum/asset/simple/tgui)
- ))
+ assets = list(
+ get_asset_datum(/datum/asset/simple/tgui),
+ ))
else
window.send_message("ping")
window.send_asset(get_asset_datum(/datum/asset/simple/fontawesome))
@@ -177,11 +180,17 @@
/datum/tgui/proc/send_full_update(custom_data, force)
if(!user.client || !initialized || closing)
return
+ //if(!COOLDOWN_FINISHED(src, refresh_cooldown))
+ //refreshing = TRUE
+ //addtimer(CALLBACK(src, .proc/send_full_update), TGUI_REFRESH_FULL_UPDATE_COOLDOWN, TIMER_UNIQUE)
+ //return
+ //refreshing = FALSE
var/should_update_data = force || status >= STATUS_UPDATE
window.send_message("update", get_payload(
custom_data,
with_data = should_update_data,
with_static_data = TRUE))
+ //COOLDOWN_START(src, refresh_cooldown, TGUI_REFRESH_FULL_UPDATE_COOLDOWN)
/**
* public
@@ -212,6 +221,8 @@
"title" = title,
"status" = status,
"interface" = interface,
+ //"refreshing" = refreshing,
+ "refreshing" = FALSE,
"map" = (using_map && using_map.path) ? using_map.path : "Unknown",
"mapZLevel" = map_z_level,
"window" = list(
@@ -313,6 +324,9 @@
return FALSE
switch(type)
if("ready")
+ // Send a full update when the user manually refreshes the UI
+ if(initialized)
+ send_full_update()
initialized = TRUE
if("pingReply")
initialized = TRUE
@@ -328,4 +342,9 @@
return
LAZYINITLIST(src_object.tgui_shared_states)
src_object.tgui_shared_states[href_list["key"]] = href_list["value"]
- SStgui.update_uis(src_object)
\ No newline at end of file
+ SStgui.update_uis(src_object)
+ if("fallback")
+ #ifdef TGUI_DEBUGGING
+ log_tgui(user, "Fallback Triggered: [href_list["payload"]], Window: [window.id], Source: [src_object]")
+ #endif
+ src_object.tgui_fallback(payload)
\ No newline at end of file
diff --git a/code/modules/tgui/tgui_input_text.dm b/code/modules/tgui/tgui_input_text.dm
deleted file mode 100644
index e2247a32cee..00000000000
--- a/code/modules/tgui/tgui_input_text.dm
+++ /dev/null
@@ -1,299 +0,0 @@
-/**
- * Creates a TGUI input text window and returns the user's response.
- *
- * This proc should be used to create alerts that the caller will wait for a response from.
- * Arguments:
- * * user - The user to show the input box to.
- * * message - The content of the input box, shown in the body of the TGUI window.
- * * title - The title of the input box, shown on the top of the TGUI window.
- * * default - The default value pre-populated in the input box.
- * * timeout - The timeout of the input box, after which the input box will close and qdel itself. Set to zero for no timeout.
- */
-/proc/tgui_input_text(mob/user, message, title, default, timeout = 0)
- if (istext(user))
- stack_trace("tgui_input_text() received text for user instead of mob")
- return
- if (!user)
- user = usr
- if (!istype(user))
- if (istype(user, /client))
- var/client/client = user
- user = client.mob
- else
- return
- var/datum/tgui_input_dialog/input = new(user, message, title, default, timeout)
- input.input_type = "text"
- input.tgui_interact(user)
- input.wait()
- if (input)
- . = input.choice
- qdel(input)
-
-/**
- * Creates a TGUI input message window and returns the user's response.
- *
- * This proc should be used to create alerts that the caller will wait for a response from.
- * Arguments:
- * * user - The user to show the input box to.
- * * message - The content of the input box, shown in the body of the TGUI window.
- * * title - The title of the input box, shown on the top of the TGUI window.
- * * default - The default value pre-populated in the input box.
- * * timeout - The timeout of the input box, after which the input box will close and qdel itself. Set to zero for no timeout.
- */
-/proc/tgui_input_message(mob/user, message, title, default, timeout = 0)
- if (istext(user))
- stack_trace("tgui_input_message() received text for user instead of mob")
- return
- if (!user)
- user = usr
- if (!istype(user))
- if (istype(user, /client))
- var/client/client = user
- user = client.mob
- else
- return
- var/datum/tgui_input_dialog/input = new(user, message, title, default, timeout)
- input.input_type = "message"
- input.tgui_interact(user)
- input.wait()
- if (input)
- . = input.choice
- qdel(input)
-
-/**
- * Creates a TGUI input num window and returns the user's response.
- *
- * This proc should be used to create alerts that the caller will wait for a response from.
- * Arguments:
- * * user - The user to show the input box to.
- * * message - The content of the input box, shown in the body of the TGUI window.
- * * title - The title of the input box, shown on the top of the TGUI window.
- * * default - The default value pre-populated in the input box.
- * * timeout - The timeout of the input box, after which the input box will close and qdel itself. Set to zero for no timeout.
- */
-/proc/tgui_input_num(mob/user, message, title, default, timeout = 0)
- if (istext(user))
- stack_trace("tgui_input_num() received text for user instead of mob")
- return
- if (!user)
- user = usr
- if (!istype(user))
- if (istype(user, /client))
- var/client/client = user
- user = client.mob
- else
- return
- var/datum/tgui_input_dialog/input = new(user, message, title, default, timeout)
- input.input_type = "num"
- input.tgui_interact(user)
- input.wait()
- if (input)
- . = input.choice
- qdel(input)
-
-/**
- * Creates an asynchronous TGUI input text window with an associated callback.
- *
- * This proc should be used to create inputs that invoke a callback with the user's chosen option.
- * Arguments:
- * * user - The user to show the input box to.
- * * message - The content of the input box, shown in the body of the TGUI window.
- * * title - The title of the input box, shown on the top of the TGUI window.
- * * default - The default value pre-populated in the input box.
- * * callback - The callback to be invoked when a choice is made.
- * * timeout - The timeout of the input box, after which the menu will close and qdel itself. Set to zero for no timeout.
- */
-/proc/tgui_input_text_async(mob/user, message, title, default, datum/callback/callback, timeout = 60 SECONDS)
- if (istext(user))
- stack_trace("tgui_input_text_async() received text for user instead of mob")
- return
- if (!user)
- user = usr
- if (!istype(user))
- if (istype(user, /client))
- var/client/client = user
- user = client.mob
- else
- return
- var/datum/tgui_input_dialog/async/input = new(user, message, title, default, callback, timeout)
- input.input_type = "text"
- input.tgui_interact(user)
-
-/**
- * Creates an asynchronous TGUI input message window with an associated callback.
- *
- * This proc should be used to create inputs that invoke a callback with the user's chosen option.
- * Arguments:
- * * user - The user to show the input box to.
- * * message - The content of the input box, shown in the body of the TGUI window.
- * * title - The title of the input box, shown on the top of the TGUI window.
- * * default - The default value pre-populated in the input box.
- * * callback - The callback to be invoked when a choice is made.
- * * timeout - The timeout of the input box, after which the menu will close and qdel itself. Set to zero for no timeout.
- */
-/proc/tgui_input_message_async(mob/user, message, title, default, datum/callback/callback, timeout = 60 SECONDS)
- if (istext(user))
- stack_trace("tgui_input_message_async() received text for user instead of mob")
- return
- if (!user)
- user = usr
- if (!istype(user))
- if (istype(user, /client))
- var/client/client = user
- user = client.mob
- else
- return
- var/datum/tgui_input_dialog/async/input = new(user, message, title, default, callback, timeout)
- input.input_type = "message"
- input.tgui_interact(user)
-
-/**
- * Creates an asynchronous TGUI input num window with an associated callback.
- *
- * This proc should be used to create inputs that invoke a callback with the user's chosen option.
- * Arguments:
- * * user - The user to show the input box to.
- * * message - The content of the input box, shown in the body of the TGUI window.
- * * title - The title of the input box, shown on the top of the TGUI window.
- * * default - The default value pre-populated in the input box.
- * * callback - The callback to be invoked when a choice is made.
- * * timeout - The timeout of the input box, after which the menu will close and qdel itself. Set to zero for no timeout.
- */
-/proc/tgui_input_num_async(mob/user, message, title, default, datum/callback/callback, timeout = 60 SECONDS)
- if (istext(user))
- stack_trace("tgui_input_num_async() received text for user instead of mob")
- return
- if (!user)
- user = usr
- if (!istype(user))
- if (istype(user, /client))
- var/client/client = user
- user = client.mob
- else
- return
- var/datum/tgui_input_dialog/async/input = new(user, message, title, default, callback, timeout)
- input.input_type = "num"
- input.tgui_interact(user)
-
-/**
- * # tgui_input_dialog
- *
- * Datum used for instantiating and using a TGUI-controlled input that prompts the user with
- * a message and a box for accepting text/message/num input.
- */
-/datum/tgui_input_dialog
- /// The title of the TGUI window
- var/title
- /// The textual body of the TGUI window
- var/message
- /// The default value to initially populate the input box.
- var/initial
- /// The value that the user input into the input box, null if cancelled.
- var/choice
- /// The time at which the tgui_text_input was created, for displaying timeout progress.
- var/start_time
- /// The lifespan of the tgui_text_input, after which the window will close and delete itself.
- var/timeout
- /// Boolean field describing if the tgui_text_input was closed by the user.
- var/closed
- /// Indicates the data type we want to collect ("text", "message", "num")
- var/input_type = "text"
-
-/datum/tgui_input_dialog/New(mob/user, message, title, default, timeout)
- src.title = title
- src.message = message
- // TODO - Do we need to sanitize the initial value for illegal characters?
- src.initial = default
- if (timeout)
- src.timeout = timeout
- start_time = world.time
- QDEL_IN(src, timeout)
-
-/datum/tgui_input_dialog/Destroy(force, ...)
- SStgui.close_uis(src)
- . = ..()
-
-/**
- * Waits for a user's response to the tgui_text_input's prompt before returning. Returns early if
- * the window was closed by the user.
- */
-/datum/tgui_input_dialog/proc/wait()
- while (!choice && !closed)
- stoplag(1)
-
-/datum/tgui_input_dialog/tgui_interact(mob/user, datum/tgui/ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "InputModal")
- ui.open()
-
-/datum/tgui_input_dialog/tgui_close(mob/user)
- . = ..()
- closed = TRUE
-
-/datum/tgui_input_dialog/tgui_state(mob/user)
- return GLOB.tgui_always_state
-
-/datum/tgui_input_dialog/tgui_static_data(mob/user)
- . = list(
- "title" = title,
- "message" = message,
- "initial" = initial,
- "input_type" = input_type
- )
-
-/datum/tgui_input_dialog/tgui_data(mob/user)
- . = list()
- if(timeout)
- .["timeout"] = clamp((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS), 0, 1)
-
-/datum/tgui_input_dialog/tgui_act(action, list/params)
- . = ..()
- if (.)
- return
- switch(action)
- if("choose")
- set_choice(params["choice"])
- if(isnull(src.choice))
- return
- SStgui.close_uis(src)
- return TRUE
- if("cancel")
- SStgui.close_uis(src)
- closed = TRUE
- return TRUE
-
-/datum/tgui_input_dialog/proc/set_choice(choice)
- if(input_type == "num")
- src.choice = text2num(choice)
- return
- src.choice = choice
-
-/**
- * # async tgui_text_input
- *
- * An asynchronous version of tgui_text_input to be used with callbacks instead of waiting on user responses.
- */
-/datum/tgui_input_dialog/async
- /// The callback to be invoked by the tgui_text_input upon having a choice made.
- var/datum/callback/callback
-
-/datum/tgui_input_dialog/async/New(mob/user, message, title, default, callback, timeout)
- ..(user, title, message, default, timeout)
- src.callback = callback
-
-/datum/tgui_input_dialog/async/Destroy(force, ...)
- QDEL_NULL(callback)
- . = ..()
-
-/datum/tgui_input_dialog/async/tgui_close(mob/user)
- . = ..()
- qdel(src)
-
-/datum/tgui_input_dialog/async/set_choice(choice)
- . = ..()
- if(!isnull(src.choice))
- callback?.InvokeAsync(src.choice)
-
-/datum/tgui_input_dialog/async/wait()
- return
diff --git a/code/modules/tgui/tgui_window.dm b/code/modules/tgui/tgui_window.dm
index cc8a63ef27b..2e1b64bac14 100644
--- a/code/modules/tgui/tgui_window.dm
+++ b/code/modules/tgui/tgui_window.dm
@@ -18,8 +18,11 @@
var/message_queue
var/sent_assets = list()
// Vars passed to initialize proc (and saved for later)
- var/inline_assets
- var/fancy
+ var/initial_fancy
+ var/initial_assets
+ var/initial_inline_html
+ var/initial_inline_js
+ var/initial_inline_css
/**
* public
@@ -45,21 +48,26 @@
* state. You can begin sending messages right after initializing. Messages
* will be put into the queue until the window finishes loading.
*
- * optional inline_assets list List of assets to inline into the html.
+ * optional assets list List of assets to inline into the html.
* optional inline_html string Custom HTML to inject.
* optional fancy bool If TRUE, will hide the window titlebar.
*/
/datum/tgui_window/proc/initialize(
- inline_assets = list(),
+ fancy = FALSE,
+ assets = list(),
inline_html = "",
- fancy = FALSE)
+ inline_js = "",
+ inline_css = "")
#ifdef TGUI_DEBUGGING
log_tgui(client, "[id]/initiailize ([src])")
#endif
if(!client)
return
- src.inline_assets = inline_assets
- src.fancy = fancy
+ src.initial_fancy = fancy
+ src.initial_assets = assets
+ src.initial_inline_html = inline_html
+ src.initial_inline_js = inline_js
+ src.initial_inline_css = inline_css
status = TGUI_WINDOW_LOADING
fatally_errored = FALSE
// Build window options
@@ -72,9 +80,9 @@
// Generate page html
var/html = SStgui.basehtml
html = replacetextEx(html, "\[tgui:windowId]", id)
- // Inject inline assets
+ // Inject assets
var/inline_assets_str = ""
- for(var/datum/asset/asset in inline_assets)
+ for(var/datum/asset/asset in assets)
var/mappings = asset.get_url_mappings()
for(var/name in mappings)
var/url = mappings[name]
@@ -87,8 +95,17 @@
if(length(inline_assets_str))
inline_assets_str = "\n"
html = replacetextEx(html, "\n", inline_assets_str)
- // Inject custom HTML
- html = replacetextEx(html, "\n", inline_html)
+ // Inject inline HTML
+ if (inline_html)
+ html = replacetextEx(html, "", inline_html)
+ // Inject inline JS
+ if (inline_js)
+ inline_js = ""
+ html = replacetextEx(html, "", inline_js)
+ // Inject inline CSS
+ if (inline_css)
+ inline_css = ""
+ html = replacetextEx(html, "", inline_css)
// Open the window
client << browse(html, "window=[id];[options]")
// Detect whether the control is a browser
@@ -281,6 +298,17 @@
: "[id].browser:update")
message_queue = null
+/**
+ * public
+ *
+ * Replaces the inline HTML content.
+ *
+ * required inline_html string HTML to inject
+ */
+/datum/tgui_window/proc/replace_html(inline_html = "")
+ client << output(url_encode(inline_html), is_browser \
+ ? "[id]:replaceHtml" \
+ : "[id].browser:replaceHtml")
/**
* private
@@ -325,7 +353,12 @@
client << link(href_list["url"])
if("cacheReloaded")
// Reinitialize
- initialize(inline_assets = inline_assets, fancy = fancy)
+ initialize(
+ fancy = initial_fancy,
+ assets = initial_assets,
+ inline_html = initial_inline_html,
+ inline_js = initial_inline_js,
+ inline_css = initial_inline_css)
// Resend the assets
for(var/asset in sent_assets)
send_asset(asset)
\ No newline at end of file
diff --git a/code/modules/tgui/tgui_alert.dm b/code/modules/tgui_input/alert.dm
similarity index 72%
rename from code/modules/tgui/tgui_alert.dm
rename to code/modules/tgui_input/alert.dm
index 4ae15da8862..9b658090b9b 100644
--- a/code/modules/tgui/tgui_alert.dm
+++ b/code/modules/tgui_input/alert.dm
@@ -8,8 +8,9 @@
* * title - The of the alert modal, shown on the top of the TGUI window.
* * buttons - The options that can be chosen by the user, each string is assigned a button on the UI.
* * timeout - The timeout of the alert, after which the modal will close and qdel itself. Set to zero for no timeout.
+ * * autofocus - The bool that controls if this alert should grab window focus.
*/
-/proc/tgui_alert(mob/user, message = null, title = null, list/buttons = list("Ok"), timeout = 0)
+/proc/tgui_alert(mob/user, message = "", title, list/buttons = list("Ok"), timeout = 0, autofocus = TRUE, strict_byond = FALSE)
if (istext(buttons))
stack_trace("tgui_alert() received text for buttons instead of list")
return
@@ -24,7 +25,19 @@
user = client.mob
else
return
- var/datum/tgui_alert/alert = new(user, message, title, buttons, timeout)
+ // A gentle nudge - you should not be using TGUI alert for anything other than a simple message.
+ //if(length(buttons) > 3)
+ // log_tgui(user, "Error: TGUI Alert initiated with too many buttons. Use a list.", "TguiAlert")
+ // return tgui_input_list(user, message, title, buttons, timeout, autofocus)
+
+ // Client does NOT have tgui_input on: Returns regular input
+ if(!user.client.prefs.tgui_input_mode || strict_byond)
+ if(length(buttons) == 2)
+ return alert(user, message, title, buttons[1], buttons[2])
+ if(length(buttons) == 3)
+ return alert(user, message, title, buttons[1], buttons[2], buttons[3])
+
+ var/datum/tgui_alert/alert = new(user, message, title, buttons, timeout, autofocus)
alert.tgui_interact(user)
alert.wait()
if (alert)
@@ -32,37 +45,7 @@
qdel(alert)
/**
- * Creates an asynchronous TGUI alert window with an associated callback.
- *
- * This proc should be used to create alerts that invoke a callback with the user's chosen option.
- * Arguments:
- * * user - The user to show the alert to.
- * * message - The content of the alert, shown in the body of the TGUI window.
- * * title - The of the alert modal, shown on the top of the TGUI window.
- * * buttons - The options that can be chosen by the user, each string is assigned a button on the UI.
- * * callback - The callback to be invoked when a choice is made.
- * * timeout - The timeout of the alert, after which the modal will close and qdel itself. Disabled by default, can be set to seconds otherwise.
- */
-/proc/tgui_alert_async(mob/user, message = null, title = null, list/buttons = list("Ok"), datum/callback/callback, timeout = 0)
- if (istext(buttons))
- stack_trace("tgui_alert() received text for buttons instead of list")
- return
- if (istext(user))
- stack_trace("tgui_alert() received text for user instead of list")
- return
- if (!user)
- user = usr
- if (!istype(user))
- if (istype(user, /client))
- var/client/client = user
- user = client.mob
- else
- return
- var/datum/tgui_alert/async/alert = new(user, message, title, buttons, callback, timeout)
- alert.tgui_interact(user)
-
-/**
- * # tgui_modal
+ * # tgui_alert
*
* Datum used for instantiating and using a TGUI-controlled modal that prompts the user with
* a message and has buttons for responses.
@@ -80,13 +63,16 @@
var/start_time
/// The lifespan of the tgui_modal, after which the window will close and delete itself.
var/timeout
+ /// The bool that controls if this modal should grab window focus
+ var/autofocus
/// Boolean field describing if the tgui_modal was closed by the user.
var/closed
-/datum/tgui_alert/New(mob/user, message, title, list/buttons, timeout)
- src.title = title
- src.message = message
+/datum/tgui_alert/New(mob/user, message, title, list/buttons, timeout, autofocus)
+ src.autofocus = autofocus
src.buttons = buttons.Copy()
+ src.message = message
+ src.title = title
if (timeout)
src.timeout = timeout
start_time = world.time
@@ -118,15 +104,21 @@
/datum/tgui_alert/tgui_state(mob/user)
return GLOB.tgui_always_state
-/datum/tgui_alert/tgui_data(mob/user)
- . = list(
- "title" = title,
- "message" = message,
- "buttons" = buttons
- )
+/datum/tgui_alert/tgui_static_data(mob/user)
+ var/list/data = list()
+ data["autofocus"] = autofocus
+ data["buttons"] = buttons
+ data["message"] = message
+ data["large_buttons"] = user.client.prefs.tgui_large_buttons
+ data["swapped_buttons"] = !user.client.prefs.tgui_swapped_buttons
+ data["title"] = title
+ return data
+/datum/tgui_alert/tgui_data(mob/user)
+ var/list/data = list()
if(timeout)
- .["timeout"] = CLAMP01((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS))
+ data["timeout"] = CLAMP01((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS))
+ return data
/datum/tgui_alert/tgui_act(action, list/params)
. = ..()
@@ -139,10 +131,44 @@
set_choice(params["choice"])
SStgui.close_uis(src)
return TRUE
+ if("cancel")
+ closed = TRUE
+ SStgui.close_uis(src)
+ return TRUE
/datum/tgui_alert/proc/set_choice(choice)
src.choice = choice
+/**
+ * Creates an asynchronous TGUI alert window with an associated callback.
+ *
+ * This proc should be used to create alerts that invoke a callback with the user's chosen option.
+ * Arguments:
+ * * user - The user to show the alert to.
+ * * message - The content of the alert, shown in the body of the TGUI window.
+ * * title - The of the alert modal, shown on the top of the TGUI window.
+ * * buttons - The options that can be chosen by the user, each string is assigned a button on the UI.
+ * * callback - The callback to be invoked when a choice is made.
+ * * timeout - The timeout of the alert, after which the modal will close and qdel itself. Disabled by default, can be set to seconds otherwise.
+ */
+/proc/tgui_alert_async(mob/user, message = "", title, list/buttons = list("Ok"), datum/callback/callback, timeout = 0, autofocus = TRUE)
+ if (istext(buttons))
+ stack_trace("tgui_alert() received text for buttons instead of list")
+ return
+ if (istext(user))
+ stack_trace("tgui_alert() received text for user instead of list")
+ return
+ if (!user)
+ user = usr
+ if (!istype(user))
+ if (istype(user, /client))
+ var/client/client = user
+ user = client.mob
+ else
+ return
+ var/datum/tgui_alert/async/alert = new(user, message, title, buttons, callback, timeout, autofocus)
+ alert.tgui_interact(user)
+
/**
* # async tgui_modal
*
@@ -152,8 +178,8 @@
/// The callback to be invoked by the tgui_modal upon having a choice made.
var/datum/callback/callback
-/datum/tgui_alert/async/New(mob/user, message, title, list/buttons, callback, timeout)
- ..(user, message, title, buttons, timeout)
+/datum/tgui_alert/async/New(mob/user, message, title, list/buttons, callback, timeout, autofocus)
+ ..(user, message, title, buttons, timeout, autofocus)
src.callback = callback
/datum/tgui_alert/async/Destroy(force, ...)
diff --git a/code/modules/tgui/tgui_input_list.dm b/code/modules/tgui_input/list.dm
similarity index 68%
rename from code/modules/tgui/tgui_input_list.dm
rename to code/modules/tgui_input/list.dm
index 8b1af90196d..c079f0be744 100644
--- a/code/modules/tgui/tgui_input_list.dm
+++ b/code/modules/tgui_input/list.dm
@@ -6,17 +6,18 @@
* * user - The user to show the input box to.
* * message - The content of the input box, shown in the body of the TGUI window.
* * title - The title of the input box, shown on the top of the TGUI window.
- * * buttons - The options that can be chosen by the user, each string is assigned a button on the UI.
+ * * items - The options that can be chosen by the user, each string is assigned a button on the UI.
* * default - The option with this value will be selected on first paint of the TGUI window.
* * timeout - The timeout of the input box, after which the input box will close and qdel itself. Set to zero for no timeout.
+ * * strict_modern - Disabled the preference check of the input box, only allowing the TGUI window to show.
*/
-/proc/tgui_input_list(mob/user, message, title, list/buttons, default, timeout = 0)
+/proc/tgui_input_list(mob/user, message, title = "Select", list/items, default, timeout = 0, strict_modern = FALSE)
if (istext(user))
stack_trace("tgui_alert() received text for user instead of mob")
return
if (!user)
user = usr
- if(!length(buttons))
+ if(!length(items))
return
if (!istype(user))
if (istype(user, /client))
@@ -24,43 +25,16 @@
user = client.mob
else
return
- var/datum/tgui_list_input/input = new(user, message, title, buttons, default, timeout)
+ /// Client does NOT have tgui_input on: Returns regular input
+ if(!user.client.prefs.tgui_input_mode && !strict_modern)
+ return input(user, message, title, default) as null|anything in items
+ var/datum/tgui_list_input/input = new(user, message, title, items, default, timeout)
input.tgui_interact(user)
input.wait()
if (input)
. = input.choice
qdel(input)
-/**
- * Creates an asynchronous TGUI input list window with an associated callback.
- *
- * This proc should be used to create inputs that invoke a callback with the user's chosen option.
- * Arguments:
- * * user - The user to show the input box to.
- * * message - The content of the input box, shown in the body of the TGUI window.
- * * title - The title of the input box, shown on the top of the TGUI window.
- * * buttons - The options that can be chosen by the user, each string is assigned a button on the UI.
- * * default - The option with this value will be selected on first paint of the TGUI window.
- * * callback - The callback to be invoked when a choice is made.
- * * timeout - The timeout of the input box, after which the menu will close and qdel itself. Set to zero for no timeout.
- */
-/proc/tgui_input_list_async(mob/user, message, title, list/buttons, default, datum/callback/callback, timeout = 60 SECONDS)
- if (istext(user))
- stack_trace("tgui_alert() received text for user instead of mob")
- return
- if (!user)
- user = usr
- if(!length(buttons))
- return
- if (!istype(user))
- if (istype(user, /client))
- var/client/client = user
- user = client.mob
- else
- return
- var/datum/tgui_list_input/async/input = new(user, message, title, buttons, default, callback, timeout)
- input.tgui_interact(user)
-
/**
* # tgui_list_input
*
@@ -72,14 +46,14 @@
var/title
/// The textual body of the TGUI window
var/message
- /// The list of buttons (responses) provided on the TGUI window
- var/list/buttons
- /// Buttons (strings specifically) mapped to the actual value (e.g. a mob or a verb)
- var/list/buttons_map
- /// Value of the button that should be pre-selected on first paint.
- var/initial
+ /// The list of items (responses) provided on the TGUI window
+ var/list/items
+ /// Items (strings specifically) mapped to the actual value (e.g. a mob or a verb)
+ var/list/items_map
/// The button that the user has pressed, null if no selection has been made
var/choice
+ /// The default item to be selected
+ var/default
/// The time at which the tgui_list_input was created, for displaying timeout progress.
var/start_time
/// The lifespan of the tgui_list_input, after which the window will close and delete itself.
@@ -87,29 +61,29 @@
/// Boolean field describing if the tgui_list_input was closed by the user.
var/closed
-/datum/tgui_list_input/New(mob/user, message, title, list/buttons, default, timeout)
+/datum/tgui_list_input/New(mob/user, message, title, list/items, default, timeout)
src.title = title
src.message = message
- src.buttons = list()
- src.buttons_map = list()
- src.initial = default
- var/list/repeat_buttons = list()
+ src.items = list()
+ src.items_map = list()
+ src.default = default
+ var/list/repeat_items = list()
// Gets rid of illegal characters
var/static/regex/whitelistedWords = regex(@{"([^\u0020-\u8000]+)"})
- for(var/i in buttons)
+ for(var/i in items)
if(isnull(i))
- stack_trace("Null in a tgui_input_list() buttons")
+ stack_trace("Null in a tgui_input_list() items")
continue
var/string_key = whitelistedWords.Replace("[i]", "")
//avoids duplicated keys E.g: when areas have the same name
- string_key = avoid_assoc_duplicate_keys(string_key, repeat_buttons)
+ string_key = avoid_assoc_duplicate_keys(string_key, repeat_items)
- src.buttons += string_key
- src.buttons_map[string_key] = i
+ src.items += string_key
+ src.items_map[string_key] = i
if (timeout)
@@ -119,7 +93,7 @@
/datum/tgui_list_input/Destroy(force, ...)
SStgui.close_uis(src)
- QDEL_NULL(buttons)
+ QDEL_NULL(items)
. = ..()
/**
@@ -133,7 +107,7 @@
/datum/tgui_list_input/tgui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
- ui = new(user, src, "ListInput")
+ ui = new(user, src, "ListInputModal")
ui.open()
/datum/tgui_list_input/tgui_close(mob/user)
@@ -144,27 +118,31 @@
return GLOB.tgui_always_state
/datum/tgui_list_input/tgui_static_data(mob/user)
- . = list(
- "title" = title,
- "message" = message,
- "buttons" = buttons,
- "initial" = initial
- )
+ var/list/data = list()
+ data["init_value"] = default || items[1]
+ data["items"] = items
+ data["large_buttons"] = user.client.prefs.tgui_large_buttons
+ data["message"] = message
+ data["swapped_buttons"] = !user.client.prefs.tgui_swapped_buttons
+ data["title"] = title
+ return data
/datum/tgui_list_input/tgui_data(mob/user)
- . = list()
+ var/list/data = list()
if(timeout)
- .["timeout"] = clamp((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS), 0, 1)
+ data["timeout"] = clamp((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS), 0, 1)
+ return data
/datum/tgui_list_input/tgui_act(action, list/params)
. = ..()
if (.)
return
switch(action)
- if("choose")
- if (!(params["choice"] in buttons))
+ if("submit")
+ if (!(params["entry"] in items))
return
- set_choice(buttons_map[params["choice"]])
+ set_choice(items_map[params["entry"]])
+ closed = TRUE
SStgui.close_uis(src)
return TRUE
if("cancel")
@@ -175,6 +153,36 @@
/datum/tgui_list_input/proc/set_choice(choice)
src.choice = choice
+/**
+ * Creates an asynchronous TGUI input list window with an associated callback.
+ *
+ * This proc should be used to create inputs that invoke a callback with the user's chosen option.
+ * Arguments:
+ * * user - The user to show the input box to.
+ * * message - The content of the input box, shown in the body of the TGUI window.
+ * * title - The title of the input box, shown on the top of the TGUI window.
+ * * items - The options that can be chosen by the user, each string is assigned a button on the UI.
+ * * default - The option with this value will be selected on first paint of the TGUI window.
+ * * callback - The callback to be invoked when a choice is made.
+ * * timeout - The timeout of the input box, after which the menu will close and qdel itself. Set to zero for no timeout.
+ */
+/proc/tgui_input_list_async(mob/user, message, title, list/items, default, datum/callback/callback, timeout = 60 SECONDS)
+ if (istext(user))
+ stack_trace("tgui_alert() received text for user instead of mob")
+ return
+ if (!user)
+ user = usr
+ if(!length(items))
+ return
+ if (!istype(user))
+ if (istype(user, /client))
+ var/client/client = user
+ user = client.mob
+ else
+ return
+ var/datum/tgui_list_input/async/input = new(user, message, title, items, default, callback, timeout)
+ input.tgui_interact(user)
+
/**
* # async tgui_list_input
*
@@ -184,8 +192,8 @@
/// The callback to be invoked by the tgui_list_input upon having a choice made.
var/datum/callback/callback
-/datum/tgui_list_input/async/New(mob/user, message, title, list/buttons, default, callback, timeout)
- ..(user, title, message, buttons, default, timeout)
+/datum/tgui_list_input/async/New(mob/user, message, title, list/items, default, callback, timeout)
+ ..(user, title, message, items, default, timeout)
src.callback = callback
/datum/tgui_list_input/async/Destroy(force, ...)
diff --git a/code/modules/tgui_input/number.dm b/code/modules/tgui_input/number.dm
new file mode 100644
index 00000000000..4aadb5edc1e
--- /dev/null
+++ b/code/modules/tgui_input/number.dm
@@ -0,0 +1,211 @@
+/**
+ * Creates a TGUI window with a number input. Returns the user's response as num | null.
+ *
+ * This proc should be used to create windows for number entry that the caller will wait for a response from.
+ * If tgui fancy chat is turned off: Will return a normal input. If a max or min value is specified, will
+ * validate the input inside the UI and ui_act.
+ *
+ * Arguments:
+ * * user - The user to show the number input to.
+ * * message - The content of the number input, shown in the body of the TGUI window.
+ * * title - The title of the number input modal, shown on the top of the TGUI window.
+ * * default - The default (or current) value, shown as a placeholder. Users can press refresh with this.
+ * * max_value - Specifies a maximum value. If none is set, any number can be entered. Pressing "max" defaults to 1000.
+ * * min_value - Specifies a minimum value. Often 0.
+ * * timeout - The timeout of the number input, after which the modal will close and qdel itself. Set to zero for no timeout.
+ * * round_value - whether the inputted number is rounded down into an integer.
+ */
+/proc/tgui_input_number(mob/user, message, title = "Number Input", default = 0, max_value = INFINITY, min_value = -INFINITY, timeout = 0, round_value = FALSE)
+ if (!user)
+ user = usr
+ if (!istype(user))
+ if (istype(user, /client))
+ var/client/client = user
+ user = client.mob
+ else
+ return
+ // Client does NOT have tgui_input on: Returns regular input
+ if(!user.client.prefs.tgui_input_mode)
+ var/input_number = input(user, message, title, default) as null|num
+ return clamp(round_value ? round(input_number) : input_number, min_value, max_value)
+ var/datum/tgui_input_number/number_input = new(user, message, title, default, max_value, min_value, timeout, round_value)
+ number_input.tgui_interact(user)
+ number_input.wait()
+ if (number_input)
+ . = number_input.entry
+ qdel(number_input)
+
+/**
+ * # tgui_input_number
+ *
+ * Datum used for instantiating and using a TGUI-controlled number input that prompts the user with
+ * a message and has an input for number entry.
+ */
+/datum/tgui_input_number
+ /// Boolean field describing if the tgui_input_number was closed by the user.
+ var/closed
+ /// The default (or current) value, shown as a default. Users can press reset with this.
+ var/default
+ /// The entry that the user has return_typed in.
+ var/entry
+ /// The maximum value that can be entered.
+ var/max_value
+ /// The prompt's body, if any, of the TGUI window.
+ var/message
+ /// The minimum value that can be entered.
+ var/min_value
+ /// Whether the submitted number is rounded down into an integer.
+ var/round_value
+ /// The time at which the number input was created, for displaying timeout progress.
+ var/start_time
+ /// The lifespan of the number input, after which the window will close and delete itself.
+ var/timeout
+ /// The title of the TGUI window
+ var/title
+
+/datum/tgui_input_number/New(mob/user, message, title, default, max_value, min_value, timeout, round_value)
+ src.default = default
+ src.max_value = max_value
+ src.message = message
+ src.min_value = min_value
+ src.title = title
+ src.round_value = round_value
+ if (timeout)
+ src.timeout = timeout
+ start_time = world.time
+ QDEL_IN(src, timeout)
+ /// Checks for empty numbers - bank accounts, etc.
+ if(max_value == 0)
+ src.min_value = 0
+ if(default)
+ src.default = 0
+ /// Sanity check
+ if(default < min_value)
+ src.default = min_value
+ if(default > max_value)
+ CRASH("Default value is greater than max value.")
+
+/datum/tgui_input_number/Destroy(force, ...)
+ SStgui.close_uis(src)
+ return ..()
+
+/**
+ * Waits for a user's response to the tgui_input_number's prompt before returning. Returns early if
+ * the window was closed by the user.
+ */
+/datum/tgui_input_number/proc/wait()
+ while (!entry && !closed && !QDELETED(src))
+ stoplag(1)
+
+/datum/tgui_input_number/tgui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "NumberInputModal")
+ ui.open()
+
+/datum/tgui_input_number/tgui_close(mob/user)
+ . = ..()
+ closed = TRUE
+
+/datum/tgui_input_number/tgui_state(mob/user)
+ return GLOB.tgui_always_state
+
+/datum/tgui_input_number/tgui_static_data(mob/user)
+ var/list/data = list()
+ data["init_value"] = default // Default is a reserved keyword
+ data["large_buttons"] = user.client.prefs.tgui_large_buttons
+ data["max_value"] = max_value
+ data["message"] = message
+ data["min_value"] = min_value
+ data["swapped_buttons"] = !user.client.prefs.tgui_swapped_buttons
+ data["title"] = title
+ return data
+
+/datum/tgui_input_number/tgui_data(mob/user)
+ var/list/data = list()
+ if(timeout)
+ data["timeout"] = CLAMP01((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS))
+ return data
+
+/datum/tgui_input_number/tgui_act(action, list/params)
+ . = ..()
+ if (.)
+ return
+ switch(action)
+ if("submit")
+ if(!isnum(params["entry"]))
+ CRASH("A non number was input into tgui input number by [usr]")
+ //var/choice = round_value ? round(params["entry"]) : params["entry"]
+ var/choice = params["entry"]
+ if(choice > max_value)
+ CRASH("A number greater than the max value was input into tgui input number by [usr]")
+ if(choice < min_value)
+ CRASH("A number less than the min value was input into tgui input number by [usr]")
+ set_entry(choice)
+ closed = TRUE
+ SStgui.close_uis(src)
+ return TRUE
+ if("cancel")
+ closed = TRUE
+ SStgui.close_uis(src)
+ return TRUE
+
+/datum/tgui_input_number/proc/set_entry(entry)
+ src.entry = entry
+
+/**
+ * Creates an asynchronous TGUI input num window with an associated callback.
+ *
+ * This proc should be used to create inputs that invoke a callback with the user's chosen option.
+ * Arguments:
+ * * user - The user to show the input box to.
+ * * message - The content of the input box, shown in the body of the TGUI window.
+ * * title - The title of the input box, shown on the top of the TGUI window.
+ * * default - The default value pre-populated in the input box.
+ * * callback - The callback to be invoked when a choice is made.
+ * * timeout - The timeout of the input box, after which the menu will close and qdel itself. Set to zero for no timeout.
+ * * round_value - whether the inputted number is rounded down into an integer.
+ */
+/proc/tgui_input_number_async(mob/user, message, title, default, datum/callback/callback, timeout = 60 SECONDS, round_value = FALSE)
+ if (istext(user))
+ stack_trace("tgui_input_num_async() received text for user instead of mob")
+ return
+ if (!user)
+ user = usr
+ if (!istype(user))
+ if (istype(user, /client))
+ var/client/client = user
+ user = client.mob
+ else
+ return
+ var/datum/tgui_input_number/async/input = new(user, message, title, default, callback, timeout, round_value)
+ input.tgui_interact(user)
+
+/**
+ * # async tgui_text_input
+ *
+ * An asynchronous version of tgui_text_input to be used with callbacks instead of waiting on user responses.
+ */
+/datum/tgui_input_number/async
+ /// The callback to be invoked by the tgui_text_input upon having a choice made.
+ var/datum/callback/callback
+
+/datum/tgui_input_number/async/New(mob/user, message, title, default, callback, timeout, round_value)
+ ..(user, title, message, default, timeout, round_value)
+ src.callback = callback
+
+/datum/tgui_input_number/async/Destroy(force, ...)
+ QDEL_NULL(callback)
+ . = ..()
+
+/datum/tgui_input_number/async/tgui_close(mob/user)
+ . = ..()
+ qdel(src)
+
+/datum/tgui_input_number/async/set_entry(entry)
+ . = ..()
+ if(!isnull(src.entry))
+ callback?.InvokeAsync(src.entry)
+
+/datum/tgui_input_number/async/wait()
+ return
\ No newline at end of file
diff --git a/code/modules/tgui_input/text.dm b/code/modules/tgui_input/text.dm
new file mode 100644
index 00000000000..f115fdde63c
--- /dev/null
+++ b/code/modules/tgui_input/text.dm
@@ -0,0 +1,214 @@
+/**
+ * Creates a TGUI window with a text input. Returns the user's response.
+ *
+ * This proc should be used to create windows for text entry that the caller will wait for a response from.
+ * If tgui fancy chat is turned off: Will return a normal input. If max_length is specified, will return
+ * stripped_multiline_input.
+ *
+ * Arguments:
+ * * user - The user to show the text input to.
+ * * message - The content of the text input, shown in the body of the TGUI window.
+ * * title - The title of the text input modal, shown on the top of the TGUI window.
+ * * default - The default (or current) value, shown as a placeholder.
+ * * max_length - Specifies a max length for input. MAX_MESSAGE_LEN is default (4096)
+ * * multiline - Bool that determines if the input box is much larger. Good for large messages, laws, etc.
+ * * encode - Toggling this determines if input is filtered via html_encode. Setting this to FALSE gives raw input.
+ * * timeout - The timeout of the textbox, after which the modal will close and qdel itself. Set to zero for no timeout.
+ */
+/proc/tgui_input_text(mob/user, message = "", title = "Text Input", default, max_length = INFINITY, multiline = FALSE, encode = FALSE, timeout = 0, prevent_enter = FALSE)
+ if (istext(user))
+ stack_trace("tgui_input_text() received text for user instead of mob")
+ return
+ if (!user)
+ user = usr
+ if (!istype(user))
+ if (istype(user, /client))
+ var/client/client = user
+ user = client.mob
+ else
+ return
+ // Client does NOT have tgui_input on: Returns regular input
+ if(!user.client.prefs.tgui_input_mode)
+ if(encode)
+ if(multiline)
+ return stripped_multiline_input(user, message, title, default, max_length)
+ else
+ return stripped_input(user, message, title, default, max_length)
+ else
+ if(multiline)
+ return input(user, message, title, default) as message|null
+ else
+ return input(user, message, title, default) as text|null
+ var/datum/tgui_input_text/text_input = new(user, message, title, default, max_length, multiline, encode, timeout, prevent_enter)
+ text_input.tgui_interact(user)
+ text_input.wait()
+ if (text_input)
+ . = text_input.entry
+ qdel(text_input)
+
+/**
+ * tgui_input_text
+ *
+ * Datum used for instantiating and using a TGUI-controlled text input that prompts the user with
+ * a message and has an input for text entry.
+ */
+/datum/tgui_input_text
+ /// Boolean field describing if the tgui_input_text was closed by the user.
+ var/closed
+ /// The default (or current) value, shown as a default.
+ var/default
+ /// Whether the input should be stripped using html_encode
+ var/encode
+ /// The entry that the user has return_typed in.
+ var/entry
+ /// The maximum length for text entry
+ var/max_length
+ /// The prompt's body, if any, of the TGUI window.
+ var/message
+ /// Multiline input for larger input boxes.
+ var/multiline
+ /// The time at which the text input was created, for displaying timeout progress.
+ var/start_time
+ /// The lifespan of the text input, after which the window will close and delete itself.
+ var/timeout
+ /// The title of the TGUI window
+ var/title
+
+ var/prevent_enter
+
+/datum/tgui_input_text/New(mob/user, message, title, default, max_length, multiline, encode, timeout, prevent_enter)
+ src.default = default
+ src.encode = encode
+ src.max_length = max_length
+ src.message = message
+ src.multiline = multiline
+ src.title = title
+ if (timeout)
+ src.timeout = timeout
+ start_time = world.time
+ QDEL_IN(src, timeout)
+ src.prevent_enter = prevent_enter
+
+/datum/tgui_input_text/Destroy(force, ...)
+ SStgui.close_uis(src)
+ . = ..()
+
+/**
+ * Waits for a user's response to the tgui_text_input's prompt before returning. Returns early if
+ * the window was closed by the user.
+ */
+/datum/tgui_input_text/proc/wait()
+ while (!entry && !closed)
+ stoplag(1)
+
+/datum/tgui_input_text/tgui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "TextInputModal")
+ ui.open()
+
+/datum/tgui_input_text/tgui_close(mob/user)
+ . = ..()
+ closed = TRUE
+
+/datum/tgui_input_text/tgui_state(mob/user)
+ return GLOB.tgui_always_state
+
+/datum/tgui_input_text/tgui_static_data(mob/user)
+ var/list/data = list()
+ data["large_buttons"] = user.client.prefs.tgui_large_buttons
+ data["max_length"] = max_length
+ data["message"] = message
+ data["multiline"] = multiline
+ data["placeholder"] = default // Default is a reserved keyword
+ data["swapped_buttons"] = !user.client.prefs.tgui_swapped_buttons
+ data["title"] = title
+ data["prevent_enter"] = prevent_enter
+ return data
+
+/datum/tgui_input_text/tgui_data(mob/user)
+ var/list/data = list()
+ if(timeout)
+ data["timeout"] = clamp((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS), 0, 1)
+ return data
+
+/datum/tgui_input_text/tgui_act(action, list/params)
+ . = ..()
+ if (.)
+ return
+ switch(action)
+ if("submit")
+ if(length(params["entry"]) > max_length)
+ return
+ if(encode && (length(html_encode(params["entry"])) > max_length))
+ to_chat(usr, span_notice("Your message was clipped due to special character usage."))
+ set_entry(params["entry"])
+ closed = TRUE
+ SStgui.close_uis(src)
+ return TRUE
+ if("cancel")
+ SStgui.close_uis(src)
+ closed = TRUE
+ return TRUE
+
+/datum/tgui_input_text/proc/set_entry(entry)
+ if(!isnull(entry))
+ var/converted_entry = encode ? html_encode(entry) : entry
+ //converted_entry = readd_quotes(converted_entry)
+ src.entry = trim(converted_entry, max_length)
+
+/**
+ * Creates an asynchronous TGUI input text window with an associated callback.
+ *
+ * This proc should be used to create inputs that invoke a callback with the user's chosen option.
+ * Arguments:
+ * * user - The user to show the input box to.
+ * * message - The content of the input box, shown in the body of the TGUI window.
+ * * title - The title of the input box, shown on the top of the TGUI window.
+ * * default - The default value pre-populated in the input box.
+ * * callback - The callback to be invoked when a choice is made.
+ * * timeout - The timeout of the input box, after which the menu will close and qdel itself. Set to zero for no timeout.
+ */
+/proc/tgui_input_text_async(mob/user, message, title, default, datum/callback/callback, max_length, multiline, encode, timeout = 60 SECONDS)
+ if (istext(user))
+ stack_trace("tgui_input_text_async() received text for user instead of mob")
+ return
+ if (!user)
+ user = usr
+ if (!istype(user))
+ if (istype(user, /client))
+ var/client/client = user
+ user = client.mob
+ else
+ return
+ var/datum/tgui_input_text/async/input = new(user, message, title, default, callback, max_length, multiline, encode, timeout)
+ input.tgui_interact(user)
+
+/**
+ * # async tgui_text_input
+ *
+ * An asynchronous version of tgui_text_input to be used with callbacks instead of waiting on user responses.
+ */
+/datum/tgui_input_text/async
+ /// The callback to be invoked by the tgui_text_input upon having a choice made.
+ var/datum/callback/callback
+
+/datum/tgui_input_text/async/New(mob/user, message, title, default, callback, max_length, multiline, encode, timeout)
+ ..(user, title, message, default, max_length, multiline, encode, timeout)
+ src.callback = callback
+
+/datum/tgui_input_text/async/Destroy(force, ...)
+ QDEL_NULL(callback)
+ . = ..()
+
+/datum/tgui_input_text/async/tgui_close(mob/user)
+ . = ..()
+ qdel(src)
+
+/datum/tgui_input_text/async/set_entry(entry)
+ . = ..()
+ if(!isnull(src.entry))
+ callback?.InvokeAsync(src.entry)
+
+/datum/tgui_input_text/async/wait()
+ return
diff --git a/code/modules/tooltip/tooltip.html b/code/modules/tooltip/tooltip.html
index 67fb8a77f10..77ac63c1a96 100644
--- a/code/modules/tooltip/tooltip.html
+++ b/code/modules/tooltip/tooltip.html
@@ -217,8 +217,13 @@
$wrap.width($wrap.width() + 2); //Dumb hack to fix a bizarre sizing bug
- var docWidth = $wrap.outerWidth(),
- docHeight = $wrap.outerHeight();
+ var pixelRatio = 1;
+ if (window.devicePixelRatio) {
+ pixelRatio = window.devicePixelRatio;
+ }
+
+ var docWidth = Math.floor($wrap.outerWidth() * pixelRatio),
+ docHeight = Math.floor($wrap.outerHeight() * pixelRatio);
if (posY + docHeight > map.size.y) { //Is the bottom edge below the window? Snap it up if so
posY = (posY - docHeight) - realIconSize - tooltip.padding;
diff --git a/code/modules/vchat/css/ss13styles.css b/code/modules/vchat/css/ss13styles.css
index 79a1ddce593..9906041588e 100644
--- a/code/modules/vchat/css/ss13styles.css
+++ b/code/modules/vchat/css/ss13styles.css
@@ -90,6 +90,8 @@ body.inverted {
.pm .other {color: #0000ff;}
/* Admin: Channels */
+.mentor {color: #808000;}
+.mentor_channel {color: #808000; font-weight: bold;}
.mod_channel {color: #735638; font-weight: bold;}
.mod_channel .admin {color: #b82e00; font-weight: bold;}
.admin_channel {color: #9611D4; font-weight: bold;}
@@ -157,11 +159,13 @@ h1.alert, h2.alert {color: #000000;}
.skrell {color: #00B0B3;}
.skrellfar {color: #70FCFF;}
.soghun {color: #50BA6C;}
-.solcom {color: #22228B;}
+.solcom {color: #3333CE;} /* VOREStation Edit */
.changeling {color: #800080;}
.sergal {color: #0077FF;}
.birdsongc {color: #CC9900;}
.vulpkanin {color: #B97A57;}
+.tavan {color: #f54298; font-family: Arial}
+.echosong {color: #826D8C;}
.enochian {color: #848A33; letter-spacing:-1pt; word-spacing:4pt; font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;}
.daemon {color: #5E339E; letter-spacing:-1pt; word-spacing:0pt; font-family: "Courier New", Courier, monospace;}
.drudakar {color: #bb2463; word-spacing:0pt; font-family: "High Tower Text", monospace;}
@@ -176,7 +180,6 @@ h1.alert, h2.alert {color: #000000;}
.interface {color: #330033;}
.spacer {color: #9c660b;} /* VOREStation Add */
.blob {color: #ff950d; font-weight: bold; font-style: italic;}
-.tavan {color: #f54298; font-family: Arial}
.black {color: #000000;}
.darkgray {color: #808080;}
diff --git a/code/modules/vchat/js/vchat.js b/code/modules/vchat/js/vchat.js
index 91c7d1a5016..a90c9448b32 100644
--- a/code/modules/vchat/js/vchat.js
+++ b/code/modules/vchat/js/vchat.js
@@ -194,6 +194,14 @@ function start_vue() {
admin: false
},
//VOREStation Add End
+ {
+ matches: ".mentor_channel, .mentor",
+ becomes: "vc_mentor",
+ pretty: "Mentor messages",
+ tooltip: "Mentorchat and mentor pms",
+ required: false,
+ admin: false
+ },
{
matches: ".filter_pm, .pm",
becomes: "vc_adminpm",
diff --git a/code/modules/vchat/vchat_client.dm b/code/modules/vchat/vchat_client.dm
index a918c94cde5..0f5ef6a14b2 100644
--- a/code/modules/vchat/vchat_client.dm
+++ b/code/modules/vchat/vchat_client.dm
@@ -161,6 +161,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic
update_vis()
spawn()
+ if(owner.is_preference_enabled(/datum/client_preference/vchat_enable))
tgui_alert_async(owner,"VChat didn't load after some time. Switching to use oldchat as a fallback. Try using 'Reload VChat' verb in OOC verbs, or reconnecting to try again.")
//Provide the JS with who we are
@@ -315,7 +316,7 @@ GLOBAL_LIST_EMPTY(bicon_cache) // Cache of the tag results, not the icons
if(use_class)
class = "class='icon [A.icon_state] [custom_classes]'"
- return " "
+ return " "
//Checks if the message content is a valid to_chat message
/proc/is_valid_tochat_message(message)
diff --git a/code/modules/ventcrawl/ventcrawl.dm b/code/modules/ventcrawl/ventcrawl.dm
index d4361980171..effd283c135 100644
--- a/code/modules/ventcrawl/ventcrawl.dm
+++ b/code/modules/ventcrawl/ventcrawl.dm
@@ -38,6 +38,15 @@ var/list/ventcrawl_machinery = list(
if(buckled)
to_chat(src, "You cannot ventcrawl while buckled!")
return FALSE
+ if(restrict_vore_ventcrawl)
+ var/foundstuff = FALSE
+ for(var/obj/belly/B in vore_organs)
+ if(B.contents.len)
+ foundstuff = TRUE
+ break
+ if(foundstuff)
+ to_chat(src, "You cannot ventcrawl while full!")
+ return FALSE
return ventcrawl_carry()
/mob/living/Login()
diff --git a/code/modules/virus2/admin.dm b/code/modules/virus2/admin.dm
index dd9ae7ead77..5ca289bd2ab 100644
--- a/code/modules/virus2/admin.dm
+++ b/code/modules/virus2/admin.dm
@@ -129,12 +129,12 @@
s_multiplier[stage] = max(1, round(initial(E.maxm)/2))
else if(href_list["chance"])
var/datum/disease2/effect/Eff = s[stage]
- var/I = input(usr, "Chance, per tick, of this effect happening (min 0, max [initial(Eff.chance_maxm)])", "Effect Chance", s_chance[stage]) as null|num
+ var/I = tgui_input_number(usr, "Chance, per tick, of this effect happening (min 0, max [initial(Eff.chance_maxm)])", "Effect Chance", s_chance[stage], initial(Eff.chance_maxm), 0)
if(I == null || I < 0 || I > initial(Eff.chance_maxm)) return
s_chance[stage] = I
else if(href_list["multiplier"])
var/datum/disease2/effect/Eff = s[stage]
- var/I = input(usr, "Multiplier for this effect (min 1, max [initial(Eff.maxm)])", "Effect Multiplier", s_multiplier[stage]) as null|num
+ var/I = tgui_input_number(usr, "Multiplier for this effect (min 1, max [initial(Eff.maxm)])", "Effect Multiplier", s_multiplier[stage], initial(Eff.maxm), 1)
if(I == null || I < 1 || I > initial(Eff.maxm)) return
s_multiplier[stage] = I
if("species")
@@ -150,7 +150,7 @@
if(!infectee.species || !(infectee.species.get_bodytype() in species))
infectee = null
if("ichance")
- var/I = input(usr, "Input infection chance", "Infection Chance", infectionchance) as null|num
+ var/I = tgui_input_number(usr, "Input infection chance", "Infection Chance", infectionchance)
if(!I) return
infectionchance = I
if("stype")
@@ -158,7 +158,7 @@
if(!S) return
spreadtype = S
if("speed")
- var/S = input(usr, "Input speed", "Speed", speed) as null|num
+ var/S = tgui_input_number(usr, "Input speed", "Speed", speed)
if(!S) return
speed = S
if("antigen")
@@ -172,7 +172,7 @@
else if(href_list["reset"])
antigens = list()
if("resistance")
- var/S = input(usr, "Input % resistance to antibiotics", "Resistance", resistance) as null|num
+ var/S = tgui_input_number(usr, "Input % resistance to antibiotics", "Resistance", resistance)
if(!S) return
resistance = S
if("infectee")
diff --git a/code/modules/virus2/biohazard destroyer.dm b/code/modules/virus2/biohazard destroyer.dm
index eabb3f8c620..fe5bb7c8538 100644
--- a/code/modules/virus2/biohazard destroyer.dm
+++ b/code/modules/virus2/biohazard destroyer.dm
@@ -17,4 +17,4 @@
I.loc = src.loc
for(var/mob/O in hearers(src, null))
- O.show_message("[bicon(src)] The [src.name] beeps.", 2)
\ No newline at end of file
+ O.show_message("\icon[src][bicon(src)] The [src.name] beeps.", 2)
\ No newline at end of file
diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm
index c51ede2525c..b7ecd8905b7 100644
--- a/code/modules/virus2/items_devices.dm
+++ b/code/modules/virus2/items_devices.dm
@@ -31,7 +31,7 @@
report("Antibodies detected: [antigens2string(C.antibodies)]", user)
/obj/item/device/antibody_scanner/proc/report(var/text, mob/user as mob)
- to_chat(user, "[bicon(src)] \The [src] beeps, \"[text]\"")
+ to_chat(user, "\icon[src][bicon(src)] \The [src] beeps, \"[text]\"")
///////////////VIRUS DISH///////////////
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index 554dac57f16..ee11c505b57 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -16,12 +16,15 @@
desc = "It's a belly! You're in it!" // Flavor text description of inside sight/sound/smells/feels.
var/vore_sound = "Gulp" // Sound when ingesting someone
var/vore_verb = "ingest" // Verb for eating with this in messages
+ var/release_verb = "expels" // Verb for releasing something from a stomach
var/human_prey_swallow_time = 100 // Time in deciseconds to swallow /mob/living/carbon/human
var/nonhuman_prey_swallow_time = 30 // Time in deciseconds to swallow anything else
var/nutrition_percent = 100 // Nutritional percentage per tick in digestion mode
var/digest_brute = 0.5 // Brute damage per tick in digestion mode
var/digest_burn = 0.5 // Burn damage per tick in digestion mode
var/digest_oxy = 0 // Oxy damage per tick in digestion mode
+ var/digest_tox = 0 // Toxins damage per tick in digestion mode
+ var/digest_clone = 0 // Clone damage per tick in digestion mode
var/immutable = FALSE // Prevents this belly from being deleted
var/escapable = FALSE // Belly can be resisted out of at any time
var/escapetime = 20 SECONDS // Deciseconds, how long to escape this belly
@@ -30,6 +33,7 @@
var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles.
var/transferchance = 0 // % Chance of prey being trasnsfered, goes from 0-100%
var/transferchance_secondary = 0 // % Chance of prey being transfered to transferchance_secondary, also goes 0-100%
+ var/save_digest_mode = TRUE // Whether this belly's digest mode persists across rounds
var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone.
var/bulge_size = 0.25 // The minimum size the prey has to be in order to show up on examine.
var/display_absorbed_examine = FALSE // Do we display absorption examine messages for this belly at all?
@@ -49,6 +53,7 @@
var/emote_time = 60 // How long between stomach emotes at prey (in seconds)
var/emote_active = TRUE // Are we even giving emotes out at all or not?
var/next_emote = 0 // When we're supposed to print our next emote, as a world.time
+ var/selective_preference = DM_DIGEST // Which type of selective bellymode do we default to?
// Generally just used by AI
var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location
@@ -57,7 +62,7 @@
//I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere.
//Actual full digest modes
- var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_EGG)
+ var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_SELECT,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_EGG)
//Digest mode addon flags
var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS, "Muffles" = DM_FLAG_THICKBELLY, "Affect Worn Items" = DM_FLAG_AFFECTWORN, "Jams Sensors" = DM_FLAG_JAMSENSORS, "Complete Absorb" = DM_FLAG_FORCEPSAY)
//Item related modes
@@ -157,61 +162,71 @@
//For serialization, keep this updated, required for bellies to save correctly.
/obj/belly/vars_to_save()
- return ..() + list(
- "name",
- "desc",
- "absorbed_desc",
- "vore_sound",
- "vore_verb",
- "human_prey_swallow_time",
- "nonhuman_prey_swallow_time",
- "emote_time",
- "nutrition_percent",
- "digest_brute",
- "digest_burn",
- "digest_oxy",
- "immutable",
- "can_taste",
- "escapable",
- "escapetime",
- "digestchance",
- "absorbchance",
- "escapechance",
- "transferchance",
- "transferchance_secondary",
- "transferlocation",
- "transferlocation_secondary",
- "bulge_size",
- "display_absorbed_examine",
- "shrink_grow_size",
- "struggle_messages_outside",
- "struggle_messages_inside",
- "absorbed_struggle_messages_outside",
- "absorbed_struggle_messages_inside",
- "digest_messages_owner",
- "digest_messages_prey",
- "absorb_messages_owner",
- "absorb_messages_prey",
- "unabsorb_messages_owner",
- "unabsorb_messages_prey",
- "examine_messages",
- "examine_messages_absorbed",
- "emote_lists",
- "emote_time",
- "emote_active",
- "mode_flags",
- "item_digest_mode",
- "contaminates",
- "contamination_flavor",
- "contamination_color",
- "release_sound",
- "fancy_vore",
- "is_wet",
- "wet_loop",
- "belly_fullscreen",
- "disable_hud",
- "egg_type"
- )
+ var/list/saving = list(
+ "name",
+ "desc",
+ "absorbed_desc",
+ "vore_sound",
+ "vore_verb",
+ "release_verb",
+ "human_prey_swallow_time",
+ "nonhuman_prey_swallow_time",
+ "emote_time",
+ "nutrition_percent",
+ "digest_brute",
+ "digest_burn",
+ "digest_oxy",
+ "digest_tox",
+ "digest_clone",
+ "immutable",
+ "can_taste",
+ "escapable",
+ "escapetime",
+ "digestchance",
+ "absorbchance",
+ "escapechance",
+ "transferchance",
+ "transferchance_secondary",
+ "transferlocation",
+ "transferlocation_secondary",
+ "bulge_size",
+ "display_absorbed_examine",
+ "shrink_grow_size",
+ "struggle_messages_outside",
+ "struggle_messages_inside",
+ "absorbed_struggle_messages_outside",
+ "absorbed_struggle_messages_inside",
+ "digest_messages_owner",
+ "digest_messages_prey",
+ "absorb_messages_owner",
+ "absorb_messages_prey",
+ "unabsorb_messages_owner",
+ "unabsorb_messages_prey",
+ "examine_messages",
+ "examine_messages_absorbed",
+ "emote_lists",
+ "emote_time",
+ "emote_active",
+ "selective_preference",
+ "mode_flags",
+ "item_digest_mode",
+ "contaminates",
+ "contamination_flavor",
+ "contamination_color",
+ "release_sound",
+ "fancy_vore",
+ "is_wet",
+ "wet_loop",
+ "belly_fullscreen",
+ "disable_hud",
+ "egg_type",
+ "save_digest_mode"
+ )
+
+ if (save_digest_mode == 1)
+ return ..() + saving + list("digest_mode")
+
+ return ..() + saving
/obj/belly/Initialize()
. = ..()
@@ -335,8 +350,8 @@
owner.update_icons()
//Print notifications/sound if necessary
- if(!silent)
- owner.visible_message("[owner] expels everything from their [lowertext(name)]!")
+ if(!silent && count)
+ owner.visible_message("[owner] [release_verb] everything from their [lowertext(name)]!")
var/soundfile
if(!fancy_vore)
soundfile = classic_release_sounds[release_sound]
@@ -371,6 +386,9 @@
slip.slip_protect = world.time + 25 // This is to prevent slipping back into your pred if they stand on soap or something.
//Place them into our drop_location
M.forceMove(drop_location())
+ if(ismob(M))
+ var/mob/ourmob = M
+ ourmob.reset_view(null)
items_preserved -= M
//Special treatment for absorbed prey
@@ -401,7 +419,7 @@
//Print notifications/sound if necessary
if(!silent)
- owner.visible_message("[owner] expels [M] from their [lowertext(name)]!")
+ owner.visible_message("[owner] [release_verb] [M] from their [lowertext(name)]!")
var/soundfile
if(!fancy_vore)
soundfile = classic_release_sounds[release_sound]
@@ -409,6 +427,10 @@
soundfile = fancy_release_sounds[release_sound]
if(soundfile)
playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE)
+ //Should fix your view not following you out of mobs sometimes!
+ if(ismob(M))
+ var/mob/ourmob = M
+ ourmob.reset_view(null)
return 1
@@ -422,6 +444,9 @@
prey.buckled.unbuckle_mob()
prey.forceMove(src)
+ if(ismob(prey))
+ var/mob/ourmob = prey
+ ourmob.reset_view(owner)
owner.updateVRPanel()
if(isanimal(owner))
owner.update_icon()
@@ -564,6 +589,9 @@
else if((type == "im_digest" || type == "im_hold" || type == "im_holdabsorbed" || type == "im_absorb" || type == "im_heal" || type == "im_drain" || type == "im_steal" || type == "im_egg" || type == "im_shrink" || type == "im_grow" || type == "im_unabsorb") && (length(raw_list[i]) > 510 || length(raw_list[i]) < 10))
raw_list.Cut(i,i)
log_debug("[owner] tried to set [lowertext(name)] idle message with >501 or <10 char message")
+ else if((type == "em" || type == "ema") && (length(raw_list[i]) > 260 || length(raw_list[i]) < 10))
+ raw_list.Cut(i,i)
+ log_debug("[owner] tried to set [lowertext(name)] examine message with >260 or <10 char message")
else
raw_list[i] = readd_quotes(raw_list[i])
//Also fix % sign for var replacement
@@ -716,6 +744,10 @@
if(M.loc != src)
M.forceMove(src)
+ if(ismob(M))
+ var/mob/ourmob = M
+ ourmob.reset_view(owner)
+
//Seek out absorbed prey of the prey, absorb them too.
//This in particular will recurse oddly because if there is absorbed prey of prey of prey...
//it will just move them up one belly. This should never happen though since... when they were
@@ -1026,6 +1058,9 @@
if(!(content in src) || !istype(target))
return
content.forceMove(target)
+ if(ismob(content))
+ var/mob/ourmob = content
+ ourmob.reset_view(owner)
if(isitem(content))
var/obj/item/I = content
if(istype(I,/obj/item/weapon/card/id))
@@ -1067,6 +1102,7 @@
dupe.absorbed_desc = absorbed_desc
dupe.vore_sound = vore_sound
dupe.vore_verb = vore_verb
+ dupe.release_verb = release_verb
dupe.human_prey_swallow_time = human_prey_swallow_time
dupe.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time
dupe.emote_time = emote_time
@@ -1074,6 +1110,8 @@
dupe.digest_brute = digest_brute
dupe.digest_burn = digest_burn
dupe.digest_oxy = digest_oxy
+ dupe.digest_tox = digest_tox
+ dupe.digest_clone = digest_clone
dupe.immutable = immutable
dupe.can_taste = can_taste
dupe.escapable = escapable
@@ -1101,6 +1139,8 @@
dupe.egg_type = egg_type
dupe.emote_time = emote_time
dupe.emote_active = emote_active
+ dupe.selective_preference = selective_preference
+ dupe.save_digest_mode = save_digest_mode
//// Object-holding variables
//struggle_messages_outside - strings
diff --git a/code/modules/vore/eating/bellymodes_datum_vr.dm b/code/modules/vore/eating/bellymodes_datum_vr.dm
index ef09c033a3e..80b78305391 100644
--- a/code/modules/vore/eating/bellymodes_datum_vr.dm
+++ b/code/modules/vore/eating/bellymodes_datum_vr.dm
@@ -43,13 +43,19 @@ GLOBAL_LIST_INIT(digest_modes, list())
var/old_brute = L.getBruteLoss()
var/old_burn = L.getFireLoss()
var/old_oxy = L.getOxyLoss()
+ var/old_tox = L.getToxLoss()
+ var/old_clone = L.getCloneLoss()
L.adjustBruteLoss(B.digest_brute)
L.adjustFireLoss(B.digest_burn)
L.adjustOxyLoss(B.digest_oxy)
+ L.adjustToxLoss(B.digest_tox)
+ L.adjustCloneLoss(B.digest_clone)
var/actual_brute = L.getBruteLoss() - old_brute
var/actual_burn = L.getFireLoss() - old_burn
var/actual_oxy = L.getOxyLoss() - old_oxy
- var/damage_gain = (actual_brute + actual_burn + actual_oxy/2)*(B.nutrition_percent / 100)
+ var/actual_tox = L.getToxLoss() - old_tox
+ var/actual_clone = L.getCloneLoss() - old_clone
+ var/damage_gain = (actual_brute + actual_burn + actual_oxy/2 + actual_tox + actual_clone*2)*(B.nutrition_percent / 100)
var/offset = (1 + ((L.weight - 137) / 137)) // 130 pounds = .95 140 pounds = 1.02
var/difference = B.owner.size_multiplier / L.size_multiplier
@@ -57,9 +63,9 @@ GLOBAL_LIST_INIT(digest_modes, list())
var/mob/living/silicon/robot/R = B.owner
R.cell.charge += 25 * damage_gain
if(offset) // If any different than default weight, multiply the % of offset.
- B.owner.adjust_nutrition(offset*(4.5 * (damage_gain) / difference)) //4.5 nutrition points per health point. Normal same size 100+100 health prey with average weight would give 900 points if the digestion was instant. With all the size/weight offset taxes plus over time oxyloss+hunger taxes deducted with non-instant digestion, this should be enough to not leave the pred starved.
+ B.owner.adjust_nutrition(offset*(4.5 * (damage_gain) / difference)*L.get_digestion_nutrition_modifier()) //4.5 nutrition points per health point. Normal same size 100+100 health prey with average weight would give 900 points if the digestion was instant. With all the size/weight offset taxes plus over time oxyloss+hunger taxes deducted with non-instant digestion, this should be enough to not leave the pred starved.
else
- B.owner.adjust_nutrition(4.5 * (damage_gain) / difference)
+ B.owner.adjust_nutrition((4.5 * (damage_gain) / difference)*L.get_digestion_nutrition_modifier())
if(L.stat != oldstat)
return list("to_update" = TRUE)
@@ -218,3 +224,40 @@ GLOBAL_LIST_INIT(digest_modes, list())
B.ownegg = null
return list("to_update" = TRUE)
return
+
+/datum/digest_mode/selective //unselectable, "smart" digestion mode for mobs only
+ id = DM_SELECT
+
+/datum/digest_mode/selective/process_mob(obj/belly/B, mob/living/L)
+ var/datum/digest_mode/tempmode = GLOB.digest_modes[DM_HOLD] // Default to Hold in case of big oof fallback
+ //if not absorbed, see if they're food
+ switch(L.selective_preference) // First, we respect prey prefs
+ if(DM_DIGEST)
+ if(L.digestable)
+ tempmode = GLOB.digest_modes[DM_DIGEST] // They want to be digested and can be, Digest
+ else
+ tempmode = GLOB.digest_modes[DM_DRAIN] // They want to be digested but can't be! Drain.
+ if(DM_ABSORB)
+ if(L.absorbable)
+ tempmode = GLOB.digest_modes[DM_ABSORB] // They want to be absorbed and can be. Absorb.
+ else
+ tempmode = GLOB.digest_modes[DM_DRAIN] // They want to be absorbed but can't be! Drain.
+ if(DM_DRAIN)
+ tempmode = GLOB.digest_modes[DM_DRAIN] // They want to be drained. Drain.
+ if(DM_DEFAULT)
+ switch(B.selective_preference) // They don't actually care? Time for our own preference.
+ if(DM_DIGEST)
+ if(L.digestable)
+ tempmode = GLOB.digest_modes[DM_DIGEST] // We prefer digestion and they're digestible? Digest
+ else if(L.absorbable)
+ tempmode = GLOB.digest_modes[DM_ABSORB] // If not digestible, are they absorbable? Then absorb.
+ else
+ tempmode = GLOB.digest_modes[DM_DRAIN] // Otherwise drain.
+ if(DM_ABSORB)
+ if(L.absorbable)
+ tempmode = GLOB.digest_modes[DM_ABSORB] // We prefer absorption and they're absorbable? Absorb.
+ else if(L.digestable)
+ tempmode = GLOB.digest_modes[DM_DIGEST] // If not absorbable, are they digestible? Then digest.
+ else
+ tempmode = GLOB.digest_modes[DM_DRAIN] // Otherwise drain.
+ return tempmode.process_mob(B, L)
diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm
index 5a92072756f..e2c244be539 100644
--- a/code/modules/vore/eating/bellymodes_vr.dm
+++ b/code/modules/vore/eating/bellymodes_vr.dm
@@ -106,7 +106,7 @@
if(emote_active)
var/list/EL = emote_lists[digest_mode]
- if((LAZYLEN(EL) || LAZYLEN(emote_lists[DM_HOLD_ABSORBED]) || (digest_mode == DM_DIGEST && LAZYLEN(emote_lists[DM_HOLD]))) && next_emote <= world.time)
+ if((LAZYLEN(EL) || LAZYLEN(emote_lists[DM_HOLD_ABSORBED]) || (digest_mode == DM_DIGEST && LAZYLEN(emote_lists[DM_HOLD])) || (digest_mode == DM_SELECT && (LAZYLEN(emote_lists[DM_HOLD])||LAZYLEN(emote_lists[DM_DIGEST])||LAZYLEN(emote_lists[DM_ABSORB])) )) && next_emote <= world.time)
var/living_count = 0
var/absorbed_count = 0
for(var/mob/living/L in contents)
@@ -124,9 +124,17 @@
formatted_message = replacetext(formatted_message, "%pred", owner)
formatted_message = replacetext(formatted_message, "%prey", M)
formatted_message = replacetext(formatted_message, "%countprey", absorbed_count)
- to_chat(M, "[formatted_message]")
+ if(formatted_message)
+ to_chat(M, "[formatted_message]")
else
- if(digest_mode == DM_DIGEST && !M.digestable)
+ if (digest_mode == DM_SELECT)
+ if (M.digestable)
+ EL = emote_lists[DM_DIGEST]
+ else if (M.absorbable)
+ EL = emote_lists[DM_ABSORB]
+ else
+ EL = emote_lists[DM_HOLD]
+ else if(digest_mode == DM_DIGEST && !M.digestable)
EL = emote_lists[DM_HOLD] // Use Hold's emote list if we're indigestible
var/raw_message = pick(EL)
@@ -136,7 +144,8 @@
formatted_message = replacetext(formatted_message, "%prey", M)
formatted_message = replacetext(formatted_message, "%countprey", living_count)
formatted_message = replacetext(formatted_message, "%count", contents.len)
- to_chat(M, "[formatted_message]")
+ if(formatted_message)
+ to_chat(M, "[formatted_message]")
if(to_update)
updateVRPanels()
@@ -281,6 +290,8 @@
if(M.ckey)
GLOB.prey_digested_roundstat++
+ var/personal_nutrition_modifier = M.get_digestion_nutrition_modifier()
+
if((mode_flags & DM_FLAG_LEAVEREMAINS) && M.digest_leave_remains)
handle_remains_leaving(M)
digestion_death(M)
@@ -288,9 +299,9 @@
owner.update_icons()
if(isrobot(owner))
var/mob/living/silicon/robot/R = owner
- R.cell.charge += (nutrition_percent / 100) * compensation * 25
+ R.cell.charge += (nutrition_percent / 100) * compensation * 25 * personal_nutrition_modifier
else
- owner.adjust_nutrition((nutrition_percent / 100) * compensation * 4.5)
+ owner.adjust_nutrition((nutrition_percent / 100) * compensation * 4.5 * personal_nutrition_modifier)
/obj/belly/proc/steal_nutrition(mob/living/L)
if(L.nutrition >= 100)
diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm
index 3e76a341016..9e8851bdfb0 100644
--- a/code/modules/vore/eating/digest_act_vr.dm
+++ b/code/modules/vore/eating/digest_act_vr.dm
@@ -9,6 +9,9 @@
var/obj/item/device/pda/P = src
if(P.id)
P.id = null
+
+ for(var/mob/living/voice/V in possessed_voice) // Delete voices.
+ V.Destroy() //Destroy the voice.
for(var/mob/living/M in contents)//Drop mobs from objects(shoes) before deletion
M.forceMove(item_storage)
for(var/obj/item/O in contents)
@@ -40,6 +43,8 @@
var/obj/item/device/pda/P = src
if(P.id)
P.id = null
+ for(var/mob/living/voice/V in possessed_voice) // Delete voices.
+ V.Destroy() //Destroy the voice.
for(var/mob/living/M in contents)//Drop mobs from objects(shoes) before deletion
M.forceMove(item_storage)
for(var/obj/item/O in contents)
@@ -96,7 +101,8 @@
icon = 'icons/obj/card_vr.dmi'
icon_state = "[initial(icon_state)]_digested"
else
- sprite_stack += "digested"
+ if(!sprite_stack.Find("digested"))
+ sprite_stack += "digested"
update_icon()
return FALSE
diff --git a/code/modules/vore/eating/inbelly_spawn.dm b/code/modules/vore/eating/inbelly_spawn.dm
index 39c09554e02..207f3ca4e01 100644
--- a/code/modules/vore/eating/inbelly_spawn.dm
+++ b/code/modules/vore/eating/inbelly_spawn.dm
@@ -161,6 +161,11 @@ Please do not abuse this ability.
if(chosen_language)
if(is_lang_whitelisted(prey,chosen_language) || (new_character.species && (chosen_language.name in new_character.species.secondary_langs)))
new_character.add_language(lang)
+ for(var/key in prey.prefs.language_custom_keys)
+ if(prey.prefs.language_custom_keys[key])
+ var/datum/language/keylang = GLOB.all_languages[prey.prefs.language_custom_keys[key]]
+ if(keylang)
+ new_character.language_keys[key] = keylang
new_character.regenerate_icons()
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index fdaca89429f..224f055f44c 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -26,10 +26,13 @@
var/vore_taste = null // What the character tastes like
var/vore_smell = null // What the character smells like
var/no_vore = FALSE // If the character/mob can vore.
+ var/restrict_vore_ventcrawl = FALSE // Self explanatory
var/noisy = FALSE // Toggle audible hunger.
var/absorbing_prey = 0 // Determines if the person is using the succubus drain or not. See station_special_abilities_vr.
var/drain_finalized = 0 // Determines if the succubus drain will be KO'd/absorbed. Can be toggled on at any time.
var/fuzzy = 0 // Preference toggle for sharp/fuzzy icon.
+ var/voice_freq = 0 // Preference for character voice frequency
+ var/list/voice_sounds_list = list() // The sound list containing our voice sounds!
var/permit_healbelly = TRUE
var/stumble_vore = TRUE //Enabled by default since you have to enable drop pred/prey to do this anyway
var/slip_vore = TRUE //Enabled by default since you have to enable drop pred/prey to do this anyway
@@ -42,6 +45,7 @@
var/adminbus_eat_minerals = FALSE // This creature subsists on a diet of pure adminium.
var/vis_height = 32 // Sprite height used for resize features.
var/show_vore_fx = TRUE // Show belly fullscreens
+ var/selective_preference = DM_DEFAULT // Preference for selective bellymode
var/regen_sounds = list(
'sound/effects/mob_effects/xenochimera/regen_1.ogg',
'sound/effects/mob_effects/xenochimera/regen_2.ogg',
@@ -50,6 +54,31 @@
'sound/effects/mob_effects/xenochimera/regen_5.ogg'
)
+ var/nutrition_message_visible = TRUE
+ var/list/nutrition_messages = list(
+ "They are starving! You can hear their stomach snarling from across the room!",
+ "They are extremely hungry. A deep growl occasionally rumbles from their empty stomach.",
+ "",
+ "They have a stuffed belly, bloated fat and round from eating too much.",
+ "They have a rotund, thick gut. It bulges from their body obscenely, close to sagging under its own weight.",
+ "They are sporting a large, round, sagging stomach. It contains at least their body weight worth of glorping slush.",
+ "They are engorged with a huge stomach that sags and wobbles as they move. They must have consumed at least twice their body weight. It looks incredibly soft.",
+ "Their stomach is firmly packed with digesting slop. They must have eaten at least a few times worth their body weight! It looks hard for them to stand, and their gut jiggles when they move.",
+ "They are so absolutely stuffed that you aren't sure how it's possible for them to move. They can't seem to swell any bigger. The surface of their belly looks sorely strained!",
+ "They are utterly filled to the point where it's hard to even imagine them moving, much less comprehend it when they do. Their gut is swollen to monumental sizes and amount of food they consumed must be insane.")
+ var/weight_message_visible = TRUE
+ var/list/weight_messages = list(
+ "They are terribly lithe and frail!",
+ "They have a very slender frame.",
+ "They have a lightweight, athletic build.",
+ "They have a healthy, average body.",
+ "They have a thick, curvy physique.",
+ "They have a plush, chubby figure.",
+ "They have an especially plump body with a round potbelly and large hips.",
+ "They have a very fat frame with a bulging potbelly, squishy rolls of pudge, very wide hips, and plump set of jiggling thighs.",
+ "They are incredibly obese. Their massive potbelly sags over their waistline while their fat ass would probably require two chairs to sit down comfortably!",
+ "They are so morbidly obese, you wonder how they can even stand, let alone waddle around the station. They can't get any fatter without being immobilized.")
+
//
// Hook for generic creation of stuff on new creatures
//
@@ -234,6 +263,8 @@
P.vore_taste = src.vore_taste
P.vore_smell = src.vore_smell
P.permit_healbelly = src.permit_healbelly
+ P.noisy = src.noisy
+ P.selective_preference = src.selective_preference
P.show_vore_fx = src.show_vore_fx
P.can_be_drop_prey = src.can_be_drop_prey
P.can_be_drop_pred = src.can_be_drop_pred
@@ -245,6 +276,11 @@
P.slip_vore = src.slip_vore
P.stumble_vore = src.stumble_vore
+ P.nutrition_message_visible = src.nutrition_message_visible
+ P.nutrition_messages = src.nutrition_messages
+ P.weight_message_visible = src.weight_message_visible
+ P.weight_messages = src.weight_messages
+
var/list/serialized = list()
for(var/obj/belly/B as anything in src.vore_organs)
serialized += list(B.serialize()) //Can't add a list as an object to another list in Byond. Thanks.
@@ -273,6 +309,8 @@
vore_taste = P.vore_taste
vore_smell = P.vore_smell
permit_healbelly = P.permit_healbelly
+ selective_preference = P.selective_preference
+ noisy = P.noisy
show_vore_fx = P.show_vore_fx
can_be_drop_prey = P.can_be_drop_prey
can_be_drop_pred = P.can_be_drop_pred
@@ -284,6 +322,11 @@
slip_vore = P.slip_vore
stumble_vore = P.stumble_vore
+ nutrition_message_visible = P.nutrition_message_visible
+ nutrition_messages = P.nutrition_messages
+ weight_message_visible = P.weight_message_visible
+ weight_messages = P.weight_messages
+
if(bellies)
release_vore_contents(silent = TRUE)
vore_organs.Cut()
@@ -468,6 +511,24 @@
crystal.bound_mob = null
crystal.bound_mob = capture_crystal = 0
log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [crystal] owned by [crystal.owner]. [ADMIN_FLW(src)]")
+
+ //You've been turned into an item!
+ else if(tf_mob_holder && istype(src, /mob/living/voice) && istype(src.loc, /obj/item))
+ var/obj/item/item_to_destroy = src.loc //If so, let's destroy the item they just TF'd out of.
+ if(istype(src.loc, /obj/item/clothing)) //Are they in clothes? Delete the item then revert them.
+ qdel(item_to_destroy)
+ log_and_message_admins("[key_name(src)] used the OOC escape button to revert back to their original form from being TFed into an object.")
+ revert_mob_tf()
+ else //Are they in any other type of object? If qdel is done first, the mob is deleted from the world.
+ forceMove(get_turf(src))
+ qdel(item_to_destroy)
+ log_and_message_admins("[key_name(src)] used the OOC escape button to revert back to their original form from being TFed into an object.")
+ revert_mob_tf()
+
+ //You've been turned into a mob!
+ else if(tf_mob_holder)
+ log_and_message_admins("[key_name(src)] used the OOC escape button to revert back to their original form from being TFed into another mob.")
+ revert_mob_tf()
//Don't appear to be in a vore situation
else
to_chat(src,"You aren't inside anyone, though, is the thing.")
@@ -660,6 +721,12 @@
if(new_color)
glow_color = new_color
+/obj/item
+ var/trash_eatable = TRUE
+
+/mob/living/proc/get_digestion_nutrition_modifier()
+ return 1
+
/mob/living/proc/eat_trash()
set name = "Eat Trash"
set category = "Abilities"
@@ -678,6 +745,17 @@
to_chat(src, "You are not allowed to eat this.")
return
+ if(!I.trash_eatable)
+ to_chat(src, "You can't eat that so casually!")
+ return
+
+ if(istype(I, /obj/item/device/paicard))
+ var/obj/item/device/paicard/palcard = I
+ var/mob/living/silicon/pai/pocketpal = palcard.pai
+ if(!pocketpal.devourable)
+ to_chat(src, "\The [pocketpal] doesn't allow you to eat it.")
+ return
+
if(is_type_in_list(I,edible_trash) | adminbus_trash)
if(I.hidden_uplink)
to_chat(src, "You really should not be eating this.")
@@ -737,7 +815,7 @@
to_chat(src, "You can taste the flavor of aromatic rolling paper and funny looks.")
else if(istype(I,/obj/item/weapon/paper))
to_chat(src, "You can taste the dry flavor of bureaucracy.")
- else if(istype(I,/obj/item/weapon/dice))
+ else if(istype(I,/obj/item/weapon/dice) || istype(I,/obj/item/roulette_ball))
to_chat(src, "You can taste the bitter flavor of cheating.")
else if(istype(I,/obj/item/weapon/lipstick))
to_chat(src, "You can taste the flavor of couture and style. Toddler at the make-up bag style.")
@@ -758,9 +836,16 @@
else if(istype(I,/obj/item/weapon/bikehorn/tinytether))
to_chat(src, "You feel a rush of power swallowing such a large, err, tiny structure.")
visible_message("[src] demonstrates their voracious capabilities by swallowing [I] whole!")
- else if(istype(I,/obj/item/device/paicard) || istype(I,/obj/item/device/mmi/digital/posibrain) || istype(I,/obj/item/device/aicard))
+ else if(istype(I,/obj/item/device/mmi/digital/posibrain) || istype(I,/obj/item/device/aicard))
visible_message("[src] demonstrates their voracious capabilities by swallowing [I] whole!")
to_chat(src, "You can taste the sweet flavor of digital friendship. Or maybe it is something else.")
+ else if(istype(I,/obj/item/device/paicard))
+ visible_message("[src] demonstrates their voracious capabilities by swallowing [I] whole!")
+ to_chat(src, "You can taste the sweet flavor of digital friendship.")
+ var/obj/item/device/paicard/ourcard = I
+ if(ourcard.pai && ourcard.pai.client && isbelly(ourcard.loc))
+ var/obj/belly/B = ourcard.loc
+ to_chat(ourcard.pai, "[B.desc]")
else if(istype(I,/obj/item/weapon/reagent_containers/food))
var/obj/item/weapon/reagent_containers/food/F = I
if(!F.reagents.total_volume)
@@ -946,6 +1031,7 @@
dispvoreprefs += "Leaves Remains: [digest_leave_remains ? "Enabled" : "Disabled"] "
dispvoreprefs += "Mob Vore: [allowmobvore ? "Enabled" : "Disabled"] "
dispvoreprefs += "Healbelly permission: [permit_healbelly ? "Allowed" : "Disallowed"] "
+ dispvoreprefs += "Selective Mode Pref: [src.selective_preference] "
dispvoreprefs += "Spontaneous vore prey: [can_be_drop_prey ? "Enabled" : "Disabled"] "
dispvoreprefs += "Spontaneous vore pred: [can_be_drop_pred ? "Enabled" : "Disabled"] "
dispvoreprefs += "Drop Vore: [drop_vore ? "Enabled" : "Disabled"] "
@@ -976,6 +1062,7 @@
to_chat(src, "Belly desc: [B.desc]")
to_chat(src, "Belly absorbed desc: [B.absorbed_desc]")
to_chat(src, "Vore verb: [B.vore_verb]")
+ to_chat(src, "Release verb: [B.release_verb]")
to_chat(src, "Struggle messages (outside):")
for(var/msg in B.struggle_messages_outside)
to_chat(src, "[msg]")
@@ -1053,9 +1140,13 @@
if(!screen_icon)
screen_icon = new()
RegisterSignal(screen_icon, COMSIG_CLICK, .proc/vore_panel_click)
- screen_icon.icon = HUD.ui_style
- screen_icon.color = HUD.ui_color
- screen_icon.alpha = HUD.ui_alpha
+ if(ispAI(user))
+ screen_icon.icon = 'icons/mob/pai_hud.dmi'
+ screen_icon.screen_loc = ui_acti
+ else
+ screen_icon.icon = HUD.ui_style
+ screen_icon.color = HUD.ui_color
+ screen_icon.alpha = HUD.ui_alpha
LAZYADD(HUD.other_important, screen_icon)
user.client?.screen += screen_icon
diff --git a/code/modules/vore/eating/stumblevore_vr.dm b/code/modules/vore/eating/stumblevore_vr.dm
index 0928dcccff0..7c17c604b3a 100644
--- a/code/modules/vore/eating/stumblevore_vr.dm
+++ b/code/modules/vore/eating/stumblevore_vr.dm
@@ -37,7 +37,7 @@
else if(M.CanStumbleVore(src))
visible_message("[M] flops carlessly into [src]!")
perform_the_nom(M,src,M,M.vore_selected,1)
- else if(S.species.lightweight == 1)
+ else if(istype(S) && S.species.lightweight == 1)
visible_message("[M] carelessly bowls [src] over!")
M.forceMove(get_turf(src))
M.apply_damage(0.5, BRUTE)
diff --git a/code/modules/vore/eating/vertical_nom_vr.dm b/code/modules/vore/eating/vertical_nom_vr.dm
new file mode 100644
index 00000000000..c9ff0a3096a
--- /dev/null
+++ b/code/modules/vore/eating/vertical_nom_vr.dm
@@ -0,0 +1,47 @@
+/mob/living/proc/vertical_nom()
+ set name = "Nom from Above"
+ set desc = "Allows you to eat people who are below your tile or adjacent one. Requires passability."
+ set category = "Abilities"
+
+ if(stat == DEAD || paralysis || weakened || stunned)
+ to_chat(src, "You cannot do that while in your current state.")
+ return
+
+ if(!(src.vore_selected))
+ to_chat(src, "No selected belly found.")
+ return
+
+ var/list/targets = list()
+
+ for(var/turf/T in range(1, src))
+ if(isopenspace(T))
+ while(isopenspace(T))
+ T = GetBelow(T)
+ if(T)
+ for(var/mob/living/L in T)
+ if(L.devourable && L.can_be_drop_prey)
+ targets += L
+
+ if(!(targets.len))
+ to_chat(src, "No eligible targets found.")
+ return
+
+ var/mob/living/target = tgui_input_list(src, "Please select a target.", "Victim", targets)
+
+ if(!target)
+ return
+
+ to_chat(target, "You feel yourself being pulled up by something... Or someone?!")
+ var/starting_loc = target.loc
+
+ if(do_after(src, 50))
+ if(target.loc != starting_loc)
+ to_chat(target, "You have interrupted whatever that was...")
+ to_chat(src, "They got away.")
+ return
+ if(target.buckled)
+ target.buckled.unbuckle_mob()
+ target.visible_message("\The [target] suddenly disappears somewhere above!",\
+ "You are dragged above and feel yourself slipping directly into \the [src]'s [vore_selected]!")
+ to_chat(src, "You successfully snatch \the [target], slipping them into your [vore_selected].")
+ target.forceMove(src.vore_selected)
\ No newline at end of file
diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm
index bbb26b7e3ce..ab5ec6bd964 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/code/modules/vore/eating/vore_vr.dm
@@ -54,6 +54,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/digest_leave_remains = FALSE
var/allowmobvore = TRUE
var/permit_healbelly = TRUE
+ var/noisy = FALSE
// These are 'modifier' prefs, do nothing on their own but pair with drop_prey/drop_pred settings.
var/drop_vore = TRUE
@@ -69,6 +70,34 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/vore_taste = "nothing in particular"
var/vore_smell = "nothing in particular"
+ var/selective_preference = DM_DEFAULT
+
+
+ var/nutrition_message_visible = TRUE
+ var/list/nutrition_messages = list(
+ "They are starving! You can hear their stomach snarling from across the room!",
+ "They are extremely hungry. A deep growl occasionally rumbles from their empty stomach.",
+ "",
+ "They have a stuffed belly, bloated fat and round from eating too much.",
+ "They have a rotund, thick gut. It bulges from their body obscenely, close to sagging under its own weight.",
+ "They are sporting a large, round, sagging stomach. It contains at least their body weight worth of glorping slush.",
+ "They are engorged with a huge stomach that sags and wobbles as they move. They must have consumed at least twice their body weight. It looks incredibly soft.",
+ "Their stomach is firmly packed with digesting slop. They must have eaten at least a few times worth their body weight! It looks hard for them to stand, and their gut jiggles when they move.",
+ "They are so absolutely stuffed that you aren't sure how it's possible for them to move. They can't seem to swell any bigger. The surface of their belly looks sorely strained!",
+ "They are utterly filled to the point where it's hard to even imagine them moving, much less comprehend it when they do. Their gut is swollen to monumental sizes and amount of food they consumed must be insane.")
+ var/weight_message_visible = TRUE
+ var/list/weight_messages = list(
+ "They are terribly lithe and frail!",
+ "They have a very slender frame.",
+ "They have a lightweight, athletic build.",
+ "They have a healthy, average body.",
+ "They have a thick, curvy physique.",
+ "They have a plush, chubby figure.",
+ "They have an especially plump body with a round potbelly and large hips.",
+ "They have a very fat frame with a bulging potbelly, squishy rolls of pudge, very wide hips, and plump set of jiggling thighs.",
+ "They are incredibly obese. Their massive potbelly sags over their waistline while their fat ass would probably require two chairs to sit down comfortably!",
+ "They are so morbidly obese, you wonder how they can even stand, let alone waddle around the station. They can't get any fatter without being immobilized.")
+
//Mechanically required
var/path
var/slot
@@ -140,6 +169,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
vore_taste = json_from_file["vore_taste"]
vore_smell = json_from_file["vore_smell"]
permit_healbelly = json_from_file["permit_healbelly"]
+ noisy = json_from_file["noisy"]
+ selective_preference = json_from_file["selective_preference"]
show_vore_fx = json_from_file["show_vore_fx"]
can_be_drop_prey = json_from_file["can_be_drop_prey"]
can_be_drop_pred = json_from_file["can_be_drop_pred"]
@@ -151,6 +182,10 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
drop_vore = json_from_file["drop_vore"]
slip_vore = json_from_file["slip_vore"]
stumble_vore = json_from_file["stumble_vore"]
+ nutrition_message_visible = json_from_file["nutrition_message_visible"]
+ nutrition_messages = json_from_file["nutrition_messages"]
+ weight_message_visible = json_from_file["weight_message_visible"]
+ weight_messages = json_from_file["weight_messages"]
//Quick sanitize
if(isnull(digestable))
@@ -169,6 +204,10 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
allowmobvore = TRUE
if(isnull(permit_healbelly))
permit_healbelly = TRUE
+ if(isnull(selective_preference))
+ selective_preference = DM_DEFAULT
+ if (isnull(noisy))
+ noisy = FALSE
if(isnull(show_vore_fx))
show_vore_fx = TRUE
if(isnull(can_be_drop_prey))
@@ -191,6 +230,34 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
slip_vore = TRUE
if(isnull(stumble_vore))
stumble_vore = TRUE
+ if(isnull(nutrition_message_visible))
+ nutrition_message_visible = TRUE
+ if(isnull(weight_message_visible))
+ weight_message_visible = TRUE
+ if(isnull(nutrition_messages))
+ nutrition_messages = list(
+ "They are starving! You can hear their stomach snarling from across the room!" = 1,
+ "They are extremely hungry. A deep growl occasionally rumbles from their empty stomach." = 2,
+ "",
+ "They have a stuffed belly, bloated fat and round from eating too much.",
+ "They have a rotund, thick gut. It bulges from their body obscenely, close to sagging under its own weight.",
+ "They are sporting a large, round, sagging stomach. It contains at least their body weight worth of glorping slush.",
+ "They are engorged with a huge stomach that sags and wobbles as they move. They must have consumed at least twice their body weight. It looks incredibly soft.",
+ "Their stomach is firmly packed with digesting slop. They must have eaten at least a few times worth their body weight! It looks hard for them to stand, and their gut jiggles when they move.",
+ "They are so absolutely stuffed that you aren't sure how it's possible for them to move. They can't seem to swell any bigger. The surface of their belly looks sorely strained!",
+ "They are utterly filled to the point where it's hard to even imagine them moving, much less comprehend it when they do. Their gut is swollen to monumental sizes and amount of food they consumed must be insane.")
+ if(isnull(weight_messages))
+ weight_messages = list(
+ "They are terribly lithe and frail!",
+ "They have a very slender frame.",
+ "They have a lightweight, athletic build.",
+ "They have a healthy, average body.",
+ "They have a thick, curvy physique.",
+ "They have a plush, chubby figure.",
+ "They have an especially plump body with a round potbelly and large hips.",
+ "They have a very fat frame with a bulging potbelly, squishy rolls of pudge, very wide hips, and plump set of jiggling thighs.",
+ "They are incredibly obese. Their massive potbelly sags over their waistline while their fat ass would probably require two chairs to sit down comfortably!",
+ "They are so morbidly obese, you wonder how they can even stand, let alone waddle around the station. They can't get any fatter without being immobilized.")
return TRUE
@@ -211,6 +278,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
"vore_taste" = vore_taste,
"vore_smell" = vore_smell,
"permit_healbelly" = permit_healbelly,
+ "noisy" = noisy,
+ "selective_preference" = selective_preference,
"show_vore_fx" = show_vore_fx,
"can_be_drop_prey" = can_be_drop_prey,
"can_be_drop_pred" = can_be_drop_pred,
@@ -222,6 +291,10 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
"drop_vore" = drop_vore,
"slip_vore" = slip_vore,
"stumble_vore" = stumble_vore,
+ "nutrition_message_visible" = nutrition_message_visible,
+ "nutrition_messages" = nutrition_messages,
+ "weight_message_visible" = weight_message_visible,
+ "weight_messages" = weight_messages,
)
//List to JSON
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index a84bbd4526c..ce078a7384a 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -163,6 +163,7 @@
"mode" = selected.digest_mode,
"item_mode" = selected.item_digest_mode,
"verb" = selected.vore_verb,
+ "release_verb" = selected.release_verb,
"desc" = selected.desc,
"absorbed_desc" = selected.absorbed_desc,
"fancy" = selected.fancy_vore,
@@ -175,11 +176,17 @@
"digest_brute" = selected.digest_brute,
"digest_burn" = selected.digest_burn,
"digest_oxy" = selected.digest_oxy,
+ "digest_tox" = selected.digest_tox,
+ "digest_clone" = selected.digest_clone,
"bulge_size" = selected.bulge_size,
+ "save_digest_mode" = selected.save_digest_mode,
"display_absorbed_examine" = selected.display_absorbed_examine,
"shrink_grow_size" = selected.shrink_grow_size,
"emote_time" = selected.emote_time,
"emote_active" = selected.emote_active,
+ "selective_preference" = selected.selective_preference,
+ "nutrition_ex" = host.nutrition_message_visible,
+ "weight_ex" = host.weight_message_visible,
"belly_fullscreen" = selected.belly_fullscreen,
)
@@ -252,6 +259,10 @@
"drop_vore" = host.drop_vore,
"slip_vore" = host.slip_vore,
"stumble_vore" = host.stumble_vore,
+ "nutrition_message_visible" = host.nutrition_message_visible,
+ "nutrition_messages" = host.nutrition_messages,
+ "weight_message_visible" = host.weight_message_visible,
+ "weight_messages" = host.weight_messages
)
return data
@@ -284,7 +295,7 @@
if(host.vore_organs.len >= BELLIES_MAX)
return FALSE
- var/new_name = html_encode(input(usr,"New belly's name:","New Belly") as text|null)
+ var/new_name = html_encode(tgui_input_text(usr,"New belly's name:","New Belly"))
var/failure_msg
if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN)
@@ -347,7 +358,7 @@
unsaved_changes = FALSE
return TRUE
if("setflavor")
- var/new_flavor = html_encode(input(usr,"What your character tastes like (400ch limit). This text will be printed to the pred after 'X tastes of...' so just put something like 'strawberries and cream':","Character Flavor",host.vore_taste) as text|null)
+ var/new_flavor = html_encode(tgui_input_text(usr,"What your character tastes like (400ch limit). This text will be printed to the pred after 'X tastes of...' so just put something like 'strawberries and cream':","Character Flavor",host.vore_taste))
if(!new_flavor)
return FALSE
@@ -359,7 +370,7 @@
unsaved_changes = TRUE
return TRUE
if("setsmell")
- var/new_smell = html_encode(input(usr,"What your character smells like (400ch limit). This text will be printed to the pred after 'X smells of...' so just put something like 'strawberries and cream':","Character Smell",host.vore_smell) as text|null)
+ var/new_smell = html_encode(tgui_input_text(usr,"What your character smells like (400ch limit). This text will be printed to the pred after 'X smells of...' so just put something like 'strawberries and cream':","Character Smell",host.vore_smell))
if(!new_smell)
return FALSE
@@ -480,6 +491,22 @@
host.stumble_vore = !host.stumble_vore
unsaved_changes = TRUE
return TRUE
+ if("switch_selective_mode_pref")
+ host.selective_preference = tgui_input_list(usr, "What would you prefer happen to you with selective bellymode?","Selective Bellymode", list(DM_DEFAULT, DM_DIGEST, DM_ABSORB, DM_DRAIN))
+ if(!(host.selective_preference))
+ host.selective_preference = DM_DEFAULT
+ if(host.client.prefs_vr)
+ host.client.prefs_vr.selective_preference = host.selective_preference
+ unsaved_changes = TRUE
+ return TRUE
+ if("toggle_nutrition_ex")
+ host.nutrition_message_visible = !host.nutrition_message_visible
+ unsaved_changes = TRUE
+ return TRUE
+ if("toggle_weight_ex")
+ host.weight_message_visible = !host.weight_message_visible
+ unsaved_changes = TRUE
+ return TRUE
/datum/vore_look/proc/pick_from_inside(mob/user, params)
var/atom/movable/target = locate(params["pick"])
@@ -565,7 +592,7 @@
//Handle the [All] choice. Ugh inelegant. Someone make this pretty.
if(params["pickall"])
- intent = tgui_alert(usr, "Eject all, Move all?","Query",list("Eject all","Cancel","Move all"))
+ intent = tgui_alert(user, "Eject all, Move all?","Query",list("Eject all","Cancel","Move all"))
switch(intent)
if("Cancel")
return TRUE
@@ -583,7 +610,7 @@
to_chat(user,"You can't do that in your state!")
return TRUE
- var/obj/belly/choice = tgui_input_list(usr, "Move all where?","Select Belly", host.vore_organs)
+ var/obj/belly/choice = tgui_input_list(user, "Move all where?","Select Belly", host.vore_organs)
if(!choice)
return FALSE
@@ -596,10 +623,10 @@
var/atom/movable/target = locate(params["pick"])
if(!(target in host.vore_selected))
return TRUE // Not in our X anymore, update UI
- var/list/available_options = list("Examine", "Eject", "Move")
+ var/list/available_options = list("Examine", "Eject", "Move", "Transfer")
if(ishuman(target))
available_options += "Transform"
- intent = tgui_alert(user, "What would you like to do with [target]?", "Vore Pick", available_options)
+ intent = tgui_input_list(user, "What would you like to do with [target]?", "Vore Pick", available_options)
switch(intent)
if("Examine")
var/list/results = target.examine(host)
@@ -620,13 +647,51 @@
if(host.stat)
to_chat(user,"You can't do that in your state!")
return TRUE
-
var/obj/belly/choice = tgui_input_list(usr, "Move [target] where?","Select Belly", host.vore_organs)
if(!choice || !(target in host.vore_selected))
return TRUE
-
to_chat(target,"You're squished from [host]'s [lowertext(host.vore_selected.name)] to their [lowertext(choice.name)]!")
host.vore_selected.transfer_contents(target, choice)
+
+
+ if("Transfer")
+ if(host.stat)
+ to_chat(user,"You can't do that in your state!")
+ return TRUE
+
+ var/mob/living/belly_owner = host
+
+ var/list/viable_candidates = list()
+ for(var/mob/living/candidate in range(1, host))
+ if(istype(candidate) && !(candidate == host))
+ if(candidate.vore_organs.len && candidate.feeding && !candidate.no_vore)
+ viable_candidates += candidate
+ if(!viable_candidates.len)
+ to_chat(user, "There are no viable candidates around you!")
+ return TRUE
+ belly_owner = tgui_input_list(user, "Who do you want to recieve the target?", "Select Predator", viable_candidates)
+
+ if(!belly_owner || !(belly_owner in range(1, host)))
+ return TRUE
+
+ var/obj/belly/choice = tgui_input_list(user, "Move [target] where?","Select Belly", belly_owner.vore_organs)
+ if(!choice || !(target in host.vore_selected) || !belly_owner || !(belly_owner in range(1, host)))
+ return TRUE
+
+ if(belly_owner != host)
+ to_chat(user, "Transfer offer sent. Await their response.")
+ var/accepted = tgui_alert(belly_owner, "[host] is trying to transfer [target] from their [lowertext(host.vore_selected.name)] into your [lowertext(choice.name)]. Do you accept?", "Feeding Offer", list("Yes", "No"))
+ if(accepted != "Yes")
+ to_chat(user, "[belly_owner] refused the transfer!!")
+ return TRUE
+ if(!belly_owner || !(belly_owner in range(1, host)))
+ return TRUE
+ to_chat(target,"You're squished from [host]'s [lowertext(host.vore_selected.name)] to [belly_owner]'s [lowertext(choice.name)]!")
+ to_chat(belly_owner,"[target] is squished from [host]'s [lowertext(host.vore_selected.name)] to your [lowertext(choice.name)]!")
+ host.vore_selected.transfer_contents(target, choice)
+ else
+ to_chat(target,"You're squished from [host]'s [lowertext(host.vore_selected.name)] to their [lowertext(choice.name)]!")
+ host.vore_selected.transfer_contents(target, choice)
return TRUE
if("Transform")
@@ -650,7 +715,7 @@
var/attr = params["attribute"]
switch(attr)
if("b_name")
- var/new_name = html_encode(input(usr,"Belly's new name:","New Name") as text|null)
+ var/new_name = html_encode(tgui_input_text(usr,"Belly's new name:","New Name"))
var/failure_msg
if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN)
@@ -727,7 +792,7 @@
host.vore_selected.egg_type = new_egg_type
. = TRUE
if("b_desc")
- var/new_desc = html_encode(input(usr,"Belly Description, '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name. ([BELLIES_DESC_MAX] char limit):","New Description",host.vore_selected.desc) as message|null)
+ var/new_desc = html_encode(tgui_input_text(usr,"Belly Description, '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name. ([BELLIES_DESC_MAX] char limit):","New Description",host.vore_selected.desc, multiline = TRUE, prevent_enter = TRUE))
if(new_desc)
new_desc = readd_quotes(new_desc)
@@ -737,7 +802,7 @@
host.vore_selected.desc = new_desc
. = TRUE
if("b_absorbed_desc")
- var/new_desc = html_encode(input(usr,"Belly Description for absorbed prey, '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name. ([BELLIES_DESC_MAX] char limit):","New Description",host.vore_selected.absorbed_desc) as message|null)
+ var/new_desc = html_encode(tgui_input_text(usr,"Belly Description for absorbed prey, '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name. ([BELLIES_DESC_MAX] char limit):","New Description",host.vore_selected.absorbed_desc, multiline = TRUE, prevent_enter = TRUE))
if(new_desc)
new_desc = readd_quotes(new_desc)
@@ -747,121 +812,147 @@
host.vore_selected.absorbed_desc = new_desc
. = TRUE
if("b_msgs")
- tgui_alert(user,"Setting abusive or deceptive messages will result in a ban. Consider this your warning. Max 150 characters per message (500 for idle messages), max 10 messages per topic.","Really, don't.") // Should remain tgui_alert() (blocking)
+ tgui_alert(user,"Setting abusive or deceptive messages will result in a ban. Consider this your warning. Max 150 characters per message (250 for examines, 500 for idle messages), max 10 messages per topic.","Really, don't.") // Should remain tgui_alert() (blocking)
var/help = " Press enter twice to separate messages. '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name. '%count' will be replaced with the number of anything in your belly. '%countprey' will be replaced with the number of living prey in your belly."
switch(params["msgtype"])
if("dmp")
- var/new_message = input(user,"These are sent to prey when they expire. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Digest Message (to prey)",host.vore_selected.get_messages("dmp")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they expire. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Digest Message (to prey)",host.vore_selected.get_messages("dmp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"dmp")
if("dmo")
- var/new_message = input(user,"These are sent to you when prey expires in you. Write them in 2nd person ('you feel X'). Avoid using %pred in this type."+help,"Digest Message (to you)",host.vore_selected.get_messages("dmo")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey expires in you. Write them in 2nd person ('you feel X'). Avoid using %pred in this type."+help,"Digest Message (to you)",host.vore_selected.get_messages("dmo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"dmo")
if("amp")
- var/new_message = input(user,"These are sent to prey when their absorption finishes. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to prey)",host.vore_selected.get_messages("amp")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when their absorption finishes. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to prey)",host.vore_selected.get_messages("amp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"amp")
if("amo")
- var/new_message = input(user,"These are sent to you when prey's absorption finishes. Write them in 2nd person ('you feel X'). Avoid using %pred in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to you)",host.vore_selected.get_messages("amo")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey's absorption finishes. Write them in 2nd person ('you feel X'). Avoid using %pred in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to you)",host.vore_selected.get_messages("amo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"amo")
if("uamp")
- var/new_message = input(user,"These are sent to prey when their unnabsorption finishes. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to prey)",host.vore_selected.get_messages("uamp")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when their unnabsorption finishes. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to prey)",host.vore_selected.get_messages("uamp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"uamp")
if("uamo")
- var/new_message = input(user,"These are sent to you when prey's unabsorption finishes. Write them in 2nd person ('you feel X'). Avoid using %pred in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to you)",host.vore_selected.get_messages("uamo")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey's unabsorption finishes. Write them in 2nd person ('you feel X'). Avoid using %pred in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to you)",host.vore_selected.get_messages("uamo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"uamo")
if("smo")
- var/new_message = input(user,"These are sent to those nearby when prey struggles. Write them in 3rd person ('X's Y bulges')."+help,"Struggle Message (outside)",host.vore_selected.get_messages("smo")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to those nearby when prey struggles. Write them in 3rd person ('X's Y bulges')."+help,"Struggle Message (outside)",host.vore_selected.get_messages("smo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"smo")
if("smi")
- var/new_message = input(user,"These are sent to prey when they struggle. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Struggle Message (inside)",host.vore_selected.get_messages("smi")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they struggle. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Struggle Message (inside)",host.vore_selected.get_messages("smi"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"smi")
if("asmo")
- var/new_message = input(user,"These are sent to those nearby when absorbed prey struggles. Write them in 3rd person ('X's Y bulges'). %count will not work for this type, and %countprey will only count absorbed victims."+help,"Struggle Message (outside)",host.vore_selected.get_messages("asmo")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to those nearby when absorbed prey struggles. Write them in 3rd person ('X's Y bulges'). %count will not work for this type, and %countprey will only count absorbed victims."+help,"Struggle Message (outside)",host.vore_selected.get_messages("asmo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"asmo")
if("asmi")
- var/new_message = input(user,"These are sent to absorbed prey when they struggle. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Struggle Message (inside)",host.vore_selected.get_messages("asmi")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to absorbed prey when they struggle. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Struggle Message (inside)",host.vore_selected.get_messages("asmi"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"asmi")
if("em")
- var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging')."+help,"Examine Message (when full)",host.vore_selected.get_messages("em")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging')."+help,"Examine Message (when full)",host.vore_selected.get_messages("em"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"em")
if("ema")
- var/new_message = input(user,"These are sent to people who examine you when this belly has absorbed victims. Write them in 3rd person ('Their %belly is larger'). %count will not work for this type, and %countprey will only count absorbed victims."+help,"Examine Message (with absorbed victims)",host.vore_selected.get_messages("ema")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to people who examine you when this belly has absorbed victims. Write them in 3rd person ('Their %belly is larger'). %count will not work for this type, and %countprey will only count absorbed victims."+help,"Examine Message (with absorbed victims)",host.vore_selected.get_messages("ema"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"ema")
+ if("en")
+ var/list/indices = list(1,2,3,4,5,6,7,8,9,10)
+ var/index = tgui_input_list(user,"Select a message to edit:","Select Message", indices)
+ if(index && index <= 10)
+ var/alert = tgui_alert(user, "What do you wish to do with this message?","Selection",list("Edit","Clear","Cancel"))
+ switch(alert)
+ if("Clear")
+ host.nutrition_messages[index] = ""
+ if("Edit")
+ var/new_message = sanitize(tgui_input_text(user, "Input a message", "Input", host.nutrition_messages[index], multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
+ if(new_message)
+ host.nutrition_messages[index] = new_message
+
+ if("ew")
+ var/list/indices = list(1,2,3,4,5,6,7,8,9,10)
+ var/index = tgui_input_list(user,"Select a message to edit:","Select Message", indices)
+ if(index && index <= 10)
+ var/alert = tgui_alert(user, "What do you wish to do with this message?","Selection",list("Edit","Clear","Cancel"))
+ switch(alert)
+ if("Clear")
+ host.weight_messages[index] = ""
+ if("Edit")
+ var/new_message = sanitize(tgui_input_text(user, "Input a message", "Input", host.weight_messages[index], multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
+ if(new_message)
+ host.weight_messages[index] = new_message
+
if("im_digest")
- var/new_message = input(user,"These are sent to prey every minute when you are on Digest mode. Write them in 2nd person ('%pred's %belly squishes down on you.')."+help,"Idle Message (Digest)",host.vore_selected.get_messages("im_digest")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Digest mode. Write them in 2nd person ('%pred's %belly squishes down on you.')."+help,"Idle Message (Digest)",host.vore_selected.get_messages("im_digest"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_digest")
if("im_hold")
- var/new_message = input(user,"These are sent to prey every minute when you are on Hold mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Hold)",host.vore_selected.get_messages("im_hold")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Hold mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Hold)",host.vore_selected.get_messages("im_hold"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_hold")
if("im_holdabsorbed")
- var/new_message = input(user,"These are sent to prey every minute when you are absorbed. Write them in 2nd person ('%pred's %belly squishes down on you.') %count will not work for this type, and %countprey will only count absorbed victims."+help,"Idle Message (Hold Absorbed)",host.vore_selected.get_messages("im_holdabsorbed")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are absorbed. Write them in 2nd person ('%pred's %belly squishes down on you.') %count will not work for this type, and %countprey will only count absorbed victims."+help,"Idle Message (Hold Absorbed)",host.vore_selected.get_messages("im_holdabsorbed"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_holdabsorbed")
if("im_absorb")
- var/new_message = input(user,"These are sent to prey every minute when you are on Absorb mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Absorb)",host.vore_selected.get_messages("im_absorb")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Absorb mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Absorb)",host.vore_selected.get_messages("im_absorb"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_absorb")
if("im_heal")
- var/new_message = input(user,"These are sent to prey every minute when you are on Heal mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Heal)",host.vore_selected.get_messages("im_heal")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Heal mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Heal)",host.vore_selected.get_messages("im_heal"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_heal")
if("im_drain")
- var/new_message = input(user,"These are sent to prey every minute when you are on Drain mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Drain)",host.vore_selected.get_messages("im_drain")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Drain mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Drain)",host.vore_selected.get_messages("im_drain"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_drain")
if("im_steal")
- var/new_message = input(user,"These are sent to prey every minute when you are on Size Steal mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Size Steal)",host.vore_selected.get_messages("im_steal")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Size Steal mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Size Steal)",host.vore_selected.get_messages("im_steal"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_steal")
if("im_egg")
- var/new_message = input(user,"These are sent to prey every minute when you are on Encase In Egg mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Encase In Egg)",host.vore_selected.get_messages("im_egg")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Encase In Egg mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Encase In Egg)",host.vore_selected.get_messages("im_egg"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_egg")
if("im_shrink")
- var/new_message = input(user,"These are sent to prey every minute when you are on Shrink mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Shrink)",host.vore_selected.get_messages("im_shrink")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Shrink mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Shrink)",host.vore_selected.get_messages("im_shrink"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_shrink")
if("im_grow")
- var/new_message = input(user,"These are sent to prey every minute when you are on Grow mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Grow)",host.vore_selected.get_messages("im_grow")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Grow mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Grow)",host.vore_selected.get_messages("im_grow"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_grow")
if("im_unabsorb")
- var/new_message = input(user,"These are sent to prey every minute when you are on Unabsorb mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Unabsorb)",host.vore_selected.get_messages("im_unabsorb")) as message
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Unabsorb mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Unabsorb)",host.vore_selected.get_messages("im_unabsorb"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_unabsorb")
@@ -883,7 +974,7 @@
host.vore_selected.emote_lists = initial(host.vore_selected.emote_lists)
. = TRUE
if("b_verb")
- var/new_verb = html_encode(input(usr,"New verb when eating (infinitive tense, e.g. nom or swallow):","New Verb") as text|null)
+ var/new_verb = html_encode(tgui_input_text(usr,"New verb when eating (infinitive tense, e.g. nom or swallow):","New Verb"))
if(length(new_verb) > BELLIES_NAME_MAX || length(new_verb) < BELLIES_NAME_MIN)
tgui_alert_async(usr, "Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]).","Error")
@@ -891,6 +982,15 @@
host.vore_selected.vore_verb = new_verb
. = TRUE
+ if("b_release_verb")
+ var/new_release_verb = html_encode(tgui_input_text(usr,"New verb when releasing from stomach (e.g. expels or coughs or drops):","New Release Verb"))
+
+ if(length(new_release_verb) > BELLIES_NAME_MAX || length(new_release_verb) < BELLIES_NAME_MIN)
+ tgui_alert_async(usr, "Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]).","Error")
+ return FALSE
+
+ host.vore_selected.release_verb = new_release_verb
+ . = TRUE
if("b_fancy_sound")
host.vore_selected.fancy_vore = !host.vore_selected.fancy_vore
host.vore_selected.vore_sound = "Gulp"
@@ -944,7 +1044,7 @@
host.vore_selected.can_taste = !host.vore_selected.can_taste
. = TRUE
if("b_bulge_size")
- var/new_bulge = input(user, "Choose the required size prey must be to show up on examine, ranging from 25% to 200% Set this to 0 for no text on examine.", "Set Belly Examine Size.") as num|null
+ var/new_bulge = tgui_input_number(user, "Choose the required size prey must be to show up on examine, ranging from 25% to 200% Set this to 0 for no text on examine.", "Set Belly Examine Size.", max_value = 200, min_value = 0)
if(new_bulge == null)
return FALSE
if(new_bulge == 0) //Disable.
@@ -960,7 +1060,7 @@
host.vore_selected.display_absorbed_examine = !host.vore_selected.display_absorbed_examine
. = TRUE
if("b_grow_shrink")
- var/new_grow = input(user, "Choose the size that prey will be grown/shrunk to, ranging from 25% to 200%", "Set Growth Shrink Size.", host.vore_selected.shrink_grow_size) as num|null
+ var/new_grow = tgui_input_number(user, "Choose the size that prey will be grown/shrunk to, ranging from 25% to 200%", "Set Growth Shrink Size.", host.vore_selected.shrink_grow_size, 200, 25)
if (new_grow == null)
return FALSE
if (!ISINRANGE(new_grow,25,200))
@@ -970,38 +1070,58 @@
host.vore_selected.shrink_grow_size = (new_grow*0.01)
. = TRUE
if("b_nutritionpercent")
- var/new_nutrition = input(user, "Choose the nutrition gain percentage you will recieve per tick from prey. Ranges from 0.01 to 100.", "Set Nutrition Gain Percentage.", host.vore_selected.nutrition_percent) as num|null
+ var/new_nutrition = tgui_input_number(user, "Choose the nutrition gain percentage you will recieve per tick from prey. Ranges from 0.01 to 100.", "Set Nutrition Gain Percentage.", host.vore_selected.nutrition_percent, 100, 0.01)
if(new_nutrition == null)
return FALSE
var/new_new_nutrition = CLAMP(new_nutrition, 0.01, 100)
host.vore_selected.nutrition_percent = new_new_nutrition
. = TRUE
if("b_burn_dmg")
- var/new_damage = input(user, "Choose the amount of burn damage prey will take per tick. Ranges from 0 to 6.", "Set Belly Burn Damage.", host.vore_selected.digest_burn) as num|null
+ var/new_damage = tgui_input_number(user, "Choose the amount of burn damage prey will take per tick. Ranges from 0 to 6.", "Set Belly Burn Damage.", host.vore_selected.digest_burn, 6, 0)
if(new_damage == null)
return FALSE
var/new_new_damage = CLAMP(new_damage, 0, 6)
host.vore_selected.digest_burn = new_new_damage
. = TRUE
if("b_brute_dmg")
- var/new_damage = input(user, "Choose the amount of brute damage prey will take per tick. Ranges from 0 to 6", "Set Belly Brute Damage.", host.vore_selected.digest_brute) as num|null
+ var/new_damage = tgui_input_number(user, "Choose the amount of brute damage prey will take per tick. Ranges from 0 to 6", "Set Belly Brute Damage.", host.vore_selected.digest_brute, 6, 0)
if(new_damage == null)
return FALSE
var/new_new_damage = CLAMP(new_damage, 0, 6)
host.vore_selected.digest_brute = new_new_damage
. = TRUE
if("b_oxy_dmg")
- var/new_damage = input(user, "Choose the amount of suffocation damage prey will take per tick. Ranges from 0 to 12.", "Set Belly Suffocation Damage.", host.vore_selected.digest_oxy) as num|null
+ var/new_damage = tgui_input_number(user, "Choose the amount of suffocation damage prey will take per tick. Ranges from 0 to 12.", "Set Belly Suffocation Damage.", host.vore_selected.digest_oxy, 12, 0)
if(new_damage == null)
return FALSE
var/new_new_damage = CLAMP(new_damage, 0, 12)
host.vore_selected.digest_oxy = new_new_damage
. = TRUE
+ if("b_tox_dmg")
+ var/new_damage = tgui_input_number(user, "Choose the amount of toxins damage prey will take per tick. Ranges from 0 to 6", "Set Belly Toxins Damage.", host.vore_selected.digest_tox, 6, 0)
+ if(new_damage == null)
+ return FALSE
+ var/new_new_damage = CLAMP(new_damage, 0, 6)
+ host.vore_selected.digest_tox = new_new_damage
+ . = TRUE
+ if("b_clone_dmg")
+ var/new_damage = tgui_input_number(user, "Choose the amount of brute DNA damage (clone) prey will take per tick. Ranges from 0 to 6", "Set Belly Clone Damage.", host.vore_selected.digest_clone, 6, 0)
+ if(new_damage == null)
+ return FALSE
+ var/new_new_damage = CLAMP(new_damage, 0, 6)
+ host.vore_selected.digest_clone = new_new_damage
+ . = TRUE
if("b_emoteactive")
host.vore_selected.emote_active = !host.vore_selected.emote_active
. = TRUE
+ if("b_selective_mode_pref_toggle")
+ if(host.vore_selected.selective_preference == DM_DIGEST)
+ host.vore_selected.selective_preference = DM_ABSORB
+ else
+ host.vore_selected.selective_preference = DM_DIGEST
+ . = TRUE
if("b_emotetime")
- var/new_time = input(user, "Choose the period it takes for idle belly emotes to be shown to prey. Measured in seconds, Minimum 1 minute, Maximum 10 minutes.", "Set Belly Emote Delay.", host.vore_selected.digest_brute)
+ var/new_time = tgui_input_number(user, "Choose the period it takes for idle belly emotes to be shown to prey. Measured in seconds, Minimum 1 minute, Maximum 10 minutes.", "Set Belly Emote Delay.", host.vore_selected.digest_brute, 600, 60)
if(new_time == null)
return FALSE
var/new_new_time = CLAMP(new_time, 60, 600)
@@ -1019,17 +1139,17 @@
host.vore_selected.escapable = 0
. = TRUE
if("b_escapechance")
- var/escape_chance_input = input(user, "Set prey escape chance on resist (as %)", "Prey Escape Chance") as num|null
+ var/escape_chance_input = tgui_input_number(user, "Set prey escape chance on resist (as %)", "Prey Escape Chance", null, 100, 0)
if(!isnull(escape_chance_input)) //These have to be 'null' because both cancel and 0 are valid, separate options
host.vore_selected.escapechance = sanitize_integer(escape_chance_input, 0, 100, initial(host.vore_selected.escapechance))
. = TRUE
if("b_escapetime")
- var/escape_time_input = input(user, "Set number of seconds for prey to escape on resist (1-60)", "Prey Escape Time") as num|null
+ var/escape_time_input = tgui_input_number(user, "Set number of seconds for prey to escape on resist (1-60)", "Prey Escape Time", null, 60, 1)
if(!isnull(escape_time_input))
host.vore_selected.escapetime = sanitize_integer(escape_time_input*10, 10, 600, initial(host.vore_selected.escapetime))
. = TRUE
if("b_transferchance")
- var/transfer_chance_input = input(user, "Set belly transfer chance on resist (as %). You must also set the location for this to have any effect.", "Prey Escape Time") as num|null
+ var/transfer_chance_input = tgui_input_number(user, "Set belly transfer chance on resist (as %). You must also set the location for this to have any effect.", "Prey Escape Time", null, 100, 0)
if(!isnull(transfer_chance_input))
host.vore_selected.transferchance = sanitize_integer(transfer_chance_input, 0, 100, initial(host.vore_selected.transferchance))
. = TRUE
@@ -1044,7 +1164,7 @@
host.vore_selected.transferlocation = choice.name
. = TRUE
if("b_transferchance_secondary")
- var/transfer_secondary_chance_input = input(user, "Set secondary belly transfer chance on resist (as %). You must also set the location for this to have any effect.", "Prey Escape Time") as num|null
+ var/transfer_secondary_chance_input = tgui_input_number(user, "Set secondary belly transfer chance on resist (as %). You must also set the location for this to have any effect.", "Prey Escape Time", null, 100, 0)
if(!isnull(transfer_secondary_chance_input))
host.vore_selected.transferchance_secondary = sanitize_integer(transfer_secondary_chance_input, 0, 100, initial(host.vore_selected.transferchance_secondary))
. = TRUE
@@ -1059,12 +1179,12 @@
host.vore_selected.transferlocation_secondary = choice_secondary.name
. = TRUE
if("b_absorbchance")
- var/absorb_chance_input = input(user, "Set belly absorb mode chance on resist (as %)", "Prey Absorb Chance") as num|null
+ var/absorb_chance_input = tgui_input_number(user, "Set belly absorb mode chance on resist (as %)", "Prey Absorb Chance", null, 100, 0)
if(!isnull(absorb_chance_input))
host.vore_selected.absorbchance = sanitize_integer(absorb_chance_input, 0, 100, initial(host.vore_selected.absorbchance))
. = TRUE
if("b_digestchance")
- var/digest_chance_input = input(user, "Set belly digest mode chance on resist (as %)", "Prey Digest Chance") as num|null
+ var/digest_chance_input = tgui_input_number(user, "Set belly digest mode chance on resist (as %)", "Prey Digest Chance", null, 100, 0)
if(!isnull(digest_chance_input))
host.vore_selected.digestchance = sanitize_integer(digest_chance_input, 0, 100, initial(host.vore_selected.digestchance))
. = TRUE
@@ -1074,6 +1194,9 @@
if("b_disable_hud")
host.vore_selected.disable_hud = !host.vore_selected.disable_hud
. = TRUE
+ if("b_save_digest_mode")
+ host.vore_selected.save_digest_mode = !host.vore_selected.save_digest_mode
+ . = TRUE
if("b_del")
var/alert = tgui_alert(usr, "Are you sure you want to delete your [lowertext(host.vore_selected.name)]?","Confirmation",list("Cancel","Delete"))
if(!(alert == "Delete"))
diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm
index 12fd69166e5..cbd566cf1ab 100644
--- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm
@@ -207,6 +207,20 @@
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "greatcoat_mob"
+//For general use
+/obj/item/clothing/suit/storage/vest/hoscoat/russofurcoat
+ name = "long fur coat"
+ desc = "A sophisticated long coat made of fur."
+
+ icon = 'icons/inventory/suit/mob_vr.dmi'
+ icon_state = "russofurcoat"
+
+ icon_override = 'icons/inventory/suit/mob_vr.dmi'
+ item_state = "russofurcoat"
+
+ allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask)
+ flags_inv = HIDETIE|HIDEHOLSTER
+
//For general use
/obj/item/clothing/suit/storage/fluff/fedcoat
name = "Federation Uniform Jacket (Red)"
@@ -2082,14 +2096,14 @@ Departamental Swimsuits, for general use
translocator_unequip(translocator, user)
T.forceMove(src)
translocator = T
- user.show_message("[bicon(src)]*click!*")
+ user.show_message("\icon[src][bicon(src)]*click!*")
playsound(src, 'sound/machines/click.ogg', 30, 1)
/obj/item/clothing/head/fluff/nikki/proc/translocator_unequip(var/obj/item/device/perfect_tele/T, var/mob/living/carbon/human/user)
if (translocator)
if (user)
user.put_in_hands(T)
- user.show_message("[bicon(src)]*click!*")
+ user.show_message("\icon[src][bicon(src)]*click!*")
else
translocator.forceMove(get_turf(src))
translocator = null
@@ -2433,10 +2447,65 @@ Departamental Swimsuits, for general use
else
RemoveHood_evelyn()
+//Allweek:Fifi the Magnificent
+/obj/item/clothing/head/fluff/fifi_hat
+ name = "fifi's hat"
+ desc = "It's a colorful hat for an eccentric entertaining cat."
+
+ icon = 'icons/vore/custom_clothes_vr.dmi'
+ icon_state = "fifi_hat"
+
+ icon_override = 'icons/vore/custom_clothes_vr.dmi'
+ item_state = "fifi_hat"
+
+/obj/item/clothing/under/fluff/fifi_jumpsuit
+ name = "fifi's jumpsuit"
+ desc = "It's a colorful outfit for an eccentric entertaining cat."
+
+ icon = 'icons/vore/custom_clothes_vr.dmi'
+ icon_state = "fifi_jumpsuit"
+
+ icon_override = 'icons/vore/custom_clothes_vr.dmi'
+ item_state = "fifi_jumpsuit"
+
+/obj/item/clothing/shoes/fluff/fifi_socks
+ name = "fifi's socks"
+ desc = "A pair of colorful socks for an eccentric entertaining cat."
+
+ icon = 'icons/vore/custom_clothes_vr.dmi'
+ icon_state = "fifi_socks"
+
+ icon_override = 'icons/vore/custom_clothes_vr.dmi'
+ item_state = "fifi_socks"
+
+
+
//Uncle_Fruit_VEVO - Bradley Khatibi
/obj/item/clothing/shoes/fluff/airjordans
name = "A pair of Air Jordan 1 Mid 'Black Gym Red's"
desc = "Appearing in a classic Jordan Brand colorway, the Air Jordan 1 Mid 'Black Gym Red' released in May 2021. Built with leather, the shoe's upper sports a white base, contrasted by black on the overlays and highlighted by Gym Red on the padded collar, 'Wings' logo and Swoosh branding. A breathable nylon tongue and perforated toe box support the fit, while underfoot, a standard rubber cupsole with Air in the heel anchors the build."
icon_state = "airjordans"
icon = 'icons/vore/custom_clothes_vr.dmi'
- icon_override = 'icons/vore/custom_onmob_vr.dmi'
\ No newline at end of file
+ icon_override = 'icons/vore/custom_onmob_vr.dmi'
+
+//Pandora029:Seona Young
+/obj/item/clothing/under/fluff/foxoflightsuit
+ name = "padded flightsui"
+ desc = "A ruddy-orange combination immersion-and-flight suit, fitted with extra padding across the front of its legs. Warm, waterproof and practical, seveal patches are scattered across it alongside a hard-wearing harness."
+
+ icon = 'icons/vore/custom_clothes_vr.dmi'
+ icon_state = "foxflightsuit"
+ worn_state = "foxflightsuit_mob"
+ rolled_sleeves = 0
+ rolled_down = 0
+
+ icon_override = 'icons/vore/custom_clothes_vr.dmi'
+ item_state = "foxflightsuit_mob"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
+
+//Shalax: Cerise Duelliste
+/obj/item/weapon/storage/belt/security/fluff/cerise
+ name = "champion's belt"
+ desc = "Cerise's hard-won belt from her glory days. Her skill might have waned since then, but her renown lives on."
+ icon_state = "champion"
+ item_state = null // i swear to god this works - hatterhat
diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm
index 96ea7e77a04..7694b46755a 100644
--- a/code/modules/vore/fluffstuff/custom_items_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_items_vr.dm
@@ -342,17 +342,24 @@
icon = 'icons/vore/custom_items_vr.dmi'
icon_override = 'icons/vore/custom_items_vr.dmi'
-//zodiacshadow: ?
+//zodiacshadow: Nehi Maximus
/obj/item/device/radio/headset/fluff/zodiacshadow
name = "Nehi's 'phones"
desc = "A pair of old-fashioned purple headphones for listening to music that also double as an NT-approved headset; they connect nicely to any standard PDA. One side is engraved with the letters NEHI, the other having an elaborate inscription of the words \"My voice is my weapon of choice\" in a fancy font. A modern polymer allows switching between modes to either allow one to hear one's surroundings or to completely block them out."
icon = 'icons/vore/custom_items_vr.dmi'
- icon_state = "headphones"
+ icon_state = "nehiphones"
- icon_override = 'icons/vore/custom_items_vr.dmi'
- item_state = "headphones_mob"
+ icon_override = 'icons/vore/custom_onmob_vr.dmi'
+ item_state = "nehiphones"
+//zodiacshadow: Nehi Maximus
+/obj/item/clothing/accessory/medal/silver/fluff/zodiacshadow
+ name = "Health Service Achievement medal"
+ desc = "A small silver medal with the inscription \"For going above and beyond in the field.\" on it, along with the name Nehi Maximus."
+
+ icon = 'icons/inventory/accessory/item.dmi'
+ icon_state = "silver"
// OrbisA: Richard D'angelo
/obj/item/weapon/melee/fluff/holochain
@@ -638,34 +645,6 @@
desc = "An elaborately made custom walking stick with a dark wooding core, a crimson red gemstone on its head and a steel cover around the bottom. you'd probably hear someone using this down the hall."
icon = 'icons/vore/custom_items_vr.dmi'
-//Stobarico - Alexis Bloise
-/obj/item/weapon/cane/wand
- name = "Ancient wand"
- desc = "A really old looking wand with floating parts and cyan crystals, wich seem to radiate a cyan glow. The wand has a golden plaque on the side that would say Corncobble, but it is covered by a sticker saying Bloise."
- icon = 'icons/vore/custom_items_vr.dmi'
- icon_state = "alexiswand"
- item_icons = list (slot_r_hand_str = 'icons/vore/custom_items_vr.dmi', slot_l_hand_str = 'icons/vore/custom_items_vr.dmi')
- item_state_slots = list(slot_r_hand_str = "alexiswandmob_r", slot_l_hand_str = "alexiswandmob_l")
- force = 1.0
- throwforce = 2.0
- w_class = ITEMSIZE_SMALL
- matter = list(MAT_STEEL = 50)
- attack_verb = list("sparkled", "whacked", "twinkled", "radiated", "dazzled", "zapped")
- hitsound = 'sound/weapons/sparkle.ogg'
- var/last_use = 0
- var/cooldown = 30
-
-/obj/item/weapon/cane/wand/attack_self(mob/user)
- if(last_use + cooldown >= world.time)
- return
- playsound(src, 'sound/weapons/sparkle.ogg', 50, 1)
- user.visible_message(" [user] swings their wand.")
- var/datum/effect/effect/system/spark_spread/s = new
- s.set_up(3, 1, src)
- s.start()
- last_use = world.time
- qdel ()
-
/obj/item/device/fluff/id_kit_ivy
name = "Holo-ID reprinter"
desc = "Stick your ID in one end and it'll print a new ID out the other!"
@@ -1449,7 +1428,7 @@
//thedavestdave Lucky
///I know this is pretty bodgey but if it stupid and it works it isn't stupid
-/obj/item/clothing/suit/storage/hooded/explorer/lucky
+/obj/item/clothing/suit/armor/combat/crusader_costume/lucky
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "luck"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
@@ -1458,15 +1437,6 @@
desc = "A chain mail suit with a badly drawn one eared cat on the front."
-/obj/item/device/modkit_conversion/crusader_luck
- skip_content_check = TRUE
- name = "Lucky's armor"
- desc = "A chain mail suit with a badly drawn one eared cat on the front."
- icon = 'icons/vore/custom_items_vr.dmi'
- icon_state = "modkit"
- from_suit = /obj/item/clothing/suit/storage/hooded/explorer
- to_suit = /obj/item/clothing/suit/storage/hooded/explorer/lucky
-
//RevolverEloise - Revolver Eloise
/obj/item/weapon/sword/fluff/revolver
name = "Catnip"
@@ -1495,4 +1465,31 @@
desc = "A well-worn slime custom-made yellow plushie, extensively hugged and loved. It reeks of lemon."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "lemonplush"
- attack_verb = list("blorbled", "slimed", "absorbed", "glomped")
\ No newline at end of file
+ attack_verb = list("blorbled", "slimed", "absorbed", "glomped")
+
+//Bricker98:Nettie Stough
+/obj/item/modular_computer/tablet/preset/custom_loadout/nettie
+ name = "Remodeled Tablet"
+ desc = "A tablet computer, looks quite high-tech and has some emblems on the back."
+ icon = 'icons/obj/modular_tablet.dmi'
+ icon_state = "elite"
+ icon_state_unpowered = "elite"
+
+/obj/item/modular_computer/tablet/preset/custom_loadout/nettie/install_default_hardware()
+ ..()
+ processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(src)
+ tesla_link = new/obj/item/weapon/computer_hardware/tesla_link(src)
+ hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/(src)
+ network_card = new/obj/item/weapon/computer_hardware/network_card/advanced(src)
+ nano_printer = new/obj/item/weapon/computer_hardware/nano_printer(src)
+ battery_module = new/obj/item/weapon/computer_hardware/battery_module(src)
+ battery_module.charge_to_full()
+
+
+//Stobarico - Kyu Comet
+/obj/item/instrument/piano_synth/fluff/kyutar
+ name = "Kyu's Custom Instrument"
+ desc = "A pastel pink guitar-like instrument with a body resembling a smug cat face. It seems to have a few different parts from a regular stringed instrument, including the lack of any strings, and the hand looking like a small screen, which connects to a small array of projectors."
+ icon = 'icons/vore/custom_items_vr.dmi'
+ item_icons = list(slot_l_hand_str = 'icons/vore/custom_items_left_hand_vr.dmi', slot_r_hand_str = 'icons/vore/custom_items_right_hand_vr.dmi')
+ icon_state = "kyuholotar"
diff --git a/code/modules/vore/mouseray.dm b/code/modules/vore/mouseray.dm
new file mode 100644
index 00000000000..d1d2b23a522
--- /dev/null
+++ b/code/modules/vore/mouseray.dm
@@ -0,0 +1,516 @@
+/obj/item/weapon/gun/energy/mouseray
+ name = "mouse ray"
+ desc = "A mysterious looking ray gun..."
+ icon = 'icons/obj/mouseray.dmi'
+ icon_state = "mouseray"
+ item_state = "mouseray"
+ item_icons = list(slot_l_hand_str = 'icons/mob/items/lefthand_guns_vr.dmi', slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi')
+ fire_sound = 'sound/weapons/wave.ogg'
+ charge_cost = 240
+ projectile_type = /obj/item/projectile/beam/mouselaser
+ origin_tech = list(TECH_BLUESPACE = 4)
+ battery_lock = 1
+ firemodes = list()
+ var/tf_type = /mob/living/simple_mob/animal/passive/mouse //This type is what kind of mob it will try to turn people into!
+ var/cooldown = 0 //automatically set when used
+ var/cooldown_time = 15 SECONDS //the amount of time between shots
+ var/tf_admin_pref_override = FALSE //Overrides pref checks
+ var/tf_allow_select = FALSE //Toggles if the gun is able to pick between things in the 'tf_possible_types' variable
+ var/tf_possible_types = list( //The different types of mob the gun can pick between
+ "mouse" = /mob/living/simple_mob/animal/passive/mouse,
+ "rat" = /mob/living/simple_mob/animal/passive/mouse/rat,
+ "dust jumper" = /mob/living/simple_mob/vore/alienanimals/dustjumper
+ )
+
+/obj/item/weapon/gun/energy/mouseray/attack_self(mob/user)
+ . = ..()
+ if(tf_allow_select)
+ pick_type()
+
+/obj/item/weapon/gun/energy/mouseray/proc/pick_type()
+ var/choice = tgui_input_list(usr, "Select a type to turn things into.", "[src.name]", tf_possible_types)
+ if(!choice)
+ return
+ tf_type = tf_possible_types[choice]
+ to_chat(usr, "You selected [choice].")
+
+/obj/item/weapon/gun/energy/mouseray/Fire(atom/target, mob/living/user, clickparams, pointblank, reflex)
+ if(world.time < cooldown)
+ to_chat(usr, "\The [src] isn't ready yet.")
+ return
+ . = ..()
+
+/obj/item/weapon/gun/energy/mouseray/Fire_userless(atom/target)
+ if(world.time < cooldown)
+ return
+ . = ..()
+
+/obj/item/weapon/gun/energy/mouseray/consume_next_projectile()
+ . = ..()
+ var/obj/item/projectile/beam/mouselaser/G = .
+ cooldown = world.time + cooldown_time
+ if(tf_type)
+ G.tf_type = tf_type
+ if(tf_admin_pref_override)
+ G.tf_admin_pref_override = tf_admin_pref_override
+
+/obj/item/weapon/gun/energy/mouseray/update_icon()
+ if(charge_meter)
+ var/ratio = power_supply.charge / power_supply.maxcharge
+
+ //make sure that rounding down will not give us the empty state even if we have charge for a shot left.
+ if(power_supply.charge < charge_cost)
+ ratio = 0
+ else
+ ratio = max(round(ratio, 0.25) * 100, 25)
+
+ icon_state = "[initial(icon_state)][ratio]"
+
+/obj/item/projectile/beam/mouselaser
+ name = "metamorphosis beam"
+ icon_state = "xray"
+ nodamage = 1
+ damage = 0
+ range = 7
+ check_armour = "laser"
+ can_miss = FALSE
+ var/tf_type = /mob/living/simple_mob/animal/passive/mouse
+ var/tf_admin_pref_override = FALSE
+
+ muzzle_type = /obj/effect/projectile/muzzle/laser_omni
+ tracer_type = /obj/effect/projectile/tracer/laser_omni
+ impact_type = /obj/effect/projectile/impact/laser_omni
+
+/obj/item/projectile/beam/mouselaser/on_hit(var/atom/target)
+ var/mob/living/M = target
+ if(!istype(M))
+ return
+ if(target != firer) //If you shot yourself, you probably want to be TFed so don't bother with prefs.
+ if(!M.allow_spontaneous_tf && !tf_admin_pref_override)
+ return
+ if(M.tf_mob_holder)
+ var/mob/living/ourmob = M.tf_mob_holder
+ if(ourmob.ai_holder)
+ var/datum/ai_holder/our_AI = ourmob.ai_holder
+ our_AI.set_stance(STANCE_IDLE)
+ M.tf_mob_holder = null
+ ourmob.ckey = M.ckey
+ var/turf/get_dat_turf = get_turf(target)
+ ourmob.loc = get_dat_turf
+ ourmob.forceMove(get_dat_turf)
+ ourmob.vore_selected = M.vore_selected
+ M.vore_selected = null
+ for(var/obj/belly/B as anything in M.vore_organs)
+ B.loc = ourmob
+ B.forceMove(ourmob)
+ B.owner = ourmob
+ M.vore_organs -= B
+ ourmob.vore_organs += B
+
+ ourmob.Life(1)
+ if(ishuman(M))
+ for(var/obj/item/W in M)
+ if(istype(W, /obj/item/weapon/implant/backup) || istype(W, /obj/item/device/nif))
+ continue
+ M.drop_from_inventory(W)
+
+ qdel(target)
+ return
+ else
+ if(M.stat == DEAD) //We can let it undo the TF, because the person will be dead, but otherwise things get weird.
+ return
+ var/mob/living/new_mob = spawn_mob(M)
+ new_mob.faction = M.faction
+
+ if(new_mob && isliving(new_mob))
+ for(var/obj/belly/B as anything in new_mob.vore_organs)
+ new_mob.vore_organs -= B
+ qdel(B)
+ new_mob.vore_organs = list()
+ new_mob.name = M.name
+ new_mob.real_name = M.real_name
+ for(var/lang in M.languages)
+ new_mob.languages |= lang
+ M.copy_vore_prefs_to_mob(new_mob)
+ new_mob.vore_selected = M.vore_selected
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(ishuman(new_mob))
+ var/mob/living/carbon/human/N = new_mob
+ N.gender = H.gender
+ N.identifying_gender = H.identifying_gender
+ else
+ new_mob.gender = H.identifying_gender
+ else
+ new_mob.gender = M.gender
+ if(ishuman(new_mob))
+ var/mob/living/carbon/human/N = new_mob
+ N.identifying_gender = M.gender
+
+ for(var/obj/belly/B as anything in M.vore_organs)
+ B.loc = new_mob
+ B.forceMove(new_mob)
+ B.owner = new_mob
+ M.vore_organs -= B
+ new_mob.vore_organs += B
+
+ new_mob.ckey = M.ckey
+ if(M.ai_holder && new_mob.ai_holder)
+ var/datum/ai_holder/old_AI = M.ai_holder
+ old_AI.set_stance(STANCE_SLEEP)
+ var/datum/ai_holder/new_AI = new_mob.ai_holder
+ new_AI.hostile = old_AI.hostile
+ new_AI.retaliate = old_AI.retaliate
+ M.loc = new_mob
+ M.forceMove(new_mob)
+ new_mob.tf_mob_holder = M
+
+/obj/item/projectile/beam/mouselaser/proc/spawn_mob(var/mob/living/target)
+ if(!ispath(tf_type))
+ return
+ var/new_mob = new tf_type(get_turf(target))
+ return new_mob
+
+/mob/living
+ var/mob/living/tf_mob_holder = null
+
+/mob/living/proc/revert_mob_tf()
+ if(!tf_mob_holder)
+ return
+ var/mob/living/ourmob = tf_mob_holder
+ if(ourmob.ai_holder)
+ var/datum/ai_holder/our_AI = ourmob.ai_holder
+ our_AI.set_stance(STANCE_IDLE)
+ tf_mob_holder = null
+ ourmob.ckey = ckey
+ var/turf/get_dat_turf = get_turf(src)
+ ourmob.loc = get_dat_turf
+ ourmob.forceMove(get_dat_turf)
+ ourmob.vore_selected = vore_selected
+ vore_selected = null
+ for(var/obj/belly/B as anything in vore_organs)
+ B.loc = ourmob
+ B.forceMove(ourmob)
+ B.owner = ourmob
+ vore_organs -= B
+ ourmob.vore_organs += B
+
+ ourmob.Life(1)
+
+ if(ishuman(src))
+ for(var/obj/item/W in src)
+ if(istype(W, /obj/item/weapon/implant/backup) || istype(W, /obj/item/device/nif))
+ continue
+ src.drop_from_inventory(W)
+
+ qdel(src)
+
+
+/mob/living/proc/handle_tf_holder()
+ if(!tf_mob_holder)
+ return
+ if(stat != tf_mob_holder.stat)
+ if(stat == DEAD)
+ tf_mob_holder.death(FALSE, null)
+ if(tf_mob_holder.stat == DEAD)
+ death()
+
+/mob/living/proc/copy_vore_prefs_to_mob(var/mob/living/new_mob)
+ //For primarily copying vore preference settings from a carbon mob to a simplemob
+ //It can be used for other things, but be advised, if you're using it to put a simplemob into a carbon mob, you're gonna be overriding a bunch of prefs
+ new_mob.ooc_notes = ooc_notes
+ new_mob.digestable = digestable
+ new_mob.devourable = devourable
+ new_mob.absorbable = absorbable
+ new_mob.feeding = feeding
+ new_mob.can_be_drop_prey = can_be_drop_prey
+ new_mob.can_be_drop_pred = can_be_drop_pred
+ new_mob.allow_inbelly_spawning = allow_inbelly_spawning
+ new_mob.digest_leave_remains = digest_leave_remains
+ new_mob.allowmobvore = allowmobvore
+ new_mob.permit_healbelly = permit_healbelly
+ new_mob.noisy = noisy
+ new_mob.selective_preference = selective_preference
+ new_mob.drop_vore = drop_vore
+ new_mob.stumble_vore = stumble_vore
+ new_mob.slip_vore = slip_vore
+ new_mob.resizable = resizable
+ new_mob.show_vore_fx = show_vore_fx
+ new_mob.step_mechanics_pref = step_mechanics_pref
+ new_mob.pickup_pref = pickup_pref
+ new_mob.vore_taste = vore_taste
+ new_mob.vore_smell = vore_smell
+ new_mob.nutrition_message_visible = nutrition_message_visible
+ new_mob.allow_spontaneous_tf = allow_spontaneous_tf
+
+/////SUBTYPES/////
+
+/obj/item/weapon/gun/energy/mouseray/medical //This just changes people back, it can't TF people into anything without shenanigans
+ name = "recombobulation ray"
+ desc = "The Type Gamma Medical Recombobulation ray! A mysterious looking ray gun! It works to change people who have had their form significantly altered back into their original forms!"
+
+ icon_state = "medray"
+ item_state = "mouseray"
+ charge_meter = FALSE
+ charge_cost = 0
+ tf_type = null
+ projectile_type = /obj/item/projectile/beam/mouselaser/reversion
+
+/obj/item/weapon/gun/energy/mouseray/medical/consume_next_projectile()
+ . = ..()
+ var/obj/item/projectile/beam/mouselaser/reversion/G = .
+ cooldown = world.time + cooldown_time
+ if(tf_admin_pref_override)
+ G.tf_admin_pref_override = tf_admin_pref_override
+
+
+/obj/item/projectile/beam/mouselaser/reversion
+ name = "recombobulation beam"
+ tf_admin_pref_override = FALSE
+
+/obj/item/projectile/beam/mouselaser/reversion/on_hit(var/atom/target)
+ if(istype(target,/obj/item)) //Are we shooting an item?
+ var/obj/item/O = target
+ if(O.possessed_voice.len) //Does the object have a voice? AKA, if someone inhabiting it?
+ for(var/mob/living/M in O.possessed_voice)
+ if(M.tf_mob_holder) //Is this item possessed by IC methods?
+ if(istype(M.loc, /obj/item/clothing)) //Are they in clothes? Delete the item then revert them.
+ qdel(O)
+ M.revert_mob_tf() //Voices can't eat, so this is the least intensive way to revert them.
+ else
+ M.forceMove(get_turf(O)) //Non-clothing items require a bit extra work since they don't drop contents when qdeleted.
+ qdel(O)
+ M.revert_mob_tf()
+ else
+ continue //In case they have multiple voices through adminbus.
+ else
+ return
+ var/mob/living/M = target
+ if(!istype(M))
+ return
+ if(target != firer) //If you shot yourself, you probably want to be TFed so don't bother with prefs.
+ if(!M.allow_spontaneous_tf && !tf_admin_pref_override)
+ firer.visible_message("\The [src] buzzes impolitely.")
+ return
+ if(M.tf_mob_holder)
+ var/mob/living/ourmob = M.tf_mob_holder
+ if(ourmob.ai_holder)
+ var/datum/ai_holder/our_AI = ourmob.ai_holder
+ our_AI.set_stance(STANCE_IDLE)
+ M.tf_mob_holder = null
+ ourmob.ckey = M.ckey
+ var/turf/get_dat_turf = get_turf(target)
+ ourmob.loc = get_dat_turf
+ ourmob.forceMove(get_dat_turf)
+ ourmob.vore_selected = M.vore_selected
+ M.vore_selected = null
+ for(var/obj/belly/B as anything in M.vore_organs)
+ B.loc = ourmob
+ B.forceMove(ourmob)
+ B.owner = ourmob
+ M.vore_organs -= B
+ ourmob.vore_organs += B
+
+ ourmob.Life(1)
+
+ if(ishuman(M))
+ for(var/obj/item/W in M)
+ if(istype(W, /obj/item/weapon/implant/backup) || istype(W, /obj/item/device/nif))
+ continue
+ M.drop_from_inventory(W)
+
+ qdel(target)
+ firer.visible_message("\The [shot_from] boops pleasantly.")
+ return
+ else
+ firer.visible_message("\The [shot_from] buzzes impolitely.")
+
+/obj/item/weapon/gun/energy/mouseray/admin //NEVER GIVE THIS TO ANYONE
+ name = "experimental metamorphosis ray"
+ cooldown_time = 5 SECONDS
+ tf_allow_select = TRUE
+ charge_meter = FALSE
+ charge_cost = 0
+ icon_state = "adminray"
+
+/obj/item/weapon/gun/energy/mouseray/metamorphosis
+ name = "metamorphosis ray"
+ tf_allow_select = TRUE
+ tf_possible_types = list(
+ "mouse" = /mob/living/simple_mob/animal/passive/mouse,
+ "rat" = /mob/living/simple_mob/animal/passive/mouse/rat,
+ "dust jumper" = /mob/living/simple_mob/vore/alienanimals/dustjumper,
+ "woof" = /mob/living/simple_mob/vore/woof,
+ "corgi" = /mob/living/simple_mob/animal/passive/dog/corgi,
+ "cat" = /mob/living/simple_mob/animal/passive/cat,
+ "chicken" = /mob/living/simple_mob/animal/passive/chicken,
+ "cow" = /mob/living/simple_mob/animal/passive/cow,
+ "lizard" = /mob/living/simple_mob/animal/passive/lizard,
+ "rabbit" = /mob/living/simple_mob/vore/rabbit,
+ "fox" = /mob/living/simple_mob/animal/passive/fox,
+ "fennec" = /mob/living/simple_mob/vore/fennec,
+ "cute fennec" = /mob/living/simple_mob/animal/passive/fennec,
+ "fennix" = /mob/living/simple_mob/vore/fennix,
+ "red panda" = /mob/living/simple_mob/vore/redpanda,
+ "opossum" = /mob/living/simple_mob/animal/passive/opossum,
+ "horse" = /mob/living/simple_mob/vore/horse,
+ "goose" = /mob/living/simple_mob/animal/space/goose,
+ "sheep" = /mob/living/simple_mob/vore/sheep
+ )
+
+/obj/item/weapon/gun/energy/mouseray/metamorphosis/advanced
+ name = "advanced metamorphosis ray"
+ tf_possible_types = list(
+ "mouse" = /mob/living/simple_mob/animal/passive/mouse,
+ "rat" = /mob/living/simple_mob/animal/passive/mouse/rat,
+ "giant rat" = /mob/living/simple_mob/vore/aggressive/rat,
+ "dust jumper" = /mob/living/simple_mob/vore/alienanimals/dustjumper,
+ "woof" = /mob/living/simple_mob/vore/woof,
+ "corgi" = /mob/living/simple_mob/animal/passive/dog/corgi,
+ "cat" = /mob/living/simple_mob/animal/passive/cat,
+ "chicken" = /mob/living/simple_mob/animal/passive/chicken,
+ "cow" = /mob/living/simple_mob/animal/passive/cow,
+ "lizard" = /mob/living/simple_mob/animal/passive/lizard,
+ "rabbit" = /mob/living/simple_mob/vore/rabbit,
+ "fox" = /mob/living/simple_mob/animal/passive/fox,
+ "fennec" = /mob/living/simple_mob/vore/fennec,
+ "cute fennec" = /mob/living/simple_mob/animal/passive/fennec,
+ "fennix" = /mob/living/simple_mob/vore/fennix,
+ "red panda" = /mob/living/simple_mob/vore/redpanda,
+ "opossum" = /mob/living/simple_mob/animal/passive/opossum,
+ "horse" = /mob/living/simple_mob/vore/horse,
+ "goose" = /mob/living/simple_mob/animal/space/goose,
+ "sheep" = /mob/living/simple_mob/vore/sheep,
+ "space bumblebee" = /mob/living/simple_mob/vore/bee,
+ "space bear" = /mob/living/simple_mob/animal/space/bear,
+ "voracious lizard" = /mob/living/simple_mob/vore/aggressive/dino,
+ "giant frog" = /mob/living/simple_mob/vore/aggressive/frog,
+ "jelly blob" = /mob/living/simple_mob/animal/space/jelly,
+ "wolf" = /mob/living/simple_mob/animal/wolf,
+ "direwolf" = /mob/living/simple_mob/animal/wolf/direwolf,
+ "great wolf" = /mob/living/simple_mob/vore/greatwolf,
+ "sect queen" = /mob/living/simple_mob/vore/sect_queen,
+ "sect drone" = /mob/living/simple_mob/vore/sect_drone,
+ "panther" = /mob/living/simple_mob/vore/aggressive/panther,
+ "giant snake" = /mob/living/simple_mob/vore/aggressive/giant_snake,
+ "deathclaw" = /mob/living/simple_mob/vore/aggressive/deathclaw,
+ "otie" = /mob/living/simple_mob/otie,
+ "mutated otie" =/mob/living/simple_mob/otie/feral,
+ "red otie" = /mob/living/simple_mob/otie/red,
+ "defanged xenomorph" = /mob/living/simple_mob/vore/xeno_defanged,
+ "catslug" = /mob/living/simple_mob/vore/alienanimals/catslug,
+ "teppi" = /mob/living/simple_mob/vore/alienanimals/teppi,
+ "monkey" = /mob/living/carbon/human/monkey,
+ "wolpin" = /mob/living/carbon/human/wolpin,
+ "sparra" = /mob/living/carbon/human/sparram,
+ "saru" = /mob/living/carbon/human/sergallingm,
+ "sobaka" = /mob/living/carbon/human/sharkm,
+ "farwa" = /mob/living/carbon/human/farwa,
+ "neaera" = /mob/living/carbon/human/neaera,
+ "stok" = /mob/living/carbon/human/stok,
+ "weretiger" = /mob/living/simple_mob/vore/weretiger,
+ "dragon" = /mob/living/simple_mob/vore/bigdragon/friendly,
+ "leopardmander" = /mob/living/simple_mob/vore/leopardmander
+ )
+
+/obj/item/weapon/gun/energy/mouseray/metamorphosis/advanced/random
+ name = "unstable metamorphosis ray"
+ tf_allow_select = FALSE
+
+/obj/item/weapon/gun/energy/mouseray/metamorphosis/advanced/random/Fire(atom/target, mob/living/user, clickparams, pointblank, reflex)
+ if(world.time < cooldown)
+ to_chat(usr, "\The [src] isn't ready yet.")
+ return
+ var/choice = pick(tf_possible_types)
+ tf_type = tf_possible_types[choice]
+ . = ..()
+
+/obj/item/weapon/gun/energy/mouseray/woof
+ name = "woof ray"
+ tf_type = /mob/living/simple_mob/vore/woof
+
+/obj/item/weapon/gun/energy/mouseray/corgi
+ name = "corgi ray"
+ tf_type = /mob/living/simple_mob/animal/passive/dog/corgi
+
+/obj/item/weapon/gun/energy/mouseray/cat
+ name = "cat ray"
+ tf_type = /mob/living/simple_mob/animal/passive/cat
+
+/obj/item/weapon/gun/energy/mouseray/chicken
+ name = "chicken ray"
+ tf_type = /mob/living/simple_mob/animal/passive/chicken
+
+/obj/item/weapon/gun/energy/mouseray/lizard
+ name = "lizard ray"
+ tf_type = /mob/living/simple_mob/animal/passive/lizard
+
+/obj/item/weapon/gun/energy/mouseray/rabbit
+ name = "rabbit ray"
+ tf_type = /mob/living/simple_mob/vore/rabbit
+
+/obj/item/weapon/gun/energy/mouseray/fennec
+ name = "fennec ray"
+ tf_type = /mob/living/simple_mob/animal/passive/fennec
+
+/obj/item/weapon/gun/energy/mouseray/monkey
+ name = "monkey ray"
+ tf_type = /mob/living/carbon/human/monkey
+
+/obj/item/weapon/gun/energy/mouseray/wolpin
+ name = "wolpin ray"
+ tf_type = /mob/living/carbon/human/wolpin
+
+/obj/item/weapon/gun/energy/mouseray/otie
+ name = "otie ray"
+ tf_type = /mob/living/simple_mob/otie
+
+/obj/item/weapon/gun/energy/mouseray/direwolf
+ name = "dire wolf ray"
+ tf_type = /mob/living/simple_mob/animal/wolf/direwolf
+
+/obj/item/weapon/gun/energy/mouseray/giantrat
+ name = "giant rat ray"
+ tf_type = /mob/living/simple_mob/vore/aggressive/rat
+
+/obj/item/weapon/gun/energy/mouseray/redpanda
+ name = "red panda ray"
+ tf_type = /mob/living/simple_mob/vore/redpanda
+
+/obj/item/weapon/gun/energy/mouseray/catslug
+ name = "catslug ray"
+ tf_type = /mob/living/simple_mob/vore/alienanimals/catslug
+
+/obj/item/weapon/gun/energy/mouseray/teppi
+ name = "teppi ray"
+ tf_type = /mob/living/simple_mob/vore/alienanimals/teppi
+
+
+/////RANDOM SPAWNER/////
+
+/obj/random/mouseray
+ name = "random ray"
+ icon = 'icons/mob/randomlandmarks.dmi'
+ icon_state = "fanc_trejur"
+ spawn_nothing_percentage = 0
+
+/obj/random/mouseray/item_to_spawn()
+ return pick(prob(300);/obj/item/weapon/gun/energy/mouseray,
+ prob(50);/obj/item/weapon/gun/energy/mouseray/corgi,
+ prob(50);/obj/item/weapon/gun/energy/mouseray/woof,
+ prob(50);/obj/item/weapon/gun/energy/mouseray/cat,
+ prob(50);/obj/item/weapon/gun/energy/mouseray/chicken,
+ prob(50);/obj/item/weapon/gun/energy/mouseray/lizard,
+ prob(50);/obj/item/weapon/gun/energy/mouseray/rabbit,
+ prob(50);/obj/item/weapon/gun/energy/mouseray/fennec,
+ prob(5);/obj/item/weapon/gun/energy/mouseray/monkey,
+ prob(5);/obj/item/weapon/gun/energy/mouseray/wolpin,
+ prob(5);/obj/item/weapon/gun/energy/mouseray/otie,
+ prob(5);/obj/item/weapon/gun/energy/mouseray/direwolf,
+ prob(5);/obj/item/weapon/gun/energy/mouseray/giantrat,
+ prob(50);/obj/item/weapon/gun/energy/mouseray/redpanda,
+ prob(5);/obj/item/weapon/gun/energy/mouseray/catslug,
+ prob(5);/obj/item/weapon/gun/energy/mouseray/teppi,
+ prob(1);/obj/item/weapon/gun/energy/mouseray/metamorphosis,
+ prob(1);/obj/item/weapon/gun/energy/mouseray/metamorphosis/advanced/random
+ )
diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm
index c77fd207fa0..b75d9cd2edf 100644
--- a/code/modules/vore/resizing/holder_micro_vr.dm
+++ b/code/modules/vore/resizing/holder_micro_vr.dm
@@ -10,7 +10,7 @@
item_icons = null // No in-hand sprites (for now, anyway, we could totally add some)
pixel_y = 0 // Override value from parent.
-/obj/item/weapon/holder/micro/examine(mob/user)
+/obj/item/weapon/holder/examine(mob/user)
. = list()
for(var/mob/living/M in contents)
. += M.examine(user)
diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm
index b82ecb07e74..02b444febd1 100644
--- a/code/modules/vore/resizing/resize_vr.dm
+++ b/code/modules/vore/resizing/resize_vr.dm
@@ -39,12 +39,20 @@
* but in the future we may also incorporate the "mob_size", so that
* a macro mouse is still only effectively "normal" or a micro dragon is still large etc.
*/
-/mob/proc/get_effective_size()
+/mob/proc/get_effective_size(var/micro = FALSE)
return 100000 //Whatever it is, it's too big to pick up, or it's a ghost, or something.
-/mob/living/get_effective_size()
+/mob/living/get_effective_size(var/micro = FALSE)
return size_multiplier
+/mob/living/carbon/human/get_effective_size(var/micro = FALSE) // Set micro to TRUE for interactions where you're small, to FALSE for ones where you're large.
+ var/effective_size = size_multiplier
+ if(micro)
+ effective_size += species.micro_size_mod
+ else
+ effective_size += species.macro_size_mod
+ return effective_size
+
/atom/movable/proc/size_range_check(size_select) //both objects and mobs needs to have that
var/area/A = get_area(src) //Get the atom's area to check for size limit.
if((A?.limit_mob_size && (size_select > 200 || size_select < 25)) || (size_select > 600 || size_select <1))
@@ -113,8 +121,6 @@
/mob/living/carbon/human/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE, var/aura_animation = TRUE)
if(!resizable && !ignore_prefs)
return 1
- if(species)
- vis_height = species.icon_height
. = ..()
if(LAZYLEN(hud_list) && has_huds)
var/new_y_offset = vis_height * (size_multiplier - 1)
@@ -132,7 +138,6 @@
* Ace was here! Redid this a little so we'd use math for shrinking characters. This is the old code.
*/
-
/mob/living/proc/set_size()
set name = "Adjust Mass"
set category = "Abilities" //Seeing as prometheans have an IC reason to be changing mass.
@@ -142,12 +147,13 @@
return
var/nagmessage = "Adjust your mass to be a size between 25 to 200% (or 1% to 600% in dormitories). (DO NOT ABUSE)"
- var/new_size = input(nagmessage, "Pick a Size") as num|null
+ var/default = size_multiplier * 100
+ var/new_size = tgui_input_number(usr, nagmessage, "Pick a Size", default, 600, 1)
if(size_range_check(new_size))
resize(new_size/100, uncapped = has_large_resize_bounds(), ignore_prefs = TRUE)
// I'm not entirely convinced that `src ? ADMIN_JMP(src) : "null"` here does anything
// but just in case it does, I'm leaving the null-src checking
- message_admins("[key_name(src)] used the resize command in-game to be [new_size]% size. [src ? ADMIN_JMP(src) : "null"]")
+ log_admin("[key_name(src)] used the resize command in-game to be [new_size]% size. [src ? ADMIN_JMP(src) : "null"]")
/*
//Add the set_size() proc to usable verbs. By commenting this out, we can leave the proc and hand it to species that need it.
@@ -165,7 +171,7 @@
return 0
if(!(M.a_intent == I_HELP))
return 0
- var/size_diff = M.get_effective_size() - get_effective_size()
+ var/size_diff = M.get_effective_size(FALSE) - get_effective_size(TRUE)
if(!holder_default && holder_type)
holder_default = holder_type
if(!istype(M))
@@ -199,16 +205,16 @@
return TRUE
//Both small! Go ahead and go.
- if(get_effective_size() <= RESIZE_A_SMALLTINY && tmob.get_effective_size() <= RESIZE_A_SMALLTINY)
+ if(get_effective_size(TRUE) <= RESIZE_A_SMALLTINY && tmob.get_effective_size(TRUE) <= RESIZE_A_SMALLTINY) // For help intent interaction just assume both are 'smol'
return TRUE
//Worthy of doing messages at all
- if(abs(get_effective_size() - tmob.get_effective_size()) >= 0.50)
+ if(abs(get_effective_size(TRUE) - tmob.get_effective_size(TRUE)) >= 0.50)
var/src_message = null
var/tmob_message = null
//Smaller person being stepped onto
- if(get_effective_size() > tmob.get_effective_size() && ishuman(src))
+ if(get_effective_size(TRUE) > tmob.get_effective_size(TRUE) && ishuman(src))
src_message = "You carefully step over [tmob]."
tmob_message = "[src] steps over you carefully!"
var/mob/living/carbon/human/H = src
@@ -220,7 +226,7 @@
tmob_message = tail.msg_prey_help_run
//Smaller person stepping under larger person
- else if(get_effective_size() < tmob.get_effective_size() && ishuman(tmob))
+ else if(get_effective_size(TRUE) < tmob.get_effective_size(TRUE) && ishuman(tmob))
src_message = "You run between [tmob]'s legs."
tmob_message = "[src] runs between your legs."
var/mob/living/carbon/human/H = tmob
@@ -271,7 +277,7 @@
// We need to be above a certain size ratio in order to do anything to the prey.
// For DISARM and HURT intent, this is >=0.75, for GRAB it is >=0.5
- var/size_ratio = get_effective_size() - tmob.get_effective_size()
+ var/size_ratio = get_effective_size(FALSE) - tmob.get_effective_size(TRUE)
if(a_intent == I_GRAB && size_ratio < 0.5)
return FALSE
if((a_intent == I_DISARM || a_intent == I_HURT) && size_ratio < 0.75)
diff --git a/code/modules/vore/resizing/sizegun_slow_vr.dm b/code/modules/vore/resizing/sizegun_slow_vr.dm
index 5a267cb6dac..d6edc193617 100644
--- a/code/modules/vore/resizing/sizegun_slow_vr.dm
+++ b/code/modules/vore/resizing/sizegun_slow_vr.dm
@@ -50,16 +50,16 @@
if(unresizable)
return TRUE
- if(!(target.has_large_resize_bounds()) && (target.get_effective_size() >= RESIZE_MAXIMUM) && sizeshift_mode == SIZE_GROW)
+ if(!(target.has_large_resize_bounds()) && (target.size_multiplier >= RESIZE_MAXIMUM) && sizeshift_mode == SIZE_GROW)
return TRUE
- if(target.get_effective_size() >= RESIZE_MAXIMUM_DORMS && sizeshift_mode == SIZE_GROW)
+ if(target.size_multiplier >= RESIZE_MAXIMUM_DORMS && sizeshift_mode == SIZE_GROW)
return TRUE
- if(!(target.has_large_resize_bounds()) && (target.get_effective_size() <= RESIZE_MINIMUM) && sizeshift_mode == SIZE_SHRINK)
+ if(!(target.has_large_resize_bounds()) && (target.size_multiplier <= RESIZE_MINIMUM) && sizeshift_mode == SIZE_SHRINK)
return TRUE
- if(target.get_effective_size() <= RESIZE_MINIMUM_DORMS && sizeshift_mode == SIZE_SHRINK)
+ if(target.size_multiplier <= RESIZE_MINIMUM_DORMS && sizeshift_mode == SIZE_SHRINK)
return TRUE
return FALSE
@@ -123,9 +123,9 @@
stoplag(3)
if(sizeshift_mode == SIZE_SHRINK)
- L.resize((L.get_effective_size() - size_increment), uncapped = L.has_large_resize_bounds(), aura_animation = FALSE)
+ L.resize((L.size_multiplier - size_increment), uncapped = L.has_large_resize_bounds(), aura_animation = FALSE)
else if(sizeshift_mode == SIZE_GROW)
- L.resize((L.get_effective_size() + size_increment), uncapped = L.has_large_resize_bounds(), aura_animation = FALSE)
+ L.resize((L.size_multiplier + size_increment), uncapped = L.has_large_resize_bounds(), aura_animation = FALSE)
busy = FALSE
current_target = null
diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm
index 1f8eb6f2077..f09077ee4b8 100644
--- a/code/modules/vore/resizing/sizegun_vr.dm
+++ b/code/modules/vore/resizing/sizegun_vr.dm
@@ -5,8 +5,9 @@
name = "size gun" //I have no idea why this was called shrink ray when this increased and decreased size.
desc = "A highly advanced ray gun with a knob on the side to adjust the size you desire. Warning: Do not insert into mouth."
icon = 'icons/obj/gun_vr.dmi'
- icon_state = "sizegun"
+ icon_state = "sizegun-shrink100"
item_state = "sizegun"
+ var/initial_icon_state = "sizegun"
item_icons = list(slot_l_hand_str = 'icons/mob/items/lefthand_guns_vr.dmi', slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi')
fire_sound = 'sound/weapons/wave.ogg'
charge_cost = 240
@@ -41,7 +42,7 @@
set category = "Object"
set src in view(1)
- var/size_select = input(usr, "Put the desired size (25-200%), (1-600%) in dormitory areas.", "Set Size", size_set_to * 100) as num|null
+ var/size_select = tgui_input_number(usr, "Put the desired size (25-200%), (1-600%) in dormitory areas.", "Set Size", size_set_to * 100, 600, 1)
if(!size_select)
return //cancelled
//We do valid resize testing in actual firings because people move after setting these things.
@@ -64,8 +65,8 @@
else
ratio = max(round(ratio, 0.25) * 100, 25)
- icon_state = "[initial(icon_state)]-[grow_mode][ratio]"
- item_state = "[initial(icon_state)]-[grow_mode]"
+ icon_state = "[initial_icon_state]-[grow_mode][ratio]"
+ item_state = "[initial_icon_state]-[grow_mode]"
if(!ignore_inhands) update_held_icon()
@@ -82,8 +83,9 @@
creature well beyond any conceivable size. Only a handfull of these \
exist in the known universe and they are \
exclusively owned by NanoTrasen for research purposes."
- icon_state = "sizegun_admin"
+ icon_state = "sizegun_admin-shrink100"
item_state = "sizegun_admin"
+ initial_icon_state = "sizegun_admin"
charge_cost = 0
projectile_type = /obj/item/projectile/beam/sizelaser/admin
@@ -105,8 +107,9 @@
name = "alien size gun"
desc = "A strange looking ray gun weapon with an adjustor knob on the side. The design is alien, but it bares a striking resemblence to the older model size guns that NT uses for research."
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_sizegun)
- icon_state = "sizegun-abductor"
+ icon_state = "sizegun-abductor-shrink100"
item_state = "sizegun-abductor"
+ initial_icon_state = "sizegun-abductor"
charge_cost = 0
projectile_type = /obj/item/projectile/beam/sizelaser/admin/alien
@@ -115,7 +118,7 @@
set category = "Object"
set src in view(1)
- var/size_select = input(usr, "Put the desired size (1-600%)", "Set Size", size_set_to * 100) as num|null
+ var/size_select = tgui_input_number(usr, "Put the desired size (1-600%)", "Set Size", size_set_to * 100, 600, 1)
if(!size_select)
return //cancelled
size_set_to = clamp((size_select/100), 0, 1000) //eheh
@@ -136,6 +139,7 @@
damage = 0
check_armour = "laser"
var/set_size = 1 //Let's default to 100%
+ can_miss = FALSE
muzzle_type = /obj/effect/projectile/muzzle/xray
tracer_type = /obj/effect/projectile/tracer/xray
diff --git a/code/modules/vore/smoleworld/smoleworld_vr.dm b/code/modules/vore/smoleworld/smoleworld_vr.dm
index f9d1c92a642..ae44a9ab2b2 100644
--- a/code/modules/vore/smoleworld/smoleworld_vr.dm
+++ b/code/modules/vore/smoleworld/smoleworld_vr.dm
@@ -19,9 +19,9 @@
var/mob/living/L = A
if(L.hovering) // Flying things shouldn't make footprints.
return ..()
- if(L.get_effective_size() <= RESIZE_NORMAL)
+ if(L.get_effective_size(FALSE) <= RESIZE_NORMAL)
return ..()
- if(L.get_effective_size() >= RESIZE_A_BIGNORMAL)
+ if(L.get_effective_size(FALSE) >= RESIZE_A_BIGNORMAL)
playsound(src, 'sound/effects/footstep/giantstep_gigga.ogg', 35, 1, -1, volume_channel = VOLUME_CHANNEL_MASTER)
var/mdir = "[A.dir]"
crossed_dirs[mdir] = 1
@@ -365,7 +365,7 @@
// . = ..()
// if(.)
//
-// if(M.get_effective_size() > RESIZE_TINY)
+// if(M.get_effective_size(TRUE) > RESIZE_TINY)
// to_chat(M, SPAN_WARNING("You are to big to fit in \the [src]."))
// . = FALSE
//
diff --git a/code/modules/xenoarcheaology/artifacts/artifact_find.dm b/code/modules/xenoarcheaology/artifacts/artifact_find.dm
index fe91bbadbcd..dcbe6bea849 100644
--- a/code/modules/xenoarcheaology/artifacts/artifact_find.dm
+++ b/code/modules/xenoarcheaology/artifacts/artifact_find.dm
@@ -13,6 +13,7 @@
25;/obj/machinery/power/supermatter/shard,
100;/obj/machinery/auto_cloner,
100;/obj/machinery/giga_drill,
- 100;/obj/machinery/replicator,
+ 100;/obj/machinery/replicator/clothing, //VOREStation Edit: use virgo-specific subtype that allows TF into items.
+ 100;/obj/machinery/replicator/vore, //VOREStation Edit: use virgo-specific subtype that allows TF into mobs.
150;/obj/structure/crystal,
1000;/obj/machinery/artifact)
diff --git a/code/modules/xenoarcheaology/artifacts/autocloner.dm b/code/modules/xenoarcheaology/artifacts/autocloner.dm
index 3a20e2955d8..0e37fb84039 100644
--- a/code/modules/xenoarcheaology/artifacts/autocloner.dm
+++ b/code/modules/xenoarcheaology/artifacts/autocloner.dm
@@ -46,17 +46,17 @@
if(!previous_power_state)
previous_power_state = 1
icon_state = "cellold1"
- src.visible_message("[bicon(src)] [src] suddenly comes to life!")
+ src.visible_message("\icon[src][bicon(src)] [src] suddenly comes to life!")
//slowly grow a mob
if(prob(5))
- src.visible_message("[bicon(src)] [src] [pick("gloops","glugs","whirrs","whooshes","hisses","purrs","hums","gushes")].")
+ src.visible_message("\icon[src][bicon(src)] [src] [pick("gloops","glugs","whirrs","whooshes","hisses","purrs","hums","gushes")].")
//if we've finished growing...
if(time_spent_spawning >= time_per_spawn)
time_spent_spawning = 0
update_use_power(USE_POWER_IDLE)
- src.visible_message("[bicon(src)] [src] pings!")
+ src.visible_message("\icon[src][bicon(src)] [src] pings!")
icon_state = "cellold1"
desc = "It's full of a bubbling viscous liquid, and is lit by a mysterious glow."
if(spawn_type)
@@ -77,7 +77,7 @@
if(previous_power_state)
previous_power_state = 0
icon_state = "cellold0"
- src.visible_message("[bicon(src)] [src] suddenly shuts down.")
+ src.visible_message("\icon[src][bicon(src)] [src] suddenly shuts down.")
//cloned mob slowly breaks down
time_spent_spawning = max(time_spent_spawning + last_process - world.time, 0)
diff --git a/code/modules/xenoarcheaology/artifacts/replicator.dm b/code/modules/xenoarcheaology/artifacts/replicator.dm
index 2fdc0169528..a782618d20f 100644
--- a/code/modules/xenoarcheaology/artifacts/replicator.dm
+++ b/code/modules/xenoarcheaology/artifacts/replicator.dm
@@ -98,7 +98,7 @@
"foreground" = colors[color],
)))
- fail_message = "[bicon(src)] a [pick("loud","soft","sinister","eery","triumphant","depressing","cheerful","angry")] \
+ fail_message = "\icon[src][bicon(src)] a [pick("loud","soft","sinister","eery","triumphant","depressing","cheerful","angry")] \
[pick("horn","beep","bing","bleep","blat","honk","hrumph","ding")] sounds and a \
[pick("yellow","purple","green","blue","red","orange","white")] \
[pick("light","dial","meter","window","protrusion","knob","antenna","swirly thing")] \
@@ -110,7 +110,7 @@
if(spawning_types.len && powered())
spawn_progress_time += world.time - last_process_time
if(spawn_progress_time > max_spawn_time)
- src.visible_message("[bicon(src)] [src] pings!")
+ src.visible_message("\icon[src][bicon(src)] [src] pings!")
var/obj/source_material = pop(stored_materials)
var/spawn_type = pop(spawning_types)
@@ -133,7 +133,7 @@
icon_state = "borgcharger0(old)"
else if(prob(5))
- src.visible_message("[bicon(src)] [src] [pick("clicks","whizzes","whirrs","whooshes","clanks","clongs","clonks","bangs")].")
+ src.visible_message("\icon[src][bicon(src)] [src] [pick("clicks","whizzes","whirrs","whooshes","clanks","clongs","clonks","bangs")].")
last_process_time = world.time
@@ -161,9 +161,9 @@
if(key in construction)
if(LAZYLEN(stored_materials) > LAZYLEN(spawning_types))
if(LAZYLEN(spawning_types))
- visible_message("[bicon(src)] a [pick("light","dial","display","meter","pad")] on [src]'s front [pick("blinks","flashes")] [pick("red","yellow","blue","orange","purple","green","white")].")
+ visible_message("\icon[src][bicon(src)] a [pick("light","dial","display","meter","pad")] on [src]'s front [pick("blinks","flashes")] [pick("red","yellow","blue","orange","purple","green","white")].")
else
- visible_message("[bicon(src)] [src]'s front compartment slides shut.")
+ visible_message("\icon[src][bicon(src)] [src]'s front compartment slides shut.")
spawning_types.Add(construction[key])
spawn_progress_time = 0
update_use_power(USE_POWER_ACTIVE)
diff --git a/code/modules/xenoarcheaology/artifacts/replicator_vr.dm b/code/modules/xenoarcheaology/artifacts/replicator_vr.dm
new file mode 100644
index 00000000000..8fc3dba9b4d
--- /dev/null
+++ b/code/modules/xenoarcheaology/artifacts/replicator_vr.dm
@@ -0,0 +1,598 @@
+
+//////////////////////////////
+//////VORE-MOB REPLICATOR/////
+//////////////////////////////
+/obj/machinery/replicator/vore
+ name = "alien machine"
+ desc = "It's some kind of pod with strange wires and gadgets all over it. This one appears to have a humanoid shaped slot as an input. It has depictions of various creatures on the buttons." //Explain to the user that it turns people into mobs.
+ icon = 'icons/obj/xenoarchaeology.dmi'
+ icon_state = "borgcharger0(old)"
+ var/quantity = 18 //This needs to be replaced with a GUI that lets you select the item you want.
+ var/list/created_mobs = list()
+ var/list/tgui_vore_selection = list()
+ var/list/viable_mobs = list(
+ /mob/living/simple_mob/animal/passive/fox,
+ /mob/living/simple_mob/animal/passive/cow,
+ /mob/living/simple_mob/animal/passive/chicken,
+ /mob/living/simple_mob/animal/passive/opossum,
+ /mob/living/simple_mob/animal/passive/mouse,
+ /mob/living/simple_mob/vore/rabbit,
+ /mob/living/simple_mob/animal/goat,
+ /mob/living/simple_mob/animal/sif/tymisian,
+ /mob/living/simple_mob/animal/wolf/direwolf,
+ /mob/living/simple_mob/otie/friendly,
+ /mob/living/simple_mob/vore/alienanimals/catslug,
+ /mob/living/simple_mob/vore/alienanimals/teppi,
+ /mob/living/simple_mob/vore/fennec,
+ /mob/living/simple_mob/vore/xeno_defanged,
+ /mob/living/simple_mob/vore/redpanda/fae,
+ /mob/living/simple_mob/vore/aggressive/rat,
+ /mob/living/simple_mob/vore/aggressive/panther,
+ /mob/living/simple_mob/vore/aggressive/frog
+ )
+ //Mostly friendly mobs, but occasionally some dangerous ones.
+ //So if xenoarch isn't careful and is just shoving items willy-nilly without taking the proper precautions they can end up in a bit of trouble!
+
+
+/obj/machinery/replicator/vore/New() //This replicator turns people into mobs!
+ ..() //TODO: Someone can replace the 'alien' interface with something neater sometime. It is simply out of my abilities at the current moment.
+
+ for(var/i=0, i max_spawn_time)
+ src.visible_message("\icon[src][bicon(src)] [src] pings!")
+
+ var/obj/source_material = pop(stored_materials)
+ var/spawn_type = pop(spawning_types)
+ var/mob/living/simple_mob/new_mob = new spawn_type(src.loc) //The MOB that's spawned in.
+
+ if(source_material)
+ if(length(source_material.name) < MAX_MESSAGE_LEN)
+ new_mob.name = "[source_material] " + new_mob.name
+ if(length(source_material.desc) < MAX_MESSAGE_LEN * 2)
+ if(new_mob.desc)
+ new_mob.desc += " It is made of [source_material]."
+ else
+ new_mob.desc = "It is made of [source_material]."
+ //Did they use an item? If so, we're done here.
+
+ //Did they put a micro in it?
+ if(istype(source_material,/obj/item/weapon/holder/micro))
+ var/obj/item/weapon/holder/micro/micro_holder = source_material
+ var/mob/mob_to_be_changed = micro_holder.held_mob
+ var/mob/living/M = mob_to_be_changed
+ //Start of mob code shamelessly ripped from mouseray
+ new_mob.faction = M.faction
+
+ if(new_mob && isliving(new_mob))
+ for(var/obj/belly/B as anything in new_mob.vore_organs)
+ new_mob.vore_organs -= B
+ qdel(B)
+ new_mob.vore_organs = list()
+ new_mob.name = M.name
+ new_mob.real_name = M.real_name
+ for(var/lang in M.languages)
+ new_mob.languages |= lang
+ M.copy_vore_prefs_to_mob(new_mob)
+ new_mob.vore_selected = M.vore_selected
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(ishuman(new_mob))
+ var/mob/living/carbon/human/N = new_mob
+ N.gender = H.gender
+ N.identifying_gender = H.identifying_gender
+ else
+ new_mob.gender = H.identifying_gender
+ else
+ new_mob.gender = M.gender
+ if(ishuman(new_mob))
+ var/mob/living/carbon/human/N = new_mob
+ N.identifying_gender = M.gender
+
+ for(var/obj/belly/B as anything in M.vore_organs)
+ B.loc = new_mob
+ B.forceMove(new_mob)
+ B.owner = new_mob
+ M.vore_organs -= B
+ new_mob.vore_organs += B
+
+ new_mob.ckey = M.ckey
+ if(M.ai_holder && new_mob.ai_holder)
+ var/datum/ai_holder/old_AI = M.ai_holder
+ old_AI.set_stance(STANCE_SLEEP)
+ var/datum/ai_holder/new_AI = new_mob.ai_holder
+ new_AI.hostile = old_AI.hostile
+ new_AI.retaliate = old_AI.retaliate
+ M.loc = new_mob
+ M.forceMove(new_mob)
+ new_mob.tf_mob_holder = M
+ ///End of mobcode.
+ qdel(source_material)
+ M.forceMove(new_mob)
+
+ //Did they put a person in it?
+ else if(istype(source_material,/mob/living))
+ var/mob/living/M = source_material
+ //Start of mob code shamelessly ripped from mouseray
+ new_mob.faction = M.faction
+
+ if(new_mob && isliving(new_mob))
+ for(var/obj/belly/B as anything in new_mob.vore_organs)
+ new_mob.vore_organs -= B
+ qdel(B)
+ new_mob.vore_organs = list()
+ new_mob.name = M.name
+ new_mob.real_name = M.real_name
+ for(var/lang in M.languages)
+ new_mob.languages |= lang
+ M.copy_vore_prefs_to_mob(new_mob)
+ new_mob.vore_selected = M.vore_selected
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(ishuman(new_mob))
+ var/mob/living/carbon/human/N = new_mob
+ N.gender = H.gender
+ N.identifying_gender = H.identifying_gender
+ else
+ new_mob.gender = H.identifying_gender
+ else
+ new_mob.gender = M.gender
+ if(ishuman(new_mob))
+ var/mob/living/carbon/human/N = new_mob
+ N.identifying_gender = M.gender
+
+ for(var/obj/belly/B as anything in M.vore_organs)
+ B.loc = new_mob
+ B.forceMove(new_mob)
+ B.owner = new_mob
+ M.vore_organs -= B
+ new_mob.vore_organs += B
+
+ new_mob.ckey = M.ckey
+ if(M.ai_holder && new_mob.ai_holder)
+ var/datum/ai_holder/old_AI = M.ai_holder
+ old_AI.set_stance(STANCE_SLEEP)
+ var/datum/ai_holder/new_AI = new_mob.ai_holder
+ new_AI.hostile = old_AI.hostile
+ new_AI.retaliate = old_AI.retaliate
+ M.loc = new_mob
+ M.forceMove(new_mob)
+ new_mob.tf_mob_holder = M
+ ///End of mobcode.
+
+
+ spawn_progress_time = 0
+ max_spawn_time = rand(30,100)
+
+ if(!spawning_types.len || !stored_materials.len)
+ update_use_power(USE_POWER_IDLE)
+ icon_state = "borgcharger0(old)"
+
+ else if(prob(5))
+ src.visible_message("\icon[src][bicon(src)] [src] [pick("clicks","whizzes","whirrs","whooshes","clanks","clongs","clonks","bangs")].")
+
+ last_process_time = world.time
+
+
+/obj/machinery/replicator/vore/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
+ if(!W.canremove || !user.canUnEquip(W) || W.possessed_voice || is_type_in_list(W,item_vore_blacklist)) //No armblades, no putting possessed items in it!
+ to_chat(user, "You cannot put \the [W] into the machine.")
+ return
+ if(istype(W, /obj/item/weapon/holder/micro)) //Are you putting a micro in it?
+ var/obj/item/weapon/holder/micro/micro_holder = W
+ var/mob/living/inserted_mob = micro_holder.held_mob //Get the actual mob.
+ if(!inserted_mob.allow_spontaneous_tf) //Do they allow TF?
+ to_chat(user, "You cannot put \the [W] into the machine. ((The prefs of the micro forbid this action.))")
+ return
+ if(inserted_mob.stat == DEAD) //Hey medical...
+ to_chat(user, "[W] is dead.")
+ return
+ if(inserted_mob.tf_mob_holder)
+ to_chat(user, "[W] must be in their original form.")
+ return
+ if(inserted_mob.client)
+ var/response //Let's see if they are SURE they accept the fact they will be a clothing, plushie, or something else.
+ response = tgui_alert(inserted_mob, "Are you -sure- you want to be put in this machine?\n(This machine will turn you into one of the various types of mobs in the game.)", "WARNING: Are you sure you want to be put in the machine and transformed?", list("No", "Certain"))
+ if(response != "Certain") //If they don't agree, stop.
+ to_chat(user, "[W] stops you from placing them in the machine.")
+ return
+ else //If they /do/ agree, give them one last chance.
+ response = tgui_alert(inserted_mob, "This is the last warning: Are you absolutely certain you want to be transformed into a mob?", "WARNING: FINAL CHANCE!", list("No", "Certain"))
+ if(response != "Certain")
+ to_chat(user, "[W] stops you from placing them in the machine.")
+ return
+ if(istype(inserted_mob, /mob/living/voice) || W.loc == src) //Sanity.
+ return
+ log_and_message_admins("[user] has just placed [inserted_mob] into a mob transformation machine.", user)
+ else
+ to_chat(user, "You cannot put \the [W] into the machine. ((The micro must be connected to the server.))")
+ return
+ else if(istype(W,/obj/item/weapon/grab)) //Is someone being shoved into the machine?
+ var/obj/item/weapon/grab/the_grab = W
+ var/mob/living/inserted_mob = the_grab.affecting //Get the mob that is grabbed.
+ if(!inserted_mob.allow_spontaneous_tf)
+ to_chat(user, "You cannot put \the [W] into the machine. ((The prefs of the micro forbid this action.))")
+ return
+ if(inserted_mob.stat == DEAD)
+ to_chat(user, "[W] is dead.")
+ return
+ if(inserted_mob.tf_mob_holder)
+ to_chat(user, "[W] must be in their original form.")
+ return
+ if(inserted_mob.client)
+ var/response
+ response = tgui_alert(inserted_mob, "Are you -sure- you want to be put in this machine?\n(This machine will turn you into one of the various types of mobs in the game.)", "WARNING: Are you sure you want to be put in the machine and transformed?", list("No", "Certain"))
+ if(response != "Certain")
+ to_chat(user, "[W] stops you from placing them in the machine.")
+ return
+ else
+ response = tgui_alert(inserted_mob, "This is the last warning: Are you absolutely certain you want to be transformed into a mob?", "WARNING: FINAL CHANCE!", list("No", "Certain"))
+ if(response != "Certain")
+ to_chat(user, "[W] stops you from placing them in the machine.")
+ return
+ if(istype(inserted_mob, /mob/living/voice) || W.loc == src)
+ return
+ log_and_message_admins("[user] has just placed [inserted_mob] into a mob transformation machine.", user)
+ user.drop_item() //Dropping a grab destroys it.
+ //Grabs require a bit of extra work.
+ //We want them to drop their clothing/items as well.
+ if(istype(inserted_mob, /mob/living/carbon/human)) //So, this WORKS. Works very well!
+ var/mob/living/carbon/human/inserted_human = inserted_mob
+ for(var/obj/item/I in inserted_mob)
+ if(istype(I, /obj/item/weapon/implant) || istype(I, /obj/item/device/nif))
+ continue
+ inserted_human.drop_from_inventory(I)
+ inserted_mob.loc = src
+ stored_materials.Add(inserted_mob)
+ src.visible_message("\The [user] inserts \the [inserted_mob] into \the [src].")
+ return
+ else
+ to_chat(user, "You cannot put \the [W] into the machine. ((The micro must be connected to the server.))")
+ return
+ else if(istype(W, /obj/item/weapon/holder/mouse)) //No you can't turn your army of mice into giant rats.
+ to_chat(user, "You cannot put \the [W] into the machine. The machine reads 'NOT ENOUGH BIOMASS'.")
+ return
+ user.drop_item() //Put the micro on the floor (or drop the item)
+ if(istype(W, /obj/item/weapon/holder/micro)) //I hate this but it's the only way to get their stuff to drop.
+ var/obj/item/weapon/holder/micro/micro_holder = W
+ var/mob/living/inserted_mob = micro_holder.held_mob //Get the actual mob.
+ if(istype(inserted_mob, /mob/living/carbon/human)) //Only humans have the drop_from_inventory proc.
+ var/mob/living/carbon/human/inserted_human = inserted_mob
+ for(var/obj/item/I in inserted_human) //Drop any remaining items! This only really seems to affect hands.
+ if(istype(I, /obj/item/weapon/implant) || istype(I, /obj/item/device/nif))
+ continue
+ inserted_human.drop_from_inventory(I)
+ //Now that we've dropped all the items they have, let's shove them back into the micro holder.
+ W.loc = src
+ stored_materials.Add(W)
+ src.visible_message("\The [user] inserts \the [W] into \the [src].")
+
+/obj/machinery/replicator/vore/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
+ var/list/data = ..()
+ data["tgui_construction"] = tgui_vore_selection
+ return data
+
+/obj/machinery/replicator/vore/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
+ if(..())
+ return TRUE
+
+ switch(action)
+ if("construct")
+ var/key = params["key"]
+ if(key in created_mobs)
+ if(LAZYLEN(stored_materials) > LAZYLEN(spawning_types))
+ if(LAZYLEN(spawning_types))
+ visible_message("\icon[src][bicon(src)] a [pick("light","dial","display","meter","pad")] on [src]'s front [pick("blinks","flashes")] [pick("red","yellow","blue","orange","purple","green","white")].")
+ else
+ visible_message("\icon[src][bicon(src)] [src]'s front compartment slides shut.")
+ spawning_types.Add(created_mobs[key])
+ spawn_progress_time = 0
+ update_use_power(USE_POWER_ACTIVE)
+ icon_state = "borgcharger1(old)"
+ else
+ visible_message(fail_message)
+
+
+/obj/machinery/replicator/clothing/tgui_interact(mob/user, datum/tgui/ui) //This creates the menu.
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "XenoarchReplicator_voremob_vr", name)
+ ui.open()
+
+
+
+
+
+//////////////////////////////
+//////CLOTHING REPLICATOR/////
+//////////////////////////////
+
+/obj/machinery/replicator/clothing
+ name = "alien machine"
+ desc = "It's some kind of pod with strange wires and gadgets all over it. This one appears to have a humanoid shaped slot as an input and images of various objects on the buttons." //This hole was made for me!
+ icon = 'icons/obj/xenoarchaeology.dmi'
+ icon_state = "borgcharger0(old)"
+ var/quantity = 35 //This needs to be replaced with a GUI that lets you select the item you want.
+ var/list/created_items = list()
+ var/list/tgui_vore_selection = list()
+ var/list/viable_items = list(
+ /obj/item/clothing/gloves/ring,
+ /obj/item/clothing/gloves/evening,
+ /obj/item/clothing/gloves/black,
+ /obj/item/clothing/under/swimsuit/black,
+ /obj/item/clothing/under/shorts/black,
+ /obj/item/clothing/under/wetsuit_skimpy,
+ /obj/item/clothing/under/dress/maid,
+ /obj/item/clothing/under/fluff/latexmaid,
+ /obj/item/clothing/suit/oversize,
+ /obj/item/clothing/suit/kimono/red,
+ /obj/item/clothing/suit/storage/fluff/loincloth,
+ /obj/item/toy/plushie/lizardplushie/kobold,
+ /obj/item/toy/plushie/borgplushie/medihound,
+ /obj/item/toy/plushie/marble_fox,
+ /obj/item/toy/plushie/lizard,
+ /obj/item/toy/plushie/tuxedo_cat,
+ /obj/item/clothing/head/pin/flower,
+ /obj/item/clothing/head/wizard,
+ /obj/item/clothing/head/wizard/marisa,
+ /obj/item/clothing/head/beret,
+ /obj/item/clothing/head/that,
+ /obj/item/clothing/head/bowler,
+ /obj/item/clothing/shoes/hitops/red,
+ /obj/item/clothing/shoes/boots/jackboots,
+ /obj/item/clothing/shoes/boots/workboots,
+ /obj/item/clothing/shoes/boots/workboots/toeless,
+ /obj/item/clothing/shoes/flipflop,
+ /obj/item/clothing/shoes/boots/duty,
+ /obj/item/clothing/shoes/footwraps,
+ /obj/item/weapon/storage/smolebrickcase,
+ /obj/item/weapon/lipstick,
+ /obj/item/weapon/material/fishing_rod/modern,
+ /obj/item/weapon/inflatable_duck,
+ /obj/item/toy/syndicateballoon,
+ /obj/item/weapon/towel,
+ /obj/item/weapon/bedsheet/rainbowdouble
+ ) // Currently: 3 gloves, 5 undersuits, 3 oversuits, 5 plushies, 5 headwear, 7 shoes, 7 misc. = 35
+ //Fishing hat was going to be added, but it was simply too powerful for this world.
+
+/obj/machinery/replicator/clothing/New() //The specific thing about the VORE replicator is that it will only contain obj/items. Only things that can be picked up, used, and worn!
+ ..() //TODO: Someone can replace the 'alien' interface with something neater sometime. It is simply out of my abilities at the current moment.
+
+ for(var/i=0, i max_spawn_time)
+ src.visible_message("\icon[src][bicon(src)] [src] pings!")
+
+ var/obj/source_material = pop(stored_materials)
+ var/spawn_type = pop(spawning_types)
+ var/obj/item/spawned_obj = new spawn_type(src.loc)
+ var/obj/item/original_name = spawned_obj.name //Get the item's name before it's prefixed. Used for micro code.
+ if(source_material)
+ if(length(source_material.name) < MAX_MESSAGE_LEN)
+ spawned_obj.name = "[source_material] " + spawned_obj.name
+ if(length(source_material.desc) < MAX_MESSAGE_LEN * 2)
+ if(spawned_obj.desc)
+ spawned_obj.desc += " It is made of [source_material]."
+ else
+ spawned_obj.desc = "It is made of [source_material]."
+ if(istype(source_material,/obj/item/weapon/holder/micro))
+ var/obj/item/weapon/holder/micro/micro_holder = source_material //Tells the machine that a micro is the material being used
+ var/mob/mob_to_be_changed = micro_holder.held_mob //Get the mob.
+ var/mob/living/M = mob_to_be_changed
+ M.release_vore_contents(TRUE, TRUE) //Release their stomach contents. Don't spam the chat, either.
+ spawned_obj.inhabit_item(M, original_name, M) //Take the spawned mob and call the TF proc on it.
+ var/mob/living/possessed_voice = spawned_obj.possessed_voice //Get the possessed voice.
+ qdel(source_material) //Deletes the micro holder, we don't need it anymore.
+ spawned_obj.trash_eatable = M.devourable //Can this item be eaten? Let's decide based on the person's prefs!
+ spawned_obj.unacidable = !M.digestable //Can this item be digested?
+ M.forceMove(possessed_voice) //Places them in the 'voice' for later recovery! Essentially: The item contains a 'possessed voice' mob, which contains their original mob.
+
+
+ else if(istype(source_material,/mob/living))//Did they shove a person in there normally?
+ var/mob/living/M = source_material //If so, this cuts down the work we have to do!
+ M.release_vore_contents(TRUE, TRUE) //Release their stomach contents. Don't spam the chat, either.
+ spawned_obj.inhabit_item(M, original_name, M)
+ var/mob/living/possessed_voice = spawned_obj.possessed_voice
+ spawned_obj.trash_eatable = M.devourable
+ spawned_obj.unacidable = !M.digestable
+ M.forceMove(possessed_voice)
+
+
+ spawn_progress_time = 0
+ max_spawn_time = rand(30,100)
+
+ if(!spawning_types.len || !stored_materials.len)
+ update_use_power(USE_POWER_IDLE)
+ icon_state = "borgcharger0(old)"
+
+ else if(prob(5))
+ src.visible_message("\icon[src][bicon(src)] [src] [pick("clicks","whizzes","whirrs","whooshes","clanks","clongs","clonks","bangs")].")
+
+ last_process_time = world.time
+
+/obj/machinery/replicator/clothing/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
+ if(!W.canremove || !user.canUnEquip(W) || W.possessed_voice || is_type_in_list(W,item_vore_blacklist)) //No armblades, no putting already possessed items in it!
+ to_chat(user, "You cannot put \the [W] into the machine.")
+ return
+ if(istype(W, /obj/item/weapon/holder/micro) || istype(W, /obj/item/weapon/holder/mouse)) //Are you putting a micro/mouse in it?
+ var/obj/item/weapon/holder/micro/micro_holder = W
+ var/mob/living/inserted_mob = micro_holder.held_mob //Get the actual mob.
+ if(!inserted_mob.allow_spontaneous_tf) //Do they allow TF?
+ to_chat(user, "You cannot put \the [W] into the machine. ((The prefs of the micro forbid this action.))")
+ return
+ if(inserted_mob.stat == DEAD) //Hey medical...
+ to_chat(user, "[W] is dead.")
+ return
+ if(inserted_mob.tf_mob_holder) //No recursion!!!
+ to_chat(user, "[W] must be in their original form.")
+ return
+ if(inserted_mob.client)
+ var/response //Let's see if they are SURE they accept the fact they will be a clothing, plushie, or something else.
+ response = tgui_alert(inserted_mob, "Are you -sure- you want to be put in this machine?\n(This machine can turn you into various clothing, footwear, plushies, and other miscellaneous objects. This means that more likely than not, you will be used as whatever object is used. Make certain your preferences align with this possibility.)", "WARNING: Are you sure you want to be put in the machine and transformed?", list("No", "Certain"))
+ if(response != "Certain") //If they don't agree, stop.
+ to_chat(user, "[W] stops you from placing them in the machine.")
+ return
+ else //If they /do/ agree, give them one last chance.
+ response = tgui_alert(inserted_mob, "This is the last warning: Are you absolutely certain you want to be transformed into an object and have the possibility of being used as such?", "WARNING: FINAL CHANCE!", list("No", "I accept the possibilities"))
+ if(response != "I accept the possibilities")
+ to_chat(user, "[W] stops you from placing them in the machine.")
+ return
+ if(istype(inserted_mob, /mob/living/voice) || W.loc == src) //This is a sanity check to keep them from entering it multiple times.
+ return
+ log_and_message_admins("[user] has just placed [inserted_mob] into an item transformation machine.", user)
+ else
+ to_chat(user, "You cannot put \the [W] into the machine. ((The micro must be connected to the server.))")
+ return
+ else if(istype(W,/obj/item/weapon/grab)) //Is someone being shoved into the machine?
+ var/obj/item/weapon/grab/the_grab = W
+ var/mob/living/inserted_mob = the_grab.affecting //Get the mob that is grabbed.
+ if(!inserted_mob.allow_spontaneous_tf)
+ to_chat(user, "You cannot put \the [W] into the machine. ((The prefs of the micro forbid this action.))")
+ return
+ if(inserted_mob.stat == DEAD)
+ to_chat(user, "[W] is dead.")
+ return
+ if(inserted_mob.tf_mob_holder)
+ to_chat(user, "[W] must be in their original form.")
+ return
+ if(inserted_mob.client)
+ var/response
+ response = tgui_alert(inserted_mob, "Are you -sure- you want to be put in this machine?\n(This machine can turn you into various clothing, footwear, plushies, and other miscellaneous objects. This means that more likely than not, you will be used as whatever object is used. Make certain your preferences align with this possibility.)", "WARNING: Are you sure you want to be put in the machine and transformed?", list("No", "Certain"))
+ if(response != "Certain")
+ to_chat(user, "[W] stops you from placing them in the machine.")
+ return
+ else
+ response = tgui_alert(inserted_mob, "This is the last warning: Are you absolutely certain you want to be transformed into an object and have the possibility of being used as such?", "WARNING: FINAL CHANCE!", list("No", "I accept the possibilities"))
+ if(response != "I accept the possibilities")
+ to_chat(user, "[W] stops you from placing them in the machine.")
+ return
+ if(istype(inserted_mob, /mob/living/voice) || W.loc == src)
+ return
+ log_and_message_admins("[user] has just placed [inserted_mob] into an item transformation machine.", user)
+ user.drop_item() //Dropping a grab destroys it.
+ //Grabs require a bit of extra work.
+ //We want them to drop their clothing/items as well.
+ if(istype(inserted_mob, /mob/living/carbon/human)) //So, this WORKS. Works very well!
+ var/mob/living/carbon/human/inserted_human = inserted_mob
+ for(var/obj/item/I in inserted_mob)
+ if(istype(I, /obj/item/weapon/implant) || istype(I, /obj/item/device/nif))
+ continue
+ inserted_human.drop_from_inventory(I)
+ inserted_mob.loc = src
+ stored_materials.Add(inserted_mob)
+ src.visible_message("\The [user] inserts \the [inserted_mob] into \the [src].")
+ return
+ else
+ to_chat(user, "You cannot put \the [W] into the machine. ((They must be connected to the server.))")
+ return
+
+ user.drop_item() //Put the micro on the floor (or drop the item)
+ if(istype(W, /obj/item/weapon/holder/micro)) //I hate this but it's the only way to get their stuff to drop.
+ var/obj/item/weapon/holder/micro/micro_holder = W
+ var/mob/living/inserted_mob = micro_holder.held_mob //Get the actual mob.
+ if(istype(inserted_mob, /mob/living/carbon/human)) //Only humans have the drop_from_inventory proc.
+ var/mob/living/carbon/human/inserted_human = inserted_mob
+ for(var/obj/item/I in inserted_human) //Drop any remaining items! This only really seems to affect hands.
+ if(istype(I, /obj/item/weapon/implant) || istype(I, /obj/item/device/nif))
+ continue
+ inserted_human.drop_from_inventory(I)
+ //Now that we've dropped all the items they have, let's shove them back into the micro holder.
+ W.loc = src
+ stored_materials.Add(W)
+ src.visible_message("\The [user] inserts \the [W] into \the [src].")
+
+
+/obj/machinery/replicator/clothing/tgui_interact(mob/user, datum/tgui/ui) //This creates the menu.
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "XenoarchReplicator_clothing_vr", name) //This is required to prevent UI contamination.
+ ui.open()
+
+/obj/machinery/replicator/clothing/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state) //Gives data to the menu.
+ var/list/data = ..()
+ data["tgui_construction"] = tgui_vore_selection
+ return data
+
+/obj/machinery/replicator/clothing/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
+ if(..())
+ return TRUE
+
+ switch(action)
+ if("construct")
+ var/key = params["key"]
+ if(key in created_items)
+ if(LAZYLEN(stored_materials) > LAZYLEN(spawning_types))
+ if(LAZYLEN(spawning_types))
+ visible_message("\icon[src][bicon(src)] a [pick("light","dial","display","meter","pad")] on [src]'s front [pick("blinks","flashes")] [pick("red","yellow","blue","orange","purple","green","white")].")
+ else
+ visible_message("\icon[src][bicon(src)] [src]'s front compartment slides shut.")
+ spawning_types.Add(created_items[key])
+ spawn_progress_time = 0
+ update_use_power(USE_POWER_ACTIVE)
+ icon_state = "borgcharger1(old)"
+ else
+ visible_message(fail_message)
\ No newline at end of file
diff --git a/code/modules/xenoarcheaology/effect.dm b/code/modules/xenoarcheaology/effect.dm
index 145bd3e2583..7409c8744f3 100644
--- a/code/modules/xenoarcheaology/effect.dm
+++ b/code/modules/xenoarcheaology/effect.dm
@@ -92,7 +92,7 @@
var/atom/toplevelholder = target
while(!istype(toplevelholder.loc, /turf))
toplevelholder = toplevelholder.loc
- toplevelholder.visible_message("[bicon(toplevelholder)] [toplevelholder] [display_msg]")
+ toplevelholder.visible_message("\icon[toplevelholder][bicon(toplevelholder)] [toplevelholder] [display_msg]")
/datum/artifact_effect/proc/DoEffectTouch(var/mob/user)
/datum/artifact_effect/proc/DoEffectAura(var/atom/holder)
@@ -158,7 +158,9 @@
/proc/GetAnomalySusceptibility(var/mob/living/carbon/human/H)
if(!istype(H))
return 1
- if(istype(get_area(H),/area/crew_quarters/sleep)) return 0 //VOREStation Edit - Dorms are protected from anomalies
+ var/area/A = get_area(H)
+ if(A.forbid_events)
+ return 0
var/protected = 0
//anomaly suits give best protection, but excavation suits are almost as good
diff --git a/code/modules/xenoarcheaology/finds/fossils.dm b/code/modules/xenoarcheaology/finds/fossils.dm
index 256cfd3021c..bfa481493ae 100644
--- a/code/modules/xenoarcheaology/finds/fossils.dm
+++ b/code/modules/xenoarcheaology/finds/fossils.dm
@@ -83,8 +83,8 @@
else
..()
else if(istype(W,/obj/item/weapon/pen))
- plaque_contents = sanitize(input(usr, "What would you like to write on the plaque:","Skeleton plaque",""))
- user.visible_message("[user] writes something on the base of [src].","You relabel the plaque on the base of [bicon(src)] [src].")
+ plaque_contents = sanitize(tgui_input_text(usr, "What would you like to write on the plaque:","Skeleton plaque",""))
+ user.visible_message("[user] writes something on the base of [src].","You relabel the plaque on the base of \icon[src][bicon(src)] [src].")
if(src.contents.Find(/obj/item/weapon/fossil/skull/horned))
src.desc = "A creature made of [src.contents.len-1] assorted bones and a horned skull. The plaque reads \'[plaque_contents]\'."
else
diff --git a/code/modules/xenoarcheaology/finds/special.dm b/code/modules/xenoarcheaology/finds/special.dm
index 93fd5c3bc3d..54abef8d3ec 100644
--- a/code/modules/xenoarcheaology/finds/special.dm
+++ b/code/modules/xenoarcheaology/finds/special.dm
@@ -100,7 +100,7 @@
if(charges >= 0.1)
if(prob(5))
- src.visible_message("[bicon(src)] [src]'s eyes glow ruby red for a moment!")
+ src.visible_message("\icon[src][bicon(src)] [src]'s eyes glow ruby red for a moment!")
charges -= 0.1
//check on our shadow wights
diff --git a/code/modules/xenoarcheaology/finds/talking.dm b/code/modules/xenoarcheaology/finds/talking.dm
index 4a6af1444d5..48b7720f001 100644
--- a/code/modules/xenoarcheaology/finds/talking.dm
+++ b/code/modules/xenoarcheaology/finds/talking.dm
@@ -54,7 +54,7 @@
var/list/options = list("[holder_atom] seems to be listening intently to [source]...",\
"[holder_atom] seems to be focusing on [source]...",\
"[holder_atom] seems to turn it's attention to [source]...")
- holder_atom.loc.visible_message("[bicon(holder_atom)] [pick(options)]")
+ holder_atom.loc.visible_message("\icon[holder_atom][bicon(holder_atom)] [pick(options)]")
if(prob(20))
spawn(2)
@@ -118,5 +118,5 @@
listening|=M
for(var/mob/M in listening)
- to_chat(M, "[bicon(holder_atom)] [holder_atom] reverberates, \"[msg]\"")
+ to_chat(M, "\icon[holder_atom][bicon(holder_atom)] [holder_atom] reverberates, \"[msg]\"")
last_talk_time = world.time
diff --git a/code/modules/xenoarcheaology/tools/ano_device_battery.dm b/code/modules/xenoarcheaology/tools/ano_device_battery.dm
index a54c3b6b65b..8a9237d6ef2 100644
--- a/code/modules/xenoarcheaology/tools/ano_device_battery.dm
+++ b/code/modules/xenoarcheaology/tools/ano_device_battery.dm
@@ -62,7 +62,7 @@
/obj/item/weapon/anodevice/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
-
+
data["inserted_battery"] = inserted_battery
data["anomaly"] = null
data["charge"] = null
@@ -98,7 +98,7 @@
if("startup")
if(inserted_battery && inserted_battery.battery_effect && (inserted_battery.stored_charge > 0))
activated = TRUE
- visible_message("[bicon(src)] [src] whirrs.", "[bicon(src)]You hear something whirr.")
+ visible_message("\icon[src][bicon(src)] [src] whirrs.", "\icon[src][bicon(src)]You hear something whirr.")
if(!inserted_battery.battery_effect.activated)
inserted_battery.battery_effect.ToggleActivate(1)
time_end = world.time + duration
@@ -141,9 +141,9 @@
if(interval > 0)
//apply the touch effect to the holder
if(holder)
- to_chat(holder, "the [bicon(src)] [src] held by [holder] shudders in your grasp.")
+ to_chat(holder, "the \icon[src][bicon(src)] [src] held by [holder] shudders in your grasp.")
else
- src.loc.visible_message("the [bicon(src)] [src] shudders.")
+ src.loc.visible_message("the \icon[src][bicon(src)] [src] shudders.")
//consume power
inserted_battery.use_power(energy_consumed_on_touch)
@@ -170,13 +170,13 @@
//work out if we need to shutdown
if(inserted_battery.stored_charge <= 0)
- src.loc.visible_message("[bicon(src)] [src] buzzes.", "[bicon(src)] You hear something buzz.")
+ src.loc.visible_message("\icon[src][bicon(src)] [src] buzzes.", "\icon[src][bicon(src)] You hear something buzz.")
shutdown_emission()
else if(world.time > time_end)
- src.loc.visible_message("[bicon(src)] [src] chimes.", "[bicon(src)] You hear something chime.")
+ src.loc.visible_message("\icon[src][bicon(src)] [src] chimes.", "\icon[src][bicon(src)] You hear something chime.")
shutdown_emission()
else
- src.visible_message("[bicon(src)] [src] buzzes.", "[bicon(src)] You hear something buzz.")
+ src.visible_message("\icon[src][bicon(src)] [src] buzzes.", "\icon[src][bicon(src)] You hear something buzz.")
shutdown_emission()
last_process = world.time
diff --git a/code/modules/xenoarcheaology/tools/artifact_analyser.dm b/code/modules/xenoarcheaology/tools/artifact_analyser.dm
index 32259e774a5..6e0e1ceb19f 100644
--- a/code/modules/xenoarcheaology/tools/artifact_analyser.dm
+++ b/code/modules/xenoarcheaology/tools/artifact_analyser.dm
@@ -13,6 +13,14 @@
var/scan_duration = 50
var/obj/scanned_object
var/report_num = 0
+ var/list/priority_objects = list(/obj/machinery/artifact,
+ /obj/machinery/auto_cloner,
+ /obj/machinery/power/supermatter,
+ /obj/structure/constructshell,
+ /obj/machinery/giga_drill,
+ /obj/structure/cult/pylon,
+ /obj/machinery/replicator,
+ /obj/structure/crystal)
/obj/machinery/artifact_analyser/Initialize()
. = ..()
@@ -49,9 +57,9 @@
/obj/machinery/artifact_analyser/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
if(..())
return TRUE
-
+
add_fingerprint(usr)
-
+
switch(action)
if("scan")
if(scan_in_progress)
@@ -62,6 +70,7 @@
reconnect_scanner()
if(owned_scanner)
var/artifact_in_use = 0
+ var/obj/secondary_priority
for(var/obj/O in owned_scanner.loc)
if(O == owned_scanner)
continue
@@ -78,13 +87,22 @@
if(artifact_in_use)
atom_say("Cannot scan. Too much interference.")
else
- scanned_object = O
- scan_in_progress = 1
- scan_completion_time = world.time + scan_duration
- atom_say("Scanning begun.")
- break
+ for(var/otype in priority_objects)
+ if(istype(O, otype))
+ scanned_object = O
+ break
+ if(scanned_object)
+ break
+ else
+ secondary_priority = O
+ if(secondary_priority && !scanned_object)
+ scanned_object = secondary_priority
if(!scanned_object)
atom_say("Unable to isolate scan target.")
+ else
+ scan_in_progress = 1
+ scan_completion_time = world.time + scan_duration
+ atom_say("Scanning begun.")
return TRUE
/obj/machinery/artifact_analyser/process()
@@ -107,7 +125,7 @@
P.name = "[src] report #[++report_num]"
P.info = "[src] analysis report #[report_num] "
P.info += " "
- P.info += "[bicon(scanned_object)] [results]"
+ P.info += "\icon[scanned_object][bicon(scanned_object)] [results]"
P.stamped = list(/obj/item/weapon/stamp)
P.add_overlay("paper_stamped")
@@ -115,7 +133,7 @@
var/obj/machinery/artifact/A = scanned_object
A.anchored = FALSE
A.being_used = 0
- scanned_object = null
+ scanned_object = null
//hardcoded responses, oh well
/obj/machinery/artifact_analyser/proc/get_scan_info(var/obj/scanned_obj)
diff --git a/code/modules/xenoarcheaology/tools/geosample_scanner.dm b/code/modules/xenoarcheaology/tools/geosample_scanner.dm
index 0d013236505..a07c771038e 100644
--- a/code/modules/xenoarcheaology/tools/geosample_scanner.dm
+++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm
@@ -126,7 +126,7 @@
/obj/machinery/radiocarbon_spectrometer/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
-
+
// this is the data which will be sent to the ui
data["scanned_item"] = (scanned_item ? scanned_item.name : "")
data["scanned_item_desc"] = (scanned_item ? (scanned_item.desc ? scanned_item.desc : "No information on record.") : "")
@@ -268,16 +268,16 @@
//emergency stop if seal integrity reaches 0
if(scanner_seal_integrity <= 0 || (scanner_temperature >= 1273 && !rad_shield))
stop_scanning()
- src.visible_message("[bicon(src)] buzzes unhappily. It has failed mid-scan!", 2)
+ src.visible_message("\icon[src][bicon(src)] buzzes unhappily. It has failed mid-scan!", 2)
if(prob(5))
- src.visible_message("[bicon(src)] [pick("whirrs","chuffs","clicks")][pick(" excitedly"," energetically"," busily")].", 2)
+ src.visible_message("\icon[src][bicon(src)] [pick("whirrs","chuffs","clicks")][pick(" excitedly"," energetically"," busily")].", 2)
else
//gradually cool down over time
if(scanner_temperature > 0)
scanner_temperature = max(scanner_temperature - 5 - 10 * rand(), 0)
if(prob(0.75))
- src.visible_message("[bicon(src)] [pick("plinks","hisses")][pick(" quietly"," softly"," sadly"," plaintively")].", 2)
+ src.visible_message("\icon[src][bicon(src)] [pick("plinks","hisses")][pick(" quietly"," softly"," sadly"," plaintively")].", 2)
playsound(src, 'sound/effects/ding.ogg', 25)
last_process_worldtime = world.time
@@ -296,7 +296,7 @@
used_coolant = 0
/obj/machinery/radiocarbon_spectrometer/proc/complete_scan()
- src.visible_message("[bicon(src)] makes an insistent chime.", 2)
+ src.visible_message("\icon[src][bicon(src)] makes an insistent chime.", 2)
if(scanned_item)
//create report
diff --git a/code/modules/xenoarcheaology/tools/suspension_generator.dm b/code/modules/xenoarcheaology/tools/suspension_generator.dm
index 2f2c87954ee..902264308af 100644
--- a/code/modules/xenoarcheaology/tools/suspension_generator.dm
+++ b/code/modules/xenoarcheaology/tools/suspension_generator.dm
@@ -147,10 +147,10 @@
for(var/mob/living/M in T)
M.Weaken(5)
- M.visible_message("[bicon(M)] [M] begins to float in the air!","You feel tingly and light, but it is difficult to move.")
+ M.visible_message("\icon[M][bicon(M)] [M] begins to float in the air!","You feel tingly and light, but it is difficult to move.")
suspension_field = new(T)
- visible_message("[bicon(src)] [src] activates with a low hum.")
+ visible_message("\icon[src][bicon(src)] [src] activates with a low hum.")
icon_state = "suspension3"
for(var/obj/item/I in T)
@@ -160,7 +160,7 @@
if(collected)
suspension_field.icon_state = "energynet"
suspension_field.add_overlay("shield2")
- visible_message("[bicon(suspension_field)] [suspension_field] gently absconds [collected > 1 ? "something" : "several things"].")
+ visible_message("\icon[suspension_field][bicon(suspension_field)] [suspension_field] gently absconds [collected > 1 ? "something" : "several things"].")
else
if(istype(T,/turf/simulated/mineral) || istype(T,/turf/simulated/wall))
suspension_field.icon_state = "shieldsparkles"
@@ -175,7 +175,7 @@
to_chat(M, "You no longer feel like floating.")
M.Weaken(3)
- visible_message("[bicon(src)] [src] deactivates with a gentle shudder.")
+ visible_message("\icon[src][bicon(src)] [src] deactivates with a gentle shudder.")
qdel(suspension_field)
suspension_field = null
icon_state = "suspension2"
diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm
index faf687cefc6..66b300d9aaa 100644
--- a/code/modules/xenoarcheaology/tools/tools.dm
+++ b/code/modules/xenoarcheaology/tools/tools.dm
@@ -131,7 +131,7 @@
positive_locations.Add(D)
- to_chat(user, "[bicon(src)] [src] pings.")
+ to_chat(user, "\icon[src][bicon(src)] [src] pings.")
else if(istype(A, /obj/structure/boulder))
var/obj/structure/boulder/B = A
@@ -149,7 +149,7 @@
positive_locations.Add(D)
- to_chat(user, "[bicon(src)] [src] pings [pick("madly","wildly","excitedly","crazily")]!")
+ to_chat(user, "\icon[src][bicon(src)] [src] pings [pick("madly","wildly","excitedly","crazily")]!")
/obj/item/device/depth_scanner/attack_self(var/mob/living/user)
tgui_interact(user)
@@ -197,7 +197,7 @@
if(..())
return TRUE
- switch(action)
+ switch(action)
if("select")
var/index = text2num(params["select"])
if(index && index <= LAZYLEN(positive_locations))
@@ -269,9 +269,9 @@
scan_ticks = 0
var/turf/T = get_turf(src)
if(target_radio)
- T.visible_message("[bicon(src)] [src] [pick("chirps","chirrups","cheeps")] happily.")
+ T.visible_message("\icon[src][bicon(src)] [src] [pick("chirps","chirrups","cheeps")] happily.")
else
- T.visible_message("[bicon(src)] [src] [pick("chirps","chirrups","cheeps")] sadly.")
+ T.visible_message("\icon[src][bicon(src)] [src] [pick("chirps","chirrups","cheeps")] sadly.")
else
icon_state = "pinoff"
diff --git a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm
index 98d05b70b2f..f9df980674f 100644
--- a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm
+++ b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm
@@ -174,7 +174,7 @@
attack_verb = list("drilled")
/obj/item/weapon/pickaxe/excavationdrill/attack_self(mob/user as mob)
- var/depth = input(usr, "Put the desired depth (1-30 centimeters).", "Set Depth", 30) as num
+ var/depth = tgui_input_number(usr, "Put the desired depth (1-30 centimeters).", "Set Depth", 30, 30, 1)
if(depth>30 || depth<1)
to_chat(user, "Invalid depth.")
return
diff --git a/code/modules/xenobio/items/extracts.dm b/code/modules/xenobio/items/extracts.dm
index 8146ad6116e..bf578596b24 100644
--- a/code/modules/xenobio/items/extracts.dm
+++ b/code/modules/xenobio/items/extracts.dm
@@ -55,7 +55,7 @@
var/obj/item/slime_extract/T = holder.my_atom
T.uses--
if(T.uses <= 0)
- T.visible_message("[bicon(T)]\The [T] goes inert.")
+ T.visible_message("\icon[T][bicon(T)]\The [T] goes inert.")
T.name = "inert [initial(T.name)]"
diff --git a/code/modules/xenobio/items/extracts_vr.dm b/code/modules/xenobio/items/extracts_vr.dm
index 00abebfcb10..bd232c153af 100644
--- a/code/modules/xenobio/items/extracts_vr.dm
+++ b/code/modules/xenobio/items/extracts_vr.dm
@@ -60,7 +60,7 @@
var/obj/item/slime_extract/T = holder.my_atom
T.uses--
if(T.uses <= 0)
- T.visible_message("[bicon(T)]\The [T] goes inert.")
+ T.visible_message("\icon[T][bicon(T)]\The [T] goes inert.")
T.name = "inert [initial(T.name)]"
diff --git a/code/modules/xenobio/items/slime_objects.dm b/code/modules/xenobio/items/slime_objects.dm
index 72cc0e01e31..90012d75482 100644
--- a/code/modules/xenobio/items/slime_objects.dm
+++ b/code/modules/xenobio/items/slime_objects.dm
@@ -57,7 +57,7 @@
S.set_species("Promethean")
S.shapeshifter_set_colour("#2398FF")
visible_message("The monkey cube suddenly takes the shape of a humanoid!")
- var/newname = sanitize(input(S, "You are a Promethean. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN)
+ var/newname = sanitize(tgui_input_text(S, "You are a Promethean. Would you like to change your name to something else?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
if(newname)
S.real_name = newname
S.name = S.real_name
diff --git a/code/modules/xenobio/items/slimepotions.dm b/code/modules/xenobio/items/slimepotions.dm
index 11d2d075715..fa1484e0d9d 100644
--- a/code/modules/xenobio/items/slimepotions.dm
+++ b/code/modules/xenobio/items/slimepotions.dm
@@ -110,7 +110,7 @@
playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
AI.remove_target() // So hostile things stop attacking people even if not hostile anymore.
- var/newname = copytext(sanitize(input(user, "Would you like to give \the [M] a name?", "Name your new pet", M.name) as null|text),1,MAX_NAME_LEN)
+ var/newname = copytext(sanitize(tgui_input_text(user, "Would you like to give \the [M] a name?", "Name your new pet", M.name, MAX_NAME_LEN)),1,MAX_NAME_LEN)
if(newname)
M.name = newname
diff --git a/code/modules/xenobio2/machinery/core_extractor.dm b/code/modules/xenobio2/machinery/core_extractor.dm
index 4a6b8651e28..e2882001e1a 100644
--- a/code/modules/xenobio2/machinery/core_extractor.dm
+++ b/code/modules/xenobio2/machinery/core_extractor.dm
@@ -93,7 +93,7 @@
/obj/machinery/slime/extractor/proc/extract_cores()
if(!src.occupant)
- src.visible_message("[bicon(src)] [src] pings unhappily.")
+ src.visible_message("\icon[src][bicon(src)] [src] pings unhappily.")
else if(inuse)
return
diff --git a/code/modules/xenobio2/machinery/gene_manipulators.dm b/code/modules/xenobio2/machinery/gene_manipulators.dm
index a93c874d857..62806593274 100644
--- a/code/modules/xenobio2/machinery/gene_manipulators.dm
+++ b/code/modules/xenobio2/machinery/gene_manipulators.dm
@@ -102,15 +102,15 @@
in_use = 0
if(failed_task)
failed_task = 0
- visible_message("[bicon(src)] [src] pings unhappily, flashing a red warning light.")
+ visible_message("\icon[src][bicon(src)] [src] pings unhappily, flashing a red warning light.")
else
- visible_message("[bicon(src)] [src] pings happily.")
+ visible_message("\icon[src][bicon(src)] [src] pings happily.")
if(eject_disk)
eject_disk = 0
if(loaded_disk)
loaded_disk.forceMove(get_turf(src))
- visible_message("[bicon(src)] [src] beeps and spits out [loaded_disk].")
+ visible_message("\icon[src][bicon(src)] [src] beeps and spits out [loaded_disk].")
loaded_disk = null
/obj/machinery/xenobio/extractor
@@ -126,7 +126,7 @@
/obj/machinery/xenobio/extractor/Initialize()
. = ..()
default_apply_parts()
-
+
/obj/machinery/xenobio/extractor/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/xenoproduct))
if(product)
@@ -183,7 +183,7 @@
/obj/machinery/xenobio/proc/eject_disk()
if(!loaded_disk) return
loaded_disk.forceMove(loc)
- visible_message("[bicon(src)] [src] beeps and spits out [loaded_disk].")
+ visible_message("\icon[src][bicon(src)] [src] beeps and spits out [loaded_disk].")
loaded_disk = null
/obj/machinery/xenobio/extractor/Topic(href, href_list)
@@ -195,7 +195,7 @@
if(!product) return
product.forceMove(get_turf(src))
- visible_message("[bicon(src)] [src] beeps and spits out [product].")
+ visible_message("\icon[src][bicon(src)] [src] beeps and spits out [product].")
product = null
if(href_list["eject_disk"])
diff --git a/code/modules/xenobio2/machinery/slime_replicator.dm b/code/modules/xenobio2/machinery/slime_replicator.dm
index f845ad6e8d8..30c3e372a55 100644
--- a/code/modules/xenobio2/machinery/slime_replicator.dm
+++ b/code/modules/xenobio2/machinery/slime_replicator.dm
@@ -57,7 +57,7 @@
/obj/machinery/slime/replicator/proc/replicate_slime()
if(!src.core)
- src.visible_message("[bicon(src)] [src] pings unhappily.")
+ src.visible_message("\icon[src][bicon(src)] [src] pings unhappily.")
else if(inuse)
return
diff --git a/code/modules/xenobio2/mob/slime/slime_monkey.dm b/code/modules/xenobio2/mob/slime/slime_monkey.dm
index 39660b17280..8915e58e9b0 100644
--- a/code/modules/xenobio2/mob/slime/slime_monkey.dm
+++ b/code/modules/xenobio2/mob/slime/slime_monkey.dm
@@ -44,7 +44,7 @@ Slime cube lives here.
S.shapeshifter_set_colour("#05FF9B")
for(var/mob/M in viewers(get_turf_or_move(loc)))
M.show_message("The monkey cube suddenly takes the shape of a humanoid!")
- var/newname = sanitize(input(S, "You are a Promethean. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN)
+ var/newname = sanitize(tgui_input_text(S, "You are a Promethean. Would you like to change your name to something else?", "Name change"), MAX_NAME_LEN)
if(newname)
S.real_name = newname
S.name = S.real_name
diff --git a/code/stylesheet.dm b/code/stylesheet.dm
index 2a12dfa81db..8cb902a1832 100644
--- a/code/stylesheet.dm
+++ b/code/stylesheet.dm
@@ -34,6 +34,8 @@ em {font-style: normal;font-weight: bold;}
.pm .other {color: #0000ff;}
/* Admin: Channels */
+.mentor_channel {color: #808000; font-weight: bold;}
+.mentor {color: #808000;}
.mod_channel {color: #735638; font-weight: bold;}
.mod_channel .admin {color: #b82e00; font-weight: bold;}
.admin_channel {color: #9611D4; font-weight: bold;}
@@ -105,6 +107,8 @@ h1.alert, h2.alert {color: #000000;}
.sergal {color: #0077FF;}
.birdsongc {color: #CC9900;}
.vulpkanin {color: #B97A57;}
+.tavan {color: #f54298; font-family: Arial}
+.echosong {color: #826D8C;}
.enochian {color: #848A33; letter-spacing:-1pt; word-spacing:4pt; font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;}
.daemon {color: #5E339E; letter-spacing:-1pt; word-spacing:0pt; font-family: "Courier New", Courier, monospace;}
.bug {color: #9e9e39;}
diff --git a/code/unit_tests/map_tests.dm b/code/unit_tests/map_tests.dm
index 6dfec2bd608..e988835fc4d 100644
--- a/code/unit_tests/map_tests.dm
+++ b/code/unit_tests/map_tests.dm
@@ -1,5 +1,5 @@
/datum/unit_test/apc_area_test
- name = "MAP: Area Test APC / Scrubbers / Vents Z level 1"
+ name = "MAP: Area Test APC / Scrubbers / Vents (Defined Z-Levels)"
/datum/unit_test/apc_area_test/start_test()
var/list/bad_areas = list()
@@ -47,17 +47,16 @@
var/area_good = 1
var/bad_msg = "--------------- [A.name]([A.type])"
-
if(isnull(A.apc) && !(A.type in exempt_from_apc))
- log_unit_test("[bad_msg] lacks an APC.")
+ log_unit_test("[bad_msg] lacks an APC. (X[A.x]|Y[A.y]) - Z[A.z])")
area_good = 0
if(!A.air_scrub_info.len && !(A.type in exempt_from_atmos))
- log_unit_test("[bad_msg] lacks an Air scrubber.")
+ log_unit_test("[bad_msg] lacks an Air scrubber. (X[A.x]|Y[A.y]) - (Z[A.z])")
area_good = 0
if(!A.air_vent_info.len && !(A.type in exempt_from_atmos))
- log_unit_test("[bad_msg] lacks an Air vent.")
+ log_unit_test("[bad_msg] lacks an Air vent. (X[A.x]|Y[A.y]) - (Z[A.z])")
area_good = 0
if(!area_good)
@@ -71,9 +70,11 @@
return 1
/datum/unit_test/wire_test
- name = "MAP: Cable Test Z level 1"
+ name = "MAP: Cable Test (Defined Z-Levels)"
/datum/unit_test/wire_test/start_test()
+ set background=1
+
var/wire_test_count = 0
var/bad_tests = 0
var/turf/T = null
@@ -81,23 +82,35 @@
var/list/cable_turfs = list()
var/list/dirs_checked = list()
- for(C in world)
- T = null
+ var/list/exempt_from_wires = list()
+ exempt_from_wires += using_map.unit_test_exempt_from_wires.Copy()
- T = get_turf(C)
- if(T && T.z == 1)
- cable_turfs |= get_turf(C)
+ var/list/zs_to_test = using_map.unit_test_z_levels || list(1) //Either you set it, or you just get z1
- for(T in cable_turfs)
- var/bad_msg = "--------------- [T.name] \[[T.x] / [T.y] / [T.z]\]"
- dirs_checked.Cut()
- for(C in T)
- wire_test_count++
- var/combined_dir = "[C.d1]-[C.d2]"
- if(combined_dir in dirs_checked)
- bad_tests++
- log_unit_test("[bad_msg] Contains multiple wires with same direction on top of each other.")
- dirs_checked.Add(combined_dir)
+ for(var/color in possible_cable_coil_colours)
+ cable_turfs = list()
+
+ for(C in world)
+ T = null
+
+ T = get_turf(C)
+ var/area/A = get_area(T)
+ if(T && (T.z in zs_to_test) && !(A.type in exempt_from_wires))
+ if(C.color == possible_cable_coil_colours[color])
+ cable_turfs |= get_turf(C)
+
+ for(T in cable_turfs)
+ var/bad_msg = "--------------- [T.name] \[[T.x] / [T.y] / [T.z]\] [color]"
+ dirs_checked.Cut()
+ for(C in T)
+ wire_test_count++
+ var/combined_dir = "[C.d1]-[C.d2]"
+ if(combined_dir in dirs_checked)
+ bad_tests++
+ log_unit_test("[bad_msg] Contains multiple wires with same direction on top of each other.")
+ dirs_checked.Add(combined_dir)
+
+ log_unit_test("[color] wires checked.")
if(bad_tests)
fail("\[[bad_tests] / [wire_test_count]\] Some turfs had overlapping wires going the same direction.")
@@ -121,12 +134,12 @@
var/a_gas = ""
for(var/gas in E.A.air.gas)
a_gas += "[gas]=[E.A.air.gas[gas]]"
-
+
var/b_temp
var/b_moles
var/b_vol
var/b_gas = ""
-
+
// Two zones mixing
if(istype(E, /connection_edge/zone))
var/connection_edge/zone/Z = E
@@ -144,11 +157,11 @@
b_vol = "Unsim"
for(var/gas in U.air.gas)
b_gas += "[gas]=[U.air.gas[gas]]"
-
+
edge_log += "Active Edge [E] ([E.type])"
edge_log += "Edge side A: T:[a_temp], Mol:[a_moles], Vol:[a_vol], Gas:[a_gas]"
edge_log += "Edge side B: T:[b_temp], Mol:[b_moles], Vol:[b_vol], Gas:[b_gas]"
-
+
for(var/turf/T in E.connecting_turfs)
edge_log += "+--- Connecting Turf [T] ([T.type]) @ [T.x], [T.y], [T.z] ([T.loc])"
diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt
index 413314695d6..739e4c35b35 100644
--- a/config/alienwhitelist.txt
+++ b/config/alienwhitelist.txt
@@ -9,6 +9,7 @@ arokha - Protean
aruis - Diona
aruis - Protean
aruis - Xenochimera
+ashburndracki - Protean
auraribbon - Black-Eyed Shadekin
azmodan412 - Xenochimera
beyondmylife - Protean
@@ -16,15 +17,19 @@ bothnevarbackwards - Diona
bricker98 - Protean
bricker98 - Black-Eyed Shadekin
camanis - Protean
+cameron653 - Protean
cgr - Protean
chaosdoomsday - Black-Eyed Shadekin
+chaosdoomsday - Protean
chargae - Protean
chemlight - Xenochimera
chillyfang - Black-Eyed Shadekin
+chloeplayer - Protean
comradenitro - Protean
coolcrow420 - Black-Eyed Shadekin
crossexonar - Protean
cryohydra - Protean
+cubejackal - Black-Eyed Shadekin
detectivegoogle - Protean
digi5 - Protean
digitalsquirrel95 - Black-Eyed Shadekin
@@ -35,36 +40,45 @@ falloutdog3 - Black-Eyed Shadekin
flaktual - Vox
flurriee - Protean
funnyman2003 - Xenochimera
+fuzlet - Protean
greennyy - Protean
h0lysquirr3l - Protean
hawkerthegreat - Vox
heroman3003 - Xenochimera
+hexadood - Protean
hollifex - Diona
huenererschrecker - Xenochimera
hunterbirk - Protean
hunterbirk - Xenochimera
idcaboutaname - Protean
+idcaboutaname - Black-Eyed Shadekin
inuzari - Diona
jademanique - Black-Eyed Shadekin
+jademanique - Protean
jademanique - Teppi
jademanique - Xenochimera
joltze - Black-Eyed Shadekin
khanivore - Protean
killjaden - Protean
konner1055 - Black-Eyed Shadekin
+konner1055 - Protean
ktccd - Diona
lillianfyre - Xenochimera
lizehrd - Xenochimera
+looptyloo - Protean
lordlag - Black-Eyed Shadekin
lorgenz - Protean
losstinspess - Xenochimera
+negatist - Protean
magpiemayhem - Vox
magpiemayhem - Xenochimera
+makkinindorn - Protean
marcobarko - Protean
mewchild - Diona
mewchild - Vox
milu - Xenochimera
mrsebbi - Xenochimera
+mullins111 - Black-Eyed Shadekin
natje - Xenochimera
nerdass - Protean
newyorks - Protean
@@ -96,11 +110,13 @@ scoutisafolflol - Xenochimera
seagha - Vox
seiga - Vox
sepulchre - Vox
+shirosenshi - Xenochimera
silvertalismen - Diona
silvertalismen - Vox
silvertalismen - Xenochimera
sirlionfur - Black-Eyed Shadekin
skylarks - Black-Eyed Shadekin
+slysilentclaw - Black-Eyed Shadekin
smdytb1 - Black-Eyed Shadekin
spirit1299 - Black-Eyed Shadekin
stackerrobot - Protean
@@ -111,7 +127,6 @@ tastypred - Black-Eyed Shadekin
tastypred - Protean
tastypred - Xenochimera
terrestris - Common Skrellian
-terrestris - High Skrellian
terrestris - Vox
thedavestdave - Protean
timidvi - Diona
diff --git a/config/custom_sprites.txt b/config/custom_sprites.txt
index b99307d173f..1c9f5c0b385 100644
--- a/config/custom_sprites.txt
+++ b/config/custom_sprites.txt
@@ -1,3 +1,4 @@
-ckey|state
-lunarfleet|Clea-Nor
-jademanique|B.A.U-Kingside
\ No newline at end of file
+ckey|state
+lunarfleet|Clea-Nor
+jademanique|B.A.U-Kingside
+argonne|RUSS
\ No newline at end of file
diff --git a/config/jobwhitelist.txt b/config/jobwhitelist.txt
index cddfb0f28e9..ab8238e5e8e 100644
--- a/config/jobwhitelist.txt
+++ b/config/jobwhitelist.txt
@@ -18,6 +18,7 @@ seiga - mime
sgtryder - mime
siennaathens - clown
silvertalismen - clown
+spirit1299 - clown
suicidalpickles - mime
tinybear16 - clown
tygertac - clown
diff --git a/config/jukebox.json b/config/jukebox.json
index 192ab502ed4..0f17d87d866 100644
--- a/config/jukebox.json
+++ b/config/jukebox.json
@@ -1,52 +1,52 @@
[
{
-"url": "https://s.put.re/bkZYkYwX.mp3",
+"url": "https://files.catbox.moe/notc7y.mp3",
"title": "Flip-Flap (Title One)",
"duration": 1500,
"artist": "X-CEED",
"secret": false,
-"lobby": true,
-"jukebox": false,
+"lobby": false,
+"jukebox": true,
"genre": "Jazz"
-},
+},
{
-"url": "https://s.put.re/EzLP21Mp.mp3",
+"url": "https://files.catbox.moe/b24m07.mp3",
"title": "Robocop Theme (Title Two)",
"duration": 1180,
"artist": "Cboyardee",
"secret": false,
"lobby": true,
-"jukebox": false,
-"genre": "Electronic"
-},
-{
-"url": "https://s.put.re/uDpZrL1L.mp3",
-"title": "Tin Tin on the Moon (Remix)",
-"duration": 2320,
-"artist": "Jeroen Tel (Remixed by Cuboos)",
-"secret": false,
-"lobby": true,
-"jukebox": true,
-"genre": "Electronic"
-},
-{
-"url": "https://s.put.re/nNXTd9ko.mp3",
-"title": "Phoron Will Make Us Rich",
-"duration": 1370,
-"artist": "Earthcrusher",
-"secret": false,
-"lobby": true,
"jukebox": true,
"genre": "Electronic"
},
{
-"url": "https://s.put.re/vrN9ATH7.mp3",
-"title": "Spaceman's Dilemma",
-"duration": 2230,
-"artist": "Leslie Fish",
+"url": "https://files.catbox.moe/qn5tdv.mp3",
+"title": "Tin Tin on the Moon (Remix)",
+"duration": 2450,
+"artist": "Jeroen Tel (Remixed by Cuboos)",
"secret": false,
"lobby": true,
"jukebox": true,
+"genre": "Electronic"
+},
+{
+"url": "https://files.catbox.moe/uk3pr2.mp3",
+"title": "Phoron Will Make Us Rich",
+"duration": 1370,
+"artist": "Earthcrusher",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Electronic"
+},
+{
+"url": "https://files.catbox.moe/k25nxo.mp3",
+"title": "Spaceman's Dilemma",
+"duration": 2080,
+"artist": "Leslie Fish",
+"secret": false,
+"lobby": false,
+"jukebox": true,
"genre": "Folk and Indie"
},
{
@@ -55,7 +55,7 @@
"duration": 3150,
"artist": "Leslie Fish",
"secret": false,
-"lobby": true,
+"lobby": false,
"jukebox": true,
"genre": "Folk and Indie"
},
@@ -515,7 +515,7 @@
"duration": 1340,
"artist": "Leslie Fish",
"secret": false,
-"lobby": false,
+"lobby": true,
"jukebox": true,
"genre": "Folk and Indie"
},
@@ -525,7 +525,7 @@
"duration": 2660,
"artist": "Duane Elms",
"secret": false,
-"lobby": false,
+"lobby": true,
"jukebox": true,
"genre": "Folk and Indie"
},
@@ -535,7 +535,7 @@
"duration": 1700,
"artist": "Leslie Fish",
"secret": false,
-"lobby": false,
+"lobby": true,
"jukebox": true,
"genre": "Folk and Indie"
},
@@ -825,7 +825,7 @@
"duration": 1170,
"artist": "Hector",
"secret": false,
-"lobby": true,
+"lobby": false,
"jukebox": true,
"genre": "Electronic"
},
@@ -835,7 +835,7 @@
"duration": 2200,
"artist": "Garoad",
"secret": false,
-"lobby": true,
+"lobby": false,
"jukebox": true,
"genre": "Electronic"
},
@@ -870,6 +870,16 @@
"genre": "Pop"
},
{
+"url": "https://cdn.discordapp.com/attachments/528973352728264714/956446080638283826/Deus_Ex_-_009_-_UNATCO_-_Ambient.mp3",
+"title": "UNATCO - Ambience",
+"duration": 1610,
+"artist": "Michiel van den Bos",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Electronic"
+},
+{
"url": "https://files.catbox.moe/gcej08.m4a",
"title": "UNATCO - Conversation",
"duration": 1720,
@@ -880,6 +890,26 @@
"genre": "Electronic"
},
{
+"url": "https://cdn.discordapp.com/attachments/528973352728264714/956453078750593044/EdenShard_-_Deus_Ex-_Revision_Original_Soundtrack_-_06_The_Oath_of_Service.mp3",
+"title": "Oath of Service",
+"duration": 2160,
+"artist": "EdenShard",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Electronic"
+},
+{
+"url": "https://cdn.discordapp.com/attachments/528973352728264714/956453288600039434/EdenShard_-_Deus_Ex-_Revision_Original_Soundtrack_-_08_Mind_the_Synaptic_Gap.mp3",
+"title": "Mind the Synaptic Gap",
+"duration": 5460,
+"artist": "EdenShard",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Electronic"
+},
+{
"url": "https://files.catbox.moe/pf929m.m4a",
"title": "Virtual Insanity",
"duration": 3400,
@@ -1215,7 +1245,7 @@
"duration": 2340,
"artist": "Chris Remo",
"secret": false,
-"lobby": true,
+"lobby": false,
"jukebox": true,
"genre": "Folk and Indie"
},
@@ -2225,7 +2255,7 @@
"duration": 3180,
"artist": "David Bowie",
"secret": false,
-"lobby": false,
+"lobby": true,
"jukebox": true,
"genre": "Rock"
},
@@ -2256,7 +2286,7 @@
"artist": "Chris Hadfield",
"secret": false,
"lobby": true,
-"jukebox": false,
+"jukebox": true,
"genre": "Pop"
},
{
@@ -2865,7 +2895,7 @@
"duration": 2730,
"artist": "Hall & Oates",
"secret": false,
-"lobby": false,
+"lobby": true,
"jukebox": true,
"genre": "Pop"
},
@@ -3508,5 +3538,1153 @@
"lobby": false,
"jukebox": true,
"genre": "Rock"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/404660884531707906/676726491806957568/Cassette.mp3",
+"title" : "Cassette",
+"duration" :2310,
+"artist" : "Efence",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Ambience"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/676384242426707979/676730040624480264/Glowing_Red_Dust.mp3",
+"title" : "Red Glowing Dust",
+"duration" :3370,
+"artist" : "Jón Hallur Haraldsson (also known as RealX)",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Ambience"
+},
+{
+
+"url" : "https://cdn.discordapp.com/attachments/676384242426707979/676730820530274323/Stellardrone_-_Eternity.mp3",
+"title" : "Eternity",
+"duration" :3810,
+"artist" : "Stellardrone",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Ambience"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/612993188655005697/676732888712216596/DJ-ZEK_-_Simulate.mp3",
+"title" : "Simulate",
+"duration" :4850,
+"artist" : "Fawxtrot (now know as DJ Zek)",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Ambience"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/520929567540772873/707899715261562960/FitnessGram_20_Meter_PACER_Test_Full_Length_OFFICIAL_Audio_Version.mp3",
+"title" : "The FitnessGram Pacer Test",
+"duration" : 13720,
+"artist" : "The Cooper Institute (FitnessGram)",
+"secret": true,
+"lobby": false,
+"jukebox": true,
+"genre": "Ambience"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/575066308362895444/701639140109844530/Peaceful_Orbits.mp3",
+"title" : "Peaceful Orbits",
+"duration" : 2040,
+"artist" : "TeknoAXE",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Ambience"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/575066308362895444/701639311896084511/Passing_Time_in_an_Escape_Pod.mp3",
+"title" : "Passing Time in an Escape Pod",
+"duration" : 2300,
+"artist" : "TeknoAXE",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Ambience"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/331435060735508480/613310956927451137/Persona_5_48_-_Beneath_the_Mask_-rain-.mp3",
+"title" : "Beneath the Mask -Rain Version-",
+"duration" : 2790,
+"artist" : "Persona 5",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Jazz"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/331037116094087168/543191420370944001/DragonSharkOriginal3.mp3",
+"title" : "Terrorbyte/Dragon Shark theme",
+"duration" : 2100,
+"artist" : "RetroSpecter",
+"secret": true,
+"lobby": false,
+"jukebox": true,
+"genre": "Rock"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/528973352728264714/583441087633555456/Prey_-_Everything_is_Going_to_Be_Ok_online-audio-converter.com.mp3",
+"title" : "Everything Is Going To Be Ok",
+"duration" : 1600,
+"artist" : "Mick Gordon",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Electronic"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/311691674130710528/463590234978910228/Saga_of_Tanya_the_Evil_-_Jingo_Jungle_Opening_ENGLISH_ver_AmaLee.mp3",
+"title" : "Jingo Jungle",
+"duration" : 2440,
+"artist" : "Leeandlie http://bit.ly/Leeandlie",
+"secret": true,
+"lobby": false,
+"jukebox": true,
+"genre": "Electronic"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/311691674130710528/468345155498541066/TheMadnessOfFate.mp3",
+"title" : "Madness of Fate",
+"duration" :4030,
+"artist" : "NIIC the singing dog - http://bit.ly/NIICDOGYT",
+"secret": true,
+"lobby": false,
+"jukebox": true,
+"genre": "Electronic"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/311691674130710528/449909217403469837/Hard_Bass_School_-_narkotik_kal.mp3",
+"title" : "Narkotik kal",
+"duration" : 2350,
+"artist" : "Hardbass",
+"secret": true,
+"lobby": false,
+"jukebox": true,
+"genre": "Ambience"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/528973352728264714/613807206047154217/TERRORBYTE_-_HELIOS.mp3",
+"title" : "Helios",
+"duration" : 2850,
+"artist" : "TERRORBYTE",
+"secret": true,
+"lobby": false,
+"jukebox": true,
+"genre": "Metal"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/377217220041900034/453308819422838784/System_Of_A_Down_-_Shimmy_11.mp3",
+"title" : "Shimmy",
+"duration" : 1110,
+"artist" : "System of a Down",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Rock"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/377217220041900034/453308919067049995/System_Of_A_Down_-_Science_10.mp3",
+"title" : "Science",
+"duration" : 1630,
+"artist" : "System of a Down",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Rock"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/377217220041900034/453308944706699284/System_Of_A_Down_-_Deer_Dance_03.mp3",
+"title" : "deer dance",
+"duration" : 1750,
+"artist" : "System of a Down",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Rock"
+},
+{
+ "url" : "https://cdn.discordapp.com/attachments/377217220041900034/453308945411473428/System_Of_A_Down_-_Atwa.mp3",
+ "title" : "Atwa",
+ "duration" : 1790,
+"artist" : "System of a Down",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Rock"
+},
+{
+ "url" : "https://cdn.discordapp.com/attachments/377217220041900034/453308969772122112/System_Of_A_Down_-_Forest_08.mp3",
+ "title" : "Forest",
+ "duration" : 2400,
+"artist" : "System of a Down",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Rock"
+},
+{
+ "url" : "https://cdn.discordapp.com/attachments/377217220041900034/453308978089426985/System_Of_A_Down_-_Prison_Song_01.mp3",
+ "title" : "Prison song",
+ "duration" : 2110,
+"artist" : "System of a Down",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Rock"
+},
+{
+ "url" : "https://cdn.discordapp.com/attachments/377217220041900034/453308978089426985/System_Of_A_Down_-_Prison_Song_01.mp3",
+ "title" : "SPIDERS!",
+ "duration" : 2150,
+"artist" : "System of a Down",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Rock"
+},
+{
+ "url" : "https://cdn.discordapp.com/attachments/377217220041900034/453309000780611604/System_Of_A_Down_-_Aerials_14.mp3",
+ "title" : "Aerials",
+ "duration" : 2320,
+"artist" : "System of a Down",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Rock"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/377217220041900034/453309015955472394/System_Of_A_Down_-_Jet_Pilot_04.mp3",
+"title" : "Jet Pilot",
+"duration" : 1260,
+"artist" : "System of a Down",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Rock"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/377217220041900034/454653832945860608/Skeleton_Man-_The_Axis_of_Awesome.mp3",
+"title" : "Skeleton Man",
+"duration" : 1510,
+"artist" : "AoW",
+"secret": true,
+"lobby": false,
+"jukebox": true,
+"genre": "Classical and Orchestral"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/745916615606140938/775593951259918336/Nanook_Rubs_It.mp3",
+"title" : "Nanook Rubs It",
+"duration" :2770,
+"artist" : "Frank Zappa",
+"secret": true,
+"lobby": false,
+"jukebox": true,
+"genre": "Country and Western"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/745916615606140938/775593948307521566/Muffin_Man.mp3",
+"title" : "Muffin Man",
+"duration" :3370,
+"artist" : "Frank Zappa",
+"secret": true,
+"lobby": false,
+"jukebox": true,
+"genre": "Folk and Indie"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/404660884531707906/456271996314058752/Edgar_Rothermich_-01_Theme_from_Silent_Hill_jungle-vibe.com.mp3",
+"title" : "Silent Hill",
+"duration" : 1760,
+"artist" : "Akira Yamaoka and Edgar Rothermich",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Country and Western"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/377217220041900034/460490120240300052/Nightcore_-_Tetris.mp3",
+"title" : "Tetris Remixed",
+"duration" : 1910,
+"artist" : "nightcore",
+"secret": true,
+"lobby": false,
+"jukebox": true,
+"genre": "Electronic"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/377217220041900034/460490219167154186/VERSACE_2017_-_TIX__The_Pssy_Project.mp3",
+"title" : "Versance",
+"duration" : 2030,
+"artist" : "PussyProject",
+"secret": true,
+"lobby": false,
+"jukebox": true,
+"genre": "Classical and Orchestral"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/377217220041900034/460490229523021834/-_.mp3",
+"title" : "Russian Techno",
+"duration" : 2400,
+"artist" : "Some russians",
+"secret": true,
+"lobby": false,
+"jukebox": true,
+"genre": "Hip-Hop and Rap"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/377217220041900034/460490231611654144/Rock_Dog_2017_Movie_Official_Lyric_Video_Glorious_by_Adam_Friedman.mp3",
+"title" : "Gloriouse",
+"duration" : 2200,
+"artist" : "Rock Dog",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Rock"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/377217220041900034/460490245725487104/Gigi_DAgostino_-_You_Spin_Me_Round__Tecno_Fes_2_.mp3",
+"title" : "You spin me around",
+"duration" : 2580,
+"artist" : "Gigi DAgostino",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Pop"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/377217220041900034/460490246610747402/-__Kyary_Pamyu_Pamyu_-.mp3",
+"title" : "Pamyu Pamyu",
+"duration" : 2640,
+"artist" : "Kyary",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Pop"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/377217220041900034/457628201200648202/Berserk_-_S3RL_ft_Iceman.mp3",
+"title" : "Beserk",
+"duration" :1620,
+"artist" : "S3RL ft Iceman",
+"secret": true,
+"lobby": false,
+"jukebox": true,
+"genre": "Metal"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/458630047167807488/520025625852117002/Nick_Hakim_-_Pour_Another.mp3",
+"title" : "Pour Another",
+"duration" :3510,
+"artist" : "Nick Hakim",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Jazz"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/526693916859170816/559236326264668190/Ocean_Man.mp3",
+"title" : "Ocean Man",
+"duration" : 1270,
+"artist" : "Ween",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Classical and Orchestral"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/458630047167807488/520025672702492682/Nick_Hakim_-_I_Dont_Know.mp3",
+"title" : "I dont know",
+"duration" :2990,
+"artist" : "Nick Hakim",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Jazz"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/404660884531707906/614356720503881728/Underfell_Megalovania.mp3",
+"title" : "Underfell",
+"duration" :1830,
+"artist" : "keno9988iii",
+"secret": true,
+"lobby": false,
+"jukebox": true,
+"genre": "Metal"
+},
+{
+"url" : "https://cdn.discordapp.com/attachments/661630061983825938/663112074880352276/Headhunterz_-_Scrap_Attack_HQ.mp3",
+"title" : "Scrap Attack",
+"duration" :3730,
+"artist" : "Headhunterz",
+"secret": true,
+"lobby": false,
+"jukebox": true,
+"genre": "Electronic"
+},
+{
+"url" : "https://files.catbox.moe/h967s5.mp3",
+"title" : "MEGALOVANIA",
+"duration" : 1416,
+"artist" : "Toby Fox",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Video Game"
+},
+{
+"url" : "https://files.catbox.moe/yumfgs.mp3",
+"title" : "ASGORE",
+"duration" : 1416,
+"artist" : "Toby Fox",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Video Game"
+},
+{
+"url" : "https://files.catbox.moe/ewn2u4.mp3",
+"title" : "Disco Descent",
+"duration" : 1800,
+"artist" : "Danny Baranowsky",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Electronic"
+},
+{
+"url" : "https://files.catbox.moe/8rns1d.mp3",
+"title" : "Konga Conga Kappa",
+"duration" : 1130,
+"artist" : "Danny Baranowsky",
+"secret": false,
+"lobby": false,
+"jukebox": true,
+"genre": "Electronic"
+},
+{
+"url": "https://files.catbox.moe/3h38kn.mp3",
+"title": "Among Us",
+"duration": 720,
+"genre": "Disco, Funk, Soul, and R&B",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/rqhxj1.mp3",
+"title": "Leggy Zone",
+"duration": 1470,
+"genre": "Electronic",
+"secret": true,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/e6l6mw.mp3",
+"title": "Shop Theme",
+"duration": 8910,
+"genre": "Electronic",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/q2ob3n.mp3",
+"title": "PONPONPON",
+"duration": 2430,
+"artist": "Kyary Pamyu Pamyu",
+"genre": "J-Pop",
+"secret": false,
+"lobby": false
+},
+{
+"url": "https://files.catbox.moe/o8flhu.mp3",
+"title": "Man's Road",
+"duration": 2060,
+"artist": "America",
+"genre": "Rock",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/0gb5qs.mp3",
+"title": "Passionflower",
+"duration": 3840,
+"artist": "Jon Gomm",
+"genre": "Rock",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/p5e28z.mp3",
+"title": "What the Fuck",
+"duration": 2420,
+"artist": "Koh",
+"genre": "Folk and Indie",
+"secret": true,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/0f2xma.mp3",
+"title": "Bonetrousle",
+"duration": 580,
+"artist": "Toby Fox",
+"genre": "Video Game",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/6ivc7w.mp3",
+"title": "Bury the Light",
+"duration": 5830,
+"artist": "Victor Borba & Casey Edwards",
+"genre": "Video Game",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/pbtbjv.mp3",
+"title": "Dog Song",
+"duration": 380,
+"artist": "Toby Fox",
+"genre": "Video Game",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/4v3eeb.mp3",
+"title": "Anticipation",
+"duration": 230,
+"artist": "Toby Fox",
+"genre": "Video Game",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/0q8ch6.mp3",
+"title": "Smash Clown",
+"duration": 820,
+"artist": "Goat",
+"genre": "Space",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/ygcg2e.mp3",
+"title": "Honk The Police",
+"duration": 590,
+"artist": "Goat",
+"genre": "Space",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/h0yswi.mp3",
+"title": "Cargonia",
+"duration": 630,
+"artist": "Goat",
+"genre": "Space",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/xg76ja.mp3",
+"title": "Hail Cargonia",
+"duration": 980,
+"artist": "Goat",
+"genre": "Space",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/tbr2rc.mp3",
+"title": "Banned From Cargo",
+"duration": 2450,
+"artist": "Goat",
+"genre": "Space",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/tw2et2.mp3",
+"title": "Periphery Dixie",
+"duration": 1200,
+"artist": "Goat",
+"genre": "Space",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/rm5hcs.mp3",
+"title": "Cargonia (cover)",
+"duration": 2730,
+"artist": "Dadbot5000",
+"genre": "Space",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/ybfof9.mp3",
+"title": "The Legend",
+"duration": 1120,
+"artist": "Toby Fox",
+"genre": "Video Game",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/ugfx06.mp3",
+"title": "Field of Hopes and Dreams",
+"duration": 1610,
+"artist": "Toby Fox",
+"genre": "Video Game",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/wr08om.mp3",
+"title": "Checker Dance",
+"duration": 780,
+"artist": "Toby Fox",
+"genre": "Video Game",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/4au954.mp3",
+"title": "Vs Susie",
+"duration": 810,
+"artist": "Toby Fox",
+"genre": "Video Game",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/c9y5x2.mp3",
+"title": "Golden Wind",
+"duration": 2930,
+"artist": "Yugo Kanno",
+"genre": "Anime",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/ymvtem.mp3",
+"title": "Sono Chi no Sadame",
+"duration": 2610,
+"artist": "Hiroaki TOMMY Tominaga",
+"genre": "Anime",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/z73u05.mp3",
+"title": "Bloody Stream",
+"duration": 2590,
+"artist": "Coda",
+"genre": "Anime",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/yg3643.mp3",
+"title": "Stand Proud",
+"duration": 2750,
+"artist": "Jin Hashimoto",
+"genre": "Anime",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/344qrf.mp3",
+"title": "Sono Chi no Kioku ~end of THE WORLD~",
+"duration": 2620,
+"artist": "JO☆STARS",
+"genre": "Anime",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/0n6y6v.mp3",
+"title": "Crazy Noisy Bizarre Town",
+"duration": 1840,
+"artist": "THE DU",
+"genre": "Anime",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/j3xzw6.mp3",
+"title": "Chase",
+"duration": 1450,
+"artist": "Batta",
+"genre": "Anime",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/luf1bh.mp3",
+"title": "Great Days",
+"duration": 2400,
+"artist": "Karen Aoki & Daisuke Hasegaw",
+"genre": "Anime",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/ytp4d2.mp3",
+"title": "Fighting Gold",
+"duration": 2540,
+"artist": "Coda",
+"genre": "Anime",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/q1xjdp.mp3",
+"title": "I Want It That Way",
+"duration": 2120,
+"artist": "Backstreet Boys",
+"genre": "Pop",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/pxpkat.mp3",
+"title": "Shop Theme Cover",
+"duration": 1770,
+"artist": "Songe",
+"genre": "Video Game",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/nz03o1.mp3",
+"title": "Deep Space 9 (Cover)",
+"duration": 1220,
+"artist": "Heropoint",
+"genre": "Rock",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/n4vcnq.mp3",
+"title": "Trouble Shooting Star",
+"duration": 1460,
+"artist": "",
+"genre": "Video Game",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/byy378.mp3",
+"title": "The Lord of the Rings The Fellowship of the its my book they will walk if I tell them to",
+"duration": 970,
+"artist": "Tom Cardy",
+"genre": "Folk and Indie",
+"secret": true,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/akgbup.mp3",
+"title": "Flight of the Bumblebee",
+"duration": 2050,
+"artist": "Rimsky Korsakov",
+"genre": "Classical and Orchestral",
+"secret": true,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/milk8o.mp3",
+"title": "As Heaven Is Wide",
+"duration": 2880,
+"artist": "Garbage",
+"genre": "Rock",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/8mh82l.mp3",
+"title": "Combat Montage",
+"duration": 1410,
+"artist": "Kevin Manthei",
+"genre": "Rock",
+"secret": true,
+"lobby": false,
+"jukebox": true
+},
+
+{
+"url": "https://files.catbox.moe/qa6ahi.mp3",
+"title": "Deadlines",
+"duration": 1570,
+"artist": "Network Music Ensemble",
+"genre": "Rock",
+"secret": false,
+"lobby": true,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/cdmm5k.mp3",
+"title": "Holding Out For A Hero",
+"duration": 2620,
+"artist": "Ella Mae Bowen",
+"genre": "Country and Western",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/jlv9eb.mp3",
+"title": "Jiko Bunseki",
+"duration": 1420,
+"artist": "Yuki Hayashi",
+"genre": "Anime",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/vzbcsc.mp3",
+"title": "Let It End",
+"duration": 2220,
+"artist": "Karliene",
+"genre": "Folk and Indie",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/nsfwxe.mp3",
+"title": "Proof Of A Hero (16 bit)",
+"duration": 1410,
+"artist": "Bulby",
+"genre": "Video Game",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/ywoaqa.mp3",
+"title": "Proof Of A Hero",
+"duration": 1340,
+"artist": "Kouda Masato",
+"genre": "Video Game",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/xlrbbe.mp3",
+"title": "Pure Imagination",
+"duration": 2060,
+"artist": "Fiona Apple",
+"genre": "Electronic",
+"secret": false,
+"lobby": true,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/q3f6sq.mp3",
+"title": "Rhapsody In Blue",
+"duration": 9870,
+"artist": "Kamil Hala, Slovak Philharmonic Orchestra, Libor Pešek",
+"genre": "Classical and Orchestral",
+"secret": false,
+"lobby": true,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/vzsm5k.mp3",
+"title": "Surface Of SR388",
+"duration": 1710,
+"artist": "BG Ollie",
+"genre": "Video Game",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/ngtv3e.mp3",
+"title": "Where My Heart Will Take Me",
+"duration": 0,
+"artist": "Russell Watson",
+"genre": "Country and Western",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/cfq7bo.mp3",
+"title": "Kiss From A Rose",
+"duration": 2860,
+"artist": "Dan Avidan & Super Guitar Bros",
+"genre": "Acoustic",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/4mypzc.mp3",
+"title": "Black Hole Sun",
+"duration": 3210,
+"artist": "Dan Avidan & Super Guitar Bros",
+"genre": "Acoustic",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/qpkv1q.mp3",
+"title": "I Still Haven't Found What I'm Looking For",
+"duration": 2870,
+"artist": "Dan Avidan & Super Guitar Bros",
+"genre": "Acoustic",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/g8vawq.mp3",
+"title": "Nights In White Satin",
+"duration": 2710,
+"artist": "Dan Avidan & Super Guitar Bros",
+"genre": "Acoustic",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/01ljjx.mp3",
+"title": "Land Of Confusion",
+"duration": 2850,
+"artist": "Dan Avidan & Super Guitar Bros",
+"genre": "Acoustic",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/2iugx4.mp3",
+"title": "Aspirations",
+"duration": 3010,
+"artist": "Dan Avidan & Super Guitar Bros",
+"genre": "Acoustic",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/m3cwu1.mp3",
+"title": "Head Over Heels",
+"duration": 2420,
+"artist": "Dan Avidan & Super Guitar Bros",
+"genre": "Acoustic",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/xtizlg.mp3",
+"title": "Get Lucky",
+"duration": 2490,
+"artist": "Dan Avidan & Super Guitar Bros",
+"genre": "Acoustic",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/dym0sp.mp3",
+"title": "God Only Knows",
+"duration": 1810,
+"artist": "Dan Avidan & Super Guitar Bros",
+"genre": "Acoustic",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/i8gml0.mp3",
+"title": "Scarborough Fair",
+"duration": 2020,
+"artist": "Dan Avidan & Super Guitar Bros",
+"genre": "Acoustic",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/chc70l.mp3",
+"title": "The Sphere A Kind Of Dream",
+"duration": 620,
+"artist": "Dan Avidan & Super Guitar Bros",
+"genre": "Acoustic",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/w48oqv.mp3",
+"title": "Pushin' The Speed of Light",
+"duration": 2130,
+"artist": "Julia Ecklar & Anne Prather",
+"genre": "Folk and Indie",
+"secret": false,
+"lobby": true,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/zacsky.mp3",
+"title": "S.T.L.",
+"duration": 1190,
+"artist": "Free Fall & Other Delights",
+"genre": "Folk and Indie",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/9a3ow3.mp3",
+"title": "Phantom Lover of the Star Drive",
+"duration": 1930,
+"artist": "Free Fall & Other Delights",
+"genre": "Folk and Indie",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/eo59pv.mp3",
+"title": "Molecular Clouds",
+"duration": 1560,
+"artist": "Free Fall & Other Delights",
+"genre": "Folk and Indie",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/227jw9.mp3",
+"title": "A Reconsideration (Zero-G Sex)",
+"duration": 2530,
+"artist": "Free Fall & Other Delights",
+"genre": "Folk and Indie",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/yvn8bu.mp3",
+"title": "Stuck Here",
+"duration": 1360,
+"artist": "Free Fall & Other Delights",
+"genre": "Folk and Indie",
+"secret": false,
+"lobby": true,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/nsnf73.mp3",
+"title": "The Ballad of Transport 18",
+"duration": 2660,
+"artist": "Leslie Fish",
+"genre": "Folk and Indie",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/hwsbsi.mp3",
+"title": "Don't Push That Button",
+"duration": 2450,
+"artist": "Duane Elms",
+"genre": "Folk and Indie",
+"secret": false,
+"lobby": true,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/iizfw9.mp3",
+"title": "Late Night at the Draco Tavern",
+"duration": 2600,
+"artist": "Duane Elms",
+"genre": "Folk and Indie",
+"secret": false,
+"lobby": true,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/4zaljk.mp3",
+"title": "Startide Rising",
+"duration": 1050,
+"artist": "Duane Elms",
+"genre": "Folk and Indie",
+"secret": false,
+"lobby": true,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/9y01ry.mp3",
+"title": "F.A.P. Feline American Princess",
+"duration": 2640,
+"artist": "Leslie Fish",
+"genre": "Folk and Indie",
+"secret": false,
+"lobby": false,
+"jukebox": true
+},
+{
+"url": "https://files.catbox.moe/s7u3vi.mp3",
+"title": "Hymn to Breaking Strain",
+"duration": 2710,
+"artist": "Julia Ecklar & Leslie Fish",
+"genre": "Folk and Indie",
+"secret": false,
+"lobby": false,
+"jukebox": true
}
-]
\ No newline at end of file
+]
diff --git a/icons/_nanomaps/gb1.png b/icons/_nanomaps/gb1.png
new file mode 100644
index 00000000000..8c3ac8f2db8
Binary files /dev/null and b/icons/_nanomaps/gb1.png differ
diff --git a/icons/_nanomaps/gb2.png b/icons/_nanomaps/gb2.png
new file mode 100644
index 00000000000..63277ea186a
Binary files /dev/null and b/icons/_nanomaps/gb2.png differ
diff --git a/icons/_nanomaps/gb3.png b/icons/_nanomaps/gb3.png
new file mode 100644
index 00000000000..2ad403f15e8
Binary files /dev/null and b/icons/_nanomaps/gb3.png differ
diff --git a/icons/_nanomaps/gbeast.png b/icons/_nanomaps/gbeast.png
new file mode 100644
index 00000000000..2f6f110f427
Binary files /dev/null and b/icons/_nanomaps/gbeast.png differ
diff --git a/icons/_nanomaps/gbmining.png b/icons/_nanomaps/gbmining.png
new file mode 100644
index 00000000000..769d080980a
Binary files /dev/null and b/icons/_nanomaps/gbmining.png differ
diff --git a/icons/_nanomaps/gbnorth.png b/icons/_nanomaps/gbnorth.png
new file mode 100644
index 00000000000..5b4f03662e7
Binary files /dev/null and b/icons/_nanomaps/gbnorth.png differ
diff --git a/icons/_nanomaps/gbsouth.png b/icons/_nanomaps/gbsouth.png
new file mode 100644
index 00000000000..1a3a1b22e39
Binary files /dev/null and b/icons/_nanomaps/gbsouth.png differ
diff --git a/icons/_nanomaps/gbwest.png b/icons/_nanomaps/gbwest.png
new file mode 100644
index 00000000000..d19c3019a8c
Binary files /dev/null and b/icons/_nanomaps/gbwest.png differ
diff --git a/icons/_nanomaps/tether_nanomap_z1.png b/icons/_nanomaps/tether_nanomap_z1.png
index fa1d0d61484..a2ef4f92e0e 100644
Binary files a/icons/_nanomaps/tether_nanomap_z1.png and b/icons/_nanomaps/tether_nanomap_z1.png differ
diff --git a/icons/_nanomaps/tether_nanomap_z2.png b/icons/_nanomaps/tether_nanomap_z2.png
index b15ae23be0c..5f1eacdb197 100644
Binary files a/icons/_nanomaps/tether_nanomap_z2.png and b/icons/_nanomaps/tether_nanomap_z2.png differ
diff --git a/icons/_nanomaps/tether_nanomap_z3.png b/icons/_nanomaps/tether_nanomap_z3.png
index af24bb981d7..b6d0eed70d2 100644
Binary files a/icons/_nanomaps/tether_nanomap_z3.png and b/icons/_nanomaps/tether_nanomap_z3.png differ
diff --git a/icons/_nanomaps/tether_nanomap_z4.png b/icons/_nanomaps/tether_nanomap_z4.png
index 510d22b3d61..c2623219ee4 100644
Binary files a/icons/_nanomaps/tether_nanomap_z4.png and b/icons/_nanomaps/tether_nanomap_z4.png differ
diff --git a/icons/_nanomaps/tether_nanomap_z5.png b/icons/_nanomaps/tether_nanomap_z5.png
index 0e85f1c55ae..26843c06404 100644
Binary files a/icons/_nanomaps/tether_nanomap_z5.png and b/icons/_nanomaps/tether_nanomap_z5.png differ
diff --git a/icons/chattags.dmi b/icons/chattags.dmi
index a0b1d335d0f..ef7eee0f4c2 100644
Binary files a/icons/chattags.dmi and b/icons/chattags.dmi differ
diff --git a/icons/inventory/accessory/item_vr.dmi b/icons/inventory/accessory/item_vr.dmi
index 09e84258504..a21b81c2b4f 100644
Binary files a/icons/inventory/accessory/item_vr.dmi and b/icons/inventory/accessory/item_vr.dmi differ
diff --git a/icons/inventory/accessory/mob_vr.dmi b/icons/inventory/accessory/mob_vr.dmi
index 7327c9b1363..a738336ba1f 100644
Binary files a/icons/inventory/accessory/mob_vr.dmi and b/icons/inventory/accessory/mob_vr.dmi differ
diff --git a/icons/inventory/back/mob.dmi b/icons/inventory/back/mob.dmi
index 380709f036a..0d98a933c9b 100644
Binary files a/icons/inventory/back/mob.dmi and b/icons/inventory/back/mob.dmi differ
diff --git a/icons/inventory/head/item_vr.dmi b/icons/inventory/head/item_vr.dmi
index 54a988a2b78..d8e7dbd97fb 100644
Binary files a/icons/inventory/head/item_vr.dmi and b/icons/inventory/head/item_vr.dmi differ
diff --git a/icons/inventory/head/item_vr_altevian.dmi b/icons/inventory/head/item_vr_altevian.dmi
new file mode 100644
index 00000000000..acedeb864c2
Binary files /dev/null and b/icons/inventory/head/item_vr_altevian.dmi differ
diff --git a/icons/inventory/head/mob_vox.dmi b/icons/inventory/head/mob_vox.dmi
index 346ea9b7d18..f1570089c8a 100644
Binary files a/icons/inventory/head/mob_vox.dmi and b/icons/inventory/head/mob_vox.dmi differ
diff --git a/icons/inventory/head/mob_vr.dmi b/icons/inventory/head/mob_vr.dmi
index 2c417cdd250..2da016ca45f 100644
Binary files a/icons/inventory/head/mob_vr.dmi and b/icons/inventory/head/mob_vr.dmi differ
diff --git a/icons/inventory/head/mob_vr_altevian.dmi b/icons/inventory/head/mob_vr_altevian.dmi
new file mode 100644
index 00000000000..cdd6fe581ae
Binary files /dev/null and b/icons/inventory/head/mob_vr_altevian.dmi differ
diff --git a/icons/inventory/suit/item.dmi b/icons/inventory/suit/item.dmi
index 018fd239357..81ec437202a 100644
Binary files a/icons/inventory/suit/item.dmi and b/icons/inventory/suit/item.dmi differ
diff --git a/icons/inventory/suit/item_vr.dmi b/icons/inventory/suit/item_vr.dmi
index 806c8a021a8..fb17453b3c2 100644
Binary files a/icons/inventory/suit/item_vr.dmi and b/icons/inventory/suit/item_vr.dmi differ
diff --git a/icons/inventory/suit/item_vr_altevian.dmi b/icons/inventory/suit/item_vr_altevian.dmi
new file mode 100644
index 00000000000..a3aa3a0e695
Binary files /dev/null and b/icons/inventory/suit/item_vr_altevian.dmi differ
diff --git a/icons/inventory/suit/mob.dmi b/icons/inventory/suit/mob.dmi
index eed3749711e..0e4a4ba3e18 100644
Binary files a/icons/inventory/suit/mob.dmi and b/icons/inventory/suit/mob.dmi differ
diff --git a/icons/inventory/suit/mob_vr.dmi b/icons/inventory/suit/mob_vr.dmi
index c97f407958c..eb19cb108c4 100644
Binary files a/icons/inventory/suit/mob_vr.dmi and b/icons/inventory/suit/mob_vr.dmi differ
diff --git a/icons/inventory/suit/mob_vr_altevian.dmi b/icons/inventory/suit/mob_vr_altevian.dmi
new file mode 100644
index 00000000000..8afd7064fa9
Binary files /dev/null and b/icons/inventory/suit/mob_vr_altevian.dmi differ
diff --git a/icons/inventory/uniform/item_vr.dmi b/icons/inventory/uniform/item_vr.dmi
index 4e92cd67101..305bdc3efbd 100644
Binary files a/icons/inventory/uniform/item_vr.dmi and b/icons/inventory/uniform/item_vr.dmi differ
diff --git a/icons/inventory/uniform/mob.dmi b/icons/inventory/uniform/mob.dmi
index 607a3153770..d368c3a4d74 100644
Binary files a/icons/inventory/uniform/mob.dmi and b/icons/inventory/uniform/mob.dmi differ
diff --git a/icons/inventory/uniform/mob_vr.dmi b/icons/inventory/uniform/mob_vr.dmi
index e4295298d37..f04df19f3e3 100644
Binary files a/icons/inventory/uniform/mob_vr.dmi and b/icons/inventory/uniform/mob_vr.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index def737dcc36..2cb35cf667e 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/animal_vr.dmi b/icons/mob/animal_vr.dmi
index 5d29e605117..75edbf26294 100644
Binary files a/icons/mob/animal_vr.dmi and b/icons/mob/animal_vr.dmi differ
diff --git a/icons/mob/custom_synthetic_vr.dmi b/icons/mob/custom_synthetic_vr.dmi
index 8c9cd318f75..efd3e243865 100644
Binary files a/icons/mob/custom_synthetic_vr.dmi and b/icons/mob/custom_synthetic_vr.dmi differ
diff --git a/icons/mob/drakeborg/drakeborg_vr.dmi b/icons/mob/drakeborg/drakeborg_vr.dmi
index 1be714814b9..56a79ce19c7 100644
Binary files a/icons/mob/drakeborg/drakeborg_vr.dmi and b/icons/mob/drakeborg/drakeborg_vr.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
new file mode 100644
index 00000000000..3e8d60a5798
Binary files /dev/null and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/DSIFennec/dsi_fennec.dmi b/icons/mob/human_races/cyberlimbs/DSIFennec/dsi_fennec.dmi
new file mode 100644
index 00000000000..7823146b3a1
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/DSIFennec/dsi_fennec.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/DSIZorren/dsi_zorren.dmi b/icons/mob/human_races/cyberlimbs/DSIZorren/dsi_zorren.dmi
new file mode 100644
index 00000000000..c2b46c5b60f
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/DSIZorren/dsi_zorren.dmi differ
diff --git a/icons/mob/human_races/markings_vr.dmi b/icons/mob/human_races/markings_vr.dmi
index 6a96c246895..ee1c196b379 100644
Binary files a/icons/mob/human_races/markings_vr.dmi and b/icons/mob/human_races/markings_vr.dmi differ
diff --git a/icons/mob/human_races/r_altevian.dmi b/icons/mob/human_races/r_altevian.dmi
new file mode 100644
index 00000000000..66822d745aa
Binary files /dev/null and b/icons/mob/human_races/r_altevian.dmi differ
diff --git a/icons/mob/human_races/r_def_altevian.dmi b/icons/mob/human_races/r_def_altevian.dmi
new file mode 100644
index 00000000000..66822d745aa
Binary files /dev/null and b/icons/mob/human_races/r_def_altevian.dmi differ
diff --git a/icons/mob/items/lefthand_guns_vr.dmi b/icons/mob/items/lefthand_guns_vr.dmi
index f2c51e21b92..20261bbbe16 100644
Binary files a/icons/mob/items/lefthand_guns_vr.dmi and b/icons/mob/items/lefthand_guns_vr.dmi differ
diff --git a/icons/mob/items/righthand_guns_vr.dmi b/icons/mob/items/righthand_guns_vr.dmi
index 7e899b2b990..f39b901489e 100644
Binary files a/icons/mob/items/righthand_guns_vr.dmi and b/icons/mob/items/righthand_guns_vr.dmi differ
diff --git a/icons/mob/pai_hud.dmi b/icons/mob/pai_hud.dmi
new file mode 100644
index 00000000000..2009b0e2372
Binary files /dev/null and b/icons/mob/pai_hud.dmi differ
diff --git a/icons/mob/pai_vr.dmi b/icons/mob/pai_vr.dmi
index 0b8b985ff7c..82f5faffe85 100644
Binary files a/icons/mob/pai_vr.dmi and b/icons/mob/pai_vr.dmi differ
diff --git a/icons/mob/pai_vr32x64.dmi b/icons/mob/pai_vr32x64.dmi
new file mode 100644
index 00000000000..02c15d3de82
Binary files /dev/null and b/icons/mob/pai_vr32x64.dmi differ
diff --git a/icons/mob/pai_vr64x32.dmi b/icons/mob/pai_vr64x32.dmi
new file mode 100644
index 00000000000..468e5cd216e
Binary files /dev/null and b/icons/mob/pai_vr64x32.dmi differ
diff --git a/icons/mob/pai_vr64x64.dmi b/icons/mob/pai_vr64x64.dmi
index f9c99e51eb2..d9840c659ea 100644
Binary files a/icons/mob/pai_vr64x64.dmi and b/icons/mob/pai_vr64x64.dmi differ
diff --git a/icons/mob/species/teshari/head.dmi b/icons/mob/species/teshari/head.dmi
index 0bb0637c4ee..6cf6b2ac7de 100644
Binary files a/icons/mob/species/teshari/head.dmi and b/icons/mob/species/teshari/head.dmi differ
diff --git a/icons/mob/taursuits_horse.dmi b/icons/mob/taursuits_horse.dmi
index 4162463c69b..4986bed14f3 100644
Binary files a/icons/mob/taursuits_horse.dmi and b/icons/mob/taursuits_horse.dmi differ
diff --git a/icons/mob/taursuits_horse_vr.dmi b/icons/mob/taursuits_horse_vr.dmi
index 4162463c69b..4986bed14f3 100644
Binary files a/icons/mob/taursuits_horse_vr.dmi and b/icons/mob/taursuits_horse_vr.dmi differ
diff --git a/icons/mob/taursuits_naga_alt_vr.dmi b/icons/mob/taursuits_naga_alt_vr.dmi
new file mode 100644
index 00000000000..ef431618870
Binary files /dev/null and b/icons/mob/taursuits_naga_alt_vr.dmi differ
diff --git a/icons/mob/vore/ears_vr.dmi b/icons/mob/vore/ears_vr.dmi
index 032ba8e4fa0..427f1fb7b76 100644
Binary files a/icons/mob/vore/ears_vr.dmi and b/icons/mob/vore/ears_vr.dmi differ
diff --git a/icons/mob/vore/tails_vr.dmi b/icons/mob/vore/tails_vr.dmi
index d5a4d7ad574..1b2e9460798 100644
Binary files a/icons/mob/vore/tails_vr.dmi and b/icons/mob/vore/tails_vr.dmi differ
diff --git a/icons/mob/vore/taurs_vr.dmi b/icons/mob/vore/taurs_vr.dmi
index 7b6f62e7f6a..8ae4803803c 100644
Binary files a/icons/mob/vore/taurs_vr.dmi and b/icons/mob/vore/taurs_vr.dmi differ
diff --git a/icons/mob/vore/wings_vr.dmi b/icons/mob/vore/wings_vr.dmi
index 4dac4615998..68432f86f2b 100644
Binary files a/icons/mob/vore/wings_vr.dmi and b/icons/mob/vore/wings_vr.dmi differ
diff --git a/icons/mob/widerobot_trauma_vr.dmi b/icons/mob/widerobot_trauma_vr.dmi
new file mode 100644
index 00000000000..c5694be9098
Binary files /dev/null and b/icons/mob/widerobot_trauma_vr.dmi differ
diff --git a/icons/obj/boxes.dmi b/icons/obj/boxes.dmi
index 7978b9a564c..948cb472da8 100644
Binary files a/icons/obj/boxes.dmi and b/icons/obj/boxes.dmi differ
diff --git a/icons/obj/casino.dmi b/icons/obj/casino.dmi
index 17405361e24..6a1bfda2ead 100644
Binary files a/icons/obj/casino.dmi and b/icons/obj/casino.dmi differ
diff --git a/icons/obj/chemical_vr.dmi b/icons/obj/chemical_vr.dmi
index 1046726245b..a08a052c90f 100644
Binary files a/icons/obj/chemical_vr.dmi and b/icons/obj/chemical_vr.dmi differ
diff --git a/icons/obj/cooking_machines.dmi b/icons/obj/cooking_machines.dmi
index 4009cb62249..b8c3ea6f5d2 100644
Binary files a/icons/obj/cooking_machines.dmi and b/icons/obj/cooking_machines.dmi differ
diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi
index 915c1705516..f1637aca4b3 100644
Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ
diff --git a/icons/obj/gun_toy.dmi b/icons/obj/gun_toy.dmi
index bee6bcc49d6..738911bcd6c 100644
Binary files a/icons/obj/gun_toy.dmi and b/icons/obj/gun_toy.dmi differ
diff --git a/icons/obj/gun_vr.dmi b/icons/obj/gun_vr.dmi
index e0788a56e9a..538ff61b764 100644
Binary files a/icons/obj/gun_vr.dmi and b/icons/obj/gun_vr.dmi differ
diff --git a/icons/obj/lighting32x64.dmi b/icons/obj/lighting32x64.dmi
index 1fe0dc024b5..36ccfb03fea 100644
Binary files a/icons/obj/lighting32x64.dmi and b/icons/obj/lighting32x64.dmi differ
diff --git a/icons/obj/lighting_vr.dmi b/icons/obj/lighting_vr.dmi
index e6e27c57a42..a97da56f005 100644
Binary files a/icons/obj/lighting_vr.dmi and b/icons/obj/lighting_vr.dmi differ
diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi
index 087ceb08b7d..517ce37d4b2 100644
Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ
diff --git a/icons/obj/mouseray.dmi b/icons/obj/mouseray.dmi
new file mode 100644
index 00000000000..fdb4d9bb906
Binary files /dev/null and b/icons/obj/mouseray.dmi differ
diff --git a/icons/obj/nanomods.dmi b/icons/obj/nanomods.dmi
index 7068034dade..f957c639833 100644
Binary files a/icons/obj/nanomods.dmi and b/icons/obj/nanomods.dmi differ
diff --git a/icons/obj/overmap.dmi b/icons/obj/overmap.dmi
index cef405461a7..c4dd9c42327 100644
Binary files a/icons/obj/overmap.dmi and b/icons/obj/overmap.dmi differ
diff --git a/icons/obj/paicard.dmi b/icons/obj/paicard.dmi
new file mode 100644
index 00000000000..4403d47a3d5
Binary files /dev/null and b/icons/obj/paicard.dmi differ
diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi
index 9aa94d1fe94..29bee45a9f0 100644
Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ
diff --git a/icons/obj/playing_cards.dmi b/icons/obj/playing_cards.dmi
index 071d53b04b6..0f2e51923a7 100644
Binary files a/icons/obj/playing_cards.dmi and b/icons/obj/playing_cards.dmi differ
diff --git a/icons/obj/projectiles_vr.dmi b/icons/obj/projectiles_vr.dmi
index 7cdadb1a0e7..a274d3edc20 100644
Binary files a/icons/obj/projectiles_vr.dmi and b/icons/obj/projectiles_vr.dmi differ
diff --git a/icons/obj/stacks.dmi b/icons/obj/stacks.dmi
index 6a70a2982d1..b08f3b086aa 100644
Binary files a/icons/obj/stacks.dmi and b/icons/obj/stacks.dmi differ
diff --git a/icons/obj/tools_vr.dmi b/icons/obj/tools_vr.dmi
index 05de9a423a4..576d69cfaba 100644
Binary files a/icons/obj/tools_vr.dmi and b/icons/obj/tools_vr.dmi differ
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index 0e0894a345e..5c8b632d6e0 100644
Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ
diff --git a/icons/turf/flooring/carpet.dmi b/icons/turf/flooring/carpet.dmi
index f668ae8943c..9e3472fcbf2 100644
Binary files a/icons/turf/flooring/carpet.dmi and b/icons/turf/flooring/carpet.dmi differ
diff --git a/icons/turf/flooring/wood.dmi b/icons/turf/flooring/wood.dmi
index eb913336735..afec20c8515 100644
Binary files a/icons/turf/flooring/wood.dmi and b/icons/turf/flooring/wood.dmi differ
diff --git a/icons/turf/flooring/wood_vr.dmi b/icons/turf/flooring/wood_vr.dmi
index d6024f3de06..f072969e54d 100644
Binary files a/icons/turf/flooring/wood_vr.dmi and b/icons/turf/flooring/wood_vr.dmi differ
diff --git a/icons/vore/custom_clothes_vr.dmi b/icons/vore/custom_clothes_vr.dmi
index cc7b2426707..78fa46a05c8 100644
Binary files a/icons/vore/custom_clothes_vr.dmi and b/icons/vore/custom_clothes_vr.dmi differ
diff --git a/icons/vore/custom_items_left_hand_vr.dmi b/icons/vore/custom_items_left_hand_vr.dmi
index 1ee6c0a336c..a9abdac0c38 100644
Binary files a/icons/vore/custom_items_left_hand_vr.dmi and b/icons/vore/custom_items_left_hand_vr.dmi differ
diff --git a/icons/vore/custom_items_right_hand_vr.dmi b/icons/vore/custom_items_right_hand_vr.dmi
index a6e419e2ede..130ac356890 100644
Binary files a/icons/vore/custom_items_right_hand_vr.dmi and b/icons/vore/custom_items_right_hand_vr.dmi differ
diff --git a/icons/vore/custom_items_vr.dmi b/icons/vore/custom_items_vr.dmi
index c83155640c1..76707a55fbe 100644
Binary files a/icons/vore/custom_items_vr.dmi and b/icons/vore/custom_items_vr.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index e05190d4790..025b11e0fd1 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -229,7 +229,7 @@ macro "borghotkeymode"
command = "body-toggle-head"
elem
name = "F1"
- command = "adminhelp"
+ command = "request-help"
elem
name = "CTRL+SHIFT+F1+REP"
command = ".options"
@@ -453,7 +453,7 @@ macro "macro"
command = "body-toggle-head"
elem
name = "F1"
- command = "adminhelp"
+ command = "request-help"
elem
name = "CTRL+SHIFT+F1+REP"
command = ".options"
@@ -734,7 +734,7 @@ macro "hotkeymode"
command = "body-toggle-head"
elem
name = "F1"
- command = "adminhelp"
+ command = "request-help"
elem
name = "CTRL+SHIFT+F1+REP"
command = ".options"
@@ -952,7 +952,7 @@ macro "borgmacro"
command = "body-toggle-head"
elem
name = "F1"
- command = "adminhelp"
+ command = "request-help"
elem
name = "CTRL+SHIFT+F1+REP"
command = ".options"
@@ -1112,7 +1112,7 @@ menu "menu"
saved-params = "is-checked"
elem
name = "&Admin help\tF1"
- command = "adminhelp"
+ command = "request-help"
category = "&Help"
saved-params = "is-checked"
elem
diff --git a/maps/atoll/atoll.dmm b/maps/atoll/atoll.dmm
new file mode 100644
index 00000000000..55567d90fdd
--- /dev/null
+++ b/maps/atoll/atoll.dmm
@@ -0,0 +1,397 @@
+"aa" = (/obj/effect/floor_decal/atoll{icon_state = "mural"; dir = 1},/obj/machinery/gateway{dir = 9},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ab" = (/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 4},/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 1},/obj/machinery/gateway{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ac" = (/obj/effect/floor_decal/atoll{icon_state = "mural"; dir = 8},/obj/machinery/gateway{dir = 5},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ad" = (/obj/effect/floor_decal/atoll{icon_state = "mural"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ae" = (/obj/effect/floor_decal/atoll{icon_state = "mural"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"af" = (/obj/effect/floor_decal/atoll{icon_state = "mural"; dir = 4},/obj/machinery/gateway{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ag" = (/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ah" = (/obj/effect/floor_decal/atoll,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ai" = (/obj/effect/floor_decal/atoll{icon_state = "mural"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"aj" = (/obj/structure/flora/moss,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"ak" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"al" = (/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"am" = (/turf/simulated/floor/atoll,/area/gateway/atoll)
+"an" = (/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"ao" = (/obj/structure/railing/overhang/waterless,/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"ap" = (/obj/effect/decal/shadow,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"aq" = (/obj/structure/railing/overhang,/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"ar" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"as" = (/obj/structure/bed/chair/sofa/bench/marble,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"at" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"au" = (/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"av" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"aw" = (/obj/structure/lightpost/atoll,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ax" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"ay" = (/obj/structure/flora/moss{icon_state = "moss"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"az" = (/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 4},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"aA" = (/obj/effect/decal/shadow/silhouette/pillar{icon_state = "silhouette_p"; dir = 1},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"aB" = (/obj/machinery/gateway/centerstation,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"aC" = (/obj/effect/blocker,/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"aD" = (/obj/effect/blocker,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"aE" = (/obj/effect/blocker,/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"aF" = (/obj/effect/blocker,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"aG" = (/obj/effect/blocker,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"aH" = (/obj/effect/blocker,/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 8},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"aI" = (/obj/effect/blocker,/obj/structure/railing/overhang/waterless,/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"aJ" = (/obj/effect/blocker,/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 4},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"aK" = (/obj/effect/blocker,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"aL" = (/obj/effect/blocker,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"aM" = (/obj/effect/blocker,/obj/structure/flora/moss{icon_state = "moss"; dir = 8},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"aN" = (/obj/effect/blocker,/obj/structure/flora/moss,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"aO" = (/obj/effect/decal/shadow/silhouette,/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"aP" = (/obj/effect/floor_decal/atoll{icon_state = "mural"; dir = 4},/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"aQ" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 9},/obj/effect/floor_decal/atoll/bronze,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"aR" = (/obj/effect/floor_decal/atoll/border,/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"aS" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 5},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"aT" = (/obj/effect/floor_decal/atoll,/obj/structure/bed/chair/sofa/bench/marble{icon_state = "bench"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"aU" = (/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 8},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"aV" = (/obj/structure/flora/lily2,/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"aW" = (/obj/structure/flora/moss{icon_state = "moss"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"aX" = (/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"aY" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 9},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"aZ" = (/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ba" = (/obj/structure/flora/lily2,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"bb" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"bc" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"bd" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"be" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 5},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bf" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bg" = (/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bh" = (/obj/structure/railing/overhang,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"bi" = (/obj/structure/flora/lily3,/obj/structure/railing/overhang,/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"bj" = (/obj/structure/railing/overhang,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"bk" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bl" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bm" = (/obj/structure/flora/lily3,/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"bn" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 10},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bo" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bp" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bq" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/obj/effect/floor_decal/atoll/border/invert,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"br" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 6},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bs" = (/obj/structure/flora/lily1,/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"bt" = (/obj/structure/flora/moss{icon_state = "moss"; dir = 8},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"bu" = (/obj/effect/floor_decal/atoll{icon_state = "mural"; dir = 1},/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bv" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 10},/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bw" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bx" = (/obj/effect/floor_decal/atoll/border/invert,/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"by" = (/obj/effect/floor_decal/atoll/moss/random,/obj/effect/floor_decal/atoll/border/invert,/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bz" = (/obj/effect/floor_decal/atoll{icon_state = "mural"; dir = 8},/obj/structure/bed/chair/sofa/bench/marble{icon_state = "bench"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bA" = (/obj/effect/decal/shadow,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"bB" = (/obj/effect/floor_decal/atoll/stairs,/obj/effect/decal/shadow,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bC" = (/obj/structure/flora/moss{icon_state = "moss"; dir = 4},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"bD" = (/obj/structure/flora/moss{icon_state = "moss"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"bE" = (/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 1},/obj/structure/flora/moss{icon_state = "moss"; dir = 4},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"bF" = (/obj/effect/floor_decal/atoll/stairs,/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bG" = (/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 1},/obj/structure/flora/moss{icon_state = "moss"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"bH" = (/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 1},/obj/structure/flora/moss{icon_state = "moss"; dir = 8},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"bI" = (/obj/effect/floor_decal/atoll/stairs,/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bJ" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 9},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bK" = (/obj/structure/bed/chair/sofa/bench/marble,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 5},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bL" = (/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/obj/structure/railing/overhang,/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"bM" = (/obj/structure/flora/lily2,/obj/structure/railing/overhang,/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"bN" = (/obj/effect/floor_decal/atoll/stairs,/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bO" = (/obj/structure/flora/moss{icon_state = "moss"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"bP" = (/obj/structure/flora/moss,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"bQ" = (/obj/structure/flora/log2,/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"bR" = (/obj/structure/flora/tree/atoll{icon_state = "green"; dir = 4},/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bS" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bT" = (/obj/effect/decal/shadow/floor,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bU" = (/obj/effect/decal/shadow/floor,/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bV" = (/obj/effect/decal/shadow/floor,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 5},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bW" = (/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bX" = (/obj/structure/bed/chair/sofa/bench/marble{icon_state = "bench"; dir = 8},/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bY" = (/obj/structure/flora/tree/atoll{icon_state = "green"; dir = 1},/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"bZ" = (/obj/effect/floor_decal/atoll/moss/random,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ca" = (/obj/effect/floor_decal/atoll/bronze,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cb" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 6},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cc" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 10},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cd" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/obj/effect/floor_decal/atoll/bronze,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ce" = (/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cf" = (/obj/structure/bed/chair/sofa/bench/marble{icon_state = "bench"; dir = 1},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 6},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cg" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"ch" = (/turf/simulated/floor/beach/sand/outdoors/atoll,/area/gateway/atoll)
+"ci" = (/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"cj" = (/obj/structure/flora/tree/jungle,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"ck" = (/obj/structure/flora/tree/jungle_small,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"cl" = (/obj/structure/flora/bboulder1,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"cm" = (/obj/structure/flora/log1,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cn" = (/obj/structure/flora/ausbushes/reedbush,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"co" = (/obj/structure/flora/rocks1,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"cp" = (/obj/structure/flora/rocks2,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"cq" = (/obj/structure/flora/ausbushes/fernybush,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"cr" = (/obj/structure/flora/bboulder2,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"cs" = (/obj/structure/flora/log1,/turf/simulated/floor/beach/sand/outdoors/atoll,/area/gateway/atoll)
+"ct" = (/obj/structure/bed/chair/sofa/bench/marble,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 9},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cu" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cv" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cw" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 48; teleport_y = 107},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cx" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 33; teleport_y = 107},/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 1},/obj/effect/floor_decal/atoll/border,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cy" = (/obj/structure/flora/ausbushes/palebush,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"cz" = (/obj/structure/flora/tree/atoll{icon_state = "green"; dir = 8},/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cA" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/obj/effect/floor_decal/atoll/bronze,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cB" = (/obj/structure/flora/log1,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"cC" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cD" = (/obj/structure/bed/chair/sofa/bench/marble{icon_state = "bench"; dir = 1},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 10},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cE" = (/obj/effect/floor_decal/atoll/moss/random,/obj/effect/floor_decal/atoll/bronze,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cF" = (/obj/structure/flora/smallbould,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"cG" = (/obj/structure/flora/ausbushes/pointybush,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"cH" = (/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 8},/obj/effect/floor_decal/atoll/border/invert,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cI" = (/obj/effect/decal/shadow,/obj/structure/flora/moss{icon_state = "moss"; dir = 8},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"cJ" = (/obj/effect/decal/shadow,/obj/structure/flora/moss{icon_state = "moss"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"cK" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 62; teleport_y = 103},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cL" = (/obj/structure/flora/tree/atoll{icon_state = "green"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cM" = (/obj/structure/flora/log2,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"cN" = (/obj/structure/flora/ausbushes/fullgrass,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"cO" = (/obj/structure/flora/tree/atoll{icon_state = "green"; dir = 1},/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"cP" = (/obj/structure/flora/moss{icon_state = "moss"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"cQ" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 99; teleport_y = 83},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cR" = (/obj/structure/flora/moss{icon_state = "moss"; dir = 8},/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"cS" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 108; teleport_y = 90},/obj/effect/floor_decal/atoll/border,/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cT" = (/obj/effect/decal/shadow/silhouette/pillar{icon_state = "silhouette_p"; dir = 4},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"cU" = (/obj/structure/flora/tree/atoll{icon_state = "green"; dir = 1},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"cV" = (/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cW" = (/obj/effect/floor_decal/atoll/border/invert,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cX" = (/obj/structure/flora/tree/atoll/huge,/turf/simulated/floor/beach/sand/outdoors/atoll,/area/gateway/atoll)
+"cY" = (/obj/effect/floor_decal/atoll/border,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"cZ" = (/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"da" = (/obj/structure/flora/lily1,/obj/structure/railing/overhang,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"db" = (/obj/effect/floor_decal/atoll,/obj/machinery/gateway{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dc" = (/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 9},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dd" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"de" = (/obj/structure/bed/chair/sofa/bench/marble,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"df" = (/obj/structure/bed/chair/sofa/bench/marble{icon_state = "bench"; dir = 8},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 5},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dg" = (/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dh" = (/obj/machinery/gateway,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"di" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 9},/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dj" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dk" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 5},/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dl" = (/obj/structure/flora/lily2,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"dm" = (/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 8},/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dn" = (/obj/effect/floor_decal/atoll/power,/turf/simulated/floor/atoll{desc = "Scuff and weathered etchings make these floors out to be pretty old. This particular area looks energized, maybe it can supply power to something?"},/area/gateway/atoll/powered)
+"do" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dp" = (/obj/effect/floor_decal/atoll/moss/random,/obj/structure/flora/tree/atoll{icon_state = "green"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dq" = (/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dr" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 10},/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ds" = (/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dt" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 6},/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"du" = (/obj/effect/floor_decal/atoll/moss/random,/obj/effect/floor_decal/atoll/border/invert,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dv" = (/obj/structure/flora/lily3,/obj/structure/railing/overhang,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"dw" = (/obj/structure/flora/lily3,/obj/structure/railing/overhang,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"dx" = (/obj/effect/decal/shadow/silhouette/pillar,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"dy" = (/obj/effect/decal/shadow/silhouette/pillar,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"dz" = (/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 10},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dA" = (/obj/structure/bed/chair/sofa/bench/marble{icon_state = "bench"; dir = 1},/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dB" = (/obj/structure/bed/chair/sofa/bench/marble{icon_state = "bench"; dir = 8},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 6},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dC" = (/obj/effect/decal/shadow/silhouette/pillar{icon_state = "silhouette_p"; dir = 8},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"dD" = (/obj/effect/decal/shadow/silhouette/pillar{icon_state = "silhouette_p"; dir = 8},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"dE" = (/obj/effect/decal/shadow/silhouette/pillar{icon_state = "silhouette_p"; dir = 4},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"dF" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 4},/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dG" = (/obj/structure/flora/tree/atoll{icon_state = "green"; dir = 8},/obj/effect/floor_decal/atoll/moss/random,/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dH" = (/obj/structure/flora/ausbushes/genericbush,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"dI" = (/obj/structure/railing/overhang/waterless,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"dJ" = (/obj/structure/railing/overhang/waterless,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"dK" = (/obj/structure/flora/tree/atoll,/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dL" = (/obj/structure/flora/moss,/obj/effect/step_trigger/teleporter/atoll{teleport_x = 97; teleport_y = 46},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dM" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"dN" = (/obj/effect/decal/shadow,/obj/structure/flora/moss{icon_state = "moss"; dir = 4},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"dO" = (/obj/structure/flora/ausbushes/grassybush,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"dP" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 80; teleport_y = 55},/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 1},/obj/effect/floor_decal/atoll/border,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dQ" = (/obj/structure/flora/tree/atoll/huge{icon_state = "tree"; dir = 1},/obj/structure/flora/rocks1,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"dR" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 15; teleport_y = 39},/obj/effect/floor_decal/atoll/border,/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dS" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 36; teleport_y = 41},/obj/effect/floor_decal/atoll,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dT" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"dU" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 44; teleport_y = 33},/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 1},/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dV" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 44; teleport_y = 38},/obj/effect/floor_decal/atoll/border/invert,/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dW" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 8},/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dX" = (/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"dY" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 30; teleport_y = 25},/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 1},/obj/effect/floor_decal/atoll/border,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"dZ" = (/obj/structure/flora/ausbushes/sunnybush,/turf/simulated/floor/outdoors/grass/heavy/atoll,/area/gateway/atoll)
+"ea" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/obj/structure/flora/lily1,/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"eb" = (/obj/structure/flora/rocks1,/turf/simulated/floor/beach/sand/outdoors/atoll,/area/gateway/atoll)
+"ec" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 101; teleport_y = 19},/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 1},/obj/effect/floor_decal/atoll/border,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ed" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 1},/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ee" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 114; teleport_y = 20},/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 4},/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ef" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 1},/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"eg" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll)
+"eh" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 33; teleport_y = 91},/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 4},/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ei" = (/obj/effect/blocker,/obj/effect/decal/shadow/silhouette,/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"ej" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ek" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"el" = (/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 9},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"em" = (/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/obj/effect/floor_decal/atoll/border,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"en" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 5},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eo" = (/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ep" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eq" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 10},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"er" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"es" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 6},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"et" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/structure/railing/overhang,/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"eu" = (/obj/effect/floor_decal/atoll/moss/random,/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ev" = (/obj/effect/floor_decal/atoll/moss/random,/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ew" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 8},/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ex" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 4},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ey" = (/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 1},/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"ez" = (/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 8},/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eA" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 9},/obj/structure/bed/chair/sofa/bench/marble,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eB" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 1},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eC" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 1},/obj/effect/floor_decal/atoll/moss/random,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eD" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 9},/obj/effect/floor_decal/atoll/bronze,/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eE" = (/obj/effect/floor_decal/atoll/moss/random,/obj/effect/floor_decal/atoll/border,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eF" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 45; teleport_y = 26},/obj/effect/floor_decal/atoll,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eG" = (/obj/effect/floor_decal/atoll/moss/random,/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eH" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 5},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/obj/structure/bed/chair/sofa/bench/marble{icon_state = "bench"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eI" = (/obj/effect/floor_decal/atoll/moss/random,/obj/effect/floor_decal/atoll/border/invert{icon_state = "border_invert"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eJ" = (/obj/effect/floor_decal/atoll/moss/random,/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 5},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eK" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 10},/obj/structure/bed/chair/sofa/bench/marble{icon_state = "bench"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eL" = (/obj/effect/floor_decal/atoll/moss/random,/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 6},/obj/structure/bed/chair/sofa/bench/marble{icon_state = "bench"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eM" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 10},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eN" = (/obj/effect/floor_decal/atoll/border{icon_state = "border"; dir = 6},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/obj/structure/bed/chair/sofa/bench/marble{icon_state = "bench"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eO" = (/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 4},/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 1},/obj/structure/bed/chair/sofa/bench/marble,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eP" = (/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/obj/structure/flora/tree/atoll{icon_state = "green"; dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eQ" = (/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{icon_state = "bronze"; dir = 8},/obj/structure/bed/chair/sofa/bench/marble{icon_state = "bench"; dir = 1},/obj/effect/floor_decal/atoll/moss/random,/turf/simulated/floor/atoll,/area/gateway/atoll)
+"eR" = (/obj/vehicle/boat{icon_state = "boat"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"eS" = (/obj/vehicle/boat,/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+"eT" = (/obj/vehicle/boat{icon_state = "boat"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll)
+
+(1,1,1) = {"
+anananananananananananananananananananananananananananananananananananananananananananananananananananananaoaoananananananananananananananaoanananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananan
+ananananananananananananananananananananananananananananananananananananananananananananananananananananaradaeatananananananananananananaragatananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananan
+ananananananananananananananananananananananananananananananananananananananananananananananananananananarahaiatanananananananananananananajananananananananananananananananananananananananananananananananananananananananananananananananaoaoaoaoaoaoaoaoanananananananananananananan
+anananananananananananananananananananananananananananananananananananananananananananananananananananananakakananananananananananananananalanananananananananananananananananananananananananananananananananananananananananananananananaramamamamamamamamatananananananananananananan
+ananananananananananananananananananananananananananananananananananananananananananananananaoaoaoananananapapananananananaqanananananananalanananananaoaoananananananananananananananananananananananananananananananananananananananananaramamamamamamamamatananananananananananananan
+anananananananananananananananananananananananananananananananananananananananananananananaramasamatanananauauanananananavawaxananananananapananananaradaeatanananananananananananananananananananananananananananananananananananananananaramamamamamamamamatananananananananananananan
+anananananananananananananananananananananananananananananananananananananananananananananaramagayatanananazazananananananaAanananananananauananananarahaiatananananananananananananananananananananananananananananananananananananananananakakakakakakakakanananananananananananananan
+ananananananaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaDaEaFaEaGaCaCaCaHaHaCaIaIaIaIaIaIaIaIaIaIaIaCaCaJaCaCaCaCaCaKaKaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaLaLaLaMaLaLaNaLaCaCaCaCaCaCaCananananananan
+ananananananaCanananananananananananananananananananananananananananananananananananananananakakakananananaOaOaraPaQaRaRaRaRaRaRaRaSaTatanaUanananananapapanananananananananananananananananananananananananananananananananananananananananalalalalalalalalananananananaCananananananan
+ananananananaCananananananananananaVananananananananananananananananananananananananananananaWalalananananaXaXaraYaZbabbbbbbbbbbbcbdbeatanaOanananananauauanananananananananananananananananananananananananananananananananananananananananalalalalalalalalananananananaCananananananan
+ananananananaCanananananananananananananananananananananananananananananananananananananananalalalanananananaVarbfbgbhaqaqbiaqaqbjbkblatanaXanananananazazanananananananananananananananananananananananananananananananananananananananananalalalalalalalalananananbmanaCananananananan
+ananananananaCanananananananananananananananananananananananananananananananananananananananapapapananananananarbnbobpbpbpbpbpbpbpbqbratanananananananaUaUanananananananananananananananananananananananananananananananbsananananbmananananalalalalalbtalalananananananaCananananananan
+ananananananaCanananananananananananananananananananananananananananananananananananananananauauauananananananarbubvbwbwbxbwbybwbwbrbzatanananbmanananaOaOanananananananananananananaoaoaoaoanaVananananananananananananananananananananananalbtalalalalalalananananananaCananananananan
+ananananananaCananananbmanananananananananananananananananananananananananananananananaqananazazazanananananananbAbAbAbAbBbAbBbAbAbAbAananananananananaXaXananananananananananananaramamagamatanananananananananananananananananananananananalalalaWalalbCalananananananaCananananananan
+ananananananaCanananananananananananananananananananananananananananananananananananavawaxanaUaUaUananananananbDaubEauaubFbGbFaubHauauananananananananananananananananananananananaramagamamatanananananananananananananananananananananananalalalalalalalalananananananaCananananananan
+ananananananaCananananananananananananananananananananananananananananbmanaqaqaqaqananaAananaOaOaOananbmanananavazazazazbIazbIazazazazaxananananananananananananananananbmanananananakakakakananananananananananananananbmanananananaqanananapapapapapapapapanbmananananaCananananananan
+ananananananaCanananananananananananananananananananananananananananananavbJbpbpbKbhaqaqaqaqbLbLbLaqaqaqbMaqaqbjaUaUaUaUbNaUbNaUaUaUaUaxanananananananananananananananananananananbOalalalbPanananananananananananananananananananavawaxananaubGauauauauauauananananananaCananananananan
+ananananananaCananbQananananananananananananananananananananananananaqanavbkbRagbSamamamamamambSddddeOddddcuamambTbUbTbTbTbUbTbTbTbTbVaxanaqananananananaoaoaoanananananananananananalalalalananananananananananananananananananananaAanananazazazazazazazazananananananaCananananananan
+ananananananaCanananananananbmananananananananananaVanananananananavawaxavbWagagamamamamamamamagagagamamamamamamamamamagamamamamagambXaxavawaxananananaramagbYatbsanananananananananalalalalananananananananananananananananananananananananaUaUaUaUaUaUaUaUananananananaCananananananan
+ananananananaCanananananananananananananananananananananananananananaAanavbZamamcaamamamamamamcadsePeQcececCamamamamamamamamamamamamcbaxanaAananananananakakakanananananananananananalalalalananananananananananananananananananananananananaOaOaOaOaOaOaOaOananananananaCananananananan
+ananananananaCanananananananananananbmanananananananananananananananananavcccdcecfcgbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcamamamcgbbbbbbanananananananananalaWalanananananananananananapapapapananananananananananananananananananananananananaXaXaXaXaXaXaXaXananananananaCananananananan
+ananananananaCananananananananananananananananananananananananananananananbbbbbbbbananaqanananananananananananananaqanavamamamaxanaqananananananananananalalalanananananananananananauauauauananananananananananananananananananananananananananananananananananananananaCananananananan
+ananananananaCanananananananananananananananananchchchchchchchchchchananananananananavawaxanananananananananananavawaxavamamamaxavawaxanbmanananananananapapapananbsananananananananazazazazanananananananananananananbmananananananananananananananananananananananananaCananananananan
+ananananananaCbmananananananananananananananananchcicichchcichcicichanananananananananaAananananananananananananbsaAanavamamamaxanaAananananananananananauauauanananananananbmanananaUaUaUaUananananananananananananananananananananananananananananananananananananananaCananananananan
+ananananananaCanananananananananananananananananchcicicicicicicicichchananananananananananananananananananananananananavamamamaxananananananananananananazazazanananananananananananaOaOaOaOanananananananananananananananananananananananbmananananananananananananananaCananananananan
+ananananananaCanananananananananananananananchchchcicicicicicicicichchchchanananananananananananananaVananananananananavamamamaxananananananananananananaUaUaUanananananananananananaXaXaXaXananananananananananananananananananananananananananananananananananananananaCananananananan
+ananananananaCananananananananananbmananananchcicicjcicickciciclcicicicichananananananananananananananananananananananavamamamaxchchchchananananananananaOaOaOananananananananananananananananananananananananananbsananananananananananananananananananananananananananaCananananananan
+ananananananaCanananananananananananananananchchchchcicicicicicicicicichchanananananananananananeRananananananananananavamamamchchcicichchanananananananaXaXaXanananananananananananananananananananananananananananananananananananananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananananchchchcicicicjcicicicickchchananananananananananananananananchchchchchchchamamcmcicicicicnchchchchchanananananananananananananananananananananananananananananananananananbmanananananananananananananananananananananananaCananananananan
+ananananananaCanananananananananananananananananchchcicicicicicicicicicichananananananananchchchchchchchchchcicicicicicoamamamcicicicicicicicicichanananananananananananaqanananananananananananananananananananananananananananananananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananananananchcicpclcqcickcicicicichananananananananchcncicicicicicicicicicicicicramamamcicjcicicicicicicichchchchchchchananananavawaxanananananchchchchchchchchchananananananananananananananananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananananbmanchcicicicicicicickcicicsananananananananchcicicicicicicicjcicickcicictcuambSbKcicicicicicicickcicicicicicichanananananaAanananananchchcicicicickcicichchchchchchchananananbmanananananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananananananchciciciciciciadcYaecochchananananbmanchchaiaYdgciciciamcicicicickcicvagagagbgcpcicickcicicicicicicicrcicichaqaqaqaqaqaqaqaqaqaqaqchcrckcicncicicjctbpbpbpbKcicichchchchchananananananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananananananchchcickcicicibfcwblclcichananananananchcicxdmamciciciciamcicyciamamamagczagamamamamamamamamamamamamamamamamadaYcYcYcYcYcYcYbeaeamamamamamamamamamcuagagamcAcicicicicocBchchchananananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananananananchchcicicicrcjahbwaichchchbQanbsanananchclaebncVciciamciciciamcicicoamamagamamamamamamamamamamamamamamamamamahbnbwbwbwbwbwbwbraiamamamamamamamamamcCagbRamcAciciciciciclcichchananananananananananananananananananananaCananananananan
+ananananananaCanananananananananananananananananbmchchchcrchchchcschcichananananananananchchchcicicicicicicicicicicicicDcCamcEcfcicicicicicicicicpcjcicicicichbbaAbbbbbbbbbbbbaAbbcscpcicicickcicFcicDcCagcEcfcicicjcicicicichchananananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananananananchchchchchanananchchchananananananananananchcicicicicicicicicicrcicicicVamcWcicicicicicicicicicicicicicicichanananananaqananananchcicicicicocicicicnamamamcicickcicicicicichchananananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananananananananananananaqananananananananananananananchcicicicjciclcicicicicicicibncHbrcicicncicjcicicicicicicicicicjchananananavawaxanananchchcicjciclcicGciciamamamclcicicicickcicichchananananananananananananananananananananaCananananananan
+ananananananaCanananananananananananananananananananananananavawaxanananananananananananananchchchchchchchchcicnciciciciaeehadcicicicickcicicjcichchchchchchchanananananaAanananananchciciciciciciciciamamamcicicicicicicicicschananananananananananananananbmanananananaCananananananan
+ananananananaCananananananananananananananananananananananananaAanananananananananananananananananananananchchchcicjchchchchchchchchchchchchchchchananananananananaVananananananananchcicicicicicickciamamamcicicicicicicicichanananananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananananananananananananananananananananananananananananananananananananchchchchanananananananananananananananananananananananananananananananchchckcicicicicicpamamamcicicickcicicicichanbQanananananananananananananananananananaCananananananan
+ananananananaCanananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananchchchcicjciciciciamamamcjcicicicicjcicichanananananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananaoaoanananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananchchchchciciciciciamamamcicicicicicicichchanananananananananananananananananananananaCananananananan
+ananananananaCanananananananananananananaramamatananananananananananananananananananananananananananananananananananananbmananananananananananananananananananananananananananananananchchchchchciciciamamamcicrcjcicicichchananananbmanananananananananananananananananaCananananananan
+ananananananaCananananananananananananananakakananananananananananananananananananananananananananananananananananananananananananananananbmananananananananananananananananananbmananananananchchcjclamamamcochchchchchchanananananananananananananbsanananananananananaCananananananan
+ananananananaCanananananananananananananancIcJanananananananananananananananbsananananananananananananananananananananananananananananananananananananananananananananananananananananananananchchcschamamamchchchanananananananananananananananananananananananananananaCananananananan
+ananananananaCananananananananananbmanananauauanananbmanananananananananananananananananananananananananananananananananananananaoaoaoanananananananananananananananananananananananananananananananavamamamaxanananananananananananananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananazazanananananaoaoaoaoaoananananananananananananananananananananananananananananananaramamamatananananananananananananananananananananananananananananananavamamamaxanananananananananananananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananaUaUananananaramamagamcKatananananananaoaoanananananananananananananananananananananaramcLamatananananananbmananananananananananananananananananananananancMamamamaxanananbmanananananananananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananaOaOananananaragagagagagatanananananaramamatanananananbsanananananananananananananananakakakanananananananananananananananananananananananananananananananavamamamaxananananaoaoaoaoaoaoanananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananaXaXananananaragbRbYagamatananananananakcOananananananananananananananananananananananaWbtalanananananananananananananananananananananananananananananananavamamamaxanananaragagamasamamatananananananananananananananananananaCananananananan
+ananananananaCananananananbmananananananananananananananakakakakakanananananancPapcJananananananananananananananananananaVanananalalalanananananananananananananananananananananananananananananananavamamamaxanananarcQagamagagczatanaoaobmananananananananananananananaCananananananan
+ananananananaCanananananananananananbmanananaqananananbOaWalbCalalananananbmananauauananananananananananananananananananananananapapapanananananananananananananananananananananananananananananananavcVamamaxananananakakakakakcRanaradaeatananananananananananananananaCananananananan
+ananananananaCananananananananananananananavawaxanananbmalalalalalanananananananazazananananananananananananananananananananananauauauanananananananananananananananananananananananananananananananavbfamamaxanaVananalaWbCalalalanarahaiatananananananananananbmanananaCananananananan
+ananananananaCanananananananananananananananaAanananananapapapapapananananananbmaUaUananananananananananananananananananananananazazazananananananananananananananananananananananananananananananbsavbfamamaxananananalalalalalalananakakanananananananananananananananaCananananananan
+ananananananaCananananananananananananananananbmananananauauauauauanananananananaOaOanbmananananananananananananananananananananaUaUaUananananananananananananananananananananananananananananananaqbjbfamamaxananananalalalalalalananalalanananananananananananananananaCananananananan
+ananananananaCananananananananananananbmananananananananazazazazazanbmanananananaXaXananananananananananananananbsanananananananaOaOaOananananananananananananananbmananananananananananananananavaiaYdgamamaxananananalalalalalalananapapananananbmananananananananananaCananananananan
+ananananananaCanananananananananananananananananananananaUaUaUaUaUanananananananbmananananananananananananananbmananananananananaXaXaXanananananananananananananananananananananananananananananavcSdmamamamaxananananalalalalalalananauauanananananananananananananananaCananananananan
+ananananananaCanananananananananananananananananananananaOaOaOaOaOanananananananananananananananananananananbmanananananananananananananananananbmanananananananananananananananananananananananavaebncVamagaxananananapapapapapapananazazanananananananananananananananaCananananananan
+ananananananaCanananananananananananananananananananananaXaXaXaXaXananananananananananananananananananbQanananananananananananananananananananananananananananananananananananananananananananananbbcTbfagagcUananananauauauauauauananaUaUbmananananananananananananananaCananananananan
+ananananananaCananananananananananbsananananananananananananananananananananananananananananananananananbmanananananananananananananananananananananananananananananananananananananananananananananavbfamagaxananananazazazazazazananaOaOanananananananananananananananaCananananananan
+ananananananaCanananananananananananananananananananbmanananananananananananananananananananaVanananananananananananananananananananananananananananananananananananananananananananananananananananavbfamamaxananananaUaUaUaUaUaUananaXaXanananananananananbmanananananaCananananananan
+ananananananaCananananananananananananananananananananananananananananananbsananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananavdgamamaxananananaOaOaOaOaOaOanananananananananananananananananananaCananananananan
+ananananananaCanananananananananananananananananananananananananbmanananananananananananananananananananananananananananananananananananananananananananananananananananananchchchchananananananananavamamamaxananananaXaXaXaXaXaXanananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananananananananananananananananananananananananananananananananananananananananananananaqananananananananananananbsanaqananananananchcicicichananananaqanananavamamamaxanananaqanananananananananananananananananaVanananananananaCananananananan
+ananananananaCananananananananananananananananananananananananananananananananananananananaqanananananananaqananananananananavawaxanananeRananananananananavawaxanananananchcicicichanananavawaxananavcVamcWaxananavawaxananananananananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananbmananananananananananananananananananananananavawaxanananananavawaxananananananananaAananananananananananananananaAananananananchcXcicichananananaAanaqaqbjbfamblbhaqaqanaAanananananbmanananananananananananananananananananaCananananananan
+ananananananaCananananananananananananananananananananananananananananananananananananananaAananaqaqaqananaAananbsananananaqaqaqaqaqananananananananananaqaqaqaqaqaneRbmananchchchananananananavaPaYcYdgamcZcYbeaTaxananananananananananananananananananananananananananaCananananananan
+ananananananaCananbsananananchchchchchananananananananananananananbmananananbmanananananananandaaaabacbhaqaqaqaqaqaqaqaqbjdcdddedddfbhaqaqbMaqaqaqaqaqbjaYcYcYcYbebhaqaqaqaqaqaqaqaqaqaqaqaqaqbjaYdgcacecececCcZbeaxananananananananananananananananananananananananananaCananananananan
+ananananananaCananananananchchchcicichchchanananananananananananananananananananananananananavahafaBdbaiamamamamamamamamamamcWbwcVamamamamamamamamamcZcYdgdidjdkcZcYdgamamamamamamamamamamamcZcYdgambgdlbbbcbkamblaxananananananananananananananananananananananananananaCananananananan
+ananananananaCanananananchchcicicicicicichanananananananananananananananananananananananananavdmejdhekamamamamamamamamamamambldnbfamamamamamamamamamamamagdodpdqamamamamamamamamamamamamamamamamamambgaxbsavbkamblaxananananananananananananananananananananananananananaCananananananan
+ananananananaCanananananchcicicicicicicichchananananananananananananananananananananananananavadaeamadaeamamamamamamamamamamcZcYdgamamamamamamamamamcWbwcVdrdsdtdubwcVamamamamamamamamamamamcWbwcVambgdvaqdwbkamblaxananananananananananananananananananananananananananaCananananananan
+ananananananaCanananananchciclcicicickcicichchanananananananananananananananananananananananandxaibxahdybbbbbbbbbbbbbbbbcTdzcedAcedBdCbbbbbbbbbbbbbbbbcTbnbwbwbwbrdCbbbbbbbbbbbbbbbbbbbbbbbbbbcTbncVbSddddddcucWbraxananananananananananananananananananananananananananaCananananananan
+ananananananaCanananananchchcocickcicicicicichananananananananananananananananananananananaqananbbbbbbananaqanbmanananananbbdDaAdEbbanananananananananbQbbdDaAdEbbananananananananananananananavbubnbwcVamcWbwbrbzaxananananananananananananananananananananananananananaCananananananan
+ananananananaCananananananchcicicicicicrcicichanananananbmanananananananananananananananavawaxanananananavawaxananananananananaqananananananananananananananaqanananananananananananananananaqanbbbbcTbfamdFdCbbbbanaqanananananananananananananananananananananananananaCananananananan
+ananananananaCanananananchchcicicicicpcqcicichananananananananananananananananananananananaAanananananananaAananananananananavawaxananananananananananananavawaxanananananananananananananavawaxananavdgagdGaxananavawaxananananananananananananananananananananananananaCananananananan
+ananananananaCanananananchcicickcNcicicicickchananananananananananananananbmanananananananananananananananananananananananananaAananananananananaVanananananaAanananananananananananananananaAanananavamamagaxanananaAanananananananananananananananananbmanananananananaCananananananan
+ananananananaCanananananchchchcicicichchchchchanananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananavamamamaxanananananananananananananananananananananananananananananaCananananananan
+ananananananaCanananananananchchcrchchanananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananavamamamaxanananananananananananananananananananananananananananananaCananananananan
+ananananananaCananananananananchchchanananananananananananananananananananananananananananananananananananananananananananbsanananananananananananananananananananananaVananananananananananananananavamamamaxanananananananananananananananananananananananananananananaCananananananan
+ananananananaCanananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananavamamamaxananananananananananbmananananananananananananananananananaCananananananan
+ananananananaCananananananbmananananananananananananananananananananananananananananananananananananananbmananananananananananananananananananananananananananananananananananananananananananananbmavamamamaxanananananananananananananananananaoaoanananbmananananananaCananananananan
+ananananananaCanananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananaqanavamamamaxanaqanananananananananananananandIamamdJanananananananananaCananananananan
+ananananananaCananananananananananananananbmananananananananananananananananananananananananananananananananananananananananananananaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoananananananananananananananavawaxavamamamaxavawaxananananananananananananaramdKagamatananananananananaCananananananan
+ananananananaCananananananananananananananananananananananananananananananananananananananananananananananananananananananananananaramamamagamamamasamamamamamamagatananananananananananananananaAanavamamamaxanaAananananananananananananananakakakakanananananananananaCananananananan
+ananananananaCananananananananananbsananananananananananananananbmananananananananananananananananananananananananananananananananaragagamamamamamagamamamamagamdLatananananananananananananananananavamamamaxananananananananananananananananalbtbCalanananananananananaCananananananan
+ananananananaCananananananananananananananananananananananananananananananananananananananananananananananananananananbmananananananakakakakdMdMdMdMdMdMakakakakakanananananananananchchchchchchchchavamamamaxananananananananananananaoaoananalalalalanananananaoaoaoanaCananananananan
+ananananananaCanananananananananananananananananananananananananananananananananananananananananananananananananananananaoaoananancPalaWalalananbmanananalalalalalanananananananchchchcicicicicicichavamamamaxanbmanananananananananaramagatanapapapapananananaramagamataCananananananan
+ananananananaCanananananananananananananananananananananananananananananananananananananananaVananananananananananananaragbYatanananapapapapananananananapdNapapapanananananananchcicicicicicicicichchcVamcWaxananananananananananananakakananauauauauanananananakakakanaCananananananan
+ananananananaCanananananananananananananananananbmananananananananananananchchchchchananananananananananananananananananakakananananauauauauananananananauauauauauananananananchchcicicicicicicicicicibfamblaxananananananananananananbCalananazazazazanananananalaWalanaCananananananan
+ananananananaCananananananananananananananananananananananananananananananchcicicichchananananananananananbmananananananbtalanaqananazazazazananbsanananazazazazazananaqanananchcicicrcicicickcicicicibfamblaxananananananananananananapapananaUaUaUaUananananbmalalalanaCananananananan
+ananananananaCanananananananbmanananananananananananananananananananananchchcicickcichchchchchanananananananananananananapapavawaxanaUaUaUaUananananananaUaUaUaUaUanavawaxanchchcicicicicicicicickcicibfamblaxananananananananananananauauananaOaOaOaOanananananalalalanaCananananananan
+ananananananaCanananananananananananananananananananananananananananchchchcicicicicicicicicichanananananananananananananauauanaAananaOaOaOaOananananbmanaOaOaOaOaOananaAananchcicicicicicicicidHciciaYdgamblaxanaqananananananananananazazananaXaXaXaXanananananapapapanaCananananananan
+ananananananaCananananananananananananananananananananananananananchchcicicicickcicicicicichchanananananananananananananazazananananaXaXaXaXananananananaXaXaXaXaXanananananchcicicickcicicicraeaYcYeuamamblaxavawaxanananananananananaUaUanananananaqanananananauauauanaCananananananan
+ananananananaCanananananananananananananananananananananananananchchcicicicicicicicicicickchananananananananananananananaUaUananananananananananananananananananananananananchcicicicicicicicidPdmagbRagamblaxanaAananananananananananaOaOananananavawaxananananazazazanaCananananananan
+ananananananaCanananananananananananananaVanananananananananananchciciciciciciclcicjcicNcichchanananananananananbsanananaOaOananananananananananananananananananananananananchcicicicicicickciaibnbwevagamblaxananananananananananananaXaXanananaVanaAanananananaUaUaUanaCananananananan
+ananananananaCanananananananananananananananananananananananananchcicpcickciciamamamamclcicichanananananananananananananaXaXananananananananananananananananananananananananchchcicicicicicicicicicibncVamblaxanananananananananananananananananananananananananaOaOaOanaCananananananan
+ananananananaCanananananananaqanananananananananananananananananchciciciciciciamagagamcicicNchananananananananananananananananananananananananananananananananananananananananchchcicickcidOcrcicicicibfamblaxanananananananananananananananananananananananananaXaXaXanaCananananananan
+ananananananaCananananananavawaxanananbmananananananananananananchchaiciamcNckagamamamcicochchanananananananananananananananananananananananananananananananananananananananananchchcicicicicicicickcibfamblaxanananananananananananananananananananananananananananananaCananananananan
+ananananananaCanananananananaAanananananananananananananananananchchdRciciamamamamamagcicichanananbmananchchchchchchchananananananananananananananananananananananananananananananchchchchchchchchchchbfamblaxanaVanananananananananananananananananananananananananananaCananananananan
+ananananananaCananaoaoaoaoaoaoaoanananananananananananbmanananchchciciciciciciciciciamamcichchanananananchcicicicicichanananananananananananananananananananananananananananananananananananananananavdgamcZaxanananananananananananananbmanananananananananananananananaCananananananan
+ananananananaCanarasamamamcZbedSatananananananananananananananchchcicicicicicrcNcjciamagcicrchanananananchcidQcicicichanananananananananananananananananananananananananbmanananananananananeSanaqanavamamamaxanaqanananananananananananananananananananananananananananaCananananananan
+ananananananaCanaramamamamameIeJatanananananananananananananananchchclcicjcpciciciciadciaechchanananananchchchcicicpchananananananananbmanananananananananananananananananananananananananananavawaxavamamamaxavawaxananananananananananananananananananananananananananaCananananananan
+ananananananaCananakakakakakakajanananananananananananananananananchchchchchchchchchaYdUbechanaVananananananchchchchchanananananananananananananananaVanananananananananananananananananananananaAanavamamamaxanaAanananananananananananananananananananananananananananaCananananananan
+ananananananaCanbOalalalalalbCalananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananavamamamaxanananananananananananananananananananananananananananananaCananananananan
+ananananananaCananalalalalalalalanananananbmananananananananananananananananaqanbsanananbQanananananananananananananananananananananananananananananananananananananananananananananbmanananananananavamamamaxananananananananananananananananananananbmananananananananaCananananananan
+ananananananaCananalalalalalalalanananananananananananananananbmanananananavawaxanchbndVbrchchchchchchanananananananchchchchchchchanananananananananananananananananananananananananananananananananavamamamaxanananananananananananananananananananananananananananananaCananananananan
+ananananananaCananalalalalalalalananananananananananananananananananananananaAananchahdWaicichchcicichanananchchchchchcicicicicichchanchchchchanananananananananananananananananananananananananananavamamamaxanananananananananananananananananananananananananananananaCananananananan
+ananananananaCananalalalalalalalanananananananananananananananananananananananananchcicicicicicicicichchchchchcicicichchchchchchchchchchcichchchchchchchanananananananananbmanananananananananaVananavamamamaxanananananananananananananananananananananananananananananaCananananananan
+ananananananaCananapapapapapapapanananananananananananbsanananananananananananananchchcicicicicickcicicickcicicicicicicickcicichchchchcicicicicicicicichchchchchchanananananananananananananananananavamamamaxananananananananananananananananananananananananbsananananaCananananananan
+ananananananaCananauauauauauauauanananananananananananananananananananananananananchchciamamciciciciciciciciclcicicicicicicicicicicicicicicicicicicicicicicicicichanananananananananananananananananavamamamaxanananananananananananananananananananananananananananananaCananananananan
+ananananananaCananazazazazazazazanananananananananananananananananananananananananchcsciciciciciclcickcicicicicicicicicicicicicicicicicicicicicicicockcicicicicichchchchchchananananananananananaqanavamamamaxanaqanananananananbmanananananananananananananananananananaCananananananan
+ananananananaCananaUaUaUaUaUaUaUananananbmanananananananananananananananbmananananchchcicicicjciamcicicicicicicicicickcicrcicicicicjcicicjcicicicicicicicickciclcicicicicichchananananananananavawaxavamamamaxavawaxananananananananananananananananananananananananananaCananananananan
+ananananananaCananaOaOaOaOaOaOaOanananananananananananananananananananananananananchchcicicicicicicicicNcickamcicicicicicicicicocicicjcicicicicicicicicicicicicicickcicicicichchanbsananananananaAanavamamamaxanaAanananananananananananananananananananananananananananaCananananananan
+ananananananaCananaXaXaXaXaXaXaXanananananananaoaoaoaoaoaoaoaoananananananananananchchdYdmcicicicicocNcicaamcicicicicNcpcicicqciciclcicicicicjcicicicicicicicicicicicidTcicicichaqaqaqaqaqaqaqaqaqaqetamamamaxanananananananananananananananananananananananananananananaCananananananan
+ananananananaCanananananananananananaqanananareAcYcYcYcYeEbeeFatananananaoaoanananchchahdXcickcicicicicicicicicjciamciciamamciciciamcicicicickcicickcicicjciciciamamcicicrciciamamamamamamamamamamamamamamamaxananananananananananananaoaoaoaoaoaoaoaoaoaoaoaoaoananananaCananananananan
+ananananananaCananananananananananavawaxananarbfamagamamamcZbeatanananaragagatananchchcicicicicicicicicicicicNcicicickciciciamcicicpcicickciciciambSciciciamciciamamcicicidTamamamamamamagagamamamamamamamamaxanananananananananananareDaRaRaRaRaRaRaRaRaRaRaReHatanananaCananananananan
+ananananananaCananananananananbsananaAanananarbfamamagamamagblatanananarbRagatananchchcicicicicickcicpcicicicicicicicicicicrcuamciciamamamcicicpamamcicicjcidTcicicickciamamcpamamamamamagdKagamamamamcVamcWaxanananananananananananarewcicjciciciciciciciagamexatanananaCananananananan
+ananananananaCananananananananananaoaoaoananareKeGbwbwbwbwbweLatananananakajananananchchchcicickcBciclcicjcicicockcicicjcicicicjclciciciciciciaecicrcicicicicicicicicocicicicichbbbbbbbbbbbbbbbbbbbbbcbfamblaxanananananananananaoaodIewcpcicicicidTcicrciamamexatanananaCananananananan
+ananananananaCanananananananananaramamamatananakakakakakakakakananananbOapapananananchchchchciciciciciciciciciciciciciclciciciciciciciciciciciciciciciciciciciciclcicicicicichchanananananbmananaqanavbfamblaxanaqananananananeaaiaYcYeycidZcickelemenciciciciexatanananaCananananananan
+ananananananaCananananbmananananaragamamatancPalalalbtalalalaWanananananauauananananananchchchchcicicicickcicicicickcicicicicicicicicicicicicicicicicicicickcicicicicicicichchchanananananananavawaxavbfamblaxavawaxanananananarecdmambgcicicicieoasepciciciciexatanananaCananananananan
+ananananananaCananananananananananakakakanananalalalalalalalalananaqananazazanananananananchchchchchcicicicickcicicicicicicicickcicjcicjcicickcicicicjcicicicicichchchchchchchanananananananananaAanavbnbxbraxanaAananananananaraebnedezcicocrcieqerescicpckamexatanananaCananananananan
+ananananananaCananananananananancPalalalanananalalalalalalalalanavawaxanaUaUananananchchananbsananchchchchchcicqcicicickcicicicicicicjcicicicicicicicicicicichchchchchchchanananananananananananananavaeeeadaxanananananananananakakefewckclcicicicicicichchamexatanananaCananananananan
+ananananananaCananananananananananalalalanananalalalalalalalalananaAananaOaOanananchchcichchananeTananananchchchchcicicicickcicicicicicicicicicicicicicicichchananananananananananananananananananananbbbbbbanbmananananananananbCalegewcicidTebcragcichchchamexatbmananaCananananananan
+ananananananaCananananananananananalalalanananalalalalalalalalanananananaXaXanananchcicicichchchchchanananchchchchchcicicocicjciclcicicjcicocicicicickcichchchanananananananananananananananananananananaqanananananananananananalalegeMeBeBeBeBeBeBeBeBeCeBeBeNatanananaCananananananan
+ananananananaCananananananananananapapapanananalalalalalalalalananananananananbmanchcicicicicicicichanananananchchchchcicicicicicickcicicicicicjcicicichchchchanananananbmananananananananananananananavawaxananananananananananalalalakakakakakakakakakakakakakananananaCananananananan
+ananananananaCananananananananananauauauanananalalalalalalalalananananananananananchchcicicicicicichanananananchchchchchcicicicicicicicicicicicicichchchchchanananananananananananananbsananananananananaAanananananananananananapapapalalalalaWalalalbCalalalalananananaCananananananan
+ananananananaCananananananananananazazazananbmalalalalalalalalanbmanananananananananchchchcicicichchanananbmananchchchchchchchchcicicicicichchchchchananananananananananananananananananananananananananananananananananananananauauaualalalalalalalalalalalalalananananaCananananananan
+ananananananaCananananananananananaUaUaUanananalalalalalalalalanananananananananananananchchchchchananananananananananananchchchchchchchchchchananbsananananananananananananananananananananananananananananananananananananananazazazalalalalalalalalalalalalalananananaCananananananan
+ananananananaCananananananananbmanaOaOaOanananapapapapapapapapanananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananbsanananananaUaUaUapapapapapapapcIapapapapapananananaCananananananan
+ananananananaCananananananananananaXaXaXanananauauauauauauauauanananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananbmanananananananananananananananaOaOaOauauauauauauauauauauauauauananananaCananananananan
+ananananananaCananananananananananananananananazazazazazazazazananananananbmanananananananananananananananananananananananananananananananananananananananbmananananananananananananananananananananananananananananananananananaXaXaXazazazazazazazazazazazazazananananaCananananananan
+ananananananaCananananananananananananananananaUaUaUaUaUaUaUaUananananananananananananananananananananananananananananananananaVanananananananananananananananananananananananananananananananananananananananananananananananbsanananaUaUaUaUaUaUaUaUaUaUaUaUaUananananaCananananananan
+ananananananaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCeieieieieieieieiaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCeieieieieieieieieieieieieiaCaCaCaCaCananananananan
+anananananananananananananananananananananananaXaXaXaXaXaXaXaXananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananaXaXaXaXaXaXaXaXaXaXaXaXaXanaqanananananananananan
+anananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananbsavawaxananananananananan
+ananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananbmananananananananananaAanananananananananan
+anananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananan
+anananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananan
+anananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananan
+"}
diff --git a/maps/atoll/atoll_decals.dm b/maps/atoll/atoll_decals.dm
new file mode 100644
index 00000000000..625c7578143
--- /dev/null
+++ b/maps/atoll/atoll_decals.dm
@@ -0,0 +1,62 @@
+/obj/effect/floor_decal/atoll
+ name = "mural"
+ icon = 'maps/atoll/icons/decals/marble_decals.dmi'
+ icon_state = "mural"
+
+/obj/effect/floor_decal/atoll/damage
+ name = "damaged flooring"
+ icon_state = "damage"
+
+/obj/effect/floor_decal/atoll/bronze
+ name = "bronze filling"
+ icon_state = "bronze"
+
+/obj/effect/floor_decal/atoll/border
+ name = "marble border"
+ icon_state = "border"
+
+/obj/effect/floor_decal/atoll/border/invert
+ icon_state = "border_invert"
+
+/obj/effect/floor_decal/atoll/stairs
+ name = "marble stairs"
+ icon_state = "stairs"
+
+/obj/effect/floor_decal/atoll/stairs/Initialize()
+ dir = pick(cardinal)
+ . = ..()
+
+/obj/effect/floor_decal/atoll/moss
+ name = "moss"
+ icon_state = "moss"
+
+/obj/effect/floor_decal/atoll/moss/random/Initialize()
+ dir = pick(alldirs)
+ . = ..()
+
+/obj/effect/floor_decal/atoll/power
+ icon_state = "power"
+
+//Fake shadows and silhouettes
+/obj/effect/decal/shadow
+ icon = 'maps/atoll/icons/decals/wall_decals.dmi'
+ icon_state = "wall_shadow"
+ anchored = 1
+
+/obj/effect/decal/shadow/silhouette
+ icon_state = "silhouette"
+
+/obj/effect/decal/shadow/silhouette/pillar
+ icon_state = "silhouette_p"
+
+/obj/effect/decal/shadow/floor
+ icon_state = "floor_shadow"
+
+/obj/effect/decal/whitecaps
+ icon = 'maps/atoll/icons/turfs/water.dmi'
+ icon_state = "1"
+ anchored = 1
+
+/obj/effect/decal/whitecaps/Initialize()
+ icon_state = pick("1","2","3")
+ . = ..()
\ No newline at end of file
diff --git a/maps/atoll/atoll_objs.dm b/maps/atoll/atoll_objs.dm
new file mode 100644
index 00000000000..5b2a3e16524
--- /dev/null
+++ b/maps/atoll/atoll_objs.dm
@@ -0,0 +1,69 @@
+//THESE AREN'T OBJECTS THESE ARE AREAS WTF BURRITO!!!
+/area/gateway/atoll
+ name = "Away Site - Lake"
+ dynamic_lighting = 0
+
+/area/gateway/atoll/powered
+ requires_power = 0
+
+/obj/structure/railing/overhang
+ name = "bronze ledge"
+ desc = "An overhang made of a bronze-looking material. There's a lip on it to conveniently stub a toe into."
+ icon = 'maps/atoll/icons/objs/bronze_overhang.dmi'
+ icon_modifier = "bronze_"
+ icon_state = "bronze_railing0"
+
+//Escape most railing interactions besides tackling people over them
+/obj/structure/railing/overhang/attackby(obj/item/W)
+ if(!istype(W, /obj/item/weapon/grab))
+ return
+ return ..()
+
+/obj/structure/railing/overhang/waterless
+ icon_modifier = "wbronze_"
+ icon_state = "wbronze_railing0"
+ climbable = 0
+
+/obj/structure/bed/chair/sofa/bench/marble
+ name = "marble bench"
+ desc = "Somewhat of an ornate looking bench with faded blue etchings."
+ icon = 'maps/atoll/icons/objs/benches.dmi'
+ icon_state = "bench"
+
+/obj/structure/lightpost/atoll
+ name = "rusty light post"
+ desc = "Actually it's more like a rod with a trapped gas glowing inside some glass, but that's basically what a lightpost is."
+ icon = 'maps/atoll/icons/objs/lamp.dmi'
+ icon_state = "lamp"
+
+/obj/structure/flora/tree/atoll
+ name = "mossy tree"
+ desc = "A messy looking tree with a purple trunk. Vines seem to droop from it."
+ icon = 'maps/atoll/icons/objs/trees.dmi'
+ icon_state = "green"
+
+/obj/structure/flora/tree/atoll/huge
+ name = "massive mossy tree"
+ icon = 'maps/atoll/icons/objs/trees_xl.dmi'
+ icon_state = "tree"
+
+/obj/structure/flora/moss
+ name = "hanging moss"
+ desc = "Some unsightly moss. Clearly the groundskeepers here aren't doing their jobs."
+ icon = 'maps/atoll/icons/objs/moss.dmi'
+ icon_state = "moss"
+
+//TELEPORTER
+/obj/effect/step_trigger/teleporter/atoll
+ name = "strange field"
+ desc = "A prismatic field of... energy, probably. You should definitely rub your face in it."
+ icon = 'maps/atoll/icons/decals/marble_decals.dmi'
+ icon_state = "teleporter"
+ invisibility = 0
+
+//teleport_z must be populated but this is a gateway map
+//switching between tether or another map will change the z
+//so we just do this lmfao
+/obj/effect/step_trigger/teleporter/atoll/Initialize()
+ . = ..()
+ teleport_z = z
\ No newline at end of file
diff --git a/maps/atoll/atoll_turfs.dm b/maps/atoll/atoll_turfs.dm
new file mode 100644
index 00000000000..48a375671d6
--- /dev/null
+++ b/maps/atoll/atoll_turfs.dm
@@ -0,0 +1,55 @@
+//All turfs here meant to be "fullbright", no lighting.
+/turf/simulated/floor/atoll
+ name = "marble floor"
+ desc = "Scuff and weathered etchings make these floors out to be pretty old."
+ icon = 'maps/atoll/icons/turfs/marble.dmi'
+ icon_state = "1"
+ dynamic_lighting = 0
+
+//Pick random sprite states and generate damage decals randomly
+/turf/simulated/floor/atoll/Initialize()
+ . = ..()
+ icon_state = "[rand(1,5)]"
+ if(prob(5))
+ new /obj/effect/floor_decal/atoll/damage(src, pick(alldirs))
+
+//holycrapshitcode
+/turf/simulated/floor/atoll/vertical
+ name = "marble wall"
+ desc = "A sheer face wall, extending up to who-knows-how-high."
+ icon_state = "wall"
+ density = 1
+
+/turf/simulated/floor/atoll/vertical/Initialize()
+ . = ..()
+ icon_state = "wall"
+
+/turf/simulated/floor/water/atoll
+ name = "shallow lake"
+ desc = "This water looks pretty shallow and calm. You'd almost feel bad for hopping in and disturbing it's serene flatness."
+ icon = 'maps/atoll/icons/turfs/water.dmi'
+ icon_state = "shallow"
+ under_state = "shallow"
+ dynamic_lighting = 0
+ outdoors = OUTDOORS_NO
+
+//Cut out the caustics overlay and replace with nothing
+/turf/simulated/floor/water/atoll/update_icon()
+ ..()
+ cut_overlays()
+ var/image/water_sprite = image(icon = 'maps/atoll/icons/turfs/water.dmi', icon_state = "shallow", layer = 3.0)
+ add_overlay(water_sprite)
+
+//Spawn animated whitecaps around
+/turf/simulated/floor/water/atoll/Initialize()
+ . = ..()
+ if(prob(25))
+ new /obj/effect/decal/whitecaps(src)
+
+/turf/simulated/floor/outdoors/grass/heavy/atoll
+ dynamic_lighting = 0
+ outdoors = OUTDOORS_NO
+
+/turf/simulated/floor/beach/sand/outdoors/atoll
+ dynamic_lighting = 0
+ outdoors = OUTDOORS_NO
\ No newline at end of file
diff --git a/maps/atoll/icons/decals/marble_decals.dmi b/maps/atoll/icons/decals/marble_decals.dmi
new file mode 100644
index 00000000000..f7b7a071e9d
Binary files /dev/null and b/maps/atoll/icons/decals/marble_decals.dmi differ
diff --git a/maps/atoll/icons/decals/wall_decals.dmi b/maps/atoll/icons/decals/wall_decals.dmi
new file mode 100644
index 00000000000..e05099cf802
Binary files /dev/null and b/maps/atoll/icons/decals/wall_decals.dmi differ
diff --git a/maps/atoll/icons/objs/benches.dmi b/maps/atoll/icons/objs/benches.dmi
new file mode 100644
index 00000000000..5228bfa2618
Binary files /dev/null and b/maps/atoll/icons/objs/benches.dmi differ
diff --git a/maps/atoll/icons/objs/bronze_overhang.dmi b/maps/atoll/icons/objs/bronze_overhang.dmi
new file mode 100644
index 00000000000..730c09e4ed6
Binary files /dev/null and b/maps/atoll/icons/objs/bronze_overhang.dmi differ
diff --git a/maps/atoll/icons/objs/lamp.dmi b/maps/atoll/icons/objs/lamp.dmi
new file mode 100644
index 00000000000..204fb5d4327
Binary files /dev/null and b/maps/atoll/icons/objs/lamp.dmi differ
diff --git a/maps/atoll/icons/objs/moss.dmi b/maps/atoll/icons/objs/moss.dmi
new file mode 100644
index 00000000000..47984785596
Binary files /dev/null and b/maps/atoll/icons/objs/moss.dmi differ
diff --git a/maps/atoll/icons/objs/trees.dmi b/maps/atoll/icons/objs/trees.dmi
new file mode 100644
index 00000000000..e60d10d270e
Binary files /dev/null and b/maps/atoll/icons/objs/trees.dmi differ
diff --git a/maps/atoll/icons/objs/trees_xl.dmi b/maps/atoll/icons/objs/trees_xl.dmi
new file mode 100644
index 00000000000..d3f7c66e02a
Binary files /dev/null and b/maps/atoll/icons/objs/trees_xl.dmi differ
diff --git a/maps/atoll/icons/turfs/marble.dmi b/maps/atoll/icons/turfs/marble.dmi
new file mode 100644
index 00000000000..939da7768ba
Binary files /dev/null and b/maps/atoll/icons/turfs/marble.dmi differ
diff --git a/maps/atoll/icons/turfs/water.dmi b/maps/atoll/icons/turfs/water.dmi
new file mode 100644
index 00000000000..05b828bdbf7
Binary files /dev/null and b/maps/atoll/icons/turfs/water.dmi differ
diff --git a/maps/example/example.dm b/maps/example/example.dm
index d2639b8885f..e88eaaf7ba4 100644
--- a/maps/example/example.dm
+++ b/maps/example/example.dm
@@ -10,6 +10,8 @@
#define USING_MAP_DATUM /datum/map/example
+ #warn Please uncheck example before committing
+
#elif !defined(MAP_OVERRIDE)
#warn A map has already been included, ignoring Northern Star
diff --git a/maps/expedition_vr/aerostat/_aerostat.dm b/maps/expedition_vr/aerostat/_aerostat.dm
index 6917ca41c00..6bc8ab85221 100644
--- a/maps/expedition_vr/aerostat/_aerostat.dm
+++ b/maps/expedition_vr/aerostat/_aerostat.dm
@@ -36,6 +36,81 @@
/datum/random_map/noise/ore/virgo2/check_map_sanity()
return 1 //Totally random, but probably beneficial.
+/datum/random_map/noise/ore/virgo2/apply_to_turf(var/x,var/y) //Same as normal + Rutile
+
+ var/tx = ((origin_x-1)+x)*chunk_size
+ var/ty = ((origin_y-1)+y)*chunk_size
+
+ for(var/i=0,i[M] triggered the [bicon(src)] [src]")
+ to_chat(O, "[M] triggered the \icon[src][bicon(src)] [src]")
triggered = 1
call(src,triggerproc)(M)
diff --git a/maps/gateway_vr/eggnogtown.dmm b/maps/gateway_vr/eggnogtown.dmm
index 175934ba36b..02654d71f21 100644
--- a/maps/gateway_vr/eggnogtown.dmm
+++ b/maps/gateway_vr/eggnogtown.dmm
@@ -1000,16 +1000,16 @@
/turf/simulated/floor/tiled,
/area/gateway/eggnogtown/loniabode)
"gk" = (
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
/obj/item/weapon/reagent_containers/food/condiment/small/sugar,
/obj/item/weapon/reagent_containers/food/condiment/small/sugar,
/obj/item/weapon/reagent_containers/food/condiment/small/sugar,
@@ -1018,10 +1018,10 @@
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
/obj/structure/closet,
/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,
/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,
@@ -3649,7 +3649,7 @@
"Rd" = (
/obj/structure/table/marble,
/obj/item/weapon/material/kitchen/rollingpin,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
/obj/item/weapon/reagent_containers/food/condiment/yeast,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
/obj/item/weapon/reagent_containers/food/condiment/yeast,
diff --git a/maps/gateway_vr/isle_de_monch.dmm b/maps/gateway_vr/isle_de_monch.dmm
new file mode 100644
index 00000000000..501945adeba
--- /dev/null
+++ b/maps/gateway_vr/isle_de_monch.dmm
@@ -0,0 +1,317 @@
+"ah" = (/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"aj" = (/obj/structure/closet/crate/secure/loot,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"bh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/closet/walllocker_double/south{name = "Uniform Locker"},/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"bE" = (/obj/structure/table/steel,/obj/machinery/light,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3; pixel_y = -2},/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"bR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 8},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"cq" = (/turf/simulated/floor/water/beach{dir = 8},/area/tether_away/beach/coast)
+"cA" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"cK" = (/obj/structure/bed/chair/bay/comfy{dir = 4},/obj/item/trash/spacercake_wrap,/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"cR" = (/turf/simulated/floor/water/beach/corner{dir = 8},/area/tether_away/beach/coast)
+"dZ" = (/turf/simulated/floor/water/beach{dir = 5},/area/tether_away/beach/coast)
+"en" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"ey" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"eI" = (/obj/effect/overlay/palmtree_l,/turf/simulated/floor/beach/sand/desert/outdoors,/area/tether_away/beach)
+"eQ" = (/obj/machinery/door/airlock/hatch{req_one_access = list(160)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"fC" = (/turf/simulated/floor/water/beach{dir = 6},/area/tether_away/beach/coast)
+"fH" = (/turf/simulated/floor/water/deep/ocean,/area/tether_away/beach/water)
+"fO" = (/obj/effect/overlay/palmtree_r,/turf/simulated/floor/beach/sand/desert/outdoors,/area/tether_away/beach/resort)
+"gu" = (/obj/structure/hull_corner{dir = 1},/turf/simulated/floor/outdoors/grass/forest,/area/tether_away/beach/resort)
+"gC" = (/obj/tether_away_spawner/beach_outside,/turf/simulated/floor/beach/sand/desert/outdoors,/area/tether_away/beach)
+"gD" = (/obj/effect/overlay/palmtree_l,/turf/simulated/floor/beach/sand/desert/outdoors,/area/tether_away/beach/resort)
+"gV" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"hj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 8},/obj/item/trash/syndi_cakes,/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"hC" = (/obj/structure/girder,/turf/simulated/floor/outdoors/grass/forest,/area/tether_away/beach/resort)
+"im" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/item/weapon/melee/baton/cattleprod{desc = "Metal rod with wire attached to it."; name = "jury-rigged antenna"; pixel_x = 5; pixel_y = 4},/turf/simulated/floor/outdoors/grass,/area/tether_away/beach/resort)
+"iM" = (/obj/structure/barricade,/turf/simulated/floor/outdoors/newdirt,/area/tether_away/beach/resort)
+"jk" = (/turf/simulated/floor/water/beach{dir = 10},/area/tether_away/beach/coast)
+"jo" = (/obj/structure/salvageable/machine,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"ju" = (/obj/structure/girder,/turf/simulated/floor/outdoors/newdirt,/area/tether_away/beach/resort)
+"jy" = (/turf/simulated/floor/water/beach/corner,/area/tether_away/beach/coast)
+"jH" = (/obj/random/multiple/corp_crate,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"jJ" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/bed,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"jX" = (/obj/structure/salvageable/console{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"kj" = (/obj/machinery/atmospherics/binary/pump/fuel{dir = 1},/obj/random/trash_pile,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"kk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"ks" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/salvageable/console{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"kx" = (/obj/machinery/gateway{dir = 5},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/reinforced,/area/tether_away/beach/resort)
+"kJ" = (/turf/simulated/floor/water/beach,/area/tether_away/beach/coast)
+"kQ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/wall/shull,/area/tether_away/beach/resort)
+"lJ" = (/obj/structure/table/rack,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"mp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/outdoors/grass/forest,/area/tether_away/beach/resort)
+"mr" = (/obj/structure/barricade,/turf/simulated/mineral/floor/cave{name = "dirt"},/area/tether_away/beach/resort)
+"mt" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5},/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{dir = 4; id_tag = "salamander_docking_star"; name = "Starboard Airlock Control"; pixel_x = -22; req_one_access = list(160)},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"mA" = (/obj/structure/railing/grey{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"mV" = (/obj/machinery/atmospherics/unary/engine/bigger{dir = 4},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"nL" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/hatch{req_one_access = list(160)},/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"nV" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"oe" = (/obj/machinery/door/airlock/multi_tile/glass{dir = 2; req_one_access = list(160)},/obj/machinery/door/firedoor/multi_tile{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"oB" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/structure/catwalk,/obj/machinery/light/small{dir = 1},/obj/random/trash_pile,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"oI" = (/obj/machinery/gateway{dir = 9},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/reinforced,/area/tether_away/beach/resort)
+"oS" = (/turf/simulated/floor/water/ocean,/area/tether_away/beach/water)
+"oY" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"pB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"pJ" = (/obj/structure/salvageable/console{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"pX" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/fuel,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"qf" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/item/clothing/ears/earmuffs,/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"qQ" = (/obj/structure/hull_corner{dir = 4},/turf/simulated/floor/outdoors/newdirt,/area/tether_away/beach/resort)
+"rd" = (/obj/effect/map_helper/airlock/sensor/int_sensor,/obj/machinery/airlock_sensor{dir = 8; pixel_x = 21; req_one_access = list(160)},/obj/structure/handrail{dir = 8},/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"rN" = (/obj/machinery/door/airlock/glass_external/public,/obj/effect/map_helper/airlock/door/int_door,/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"rS" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/railing/grey{dir = 1},/obj/machinery/atmospherics/portables_connector/fuel{dir = 4},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"sk" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"so" = (/obj/item/broken_device/random,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"sF" = (/turf/simulated/floor/outdoors/grass/forest,/area/tether_away/beach/resort)
+"tG" = (/obj/structure/bed/chair/bay/chair{dir = 4},/obj/machinery/button/remote/blast_door{id = "trade"; name = "Shop Shutters"; pixel_y = -26; req_access = list(160)},/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"tO" = (/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"ue" = (/obj/effect/landmark/gateway_scatter,/turf/simulated/floor/beach/sand/desert/outdoors,/area/tether_away/beach/resort)
+"up" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable,/obj/structure/railing/grey{dir = 8},/obj/machinery/light,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"uL" = (/obj/random/trash_pile,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"vx" = (/obj/machinery/gateway{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/reinforced,/area/tether_away/beach/resort)
+"vy" = (/turf/simulated/floor/water/beach/corner{dir = 4},/area/tether_away/beach/coast)
+"vN" = (/obj/structure/table/standard,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"vT" = (/obj/machinery/atmospherics/pipe/simple/hidden/fuel{dir = 10},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"wo" = (/obj/structure/handrail{dir = 1},/obj/machinery/alarm/alarms_hidden{dir = 4; pixel_x = -26},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/light{dir = 8},/obj/structure/closet/autolok_wall{dir = 1; pixel_y = -32},/obj/structure/railing/grey{dir = 4},/obj/structure/bed/chair/bay/comfy{dir = 4},/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"wp" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"ww" = (/mob/living/simple_mob/vore/aggressive/deathclaw,/turf/simulated/mineral/floor/cave{name = "dirt"},/area/tether_away/beach/resort)
+"wY" = (/turf/simulated/floor/water/beach/corner{dir = 1},/area/tether_away/beach/coast)
+"xc" = (/obj/machinery/gateway{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/reinforced,/area/tether_away/beach/resort)
+"xe" = (/obj/structure/handrail,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"xf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"xM" = (/obj/item/stack/cable_coil,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/item/weapon/melee/baton/cattleprod{desc = "Metal rod with wire attached to it."; name = "jury-rigged antenna"; pixel_x = 5; pixel_y = 4},/obj/item/weapon/cell/emergency_light{pixel_x = -4},/obj/item/device/radio/off{channels = list("Talon" = 1); pixel_x = 4; pixel_y = -3},/turf/simulated/floor/outdoors/grass/forest,/area/tether_away/beach/resort)
+"xS" = (/obj/item/clothing/head/soft/black,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"xU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 8},/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"xZ" = (/turf/simulated/mineral/floor/cave{name = "dirt"},/area/tether_away/beach/resort)
+"yc" = (/obj/structure/barricade,/obj/structure/barricade/planks,/turf/simulated/mineral/floor/cave{name = "dirt"},/area/tether_away/beach/resort)
+"yd" = (/turf/simulated/wall/shull,/area/tether_away/beach/resort)
+"yn" = (/obj/structure/table/steel_reinforced,/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "trade"; name = "Shop Shutters"; opacity = 0},/obj/structure/railing/grey{dir = 1},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor/eastleft{layer = 2.9; open_layer = 2.9; req_access = list(); req_one_access = list(160)},/obj/random/mug,/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"yw" = (/obj/structure/closet/autolok_wall{pixel_y = 32},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"zX" = (/obj/structure/salvageable/computer,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"Af" = (/obj/machinery/door/airlock/glass_external/public,/obj/effect/map_helper/airlock/door/ext_door,/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"Aq" = (/obj/machinery/gateway{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/reinforced,/area/tether_away/beach/resort)
+"As" = (/obj/tether_away_spawner/beach_outside,/turf/simulated/floor/beach/sand/desert/outdoors,/area/tether_away/beach/resort)
+"AE" = (/obj/effect/map_helper/airlock/sensor/chamber_sensor,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/obj/machinery/airlock_sensor{dir = 4; pixel_x = -21; req_one_access = list(160)},/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"AI" = (/turf/simulated/floor/water/beach{dir = 1},/area/tether_away/beach/coast)
+"Cd" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/fuel{dir = 4},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"Cw" = (/obj/machinery/alarm/alarms_hidden{dir = 8; pixel_x = 26},/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"Cx" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 6},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"Dt" = (/obj/machinery/gateway{dir = 10},/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/reinforced,/area/tether_away/beach/resort)
+"DJ" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/effect/floor_decal/industrial/outline,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"DW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 1},/obj/effect/catwalk_plated,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"Em" = (/turf/simulated/floor/outdoors/newdirt,/area/tether_away/beach/resort)
+"ET" = (/turf/simulated/floor/outdoors/grass,/area/tether_away/beach/resort)
+"Fr" = (/obj/structure/barricade,/obj/structure/barricade/planks,/turf/simulated/floor/outdoors/newdirt,/area/tether_away/beach/resort)
+"Ft" = (/obj/machinery/atmospherics/pipe/manifold/hidden/fuel{dir = 1},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"FK" = (/obj/structure/hull_corner,/turf/simulated/floor/outdoors/newdirt,/area/tether_away/beach/resort)
+"FP" = (/obj/effect/decal/remains,/turf/simulated/floor/outdoors/grass/forest,/area/tether_away/beach/resort)
+"FX" = (/obj/structure/bed/chair/bay/comfy{dir = 4},/obj/effect/decal/remains,/obj/item/clothing/under/utility,/obj/item/clothing/shoes/boots/workboots,/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"Gv" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/railing/grey{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"Gy" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"GX" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"Hg" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"Ht" = (/obj/structure/handrail{dir = 1},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"Hx" = (/obj/effect/decal/remains,/turf/simulated/floor/outdoors/newdirt,/area/tether_away/beach/resort)
+"HH" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"HN" = (/obj/effect/overlay/coconut,/turf/simulated/floor/beach/sand/desert/outdoors,/area/tether_away/beach)
+"HY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"IZ" = (/obj/machinery/gateway,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/reinforced,/area/tether_away/beach/resort)
+"Jd" = (/obj/machinery/gateway{dir = 6},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/reinforced,/area/tether_away/beach/resort)
+"Jr" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"JB" = (/obj/machinery/gateway/centeraway{calibrated = 0},/turf/simulated/floor/reinforced,/area/tether_away/beach/resort)
+"Km" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/structure/railing/grey{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"KH" = (/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"Lt" = (/obj/effect/overmap/visitable/sector/virgo4,/turf/simulated/floor/water/deep/ocean,/area/tether_away/beach/water)
+"Mm" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/voidcraft{req_one_access = list(160)},/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"Mr" = (/obj/structure/bed/chair,/obj/effect/decal/remains,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"MI" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/effect/floor_decal/industrial/outline,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"MM" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/fuel{dir = 4},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"MO" = (/obj/structure/table/steel,/obj/machinery/light_switch{dir = 8; pixel_x = -22},/obj/structure/closet/walllocker_double/kitchen/south,/obj/item/device/multitool{pixel_x = 4; pixel_y = 2},/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"NH" = (/obj/machinery/light/small{dir = 1},/obj/random/trash_pile,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"NY" = (/obj/effect/overlay/palmtree_r,/turf/simulated/floor/beach/sand/desert/outdoors,/area/tether_away/beach)
+"Od" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"OJ" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"OR" = (/obj/structure/handrail{dir = 1},/obj/structure/closet/walllocker_double/south{name = "Storage Locker"},/obj/random/multiple/corp_crate,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"Pd" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"Po" = (/obj/structure/table/standard,/obj/item/weapon/pen,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"PI" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"Qo" = (/turf/simulated/floor/water/beach{dir = 4},/area/tether_away/beach/coast)
+"Qx" = (/obj/structure/bed/chair/bay/chair,/obj/structure/handrail,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/closet/autolok_wall{dir = 8; pixel_x = -32},/obj/effect/decal/remains,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"QK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 1},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"QZ" = (/obj/effect/overlay/coconut,/turf/simulated/floor/beach/sand/desert/outdoors,/area/tether_away/beach/resort)
+"Rs" = (/turf/simulated/wall/r_wall,/area/tether_away/beach/resort)
+"RJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/outdoors/grass/forest,/area/tether_away/beach/resort)
+"Sk" = (/obj/structure/handrail{dir = 1},/obj/random/trash_pile,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"Sp" = (/turf/simulated/floor/beach/sand/desert/outdoors,/area/tether_away/beach)
+"Ss" = (/obj/machinery/light_switch{dir = 4; pixel_x = 22},/obj/structure/bed,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"SC" = (/obj/structure/railing/grey{dir = 8},/obj/structure/handrail{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/closet/walllocker_double/south{name = "Voidsuit Locker"},/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"SG" = (/obj/effect/decal/remains,/turf/simulated/mineral/floor/cave{name = "dirt"},/area/tether_away/beach/resort)
+"Th" = (/obj/structure/table,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"TB" = (/obj/effect/landmark/gateway_scatter,/turf/simulated/floor/beach/sand/desert/outdoors,/area/tether_away/beach)
+"TQ" = (/obj/structure/salvageable/console,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"TR" = (/obj/machinery/power/port_gen/pacman,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/outdoors/grass/forest,/area/tether_away/beach/resort)
+"TW" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -28},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/structure/handrail,/obj/machinery/light{dir = 8},/obj/structure/closet/autolok_wall{pixel_y = 32},/obj/structure/railing/grey{dir = 4},/obj/item/weapon/gun/projectile/pistol,/obj/item/ammo_magazine/m9mm/compact,/obj/item/ammo_magazine/m9mm/compact,/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"Uk" = (/obj/structure/catwalk,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"Uu" = (/obj/machinery/light,/obj/structure/closet/walllocker_double/south{name = "Storage Locker"},/obj/structure/closet/crate/secure/loot,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"Uy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"UB" = (/turf/simulated/floor/beach/sand/desert/outdoors,/area/tether_away/beach/resort)
+"Ve" = (/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "trade"; name = "Shop Shutters"; opacity = 0},/obj/structure/table/steel_reinforced,/obj/machinery/door/window/brigdoor/eastright{layer = 2.9; open_layer = 2.9; req_access = list(); req_one_access = list(160)},/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"Vs" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/outdoors/grass/forest,/area/tether_away/beach/resort)
+"VD" = (/obj/structure/salvageable/server,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"Wb" = (/turf/simulated/floor/water/beach{dir = 9},/area/tether_away/beach/coast)
+"Wm" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"WJ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"WS" = (/obj/structure/barricade,/obj/structure/barricade/planks,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"Xf" = (/obj/machinery/door/airlock/glass_external/public,/obj/effect/map_helper/airlock/door/ext_door,/obj/effect/map_helper/airlock/sensor/ext_sensor,/obj/machinery/airlock_sensor/airlock_exterior/shuttle{pixel_x = 24; pixel_y = -11},/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"Xl" = (/obj/item/weapon/circuitboard/broken,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"Xo" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/structure/handrail{dir = 1},/obj/structure/closet/walllocker_double/south{name = "Storage Locker"},/obj/structure/closet/crate/secure/loot,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"Xw" = (/obj/item/weapon/circuitboard/broken,/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"Xx" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/outline/blue,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"XA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/outdoors/grass,/area/tether_away/beach/resort)
+"XJ" = (/obj/random/multiple/corp_crate,/turf/simulated/floor/outdoors/grass/forest,/area/tether_away/beach/resort)
+"XT" = (/turf/unsimulated/wall/planetary/normal/virgo4,/area/tether_away/beach/water)
+"Yj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8},/obj/effect/map_helper/airlock/atmos/chamber_pump,/obj/structure/closet/walllocker/emerglocker/east,/turf/simulated/floor/tiled/techmaint,/area/tether_away/beach/resort)
+"YD" = (/obj/structure/handrail{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/tether_away/beach/resort)
+"YN" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/tether_away/beach/resort)
+"ZX" = (/turf/simulated/mineral/ignore_mapgen,/area/tether_away/beach/resort)
+"ZZ" = (/obj/effect/decal/cleanable/blood,/turf/simulated/mineral/floor/cave{name = "dirt"},/area/tether_away/beach/resort)
+
+(1,1,1) = {"
+XTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSWbAIAIAIAIdZoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSWbvySpSpSpSpcRdZoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSWbAIvySpSpSpSpSpSpcRdZoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSWbvySpSpSpSpUBUBSpSpSpQooSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSWbAIvySpSpSpUBZXZXZXZXSpSpcRdZoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSWbvySpSpSpSpUBZXZXZXZXZXUBSpSpcRdZoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSWbvySpSpSpUBZXZXZXZXZXZXZXZXSpSpSpQooSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSWbAIAIAIAIdZoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSWbvySpSpSpUBZXZXZXZXZXZXZXZXZXUBSpSpQooSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSWbvySpSpSpSpcRdZoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoScqSpSpSpZXZXZXZXZXZXZXZXZXZXZXZXSpSpcRAIdZoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoScqSpSpSpSpSpSpcRAIdZoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoScqSpSpZXZXZXZXZXZXZXZXZXZXZXZXZXUBSpSpSpcRAIAIAIdZoSoSfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoScqSpTBUBUBSpSpSpSpcRAIAIAIAIAIdZoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSWbvySpSpZXZXZXZXZXZXZXZXZXZXZXZXZXZXSpSpSpSpSpSpSpcRdZoSoSfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSWbvySpSpUBUBUBSpSpSpSpSpSpSpSpSpcRAIAIAIAIAIdZoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSWbvySpSpZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXSpSpSpSpSpSpcRdZoSfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSoScqSpSpSpUBUBueUBUBSpSpSpSpSpSpSpSpSpSpSpSpSpcRAIAIAIAIAIAIAIdZoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoScqSpSpUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXUBUBUBSpSpSpQooSoSoSfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSoSoScqSpSpUBUBUBUBUBUBUBUBUBUBUBUBSpSpSpSpSpSpSpSpSpSpSpSpSpSpSpcRAIAIdZoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoScqSpSpUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXUBUBUBSpSpSpQooSoSoSoSfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSoSWbvySpSpUBUBUBUBETETETETETETETETUBUBUBUBUBUBSpSpSpSpSpSpSpSpSpSpSpSpcRdZoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoScqSpSpUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXUBSpSpSpjyfCoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSWbvySpSpSpUBETETETETETETETETETETETETETETETUBUBUBUBUBfOUBUBUBUBSpSpSpSpeIcRdZoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoScqSpSpUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXUBSpSpjyfCoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSWbvySpSpSpETETETETETETETETETETETETETETETETETETETUBUBUBUBUBUBUBgDQZUBUBSpSpSpcRdZoSoSoSoSoSfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoScqSpSpUBUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXSpSpcRdZoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSWbAIAIvySpSpSpETETETETETETETETETETETETETETETETETETETETETETUBUBUBUBUBUBUBUBUBUBSpSpSpQooSoSoSoSoSfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoScqSpSpUBUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXUBSpSpQooSoSoSoSoSoSoSoSoSoSoSoSoSoSoSWbvySpSpSpSpSpUBETETETETETETETETETETETETETETETETETETETETETETETUBUBUBUBUBUBUBUBUBUBgCSpcRdZoSoSoSoSfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSjkwYSpSpUBUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXUBSpSpQooSoSoSoSoSoSoSoSoSoSoSoSoSoSWbvySpSpSpSpUBUBETETETETETETETETETETETETETsFsFsFsFsFsFETETETETETUBUBUBUBUBUBUBUBfOUBSpSpSpQooSoSoSoSoSfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoScqSpSpUBUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXSpSpjyfCoSoSoSoSoSoSoSoSoSoSoSoSoSoScqSpSpSpUBUBUBETETETETETETETETsFsFsFsFEmydydydydydydydEmETETETETETUBUBUBUBUBUBUBQZUBUBSpSpQooSoSoSoSoSfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoScqSpSpSpUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXSpQooSoSoSoSoSoSoSoSoSoSoSoSoSoSWbvySpSpUBUBUBETETETETETETETsFsFsFsFEmEmEmKHKHxeajKHjHEmEmEmETETETETETETETETUBUBUBUBUBUBSpSpQooSoSoSoSoSfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSjkwYSpSpSpZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXSpQooSoSoSoSoSoSoSoSoSoSoSoSoSWbvySpSpUBUBUBETETETETETETETsFsFsFsFEmEmEmEmEmuLUkUkUkUkKHEmsFsFsFETETETETETETETUBUBUBUBUBSpSpQooSoSoSoSoSfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSjkwYSpSpSpZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXSpQooSoSoSoSoSoSoSoSoSoSoSWbAIvySpSpSpUBUBETETETETETETETsFsFsFsFsFsFsFsFsFEmydnLydydydEmsFsFsFydsFETETETETETETETUBUBUBUBSpSpQooSoSoSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSjkkJwYSpSpZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXSpSpQooSoSoSoSoSoSoSoSoSoSWbvySpSpSpSpUBUBETETETETETETFKydydydjuydsFsFsFhCsFsFsFsFsFsFsFFPsFydydydsFhCsFETETydydETETUBUBUBSpSpcRdZoSoSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSjkwYSpSpZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXSpjyfCoSoSoSoSoSoSoSoSoSoScqSpSpSpUBUBUBUBETETETETEmEmydydydNHKHYNXxsFsFsFsFKHsFKHEmEmEmsFsFsFXJsFsFsFsFEmKHSsydETETUBUBUBUBSpSpQooSoSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSoSjkwYSpSpUBZXZXZXZXZXZXZXZXZXZXZXSpSpjyfCoSoSoSoSoSoSoSoSoSoSWbvySpSpUBUBUBUBETETETEmEmEmEmKHoYMMFtvTJrwpsFEmEmEmEmEmEmEmjuEmEmEmEmsFEmEmEmEmEmUyCwydydenenWmUBUBSpSpQooSoSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSjkwYSpSpUBZXZXZXZXZXZXZXZXZXSpSpjyfCoSoSoSoSoSoSoSoSoSoSWbvySpSpSpUBUBUBUBETETETETEmEmEmmVGyCdKHkjOJOdajsFsFsFEmydydydydEmEmjusFsFKHsFEmEmKHHYydydTWjJTQPdWmUBSpSpcRdZoSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoScqSpSpSpUBUBZXZXZXZXZXZXZXSpSpQooSoSoSoSoSoSoSoSoSoSoScqSpSpSpUBUBUBUBETETETETETETsFEmjuydydrSpXsFsFsFsFhCsFsFKHsFsFsFsFsFsFydydsFEmEmbRKHpBtOxUhjkkFXpJHHUBUBSpSpQooSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSjkwYSpSpSpSpUBZXZXZXZXZXUBSpSpQooSoSoSoSoSoSoSoSoSoSWbvySpSpUBUBUBUBUBETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFEmEmEmEmKHKHKHsFsFsFEmEmEmEmEmxfDWbhoeqfKHcKpJHHUBUBSpSpQooSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSjkkJwYSpSpSpSpUBUBUBUBUBSpSpQooSoSoSoSoSoSoSoSoSoScqSpSpSpUBUBUBUBUBETETETETsFsFEmEmKHsFsFEmEmEmEmHxEmEmEmKHKHKHKHKHKHKHsFsFsFsFsFEmEmydMmydydwoxSjXPdgVUBUBSpSpQooSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSjkkJwYSpSpSpSpUBUBSpSpjyfCoSoSoSoSoSoSoSoSoSWbvySpSpUBUBUBUBUBETETETETETEmEmKHKHKHKHEmEmEmEmKHmAYDKHKHGvGXahKmeyyntOtOSCHtsFEmEmEmKHWJCwydydcAcAgVUBUBUBSpSpQooSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSjkkJwYSpSpSpSpSpSpQooSoSoSoSoSoSoSoSoSoScqSpSpSpUBUBUBUBUBETETETETsFsFEmmVKHuLEmEmEmKHKHKHupahydPIORSkUuXotGVetOrdydydQKKHEmEmEmKHsFETETETETETUBUBUBSpSpQooSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSWbAIAIAIAIAIAIdZoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSjkwYSpSpSpSpjyfCoSoSoSoSoSoSoSoSoSWbvySpSpUBfOUBUBUBUBETETETETsFEmEmEmHgjuEmEmEmEmEmKHydydydeQydydydydydydrNrNydQxWJKHKHsFsFsFsFETETETETUBUBUBUBSpSpQooSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSWbvySpSpHNSpSpSpcRAIAIdZoSoSoSoSoSoSoSoSoSoSoSoSoSoSjkkJkJkJkJfCoSoSoSoSoSoSoSoSoSWbvySpSpgCUBUBQZUBUBETETETETsFsFsFsFEmEmEmEmEmEmEmEmydydajywKHUkKHUkCxoBkQAEYjydMOksbEsFsFTRsFsFETETETETUBUBUBUBSpSpQooSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoScqSpSpNYSpSpSpSpSpSpSpcRdZoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSWbvySpSpSpUBUBUBUBUBUBETETETETsFsFsFsFsFsFsFsFsFEmEmEmEmydydskUkjHajjHDJMIydmtYjydydnVydsFsFRJsFsFETETETETUBUBUBUBSpSpQooSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSWbvySpSpUBUBUBUBSpSpSpSpSpcRdZoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSWbAIvySpeISpUBUBUBUBUBUBUBETETETETsFsFsFsFsFsFsFsFsFsFsFsFEmqQydydjujuydydHgydydAfXfydgusFsFsFsFRJsFsFETETETUBUBUBUBUBSpSpQooSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoScqSpSpUBUBUBfOUBUBUBUBSpSpSpcRdZoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSWbAIvySpSpSpSpUBUBUBUBUBUBUBUBETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFEmEmEmEmEmsFsFsFsFsFsFsFsFsFsFsFsFxMVsmpXAXAimETUBUBUBUBUBSpSpQooSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoScqSpeIUBAsUBUBUBUBUBUBUBSpSpSpQooSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSWbAIvySpSpSpSpUBUBUBUBgDUBUBUBUBETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETETUBUBUBSpSpSpQooSoSoSoSoSfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoScqSpSpUBUBUBUBUBUBUBUBUBfOSpSpcRdZoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSWbvySpSpSpSpSpUBAsUBUBUBUBUBUBUBETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETETUBUBUBSpSpjyfCoSoSoSoSoSfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSWbvySpSpUBUBUBUBZXZXUBUBUBUBUBSpSpcRdZoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSWbvySpSpSpeIUBUBUBUBUBUBUBUBUBUBETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETETETUBUBUBSpSpQooSoSoSoSoSoSfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoScqSpSpUBfOUBUBZXZXZXZXZXUBUBUBSpSpSpcRdZoSoSoSoSoSoSoSoSoSoSoSoSoSWbvySpSpSpQZUBUBUBgDUBUBUBUBUBUBETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETETUBUBUBSpSpSpQooSoSoSoSoSoSfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoScqSpSpQZUBUBZXZXZXZXZXZXUBUBUBUBSpSpSpQooSoSoSoSoSoSoSoSoSoSoSoSoScqSpSpSpUBUBUBUBUBUBUBUBUBUBETETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETETUBUBUBSpSpjyfCoSoSoSoSoSoSfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoScqSpSpUBUBZXZXZXZXZXZXZXZXUBUBgDUBSpSpcRdZoSoSoSoSoSoSoSoSoSoSoSWbvySpSpUBUBUBUBUBUBUBUBETETETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETETUBUBUBUBSpSpQooSoSoSoSoSoSoSfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSWbvySpSpUBETZXZXZXZXZXZXZXZXZXUBQZUBUBSpSpcRdZoSoSoSoSoSoSoSoSoSoScqSpSpSpUBUBUBUBUBUBUBETETETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETETUBUBUBUBSpSpQooSoSoSoSoSoSoSfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoScqSpSpSpUBETZXZXZXZXZXZXZXZXZXUBUBUBUBNYSpSpQooSoSoSoSoSoSoSoSoSoScqSpSpUBUBUBUBUBUBUBETETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETETETUBUBUBUBSpSpQooSoSoSoSoSoSoSfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSWbvySpSpUBETETZXZXZXZXZXZXZXZXZXZXUBUBUBUBSpSpcRdZoSoSoSoSoSoSoSoSoScqSpSpUBUBfOUBUBUBETETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETETETUBUBUBUBUBSpSpQooSoSoSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSWbvySpSpUBETETETZXZXZXZXZXZXZXZXZXZXUBUBUBUBUBSpSpcRdZoSoSoSoSoSoSoSWbvySpSpUBUBUBUBUBUBETETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETETETETUBUBUBUBSpSpSpQooSoSoSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSWbAIvySpSpSpUBETETETZXZXZXZXZXZXZXZXZXZXZXUBUBUBUBSpSpSpQooSoSoSoSoSoSoScqSpSpSpUBUBUBUBUBUBETETETETETsFsFsFsFsFsFsFsFsFsFETETETETsFsFETETETETETETETsFsFsFsFETETETETsFsFsFsFsFsFETETETETETETETETUBUBUBUBUBSpSpjyfCoSoSoSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSWbAIvySpSpSpSpUBETETETETZXZXZXZXZXZXZXZXZXZXZXUBUBgDUBUBSpSpQooSoSoSoSoSoSoScqSpSpUBUBUBUBUBUBUBETETETETETsFsFsFsFsFsFsFsFsFETETETETETETETETETETETETETETETETETETETETETETETsFsFETETETETETETETETETETETUBUBUBUBUBSpSpQooSoSoSoSoSoSoSfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSWbvySpSpSpSpUBUBETETETETETZXZXZXZXZXZXZXZXZXZXZXZXUBUBUBUBSpSpQooSoSoSoSoSoSWbvySpSpUBUBUBUBUBUBUBUBETETETETsFsFsFsFsFsFETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETUBUBUBUBUBSpSpSpQooSoSoSoSoSoSfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSWbvySpSpSpUBUBUBETETETETETZXZXZXZXZXZXZXZXZXZXZXZXZXUBUBUBUBSpSpcRdZoSoSoSoSoScqSpSpSpUBUBUBUBUBUBUBUBETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETUBUBUBUBUBSpSpSpjyfCoSoSoSoSoSoSfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSWbvySpSpSpUBETETETETETETETETZXZXZXZXZXZXZXZXZXZXZXZXZXZXUBUBUBUBSpSpcRAIdZoSWbAIvySpSpUBUBUBUBUBUBUBUBUBUBETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETUBUBUBUBUBSpSpjyfCoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHoSoSoScqSpSpSpUBETETETETETETETETZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXUBUBUBUBSpSpSpSpcRAIvySpSpSpSpUBUBUBUBUBUBUBUBUBUBUBETETETETETETETETETETETETETUBUBUBUBUBETETETETETETETETUBUBUBUBUBUBETETETETETETETETETETETETUBUBUBUBUBSpSpSpQooSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHoSoSoSWbvySpSpUBETETETETETETETETZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXUBUBUBSpSpSpSpSpSpSpSpSpUBUBUBUBUBUBUBUBUBUBUBUBUBETETETETETETETETETUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBETETETETETETETETETETUBUBUBSpSpSpSpjyfCoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHoSoSoSoScqSpSpUBETETETETETZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXUBUBUBUBSpSpSpSpSpUBUBUBUBUBUBUBUBUBUBUBueUBUBUBUBUBUBUBETETETUBUBUBUBUBUBUBUBUBUBUBSpSpSpSpSpSpSpSpSpUBUBUBUBUBUBUBUBETETETETETETETUBUBUBSpSpSpjykJfCoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHoSoSoSoScqSpSpETETETZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBSpSpSpSpSpSpSpSpSpSpSpSpSpNYUBQZUBfOUBUBUBUBETETETETUBUBUBSpSpSpjyfCoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHoSoSoSoScqSpSpETETZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXUBUBUBUBUBUBUBETETETETETUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBSpSpSpSpSpjykJkJkJkJkJkJkJwYSpSpSpSpUBUBUBUBUBUBUBUBUBUBUBUBSpSpSpjyfCoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHoSoSoSWbvySpSpETETZXZXZXZXZXRsRsRsRsRsRsRsRsRsRsZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXUBUBUBETETETETETETETETETUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBSpSpSpSpSpSpjykJkJfCoSoSoSoSoSoSoSjkkJwYSpSpSpSpUBUBUBfOUBUBUBUBUBUBSpSpjyfCoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHoSoSoSoScqSpSpUBETETZXZXZXZXZXRsoIxckxKHRszXVDjoRsZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXUBETETETETETETETETETETETETETUBUBUBUBUBUBUBUBUBUBUBUBSpSpSpSpSpSpjykJfCoSoSoSoSoSoSoSoSoSoSoSoSjkkJwYSpSpUBUBUBUBUBUBueUBUBUBSpSpQooSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHoSoSoSWbvySpSpUBETZXZXZXZXZXZXRsAqJBvxXwKHahahKHRsZXSGxZZXZXZXZXZXZXZXZXZXZXZXZXZXZXETETETETsFsFsFsFETETETETETETETETUBUBUBUBUBUBUBUBSpSpSpSpjykJkJkJfCoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSjkwYSpSpUBUBUBUBUBUBUBUBUBSpSpQooSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHoSoSoScqSpSpSpUBZXZXZXZXZXZXZXRsDtIZJdahKHKHsoKHWSxZxZxZxZxZZXZXZXZXZXZXZXZXZXZXZXZXETETsFsFsFsFsFsFsFETETETETETETETETUBUBUBUBUBUBSpSpSpjykJfCoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoScqSpNYSpUBueUBUBUBUBgDSpSpSpQooSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHoSoSoSoScqSpSpUBZXZXZXZXZXZXZXZXRsahKHKHKHKHKHKHKHWSxZxZxZSGxZZXZXZXZXZXZXZXZXZXZXZXETETETsFsFsFsFsFsFsFETETETETETETETETETUBUBUBUBSpSpSpjyfCoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSjkwYSpSpSpUBUBUBUBUBUBSpSpjyfCoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHoSoSoSoScqSpSpUBZXZXZXZXZXZXZXZXRsRsRsRsRsKHXlMrThRsZXZXZXxZxZxZZXZXZXZXZXZXZXZXZXETETETETsFsFsFsFsFsFsFsFETETETETETETETETUBUBUBUBSpSpjyfCoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSjkwYSpSpSpQZfOUBUBSpSpSpQooSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHoSoSoSoScqSpSpZXZXZXZXZXZXZXZXZXZXZXZXZXRslJvNvNPoRsZXZXZXZXycycZXZXZXZXZXZXZXZXZXETETETETETsFsFsFsFsFsFsFsFsFETETETETETETUBUBUBUBSpSpQooSoSoSoSoSoSoSoSoSoSoSoSoSWbAIdZoSoSoSoSoSoSoSoSoSoSoSjkwYSpSpSpSpSpSpSpSpjyfCoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHoSoSoSoScqSpSpZXZXZXZXZXZXZXZXZXZXZXZXZXRsRsRsRsRsRsZXZXZXZXxZxZZXZXZXZXZXZXZXZXZXZXETETETETsFsFsFsFsFsFsFsFsFsFETETETETETUBUBUBUBSpSpcRdZoSoSoSoSoSoSoSoSoSWbAIAIvySpcRdZoSoSoSoSoSWbAIAIdZoSoSjkwYSpSpSpSpSpSpjyfCoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHoSoSoSoScqSpSpZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXxZxZxZxZZXZXZXZXZXZXZXZXZXETETETETsFsFsFsFsFsFsFsFsFsFsFETETETETETUBUBUBSpSpSpcRAIAIdZoSoSoSoSoSWbvySpSpSpSpSpcRdZoSoSoSWbvySpSpQooSoSoSjkkJkJkJkJkJkJfCoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHoSoSoSoScqSpSpZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXxZxZZZxZxZxZxZZXZXZXZXZXZXZXZXETETETETsFsFsFsFsFsFsFsFsFsFETETETETETETUBUBUBSpSpSpSpSpcRAIAIAIAIAIvySpSpSpSpSpSpSpQooSoSWbvyHNeIjyfCoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHoSoSoSoScqSpSpUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXxZxZxZxZxZxZxZxZxZxZZXZXZXZXZXZXZXZXETETETsFsFsFsFsFsFsFsFsFsFsFETETETETETUBUBUBUBSpSpSpSpSpSpSpSpSpSpNYSpSpSpSpSpNYSpcRdZoSjkwYSpSpQooSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHoSoSoSoScqNYSpUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXxZxZxZSGxZxZxZxZxZxZSGZXZXZXZXZXZXZXZXETETETETsFsFsFsFsFsFsFsFsFsFsFETETETETETUBUBUBUBUBUBfOSpgCSpSpSpSpSpSpSpeISpSpgCSpSpQooSoSjkkJkJfCoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHoSoSoSoScqSpSpUBUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXxZZZxZxZxZxZxZxZZZxZxZxZZXZXZXZXZXZXZXETETETETsFsFsFsFsFsFsFsFsFsFsFsFETETETETUBUBUBUBUBSpSpSpSpSpSpSpSpSpgCSpSpSpSpSpSpSpcRdZoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHoSoSoSoScqSpSpUBUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXxZxZxZxZxZxZwwxZxZxZxZxZxZZXZXZXZXZXZXETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETUBUBSpSpSpSpSpSpSpSpNYHNSpSpSpSpSpNYSpSpSpSpcRdZoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHoSoSoSoScqSpSpUBUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXxZxZxZxZxZxZxZxZZZxZxZZZxZZXZXZXZXZXETETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETUBSpSpSpjykJwYSpSpjykJwYSpSpSpSpSpHNSpSpNYjykJfCoSoSoSfHfHfHoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHoSoSoSoScqSpSpgDUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXxZxZxZZZZZxZxZxZxZxZxZxZZXZXZXZXZXETETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETUBSpSpjyfCoSjkkJkJfCoSjkkJwYSpSpSpSpSpjykJfCoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHoSoSoSoScqSpSpUBUBUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXxZxZxZZZxZxZxZxZxZxZZXZXZXZXZXETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETUBUBSpSpQooSoSoSoSoSoSoSoSoSjkkJkJkJkJkJfCoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHoSoSoSoScqSpSpUBUBUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXxZxZxZxZSGxZxZxZxZZXZXZXZXZXETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETUBUBUBSpSpQooSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHoSoSoSoSjkwYSpSpUBUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXxZxZxZxZxZxZiMZXZXETETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETUBUBUBSpSpQooSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHoSoSoSoScqSpSpUBUBUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXxZxZmrFrFrEmETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETUBUBSpSpSpQooSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHoSoSoSoScqSpNYQZUBUBUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXiMFrEmEmETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETUBUBSpSpjyfCoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHoSoSoSoScqSpSpSpUBUBUBUBUBZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXEmETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETUBSpSpSpQooSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHoSoSoSjkwYSpSpSpUBUBUBUBUBETETETETZXZXZXZXZXZXZXZXZXZXZXZXZXETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETUBUBSpSpjyfCoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHoSoSoSoSjkwYSpSpUBUBUBUBUBETETETETETZXZXZXZXZXZXZXZXZXZXZXETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETUBUBSpSpQooSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHoSoSoSoScqSpeISpUBfOUBUBUBUBETETETETETETZXZXZXZXZXZXETETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETUBUBSpSpcRdZoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSjkwYSpSpSpSpHNSpUBUBETETETETETETETETETETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETUBUBSpSpSpQooSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSjkwYSpSpSpSpSpSpSpUBUBETETETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETUBUBUBSpSpcRdZoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSjkkJkJkJkJwYSpSpSpSpUBETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETUBUBUBSpSpcRAIdZoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSjkkJwYSpSpUBETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETUBUBUBSpSpSpSpQooSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSjkwYSpSpUBETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETETUBUBUBSpSpSpcRdZoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoScqSpSpUBETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETsFsFsFsFsFsFETETETETETETUBUBUBUBSpSpSpcRdZoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoScqSpSpUBETETETETETsFsFsFsFsFsFsFsFsFsFsFsFsFETETETETETETETETETETETETETETETETETETETETETETETETUBUBUBUBUBUBSpSpSpcRdZoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSjkwYSpSpUBETETETETsFsFsFsFsFsFsFsFsFsFsFETETETETETETETETETETETETETETETETETETETETETETETETETETUBUBUBUBUBUBUBSpSpSpQooSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoScqSpSpUBETETETETsFsFsFsFsFsFsFsFsFsFsFETETETETETUBUBETETETETETETETETETETETETETETETETETETUBUBUBUBUBgDUBUBUBSpSpcRdZoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoScqSpSpUBETETETETETETsFsFsFsFsFsFsFETETETETETUBUBUBUBUBUBUBUBETETETETETETETETETETETETUBUBUBUBUBUBUBUBUBUBUBUBSpSpQooSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoScqSpSpUBETETETETETETsFsFsFsFsFsFETETETETETUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBSpSpQooSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoScqSpSpUBETETETETETETsFsFsFsFsFETETETETETUBUBgDUBSpSpSpSpUBUBfOUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBAsUBSpSpQooSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSjkwYSpSpETETETETETETETsFsFsFETETETETETETUBQZSpSpSpSpSpSpSpUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBfOUBUBUBUBUBUBSpSpQooSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoScqSpSpETETETETETETETETETETETETETETETUBUBSpSpSpjykJwYSpSpUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBfOUBUBSpSpQooSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoScqSpSpUBETETETETETETETETETETETETETETUBUBSpSpjyfCoScqSpSpSpSpSpUBUBUBUBUBUBUBUBAsUBUBUBfOUBUBUBUBUBUBUBUBSpSpSpQooSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoScqSpSpUBUBETETETETETETETETETETETETETUBSpSpSpQooSoSjkwYSpSpSpSpSpSpSpHNgDUBUBUBUBUBUBUBUBUBUBUBUBUBUBUBSpSpSpjyfCoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoScqSpSpUBUBUBETETETETETETETETETETETUBfOSpSpjyfCoSoSoSjkkJkJwYSpSpSpSpSpSpSpUBUBUBUBUBUBUBUBUBUBgDQZUBUBSpSpjyfCoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoScqSpSpUBUBUBETETETETETETETETETETUBUBSpSpSpQooSoSoSoSoSoSoSjkkJkJkJkJwYSpSpSpSpUBUBUBUBAsUBUBUBUBUBUBUBSpSpQooSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSjkwYSpSpUBUBETETETETETETETETUBUBUBUBSpSpjyfCoSoSoSoSoSoSoSoSoSoSoSoSjkkJwYSpSpSpUBUBUBUBUBUBUBUBUBUBUBSpSpQooSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoScqSpSpUBUBETETETETETETETUBUBUBUBUBSpSpQooSoSoSoSoSoSoSoSoSoSoSoSoSoSoSjkwYSpSpUBUBUBUBUBUBUBUBAsUBfOSpSpQooSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoScqSpSpUBUBUBETETETUBUBUBUBUBUBfOSpSpSpQooSoSoSoSoSWbAIAIAIAIAIdZoSoSoSoSjkwYSpSpUBUBUBUBfOUBUBUBUBUBSpSpQooSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoScqSpSpUBUBUBUBUBUBUBUBUBfOUBUBSpSpSpjyfCoSoSoSWbAIvySpSpSpSpSpcRdZoSoSoSoScqSpSpSpSpSpSpQZUBUBUBUBSpSpSpQooSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoScqSpSpUBUBUBUBUBUBUBUBUBQZUBUBSpSpjyfCoSoSoSWbvySpSpSpSpSpSpSpSpcRdZoSoSoSjkwYSpSpSpSpSpSpSpSpSpSpSpSpjyfCoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoScqSpNYSpUBUBUBUBUBUBUBUBUBgDSpSpjyfCoSoSoSoScqSpSpHNeISpSpSpNYSpSpcRdZoSoSoSjkkJkJkJwYSpSpSpSpSpSpjykJfCoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSjkwYSpSpUBUBUBUBgDUBUBUBUBSpSpSpQooSoSoSoSoSjkwYSpSpSpSpNYTBSpHNSpSpcRAIdZoSoSoSoSoSjkkJkJkJkJkJkJfCoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSjkwYSpSpUBUBUBUBUBUBUBSpSpSpjyfCoSoSoSoSoSoSjkkJwYSpSpSpSpSpSpSpSpSpSpcRAIdZoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoScqSpSpNYUBUBUBUBUBSpSpSpjyfCoSoSoSoSoSoSoSoSoSjkkJkJkJwYSpSpTBSpeISpSpSpcRdZoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSjkwYHNSpSpSpSpSpSpSpSpjyfCoSoSoSoSoSoSoSoSoSoSoSoSoSoSjkkJwYSpSpSpSpSpSpjyfCoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoScqSpSpSpSpSpSpSpjykJfCoSoSoSoSoSfHfHfHoSoSoSoSoSoSoSoSoSjkwYSpSpSpSpSpQooSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSjkwYSpSpSpSpSpSpQooSoSoSoSoSfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSjkkJkJkJkJkJfCoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSjkkJkJkJkJkJkJfCoSoSoSfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSoSfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTLtfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHfHXT
+XTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXT
+"}
diff --git a/maps/gateway_vr/lucky_7.dm b/maps/gateway_vr/lucky_7.dm
new file mode 100644
index 00000000000..66a6dd94861
--- /dev/null
+++ b/maps/gateway_vr/lucky_7.dm
@@ -0,0 +1,140 @@
+/obj/effect/overmap/visitable/sector/common_gateway/lucky7
+ initial_generic_waypoints = list("tether_excursion_lucky7")
+ name = "Lucky 7 Casino and Restaraunt"
+ scanner_desc = @{"[i]Registration[/i]: _ERROR
+[i]Class[/i]: Installation
+[i]Transponder[/i]: Weak Signal
+[b]Notice[/b]: Current estimated wait time: 999999"}
+ unknown_state = "station"
+ known = FALSE
+ icon_state = "lucky7_g"
+
+// -- Areas -- //
+
+/area/awaymission/lucky7
+ icon_state = "away1"
+
+/area/awaymission/lucky7/casinofloor
+ name = "\improper Gateway - Casino Floor"
+ icon_state = "casino"
+
+/area/awaymission/lucky7/arcade
+ name = "\improper Gateway - Arcade"
+ icon_state = "arcade"
+
+/area/awaymission/lucky7/gateway
+ name = "\improper Gateway - Gateway"
+ icon_state = "away"
+
+/area/awaymission/lucky7/privategameroom
+ name = "\improper Gateway - Private Game Room One"
+ icon_state = "arcade2"
+
+/area/awaymission/lucky7/privategameroom/two
+ name = "\improper Gateway - Private Game Room Two"
+
+/area/awaymission/lucky7/privategameroom/three
+ name = "\improper Gateway - Private Game Room Three"
+
+/area/awaymission/lucky7/privateroom
+ name = "\improper Gateway - Private Room One"
+ icon_state = "crew_quarters"
+
+/area/awaymission/lucky7/privateroom/two
+ name = "\improper Gateway - Private Room Two"
+ icon_state = "crew_quarters"
+
+/area/awaymission/lucky7/privateroom/three
+ name = "\improper Gateway - Private Room Three"
+ icon_state = "crew_quarters"
+
+/area/awaymission/lucky7/privateroom/four
+ name = "\improper Gateway - Private Room Four"
+ icon_state = "crew_quarters"
+
+/area/awaymission/lucky7/privateroom/five
+ name = "\improper Gateway - Private Room Five"
+ icon_state = "crew_quarters"
+
+/area/awaymission/lucky7/privateroom/vip
+ name = "\improper Gateway - VIP Room"
+ icon_state = "crew_quarters"
+
+/area/awaymission/lucky7/security
+ name = "\improper Gateway - Security"
+ icon_state = "security"
+
+/area/awaymission/lucky7/kitchen
+ name = "\improper Gateway - Kitchen"
+ icon_state = "kitchen"
+
+/area/awaymission/lucky7/bar
+ name = "\improper Gateway - Bar"
+ icon_state = "bar"
+
+/area/awaymission/lucky7/barbackroom
+ name = "\improper Gateway - Bar Backroom"
+ icon_state = "bar"
+
+/area/awaymission/lucky7/breakroom
+ name = "\improper Gateway - Breakroom"
+ icon_state = "green"
+
+/area/awaymission/lucky7/loungeprivateroom
+ name = "\improper Gateway - Private Lounge"
+ icon_state = "lounge"
+
+/area/awaymission/lucky7/lounge
+ name = "\improper Gateway - Lounge"
+ icon_state = "lounge"
+
+/area/awaymission/lucky7/laundry
+ name = "\improper Gateway - Laundry Room"
+ icon_state = "laundry"
+
+/area/awaymission/lucky7/medical
+ name = "\improper Gateway - Clinic"
+ icon_state = "medbay"
+
+/area/awaymission/lucky7/workshop
+ name = "\improper Gateway - Workshop"
+ icon_state = "yellow"
+
+/area/awaymission/lucky7/maint1
+ name = "\improper Gateway - Maint 1"
+ icon_state = "maint"
+
+/area/awaymission/lucky7/maint2
+ name = "\improper Gateway - Maint 2"
+ icon_state = "maint"
+
+/area/awaymission/lucky7/hall1
+ name = "\improper Gateway - Hall 1"
+ icon_state = "hallway"
+
+/area/awaymission/lucky7/hall2
+ name = "\improper Gateway - Hall 2"
+ icon_state = "hallway"
+
+/area/awaymission/lucky7/hotelhall
+ name = "\improper Gateway - Hotel Hall"
+ icon_state = "hallway"
+
+/area/awaymission/lucky7/trash
+ name = "\improper Gateway - Trash Collection"
+ icon_state = "disposal"
+
+/area/awaymission/lucky7/dock1
+ name = "\improper Gateway - Dock 1"
+ icon_state = "entry_1"
+
+/area/awaymission/lucky7/dock2
+ name = "\improper Gateway - Dock 2"
+ icon_state = "entry_2"
+
+/area/awaymission/lucky7/entry
+ name = "\improper Gateway - Entry Hall"
+ icon_state = "entry_3"
+
+/obj/machinery/telecomms/allinone/casino
+ freq_listening = list(PUB_FREQ, CSN_FREQ)
\ No newline at end of file
diff --git a/maps/gateway_vr/lucky_7.dmm b/maps/gateway_vr/lucky_7.dmm
new file mode 100644
index 00000000000..a74d18d72d2
--- /dev/null
+++ b/maps/gateway_vr/lucky_7.dmm
@@ -0,0 +1,1299 @@
+"aa" = (/obj/effect/floor_decal/techfloor/orange{dir = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/gateway)
+"ab" = (/obj/machinery/atm{pixel_y = 30},/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"ac" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/embedded_controller/radio/airlock/docking_port{dir = 8; frequency = 1380; id_tag = "l7_dock_d1a3"; pixel_x = 28},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1)
+"ad" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light_switch{dir = 4; pixel_x = -26; pixel_y = -7},/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"ae" = (/obj/structure/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"af" = (/obj/structure/table/woodentable,/obj/machinery/light,/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"ag" = (/obj/structure/table/borosilicate,/turf/simulated/floor/tiled/eris/steel/bar_dance,/area/awaymission/lucky7/loungeprivateroom)
+"ah" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"ai" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/four)
+"aj" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"ak" = (/obj/structure/cable/green{icon_state = "2-4"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"al" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/machinery/firealarm{pixel_y = 26},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"am" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"an" = (/obj/structure/casino_table/craps{dir = 1},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"ao" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/catwalk,/obj/structure/cable/green{icon_state = "1-4"},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"ap" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/table/marble,/obj/item/weapon/material/knife/butch,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"aq" = (/obj/effect/floor_decal/spline/plain{dir = 10},/obj/structure/flora/pottedplant/stoutbush,/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/casinofloor)
+"ar" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lightgrey/border,/obj/structure/cable/green,/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; pixel_y = -27; start_charge = 0},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"as" = (/obj/effect/floor_decal/borderfloorwhite{dir = 6},/obj/effect/floor_decal/corner/paleblue/border{dir = 6},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"at" = (/obj/machinery/alarm{dir = 8; pixel_x = 27},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"au" = (/obj/structure/casino_table/craps{dir = 1},/obj/item/weapon/dice{pixel_x = 4; pixel_y = 6},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"av" = (/obj/structure/table/borosilicate,/obj/structure/dancepole,/turf/simulated/floor/tiled/eris/steel/bar_dance,/area/awaymission/lucky7/loungeprivateroom)
+"aw" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/red/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 4},/obj/machinery/light{dir = 1},/obj/machinery/firealarm{pixel_y = 26},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"ax" = (/obj/structure/bed/chair/office/light{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"ay" = (/obj/structure/table/borosilicate,/turf/simulated/floor/tiled/eris/steel/bar_light,/area/awaymission/lucky7/loungeprivateroom)
+"az" = (/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"aA" = (/obj/structure/table/bench/padded,/obj/effect/floor_decal/spline/plain,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/eris/steel/bar_dance,/area/awaymission/lucky7/loungeprivateroom)
+"aB" = (/obj/structure/table/bench/padded,/obj/effect/floor_decal/spline/plain,/turf/simulated/floor/tiled/eris/steel/bar_dance,/area/awaymission/lucky7/loungeprivateroom)
+"aC" = (/obj/item/weapon/stool/padded{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"aD" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower,/obj/effect/floor_decal/steeldecal/steel_decals5{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 10},/turf/simulated/floor/tiled,/area/awaymission/lucky7/privateroom/four)
+"aE" = (/obj/structure/casino_table/blackjack_m{dir = 4},/obj/machinery/light/floortube{dir = 8},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"aF" = (/obj/structure/bed/chair/office/light,/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"aG" = (/obj/structure/table/bench/padded,/obj/effect/floor_decal/spline/plain,/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/eris/steel/bar_dance,/area/awaymission/lucky7/loungeprivateroom)
+"aH" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock1)
+"aI" = (/obj/structure/casino_table/blackjack_r{dir = 8},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"aJ" = (/obj/structure/cable/green{icon_state = "0-4"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 8; pixel_x = -27; start_charge = 0},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/loungeprivateroom)
+"aK" = (/obj/structure/cable/green{icon_state = "1-2"},/obj/structure/cable/green{icon_state = "1-4"},/obj/structure/disposalpipe/junction{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"aL" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10},/obj/structure/cable/green{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"aM" = (/obj/structure/casino_table/blackjack_r,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"aN" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 6},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"aO" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/grey/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"aP" = (/obj/effect/floor_decal/rust,/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/maint1)
+"aQ" = (/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/loungeprivateroom)
+"aR" = (/obj/machinery/door/airlock/maintenance/common,/obj/structure/disposalpipe/segment,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"aS" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 1; pixel_y = 27; start_charge = 0},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"aT" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 1; pixel_y = 27; start_charge = 0},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"aU" = (/obj/structure/casino_table/blackjack_r{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"aV" = (/obj/machinery/light/floortube{dir = 8},/obj/structure/casino_table/roulette_chart,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"aW" = (/obj/structure/cable/green,/obj/machinery/power/fractal_reactor/fluff/smes,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"aX" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/yellow/border{dir = 10},/obj/machinery/telecomms/allinone/casino,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"aY" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/storage/box/roulette_balls_normal,/obj/item/weapon/storage/box/roulette_balls_fancy,/obj/item/weapon/storage/box/roulette_balls_cheat,/obj/structure/table/rack/shelf,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom)
+"ba" = (/obj/structure/table/borosilicate,/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"bc" = (/obj/structure/cable/green{icon_state = "1-4"},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/gateway)
+"be" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/floor_decal/industrial/warning/cee{dir = 8},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1)
+"bf" = (/obj/machinery/gateway{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/techfloor/grid,/area/awaymission/lucky7/gateway)
+"bh" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/lucky7/dock2)
+"bj" = (/obj/structure/window/basic,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"bn" = (/obj/structure/undies_wardrobe,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/four)
+"bo" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/loungeprivateroom)
+"bp" = (/turf/simulated/wall,/area/awaymission/lucky7/privategameroom)
+"bt" = (/obj/machinery/light/small,/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "l7_dock_d2a1"; pixel_y = 28},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "dock_d1a1_sensor"; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "dock_d1a1_pump"},/obj/effect/map_helper/airlock/atmos/chamber_pump,/obj/effect/map_helper/airlock/sensor/chamber_sensor,/obj/effect/floor_decal/industrial/warning/cee{dir = 8},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2)
+"bu" = (/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/loungeprivateroom)
+"bw" = (/obj/effect/floor_decal/spline/plain{dir = 4},/obj/machinery/light{dir = 4},/turf/simulated/floor/water/pool,/area/awaymission/lucky7/privateroom/vip)
+"bx" = (/obj/structure/sink/kitchen{name = "sink"; pixel_y = 20},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled,/area/awaymission/lucky7/maint1)
+"by" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/table/marble,/obj/machinery/microwave,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"bB" = (/obj/random/soap,/obj/structure/table/standard,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/three)
+"bC" = (/obj/structure/table/woodentable,/obj/item/weapon/material/kitchen/utensil/fork/plastic,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"bD" = (/obj/effect/floor_decal/rust,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/catwalk,/obj/structure/cable/green{icon_state = "4-8"},/obj/item/device/radio{pixel_x = 10; pixel_y = 8},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"bE" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"bH" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"},/turf/simulated/floor/plating,/area/awaymission/lucky7/dock2)
+"bK" = (/obj/structure/bed/chair/bay/comfy/blue,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/loungeprivateroom)
+"bL" = (/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/lightgrey/bordercorner,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"bN" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/loungeprivateroom)
+"bP" = (/obj/structure/casino_table/blackjack_m{dir = 4},/obj/item/weapon/deck/cards/casino,/obj/machinery/light/floortube{dir = 8},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"bX" = (/obj/structure/toilet{pixel_y = 10},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/breakroom)
+"cb" = (/obj/machinery/gateway{dir = 9},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/tiled/techfloor/grid,/area/awaymission/lucky7/gateway)
+"cc" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/four)
+"cm" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"cn" = (/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/two)
+"cp" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/awaymission/lucky7/loungeprivateroom)
+"cq" = (/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/loungeprivateroom)
+"cr" = (/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom)
+"cz" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor/tiled/freezer/cold,/area/awaymission/lucky7/kitchen)
+"cD" = (/obj/structure/table/darkglass,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/loungeprivateroom)
+"cF" = (/obj/structure/bed/chair/bay/comfy/blue{dir = 1},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/loungeprivateroom)
+"cG" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"cH" = (/obj/structure/lattice,/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
+"cI" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"cJ" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/loungeprivateroom)
+"cK" = (/obj/effect/floor_decal/techfloor/orange{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/gateway)
+"cL" = (/obj/structure/bed/chair/bay/comfy/blue{dir = 1},/obj/machinery/alarm{dir = 8; pixel_x = 27},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/loungeprivateroom)
+"cM" = (/obj/machinery/firealarm{dir = 4; pixel_x = 27},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/loungeprivateroom)
+"cN" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/machinery/firealarm{pixel_y = 26},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"cO" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/grey/border{dir = 10},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"cR" = (/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"cT" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/loungeprivateroom)
+"cV" = (/obj/effect/shuttle_landmark{base_area = /area/space; base_turf = /turf/space; docking_controller = "l7_dock_d2a2"; landmark_tag = "l7_dockarm_d2a2"; name = "Dock D2A2"},/turf/space,/area/space)
+"cY" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/loungeprivateroom)
+"da" = (/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 7; pixel_y = 3},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -7; pixel_y = 3},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_y = 3},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -7; pixel_y = -3},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_y = -3},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 7; pixel_y = -3},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"dd" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/machinery/alarm{pixel_y = 27},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"df" = (/obj/structure/table/woodentable,/obj/machinery/light{dir = 4},/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/hotelhall)
+"dg" = (/obj/effect/floor_decal/corner/lightgrey{dir = 10},/obj/effect/floor_decal/corner/lightgrey{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/structure/closet/emcloset,/turf/simulated/floor/tiled/monotile,/area/awaymission/lucky7/entry)
+"dn" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/lightgrey/border{dir = 10},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"do" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 1; pixel_y = 27; start_charge = 0},/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"dr" = (/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/maint1)
+"du" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"dw" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"dy" = (/obj/structure/table/woodentable,/obj/random/drinkbottle,/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/three)
+"dz" = (/obj/machinery/computer/arcade/orion_trail,/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"dC" = (/obj/structure/bed/chair/sofa/left/brown{dir = 1},/turf/simulated/floor/carpet,/area/awaymission/lucky7/hall1)
+"dE" = (/obj/machinery/computer/arcade/battle,/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"dF" = (/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/space_heater,/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/maint1)
+"dG" = (/obj/structure/window/basic,/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/disposalpipe/junction{dir = 8},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"dP" = (/obj/structure/flora/pottedplant/largebush,/obj/machinery/firealarm{pixel_y = 26},/obj/machinery/alarm{dir = 8; pixel_x = 27},/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"dS" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/morgue{dir = 2; name = "Private Room"; req_access = null},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/loungeprivateroom)
+"dW" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"dX" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/lightgrey/border{dir = 6},/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/corner/lightgrey/bordercorner2,/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"dZ" = (/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/five)
+"ea" = (/obj/machinery/bodyscanner{dir = 4},/obj/effect/floor_decal/corner_steel_grid{dir = 10},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"ec" = (/obj/machinery/door/morgue{dir = 2; name = "Private Room"; req_access = null},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/loungeprivateroom)
+"ed" = (/obj/structure/toilet{pixel_y = 10},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/three)
+"ei" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock2)
+"ej" = (/obj/structure/kitchenspike,/turf/simulated/floor/tiled/freezer/cold,/area/awaymission/lucky7/kitchen)
+"em" = (/obj/machinery/door/airlock/maintenance/common,/obj/effect/floor_decal/rust,/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"en" = (/obj/structure/table/glass,/obj/machinery/door/window/eastleft{req_access = null},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"eo" = (/obj/structure/bed/chair/sofa/left/brown,/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"ep" = (/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"er" = (/obj/effect/floor_decal/rust,/obj/structure/table/steel,/obj/item/weapon/weldingtool{pixel_x = 1; pixel_y = -4},/obj/item/clothing/glasses/welding{pixel_x = -3; pixel_y = 4},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"et" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 5},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"ev" = (/obj/structure/mirror{pixel_y = 38},/obj/structure/sink{pixel_y = 20},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/two)
+"ey" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/bluedouble,/obj/machinery/alarm{dir = 8; pixel_x = 27},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/five)
+"ez" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock1)
+"eC" = (/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/water/pool,/area/awaymission/lucky7/privateroom/vip)
+"eF" = (/obj/item/weapon/stool/baystool/padded{dir = 1},/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"eG" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"eH" = (/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"eL" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/handcuffs{pixel_y = -5},/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs{pixel_y = 5},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"eS" = (/obj/effect/floor_decal/techfloor/orange{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/gateway)
+"eU" = (/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"eV" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/machinery/firealarm{dir = 8; pixel_x = -27},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"eW" = (/obj/machinery/door/airlock{id_tag = "L7 Room 3"; name = "Private Room 3"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/three)
+"eY" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/table/marble,/obj/item/weapon/material/kitchen/rollingpin,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"fb" = (/obj/random/trash_pile,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"fc" = (/obj/structure/bed/chair/wood{dir = 8},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"ff" = (/obj/structure/closet/secure_closet/personal/cabinet,/obj/item/weapon/storage/pill_bottle/happy,/obj/item/clothing/under/bathrobe,/obj/item/clothing/under/bathrobe,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"fi" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"fl" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"fu" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lightgrey/border,/obj/machinery/door/firedoor/glass/hidden/steel{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"fv" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"fx" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 10},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"fy" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/firealarm{pixel_y = 26},/obj/machinery/alarm{dir = 8; pixel_x = 27},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"fA" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/machinery/alarm{dir = 8; pixel_x = 27},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"fD" = (/obj/machinery/door/airlock{id_tag = "L7 Room 1"; name = "Private Room 1"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom)
+"fH" = (/turf/simulated/wall,/area/awaymission/lucky7/privategameroom/three)
+"fM" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"fN" = (/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"fO" = (/obj/structure/flora/pottedplant/tall,/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/hotelhall)
+"fQ" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower,/obj/effect/floor_decal/steeldecal/steel_decals5{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 10},/turf/simulated/floor/tiled,/area/awaymission/lucky7/privateroom)
+"fS" = (/obj/structure/table/woodentable,/obj/machinery/light{dir = 8},/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/hall2)
+"fT" = (/obj/structure/undies_wardrobe,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom)
+"fU" = (/obj/structure/table/woodentable,/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/casinofloor)
+"fX" = (/obj/effect/floor_decal/corner/lightgrey{dir = 10},/obj/effect/floor_decal/corner/lightgrey{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/structure/closet/firecloset,/turf/simulated/floor/tiled/monotile,/area/awaymission/lucky7/entry)
+"fZ" = (/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/medical)
+"ga" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/structure/bed/chair/office,/obj/machinery/firealarm{pixel_y = 26},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"ge" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall2)
+"gf" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/lucky7/dock1)
+"gh" = (/obj/structure/undies_wardrobe,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/three)
+"gi" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor/eastleft{dir = 2},/obj/item/weapon/pen,/obj/machinery/door/firedoor/glass,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "casino_check"; opacity = 0},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"gr" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/lightgrey/border{dir = 9},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"gx" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/machinery/alarm{dir = 4; pixel_x = -27},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"gB" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"gD" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock2)
+"gG" = (/turf/simulated/wall,/area/awaymission/lucky7/hall2)
+"gH" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock2)
+"gL" = (/turf/simulated/wall,/area/awaymission/lucky7/dock1)
+"gN" = (/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"gS" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"gU" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"gV" = (/obj/machinery/door/airlock{name = "Arcade"},/obj/structure/cable/green{icon_state = "4-8"},/obj/item/tape/engineering,/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"gZ" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"hc" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_y = 27},/turf/simulated/floor/tiled,/area/awaymission/lucky7/maint1)
+"hh" = (/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"hi" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{icon_state = "1-8"},/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"hm" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"hn" = (/obj/effect/floor_decal/spline/plain{dir = 6},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"ho" = (/obj/structure/table/gamblingtable,/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"hq" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock1)
+"hu" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"hw" = (/obj/machinery/clawmachine,/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"hy" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower,/obj/effect/floor_decal/steeldecal/steel_decals5{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 10},/turf/simulated/floor/tiled,/area/awaymission/lucky7/privateroom/five)
+"hD" = (/obj/item/weapon/stool/padded{dir = 8},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"hF" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/lightgrey/border{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"hI" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "dock_d1l_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "dock_d1l_sensor"; pixel_x = 30; pixel_y = 8},/obj/effect/map_helper/airlock/atmos/chamber_pump,/obj/effect/map_helper/airlock/sensor/chamber_sensor,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2)
+"hM" = (/obj/structure/cable/green{icon_state = "4-8"},/obj/machinery/door/airlock/glass,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/awaymission/lucky7/gateway)
+"hN" = (/obj/structure/table/marble,/obj/effect/floor_decal/spline/plain{dir = 8},/obj/machinery/chemical_dispenser/premium/full{dir = 4},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"hO" = (/turf/simulated/wall,/area/awaymission/lucky7/privateroom)
+"hS" = (/obj/structure/table/marble,/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"hU" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom)
+"ia" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 4; pixel_x = 27; start_charge = 0},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom)
+"ib" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/wood,/area/awaymission/lucky7/barbackroom)
+"id" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
+"il" = (/obj/machinery/firealarm{dir = 8; pixel_x = -26},/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"ip" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -26},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"ir" = (/obj/structure/table/gamblingtable,/obj/item/weapon/storage/pill_bottle/dice_nerd,/obj/machinery/light,/turf/simulated/floor/carpet/retro,/area/awaymission/lucky7/arcade)
+"it" = (/obj/structure/cable/green{icon_state = "0-4"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 1; pixel_y = 27; start_charge = 0},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"iu" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock2)
+"iv" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/spline/plain{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"iy" = (/obj/structure/table/bench/padded,/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"iA" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/machinery/door/firedoor/glass/hidden/steel{dir = 2},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"iB" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"iE" = (/obj/effect/floor_decal/techfloor/orange{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/gateway)
+"iG" = (/obj/random/trash_pile,/obj/random/trash,/obj/random/trash,/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"iJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"iM" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/red/border{dir = 9},/obj/effect/floor_decal/borderfloor/corner2{dir = 1},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 1},/obj/machinery/vending/wallmed1/public{pixel_y = 28},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"iV" = (/obj/structure/flora/pottedplant/tropical,/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"iZ" = (/obj/effect/floor_decal/techfloor/orange,/obj/machinery/light,/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/gateway)
+"jb" = (/obj/structure/flora/pottedplant/tall,/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/hall2)
+"jc" = (/obj/effect/floor_decal/rust,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"jd" = (/obj/structure/cable/green{icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"je" = (/obj/structure/closet,/obj/random/junk,/obj/random/junk,/obj/random/maintenance,/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"jl" = (/obj/structure/closet,/obj/random/junk,/obj/random/junk,/obj/random/maintenance,/obj/random/maintenance,/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"jo" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock2)
+"jp" = (/obj/machinery/door/airlock/maintenance/common,/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"jq" = (/obj/effect/floor_decal/spline/plain,/turf/simulated/floor/water/pool,/area/awaymission/lucky7/privateroom/vip)
+"jr" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable/green{icon_state = "4-8"},/obj/machinery/door/firedoor/glass/hidden/steel,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"jt" = (/obj/machinery/door/airlock/glass_external,/obj/effect/map_helper/airlock/door/ext_door,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2)
+"jv" = (/obj/machinery/light,/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/medical)
+"jx" = (/obj/structure/table/woodentable,/obj/item/trash/asian_bowl,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"jA" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"jB" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 10},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"jC" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom)
+"jH" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 6},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 4; pixel_x = 27; start_charge = 0},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"jI" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "dock_d1l"; name = "interior access button"; pixel_x = -28; pixel_y = -26; req_access = list(13)},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"jJ" = (/obj/machinery/light{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 27},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"jK" = (/obj/structure/table/steel,/obj/random/junk,/obj/random/maintenance,/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"jM" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom)
+"jN" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock2)
+"jP" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"jQ" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 4; pixel_x = 27; start_charge = 0},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/three)
+"jS" = (/turf/simulated/floor/water/pool,/area/awaymission/lucky7/privateroom/vip)
+"jV" = (/obj/structure/cable/green{icon_state = "0-2"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 1; pixel_y = 27; start_charge = 0},/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"jW" = (/obj/structure/mirror{pixel_y = 38},/obj/structure/sink{pixel_y = 20},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/three)
+"ka" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/effect/floor_decal/rust,/obj/machinery/atmospherics/pipe/tank/air/full{dir = 4},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"kb" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"kc" = (/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/lightgrey/bordercorner,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"kd" = (/turf/simulated/floor/carpet/purcarpet,/area/awaymission/lucky7/privateroom/vip)
+"ke" = (/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"kh" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock2)
+"km" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"kp" = (/obj/structure/cable/green{icon_state = "2-4"},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"ks" = (/obj/machinery/firealarm{dir = 8; pixel_x = -26},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"kv" = (/obj/structure/closet/secure_closet/medical3,/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/paleblue/border{dir = 10},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"kx" = (/obj/structure/bed/chair/wood,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"ky" = (/obj/machinery/firealarm{dir = 4; pixel_x = 27},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/five)
+"kz" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lightgrey/border,/obj/effect/floor_decal/corner/lightgrey/border,/obj/machinery/light,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"kD" = (/turf/simulated/wall,/area/awaymission/lucky7/security)
+"kF" = (/obj/structure/table/woodentable,/obj/machinery/light{dir = 4},/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/hall2)
+"kJ" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"kL" = (/obj/structure/table/marble,/obj/effect/floor_decal/spline/plain{dir = 1},/obj/machinery/alarm{pixel_y = 28},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"kN" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/catwalk,/obj/structure/cable/green{icon_state = "2-4"},/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"kO" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"kP" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/wood,/area/awaymission/lucky7/barbackroom)
+"kQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"kV" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"lh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/catwalk,/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"li" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/catwalk,/obj/structure/cable/green{icon_state = "1-8"},/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"lm" = (/obj/machinery/alarm{dir = 4; pixel_x = -27},/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"ln" = (/obj/item/weapon/stool/padded{dir = 1},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"lp" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal/deliveryChute,/obj/effect/floor_decal/industrial/warning/full,/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"lq" = (/obj/machinery/door/airlock/glass,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"lu" = (/turf/simulated/wall,/area/awaymission/lucky7/maint1)
+"lw" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"lx" = (/obj/random/drinkbottle,/obj/structure/table/fancyblack,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"lB" = (/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/lightgrey/border{dir = 5},/obj/structure/flora/pottedplant/stoutbush,/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"lE" = (/obj/structure/lattice,/obj/structure/lattice,/turf/space,/area/space)
+"lF" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/floor_decal/industrial/warning/cee{dir = 4},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2)
+"lI" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"lL" = (/obj/structure/table/gamblingtable,/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"lS" = (/turf/simulated/floor/tiled/freezer/cold,/area/awaymission/lucky7/kitchen)
+"lZ" = (/obj/structure/bed/chair/comfy/beige,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"mb" = (/obj/machinery/door/airlock/glass_external,/obj/effect/map_helper/airlock/door/int_door,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2)
+"md" = (/obj/machinery/door/airlock/maintenance/common,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"mh" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/atmospherics/pipe/tank/air/full{dir = 4},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"mo" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"mp" = (/obj/structure/cable/green{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"mq" = (/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 6},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 6},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"mt" = (/obj/structure/closet/crate/trashcart,/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"mu" = (/obj/structure/closet/secure_closet/freezer/meat,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/freezer/cold,/area/awaymission/lucky7/kitchen)
+"mv" = (/obj/structure/table/standard,/obj/item/weapon/towel/random,/obj/item/weapon/towel/random,/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"mw" = (/obj/structure/flora/pottedplant/unusual,/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"mC" = (/obj/structure/table/woodentable,/obj/random/drinkbottle,/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/five)
+"mD" = (/obj/effect/floor_decal/techfloor/orange{dir = 9},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/gateway)
+"mE" = (/obj/machinery/door/airlock/glass_external,/obj/effect/map_helper/airlock/door/ext_door,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1)
+"mH" = (/obj/machinery/gateway,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/techfloor/grid,/area/awaymission/lucky7/gateway)
+"mI" = (/obj/random/trash,/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"mJ" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/janitor,/turf/simulated/floor/tiled,/area/awaymission/lucky7/maint1)
+"mK" = (/turf/simulated/wall,/area/awaymission/lucky7/casinofloor)
+"mL" = (/obj/machinery/door/airlock/glass,/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"mN" = (/obj/structure/disposalpipe/segment,/obj/structure/catwalk,/obj/structure/cable/green{dir = 1; icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"mO" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{icon_state = "2-4"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"mQ" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock1)
+"mR" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/structure/bed/chair/office,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"mS" = (/obj/machinery/door/airlock/glass,/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"mT" = (/obj/random/trash,/obj/random/trash,/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"mV" = (/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"mW" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"mX" = (/obj/structure/bed/chair/wood{dir = 1},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"na" = (/obj/structure/casino_table/blackjack_m{dir = 8},/obj/machinery/light/floortube{dir = 4},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"ng" = (/obj/item/weapon/stool/padded{dir = 4},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"nh" = (/obj/structure/window/basic,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"nj" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"nl" = (/obj/machinery/door/airlock/glass,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"nn" = (/obj/machinery/vending/deluxe_boozeomat/open,/obj/effect/floor_decal/spline/plain,/turf/simulated/floor/tiled/techmaint/airless,/area/awaymission/lucky7/barbackroom)
+"np" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"nq" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"ns" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"nv" = (/obj/structure/table/gamblingtable,/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"nw" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1)
+"nz" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/three)
+"nA" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"nC" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"nD" = (/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/paleblue/border{dir = 10},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 9},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 9},/obj/machinery/alarm{dir = 4; pixel_x = -27},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"nE" = (/obj/machinery/door/airlock{id_tag = "L7 PGR 1"; name = "Private Game Room 1"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"nK" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/glass_external,/obj/effect/map_helper/airlock/door/int_door,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2)
+"nM" = (/obj/machinery/door/airlock{id_tag = "L7 PGR 2"; name = "Private Game Room 2"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"nN" = (/obj/machinery/gibber,/turf/simulated/floor/tiled/freezer/cold,/area/awaymission/lucky7/kitchen)
+"nR" = (/obj/structure/table/bench/padded,/obj/machinery/light,/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"nS" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 6},/obj/structure/cable/green,/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 4; pixel_x = 27; start_charge = 0},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"nX" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"nY" = (/obj/structure/cable/green{icon_state = "1-4"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/two)
+"ob" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"og" = (/turf/simulated/floor/wood,/area/awaymission/lucky7/barbackroom)
+"oh" = (/obj/machinery/door/airlock{id_tag = "L7 PGR 3"; name = "Private Game Room 3"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"ol" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"op" = (/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/cable/green{icon_state = "2-8"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"oq" = (/obj/effect/floor_decal/techfloor/orange{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/gateway)
+"or" = (/obj/structure/bed/chair/sofa/left/purp,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"os" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"oA" = (/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"oD" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"oE" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/maint1)
+"oF" = (/obj/random/trash_pile,/obj/random/trash,/obj/random/junk,/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"oG" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"oH" = (/obj/structure/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair_preview"},/obj/machinery/light,/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"oO" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/two)
+"oP" = (/obj/machinery/alarm{dir = 4; pixel_x = -27},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"oS" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/three)
+"oT" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/obj/item/device/radio,/obj/item/ammo_casing/spent{pixel_x = -12; pixel_y = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"oV" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/maint1)
+"oY" = (/obj/structure/table/woodentable,/obj/machinery/light{dir = 8},/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/hotelhall)
+"pb" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/awaymission/lucky7/arcade)
+"pe" = (/obj/machinery/door/airlock/glass_security{req_one_access = null},/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"pk" = (/obj/structure/table/glass,/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 8},/obj/random/medical,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"pn" = (/obj/item/weapon/flame/candle/candelabra/everburn,/obj/structure/table/fancyblack,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"pr" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "dock_d1a1"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/obj/machinery/door/airlock/glass_external,/obj/effect/map_helper/airlock/door/ext_door,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2)
+"ps" = (/obj/structure/closet/walllocker_double{dir = 8; name = "Game Cabinet"; pixel_x = -28},/obj/item/weapon/book/manual/wizzoffguide,/obj/item/weapon/deck/wizoff,/obj/item/weapon/storage/pill_bottle/dice_nerd,/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/deck/cards/casino,/obj/item/weapon/deck/cah,/obj/item/weapon/deck/cah/black,/obj/item/weapon/storage/dicecup,/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"py" = (/obj/machinery/button/remote/airlock{id = "L7 PGR 1"; name = "Door Lock"; pixel_x = 24; pixel_y = 26},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"pA" = (/obj/structure/bed/chair/sofa/bench/left{dir = 1},/obj/effect/floor_decal/borderfloorblack{dir = 10},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/gateway)
+"pB" = (/obj/machinery/button/remote/airlock{id = "L7 PGR 2"; name = "Door Lock"; pixel_x = 24; pixel_y = 26},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"pE" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/three)
+"pH" = (/obj/machinery/button/remote/blast_door{dir = 8; id = "L7 Cell 1"; name = "Cell 1 Door"; pixel_x = 28; req_access = null},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"pL" = (/obj/machinery/door/airlock/maintenance/common,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/maint1)
+"pM" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"pN" = (/obj/structure/bed/chair/comfy/beige,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"pO" = (/obj/structure/table/rack/shelf/steel,/obj/random/maintenance,/obj/random/maintenance,/obj/random/maintenance,/obj/random/tool,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"pP" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"pV" = (/turf/simulated/wall,/area/awaymission/lucky7/loungeprivateroom)
+"pX" = (/obj/structure/table/reinforced,/obj/item/ammo_magazine/m45{pixel_x = -5; pixel_y = -3},/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45{pixel_x = 5; pixel_y = 3},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"qd" = (/obj/machinery/button/remote/airlock{id = "L7 PGR 3"; name = "Door Lock"; pixel_x = 24; pixel_y = 26},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"qg" = (/obj/effect/floor_decal/corner/lightgrey{dir = 10},/obj/effect/floor_decal/corner/lightgrey{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/machinery/vending/sol,/turf/simulated/floor/tiled/monotile,/area/awaymission/lucky7/hotelhall)
+"qk" = (/obj/structure/railing{dir = 1},/obj/random/trash_pile,/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"qs" = (/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"qt" = (/obj/effect/shuttle_landmark{base_area = /area/space; base_turf = /turf/space; docking_controller = null; landmark_tag = "l7_dock_near"; name = "Near Dock"},/turf/space,/area/space)
+"qv" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/captaindouble,/obj/structure/curtain/open/bed,/turf/simulated/floor/carpet/purcarpet,/area/awaymission/lucky7/privateroom/vip)
+"qw" = (/obj/effect/floor_decal/rust,/obj/structure/table/rack/shelf/steel,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"qz" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/machinery/door/firedoor/glass/hidden/steel{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"qA" = (/obj/structure/table/woodentable,/obj/random/drinkbottle,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"qB" = (/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/floor/water/pool,/area/awaymission/lucky7/privateroom/vip)
+"qF" = (/turf/simulated/wall,/area/awaymission/lucky7/breakroom)
+"qG" = (/obj/structure/table/woodentable,/obj/random/drinkbottle,/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"qH" = (/obj/structure/cable/green{icon_state = "2-8"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"qL" = (/obj/structure/table/borosilicate,/obj/structure/dancepole,/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"qM" = (/obj/structure/bed/chair/wood{dir = 1},/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"qN" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/awaymission/lucky7/lounge)
+"qS" = (/obj/structure/casino_table/blackjack_l{dir = 4},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"qU" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lightgrey/border,/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 9},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"qW" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/grey/border{dir = 1},/obj/machinery/vending/wallmed1/public{pixel_y = 28},/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"qY" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"rb" = (/obj/machinery/gateway{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/techfloor/grid,/area/awaymission/lucky7/gateway)
+"re" = (/obj/structure/bed/chair/comfy/beige,/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"rf" = (/obj/effect/floor_decal/techfloor/orange{dir = 10},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/gateway)
+"rg" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/grey/border{dir = 6},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"rj" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/awaymission/lucky7/casinofloor)
+"rm" = (/turf/space,/area/space)
+"rn" = (/obj/structure/table/woodentable,/obj/effect/floor_decal/spline/plain{dir = 8},/obj/item/clothing/mask/smokable/pipe,/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/casinofloor)
+"rp" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"ru" = (/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/breakroom)
+"rw" = (/obj/machinery/door/airlock/glass,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/awaymission/lucky7/bar)
+"rx" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"rA" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance/common{name = "Trash Collection"},/obj/structure/catwalk,/obj/structure/cable/green{dir = 1; icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"rB" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"rK" = (/obj/structure/bed/chair/sofa/bench/right{dir = 1},/obj/effect/floor_decal/borderfloorblack{dir = 6},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/gateway)
+"rM" = (/obj/effect/decal/cleanable/blood/oil,/obj/structure/railing,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"rN" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/bar_guide,/turf/simulated/floor/wood,/area/awaymission/lucky7/barbackroom)
+"rT" = (/obj/structure/casino_table/blackjack_r{dir = 4},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"rU" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"rZ" = (/obj/effect/floor_decal/spline/plain{dir = 1},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"sc" = (/obj/structure/table/gamblingtable,/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"sg" = (/obj/machinery/sleeper{dir = 4},/obj/effect/floor_decal/corner_steel_grid{dir = 10},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"si" = (/obj/structure/bed/chair/wood{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"sk" = (/obj/random/trash,/obj/random/trash,/obj/random/junk,/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"sm" = (/obj/structure/table/standard,/obj/structure/cable/green{icon_state = "0-4"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 1; pixel_y = 27; start_charge = 0},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/maint1)
+"so" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"sp" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/machinery/firealarm{dir = 8; pixel_x = -27},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"sq" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"ss" = (/obj/structure/table/woodentable,/obj/item/trash/plate,/obj/item/weapon/material/kitchen/utensil/fork/plastic,/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"sv" = (/obj/structure/cable/green{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/firedoor/glass/hidden/steel{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"sB" = (/obj/machinery/washing_machine,/obj/item/clothing/under/modjump3,/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"sH" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/yellow/border{dir = 9},/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"sM" = (/obj/structure/catwalk,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"sQ" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/two)
+"sS" = (/obj/structure/bed/chair,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/yellow/border{dir = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"sT" = (/turf/simulated/wall,/area/awaymission/lucky7/maint2)
+"sU" = (/obj/effect/floor_decal/techfloor/orange{dir = 6},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/gateway)
+"sV" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"sX" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/fancy/cigar/havana{pixel_x = -2; pixel_y = 2},/obj/item/weapon/storage/fancy/cigar{pixel_x = 2; pixel_y = 3},/obj/effect/floor_decal/spline/plain,/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/bar)
+"sZ" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/yellow/border{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"tc" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock2)
+"td" = (/obj/structure/casino_table/roulette_chart,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/yellow/border{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"te" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/simulated/floor/tiled/freezer/cold,/area/awaymission/lucky7/kitchen)
+"tm" = (/obj/machinery/vending/deluxe_dinner/open,/obj/effect/floor_decal/spline/plain,/turf/simulated/floor/tiled/techmaint/airless,/area/awaymission/lucky7/barbackroom)
+"to" = (/obj/effect/floor_decal/spline/plain{dir = 4},/obj/item/weapon/stool/padded{dir = 8},/obj/effect/decal/cleanable/filth,/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"tp" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom)
+"tr" = (/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/three)
+"ts" = (/obj/effect/decal/cleanable/blood/oil,/obj/structure/closet/crate/internals,/obj/item/weapon/tank/emergency/oxygen/engi,/obj/item/weapon/tank/emergency/oxygen/engi,/obj/item/weapon/tank/emergency/oxygen/engi,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"tt" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/machinery/alarm{dir = 8; pixel_x = 27},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"tv" = (/obj/structure/casino_table/roulette_table,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/yellow/border{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"tz" = (/obj/structure/cable/green{icon_state = "1-4"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/three)
+"tD" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"tE" = (/obj/structure/table/marble,/obj/item/weapon/material/ashtray/glass,/obj/machinery/light/floortube{dir = 4},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"tG" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/five)
+"tH" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/yellow/border{dir = 1},/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"tJ" = (/obj/effect/floor_decal/sign/dock/one,/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"tM" = (/obj/structure/table/gamblingtable,/obj/effect/floor_decal/borderfloor{dir = 5},/obj/structure/cable/green{icon_state = "0-2"},/obj/effect/floor_decal/corner/yellow/border{dir = 5},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 4; pixel_x = 27; start_charge = 0},/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"tQ" = (/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/red/border{dir = 5},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 4},/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"tV" = (/obj/effect/floor_decal/techfloor/orange{dir = 1},/obj/effect/floor_decal/techfloor/hole/right{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/gateway)
+"tY" = (/obj/structure/table/gamblingtable,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"tZ" = (/obj/structure/bed/chair/wood{dir = 1},/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"ua" = (/obj/machinery/door/firedoor/glass/hidden/steel,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"ub" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock1)
+"uc" = (/obj/effect/floor_decal/techfloor/orange{dir = 5},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/gateway)
+"ue" = (/obj/structure/bed/chair/sofa/bench/right,/obj/effect/floor_decal/borderfloorblack{dir = 9},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/gateway)
+"uf" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 4},/obj/structure/flora/pottedplant,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"up" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 27},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"uu" = (/turf/simulated/wall,/area/awaymission/lucky7/privateroom/two)
+"uv" = (/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"ux" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/machinery/door/firedoor/glass/hidden/steel,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"uy" = (/obj/structure/cable/green{icon_state = "2-4"},/obj/effect/floor_decal/rust,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"uz" = (/obj/structure/cable/green{icon_state = "4-8"},/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"uA" = (/obj/random/junk,/obj/random/junk,/obj/random/junk,/obj/random/maintenance,/obj/random/maintenance,/obj/random/maintenance/engineering,/obj/structure/table/rack/steel,/obj/random/contraband,/obj/structure/railing,/obj/structure/railing{dir = 4},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"uB" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 1; pixel_y = 27; start_charge = 0},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"uE" = (/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/gateway)
+"uF" = (/obj/structure/casino_table/craps,/obj/item/weapon/dice{pixel_x = 4; pixel_y = 6},/obj/machinery/light/floortube{dir = 8},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"uG" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom)
+"uH" = (/obj/structure/table/woodentable,/obj/item/weapon/flame/candle,/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"uI" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 1; pixel_y = 27; start_charge = 0},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"uJ" = (/obj/machinery/door/window/brigdoor/southleft{dir = 8; id = "L7 Cell 1"; name = "Cell 1"; req_access = list(2)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/security)
+"uL" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/structure/closet/firecloset,/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"uO" = (/obj/random/trash_pile,/obj/effect/floor_decal/rust,/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"uR" = (/turf/simulated/wall,/area/awaymission/lucky7/privateroom/four)
+"uY" = (/obj/structure/casino_table/craps{dir = 1},/obj/item/weapon/dice,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"uZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"va" = (/obj/effect/floor_decal/rust,/obj/structure/disposalpipe/segment,/obj/structure/catwalk,/obj/structure/cable/green{dir = 1; icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"vb" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"vd" = (/obj/machinery/firealarm{pixel_y = 26},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"vf" = (/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 6},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/gateway)
+"vg" = (/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/three)
+"vk" = (/obj/effect/floor_decal/rust,/obj/random/trash_pile,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"vo" = (/obj/machinery/door/airlock/glass{name = "Dock Lounge"},/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"vq" = (/obj/machinery/firealarm{dir = 4; pixel_x = 27},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"vr" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"vt" = (/obj/random/soap,/obj/structure/table/standard,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/four)
+"vu" = (/obj/effect/floor_decal/spline/plain{dir = 5},/obj/item/weapon/stool/padded{dir = 8},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"vx" = (/obj/structure/casino_table/blackjack_m,/obj/machinery/light/floortube{dir = 1},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"vy" = (/obj/item/weapon/stool/baystool/padded{dir = 1},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"vN" = (/obj/effect/floor_decal/rust,/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"vO" = (/obj/structure/lattice,/turf/space,/area/space)
+"vR" = (/obj/structure/casino_table/blackjack_l{dir = 8},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"vT" = (/obj/effect/floor_decal/rust,/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"vU" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom)
+"vZ" = (/obj/structure/bed/chair/wood{dir = 1},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"wb" = (/obj/structure/bed/chair/sofa/left/black{dir = 4},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom)
+"wc" = (/obj/machinery/door/airlock/glass_external,/obj/effect/map_helper/airlock/door/int_door,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1)
+"wd" = (/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"we" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/casino,/obj/item/weapon/pen,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom)
+"wj" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/firedoor/glass/hidden/steel{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"wk" = (/obj/structure/bed/chair/sofa/right/black{dir = 8},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom)
+"wl" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"wo" = (/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"wq" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/button/remote/airlock{id = "L7 Room 4"; name = "Door Lock"; pixel_x = 24; pixel_y = 26},/obj/machinery/light_switch{pixel_x = 33; pixel_y = 26},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/four)
+"wt" = (/obj/structure/cable/green{icon_state = "0-2"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 1; pixel_y = 27; start_charge = 0},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom)
+"wu" = (/obj/structure/mirror{pixel_y = 38},/obj/structure/sink{pixel_y = 20},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom)
+"wv" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/machinery/door/firedoor/glass/hidden/steel{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"ww" = (/obj/structure/table/marble,/obj/effect/floor_decal/spline/plain{dir = 8},/obj/machinery/chemical_dispenser/premium/full{dir = 4},/obj/machinery/light{dir = 8},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"wC" = (/obj/structure/toilet{pixel_y = 10},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom)
+"wG" = (/obj/structure/table/woodentable,/obj/item/trash/asian_bowl,/obj/item/weapon/material/kitchen/utensil/fork/plastic,/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"wJ" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"wK" = (/obj/structure/closet/secure_closet/personal/cabinet,/obj/item/weapon/towel/random,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/four)
+"wL" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"wT" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"wY" = (/obj/structure/bed/chair/sofa/corner/brown{dir = 8},/turf/simulated/floor/carpet,/area/awaymission/lucky7/hall1)
+"xb" = (/obj/structure/table/rack/steel,/obj/random/maintenance,/obj/random/maintenance,/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"xd" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"xh" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/embedded_controller/radio/airlock/docking_port{dir = 8; frequency = 1380; id_tag = "l7_dock_d2a3"; pixel_x = 28},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2)
+"xm" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/lightgrey/border{dir = 9},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 10},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"xn" = (/turf/simulated/wall,/area/awaymission/lucky7/dock2)
+"xq" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"xr" = (/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/random/medical,/obj/machinery/light,/obj/random/medical,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"xt" = (/obj/structure/table/gamblingtable,/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"xv" = (/obj/structure/table/woodentable,/obj/item/trash/plate,/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"xz" = (/obj/structure/cable/green{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"xC" = (/obj/machinery/light,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"xF" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/four)
+"xH" = (/obj/structure/casino_table/craps,/obj/machinery/light/floortube{dir = 8},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"xJ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/firedoor/glass/hidden/steel{dir = 1},/obj/structure/cable/green{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"xK" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"xL" = (/obj/effect/decal/cleanable/blood/oil,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"xM" = (/obj/item/weapon/stool/baystool/padded{dir = 1},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"xN" = (/obj/machinery/holoplant,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/vip)
+"xU" = (/obj/item/weapon/gun/projectile/shotgun/pump{ammo_type = /obj/item/ammo_casing/a12g/pellet; pixel_x = 1; pixel_y = 4},/obj/item/weapon/gun/projectile/shotgun/pump{ammo_type = /obj/item/ammo_casing/a12g/pellet; pixel_x = 2; pixel_y = -6},/obj/structure/table/rack/gun_rack,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/red/border,/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/corner/red/bordercorner2,/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"xZ" = (/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"yb" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 1},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"yf" = (/obj/structure/mirror{pixel_y = 38},/obj/structure/sink{pixel_y = 20},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/four)
+"yg" = (/obj/structure/bed/chair{dir = 1},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"yi" = (/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/four)
+"yk" = (/obj/structure/cable/green{icon_state = "1-2"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"yo" = (/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"yp" = (/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"yv" = (/obj/structure/closet/secure_closet/personal/cabinet,/obj/item/weapon/towel/random,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/two)
+"yw" = (/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/grey/border{dir = 5},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"yy" = (/obj/structure/bed/chair/sofa/right/purp{dir = 1},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"yz" = (/obj/machinery/door/airlock/multi_tile/glass{name = "Dock Lounge"},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/awaymission/lucky7/lounge)
+"yA" = (/obj/structure/table/woodentable,/obj/random/maintenance/foodstuff,/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"yD" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"yH" = (/obj/structure/table/steel,/obj/random/toolbox,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"yO" = (/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"yR" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/table/marble,/obj/machinery/door/firedoor/glass,/obj/random/maintenance/foodstuff,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"yX" = (/obj/structure/disposalpipe/segment,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"yY" = (/turf/simulated/wall,/area/awaymission/lucky7/arcade)
+"yZ" = (/obj/machinery/door/airlock/maintenance/common,/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/maint1)
+"za" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"zg" = (/obj/structure/table/gamblingtable,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 5},/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"zk" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock1)
+"zp" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 10},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"zq" = (/obj/structure/cable/green{icon_state = "1-2"},/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"zr" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "dock_d1l_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "dock_d1l_sensor"; pixel_x = 30; pixel_y = 8},/obj/effect/map_helper/airlock/atmos/chamber_pump,/obj/effect/map_helper/airlock/sensor/chamber_sensor,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1)
+"zv" = (/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"zx" = (/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"zD" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock2)
+"zE" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"zH" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/five)
+"zK" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"zM" = (/obj/structure/table/woodentable,/obj/item/trash/plate,/obj/item/weapon/material/kitchen/utensil/fork/plastic,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"zQ" = (/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{icon_state = "2-4"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"zR" = (/obj/structure/railing{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"zV" = (/obj/effect/floor_decal/rust,/obj/structure/table/steel,/obj/random/tool,/obj/random/maintenance,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"zW" = (/obj/machinery/firealarm{dir = 4; pixel_x = 27},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/three)
+"zY" = (/obj/effect/floor_decal/rust,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/catwalk,/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Ab" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/four)
+"Am" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"},/turf/simulated/floor/plating,/area/awaymission/lucky7/dock1)
+"Ap" = (/obj/machinery/light,/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"Ar" = (/obj/effect/floor_decal/rust,/obj/structure/table/rack/shelf/steel,/obj/random/maintenance/engineering,/obj/random/contraband,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"Av" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "dock_d1l"; name = "interior access button"; pixel_x = -28; pixel_y = -26; req_access = list(13)},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"Ax" = (/obj/machinery/door/airlock/maintenance/common,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/catwalk,/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Ay" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "dock_d1a1"; name = "interior access button"; pixel_x = -28; pixel_y = 26; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"AF" = (/obj/effect/floor_decal/rust,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/catwalk,/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"AG" = (/obj/structure/table/gamblingtable,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"AJ" = (/obj/random/trash_pile,/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"AK" = (/obj/effect/floor_decal/steeldecal/steel_decals10,/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 4},/turf/simulated/floor/tiled/freezer,/area/awaymission/lucky7/privateroom/vip)
+"AN" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower,/obj/effect/floor_decal/steeldecal/steel_decals5{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 10},/turf/simulated/floor/tiled,/area/awaymission/lucky7/privateroom/three)
+"AO" = (/obj/structure/toilet{pixel_y = 10},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/two)
+"AP" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 1},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 1},/obj/structure/flora/pottedplant,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"AQ" = (/obj/machinery/vending/deluxe_cigs/open,/obj/effect/floor_decal/spline/plain,/obj/structure/cable/green{icon_state = "0-2"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 1; pixel_y = 27; start_charge = 0},/turf/simulated/floor/tiled/techmaint/airless,/area/awaymission/lucky7/barbackroom)
+"AS" = (/obj/structure/bed/chair/sofa/bench,/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/gateway)
+"AU" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/grey/border{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"AW" = (/obj/effect/floor_decal/steeldecal/steel_decals6{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals6,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"AX" = (/obj/structure/disposalpipe/junction/yjunction{dir = 1},/obj/structure/catwalk,/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"AY" = (/obj/structure/flora/pottedplant/tall,/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/hotelhall)
+"Ba" = (/obj/structure/reagent_dispensers/watertank,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/awaymission/lucky7/maint1)
+"Be" = (/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"},/obj/structure/catwalk,/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Bf" = (/turf/simulated/wall,/area/awaymission/lucky7/lounge)
+"Bi" = (/obj/effect/floor_decal/rust,/obj/random/maintenance,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Bm" = (/obj/machinery/door/airlock/maintenance/common,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/maint2)
+"Bq" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/grey/border{dir = 1},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 1; pixel_y = 27; start_charge = 0},/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"Bs" = (/obj/effect/floor_decal/spline/plain{dir = 4},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"},/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"BA" = (/obj/structure/closet/secure_closet/bar,/turf/simulated/floor/wood,/area/awaymission/lucky7/barbackroom)
+"BE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom)
+"BH" = (/obj/structure/bed/chair/sofa/right/black{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom)
+"BK" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"BM" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/structure/disposalpipe/junction{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"BQ" = (/obj/machinery/light,/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"BT" = (/obj/structure/table/woodentable,/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom)
+"BV" = (/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/bed/chair/sofa/left/black{dir = 8},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom)
+"BW" = (/obj/effect/floor_decal/rust,/obj/structure/closet,/obj/random/junk,/obj/random/junk,/obj/random/junk,/obj/random/junk,/obj/random/maintenance,/obj/random/maintenance,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"Cb" = (/obj/structure/table/standard,/obj/item/clothing/under/suit_jacket/really_black{pixel_x = 5; pixel_y = 10},/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"Cf" = (/obj/random/soap,/obj/structure/table/standard,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/five)
+"Ch" = (/obj/machinery/door/airlock/glass_security{req_one_access = null},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"Ci" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom)
+"Ck" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"Cl" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/awaymission/lucky7/bar)
+"Cm" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/two)
+"Cn" = (/obj/machinery/door/airlock{id_tag = "br bathroom"; name = "Bathroom"},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/breakroom)
+"Co" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/breakroom)
+"Cp" = (/obj/machinery/door/airlock/freezer{name = "Freezer"},/turf/simulated/floor/tiled/freezer/cold,/area/awaymission/lucky7/kitchen)
+"Cu" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"CC" = (/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"CD" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"CE" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/machinery/door/firedoor/glass/hidden/steel,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"CG" = (/obj/structure/table/gamblingtable,/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"CI" = (/obj/machinery/door/firedoor/glass/hidden/steel{dir = 2},/obj/structure/cable/green{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"CM" = (/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"CN" = (/obj/effect/floor_decal/spline/plain{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"CO" = (/obj/structure/disposalpipe/junction{dir = 4},/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"CQ" = (/obj/effect/floor_decal/spline/plain{dir = 9},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"CR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"CU" = (/obj/structure/table/steel,/obj/random/tool,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"CW" = (/obj/structure/table/steel,/obj/item/stack/cable_coil,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"CZ" = (/obj/structure/frame,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"Db" = (/obj/effect/floor_decal/spline/plain{dir = 1},/obj/machinery/firealarm{pixel_y = 26},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"Dg" = (/obj/structure/table/woodentable,/obj/random/drinkbottle,/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom)
+"Dh" = (/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/security)
+"Di" = (/turf/simulated/wall,/area/awaymission/lucky7/workshop)
+"Dk" = (/obj/structure/toilet{pixel_y = 10},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/four)
+"Dm" = (/obj/effect/floor_decal/spline/plain{dir = 10},/obj/item/weapon/stool/padded{dir = 1},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"Dn" = (/obj/structure/bed/chair/comfy/beige,/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"Dp" = (/obj/effect/floor_decal/techfloor/orange{dir = 8},/obj/effect/floor_decal/techfloor/hole/right{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/gateway)
+"Dv" = (/obj/machinery/door/airlock/glass,/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/bar)
+"Dw" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/two)
+"Dx" = (/obj/structure/table/woodentable,/obj/machinery/chemical_dispenser/bar_coffee/full{dir = 8},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"DD" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"DF" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock1)
+"DG" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"DH" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"DI" = (/obj/effect/floor_decal/spline/plain{dir = 5},/turf/simulated/floor/water/pool,/area/awaymission/lucky7/privateroom/vip)
+"DL" = (/turf/simulated/wall,/area/awaymission/lucky7/privateroom/five)
+"DO" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable/green{icon_state = "1-4"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"DP" = (/obj/structure/morgue{dir = 2},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/medical)
+"DQ" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 1; pixel_y = 27; start_charge = 0},/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"DR" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"DS" = (/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/disposalpipe/junction{dir = 4; icon_state = "pipe-j2"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"DT" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock1)
+"DY" = (/obj/effect/floor_decal/borderfloorwhite/corner{dir = 4},/obj/effect/floor_decal/corner/paleblue/bordercorner{dir = 4},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"DZ" = (/obj/effect/shuttle_landmark{base_area = /area/space; base_turf = /turf/space; docking_controller = "l7_dock_d1a1"; landmark_tag = "l7_dockarm_d1a1"; name = "Dock D1A1"},/turf/space,/area/space)
+"Ee" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "dock_d1a3_pump"},/obj/machinery/light/small,/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "dock_d1a3_sensor"; pixel_y = -25},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "l7_dock_d1a2"; pixel_y = 28},/obj/effect/map_helper/airlock/atmos/chamber_pump,/obj/effect/map_helper/airlock/sensor/chamber_sensor,/obj/effect/floor_decal/industrial/warning/cee{dir = 4},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1)
+"Ei" = (/obj/machinery/door/airlock{id_tag = "L7 VIP Room"; name = "VIP Room"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"Es" = (/obj/effect/map_helper/airlock/door/int_door,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 8},/obj/machinery/door/airlock/glass_external,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1)
+"Et" = (/obj/machinery/door/airlock/engineering{name = "Workshop"; req_one_access = null},/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"Ew" = (/obj/effect/map_helper/airlock/door/int_door,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 8},/obj/machinery/door/airlock/glass_external,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2)
+"Ez" = (/obj/structure/table/steel,/obj/item/stack/material/diamond{amount = 50; pixel_x = -5; pixel_y = -5},/obj/item/stack/material/diamond{amount = 50},/obj/item/stack/material/diamond{amount = 50; pixel_x = 5; pixel_y = 5},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/security)
+"EB" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{icon_state = "1-2"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"EC" = (/obj/structure/cable/green{icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"EF" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/awaymission/lucky7/barbackroom)
+"EI" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/awaymission/lucky7/gateway)
+"EM" = (/obj/effect/floor_decal/techfloor/orange,/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/gateway)
+"EN" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/three)
+"EO" = (/obj/machinery/door/airlock/maintenance/common,/obj/effect/floor_decal/rust,/obj/structure/disposalpipe/segment,/obj/structure/catwalk,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"ES" = (/obj/structure/railing,/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"ET" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"EW" = (/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/blood/oil,/obj/structure/railing,/obj/machinery/power/terminal{dir = 1},/obj/structure/cable{icon_state = "0-2"},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Fa" = (/obj/structure/closet,/obj/random/junk,/obj/random/junk,/obj/random/maintenance,/obj/random/maintenance/engineering,/obj/item/device/flashlight/color,/obj/structure/railing{dir = 4},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Fd" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/four)
+"Fj" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock2)
+"Fl" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{icon_state = "2-8"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"Fm" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/grey/border{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"Fp" = (/obj/effect/floor_decal/spline/plain{dir = 10},/turf/simulated/floor/water/pool,/area/awaymission/lucky7/privateroom/vip)
+"Fr" = (/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"Ft" = (/obj/machinery/door/airlock/medical{name = "Morgue"; req_one_access = null},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/medical)
+"Fu" = (/turf/simulated/wall,/area/awaymission/lucky7/bar)
+"Fv" = (/obj/item/weapon/stool/padded{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"Fw" = (/obj/machinery/door/firedoor/glass/hidden/steel{dir = 8},/obj/structure/cable/green{icon_state = "1-2"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"FF" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"FG" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/grey/border,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hotelhall)
+"FJ" = (/obj/machinery/door/airlock/maintenance/common,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"FK" = (/obj/structure/railing,/obj/structure/railing{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"FL" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/red/border{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 9},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"FN" = (/obj/random/trash_pile,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"FQ" = (/obj/effect/landmark/hidden_level,/turf/space,/area/space)
+"FT" = (/obj/effect/floor_decal/rust,/obj/structure/disposalpipe/segment,/obj/structure/catwalk,/obj/structure/cable/green{icon_state = "1-2"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"FU" = (/obj/structure/closet,/obj/random/junk,/obj/random/junk,/obj/random/junk,/obj/random/maintenance,/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"FV" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/maint1)
+"FW" = (/obj/random/trash,/obj/machinery/light/small{dir = 4},/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"FY" = (/obj/structure/closet,/obj/random/junk,/obj/random/junk,/obj/random/maintenance,/obj/random/maintenance,/obj/effect/floor_decal/rust,/obj/random/contraband,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"FZ" = (/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Ge" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/two)
+"Gf" = (/obj/structure/bed/chair/wood,/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"Gg" = (/obj/structure/cable/green{icon_state = "1-4"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom)
+"Gh" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"Gi" = (/obj/structure/railing{dir = 1},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Gj" = (/turf/simulated/wall,/area/awaymission/lucky7/hotelhall)
+"Gk" = (/obj/structure/table/woodentable,/obj/machinery/alarm{dir = 8; pixel_x = 27},/turf/simulated/floor/carpet/purcarpet,/area/awaymission/lucky7/privateroom/vip)
+"Gm" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{icon_state = "1-4"},/obj/machinery/button/remote/airlock{id = "L7 VIP Room"; name = "Door Lock"; pixel_x = 24; pixel_y = 26},/obj/machinery/light_switch{pixel_x = 33; pixel_y = 26},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"Gn" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"Gp" = (/obj/structure/toilet{pixel_y = 10},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/vip)
+"Gr" = (/obj/structure/disposalpipe/segment,/obj/structure/catwalk,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Gs" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/table/marble,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"Gz" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom)
+"GA" = (/obj/effect/floor_decal/techfloor/orange{dir = 4},/obj/effect/floor_decal/techfloor/hole/right{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/gateway)
+"GE" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/floor_decal/industrial/warning/cee{dir = 8},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2)
+"GJ" = (/turf/simulated/wall,/area/awaymission/lucky7/privategameroom/two)
+"GO" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"GP" = (/obj/structure/table/glass,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/storage/firstaid/regular{pixel_x = 5; pixel_y = 8},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"GQ" = (/obj/structure/table/steel,/obj/item/weapon/storage/box/bodybags,/obj/random/maintenance/medical,/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/medical)
+"GR" = (/obj/structure/table/standard,/obj/machinery/button/remote/airlock{id = "br bathroom"; name = "Bathroom Lock"; pixel_x = -20; pixel_y = 10; specialfunctions = 4},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/breakroom)
+"GS" = (/obj/effect/floor_decal/rust,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"GT" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lightgrey/border,/obj/structure/cable/green{icon_state = "1-2"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"GV" = (/obj/structure/cable/green{icon_state = "1-4"},/obj/structure/cable/green{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"GX" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/awaymission/lucky7/hall1)
+"Ha" = (/obj/machinery/vending/wallmed1/public{pixel_x = 28},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/breakroom)
+"Hb" = (/obj/structure/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair_preview"},/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"Hf" = (/obj/structure/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair_preview"},/obj/machinery/light,/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"Hg" = (/obj/effect/floor_decal/borderfloorblack,/obj/structure/bed/chair/sofa/bench{dir = 1},/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/gateway)
+"Hl" = (/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/junction{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"Hm" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"Hn" = (/obj/structure/table/marble,/obj/machinery/light/floortube{dir = 1},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"Ht" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "dock_d1a1"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/obj/machinery/door/airlock/glass_external,/obj/effect/map_helper/airlock/door/ext_door,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1)
+"Hx" = (/obj/effect/floor_decal/steeldecal/steel_decals10,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"Hz" = (/obj/random/trash,/obj/structure/railing{dir = 8},/obj/structure/railing{dir = 1},/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"HA" = (/obj/structure/bed/chair/comfy/beige{dir = 1},/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"HB" = (/obj/structure/bed/chair/comfy/beige{dir = 1},/obj/machinery/light,/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"HF" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/grille,/turf/space,/area/space)
+"HH" = (/obj/effect/floor_decal/rust,/obj/structure/mopbucket,/obj/item/weapon/mop,/obj/item/weapon/reagent_containers/glass/bucket,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/firealarm{pixel_y = 26},/turf/simulated/floor/tiled,/area/awaymission/lucky7/maint1)
+"HJ" = (/obj/structure/bed/chair,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"HM" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 6},/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"HQ" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/button/remote/airlock{id = "L7 Room 1"; name = "Door Lock"; pixel_x = 24; pixel_y = 26},/obj/machinery/light_switch{pixel_x = 33; pixel_y = 26},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom)
+"HS" = (/obj/structure/table/woodentable,/obj/machinery/light{dir = 4},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"HW" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"HZ" = (/obj/structure/table/rack/steel,/obj/item/weapon/spacecash/c1000{pixel_x = 6; pixel_y = 6},/obj/item/weapon/spacecash/c1000{pixel_x = 3; pixel_y = 3},/obj/item/weapon/spacecash/c1000,/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/security)
+"Ig" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"Ij" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"Ik" = (/obj/effect/floor_decal/borderfloorwhite/corner{dir = 1},/obj/effect/floor_decal/corner/paleblue/bordercorner{dir = 1},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"Im" = (/obj/structure/mirror{pixel_y = 38},/obj/structure/sink{pixel_y = 20},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/breakroom)
+"In" = (/obj/structure/table/glass,/obj/random/medical,/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 8},/obj/item/weapon/tool/screwdriver,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"Iq" = (/obj/structure/table/rack,/obj/item/ammo_magazine/ammo_box/b12g/pellet{pixel_x = 3; pixel_y = -3},/obj/item/ammo_magazine/ammo_box/b12g/pellet{pixel_x = -5; pixel_y = -3},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/red/border,/obj/item/ammo_magazine/ammo_box/b12g/pellet{pixel_x = 3; pixel_y = 3},/obj/item/ammo_magazine/ammo_box/b12g/pellet{pixel_x = -5; pixel_y = 3},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"Ir" = (/obj/structure/table/glass,/obj/random/soap,/obj/item/weapon/towel/random,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/vip)
+"Is" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"It" = (/obj/structure/bed/chair/comfy/beige,/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"Iu" = (/obj/structure/closet/secure_closet/personal/cabinet,/obj/item/weapon/towel/random,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/five)
+"Iv" = (/obj/effect/floor_decal/rust,/obj/random/maintenance,/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"Iw" = (/obj/effect/floor_decal/rust,/obj/structure/disposalpipe/segment,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"IC" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/five)
+"IF" = (/obj/structure/cable/green{icon_state = "1-4"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/five)
+"IJ" = (/obj/structure/closet/secure_closet/personal/cabinet,/obj/item/weapon/towel/random,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/three)
+"IM" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/table/marble,/obj/machinery/reagentgrinder,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"IN" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/grey/border{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 27},/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"IR" = (/obj/random/soap,/obj/structure/table/standard,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/two)
+"IS" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"Jc" = (/obj/structure/table/steel,/obj/random/cash/huge{pixel_y = 8},/obj/random/cash/huge,/obj/item/weapon/bikehorn{pixel_x = -7; pixel_y = 7},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/security)
+"Jd" = (/obj/structure/toilet{pixel_y = 10},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/five)
+"Jg" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/industrial/danger/corner{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"Jj" = (/obj/machinery/light,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"Jp" = (/obj/machinery/body_scanconsole{dir = 4},/obj/effect/floor_decal/corner_steel_grid{dir = 10},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"Jq" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"Jw" = (/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "casino_check"},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"Jy" = (/obj/structure/undies_wardrobe,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/two)
+"Jz" = (/obj/structure/cable/green{icon_state = "2-4"},/obj/structure/cable/green{icon_state = "1-4"},/obj/structure/disposalpipe/junction/yjunction{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"JB" = (/turf/simulated/wall,/area/awaymission/lucky7/barbackroom)
+"JC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"JE" = (/obj/effect/floor_decal/spline/plain{dir = 4},/obj/item/weapon/stool/padded{dir = 8},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"JK" = (/obj/machinery/light/small,/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "l7_dock_d1a1"; pixel_y = 28},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "dock_d1a1_sensor"; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "dock_d1a1_pump"},/obj/effect/map_helper/airlock/atmos/chamber_pump,/obj/effect/map_helper/airlock/sensor/chamber_sensor,/obj/effect/floor_decal/industrial/warning/cee{dir = 8},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1)
+"JL" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/machinery/alarm{dir = 8; pixel_x = 27},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"JN" = (/obj/structure/casino_table/roulette_table,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"JP" = (/obj/structure/cable/green{icon_state = "4-8"},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"JR" = (/obj/structure/disposalpipe/junction/yjunction{dir = 1},/obj/structure/cable/green{icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"JU" = (/obj/machinery/door/airlock/maintenance/common,/obj/structure/cable/green{icon_state = "4-8"},/obj/machinery/door/firedoor/glass,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"JW" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/five)
+"Ka" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/bed/chair/sofa/bench/left,/obj/effect/floor_decal/borderfloorblack{dir = 5},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 4; pixel_x = 27; start_charge = 0},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/gateway)
+"Kf" = (/turf/simulated/wall,/area/awaymission/lucky7/kitchen)
+"Ki" = (/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Kj" = (/obj/structure/flora/pottedplant/tall,/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/hall2)
+"Kk" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock1)
+"Kl" = (/turf/simulated/wall,/area/awaymission/lucky7/medical)
+"Km" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/alarm{dir = 1; pixel_y = -27},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"Kn" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/catwalk,/obj/structure/cable/green{icon_state = "1-4"},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Ks" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2)
+"Kt" = (/obj/structure/closet/secure_closet/personal/cabinet,/obj/item/weapon/towel/random,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom)
+"Ku" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/security)
+"Kw" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/rust,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/catwalk,/obj/structure/cable/green{icon_state = "4-8"},/obj/item/stack/material/phoron{amount = 2},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Kx" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/junction{dir = 4},/obj/structure/catwalk,/obj/structure/cable/green{icon_state = "4-8"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"KA" = (/obj/structure/table/woodentable,/obj/random/drinkbottle,/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/four)
+"KC" = (/obj/structure/undies_wardrobe,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/five)
+"KE" = (/obj/structure/casino_table/blackjack_l,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"KG" = (/obj/machinery/door/airlock,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/wood,/area/awaymission/lucky7/barbackroom)
+"KH" = (/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/cable/green{icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"KI" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/catwalk,/obj/structure/cable/green{icon_state = "1-8"},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"KK" = (/turf/simulated/wall,/area/awaymission/lucky7/privateroom/three)
+"KL" = (/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom)
+"KM" = (/obj/machinery/door/airlock{id_tag = "L7 Room 4"; name = "Private Room 4"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/four)
+"KN" = (/turf/simulated/wall/r_wall,/area/awaymission/lucky7/security)
+"KR" = (/obj/random/trash_pile,/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"KS" = (/obj/structure/table/steel,/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/blood/oil,/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"KT" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/floor_decal/industrial/warning/cee{dir = 4},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1)
+"KU" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/obj/effect/floor_decal/sign/dock/two,/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"KY" = (/obj/structure/table/rack/steel,/obj/random/maintenance,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"KZ" = (/obj/structure/bed/chair/sofa/left/purp{dir = 1},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"Le" = (/obj/random/trash_pile,/obj/effect/floor_decal/rust,/obj/structure/railing{dir = 4},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Lg" = (/obj/random/trash,/obj/random/trash,/obj/machinery/light/small,/obj/structure/railing{dir = 8},/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"Lh" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"Li" = (/obj/effect/floor_decal/rust,/obj/structure/disposalpipe/segment,/obj/structure/catwalk,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Lj" = (/obj/machinery/door/airlock{name = "Breakroom"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom)
+"Lk" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "dock_d1l"; name = "exterior access button"; pixel_x = 28; pixel_y = -6; req_access = list(13)},/obj/machinery/door/airlock/glass_external,/obj/effect/map_helper/airlock/door/ext_door,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1)
+"Ll" = (/obj/effect/floor_decal/steeldecal/steel_decals10,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -26},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"Lo" = (/obj/structure/table/woodentable,/obj/item/trash/bowl,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"Lq" = (/obj/item/modular_computer/console{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"Lr" = (/obj/structure/closet/crate,/obj/random/tool,/obj/random/tool,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/obj/machinery/light,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"Ls" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/red/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/flora/pottedplant/unusual,/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"Lw" = (/turf/simulated/wall,/area/awaymission/lucky7/privateroom/vip)
+"Lx" = (/obj/structure/salvageable/slotmachine2,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"Ly" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet/purcarpet,/area/awaymission/lucky7/privateroom/vip)
+"LA" = (/obj/structure/bed/chair/comfy/beige,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"LB" = (/obj/structure/salvageable/slotmachine1,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"LC" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/effect/floor_decal/borderfloorwhite/corner2,/obj/effect/floor_decal/corner/paleblue/bordercorner2,/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"LE" = (/obj/machinery/slot_machine,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"LF" = (/obj/structure/table/steel,/obj/random/tool,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"LI" = (/obj/item/modular_computer/console{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/red/border{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 9},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"LJ" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/purpledouble,/obj/machinery/alarm{dir = 8; pixel_x = 27},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/two)
+"LL" = (/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/red/border{dir = 5},/obj/structure/closet/firecloset,/obj/machinery/alarm{pixel_y = 27},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"LN" = (/obj/structure/table/marble,/obj/random/drinkbottle,/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"LO" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/structure/bed/chair/office,/obj/machinery/alarm{pixel_y = 27},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"LU" = (/obj/structure/table/woodentable,/obj/item/trash/plate,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"LV" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/structure/extinguisher_cabinet{dir = 8; pixel_x = 30},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"LY" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"Ma" = (/obj/structure/table/steel,/obj/random/tool,/obj/random/tool,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"Mb" = (/obj/structure/table/woodentable,/obj/item/weapon/flame/candle,/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"Mc" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 7; pixel_y = -3},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_y = -3},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -7; pixel_y = -3},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_y = 3},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 7; pixel_y = 3},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -7; pixel_y = 3},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"Md" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 8; pixel_x = -27; start_charge = 0},/obj/structure/cable/green{icon_state = "0-4"},/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"Me" = (/obj/structure/closet/walllocker_double{dir = 8; name = "Game Cabinet"; pixel_x = -28},/obj/item/weapon/book/manual/wizzoffguide,/obj/item/weapon/deck/wizoff,/obj/item/weapon/storage/pill_bottle/dice_nerd,/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/deck/cards/casino,/obj/item/weapon/deck/cah,/obj/item/weapon/deck/cah/black,/obj/item/weapon/storage/dicecup,/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"Mf" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock2)
+"Mg" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"Mh" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/grey/border{dir = 4},/obj/machinery/alarm{dir = 8; pixel_x = 27},/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"Mk" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "dock_d1a3"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/obj/machinery/door/airlock/glass_external,/obj/effect/map_helper/airlock/door/ext_door,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1)
+"Mm" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/obj/machinery/light,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"Mn" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/grey/border{dir = 10},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hotelhall)
+"Mo" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 4; pixel_x = 27; start_charge = 0},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/two)
+"Mq" = (/obj/effect/floor_decal/corner/lightgrey{dir = 10},/obj/effect/floor_decal/corner/lightgrey{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/machinery/vending/cola/soft{dir = 4},/turf/simulated/floor/tiled/monotile,/area/awaymission/lucky7/lounge)
+"Ms" = (/obj/machinery/vending/assist{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/yellow/border{dir = 6},/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"Mt" = (/obj/structure/bed/chair/sofa/brown,/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"Mw" = (/turf/simulated/wall,/area/awaymission/lucky7/gateway)
+"My" = (/obj/machinery/gateway/centeraway,/turf/simulated/floor/tiled/techfloor/grid,/area/awaymission/lucky7/gateway)
+"MA" = (/obj/structure/flora/pottedplant/stoutbush,/obj/effect/floor_decal/spline/plain{dir = 10},/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/bar)
+"ME" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/lightgrey/border{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 9},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"MG" = (/obj/structure/cable/green{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"MJ" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/lightgrey/border{dir = 6},/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/corner/lightgrey/bordercorner2,/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"MQ" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 4; pixel_x = 27; start_charge = 0},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"MV" = (/obj/effect/floor_decal/rust,/obj/random/junk,/obj/structure/table/rack/steel,/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"MX" = (/obj/structure/table/steel,/obj/item/weapon/tool/wrench{pixel_x = 6; pixel_y = -3},/obj/item/device/multitool{pixel_x = -6},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"MY" = (/obj/effect/floor_decal/rust,/obj/structure/table/steel,/obj/item/stack/material/phoron{amount = 19},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"MZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"Na" = (/obj/structure/table/marble,/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"Nb" = (/obj/effect/floor_decal/corner/lightorange{dir = 5},/obj/effect/floor_decal/borderfloor/shifted{dir = 1},/obj/effect/floor_decal/corner/lightorange/border/shifted{dir = 1},/obj/structure/closet/secure_closet/brig{id = "Cell 1"},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/security)
+"Nc" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"Nd" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Ng" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{icon_state = "1-8"},/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"Ni" = (/obj/random/trash_pile,/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Nl" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/awaymission/lucky7/breakroom)
+"Nm" = (/obj/effect/floor_decal/spline/plain{dir = 1},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"No" = (/obj/machinery/door/morgue{dir = 2; name = "Private Room"; req_access = null},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"Nq" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/cable/green{icon_state = "1-4"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"Nr" = (/obj/structure/cable/green{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"Ny" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Nz" = (/obj/structure/coatrack,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"NC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/awaymission/lucky7/lounge)
+"ND" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/button/remote/airlock{id = "L7 Room 5"; name = "Door Lock"; pixel_x = 24; pixel_y = 26},/obj/machinery/light_switch{pixel_x = 33; pixel_y = 26},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/five)
+"NF" = (/obj/structure/cable{icon_state = "0-8"},/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"NG" = (/obj/structure/bed/chair/office/light{dir = 4},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"NI" = (/obj/structure/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair_preview"},/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"NJ" = (/obj/effect/floor_decal/borderfloorwhite/corner{dir = 8},/obj/effect/floor_decal/corner/paleblue/bordercorner{dir = 8},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"NL" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock2)
+"NN" = (/obj/machinery/washing_machine,/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"NQ" = (/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/four)
+"NR" = (/obj/machinery/button/remote/blast_door{dir = 8; id = "L7 Cell 2"; name = "Cell 2 Door"; pixel_x = 28; req_access = null},/obj/structure/table/reinforced,/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"NS" = (/obj/structure/table/woodentable,/obj/random/maintenance/foodstuff,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"NT" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "brig_lockdown"; name = "Security Blast Doors"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/awaymission/lucky7/security)
+"NV" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"NY" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/awaymission/lucky7/medical)
+"Oa" = (/obj/structure/undies_wardrobe,/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"Of" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_security{req_one_access = null},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"Og" = (/obj/machinery/gateway{dir = 10},/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/tiled/techfloor/grid,/area/awaymission/lucky7/gateway)
+"Oj" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"Ok" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"Ol" = (/obj/item/weapon/stool/padded{dir = 1},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"Om" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/structure/flora/pottedplant,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"Oo" = (/obj/structure/table/woodentable,/obj/random/drinkbottle,/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/two)
+"Oq" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/firedoor/glass/hidden/steel{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"Or" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "dock_d1a1"; name = "interior access button"; pixel_x = -28; pixel_y = 26; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"Ot" = (/obj/effect/floor_decal/corner/lightorange{dir = 5},/obj/effect/floor_decal/borderfloor/shifted{dir = 1},/obj/effect/floor_decal/corner/lightorange/border/shifted{dir = 1},/obj/structure/closet/secure_closet/brig{id = "Cell 2"},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/security)
+"Ou" = (/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/vip)
+"Ow" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"Ox" = (/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"OA" = (/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"OB" = (/obj/effect/floor_decal/borderfloor/shifted{dir = 1},/obj/effect/floor_decal/corner/lightorange/border/shifted{dir = 1},/obj/effect/floor_decal/corner/lightorange{dir = 5},/obj/machinery/light/small{dir = 1},/obj/structure/bed/padded,/obj/item/weapon/bedsheet,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/security)
+"OC" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"OE" = (/obj/machinery/light{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"OI" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 6},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"OJ" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"OM" = (/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"ON" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"OO" = (/obj/effect/floor_decal/corner/lightorange{dir = 5},/obj/effect/floor_decal/borderfloor/shifted{dir = 1},/obj/effect/floor_decal/corner/lightorange/border/shifted{dir = 1},/obj/structure/table/steel,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/security)
+"OP" = (/turf/simulated/wall,/area/awaymission/lucky7/laundry)
+"OS" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/machinery/alarm{dir = 4; pixel_x = -27},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"OT" = (/obj/machinery/slot_machine,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"OW" = (/obj/effect/floor_decal/rust,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Pa" = (/obj/effect/floor_decal/spline/plain{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"Pc" = (/obj/structure/table/steel,/obj/random/maintenance/engineering,/obj/random/junk,/obj/effect/floor_decal/rust,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Pj" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 5},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"Pk" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/chem_master/condimaster,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"Pm" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "dock_d1l_pump"},/obj/effect/map_helper/airlock/atmos/chamber_pump,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1)
+"Pn" = (/obj/structure/table/rack/steel,/obj/random/maintenance,/obj/random/junk,/obj/random/junk,/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/blood/oil,/obj/random/contraband,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Pq" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/obj/structure/cable/green{icon_state = "0-4"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 8; pixel_x = -27; start_charge = 0},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"Ps" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"Pu" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 4; pixel_x = 27; start_charge = 0},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/four)
+"Pw" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock1)
+"Py" = (/obj/structure/closet/walllocker_double{dir = 8; name = "Game Cabinet"; pixel_x = -28},/obj/item/weapon/book/manual/wizzoffguide,/obj/item/weapon/deck/wizoff,/obj/item/weapon/storage/pill_bottle/dice_nerd,/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/deck/cards/casino,/obj/item/weapon/deck/cah,/obj/item/weapon/deck/cah/black,/obj/item/weapon/storage/dicecup,/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"PC" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/button/remote/airlock{id = "L7 Room 3"; name = "Door Lock"; pixel_x = 24; pixel_y = 26},/obj/machinery/light_switch{pixel_x = 33; pixel_y = 26},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/three)
+"PE" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"PF" = (/obj/machinery/alarm{pixel_y = 27},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"PG" = (/obj/effect/floor_decal/borderfloorwhite/corner,/obj/effect/floor_decal/corner/paleblue/bordercorner,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"PI" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"PJ" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"PN" = (/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/two)
+"PP" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/awaymission/lucky7/barbackroom)
+"PQ" = (/obj/structure/bed/chair/sofa/right/brown,/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"PT" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/light{dir = 1},/obj/machinery/firealarm{pixel_y = 26},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"PV" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/sink/kitchen{pixel_y = 20},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"PX" = (/obj/structure/table/woodentable,/obj/machinery/chemical_dispenser/bar_soft/full{dir = 8},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"Qa" = (/obj/structure/bed/chair/wood{dir = 1},/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"Qd" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"Qg" = (/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/medical{name = "Clinic"; req_one_access = null},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"Qi" = (/obj/machinery/door/airlock,/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/awaymission/lucky7/barbackroom)
+"Qm" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/appliance/cooker/grill,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"Qo" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/appliance/cooker/fryer,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"Qp" = (/obj/effect/floor_decal/corner/lightgrey{dir = 10},/obj/effect/floor_decal/corner/lightgrey{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/machinery/vending/bepis,/turf/simulated/floor/tiled/monotile,/area/awaymission/lucky7/hotelhall)
+"Qq" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 5},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"Qr" = (/obj/machinery/door/airlock/highsecurity{locked = 1; name = "Safe"; req_one_access = null},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/security)
+"Qs" = (/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/lightgrey/border{dir = 5},/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"Qt" = (/obj/structure/table/gamblingtable,/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"Qv" = (/obj/structure/disposalpipe/segment{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"Qz" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/structure/cable/green{icon_state = "0-4"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 8; pixel_x = -27; start_charge = 0},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"QC" = (/obj/structure/table/reinforced,/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"QD" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom)
+"QG" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/appliance/cooker/oven,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"QK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/catwalk,/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"QM" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 1; pixel_y = 27; start_charge = 0},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"QR" = (/obj/machinery/atm{pixel_y = 30},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"QU" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/masks,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"QV" = (/obj/machinery/casino_prize_dispenser,/obj/effect/floor_decal/spline/plain{dir = 10},/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/casinofloor)
+"Rb" = (/obj/machinery/sleep_console{dir = 4},/obj/effect/floor_decal/corner_steel_grid{dir = 10},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"Rc" = (/obj/effect/floor_decal/spline/plain,/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/glass,/obj/random/cash/big{pixel_x = 5; pixel_y = 8},/obj/random/cash/big,/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/casinofloor)
+"Rf" = (/obj/machinery/casino_prize_dispenser,/obj/effect/floor_decal/spline/plain{dir = 6},/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/casinofloor)
+"Rk" = (/obj/machinery/chipmachine{pixel_y = 32},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"Rm" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"Ro" = (/obj/structure/bed/chair/sofa/brown{dir = 8},/turf/simulated/floor/carpet,/area/awaymission/lucky7/hall1)
+"Ru" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/cable/green{icon_state = "1-4"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"Rw" = (/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/water/pool,/area/awaymission/lucky7/privateroom/vip)
+"Rx" = (/obj/effect/floor_decal/spline/plain,/obj/item/weapon/stool/padded{dir = 1},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"RF" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 4; pixel_x = 27; start_charge = 0},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/five)
+"RH" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"RL" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock1)
+"RM" = (/turf/simulated/floor/carpet/purple,/area/awaymission/lucky7/privategameroom)
+"RN" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/maint1)
+"RQ" = (/obj/effect/floor_decal/rust,/obj/structure/table/rack/steel,/obj/random/tool,/obj/random/junk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"RT" = (/obj/machinery/firealarm{pixel_y = 26},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"RV" = (/obj/machinery/alarm{pixel_y = 27},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"RW" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/awaymission/lucky7/barbackroom)
+"RX" = (/obj/structure/table/woodentable,/obj/item/trash/bowl,/turf/simulated/floor/carpet,/area/awaymission/lucky7/hall1)
+"RY" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/vip)
+"RZ" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/grey/border{dir = 9},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"Sd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"Sj" = (/obj/item/weapon/stool/padded,/obj/structure/disposalpipe/junction/yjunction{dir = 8},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"Sk" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"Sl" = (/obj/machinery/door/airlock{id_tag = "L7 Room 4"; name = "Private Room 4"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/five)
+"Sm" = (/obj/effect/shuttle_landmark{base_area = /area/space; base_turf = /turf/space; docking_controller = "l7_dock_d1a2"; landmark_tag = "l7_dockarm_d1a2"; name = "Dock D1A2"},/turf/space,/area/space)
+"Sn" = (/obj/structure/bed/chair/sofa/brown{dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet,/area/awaymission/lucky7/hall1)
+"Sr" = (/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom)
+"Ss" = (/obj/structure/mirror{pixel_y = 38},/obj/structure/sink{pixel_y = 20},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/five)
+"Sv" = (/obj/effect/floor_decal/spline/plain{dir = 6},/turf/simulated/floor/water/pool,/area/awaymission/lucky7/privateroom/vip)
+"Sw" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/awaymission/lucky7/hotelhall)
+"SE" = (/obj/machinery/door/firedoor/glass/hidden/steel{dir = 8},/obj/structure/cable/green{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"SF" = (/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/grey/bordercorner,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"SG" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/two)
+"SI" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/grey/border{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/laundry)
+"SK" = (/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/glass,/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"SM" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill{pixel_x = 3},/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = -3},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"SO" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/grey/border{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/awaymission/lucky7/hotelhall)
+"SP" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"SR" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"SS" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "dock_d1a3_pump"},/obj/machinery/light/small,/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "dock_d1a3_sensor"; pixel_y = -25},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "l7_dock_d2a2"; pixel_y = 28},/obj/effect/map_helper/airlock/atmos/chamber_pump,/obj/effect/map_helper/airlock/sensor/chamber_sensor,/obj/effect/floor_decal/industrial/warning/cee{dir = 4},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2)
+"SX" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"SY" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable/green{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"SZ" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/red/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 1},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 1},/obj/structure/disposalpipe/segment{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"Ta" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/item/stack/material/phoron{amount = 6},/obj/structure/disposalpipe/segment,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Td" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/three)
+"Te" = (/obj/structure/bed/chair/wood,/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"Tf" = (/obj/structure/cable{icon_state = "0-8"},/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/power/port_gen/pacman{anchored = 1},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"Th" = (/obj/machinery/door/window/brigdoor/southleft{dir = 8; id = "L7 Cell 2"; name = "Cell 2"; req_access = list(2)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/security)
+"Tj" = (/obj/structure/bed/chair/sofa/brown{dir = 1},/turf/simulated/floor/carpet,/area/awaymission/lucky7/hall1)
+"Tk" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"Tl" = (/obj/structure/mirror{pixel_y = 38},/obj/structure/sink{pixel_y = 20},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/vip)
+"Tn" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor/eastright{dir = 2},/obj/machinery/door/firedoor/glass,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "casino_check"; opacity = 0},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"Ts" = (/obj/structure/flora/pottedplant/stoutbush,/obj/effect/floor_decal/spline/plain{dir = 6},/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/bar)
+"Tt" = (/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"Tu" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"Tv" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/vip)
+"Tx" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/effect/decal/cleanable/egg_smudge,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"Ty" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/table/marble,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"TB" = (/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/industrial/danger/corner{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"TD" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"TF" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/lightgrey/border{dir = 6},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"TH" = (/obj/machinery/door/airlock/glass,/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable/green{icon_state = "1-2"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"TI" = (/obj/machinery/door/airlock{id_tag = "L7 Room 2"; name = "Private Room 2"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/two)
+"TK" = (/obj/structure/cable/green{icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"TM" = (/obj/effect/floor_decal/borderfloorblack{dir = 8},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/gateway)
+"TP" = (/obj/machinery/light{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"TQ" = (/obj/machinery/gateway{dir = 5},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled/techfloor/grid,/area/awaymission/lucky7/gateway)
+"TR" = (/obj/structure/window/basic,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"TT" = (/obj/machinery/firealarm{dir = 4; pixel_x = 27},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/two)
+"TU" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/spline/plain{dir = 1},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"TV" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/awaymission/lucky7/dock1)
+"TW" = (/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"},/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/cable/green{icon_state = "2-8"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"TX" = (/obj/random/trash_pile,/obj/random/maintenance,/obj/effect/floor_decal/rust,/obj/structure/railing{dir = 4},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"TY" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"TZ" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 8; pixel_x = -27; start_charge = 0},/obj/structure/cable/green{icon_state = "0-4"},/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"Ub" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"Ud" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"Uf" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"Ug" = (/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"Um" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "dock_d1l"; name = "exterior access button"; pixel_x = 28; pixel_y = -6; req_access = list(13)},/obj/machinery/door/airlock/glass_external,/obj/effect/map_helper/airlock/door/ext_door,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2)
+"Ut" = (/obj/structure/table/glass,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/pen,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"Uu" = (/obj/effect/floor_decal/spline/plain{dir = 1},/turf/simulated/floor/water/pool,/area/awaymission/lucky7/privateroom/vip)
+"Uv" = (/obj/structure/cable/green{icon_state = "1-2"},/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 5},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/gateway)
+"Ux" = (/obj/machinery/firealarm{pixel_y = 26},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"UD" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/lightgrey/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"UE" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/maint1)
+"UG" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/orangedouble,/obj/machinery/alarm{dir = 8; pixel_x = 27},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/three)
+"UM" = (/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/five)
+"US" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "dock_d1l_pump"},/obj/effect/map_helper/airlock/atmos/chamber_pump,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2)
+"UW" = (/turf/simulated/wall,/area/awaymission/lucky7/trash)
+"UY" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/machinery/alarm{dir = 4; pixel_x = -27},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"Va" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/door/airlock/glass{name = "Kitchen"},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"Vd" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/button/remote/airlock{id = "L7 Room 2"; name = "Door Lock"; pixel_x = 24; pixel_y = 26},/obj/machinery/light_switch{pixel_x = 33; pixel_y = 26},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/two)
+"Vi" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/obj/machinery/vending/security{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"Vk" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{icon_state = "2-4"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"Vm" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/glass_external,/obj/effect/map_helper/airlock/door/int_door,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1)
+"Vp" = (/obj/machinery/gateway{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled/techfloor/grid,/area/awaymission/lucky7/gateway)
+"Vs" = (/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/security)
+"Vt" = (/obj/machinery/light,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"Vu" = (/obj/structure/table/glass,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/paper_bin{pixel_x = -1; pixel_y = 4},/obj/item/weapon/folder/white,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"Vv" = (/obj/effect/floor_decal/spline/plain{dir = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"Vw" = (/obj/machinery/slot_machine,/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hall2)
+"Vx" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "dock_d1a3"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/obj/machinery/door/airlock/glass_external,/obj/effect/map_helper/airlock/door/ext_door,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2)
+"Vz" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/machinery/door/firedoor/glass/hidden/steel{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"VC" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/industrial/danger{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"VD" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/greendouble,/obj/machinery/alarm{dir = 8; pixel_x = 27},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/four)
+"VO" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"VS" = (/turf/simulated/floor/plating,/area/awaymission/lucky7/trash)
+"VT" = (/obj/structure/table/bench/padded,/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge)
+"VU" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/three)
+"VV" = (/obj/effect/floor_decal/spline/plain{dir = 9},/obj/structure/flora/pottedplant/stoutbush,/turf/simulated/floor/carpet/turcarpet,/area/awaymission/lucky7/casinofloor)
+"VW" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"Wc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"Wd" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/structure/extinguisher_cabinet{dir = 8; pixel_x = 30},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"Wh" = (/obj/effect/floor_decal/borderfloorwhite{dir = 9},/obj/effect/floor_decal/corner/paleblue/border{dir = 9},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"Wi" = (/obj/effect/floor_decal/corner/lightgrey{dir = 10},/obj/effect/floor_decal/corner/lightgrey{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/machinery/vending/cigarette{dir = 4},/turf/simulated/floor/tiled/monotile,/area/awaymission/lucky7/lounge)
+"Wj" = (/obj/structure/table/rack,/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/red/border{dir = 6},/obj/item/clothing/suit/armor/bulletproof/alt{pixel_x = -6},/obj/item/clothing/suit/armor/bulletproof/alt{pixel_x = 6},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"Wm" = (/obj/structure/table/gamblingtable,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/carpet/green,/area/awaymission/lucky7/privategameroom/two)
+"Wp" = (/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"Wr" = (/obj/effect/floor_decal/borderfloorwhite{dir = 5},/obj/effect/floor_decal/corner/paleblue/border{dir = 5},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"Ws" = (/obj/effect/floor_decal/spline/plain{dir = 4},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"Wu" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"Wy" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/yellowdouble,/obj/machinery/alarm{dir = 8; pixel_x = 27},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom)
+"Wz" = (/obj/machinery/door/airlock/glass_external,/obj/effect/map_helper/airlock/door/int_door,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2)
+"WA" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"WB" = (/obj/machinery/door/firedoor/glass/hidden/steel,/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"WC" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/table/marble,/obj/random/donkpocketbox{pixel_x = 1; pixel_y = 4},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"WE" = (/obj/structure/cable/green{icon_state = "1-2"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"WG" = (/obj/effect/floor_decal/spline/plain{dir = 9},/turf/simulated/floor/water/pool,/area/awaymission/lucky7/privateroom/vip)
+"WI" = (/obj/effect/floor_decal/rust,/obj/random/maintenance,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint1)
+"WJ" = (/obj/machinery/door/airlock/glass_external,/obj/effect/map_helper/airlock/door/int_door,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1)
+"WK" = (/obj/machinery/firealarm{dir = 4; pixel_x = 27},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom)
+"WM" = (/obj/machinery/door/airlock/glass,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"WP" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"WQ" = (/obj/effect/floor_decal/borderfloorwhite{dir = 9},/obj/effect/floor_decal/corner/paleblue/border{dir = 9},/obj/structure/table/standard,/obj/item/device/healthanalyzer,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"WR" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"WU" = (/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"WV" = (/obj/structure/disposalpipe/segment,/obj/structure/catwalk,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2)
+"WX" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"WZ" = (/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom)
+"Xa" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/five)
+"Xf" = (/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/structure/table/standard,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"Xg" = (/obj/structure/table/woodentable,/obj/random/maintenance/foodstuff,/turf/simulated/floor/carpet,/area/awaymission/lucky7/hall1)
+"Xn" = (/obj/machinery/door/airlock/glass,/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"Xo" = (/obj/machinery/gateway{dir = 6},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled/techfloor/grid,/area/awaymission/lucky7/gateway)
+"Xr" = (/obj/structure/bed/chair{dir = 1},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"Xs" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/lightgrey/border{dir = 6},/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/corner/lightgrey/bordercorner2,/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+"Xw" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/table/marble,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/kitchen)
+"Xz" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 1},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"XA" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 6},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"XH" = (/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"XK" = (/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 5},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 5},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"XO" = (/obj/machinery/door/window/eastleft{req_access = null},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"XP" = (/obj/machinery/firealarm{dir = 4; pixel_x = 27},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/four)
+"XS" = (/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"XT" = (/obj/structure/table/woodentable,/obj/random/maintenance/foodstuff,/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"XU" = (/obj/structure/table/woodentable,/obj/item/pizzabox/margherita,/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"XZ" = (/obj/effect/decal/cleanable/filth,/turf/simulated/floor/lino,/area/awaymission/lucky7/bar)
+"Yb" = (/obj/structure/bed/chair,/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"Yc" = (/obj/structure/cable/green{icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"Ye" = (/obj/effect/overmap/visitable/sector/common_gateway/lucky7,/turf/space,/area/space)
+"Yj" = (/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/lightgrey/bordercorner{dir = 1},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"Yk" = (/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"Yn" = (/obj/structure/cable/green{icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop)
+"Yp" = (/obj/structure/bed/chair/wood{dir = 1},/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"Yw" = (/obj/machinery/alarm{pixel_y = 27},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall)
+"Yy" = (/turf/simulated/wall,/area/awaymission/lucky7/entry)
+"YA" = (/obj/structure/bed/chair,/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"YC" = (/obj/structure/flora/pottedplant{icon_state = "plant-21"},/obj/effect/floor_decal/borderfloorwhite{dir = 5},/obj/effect/floor_decal/corner/paleblue/border{dir = 5},/obj/machinery/alarm{dir = 8; pixel_x = 27},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"YD" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"YE" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/lightgrey/border{dir = 9},/obj/machinery/alarm{pixel_y = 27},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"YG" = (/obj/machinery/media/jukebox,/turf/simulated/floor/wood,/area/awaymission/lucky7/bar)
+"YO" = (/obj/random/soap,/obj/structure/table/standard,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom)
+"YQ" = (/obj/structure/casino_table/blackjack_m,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/floortube{dir = 1},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor)
+"YT" = (/obj/structure/cable/green{icon_state = "4-8"},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"YX" = (/turf/simulated/wall,/area/awaymission/lucky7/hall1)
+"YY" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"YZ" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/machinery/door/firedoor/glass/hidden/steel,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock2)
+"Za" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/four)
+"Ze" = (/obj/structure/table/reinforced,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/obj/item/ammo_casing/spent,/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/red/border{dir = 6},/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/corner/red/bordercorner2,/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"Zf" = (/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/lightgrey/border{dir = 5},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"Zh" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock{name = "Custodial Closet"; req_access = null},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/maint1)
+"Zi" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/security)
+"Zj" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lightgrey/border,/obj/machinery/light,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"Zu" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/lightgrey/border{dir = 9},/obj/structure/flora/pottedplant/stoutbush,/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"Zx" = (/obj/structure/bed/chair/sofa/right/purp,/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/vip)
+"ZB" = (/obj/structure/bed/chair/sofa/right/brown,/turf/simulated/floor/carpet,/area/awaymission/lucky7/hall1)
+"ZC" = (/obj/effect/floor_decal/borderfloorwhite{dir = 6},/obj/effect/floor_decal/corner/paleblue/border{dir = 6},/obj/structure/cable/green,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 4; pixel_x = 27; start_charge = 0},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical)
+"ZD" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/privateroom/five)
+"ZE" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lightgrey/border,/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"ZF" = (/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/soap/nanotrasen,/obj/structure/closet,/obj/effect/floor_decal/rust,/obj/item/weapon/storage/bag/trash,/turf/simulated/floor/tiled,/area/awaymission/lucky7/maint1)
+"ZJ" = (/obj/structure/bed/chair/sofa/brown,/turf/simulated/floor/carpet,/area/awaymission/lucky7/hall1)
+"ZK" = (/obj/structure/bed/chair/sofa/corner/brown,/turf/simulated/floor/carpet,/area/awaymission/lucky7/hall1)
+"ZL" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/awaymission/lucky7/hall1)
+"ZO" = (/obj/structure/table/steel,/obj/item/weapon/spacecasinocash/c1000{pixel_x = -3; pixel_y = -3},/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000{pixel_x = 3; pixel_y = 3},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/security)
+"ZP" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/machinery/power/apc{alarms_hidden = 1; cell_type = /obj/item/weapon/cell/apc; dir = 8; pixel_x = -27; start_charge = 0},/obj/structure/cable/green{icon_state = "0-4"},/turf/simulated/floor/carpet/blue2,/area/awaymission/lucky7/privategameroom/three)
+"ZR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable/green{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/lucky7/entry)
+"ZT" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower,/obj/effect/floor_decal/steeldecal/steel_decals5{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 10},/turf/simulated/floor/tiled,/area/awaymission/lucky7/privateroom/two)
+"ZV" = (/obj/structure/cable/green{icon_state = "1-4"},/turf/simulated/floor/wood,/area/awaymission/lucky7/privateroom/four)
+"ZW" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 10},/turf/simulated/floor/tiled,/area/awaymission/lucky7/dock1)
+
+(1,1,1) = {"
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmcpcpcpcpcprmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmcpcpagavagcpcprmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmcpagayagayagcprmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmpVpVaAaBaBaBaGpVpVrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmpVaJaQbobubububupVrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmpVbKbKbNcqbubKbKpVrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmpVcDcDbNpVbucDcDpVrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmpVcFcFbNcJbucFcLpVrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmpVbububNbububucMyYyYpbpbpbyYpbpbpbyYyYrmrmrmrmrmrmrmrmrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmpVpVcTbNbubucYpVyYdodzdEdzabdEdzdEdPyYrmrmrmrmrmrmrmrmrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmpVpVpVdSececpVpVyYameFeFeFeHeFeFeFeHpbrmrmrmrmrmrmrmrmrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmrmrmrmrmvOrmrmrmrmrmrmrmrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmgGKjypflfvfvfvfyyYadeHeHeHeHeHeHeHeHpbrmrmrmrmvOidididvOididididrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmrmrmrmrmidrmrmrmrmrmrmidrmrmrmrmrmrmrmvOidididvOvOididididvOidvOrmrmrmrmrmrmrmgGfSypgBgNgNgNgNgVgZeHeHeHeHhmhoaeeHpbrmrmrmrmrmvOrmrmrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOidididvOvOididididvOvOididididvOidvOvOididvOrmrmrmrmrmrmrmrmidrmrmvOrmrmrmvOrmrmrmrmrmrmrmrmrmrmgGKjyphuypypypypyYeHhwafhweHhmiraeeHyYrmrmrmrmrmvOrmrmrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmrmrmrmvOrmrmrmrmrmrmvOrmrmrmrmrmrmidrmrmrmrmrmrmrmrmrmvOrmrmvOrmrmrmvOrmrmrmrmrmrmrmrmrmrmgGgGgGTuypypgGgGgGgGgGgGgGgGgGgGgGgGgGgGgegegegGgGgGrmrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmrmMwMwMwMwMwMwMwMwMwMwYXYXYXYXYXrmvOrmrmrmrmrmrmrmrmrmidrmUWUWUWUWUWUWUWUWrmrmrmrmrmrmrmrmgGdwitiBypypypypypypypTkypypypypypTkypypypypypypjbgGvOvOvOidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmrmMwmDoqaatVucueASKaMwZuZLuLlBYXrmvOrmrmrmrmrmrmrmrmrmvOrmUWjejljKjVVSkeUWrmrmrmrmrmrmrmrmgekxkxmOgNgNgNgNgNgNgNopgNgNgNgNgNopgNgNgNgNgNqHkFgGrmrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmrmMwcKcbbfTQiETMuEUvEIzpYkYkobYXrmidrmrmrmrmrmrmrmrmrmidrmUWkJkNlhlilpVSUWrmrmrmrmrmrmrmrmgelwlwTuypypypypypypypMZypypypypypMZypypypypypMZjbgGrmrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOvOidididvOidMweSVpMyrbGATMuEbchMYTFFYkCDYXvOidvOidididvOididvOididrmUWrxmNkeHzmTFWUWrmrmrmrmrmrmrmrmgemXmXTuypypnhnhbpbpbpnEbpbpGJGJGJnMGJGJfHfHfHohfHfHfHrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmrmMwDpOgmHXoiETMuEvfEIHWWEYkobYXrmrmrmrmrmvOrmrmrmrmvOvOvOUWVSmNkJLgskiGUWrmrmrmrmrmrmrmrmgGypypTuypypLEVwbppsRMpyRMRMGJMefNpBfNfNfHPyFrqdFrFrfHvOididrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmrmMwrfEMiZEMsUpAHgrKMwWRWEYkobYXrmrmrmrmrmvOrmrmrmrmvOrmrmUWVSmNqkUWoFmIUWrmrmrmrmrmrmrmrmgGypypTuypypvyvybpRMrepNreRMGJfNDnlZDnfNfHFrItLAItFrfHrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmrmDiDiDiDiDiDiDiDiDiDinAWEYkJLsTsTsTsTsTsTsTsTsTsTsTsTsTsTsTUWrAUWUWUWUWUWqFNlNlNlqFqFqFqFqFkxkxTuypypnhnhbpMdCGAGscsqGJTZnvWmxtwTfHZPQttYlLYYfHrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmrmDisHsSsZsZtdtvtHtMDiWRWEYkupsTeruyuzuIrprMsThhhhjPFNuOuvhhhhvavksTvNvTsTvUwbwewkwtqFImbXqFwGlwTuypypLEVwbpwLscQascxdGJNVxtqMxtrBfHLhlLtZlLwlfHrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOvOvOvODixqyoyHCCCCCCzazgSXzpWEYkobsTGSzqzEaWzRzYAxQKQKQKQKQKAFAFQKAXAFAxQKBeBmBEBHBTBVCiCnruCoqFmXmXTuypypvyvybprUscscscsqGJqYxtxtxtwTfHpPlLlLlLYYfHrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmididvOididrmvOrmDiCMCUCWCZCCCCDHYnEtXSEBYkCDsTcmECESEWFKFTsTFUFYhhFZhhFNjPGiGiGisThhWVsTSrGzKLSraYqFGRHaqFypypTuypypypypbpRMHbHfHbRMGJfNNIoHNIfNfHFrHAHBHAFrfHvOidHFrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmrmrmvOrmDixqCCCCCCCCHJCCHMSXHWJzXSJPJUKiKnbDKwKxKIkDkDkDKNKNKNKNKNKShhKYsThhGrsTqFLjqFqFqFqFqFqFqFmKmKOwmVmVmKmKbpbpbpbpbpbpGJGJGJGJGJGJfHfHfHfHfHfHfHrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmrmvOrmrmrmrmvOrmDiaXLrLxLBLFMaMmMsDiMEMGYkMJsTMVMXMYNdNyNFkDQCNRNTOtOBOOKNPcOWPnsTjPLiKfPqPsPTPVQmQoGsQGKfmVQMOwmVmVkVmVQRmVQVRcRfmVRkmVkVRTRVmVmVmVmVkVmVmVmKrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmKlKlNYNYNYKlKlKlKlKlKlKlKlKlKlKlYXYXsoSEWBsoYXYXYXYXSRTaTfkDyOyOThDhDhDhKNKNKNKNKNhhLiKfTyUbUdUfUgUgUgUgVamVVkahmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVVVrjrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmKlWhWpWpWpWrKlWQXfXHXOWpYbYAYCKlYEalXzMGYkZfZBZJZKYXsTaRsTkDyOZiKNKNKNKNKNZOKuHZKNFaLiKfeYUgKmnCUgUgUgTxKfmwkQsiHmHmfcmVmVmVmVmVmVmVmVmVmVaVJNmVmVuFanmVmVfUrjrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmKlHxJpeaInDYWpIkWUWUUtWUWUWUXKfMzpYkYkMGYkobGXXgSnYXKRyXzVkDyOpHNTNbOBOOKNEzVsHZKNuAGrKfKfCpKfKfUgbyPkUgXwmVkQsijxbCfcPJmKWXmVrThDPJmKWXmVmVmVmVmVmVmVmVmVaqrjrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidvOvOKlzvWUWUWUWUWUWUWUNGenWUWUWUYcQgXSzQXSSPYkRHGXGXRoYXKRsMRQkDyOyOuJDhDhDhKNJcVsHZKNhhGrKfczlSlSKfUgSMWCUgXwmVkQVWmVmVmVmVmVmVngbPhDmVmVmVmVmVmVmVmVmVmVmVmVmVmKrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmKlLlRbsgpkPGgUNJWUWUVuWUWUWUmqfMHWJCYkWEYkobGXRXSnYXxLyXxbkDyOZiKNKNKNKNKNKNQrKNKNuvGrKfmulSnNKfkOIMapUgyRmVkQsiHmqAfcmVmVmVmVqShDmVmVmVmVaVJNmVmVxHuYmVmVPJmKrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmKlnDAWLCgUasKlkvQUxrGPgUygXrZCKldnarqUWEYkMJdCTjwYYXBiIwFNkDyOyOUxPFOfyOLsSZQvtQkDNiGrKftelSejKfTxUgUgUgKfWXkQsiHmNSfcmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVrjrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmKlKlFtKlKlKlKlKlKlKlKlKlKlKlKlYyYyYykmFwuakmkmkmYyYysTemsTYyiVyOyOyOChyOPIyOyOOkkDsTEOKfKfKfKfKfVaKfXwKfKfNzkQVWmVmVmVPJmKWXmVmVmVPJmKWXmVmVmVmVmVmVmVmVmVmVrjrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmKlGQfZDPDPDPKlkswowomowowoBKwokmxmOjybykazPEOjOjcNddOjBMQsYykDChkDkDkDCkPIQCyOVikDTXLiJBtmAQnnJBCQVvrZDbkLvukQsiNSHmfcmVmVmVmVmVmVmVmVmVmVaVJNmVmVxHaumVmVmVrjrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOidvOidvOvOKlfZjvfZfZfZKloPwoTeTeTewooDlIvoISISISTKTtTtTtTtTtTtTtWuIsYyiMyOawLLkDQzpMoTaxLqkDLeaoQiPPibogKGOMOAhSOALNtokQsiHmLofcmVmVmVMgaUaCdWdWdWdWdWdWdWdWdWdWdWdWnjmKrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmKlKlKlKlKlKlKlwowoDGMbxvwowowokmhFZEZEZjZEZEZEZEZjZEUDxzeGYynqyOyOJwkDTYmppXyOeLkDjPhhJBRWogBAJBwwOAdaOAtEJEkQVWmVmVmVmVmVmVFvaEhDmVmVmVmVmVmVmVmVmVmVmVmVPJmKrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmBfVTVTiywowoBfQdwovZvZvZwowoHSluluFJlulululululululuCECIVzYyLIaFyOZekDFLmpxUIqWjkDFZhhJBkPrNEFJBhNXZOAOAhSJEkQsiHmLUfcPJmKWXVWqShDPJmKWXmVmVngvRmVmVmVrThDmVrjrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmBfbabaVTwowoNowowowowowowowoPXlufbxZBWfbAJpOluqwArluETxzPjYykDgiTnkDkDkDpekDkDkDkDsTmdJBJBJBJBJBNawdHnLNhSJEkQsizMHmfcmVQRmVVWmVmVmVRkmVmVmVngnahDmVngaEhDmVrjrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmBfqLbaVTwowoNowowoTeTeTewowoDxluAJepmWepepxZFJxZxKluETxzaznlTBVCVCJgOjybxzPEOjYjrwzxzxDQMAsXTsYGDmRxRxRxRxhnkQVWmVmVmVmVmVmVVWmVmVmVmVmVmVmVngaImVmVmVqShDmVrjrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOidvOvOBfbabaVTwowoNowowossMbDGwowoMcluWIeplumtcRIvluepepluONaKTtXnTtTtTtTtTtTtHlTtTtTtDvuZuZNguZuZuZuZuZuZuZuZuZBshidGTRTRTRTRWcWcSjmVmVbjbjbjbjbjmVmVmVYDmVmVmVatmKrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmBfVTVTnRwowoBfQdwovZvZvZwowoHSlulupLlululululutsjcjpduaLaznlbLZEZjZEZEZEZEZjZEUDrwzxzxzxzxzxzxzxzxzxzxzxzxPamVOTOTOTOTOTmVKEYQaMmVOTOTOTOTOTmVmVKEvxaMmVmVjJmKrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmBfBfBfBfBfBfBfwowowowowowowowolusmoVlubxhcHHlubERmluipSYaNYyYyYyYyYyYyYyYyYyYyYyFuzxGfGfGfzxGfGfGfzxGfGfGfPamVxMxMxMxMxMmVlnOllnmVxMxMxMxMxMmVmVlnlnlnmVmVVVrjrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmvOvOvOvOBfWiOxwoPQMteowowokpMQludFoEZhFVRNBalumhgSlugxSYeGYyvOvOvOrmrmrmrmrmvOvOFutDXUuHfizxfiSKXTzxfiuHqGPamVbjbjbjbjbjmVmVJqmVmVbjbjbjbjbjmVmVbjbjbjmVmVrnrjrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOidididvOidvOYyYyYyBfMqOxwoDGMbyABQwonpwoludrUEluZFaPmJlukaCRluETSYeGYyvOrmvOrmrmrmrmvOvOrmFuilYpYpYpzxYpYpYpzxYpYpYpPamVOTOTOTOTOTmVmVJqmVmVOTOTOTOTOTmVmVOTOTOTmVmVaqrjrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmYyYydgfXBfBfBfBfqNqNqNBfyzNCBfluluyZlulululululululuCExJVzYyididvOidididvOidvOidFulmzxzxzxApzxzxzxApzxzxzxWsxCxMxMxMxMxMxCmVJqmVxCxMxMxMxMxMxCmVxMxMxMxCmVmVmKrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmYygrivivGniAOjOmmRmRmRAPazsVufaSiAcIOmLOgamROmOjGnOjYjSYeGYyrmrmvOrmrmrmvOrmrmrmFuFuClClClFuClClClFuClClClFuOPOPOPOPOPOPGjeUTDeUGjmKmKmKmKmKmKmKmKmKmKmKmKmKmKrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOidididvOYyONiJjdNrjrNcNcNcNcNrNrNrKHNrGVsvNqZRZRZRZRZRZRZRZRZRDDIsYyrmrmidrmrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmOPRZqWBqAUywGjeUTDeUGjrmrmvOrmrmrmrmrmrmrmrmvOrmrmrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmYyjBkbkcZEfuZEZEZEZjZEZEZEZEZEZEfuZEZEkzZEZEZEZEZEZEZEGTTFYyvOidvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmSkSINNosmvFmGjeUTDeUSwrmrmvOrmrmrmrmrmrmrmrmidrmrmrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmgLlqmLmSgLgLVOVOVOgLYykmkmkmYyYykmkmkmYyYykmkmkmYyxnWMTHWMxnrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmSkSIsBosCbMhGjeUTDeUSwrmididididididvOvOidididvOidvOvOidvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmgLnsWAnSgLrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmxnajDOjHxnrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmrmrmrmrmSkSINNosolINGjeUTDeUSwrmrmrmrmrmrmvOrmvOrmrmidrmrmrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmVOnXWAoGVOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmOCzKGhLYOCrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmrmrmrmrmOPcOaOosSFrgGjeUTDeUGjrmrmrmrmrmrmvOGjGjGjGjvOrmrmrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmVOnXWAoGVOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmOCzKGhLYOCrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmGjGjGjGjGjGjMnFGSOGjGjeUTDeUGjGjGjGjGjGjGjGjGjQpqgGjGjGjGjrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmVOnXWAoGVOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmOCzKGhLYOCrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmcHvOvOGjAYeUeUeUeUNmCNTUeUvbeUTDeUvbeUeUeUvdYweUakaTNmNmvbeUfOGjrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmgLspWAttgLrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmxneVGhfAxnrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmGjoYGOIgIgIgCORuDSIgCOIgJRIgTWIgIgIgTWIgIgSdFleUeUeUeUdfGjvOvOidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmVOnXWAoGVOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmOCzKGhLYOCrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmGjAYTDeUVteUTDeUeUeUTDeUVteUTDeUeUeUTDeUVteUTDeUeUeUeUfOGjrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmVOnXWAoGVOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmOCzKGhLYOCrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOididcHvOvOhOhOfDhOuuuuTIuuKKKKeWKKuRuRKMuRDLDLSlDLLwLwEiLwLwLwLwLwLwrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmVOnXWAoGVOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmOCzKGhLYOCrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmhOjMHQKtuuDwVdyvKKoSPCIJuRaiwqwKDLzHNDIuLwoAGmqsuBoAIjoALwrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmgLuxwjwvgLrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmxnYZOqqzxnrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmhOjChUfTuuCmoOJyKKENnzghuRccxFbnDLJWXaKCLwffOJZxorkdkdLyLwrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmVOnXWAoGVOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmOCzKGhLYOCrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmhODgGgiauuOonYMoKKdytzjQuRKAZVPuDLmCIFRFLwOaOJpnlxkdkdqvLwrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmVOnXWAoGVOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmOCzKGhLYOCrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmhOtpcrWyuusQcnLJKKTdvgUGuRAbNQVDDLtGUMeyLwjAcGKZyykdkdGkLwrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmVOnXWAoGVOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmOCzKGhLYOCrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidvOvOhOcrcrWKuucncnTTKKvgvgzWuRNQNQXPDLUMUMkyLwoAoAoAoAoAJjvqLwvOvOidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmgLspWAwJgLrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmxneVGhyDxnrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmhOuGhOhOuuGeuuuuKKpEKKKKuRFduRuRDLICDLDLLwRYLwLwLwLwLwLwLwrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmzkububDFDRWAQqDTubgfAmrmrmrmrmrmrmrmrmrmrmrmrmrmrmkhiuiujoWPGheteiiubhbHrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmhOWZwuwCuuPNevAOKKtrjWeduRyiyfDkDLdZSsJdLwOuTlGpAKWGUuDILwrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmDZrmHtJKKTVmOrtJvrEsbeEeMkrmSmrmrmrmrmrmrmrmrmrmrmrmrmprbtlFnKAyKUCuEwGESSVxrmcVrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmhOQDWZWZuuSGPNPNKKVUtrtruRZayiyiDLZDdZdZLwTvOuOuAKeCRwqBLwrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmPwRLRLDFTPWAOIDTRLaHTVrmrmrmrmrmrmrmrmrmrmrmrmrmrmjNMfMfjoOEGhXAeiMfNLgDrmrmrmrmrmrmrmrmrmrmrmrmrmididvOvOhOWZYOfQuuPNIRZTKKtrbBANuRyivtaDDLdZCfhyLwIrOuOuAKeCjSbwLwrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmgLUYWAWdgLrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmxnOSGhLVxnrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmhOhOhOhOuuuuuuuuKKKKKKKKuRuRuRuRDLDLDLDLLwTvOuOuAKeCjSqBLwvOvOvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmVOnXWAoGVOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmOCzKGhLYOCrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmrmrmrmrmvOrmrmrmvOrmrmrmvOrmrmrmvOrmvOrmLwOuOuxNAKFpjqSvLwrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmVOnXWAoGVOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmOCzKGhLYOCrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmrmvOrmrmrmvOrmrmrmvOrmidvOLwLwLwLwLwLwLwLwLwrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmVOZWWAoGVOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmOCfxGhLYOCrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOididlEidididcHidvOvOcHidvOidcHididrmrmvOrmrmrmrmrmvOrmrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmgLjIWAXsgLrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmxnAvGhdXxnrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmrmidrmrmrmrmrmrmrmrmrmvOididcHvOididvOidcHididvOvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmgLwcWJDFgLrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmxnWzmbjoxnrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmrmrmrmrmrmrmrmidrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmKknwacezrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmtcKsxhgHrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmKkPmzrezrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmtcUShIgHrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmhqmELkmQrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmFjjtUmzDrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmqtrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmYeFQrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm
+"}
diff --git a/maps/gateway_vr/snowfield.dmm b/maps/gateway_vr/snowfield.dmm
index 7292de11f1b..1912a569925 100644
--- a/maps/gateway_vr/snowfield.dmm
+++ b/maps/gateway_vr/snowfield.dmm
@@ -1188,7 +1188,7 @@
/turf/simulated/floor/tiled/dark,
/area/awaymission/snowfield/base)
"ds" = (
-/obj/structure/closet/fireaxecabinet{
+/obj/structure/fireaxecabinet{
pixel_y = 32
},
/turf/simulated/floor/tiled/dark,
diff --git a/maps/gateway_vr/variable/arynthilake_a.dmm b/maps/gateway_vr/variable/arynthilake_a.dmm
index afc16589d3b..41a8be8f090 100644
--- a/maps/gateway_vr/variable/arynthilake_a.dmm
+++ b/maps/gateway_vr/variable/arynthilake_a.dmm
@@ -1143,16 +1143,16 @@
/obj/random/meat,
/obj/random/meat,
/obj/random/meat,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
diff --git a/maps/gateway_vr/variable/arynthilake_b.dmm b/maps/gateway_vr/variable/arynthilake_b.dmm
index bbba59342e4..53c799bac41 100644
--- a/maps/gateway_vr/variable/arynthilake_b.dmm
+++ b/maps/gateway_vr/variable/arynthilake_b.dmm
@@ -157,16 +157,16 @@
/obj/random/meat,
/obj/random/meat,
/obj/random/meat,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
diff --git a/maps/gateway_vr/wildwest.dm b/maps/gateway_vr/wildwest.dm
index e697c3812db..2260db08ed0 100644
--- a/maps/gateway_vr/wildwest.dm
+++ b/maps/gateway_vr/wildwest.dm
@@ -125,7 +125,7 @@
if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey))
for(var/mob/O in viewers(world.view, src.loc))
- to_chat(O, "[M] triggered the [bicon(src)] [src]")
+ to_chat(O, "[M] triggered the \icon[src][bicon(src)] [src]")
triggered = 1
call(src,triggerproc)(M)
@@ -187,7 +187,7 @@
in_space = 1
unknown_state = "field"
known = FALSE
-
+
skybox_icon = 'icons/skybox/anomaly.dmi'
skybox_icon_state = "shimmer_r"
skybox_pixel_x = 0
diff --git a/maps/gateway_vr/wildwest.dmm b/maps/gateway_vr/wildwest.dmm
index 2a42bcc14f0..12a79c33ecc 100644
--- a/maps/gateway_vr/wildwest.dmm
+++ b/maps/gateway_vr/wildwest.dmm
@@ -676,9 +676,9 @@
/area/awaymission/wwmines)
"fb" = (
/obj/structure/closet/secure_closet/freezer/kitchen,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
/turf/simulated/floor/tiled/eris/cafe,
/area/awaymission/wwmines)
"fc" = (
diff --git a/maps/groundbase/eastwilds/eastwilds1.dmm b/maps/groundbase/eastwilds/eastwilds1.dmm
index 28b038004a4..fc499a60956 100644
--- a/maps/groundbase/eastwilds/eastwilds1.dmm
+++ b/maps/groundbase/eastwilds/eastwilds1.dmm
@@ -29,6 +29,12 @@
"r" = (
/turf/simulated/mineral/cave/virgo3c,
/area/submap/groundbase/wilderness/east/cave)
+"u" = (
+/obj/effect/landmark{
+ name = "carpspawn"
+ },
+/turf/simulated/floor/water/deep/virgo3c,
+/area/submap/groundbase/wilderness/east)
"w" = (
/obj/effect/map_effect/portal/master/side_a/gb_wilds/east_west{
dir = 8
@@ -38,6 +44,12 @@
"y" = (
/turf/simulated/mineral/ignore_cavegen,
/area/submap/groundbase/wilderness/east)
+"B" = (
+/obj/effect/landmark{
+ name = "carpspawn"
+ },
+/turf/simulated/floor/water/virgo3c,
+/area/submap/groundbase/wilderness/east)
"F" = (
/turf/simulated/floor/outdoors/grass/virgo3c,
/area/submap/groundbase/wilderness/east/unexplored)
@@ -2383,7 +2395,7 @@ U
U
U
U
-U
+u
U
U
U
@@ -2653,7 +2665,7 @@ U
U
U
U
-U
+u
U
U
U
@@ -2972,7 +2984,7 @@ U
U
U
U
-U
+u
U
U
U
@@ -3421,7 +3433,7 @@ U
U
U
U
-U
+u
U
U
U
@@ -3513,7 +3525,7 @@ U
U
U
U
-U
+u
U
U
U
@@ -4779,7 +4791,7 @@ Z
U
U
U
-U
+u
U
U
U
@@ -4839,7 +4851,7 @@ Z
Z
Z
U
-U
+u
U
U
U
@@ -5212,7 +5224,7 @@ U
U
U
U
-U
+u
U
U
U
@@ -5245,7 +5257,7 @@ Z
Z
U
U
-U
+u
U
U
U
@@ -5414,7 +5426,7 @@ U
U
U
U
-U
+u
Z
Z
Z
@@ -6518,7 +6530,7 @@ F
V
V
Z
-Z
+B
Z
Z
Z
@@ -6908,7 +6920,7 @@ Z
Z
Z
Z
-U
+u
U
U
U
@@ -6971,7 +6983,7 @@ U
U
U
U
-U
+u
U
U
Z
@@ -8192,7 +8204,7 @@ U
U
U
U
-U
+u
U
U
U
@@ -8245,7 +8257,7 @@ U
U
U
U
-U
+u
U
U
U
@@ -9461,7 +9473,7 @@ r
r
Z
Z
-Z
+B
Z
U
U
@@ -10186,7 +10198,7 @@ U
U
U
U
-U
+u
U
U
Z
@@ -10322,7 +10334,7 @@ U
U
U
U
-U
+u
U
U
U
@@ -10374,7 +10386,7 @@ U
U
U
U
-U
+u
U
U
U
@@ -11219,7 +11231,7 @@ Z
U
U
U
-U
+u
U
U
U
@@ -11373,7 +11385,7 @@ U
U
U
U
-U
+u
U
Z
Z
@@ -11476,7 +11488,7 @@ U
U
U
U
-U
+u
U
U
U
@@ -12337,7 +12349,7 @@ U
U
U
U
-U
+u
U
U
U
@@ -12456,7 +12468,7 @@ Z
Z
Z
U
-U
+u
U
U
U
@@ -12778,7 +12790,7 @@ U
U
U
U
-U
+u
U
U
U
@@ -13757,7 +13769,7 @@ Z
Z
U
U
-U
+u
U
U
U
@@ -13767,7 +13779,7 @@ Z
Z
Z
Z
-Z
+B
Z
Z
Z
@@ -15893,7 +15905,7 @@ V
V
V
Z
-Z
+B
Z
Z
Z
diff --git a/maps/groundbase/eastwilds/eastwilds2.dmm b/maps/groundbase/eastwilds/eastwilds2.dmm
index fdd0dfdc349..33a58e58c2b 100644
--- a/maps/groundbase/eastwilds/eastwilds2.dmm
+++ b/maps/groundbase/eastwilds/eastwilds2.dmm
@@ -37,6 +37,12 @@
},
/turf/simulated/floor/water/deep/virgo3c,
/area/submap/groundbase/wilderness/east)
+"B" = (
+/obj/effect/landmark{
+ name = "carpspawn"
+ },
+/turf/simulated/floor/water/deep/virgo3c,
+/area/submap/groundbase/wilderness/east)
"F" = (
/turf/simulated/floor/outdoors/grass/virgo3c,
/area/submap/groundbase/wilderness/east/unexplored)
@@ -46,6 +52,12 @@
},
/turf/simulated/floor/outdoors/grass/forest/virgo3c,
/area/submap/groundbase/wilderness/east)
+"I" = (
+/obj/effect/landmark{
+ name = "carpspawn"
+ },
+/turf/simulated/floor/water/virgo3c,
+/area/submap/groundbase/wilderness/east)
"V" = (
/obj/effect/map_effect/portal/master/side_b/gb_wilds/east{
dir = 4
@@ -949,7 +961,7 @@ Z
Z
Z
t
-t
+B
t
t
Z
@@ -3082,7 +3094,7 @@ l
l
Z
Z
-Z
+I
t
t
t
@@ -5071,7 +5083,7 @@ Z
Z
Z
Z
-Z
+I
n
n
F
@@ -5917,7 +5929,7 @@ F
n
Z
Z
-Z
+I
Z
Z
Z
@@ -6912,7 +6924,7 @@ t
t
t
t
-Z
+I
Z
Z
Z
@@ -7225,7 +7237,7 @@ Z
t
t
t
-t
+B
t
t
t
@@ -7515,7 +7527,7 @@ t
t
Z
Z
-Z
+I
Z
n
n
@@ -8044,7 +8056,7 @@ Z
Z
Z
Z
-t
+B
t
t
t
@@ -8128,7 +8140,7 @@ n
n
Z
Z
-Z
+I
Z
Z
Z
@@ -8341,7 +8353,7 @@ t
t
t
t
-Z
+I
Z
Z
Z
@@ -8695,7 +8707,7 @@ Z
Z
t
t
-t
+B
t
t
t
@@ -8904,7 +8916,7 @@ t
t
Z
Z
-Z
+I
Z
Z
Z
@@ -8992,7 +9004,7 @@ t
t
t
t
-t
+B
Z
Z
Z
@@ -9067,7 +9079,7 @@ n
n
Z
Z
-Z
+I
t
Z
Z
@@ -9412,7 +9424,7 @@ t
t
t
t
-t
+B
t
t
t
@@ -9689,7 +9701,7 @@ n
Z
Z
Z
-Z
+I
t
t
t
@@ -10688,7 +10700,7 @@ Z
t
t
t
-t
+B
t
t
t
@@ -11336,7 +11348,7 @@ n
n
n
Z
-Z
+I
Z
n
n
@@ -11513,7 +11525,7 @@ t
t
t
t
-t
+B
t
t
t
@@ -11532,7 +11544,7 @@ Z
Z
t
t
-t
+B
t
t
t
@@ -12521,7 +12533,7 @@ t
t
t
t
-t
+B
t
t
t
@@ -12787,7 +12799,7 @@ t
t
t
t
-t
+B
t
t
t
@@ -13531,7 +13543,7 @@ t
t
t
t
-t
+B
t
Z
Z
@@ -13953,7 +13965,7 @@ t
t
t
t
-t
+B
t
t
t
@@ -14303,7 +14315,7 @@ Z
Z
Z
Z
-Z
+I
Z
Z
Z
@@ -14620,7 +14632,7 @@ n
n
Z
Z
-Z
+I
Z
Z
Z
@@ -14644,6 +14656,7 @@ Z
Z
Z
t
+B
t
t
t
@@ -14655,8 +14668,7 @@ t
t
t
t
-t
-t
+B
t
t
t
@@ -16027,7 +16039,7 @@ Z
Z
Z
Z
-Z
+I
Z
Z
Z
@@ -16081,6 +16093,7 @@ t
t
t
t
+B
t
t
t
@@ -16090,8 +16103,7 @@ t
t
t
t
-t
-t
+B
t
t
t
@@ -16352,7 +16364,7 @@ Z
Z
t
t
-t
+B
t
t
t
@@ -16937,7 +16949,7 @@ t
t
t
t
-t
+B
t
t
t
@@ -17085,7 +17097,7 @@ t
t
t
t
-t
+B
Z
Z
Z
diff --git a/maps/groundbase/gb-centcomm.dmm b/maps/groundbase/gb-centcomm.dmm
index bf2655e628d..5e79cb7dc54 100644
--- a/maps/groundbase/gb-centcomm.dmm
+++ b/maps/groundbase/gb-centcomm.dmm
@@ -161,8 +161,8 @@
/area/centcom/control)
"aG" = (
/obj/structure/table/rack,
-/obj/item/weapon/gun/energy/gun/martin,
-/obj/item/weapon/gun/energy/gun/martin,
+/obj/item/weapon/gun/energy/gun/compact,
+/obj/item/weapon/gun/energy/gun/compact,
/obj/item/device/flash,
/obj/item/device/flash,
/turf/simulated/floor/tiled{
@@ -710,8 +710,8 @@
/area/centcom/terminal)
"cv" = (
/obj/structure/table/rack,
-/obj/item/weapon/gun/energy/gun/martin,
-/obj/item/weapon/gun/energy/gun/martin,
+/obj/item/weapon/gun/energy/gun/compact,
+/obj/item/weapon/gun/energy/gun/compact,
/obj/item/device/flash,
/obj/item/device/flash,
/turf/simulated/floor/tiled/dark,
diff --git a/maps/groundbase/gb-z1.dmm b/maps/groundbase/gb-z1.dmm
index 2335d3a264b..869d267d54a 100644
--- a/maps/groundbase/gb-z1.dmm
+++ b/maps/groundbase/gb-z1.dmm
@@ -53,6 +53,13 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/civilian/bar)
+"ag" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/machinery/alarm,
+/turf/simulated/floor,
+/area/maintenance/groundbase/substation/aiciv)
"ah" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -98,11 +105,8 @@
/turf/simulated/floor,
/area/maintenance/groundbase/trashpit)
"an" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 6
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
+/turf/simulated/wall/r_wall,
+/area/groundbase/command/tcomms/chamber)
"ao" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
@@ -335,6 +339,18 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/engineering/atmos/monitoring)
+"aN" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/firealarm{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/maintenance/groundbase/substation/aiciv)
"aO" = (
/obj/machinery/atmospherics/pipe/simple/hidden/purple{
dir = 9
@@ -372,6 +388,18 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/or1)
+"aU" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 8
+ },
+/mob/living/simple_mob/vore/alienanimals/catslug/custom/engislug{
+ ghostjoin = 1
+ },
+/turf/simulated/floor/tiled,
+/area/groundbase/engineering/lobby)
"aV" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/light_switch{
@@ -395,6 +423,18 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/equipment)
+"aY" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 8
+ },
+/mob/living/simple_mob/vore/alienanimals/catslug/custom/gatslug{
+ ghostjoin = 1
+ },
+/turf/simulated/floor/tiled/dark,
+/area/groundbase/security/lobby)
"aZ" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/hidden/black{
@@ -455,6 +495,16 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/lhallway)
+"bk" = (
+/obj/structure/bed/chair/office/dark,
+/obj/machinery/button/windowtint/multitint{
+ id = "detoffice";
+ pixel_x = -15;
+ pixel_y = -30
+ },
+/obj/effect/landmark/start/detective,
+/turf/simulated/floor/carpet,
+/area/groundbase/security/detective)
"bl" = (
/obj/machinery/power/apc,
/obj/structure/cable/yellow,
@@ -486,6 +536,14 @@
outdoors = 0
},
/area/groundbase/security/lobby)
+"bq" = (
+/obj/machinery/vending/wardrobe/atmosdrobe,
+/obj/machinery/atmospherics/unary/vent_pump/on,
+/obj/structure/sign/scenery/fakefireaxe{
+ pixel_y = 32
+ },
+/turf/simulated/floor/tiled,
+/area/groundbase/engineering/atmos/monitoring)
"br" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 6
@@ -525,6 +583,12 @@
/obj/structure/disposalpipe/segment,
/turf/simulated/floor/outdoors/sidewalk/virgo3c,
/area/groundbase/level1/westspur)
+"bw" = (
+/obj/structure/closet/toolcloset,
+/obj/item/weapon/pickaxe,
+/obj/item/weapon/chainsaw,
+/turf/simulated/floor/tiled,
+/area/groundbase/engineering/workshop)
"bx" = (
/obj/structure/table/reinforced,
/obj/item/device/floor_painter,
@@ -575,12 +639,18 @@
/obj/machinery/alarm{
dir = 4
},
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
+/turf/simulated/floor,
+/area/maintenance/groundbase/substation/medcargo)
"bC" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/tiled,
/area/groundbase/security/processing)
+"bD" = (
+/obj/structure/closet/secure_closet/engineering_electrical/double,
+/obj/item/clothing/gloves/yellow,
+/obj/item/clothing/gloves/yellow,
+/turf/simulated/floor/tiled,
+/area/groundbase/engineering/workshop)
"bE" = (
/obj/structure/cable/yellow{
icon_state = "0-8"
@@ -619,9 +689,34 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/armory)
+"bH" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/machinery/light,
+/obj/structure/closet/secure_closet/engineering_welding/double,
+/turf/simulated/floor/tiled,
+/area/groundbase/engineering/workshop)
+"bI" = (
+/obj/machinery/porta_turret/stationary,
+/turf/simulated/floor/bluegrid{
+ name = "Mainframe Base";
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"bJ" = (
/turf/simulated/floor/outdoors/newdirt_nograss/virgo3c,
/area/groundbase/level1/eastspur)
+"bK" = (
+/turf/simulated/floor/bluegrid{
+ name = "Mainframe Base";
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"bL" = (
/obj/machinery/vending/loadout/accessory,
/obj/item/device/radio/intercom{
@@ -650,6 +745,15 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/civilian/womensrestroom)
+"bN" = (
+/obj/machinery/camera/network/command,
+/turf/simulated/floor/bluegrid{
+ name = "Mainframe Base";
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"bO" = (
/obj/structure/table/bench/steel,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -680,6 +784,14 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/office)
+"bR" = (
+/obj/machinery/telecomms/hub/preset/groundbase,
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"bS" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 8
@@ -689,22 +801,13 @@
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/office)
"bT" = (
-/obj/machinery/atmospherics/unary/vent_pump{
- dir = 8;
- external_pressure_bound = 140;
- external_pressure_bound_default = 140;
- icon_state = "map_vent_out";
- pressure_checks = 0;
- pressure_checks_default = 0;
- use_power = 1
- },
-/turf/simulated/floor/bluegrid{
- name = "Mainframe Base";
+/obj/machinery/telecomms/server/presets/common,
+/turf/simulated/floor/tiled/dark{
nitrogen = 100;
oxygen = 0;
temperature = 80
},
-/area/groundbase/command/tcomms)
+/area/groundbase/command/tcomms/chamber)
"bU" = (
/obj/machinery/light{
dir = 8
@@ -712,10 +815,24 @@
/turf/simulated/floor/wood,
/area/groundbase/civilian/gameroom)
"bV" = (
-/obj/machinery/light{
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
dir = 1
},
-/turf/simulated/floor/lino,
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 1
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ icon_state = "pipe-c"
+ },
+/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
+/area/groundbase/level1/northspur)
+"bW" = (
+/obj/structure/bed/chair/wood,
+/turf/simulated/floor/wood,
/area/groundbase/civilian/cafe)
"bX" = (
/obj/structure/cable/yellow{
@@ -760,11 +877,13 @@
/turf/simulated/floor/tiled,
/area/groundbase/engineering/engine)
"cc" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 8
+/obj/machinery/telecomms/broadcaster/preset_right/groundbase,
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
},
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
+/area/groundbase/command/tcomms/chamber)
"cd" = (
/obj/structure/grille,
/obj/machinery/door/firedoor/glass,
@@ -796,14 +915,13 @@
/turf/simulated/floor/tiled,
/area/groundbase/engineering/techstorage)
"ch" = (
-/obj/machinery/atmospherics/binary/passive_gate/on{
- dir = 8
+/obj/machinery/pda_multicaster/prebuilt,
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
},
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
+/area/groundbase/command/tcomms/chamber)
"ci" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/tiled/dark,
@@ -839,6 +957,14 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/equipment)
+"cm" = (
+/obj/machinery/telecomms/receiver/preset_right/groundbase,
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"cn" = (
/obj/structure/table/reinforced,
/obj/item/device/retail_scanner/security,
@@ -885,9 +1011,17 @@
/obj/random/tech_supply,
/obj/random/tech_supply,
/obj/random/tech_supply,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/tiled,
/area/groundbase/civilian/toolstorage)
+"cr" = (
+/obj/machinery/telecomms/server/presets/command,
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"cs" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -897,9 +1031,26 @@
/turf/simulated/floor/tiled/techfloor/grid,
/area/groundbase/command/ai/robot)
"ct" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
+/obj/machinery/atmospherics/unary/vent_pump{
+ dir = 4;
+ external_pressure_bound = 0;
+ external_pressure_bound_default = 0;
+ icon_state = "map_vent_in";
+ initialize_directions = 1;
+ internal_pressure_bound = 4000;
+ internal_pressure_bound_default = 4000;
+ pressure_checks = 2;
+ pressure_checks_default = 2;
+ pump_direction = 0;
+ use_power = 1
+ },
+/turf/simulated/floor/bluegrid{
+ name = "Mainframe Base";
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"cu" = (
/obj/item/weapon/storage/secure/briefcase/ml3m_pack_med,
/obj/structure/table/reinforced,
@@ -911,16 +1062,13 @@
/turf/simulated/wall/r_wall,
/area/groundbase/security/briefing)
"cw" = (
-/obj/structure/table/hardwoodtable,
-/obj/machinery/camera/network/civilian{
- dir = 8
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock{
+ id_tag = "z1barstall2";
+ name = "Restroom Stall"
},
-/obj/random/mug,
-/obj/random/mug,
-/obj/random/mug,
-/obj/random/mug,
-/turf/simulated/floor/lino,
-/area/groundbase/civilian/cafe)
+/turf/simulated/floor/tiled/white,
+/area/groundbase/civilian/bar)
"cx" = (
/obj/machinery/atmospherics/valve/digital{
name = "supply isolation valve"
@@ -929,14 +1077,16 @@
/turf/simulated/floor,
/area/groundbase/security/armory)
"cy" = (
-/obj/machinery/atmospherics/pipe/manifold/hidden/black,
+/obj/machinery/atmospherics/pipe/simple/hidden/black{
+ dir = 4
+ },
/turf/simulated/floor/bluegrid{
name = "Mainframe Base";
nitrogen = 100;
oxygen = 0;
temperature = 80
},
-/area/groundbase/command/tcomms)
+/area/groundbase/command/tcomms/chamber)
"cz" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -990,13 +1140,11 @@
/turf/simulated/floor/tiled/techfloor/grid,
/area/groundbase/command/ai/foyer)
"cH" = (
-/obj/item/weapon/stool/baystool/padded{
- dir = 4
+/obj/structure/table/hardwoodtable,
+/obj/machinery/chemical_dispenser/bar_coffee/full{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/turf/simulated/floor/wood,
+/turf/simulated/floor/lino,
/area/groundbase/civilian/cafe)
"cI" = (
/obj/machinery/power/apc{
@@ -1033,6 +1181,17 @@
},
/turf/simulated/floor/tiled/techmaint,
/area/groundbase/engineering/atmos)
+"cM" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/black{
+ dir = 4
+ },
+/obj/machinery/telecomms/server/presets/engineering,
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"cN" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -1089,11 +1248,16 @@
/turf/simulated/floor/bluegrid,
/area/groundbase/command/ai/storage)
"cR" = (
-/obj/machinery/atmospherics/pipe/simple/hidden{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/hidden/black{
+ dir = 1
},
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
+/turf/simulated/floor/bluegrid{
+ name = "Mainframe Base";
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"cS" = (
/obj/structure/bed/chair/office/light{
dir = 8
@@ -1167,26 +1331,46 @@
/turf/simulated/floor/tiled,
/area/groundbase/engineering/techstorage)
"cX" = (
-/obj/machinery/porta_turret/stationary,
-/turf/simulated/floor/bluegrid{
- name = "Mainframe Base";
+/obj/machinery/atmospherics/pipe/simple/hidden/black{
+ dir = 4
+ },
+/obj/machinery/telecomms/server/presets/medical,
+/turf/simulated/floor/tiled/dark{
nitrogen = 100;
oxygen = 0;
temperature = 80
},
-/area/groundbase/command/tcomms)
+/area/groundbase/command/tcomms/chamber)
"cY" = (
/obj/machinery/camera/network/medbay{
dir = 1
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/or1)
+"cZ" = (
+/obj/machinery/atmospherics/unary/vent_pump{
+ dir = 8;
+ external_pressure_bound = 140;
+ external_pressure_bound_default = 140;
+ icon_state = "map_vent_out";
+ pressure_checks = 0;
+ pressure_checks_default = 0;
+ use_power = 1
+ },
+/turf/simulated/floor/bluegrid{
+ name = "Mainframe Base";
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"da" = (
/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
/area/groundbase/level1/northspur)
"db" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock{
+ id_tag = "z1barstall1";
name = "Restroom Stall"
},
/turf/simulated/floor/tiled/white,
@@ -1211,6 +1395,17 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/tiled/techfloor,
/area/groundbase/civilian/arrivals)
+"de" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/bluegrid{
+ name = "Mainframe Base";
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"df" = (
/turf/simulated/mineral/cave/virgo3c,
/area/groundbase/level1/eastspur)
@@ -1226,6 +1421,14 @@
},
/turf/simulated/floor/outdoors/sidewalk/side/virgo3c,
/area/groundbase/level1/centsquare)
+"di" = (
+/obj/machinery/telecomms/server/presets/science,
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"dj" = (
/obj/structure/table/marble,
/obj/machinery/chemical_dispenser/bar_soft/full,
@@ -1268,6 +1471,15 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/briefing)
+"do" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/black,
+/obj/machinery/telecomms/server/presets/unused,
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"dp" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
@@ -1287,12 +1499,31 @@
},
/turf/simulated/floor/carpet,
/area/groundbase/security/detective)
+"dr" = (
+/obj/machinery/telecomms/server/presets/security,
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"ds" = (
/obj/structure/bed/chair/sofa/bench/right{
dir = 1
},
/turf/simulated/floor/outdoors/newdirt_nograss/virgo3c,
/area/groundbase/level1/centsquare)
+"dt" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/bluegrid{
+ name = "Mainframe Base";
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"du" = (
/obj/structure/table/standard,
/obj/item/stack/nanopaste,
@@ -1304,6 +1535,14 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/or2)
+"dv" = (
+/obj/machinery/telecomms/server/presets/service/groundbase,
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"dw" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -1327,16 +1566,13 @@
/turf/simulated/floor/bluegrid,
/area/groundbase/command/ai/robot)
"dy" = (
-/obj/machinery/atmospherics/pipe/manifold/hidden/black{
- dir = 1
- },
-/turf/simulated/floor/bluegrid{
- name = "Mainframe Base";
+/obj/machinery/telecomms/processor/preset_two,
+/turf/simulated/floor/tiled/dark{
nitrogen = 100;
oxygen = 0;
temperature = 80
},
-/area/groundbase/command/tcomms)
+/area/groundbase/command/tcomms/chamber)
"dz" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -1345,6 +1581,9 @@
outdoors = 0
},
/area/maintenance/groundbase/level1/swtunnel)
+"dA" = (
+/turf/simulated/mineral/cave/virgo3c,
+/area/maintenance/groundbase/level1/setunnel)
"dB" = (
/obj/machinery/light{
dir = 8
@@ -1542,10 +1781,24 @@
/obj/effect/map_effect/portal/line/side_a,
/turf/simulated/floor/outdoors/grass/forest/virgo3c,
/area/groundbase/level1/nw)
+"dT" = (
+/obj/machinery/telecomms/bus/preset_two/groundbase,
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"dU" = (
/obj/machinery/alarm,
/turf/simulated/floor/tiled,
/area/groundbase/engineering/atmos)
+"dV" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/lino,
+/area/groundbase/civilian/cafe)
"dW" = (
/obj/structure/bed/chair/comfy/orange{
dir = 4
@@ -1562,6 +1815,16 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/engineering/storage)
+"dY" = (
+/obj/machinery/hologram/holopad,
+/obj/machinery/atmospherics/pipe/simple/hidden/black,
+/turf/simulated/floor/bluegrid{
+ name = "Mainframe Base";
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"dZ" = (
/obj/structure/extinguisher_cabinet{
dir = 1;
@@ -1717,11 +1980,13 @@
/turf/simulated/floor,
/area/maintenance/groundbase/substation/aiciv)
"eo" = (
-/obj/machinery/atmospherics/unary/vent_scrubber/on{
- dir = 4
+/obj/machinery/telecomms/bus/preset_four,
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
},
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
+/area/groundbase/command/tcomms/chamber)
"ep" = (
/obj/machinery/computer/secure_data,
/turf/simulated/floor/tiled/dark,
@@ -1759,6 +2024,22 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/engineering/engine)
+"eu" = (
+/obj/machinery/telecomms/processor/preset_four,
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
+"ev" = (
+/obj/machinery/telecomms/server/presets/supply,
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"ew" = (
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/hidden/black{
@@ -1779,10 +2060,22 @@
/turf/simulated/floor/tiled/white,
/area/groundbase/civilian/bar)
"ez" = (
-/obj/structure/closet/toolcloset,
-/obj/item/weapon/pickaxe,
-/turf/simulated/floor/tiled,
-/area/groundbase/engineering/workshop)
+/obj/machinery/atmospherics/unary/vent_pump{
+ dir = 4;
+ external_pressure_bound = 140;
+ external_pressure_bound_default = 140;
+ icon_state = "map_vent_out";
+ pressure_checks = 0;
+ pressure_checks_default = 0;
+ use_power = 1
+ },
+/turf/simulated/floor/bluegrid{
+ name = "Mainframe Base";
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"eA" = (
/obj/structure/disposalpipe/segment{
dir = 2;
@@ -1812,9 +2105,17 @@
/turf/simulated/floor/tiled,
/area/groundbase/engineering/atmos)
"eD" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
+/obj/machinery/porta_turret/stationary,
+/obj/machinery/atmospherics/pipe/simple/hidden/black{
+ dir = 4
+ },
+/turf/simulated/floor/bluegrid{
+ name = "Mainframe Base";
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"eE" = (
/obj/structure/flora/pottedplant,
/obj/machinery/camera/network/security,
@@ -1897,9 +2198,31 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/morgue)
+"eQ" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/black{
+ dir = 4
+ },
+/obj/machinery/ntnet_relay,
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"eR" = (
/turf/simulated/floor/outdoors/grass/virgo3c,
/area/groundbase/unexplored/outdoors)
+"eS" = (
+/obj/machinery/telecomms/bus/preset_one,
+/obj/machinery/atmospherics/pipe/manifold/hidden/black{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"eT" = (
/obj/structure/railing/grey{
dir = 4
@@ -1965,6 +2288,17 @@
},
/turf/simulated/floor/tiled/steel_ridged,
/area/groundbase/command/ai/hall)
+"fa" = (
+/obj/machinery/telecomms/processor/preset_one,
+/obj/machinery/atmospherics/pipe/simple/hidden/black{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"fb" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled/dark,
@@ -1973,6 +2307,15 @@
/obj/machinery/light,
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/briefing)
+"fd" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/black,
+/turf/simulated/floor/bluegrid{
+ name = "Mainframe Base";
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"fe" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/multi_tile/glass/polarized{
@@ -2014,24 +2357,29 @@
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/or1)
"fi" = (
-/obj/machinery/telecomms/processor/preset_four,
+/obj/machinery/telecomms/processor/preset_three,
+/obj/machinery/atmospherics/pipe/simple/hidden/black{
+ dir = 4
+ },
/turf/simulated/floor/tiled/dark{
nitrogen = 100;
oxygen = 0;
temperature = 80
},
-/area/groundbase/command/tcomms)
+/area/groundbase/command/tcomms/chamber)
"fj" = (
-/obj/structure/table/hardwoodtable,
-/obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask,
-/obj/machinery/firealarm{
- dir = 4
+/obj/structure/toilet{
+ dir = 8
},
-/obj/structure/sign/painting/library_secure{
- pixel_y = -30
+/obj/machinery/light/small,
+/obj/machinery/button/remote/airlock{
+ id = "z1barstall2";
+ pixel_x = -10;
+ pixel_y = 27;
+ specialfunctions = 4
},
-/turf/simulated/floor/lino,
-/area/groundbase/civilian/cafe)
+/turf/simulated/floor/tiled/white,
+/area/groundbase/civilian/bar)
"fk" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -2127,12 +2475,16 @@
},
/area/maintenance/groundbase/level1/nwtunnel)
"fu" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 10
+/obj/machinery/telecomms/bus/preset_three,
+/obj/machinery/atmospherics/pipe/simple/hidden/black{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"fv" = (
/obj/machinery/computer/atmos_alert,
/obj/machinery/requests_console/preset/engineering{
@@ -2196,6 +2548,19 @@
},
/turf/simulated/floor/bluegrid,
/area/groundbase/command/ai/chamber)
+"fF" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/black{
+ dir = 4
+ },
+/obj/machinery/exonet_node{
+ anchored = 1
+ },
+/turf/simulated/floor/tiled/dark{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"fG" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -2217,20 +2582,26 @@
/turf/simulated/floor,
/area/maintenance/groundbase/trashpit)
"fJ" = (
-/obj/machinery/atmospherics/pipe/simple/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/unary/freezer{
- dir = 1;
- icon_state = "freezer_1";
- set_temperature = 73;
+/obj/machinery/atmospherics/unary/vent_pump{
+ dir = 8;
+ external_pressure_bound = 0;
+ external_pressure_bound_default = 0;
+ icon_state = "map_vent_in";
+ initialize_directions = 1;
+ internal_pressure_bound = 4000;
+ internal_pressure_bound_default = 4000;
+ pressure_checks = 2;
+ pressure_checks_default = 2;
+ pump_direction = 0;
use_power = 1
},
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/turf/simulated/floor/bluegrid{
+ name = "Mainframe Base";
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
},
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
+/area/groundbase/command/tcomms/chamber)
"fK" = (
/obj/structure/table/bench/steel,
/obj/structure/cable/yellow{
@@ -2247,6 +2618,15 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/engineering/storage)
+"fM" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/black,
+/turf/simulated/floor/bluegrid{
+ name = "Mainframe Base";
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 80
+ },
+/area/groundbase/command/tcomms/chamber)
"fN" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -2256,6 +2636,12 @@
},
/turf/simulated/floor,
/area/maintenance/groundbase/substation/secsci)
+"fO" = (
+/obj/machinery/door/firedoor,
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/turf/simulated/floor,
+/area/groundbase/command/tcomms/chamber)
"fP" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -2334,6 +2720,10 @@
alpha = 0
},
/area/groundbase/level1/ne)
+"fW" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/black,
+/turf/simulated/wall/r_wall,
+/area/groundbase/command/tcomms/chamber)
"fX" = (
/obj/structure/table/standard,
/obj/machinery/alarm/angled,
@@ -2351,6 +2741,27 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/briefing)
+"fZ" = (
+/obj/machinery/access_button{
+ command = "cycle_exterior";
+ dir = 1;
+ frequency = 1380;
+ master_tag = "tcommsairlock";
+ pixel_x = -32;
+ req_one_access = list(61)
+ },
+/obj/effect/map_helper/airlock/door/ext_door,
+/obj/machinery/door/airlock/maintenance_hatch{
+ frequency = null;
+ icon_state = "door_locked";
+ id_tag = null;
+ locked = 1;
+ name = "Telecoms Server Access";
+ req_access = list(61)
+ },
+/obj/machinery/door/firedoor,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/groundbase/command/tcomms/chamber)
"ga" = (
/obj/structure/cable/yellow{
icon_state = "2-8"
@@ -2358,19 +2769,24 @@
/turf/simulated/floor/tiled,
/area/groundbase/engineering/lobby)
"gb" = (
-/obj/structure/table/hardwoodtable,
+/obj/machinery/door/firedoor,
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
/obj/machinery/door/blast/gate/thin{
- dir = 8;
id = "Cafe";
layer = 3.3
},
-/turf/simulated/floor/lino,
+/turf/simulated/floor,
/area/groundbase/civilian/cafe)
"gc" = (
/obj/structure/disposaloutlet,
/obj/structure/disposalpipe/trunk,
/turf/simulated/floor,
/area/groundbase/cargo/mining)
+"gd" = (
+/obj/machinery/holoplant,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"ge" = (
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 4
@@ -2383,6 +2799,22 @@
},
/turf/simulated/floor/tiled/techmaint,
/area/groundbase/engineering/atmos)
+"gg" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/glass{
+ name = "Cafe"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/cafe)
"gh" = (
/turf/unsimulated/wall/planetary/virgo3c{
icon_state = "riveted"
@@ -2510,6 +2942,9 @@
"gv" = (
/turf/simulated/wall/r_wall,
/area/groundbase/security/hos)
+"gw" = (
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"gx" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -2545,18 +2980,14 @@
/turf/simulated/floor/tiled/techfloor/grid,
/area/groundbase/command/ai/foyer)
"gB" = (
-/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
- dir = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
/obj/structure/disposalpipe/segment{
- dir = 4;
- icon_state = "pipe-c"
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 8
},
/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
/area/groundbase/level1/northspur)
@@ -2680,6 +3111,20 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/civilian/gateway)
+"gP" = (
+/obj/machinery/airlock_sensor{
+ dir = 8;
+ pixel_x = 25
+ },
+/obj/effect/map_helper/airlock/sensor/chamber_sensor,
+/obj/machinery/embedded_controller/radio/airlock/airlock_controller{
+ frequency = 1380;
+ id_tag = "tcommsairlock";
+ pixel_y = 24;
+ req_one_access = list(61)
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"gQ" = (
/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled/dark,
@@ -2703,11 +3148,12 @@
/turf/simulated/floor/tiled/techmaint,
/area/groundbase/command/tcomms/storage)
"gU" = (
-/obj/machinery/atmospherics/pipe/manifold/hidden{
- dir = 1
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -30
},
/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
+/area/groundbase/command/tcomms/chamber)
"gV" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -2716,7 +3162,14 @@
/turf/simulated/floor/tiled/techmaint,
/area/groundbase/command/tcomms/storage)
"gW" = (
-/turf/simulated/floor/lino,
+/obj/structure/table/marble,
+/obj/machinery/alarm{
+ pixel_y = 28
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/wood,
/area/groundbase/civilian/cafe)
"gX" = (
/obj/structure/table/bench/padded,
@@ -2726,21 +3179,17 @@
/turf/simulated/floor/tiled/dark,
/area/groundbase/civilian/bar)
"gY" = (
-/obj/machinery/telecomms/hub/preset/groundbase,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
+/obj/machinery/atmospherics/unary/vent_pump/on{
+ dir = 4
},
-/area/groundbase/command/tcomms)
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"gZ" = (
-/obj/machinery/telecomms/server/presets/common,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
},
-/area/groundbase/command/tcomms)
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"ha" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -2759,6 +3208,12 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/civilian/gateway)
+"hc" = (
+/obj/machinery/camera/network/command{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"hd" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/tiled/techfloor/grid,
@@ -2842,6 +3297,15 @@
outdoors = 0
},
/area/maintenance/groundbase/level1/nwtunnel)
+"hn" = (
+/obj/machinery/atmospherics/portables_connector{
+ dir = 4
+ },
+/obj/machinery/portable_atmospherics/canister/air/airlock{
+ start_pressure = 4559.63
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"ho" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -2911,6 +3375,12 @@
/obj/effect/landmark/start/security,
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/equipment)
+"hy" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"hz" = (
/obj/machinery/vending/assist,
/obj/machinery/light,
@@ -2945,12 +3415,17 @@
/turf/simulated/floor/outdoors/newdirt_nograss/virgo3c,
/area/groundbase/level1/se)
"hF" = (
-/obj/structure/table/hardwoodtable,
-/obj/machinery/chemical_dispenser/bar_coffee/full{
- dir = 8
- },
-/turf/simulated/floor/lino,
+/obj/structure/table/marble,
+/obj/random/paicard,
+/turf/simulated/floor/wood,
/area/groundbase/civilian/cafe)
+"hG" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment,
+/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
+/area/groundbase/level1/eastspur)
"hH" = (
/obj/machinery/alarm{
dir = 8
@@ -3042,13 +3517,19 @@
/turf/simulated/floor/tiled,
/area/groundbase/cargo/mining)
"hS" = (
-/obj/structure/closet/secure_closet/engineering_welding,
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/machinery/atmospherics/unary/vent_pump/high_volume{
+ dir = 8;
+ id_tag = null
},
-/obj/machinery/light,
-/turf/simulated/floor/tiled,
-/area/groundbase/engineering/workshop)
+/obj/effect/map_helper/airlock/atmos/chamber_pump,
+/obj/machinery/firealarm{
+ dir = 4
+ },
+/obj/machinery/camera/network/command{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"hT" = (
/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled,
@@ -3082,13 +3563,11 @@
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/armory)
"hY" = (
-/obj/machinery/telecomms/server/presets/command,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
+/obj/machinery/camera/network/command{
+ dir = 4
},
-/area/groundbase/command/tcomms)
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"hZ" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -3104,6 +3583,12 @@
outdoors = 0
},
/area/maintenance/groundbase/level1/swtunnel)
+"ia" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"ib" = (
/obj/machinery/door/airlock/mining{
name = "Trash Pit";
@@ -3259,6 +3744,18 @@
outdoors = 0
},
/area/maintenance/groundbase/level1/netunnel)
+"is" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
+"it" = (
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"iu" = (
/obj/machinery/light/small{
dir = 8
@@ -3277,6 +3774,12 @@
/obj/machinery/firealarm,
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/warden)
+"ix" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"iy" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled/white,
@@ -3405,6 +3908,10 @@
/obj/structure/filingcabinet/chestdrawer,
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/iaa1)
+"iL" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"iM" = (
/obj/structure/cable{
icon_state = "0-8"
@@ -3413,10 +3920,19 @@
/turf/simulated/floor,
/area/groundbase/engineering/storage)
"iN" = (
-/obj/effect/floor_decal/industrial/danger/corner{
- dir = 4
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/machinery/door/firedoor,
+/obj/machinery/door/blast/shutters{
+ density = 0;
+ dir = 8;
+ icon_state = "shutter0";
+ id = "engine_public_access";
+ layer = 3.1;
+ name = "Engine Public Access Shutters";
+ opacity = 0
},
-/turf/simulated/floor/tiled,
+/turf/simulated/floor,
/area/groundbase/engineering/engine)
"iO" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
@@ -3428,12 +3944,30 @@
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/equipment)
"iP" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 6
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/obj/machinery/access_button{
+ command = "cycle_interior";
+ frequency = 1380;
+ master_tag = "tcommsairlock";
+ pixel_x = 32;
+ req_one_access = list(61)
},
+/obj/effect/map_helper/airlock/door/int_door,
+/obj/machinery/door/airlock/maintenance_hatch{
+ frequency = null;
+ icon_state = "door_locked";
+ id_tag = null;
+ locked = 1;
+ name = "Telecoms Server Access";
+ req_access = list(61)
+ },
+/obj/machinery/door/firedoor,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/groundbase/command/tcomms/chamber)
+"iQ" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
+/area/groundbase/command/tcomms/chamber)
"iR" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 6
@@ -3443,6 +3977,16 @@
"iS" = (
/turf/simulated/wall/r_wall,
/area/groundbase/engineering/atmos/monitoring)
+"iT" = (
+/obj/machinery/computer/telecomms/monitor{
+ dir = 8;
+ network = "tcommsat"
+ },
+/obj/machinery/status_display{
+ pixel_x = 32
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"iU" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -3478,6 +4022,15 @@
outdoors = 0
},
/area/groundbase/unexplored/rock)
+"iX" = (
+/obj/machinery/power/apc{
+ dir = 8
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-4"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"iY" = (
/turf/simulated/mineral/floor/virgo3c,
/area/maintenance/groundbase/level1/netunnel)
@@ -3519,6 +4072,13 @@
"jd" = (
/turf/simulated/wall,
/area/maintenance/groundbase/substation/medcargo)
+"je" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"jf" = (
/obj/structure/table/reinforced,
/obj/fiftyspawner/steel,
@@ -3582,6 +4142,27 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/lhallway)
+"jk" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
+"jl" = (
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/unary/freezer{
+ dir = 1;
+ icon_state = "freezer_1";
+ set_temperature = 73;
+ use_power = 1
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"jm" = (
/obj/structure/cable/yellow{
icon_state = "1-8"
@@ -3651,6 +4232,15 @@
},
/turf/simulated/floor/tiled/techmaint,
/area/groundbase/engineering/atmos)
+"ju" = (
+/obj/machinery/atmospherics/binary/passive_gate/on{
+ dir = 8
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"jv" = (
/obj/machinery/door_timer/cell_3{
id = "Cell C";
@@ -3701,6 +4291,13 @@
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/briefing)
+"jy" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden,
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"jz" = (
/turf/simulated/wall,
/area/groundbase/medical/or2)
@@ -3800,15 +4397,11 @@
/turf/simulated/floor/tiled/techmaint,
/area/groundbase/engineering/atmos)
"jN" = (
-/obj/structure/bed/chair/office/dark,
-/obj/machinery/button/windowtint/multitint{
- id = "detoffice0";
- pixel_x = -15;
- pixel_y = -30
+/obj/machinery/atmospherics/pipe/simple/hidden{
+ dir = 4
},
-/obj/effect/landmark/start/detective,
-/turf/simulated/floor/carpet,
-/area/groundbase/security/detective)
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"jO" = (
/obj/structure/cable/heavyduty{
icon_state = "1-4"
@@ -3946,16 +4539,12 @@
/turf/simulated/floor/tiled/techfloor/grid,
/area/groundbase/command/ai/robot)
"kf" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/black{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/hidden/universal{
+ dir = 8
},
-/obj/machinery/telecomms/server/presets/engineering,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
+/obj/machinery/firealarm,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"kg" = (
/obj/structure/table/reinforced,
/obj/item/weapon/storage/toolbox/mechanical{
@@ -4055,6 +4644,16 @@
"kq" = (
/turf/simulated/floor/tiled,
/area/groundbase/engineering/storage)
+"kr" = (
+/obj/machinery/computer/telecomms/server{
+ dir = 8;
+ network = "tcommsat"
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"ks" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
@@ -4159,6 +4758,12 @@
},
/turf/simulated/floor/tiled/techfloor,
/area/groundbase/civilian/arrivals)
+"kD" = (
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"kE" = (
/obj/machinery/button/remote/airlock{
desc = "A remote control switch for the medbay recovery room door.";
@@ -4196,7 +4801,7 @@
"kG" = (
/obj/machinery/turretid/lethal{
ailock = 1;
- control_area = /area/groundbase/command/tcomms;
+ control_area = /area/groundbase/command/tcomms/chamber;
name = "Telecoms turret control";
pixel_y = 32;
req_access = list(61)
@@ -4292,6 +4897,25 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/equipment)
+"kN" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
+"kO" = (
+/obj/machinery/hologram/holopad,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
+"kP" = (
+/obj/structure/table/glass,
+/obj/random/paicard,
+/turf/simulated/floor/tiled/dark,
+/area/groundbase/civilian/bar)
"kQ" = (
/obj/machinery/power/apc{
dir = 8;
@@ -4314,22 +4938,28 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/civilian/bar)
-"kT" = (
-/obj/machinery/computer/telecomms/server{
- dir = 8;
- network = "tcommsat"
+"kS" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
},
-/obj/machinery/light{
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
+"kT" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
+/area/groundbase/command/tcomms/chamber)
"kU" = (
-/obj/machinery/camera/network/command{
+/obj/machinery/atmospherics/unary/vent_pump/on{
+ dir = 8
+ },
+/obj/machinery/alarm{
dir = 8
},
/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
+/area/groundbase/command/tcomms/chamber)
"kV" = (
/obj/machinery/light/small{
dir = 4
@@ -4365,6 +4995,15 @@
},
/turf/simulated/floor/wood,
/area/groundbase/civilian/gameroom)
+"kZ" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"la" = (
/obj/structure/table/marble,
/obj/machinery/atmospherics/unary/vent_pump/on,
@@ -4406,13 +5045,15 @@
/turf/simulated/floor/tiled,
/area/groundbase/engineering/lobby)
"le" = (
-/obj/machinery/telecomms/broadcaster/preset_right/groundbase,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 8
},
-/area/groundbase/command/tcomms)
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/light,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"lf" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/multi_tile/glass{
@@ -4515,6 +5156,15 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/civilian/apparel)
+"lm" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"ln" = (
/obj/machinery/vending/wardrobe/detdrobe,
/turf/simulated/floor/tiled/dark,
@@ -4556,6 +5206,16 @@
/obj/item/clothing/head/helmet/bulletproof,
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/armory)
+"ls" = (
+/obj/effect/floor_decal/industrial/warning/corner,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"lt" = (
/obj/effect/floor_decal/industrial/danger,
/obj/machinery/atmospherics/unary/vent_pump/on{
@@ -4563,12 +5223,31 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/engineering/atmos)
+"lu" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
+ dir = 1
+ },
+/obj/effect/floor_decal/industrial/warning,
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 1
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"lv" = (
+/obj/effect/floor_decal/industrial/warning/corner{
+ dir = 8
+ },
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 8
+ },
/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
+/area/groundbase/command/tcomms/chamber)
"lw" = (
/obj/machinery/shieldgen,
/turf/simulated/floor,
@@ -4702,12 +5381,28 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/lhallway)
+"lK" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"lL" = (
/obj/machinery/computer/aiupload{
dir = 4
},
/turf/simulated/floor/bluegrid,
/area/groundbase/command/ai/upload)
+"lM" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"lN" = (
/obj/item/weapon/stool/baystool/padded{
dir = 4
@@ -4820,11 +5515,21 @@
/turf/simulated/wall/r_wall,
/area/groundbase/security/halle)
"mb" = (
-/obj/structure/bed/chair/wood{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 5
},
-/turf/simulated/floor/wood,
+/turf/simulated/floor/lino,
/area/groundbase/civilian/cafe)
+"mc" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/groundbase/command/tcomms/chamber)
"md" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -4833,11 +5538,18 @@
/turf/simulated/floor/outdoors/sidewalk/virgo3c,
/area/groundbase/level1/southeastspur)
"me" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/machinery/door/airlock/hatch{
+ name = "Telecoms Control Room";
+ req_access = list(61)
},
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
+/obj/machinery/door/firedoor,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/groundbase/command/tcomms/chamber)
"mf" = (
/obj/machinery/power/apc{
dir = 8
@@ -4911,6 +5623,22 @@
},
/turf/simulated/floor/carpet/oracarpet,
/area/groundbase/engineering/ce)
+"mp" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/glass{
+ name = "Crew Access"
+ },
+/obj/machinery/door/blast/shutters{
+ density = 0;
+ dir = 8;
+ icon_state = "shutter0";
+ id = "engine_public_access";
+ layer = 3.1;
+ name = "Engine Public Access Shutters";
+ opacity = 0
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/engineering/engine)
"mq" = (
/obj/machinery/alarm{
dir = 8
@@ -4940,6 +5668,20 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/lobby)
+"mu" = (
+/obj/effect/floor_decal/industrial/danger/corner{
+ dir = 4
+ },
+/obj/machinery/button/remote/blast_door{
+ dir = 4;
+ id = "engine_public_access";
+ name = "Public Access Shutters";
+ pixel_x = -25;
+ pixel_y = 0;
+ req_access = list(10)
+ },
+/turf/simulated/floor/tiled,
+/area/groundbase/engineering/engine)
"mv" = (
/obj/structure/cable/yellow{
icon_state = "2-8"
@@ -4989,6 +5731,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 9
},
+/obj/structure/closet/secure_closet/atmos_personal,
/turf/simulated/floor/tiled,
/area/groundbase/engineering/atmos/monitoring)
"mF" = (
@@ -5054,8 +5797,20 @@
/turf/simulated/floor/tiled/steel_ridged,
/area/groundbase/security/briefing)
"mL" = (
-/obj/machinery/media/jukebox,
-/turf/simulated/floor/wood,
+/obj/structure/table/hardwoodtable,
+/obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask,
+/obj/structure/sign/painting/library_secure{
+ pixel_y = -30
+ },
+/obj/item/weapon/reagent_containers/food/drinks/shaker,
+/obj/item/weapon/reagent_containers/glass/rag,
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/atmospherics/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/simulated/floor/lino,
/area/groundbase/civilian/cafe)
"mM" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
@@ -5092,15 +5847,6 @@
outdoors = 0
},
/area/maintenance/groundbase/level1/nwtunnel)
-"mQ" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 5
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"mR" = (
/obj/structure/bed/chair/comfy/orange{
dir = 4
@@ -5205,6 +5951,7 @@
},
/obj/item/clothing/glasses/welding/superior,
/obj/item/device/flashlight/lamp,
+/obj/item/weapon/stamp/ce,
/turf/simulated/floor/carpet/oracarpet,
/area/groundbase/engineering/ce)
"nf" = (
@@ -5278,13 +6025,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled,
/area/groundbase/engineering/atmos/monitoring)
-"np" = (
-/obj/machinery/light,
-/obj/item/weapon/stool/baystool/padded{
- dir = 8
- },
-/turf/simulated/floor/wood,
-/area/groundbase/civilian/cafe)
"nq" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -5536,7 +6276,7 @@
/area/groundbase/security/lobby)
"nU" = (
/obj/structure/table/reinforced,
-/obj/item/device/paicard,
+/obj/random/paicard,
/obj/machinery/recharger{
pixel_y = 5
},
@@ -5551,12 +6291,6 @@
},
/turf/simulated/floor/carpet/sblucarpet,
/area/groundbase/security/iaa1)
-"nW" = (
-/obj/machinery/atmospherics/unary/vent_pump/on{
- dir = 4
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"nX" = (
/obj/machinery/atmospherics/unary/freezer{
dir = 8
@@ -5584,6 +6318,22 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/civilian/bar)
+"oa" = (
+/obj/structure/disposalpipe/sortjunction/flipped{
+ dir = 4;
+ name = "Resleeving";
+ sortType = "Resleeving"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
+/area/groundbase/level1/centsquare)
"ob" = (
/obj/effect/landmark/vines,
/turf/simulated/floor/outdoors/grass/virgo3c,
@@ -5700,15 +6450,6 @@
/obj/machinery/light,
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/morgue)
-"oq" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"or" = (
/obj/structure/stairs/spawner/west,
/obj/structure/railing/grey{
@@ -5974,6 +6715,12 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/morgue)
+"oX" = (
+/obj/structure/bed/chair/wood{
+ dir = 1
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/cafe)
"oY" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/hidden/black{
@@ -6110,18 +6857,6 @@
/obj/machinery/light/small,
/turf/simulated/floor/tiled/white,
/area/groundbase/civilian/womensrestroom)
-"pp" = (
-/mob/living/simple_mob/vore/alienanimals/catslug/custom/engislug{
- ghostjoin = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 8
- },
-/turf/simulated/floor/tiled,
-/area/groundbase/engineering/lobby)
"pq" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -6251,16 +6986,6 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/engineering/techstorage)
-"pI" = (
-/obj/effect/floor_decal/industrial/warning/corner,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"pJ" = (
/obj/machinery/light{
dir = 4
@@ -6369,6 +7094,18 @@
outdoors = 0
},
/area/groundbase/unexplored/rock)
+"pW" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/cafe)
"pX" = (
/obj/structure/cable{
icon_state = "0-4"
@@ -6380,10 +7117,6 @@
/obj/machinery/light,
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/warden)
-"pZ" = (
-/obj/machinery/hologram/holopad,
-/turf/simulated/floor/wood,
-/area/groundbase/civilian/cafe)
"qa" = (
/turf/simulated/wall/r_wall,
/area/groundbase/security/iaa1)
@@ -6452,17 +7185,6 @@
/obj/item/device/radio/off,
/turf/simulated/floor/tiled,
/area/groundbase/civilian/gateway)
-"qh" = (
-/obj/machinery/light{
- dir = 4
- },
-/turf/simulated/floor/bluegrid{
- name = "Mainframe Base";
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"qi" = (
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 4
@@ -6507,27 +7229,6 @@
"qp" = (
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/office)
-"qq" = (
-/obj/machinery/atmospherics/unary/vent_pump{
- dir = 8;
- external_pressure_bound = 0;
- external_pressure_bound_default = 0;
- icon_state = "map_vent_in";
- initialize_directions = 1;
- internal_pressure_bound = 4000;
- internal_pressure_bound_default = 4000;
- pressure_checks = 2;
- pressure_checks_default = 2;
- pump_direction = 0;
- use_power = 1
- },
-/turf/simulated/floor/bluegrid{
- name = "Mainframe Base";
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"qr" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/medical{
@@ -6648,8 +7349,8 @@
/obj/machinery/cell_charger{
pixel_y = 7
},
-/obj/item/weapon/cell/high,
-/obj/item/weapon/cell/high,
+/obj/item/weapon/cell/super,
+/obj/item/weapon/cell/super,
/turf/simulated/floor/tiled,
/area/groundbase/cargo/mining)
"qG" = (
@@ -6735,19 +7436,21 @@
/turf/simulated/floor/tiled,
/area/groundbase/cargo/mining)
"qV" = (
-/obj/item/weapon/stool/baystool/padded{
- dir = 4
- },
-/turf/simulated/floor/wood,
-/area/groundbase/civilian/cafe)
-"qX" = (
-/obj/structure/bed/chair/wood{
- dir = 4
+/obj/structure/table/hardwoodtable,
+/obj/item/weapon/reagent_containers/glass/rag,
+/obj/machinery/alarm{
+ dir = 8
},
/obj/structure/sign/painting/library_secure{
pixel_y = 30
},
-/turf/simulated/floor/wood,
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 8
+ },
+/turf/simulated/floor/lino,
/area/groundbase/civilian/cafe)
"qY" = (
/obj/structure/closet/crate,
@@ -6897,14 +7600,6 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/engineering/techstorage)
-"rk" = (
-/obj/machinery/telecomms/receiver/preset_right/groundbase,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"rl" = (
/obj/machinery/door/firedoor,
/obj/structure/disposalpipe/segment{
@@ -6935,6 +7630,15 @@
outdoors = 0
},
/area/maintenance/groundbase/level1/nwtunnel)
+"ro" = (
+/obj/machinery/firealarm{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/cafe)
"rp" = (
/obj/machinery/atmospherics/binary/pump{
dir = 8
@@ -7070,17 +7774,6 @@
/obj/machinery/alarm,
/turf/simulated/floor/tiled/dark,
/area/groundbase/medical/autoresleeving)
-"rG" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/black{
- dir = 4
- },
-/obj/machinery/telecomms/server/presets/medical,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"rH" = (
/obj/machinery/atmospherics/portables_connector{
dir = 8
@@ -7369,7 +8062,7 @@
/area/groundbase/security/lobby)
"sq" = (
/obj/structure/table/woodentable,
-/obj/item/device/paicard,
+/obj/random/paicard,
/obj/structure/cable/yellow{
icon_state = "2-8"
},
@@ -7397,27 +8090,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/tiled,
/area/groundbase/engineering/storage)
-"st" = (
-/obj/machinery/access_button{
- command = "cycle_exterior";
- dir = 1;
- frequency = 1380;
- master_tag = "tcommsairlock";
- pixel_x = -32;
- req_one_access = list(61)
- },
-/obj/effect/map_helper/airlock/door/ext_door,
-/obj/machinery/door/airlock/maintenance_hatch{
- frequency = null;
- icon_state = "door_locked";
- id_tag = null;
- locked = 1;
- name = "Telecoms Server Access";
- req_access = list(61)
- },
-/obj/machinery/door/firedoor,
-/turf/simulated/floor/tiled/steel_ridged,
-/area/groundbase/command/tcomms)
"su" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -7523,12 +8195,6 @@
},
/turf/simulated/floor/tiled/techfloor,
/area/groundbase/civilian/arrivals)
-"sI" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/simulated/floor,
-/area/maintenance/groundbase/substation/aiciv)
"sJ" = (
/obj/structure/table/rack,
/obj/item/device/suit_cooling_unit,
@@ -7623,25 +8289,6 @@
},
/turf/simulated/floor/outdoors/grass/virgo3c,
/area/groundbase/level1/southwestspur)
-"sT" = (
-/obj/machinery/telecomms/server/presets/science,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
-"sU" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/black{
- dir = 4
- },
-/obj/machinery/ntnet_relay,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"sV" = (
/turf/simulated/floor/outdoors/newdirt/virgo3c{
outdoors = 0
@@ -7707,6 +8354,12 @@
},
/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
/area/groundbase/level1/eastspur)
+"te" = (
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/cafe)
"tf" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -8021,12 +8674,6 @@
},
/turf/simulated/floor/outdoors/sidewalk/side/virgo3c,
/area/groundbase/level1/centsquare)
-"tQ" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
-/turf/simulated/floor,
-/area/groundbase/command/tcomms)
"tS" = (
/obj/structure/table/rack/shelf/steel,
/obj/item/weapon/gun/energy/laser{
@@ -8149,6 +8796,12 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/civilian/bar)
+"uh" = (
+/obj/structure/stairs/spawner/south,
+/turf/simulated/floor/outdoors/newdirt_nograss/virgo3c{
+ outdoors = 0
+ },
+/area/maintenance/groundbase/level1/setunnel)
"ui" = (
/obj/machinery/light/floortube{
dir = 8;
@@ -8472,18 +9125,6 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/engineering/eva)
-"uY" = (
-/obj/effect/floor_decal/industrial/warning/corner{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 8
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"uZ" = (
/obj/machinery/photocopier,
/turf/simulated/floor/tiled/dark,
@@ -8557,7 +9198,8 @@
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/lhallway)
"vi" = (
-/turf/simulated/floor/wood,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/lino,
/area/groundbase/civilian/cafe)
"vj" = (
/turf/simulated/floor/outdoors/newdirt_nograss/virgo3c{
@@ -8595,15 +9237,8 @@
/turf/simulated/floor/carpet/sblucarpet,
/area/groundbase/security/iaa1)
"vo" = (
-/obj/structure/table/hardwoodtable,
-/obj/item/weapon/reagent_containers/glass/rag,
-/obj/machinery/alarm{
- dir = 8
- },
-/obj/structure/sign/painting/library_secure{
- pixel_y = 30
- },
-/turf/simulated/floor/lino,
+/obj/structure/table/marble,
+/turf/simulated/floor/wood,
/area/groundbase/civilian/cafe)
"vp" = (
/turf/simulated/floor/outdoors/newdirt/virgo3c{
@@ -8763,18 +9398,6 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/civilian/bar)
-"vG" = (
-/obj/machinery/porta_turret/stationary,
-/obj/machinery/atmospherics/pipe/simple/hidden/black{
- dir = 4
- },
-/turf/simulated/floor/bluegrid{
- name = "Mainframe Base";
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"vH" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/glass_security{
@@ -8856,11 +9479,6 @@
/obj/item/weapon/hand_labeler,
/turf/simulated/floor/carpet,
/area/groundbase/security/detective)
-"vS" = (
-/obj/machinery/vending/wardrobe/atmosdrobe,
-/obj/machinery/atmospherics/unary/vent_pump/on,
-/turf/simulated/floor/tiled,
-/area/groundbase/engineering/atmos/monitoring)
"vT" = (
/obj/machinery/atmospherics/portables_connector{
dir = 8
@@ -9396,7 +10014,7 @@
},
/obj/machinery/button/remote/airlock{
dir = 4;
- id = "z1stall4";
+ id = "z1stall5";
pixel_x = -27;
specialfunctions = 4
},
@@ -9447,16 +10065,6 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/civilian/foodplace)
-"xl" = (
-/obj/machinery/hologram/holopad,
-/obj/machinery/atmospherics/pipe/simple/hidden/black,
-/turf/simulated/floor/bluegrid{
- name = "Mainframe Base";
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"xm" = (
/obj/effect/floor_decal/industrial/danger,
/obj/machinery/atmospherics/pipe/simple/hidden/black,
@@ -9565,8 +10173,6 @@
},
/area/maintenance/groundbase/level1/nwtunnel)
"xt" = (
-/obj/structure/table/marble,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/wood,
/area/groundbase/civilian/cafe)
"xu" = (
@@ -9655,17 +10261,6 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/civilian/womensrestroom)
-"xG" = (
-/obj/machinery/telecomms/processor/preset_one,
-/obj/machinery/atmospherics/pipe/simple/hidden/black{
- dir = 4
- },
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"xH" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 8
@@ -9710,17 +10305,6 @@
/obj/machinery/firealarm,
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/iaa2)
-"xN" = (
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/blast/shutters{
- dir = 8;
- id = "engineaccess";
- name = "Engine Access Shutters"
- },
-/turf/simulated/floor,
-/area/groundbase/engineering/engine)
"xO" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -9736,24 +10320,10 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/civilian/toolstorage)
-"xQ" = (
-/obj/machinery/telecomms/server/presets/supply,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"xR" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+/obj/item/weapon/stool/baystool/padded{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 10
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
/turf/simulated/floor/wood,
/area/groundbase/civilian/cafe)
"xS" = (
@@ -9961,10 +10531,6 @@
},
/turf/simulated/floor/tiled/techmaint,
/area/groundbase/engineering/atmos)
-"yt" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/black,
-/turf/simulated/wall/r_wall,
-/area/groundbase/command/tcomms)
"yu" = (
/obj/structure/disposalpipe/segment{
dir = 1;
@@ -10236,14 +10802,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/lhallway)
-"za" = (
-/turf/simulated/floor/bluegrid{
- name = "Mainframe Base";
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"zb" = (
/obj/machinery/door/airlock/multi_tile/glass/polarized{
id_tag = null;
@@ -10329,15 +10887,6 @@
},
/turf/simulated/wall/r_wall,
/area/groundbase/engineering/techstorage)
-"zm" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/black,
-/obj/machinery/telecomms/server/presets/unused,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"zn" = (
/obj/structure/stairs/spawner/north,
/turf/simulated/floor/outdoors/sidewalk/virgo3c,
@@ -10402,16 +10951,9 @@
/turf/simulated/floor/tiled/techfloor/grid,
/area/groundbase/command/ai/robot)
"zu" = (
-/obj/structure/table/hardwoodtable,
-/obj/machinery/door/blast/gate/thin{
- dir = 8;
- id = "Cafe";
- layer = 3.3
- },
-/obj/machinery/atmospherics/unary/vent_pump/on{
- dir = 8
- },
-/turf/simulated/floor/lino,
+/obj/structure/table/marble,
+/obj/machinery/atmospherics/unary/vent_scrubber/on,
+/turf/simulated/floor/wood,
/area/groundbase/civilian/cafe)
"zv" = (
/obj/machinery/requests_console/preset/engineering{
@@ -10433,15 +10975,6 @@
},
/turf/simulated/floor/tiled/techmaint,
/area/groundbase/engineering/atmos)
-"zy" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 8
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"zz" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -10454,17 +10987,6 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/command/tcomms/foyer)
-"zA" = (
-/obj/machinery/telecomms/processor/preset_three,
-/obj/machinery/atmospherics/pipe/simple/hidden/black{
- dir = 4
- },
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"zB" = (
/obj/structure/table/reinforced,
/obj/machinery/recharger,
@@ -10540,13 +11062,6 @@
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 4
},
-/obj/machinery/button/remote/blast_door{
- dir = 4;
- id = "engineaccess";
- name = "Engine Access";
- pixel_x = -25;
- req_access = list(10)
- },
/turf/simulated/floor/tiled,
/area/groundbase/engineering/engine)
"zJ" = (
@@ -10562,13 +11077,6 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/iaa1)
-"zL" = (
-/obj/machinery/hologram/holopad,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"zM" = (
/obj/machinery/power/terminal{
dir = 8
@@ -10987,13 +11495,6 @@
"AN" = (
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/briefing)
-"AO" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"AP" = (
/obj/machinery/firealarm{
dir = 8
@@ -11021,13 +11522,6 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/medical/resleeving)
-"AU" = (
-/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 8
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"AV" = (
/obj/machinery/light{
dir = 4
@@ -11059,6 +11553,17 @@
"AZ" = (
/turf/simulated/mineral/cave/virgo3c,
/area/groundbase/level1/sw)
+"Ba" = (
+/obj/structure/table/hardwoodtable,
+/obj/machinery/camera/network/civilian{
+ dir = 8
+ },
+/obj/random/mug,
+/obj/random/mug,
+/obj/random/mug,
+/obj/random/mug,
+/turf/simulated/floor/lino,
+/area/groundbase/civilian/cafe)
"Bb" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -11359,12 +11864,6 @@
/obj/effect/landmark/vermin,
/turf/simulated/floor/tiled,
/area/groundbase/engineering/workshop)
-"BI" = (
-/obj/machinery/atmospherics/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"BJ" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/blast/regular{
@@ -11395,6 +11894,12 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/civilian/apparel)
+"BM" = (
+/obj/structure/sign/painting/library_secure{
+ pixel_y = -30
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/cafe)
"BN" = (
/obj/machinery/alarm,
/turf/simulated/floor/tiled,
@@ -11406,6 +11911,22 @@
/obj/machinery/light,
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/lhallway)
+"BP" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 8
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment,
+/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
+/area/groundbase/level1/centsquare)
"BQ" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/glass{
@@ -11437,20 +11958,6 @@
},
/turf/simulated/floor/carpet/sblucarpet,
/area/groundbase/security/iaa1)
-"BU" = (
-/obj/machinery/airlock_sensor{
- dir = 8;
- pixel_x = 25
- },
-/obj/effect/map_helper/airlock/sensor/chamber_sensor,
-/obj/machinery/embedded_controller/radio/airlock/airlock_controller{
- frequency = 1380;
- id_tag = "tcommsairlock";
- pixel_y = 24;
- req_one_access = list(61)
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"BV" = (
/obj/machinery/light{
dir = 8
@@ -11644,14 +12151,6 @@
/obj/machinery/atmospherics/pipe/manifold/visible/cyan,
/turf/simulated/floor/tiled/techmaint,
/area/groundbase/engineering/atmos)
-"Cu" = (
-/obj/machinery/telecomms/bus/preset_two/groundbase,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"Cv" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/glass{
@@ -11790,12 +12289,6 @@
outdoors = 0
},
/area/groundbase/level1/northspur)
-"CN" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 10
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"CO" = (
/obj/machinery/atmospherics/pipe/simple/hidden/green{
dir = 9
@@ -11815,17 +12308,6 @@
/obj/effect/landmark/start/bartender,
/turf/simulated/floor/lino,
/area/groundbase/civilian/bar)
-"CQ" = (
-/obj/machinery/telecomms/bus/preset_three,
-/obj/machinery/atmospherics/pipe/simple/hidden/black{
- dir = 4
- },
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"CR" = (
/obj/machinery/atmospherics/pipe/simple/visible/black{
dir = 4
@@ -11891,10 +12373,6 @@
},
/turf/simulated/floor/tiled/techmaint,
/area/groundbase/command/tcomms/storage)
-"CZ" = (
-/obj/machinery/holoplant,
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"Db" = (
/turf/simulated/floor/outdoors/newdirt/virgo3c,
/area/groundbase/level1/southeastspur)
@@ -12131,15 +12609,6 @@
},
/turf/simulated/floor,
/area/maintenance/groundbase/substation/medcargo)
-"DF" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/simulated/floor/wood,
-/area/groundbase/civilian/cafe)
"DG" = (
/obj/machinery/atmospherics/pipe/simple/visible/black{
dir = 6
@@ -12371,15 +12840,6 @@
},
/turf/simulated/floor/virgo3c,
/area/groundbase/unexplored/outdoors)
-"Ei" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 9
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"Ej" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -12518,15 +12978,6 @@
/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled,
/area/groundbase/engineering/workshop)
-"Ez" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/black,
-/turf/simulated/floor/bluegrid{
- name = "Mainframe Base";
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"EA" = (
/obj/machinery/computer/secure_data,
/obj/machinery/light{
@@ -12590,15 +13041,9 @@
},
/area/maintenance/groundbase/level1/nwtunnel)
"EM" = (
-/obj/machinery/door/firedoor,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
-/obj/machinery/door/blast/gate/thin{
- dir = 8;
- id = "Cafe";
- layer = 3.3
- },
-/turf/simulated/floor,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/hologram/holopad,
+/turf/simulated/floor/wood,
/area/groundbase/civilian/cafe)
"EO" = (
/obj/machinery/light/bigfloorlamp,
@@ -12858,13 +13303,6 @@
/obj/effect/landmark/start/engineer,
/turf/simulated/floor/tiled,
/area/groundbase/engineering/lobby)
-"Fs" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/universal{
- dir = 8
- },
-/obj/machinery/firealarm,
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"Ft" = (
/obj/structure/bed/chair/comfy/black,
/obj/effect/landmark/start/hos,
@@ -12971,19 +13409,6 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/civilian/gateway)
-"FI" = (
-/obj/machinery/door/airlock/hatch{
- name = "Telecoms Control Room";
- req_access = list(61)
- },
-/obj/machinery/door/firedoor,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/turf/simulated/floor/tiled/steel_ridged,
-/area/groundbase/command/tcomms)
"FJ" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/manifold/hidden/black{
@@ -13064,12 +13489,6 @@
},
/turf/simulated/floor/tiled,
/area/holodeck_control)
-"FW" = (
-/obj/structure/closet/secure_closet/engineering_electrical,
-/obj/item/clothing/gloves/yellow,
-/obj/item/clothing/gloves/yellow,
-/turf/simulated/floor/tiled,
-/area/groundbase/engineering/workshop)
"FX" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/glass_security/polarized{
@@ -13096,14 +13515,6 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/armory)
-"FZ" = (
-/obj/machinery/telecomms/server/presets/security,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"Ga" = (
/obj/item/device/radio/intercom{
dir = 4;
@@ -13697,6 +14108,7 @@
/obj/structure/cable/yellow{
icon_state = "0-4"
},
+/obj/random/paicard,
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/hos)
"Hw" = (
@@ -13724,27 +14136,6 @@
"Hz" = (
/turf/unsimulated/wall/planetary/virgo3c,
/area/groundbase/level1/southeastspur)
-"HA" = (
-/obj/machinery/atmospherics/unary/vent_pump{
- dir = 4;
- external_pressure_bound = 0;
- external_pressure_bound_default = 0;
- icon_state = "map_vent_in";
- initialize_directions = 1;
- internal_pressure_bound = 4000;
- internal_pressure_bound_default = 4000;
- pressure_checks = 2;
- pressure_checks_default = 2;
- pump_direction = 0;
- use_power = 1
- },
-/turf/simulated/floor/bluegrid{
- name = "Mainframe Base";
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"HB" = (
/obj/structure/sign/double/barsign{
pixel_y = -32
@@ -13824,20 +14215,10 @@
/turf/simulated/floor,
/area/maintenance/groundbase/substation/aiciv)
"HI" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/glass{
- name = "Cafe"
- },
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
+ dir = 9
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/simulated/floor/bmarble,
+/turf/simulated/floor/wood,
/area/groundbase/civilian/cafe)
"HJ" = (
/obj/machinery/door/firedoor,
@@ -14154,6 +14535,7 @@
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 8
},
+/obj/random/paicard,
/turf/simulated/floor/tiled,
/area/groundbase/engineering/ce)
"Iy" = (
@@ -14208,6 +14590,17 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/engineering/storage)
+"IE" = (
+/obj/machinery/light/floortube{
+ dir = 8;
+ pixel_x = -6
+ },
+/obj/item/weapon/stool/padded{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/lino,
+/area/groundbase/civilian/cafe)
"IF" = (
/obj/machinery/suit_cycler/engineering,
/obj/machinery/atmospherics/unary/vent_pump/on{
@@ -14526,9 +14919,6 @@
/obj/machinery/clonepod/transhuman,
/turf/simulated/floor/tiled/dark,
/area/groundbase/medical/resleeving)
-"Jw" = (
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"Jx" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -14572,6 +14962,14 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/security/processing)
+"JB" = (
+/obj/structure/stairs/spawner/west,
+/obj/structure/railing/grey{
+ dir = 1
+ },
+/obj/structure/railing/grey,
+/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
+/area/groundbase/level1/eastspur)
"JC" = (
/turf/simulated/floor/tiled,
/area/groundbase/command/tcomms/foyer)
@@ -14642,23 +15040,6 @@
/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/steel_ridged,
/area/groundbase/medical/resleeving)
-"JK" = (
-/obj/machinery/atmospherics/unary/vent_pump{
- dir = 4;
- external_pressure_bound = 140;
- external_pressure_bound_default = 140;
- icon_state = "map_vent_out";
- pressure_checks = 0;
- pressure_checks_default = 0;
- use_power = 1
- },
-/turf/simulated/floor/bluegrid{
- name = "Mainframe Base";
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"JM" = (
/turf/simulated/wall/r_wall,
/area/groundbase/engineering/storage)
@@ -14964,17 +15345,6 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/medical/autoresleeving)
-"Kp" = (
-/obj/machinery/light{
- dir = 8
- },
-/turf/simulated/floor/bluegrid{
- name = "Mainframe Base";
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"Kq" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/highsecurity{
@@ -15184,22 +15554,8 @@
},
/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
/area/groundbase/level1/centsquare)
-"KV" = (
-/obj/machinery/telecomms/server/presets/service/groundbase,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"KW" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/turf/simulated/floor/wood,
+/turf/simulated/floor/lino,
/area/groundbase/civilian/cafe)
"KX" = (
/obj/machinery/door/firedoor,
@@ -15254,20 +15610,6 @@
outdoors = 0
},
/area/groundbase/level1/eastspur)
-"Lc" = (
-/obj/machinery/atmospherics/unary/vent_pump/high_volume{
- dir = 8;
- id_tag = null
- },
-/obj/effect/map_helper/airlock/atmos/chamber_pump,
-/obj/machinery/firealarm{
- dir = 4
- },
-/obj/machinery/camera/network/command{
- dir = 1
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"Ld" = (
/obj/structure/table/steel_reinforced,
/obj/structure/cable/yellow{
@@ -15299,13 +15641,20 @@
/turf/simulated/floor/tiled,
/area/groundbase/civilian/toolstorage)
"Lf" = (
-/obj/machinery/power/apc{
- dir = 1
+/obj/machinery/button/remote/blast_door{
+ id = "Cafe";
+ name = "Cafe shutters";
+ pixel_x = -3;
+ pixel_y = 26
},
-/obj/structure/cable/yellow{
- icon_state = "0-2"
+/obj/machinery/light_switch{
+ pixel_x = 5;
+ pixel_y = 30
},
-/turf/simulated/floor/wood,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/turf/simulated/floor/lino,
/area/groundbase/civilian/cafe)
"Lg" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
@@ -15322,15 +15671,6 @@
},
/turf/simulated/floor/carpet/sblucarpet,
/area/groundbase/security/hos)
-"Li" = (
-/obj/machinery/atmospherics/unary/vent_pump/on{
- dir = 8
- },
-/obj/machinery/alarm{
- dir = 8
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"Lj" = (
/obj/structure/bed/chair/backed_red{
dir = 4
@@ -15524,19 +15864,6 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/cargo/mining)
-"LF" = (
-/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
- dir = 1
- },
-/obj/effect/floor_decal/industrial/warning,
-/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
- dir = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"LG" = (
/obj/machinery/computer/power_monitor,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -15659,13 +15986,6 @@
/obj/machinery/light,
/turf/simulated/floor/tiled,
/area/groundbase/engineering/workshop)
-"LW" = (
-/obj/machinery/atmospherics/pipe/manifold/hidden,
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"LX" = (
/obj/machinery/alarm,
/turf/simulated/floor/tiled/white,
@@ -15875,6 +16195,12 @@
dir = 8
},
/obj/machinery/light/small,
+/obj/machinery/button/remote/airlock{
+ id = "z1barstall1";
+ pixel_x = -10;
+ pixel_y = 27;
+ specialfunctions = 4
+ },
/turf/simulated/floor/tiled/white,
/area/groundbase/civilian/bar)
"Mw" = (
@@ -16023,16 +16349,6 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/engineering/storage)
-"MN" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/light,
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"MO" = (
/turf/simulated/mineral/cave/virgo3c,
/area/groundbase/level1/nw)
@@ -16063,6 +16379,18 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/cargo/mining)
+"MT" = (
+/obj/structure/table/hardwoodtable,
+/obj/machinery/door/blast/gate/thin{
+ id = "Cafe";
+ layer = 3.3
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
+/turf/simulated/floor/lino,
+/area/groundbase/civilian/cafe)
"MU" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -16092,6 +16420,18 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/lobby)
+"Na" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 1
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/cafe)
"Nb" = (
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/obj/machinery/light_switch{
@@ -16150,6 +16490,8 @@
pixel_x = -3;
pixel_y = 26
},
+/obj/item/weapon/reagent_containers/food/drinks/shaker,
+/obj/item/weapon/reagent_containers/glass/rag,
/turf/simulated/floor/lino,
/area/groundbase/civilian/bar)
"Nh" = (
@@ -16237,19 +16579,6 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/engineering/atmos)
-"Nu" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/black{
- dir = 4
- },
-/obj/machinery/exonet_node{
- anchored = 1
- },
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"Nv" = (
/turf/simulated/floor/outdoors/grass/forest/virgo3c,
/area/groundbase/level1/centsquare)
@@ -16432,27 +16761,6 @@
/obj/effect/landmark/start/security,
/turf/simulated/floor/tiled,
/area/groundbase/security/processing)
-"NR" = (
-/obj/machinery/atmospherics/pipe/simple/hidden,
-/obj/machinery/access_button{
- command = "cycle_interior";
- frequency = 1380;
- master_tag = "tcommsairlock";
- pixel_x = 32;
- req_one_access = list(61)
- },
-/obj/effect/map_helper/airlock/door/int_door,
-/obj/machinery/door/airlock/maintenance_hatch{
- frequency = null;
- icon_state = "door_locked";
- id_tag = null;
- locked = 1;
- name = "Telecoms Server Access";
- req_access = list(61)
- },
-/obj/machinery/door/firedoor,
-/turf/simulated/floor/tiled/steel_ridged,
-/area/groundbase/command/tcomms)
"NS" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled,
@@ -16621,21 +16929,16 @@
/turf/simulated/floor,
/area/maintenance/groundbase/substation/secsci)
"Om" = (
-/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
- dir = 8
+/obj/machinery/door/firedoor,
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/machinery/door/blast/gate/thin{
+ dir = 8;
+ id = "Cafe";
+ layer = 3.3
},
-/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "2-4"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
-/area/groundbase/level1/centsquare)
+/turf/simulated/floor,
+/area/groundbase/civilian/cafe)
"On" = (
/obj/structure/cable/yellow{
icon_state = "1-8"
@@ -16785,15 +17088,6 @@
},
/turf/simulated/floor/lino,
/area/groundbase/civilian/bar)
-"OL" = (
-/obj/machinery/atmospherics/portables_connector{
- dir = 4
- },
-/obj/machinery/portable_atmospherics/canister/air/airlock{
- start_pressure = 4559.63
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"OM" = (
/obj/machinery/transhuman/resleever,
/obj/machinery/light{
@@ -17074,16 +17368,6 @@
outdoors = 0
},
/area/maintenance/groundbase/level1/swtunnel)
-"PD" = (
-/obj/machinery/computer/telecomms/monitor{
- dir = 8;
- network = "tcommsat"
- },
-/obj/machinery/status_display{
- pixel_x = 32
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"PE" = (
/obj/machinery/door/firedoor,
/obj/structure/table/reinforced,
@@ -17111,17 +17395,18 @@
/turf/simulated/floor/outdoors/sidewalk/side/virgo3c,
/area/groundbase/level1/centsquare)
"PH" = (
-/obj/machinery/light,
-/turf/simulated/floor/lino,
-/area/groundbase/civilian/cafe)
-"PI" = (
-/obj/machinery/telecomms/processor/preset_two,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
+/obj/structure/table/marble,
+/obj/machinery/power/apc{
+ dir = 1
},
-/area/groundbase/command/tcomms)
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-2"
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/cafe)
"PJ" = (
/obj/structure/table/standard,
/obj/item/device/healthanalyzer,
@@ -17253,14 +17538,6 @@
outdoors = 0
},
/area/maintenance/groundbase/level1/nwtunnel)
-"PZ" = (
-/obj/machinery/telecomms/bus/preset_four,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"Qa" = (
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 4
@@ -17369,14 +17646,18 @@
"Qq" = (
/turf/simulated/wall/r_wall,
/area/maintenance/groundbase/level1/swtunnel)
-"Qs" = (
-/obj/machinery/pda_multicaster/prebuilt,
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
+"Qt" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
},
-/area/groundbase/command/tcomms)
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/outdoors/sidewalk/side/virgo3c,
+/area/groundbase/level1/centsquare)
"Qu" = (
/obj/structure/table/rack/shelf/steel,
/obj/item/clothing/suit/storage/vest/heavy/officer{
@@ -17468,18 +17749,6 @@
"QD" = (
/turf/simulated/floor/outdoors/grass/forest/virgo3c,
/area/groundbase/level1/westspur)
-"QE" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/glass{
- name = "Crew Apparel Care"
- },
-/obj/machinery/door/blast/shutters{
- dir = 8;
- id = "engineaccess";
- name = "Engine Access Shutters"
- },
-/turf/simulated/floor/bmarble,
-/area/groundbase/engineering/engine)
"QF" = (
/obj/effect/floor_decal/techfloor/orange{
dir = 10
@@ -17489,17 +17758,6 @@
},
/turf/simulated/floor/tiled/techfloor,
/area/groundbase/civilian/arrivals)
-"QG" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/black{
- dir = 4
- },
-/turf/simulated/floor/bluegrid{
- name = "Mainframe Base";
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"QH" = (
/obj/structure/table/reinforced,
/obj/item/device/sleevemate,
@@ -17588,6 +17846,13 @@
/obj/machinery/pipedispenser/disposal,
/turf/simulated/floor/tiled,
/area/groundbase/engineering/atmos)
+"QU" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/structure/flora/pottedplant/decorative,
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/cafe)
"QV" = (
/obj/structure/toilet,
/obj/machinery/button/remote/airlock{
@@ -17599,15 +17864,6 @@
/obj/machinery/light/small,
/turf/simulated/floor/tiled/white,
/area/groundbase/civilian/womensrestroom)
-"QW" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/simulated/floor,
-/area/maintenance/groundbase/substation/aiciv)
"QX" = (
/obj/structure/table/woodentable,
/obj/machinery/atmospherics/unary/vent_pump/on,
@@ -17781,13 +18037,13 @@
/turf/simulated/floor/tiled/techfloor/grid,
/area/groundbase/command/ai/robot)
"Rs" = (
-/obj/machinery/door/window/brigdoor/northleft{
- dir = 8;
- name = "Cafe";
- req_access = list(25)
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock{
+ id_tag = "z1barstall3";
+ name = "Restroom Stall"
},
-/turf/simulated/floor/lino,
-/area/groundbase/civilian/cafe)
+/turf/simulated/floor/tiled/white,
+/area/groundbase/civilian/bar)
"Rt" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/tiled/techmaint,
@@ -17857,17 +18113,18 @@
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/office)
"RA" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
+/obj/structure/table/woodentable,
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/cafe)
+"RB" = (
+/obj/effect/landmark{
+ name = "carpspawn"
},
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/simulated/floor/outdoors/sidewalk/side/virgo3c,
-/area/groundbase/level1/centsquare)
+/turf/simulated/floor/water/deep/virgo3c,
+/area/groundbase/level1/eastspur)
"RC" = (
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/obj/machinery/light{
@@ -17924,11 +18181,19 @@
/turf/simulated/floor/tiled,
/area/groundbase/engineering/storage)
"RI" = (
-/obj/item/weapon/stool/baystool/padded{
- dir = 8
+/obj/machinery/door/window/brigdoor/northleft{
+ dir = 8;
+ name = "Cafe";
+ req_access = list(25)
},
-/turf/simulated/floor/wood,
+/turf/simulated/floor/lino,
/area/groundbase/civilian/cafe)
+"RJ" = (
+/obj/structure/stairs/spawner/north,
+/turf/simulated/floor/outdoors/newdirt_nograss/virgo3c{
+ outdoors = 0
+ },
+/area/maintenance/groundbase/level1/nwtunnel)
"RK" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
@@ -18054,12 +18319,6 @@
},
/turf/simulated/floor/wood,
/area/groundbase/civilian/gameroom)
-"RZ" = (
-/obj/machinery/camera/network/command{
- dir = 4
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"Sa" = (
/obj/structure/table/marble,
/obj/machinery/atmospherics/unary/vent_pump/on,
@@ -18172,15 +18431,6 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/engineering/techstorage)
-"Sn" = (
-/obj/machinery/power/apc{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "0-4"
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"So" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -18248,6 +18498,13 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/command/tcomms/foyer)
+"Sx" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/cafe)
"Sy" = (
/obj/machinery/cryopod/robot,
/obj/machinery/power/apc{
@@ -18408,13 +18665,7 @@
/turf/simulated/floor/tiled/steel_ridged,
/area/groundbase/security/halls)
"SO" = (
-/obj/structure/table/marble,
-/obj/machinery/atmospherics/unary/vent_scrubber/on{
- dir = 1
- },
-/obj/structure/sign/painting/library_secure{
- pixel_y = -30
- },
+/obj/machinery/media/jukebox,
/turf/simulated/floor/wood,
/area/groundbase/civilian/cafe)
"SP" = (
@@ -18613,6 +18864,7 @@
departmentType = 2;
pixel_y = 30
},
+/obj/item/weapon/gun/energy/mouseray/medical,
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/equipment)
"To" = (
@@ -19112,9 +19364,6 @@
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/bluegrid,
/area/groundbase/command/ai/robot)
-"Uv" = (
-/turf/simulated/wall/r_wall,
-/area/groundbase/command/tcomms)
"Uw" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -19237,18 +19486,18 @@
/turf/simulated/floor/carpet/gaycarpet,
/area/groundbase/civilian/clown)
"UO" = (
-/obj/machinery/button/remote/blast_door{
- id = "Cafe";
- name = "Cafe shutters";
- pixel_x = -3;
- pixel_y = 26
+/obj/structure/toilet{
+ dir = 8
},
-/obj/machinery/light_switch{
- pixel_x = 5;
- pixel_y = 30
+/obj/machinery/light/small,
+/obj/machinery/button/remote/airlock{
+ id = "z1barstall3";
+ pixel_x = -10;
+ pixel_y = 27;
+ specialfunctions = 4
},
-/turf/simulated/floor/lino,
-/area/groundbase/civilian/cafe)
+/turf/simulated/floor/tiled/white,
+/area/groundbase/civilian/bar)
"UP" = (
/obj/structure/table/rack/steel,
/obj/item/clothing/gloves/arm_guard/laserproof,
@@ -19267,13 +19516,6 @@
"UQ" = (
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/morgue)
-"UR" = (
-/obj/machinery/light_switch{
- dir = 4;
- pixel_x = -30
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"US" = (
/obj/structure/bed/chair/sofa/bench,
/obj/effect/landmark/start/visitor,
@@ -19454,6 +19696,20 @@
/obj/structure/cable/yellow,
/turf/simulated/floor/tiled,
/area/groundbase/civilian/toolstorage)
+"Vw" = (
+/obj/structure/table/hardwoodtable,
+/obj/machinery/door/blast/gate/thin{
+ id = "Cafe";
+ layer = 3.3
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 10
+ },
+/turf/simulated/floor/lino,
+/area/groundbase/civilian/cafe)
"Vx" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -19544,17 +19800,12 @@
/turf/simulated/floor/tiled/white,
/area/groundbase/civilian/womensrestroom)
"VH" = (
-/mob/living/simple_mob/vore/alienanimals/catslug/custom/gatslug{
- ghostjoin = 1
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/item/weapon/stool/baystool/padded{
+ dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 8
- },
-/turf/simulated/floor/tiled/dark,
-/area/groundbase/security/lobby)
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/cafe)
"VI" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
@@ -19711,11 +19962,13 @@
/turf/simulated/floor/bluegrid,
/area/groundbase/command/ai/robot)
"Wb" = (
-/obj/machinery/light{
- dir = 1
+/obj/structure/table/hardwoodtable,
+/obj/machinery/door/blast/gate/thin{
+ dir = 8;
+ id = "Cafe";
+ layer = 3.3
},
-/obj/structure/table/woodentable,
-/turf/simulated/floor/wood,
+/turf/simulated/floor/lino,
/area/groundbase/civilian/cafe)
"Wc" = (
/obj/machinery/vending/tool,
@@ -19730,14 +19983,10 @@
/turf/simulated/floor/tiled/dark,
/area/groundbase/security/armory)
"Wg" = (
-/obj/item/weapon/stool/padded{
- dir = 8
+/obj/item/weapon/stool/baystool/padded{
+ dir = 1
},
-/obj/machinery/light/floortube{
- dir = 8;
- pixel_x = -6
- },
-/turf/simulated/floor/lino,
+/turf/simulated/floor/wood,
/area/groundbase/civilian/cafe)
"Wh" = (
/obj/machinery/button/remote/blast_door{
@@ -19878,17 +20127,6 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/civilian/bar)
-"WA" = (
-/obj/machinery/telecomms/bus/preset_one,
-/obj/machinery/atmospherics/pipe/manifold/hidden/black{
- dir = 1
- },
-/turf/simulated/floor/tiled/dark{
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"WB" = (
/turf/simulated/floor/outdoors/newdirt/virgo3c{
outdoors = 0
@@ -19926,6 +20164,21 @@
},
/turf/simulated/floor,
/area/groundbase/security/warden)
+"WF" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/obj/item/weapon/stool/baystool/padded{
+ dir = 4
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/cafe)
"WG" = (
/obj/machinery/light_switch{
dir = 8;
@@ -20555,18 +20808,24 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/engineering/atmos/monitoring)
-"Ye" = (
-/obj/machinery/light{
- dir = 8
- },
-/turf/simulated/floor/tiled/techfloor/grid,
-/area/groundbase/command/tcomms)
"Yf" = (
/obj/structure/disposalpipe/segment{
dir = 4
},
/turf/simulated/floor/outdoors/sidewalk/side/virgo3c,
/area/groundbase/level1/westspur)
+"Yg" = (
+/obj/item/weapon/stool/baystool/padded{
+ dir = 1
+ },
+/obj/structure/sign/painting/library_secure{
+ pixel_x = 30
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/civilian/cafe)
"Yh" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 8
@@ -20692,7 +20951,10 @@
/obj/item/device/radio/intercom{
pixel_y = -24
},
-/turf/simulated/floor/wood,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/turf/simulated/floor/lino,
/area/groundbase/civilian/cafe)
"Yy" = (
/obj/structure/cable/yellow{
@@ -20717,15 +20979,6 @@
"YC" = (
/turf/simulated/floor/outdoors/newdirt/virgo3c,
/area/groundbase/level1/centsquare)
-"YD" = (
-/obj/machinery/camera/network/command,
-/turf/simulated/floor/bluegrid{
- name = "Mainframe Base";
- nitrogen = 100;
- oxygen = 0;
- temperature = 80
- },
-/area/groundbase/command/tcomms)
"YE" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/window/brigdoor/southleft{
@@ -20769,6 +21022,13 @@
/obj/structure/cable/yellow,
/turf/simulated/floor/reinforced,
/area/groundbase/engineering/engine)
+"YI" = (
+/obj/structure/railing/grey{
+ dir = 1
+ },
+/obj/structure/railing/grey,
+/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
+/area/groundbase/level1/eastspur)
"YJ" = (
/obj/structure/closet{
name = "Evidence Closet"
@@ -20857,22 +21117,21 @@
/turf/simulated/floor/tiled,
/area/groundbase/engineering/workshop)
"YW" = (
-/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,
-/obj/structure/disposalpipe/sortjunction/flipped{
- dir = 4;
- name = "Resleeving";
- sortType = "Resleeving"
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/structure/cable/yellow{
- icon_state = "1-4"
- },
-/obj/structure/cable/yellow{
- icon_state = "2-4"
- },
/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
/area/groundbase/level1/centsquare)
"YX" = (
@@ -21751,9 +22010,9 @@ MO
MO
MO
MO
-MO
-MO
-MO
+RJ
+FF
+FF
MO
MO
MO
@@ -21893,11 +22152,11 @@ MO
MO
MO
MO
-MO
-MO
-MO
-MO
-MO
+RJ
+FF
+FF
+FF
+FF
FF
FF
FF
@@ -22037,7 +22296,7 @@ MO
MO
MO
MO
-MO
+FF
FF
FF
FF
@@ -22144,22 +22403,22 @@ MO
MO
MO
MO
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
+an
+an
+an
+an
+an
+an
+an
+an
+an
+an
+an
+an
+an
+an
+an
+an
MO
MO
MO
@@ -22286,22 +22545,22 @@ MO
MO
MO
MO
-Uv
-cX
-za
-HA
-Kp
-za
-JK
-cX
-Uv
-CZ
-nW
-Ye
-Sn
-eo
-CZ
-Uv
+an
+bI
+bK
+ct
+de
+bK
+ez
+bI
+an
+gd
+gY
+ix
+iX
+kD
+gd
+an
Dc
Dc
Dc
@@ -22428,22 +22687,22 @@ MO
MO
MO
MO
-Uv
-za
-za
-QG
-za
-za
-QG
-za
-tQ
-Jw
-CN
-ct
-AO
-fu
-mQ
-Uv
+an
+bK
+bK
+cy
+bK
+bK
+cy
+bK
+fO
+gw
+gZ
+iL
+je
+kN
+kZ
+an
Ij
uv
Hu
@@ -22570,22 +22829,22 @@ MO
MO
MO
MO
-Uv
-za
-za
-kf
-sT
-za
-QG
-za
-tQ
-Jw
-Jw
-Jw
-me
-Jw
-MN
-Uv
+an
+bK
+bK
+cM
+di
+bK
+cy
+bK
+fO
+gw
+gw
+gw
+jk
+gw
+le
+an
KK
Rt
By
@@ -22712,22 +22971,22 @@ MO
MO
MO
MO
-Uv
-za
-gZ
-QG
-za
-KV
-vG
-za
-tQ
-Jw
-Jw
-Jw
-me
-Jw
-oq
-Uv
+an
+bK
+bT
+cy
+bK
+dv
+eD
+bK
+fO
+gw
+gw
+gw
+jk
+gw
+lm
+an
Hs
gT
DP
@@ -22854,22 +23113,22 @@ MO
MO
MO
MO
-Uv
-YD
-za
-QG
-za
-za
-QG
-za
-tQ
-Jw
-Jw
-Jw
-me
-Jw
-oq
-Uv
+an
+bN
+bK
+cy
+bK
+bK
+cy
+bK
+fO
+gw
+gw
+gw
+jk
+gw
+lm
+an
bd
gT
Xs
@@ -22996,22 +23255,22 @@ MO
MO
MO
MO
-Uv
-za
-cX
-QG
-za
-PI
-sU
-za
-Uv
-Jw
-kU
-Jw
-me
-Jw
-oq
-Uv
+an
+bK
+bI
+cy
+bK
+dy
+eQ
+bK
+an
+gw
+hc
+gw
+jk
+gw
+lm
+an
lp
cC
lc
@@ -23138,22 +23397,22 @@ MO
MO
MO
MO
-Uv
-za
-za
-QG
-za
-Cu
-WA
-Ez
-yt
-yt
-yt
-yt
-fJ
-Jw
-oq
-Uv
+an
+bK
+bK
+cy
+bK
+dT
+eS
+fM
+fW
+fW
+fW
+fW
+jl
+gw
+lm
+an
Dc
Dc
PT
@@ -23280,22 +23539,22 @@ MO
MO
MO
MO
-Uv
-za
-le
-QG
-za
-za
-xG
-za
-Uv
-bB
-OL
-Uv
-ch
-Jw
-pI
-Uv
+an
+bK
+cc
+cy
+bK
+bK
+fa
+bK
+an
+gw
+hn
+an
+ju
+gw
+ls
+an
kG
au
zz
@@ -23422,22 +23681,22 @@ MO
MO
MO
MO
-Uv
-gY
-Qs
-dy
-zm
-xl
-cy
-za
-st
-Jw
-gU
-NR
-LW
-zL
-LF
-FI
+an
+bR
+ch
+cR
+do
+dY
+fd
+bK
+fZ
+gw
+hy
+iP
+jy
+kO
+lu
+me
FC
DX
Bn
@@ -23564,22 +23823,22 @@ MO
MO
MO
MO
-Uv
-za
-rk
-QG
-za
-za
-zA
-za
-Uv
-BU
-Lc
-Uv
-cR
-Jw
-uY
-Uv
+an
+bK
+cm
+cy
+bK
+bK
+fi
+bK
+an
+gP
+hS
+an
+jN
+gw
+lv
+an
KC
Sv
zz
@@ -23706,22 +23965,22 @@ MO
MO
MO
MO
-Uv
-za
-za
-QG
-za
-PZ
-CQ
-za
-Uv
-Uv
-Uv
-Uv
-Fs
-Jw
-zy
-Uv
+an
+bK
+bK
+cy
+bK
+eo
+fu
+bK
+an
+an
+an
+an
+kf
+gw
+lK
+an
SS
SS
Hf
@@ -23848,22 +24107,22 @@ MO
MO
MO
MO
-Uv
-za
-cX
-QG
-za
-fi
-Nu
-za
-Uv
-UR
-RZ
-Jw
-CN
-ct
-AU
-Uv
+an
+bK
+bI
+cy
+bK
+eu
+fF
+bK
+an
+gU
+hY
+gw
+gZ
+iL
+lM
+an
Pm
zS
lC
@@ -23990,22 +24249,22 @@ MO
MO
MO
MO
-Uv
-YD
-za
-QG
-za
-za
-QG
-za
-tQ
-Jw
-Jw
-Jw
-Jw
-Jw
-oq
-Uv
+an
+bN
+bK
+cy
+bK
+bK
+cy
+bK
+fO
+gw
+gw
+gw
+gw
+gw
+lm
+an
PL
Ne
zt
@@ -24132,22 +24391,22 @@ MO
MO
MO
MO
-Uv
-za
-hY
-QG
-za
-xQ
-vG
-za
-tQ
-Jw
-Jw
-Jw
-Jw
-Jw
-MN
-Uv
+an
+bK
+cr
+cy
+bK
+ev
+eD
+bK
+fO
+gw
+gw
+gw
+gw
+gw
+le
+an
Qg
hN
lC
@@ -24274,22 +24533,22 @@ MO
MO
MO
MO
-Uv
-za
-za
-rG
-FZ
-za
-QG
-za
-tQ
-Jw
an
-eD
-eD
-iP
-Ei
-Uv
+bK
+bK
+cX
+dr
+bK
+cy
+bK
+fO
+gw
+ia
+iQ
+iQ
+kS
+mc
+an
Rr
Ui
ZJ
@@ -24416,22 +24675,22 @@ MO
MO
MO
MO
-Uv
-za
-za
-QG
-za
-za
-QG
-za
-tQ
-Jw
-cc
-Jw
-Jw
-lv
-Jw
-Uv
+an
+bK
+bK
+cy
+bK
+bK
+cy
+bK
+fO
+gw
+is
+gw
+gw
+kT
+gw
+an
Sy
Uu
SI
@@ -24558,22 +24817,22 @@ MO
MO
MO
MO
-Uv
-cX
-za
-bT
-qh
-za
-qq
-cX
-Uv
-CZ
-BI
-PD
-kT
-Li
-CZ
-Uv
+an
+bI
+bK
+cZ
+dt
+bK
+fJ
+bI
+an
+gd
+it
+iT
+kr
+kU
+gd
+an
TQ
YT
lC
@@ -24700,22 +24959,22 @@ MO
MO
MO
MO
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
-Uv
+an
+an
+an
+an
+an
+an
+an
+an
+an
+an
+an
+an
+an
+an
+an
+an
el
el
Kq
@@ -25297,10 +25556,10 @@ WG
WP
WP
Qi
-sI
+ag
rq
pq
-QW
+aN
fk
GJ
Fi
@@ -25316,7 +25575,7 @@ ht
ht
KR
GF
-GF
+kP
oQ
uF
pj
@@ -27214,7 +27473,7 @@ wl
wl
wl
tL
-VH
+aY
Zq
TC
ti
@@ -27872,9 +28131,9 @@ Wz
pj
db
pj
-db
+cw
pj
-db
+Rs
pj
MO
Wx
@@ -28014,9 +28273,9 @@ yh
pj
Mv
pj
-Mv
+fj
pj
-Mv
+UO
pj
MO
MO
@@ -29621,7 +29880,7 @@ AZ
yb
Bp
Uz
-jN
+bk
jL
dq
cz
@@ -30564,7 +30823,7 @@ ZR
tG
tG
ZR
-tG
+GK
tG
tG
tG
@@ -30714,8 +30973,8 @@ ng
Dg
Iy
Eb
-Eb
-Eb
+Nv
+Nv
Eb
Eb
Eb
@@ -30848,25 +31107,25 @@ tG
tG
tG
tG
-UX
+tG
tG
tG
GK
hW
+YC
+Eb
+Eb
+Eb
+Eb
+Eb
+Eb
+Eb
Eb
Eb
Eb
-Nv
-Nv
-Nv
-Nv
Eb
Eb
Eb
-Nv
-Nv
-Nv
-Nv
Eb
Eb
Eb
@@ -30994,26 +31253,26 @@ UX
tG
tG
tG
-hW
-Eb
-Eb
-Nv
-Nv
-Nv
-Nv
-Eb
-Eb
-Eb
-Nv
-Nv
-Nv
-Eb
-Eb
-Eb
-Eb
-Eb
-Eb
-Vh
+bV
+Gx
+Gx
+Gx
+Gx
+Gx
+BP
+Gx
+Gx
+Gx
+Gx
+Gx
+Gx
+Gx
+Gx
+Gx
+Gx
+Gx
+Gx
+oa
Eb
Eb
Eb
@@ -31136,17 +31395,17 @@ UX
tG
tG
tG
-hW
+NL
+YC
+Eb
+Yt
+Eb
+YC
+Qt
YC
Eb
Eb
-Eb
-Eb
-Eb
-Eb
-Eb
-Eb
-Eb
+Yt
Eb
Eb
Eb
@@ -31163,7 +31422,7 @@ Eb
Eb
Eb
Eb
-Eb
+YC
uB
Eb
Eb
@@ -31279,24 +31538,24 @@ tG
gM
tG
gB
-Gx
-Gx
-Gx
-Gx
-Gx
-Gx
-Gx
+Eb
+hr
+hr
Om
-Gx
-Gx
-Gx
-Gx
-Gx
-Gx
-Gx
-Gx
-Gx
-Gx
+Om
+gg
+Om
+Om
+Om
+hr
+hr
+Eb
+Eb
+Nv
+Nv
+Nv
+Eb
+Eb
YW
ay
ay
@@ -31421,24 +31680,24 @@ bb
ZA
GK
NL
-YC
-Eb
-Eb
-Eb
-Eb
-Yt
Eb
+hr
+gW
+Wg
+xt
+pW
+bW
RA
-Eb
-Eb
-Yt
+oX
+QU
+hr
Eb
Eb
Eb
Eb
Eb
jD
-YC
+Eb
Vh
mG
eR
@@ -31447,7 +31706,7 @@ eR
eR
eR
eR
-Eb
+YC
TK
Eb
Eb
@@ -31564,15 +31823,15 @@ Mw
ED
uu
Eb
-Eb
-Eb
-Eb
-Eb
-hr
+gb
+hF
+Wg
+xt
+Na
EM
HI
-EM
-EM
+xt
+BM
hr
dk
uR
@@ -31706,12 +31965,12 @@ kz
ED
xH
Lk
-Eb
-Eb
-qE
-qE
-hr
-qX
+gb
+vo
+Wg
+te
+WF
+xR
xR
xt
SO
@@ -31848,15 +32107,15 @@ Pi
Pi
kx
kd
-Lk
-qE
-qE
-qE
-hr
+gb
+zu
+VH
+Sx
+MT
+Wb
Wb
-DF
RI
-np
+Wb
hr
Oa
Pb
@@ -31990,13 +32249,13 @@ qE
mI
Bs
mI
-qE
-qE
-qE
-qE
hr
+PH
+Yg
+ro
+Vw
mb
-DF
+IE
vi
Yx
hr
@@ -32139,8 +32398,8 @@ yu
hr
Lf
KW
-pZ
-vi
+KW
+dV
hr
jS
BL
@@ -32162,9 +32421,9 @@ qI
Gv
Ge
Eb
-Eb
+YC
Qy
-Eb
+YC
Eb
qI
Gv
@@ -32281,7 +32540,7 @@ Mu
hr
qV
cH
-vi
+Ba
mL
hr
zT
@@ -32421,10 +32680,10 @@ ZG
pK
hM
hr
-gb
-zu
-Rs
-gb
+hr
+hr
+hr
+hr
hr
bL
Pb
@@ -32562,12 +32821,12 @@ ZO
Kg
XB
bl
-hr
-UO
-Wg
-gW
-gW
-hr
+nb
+qE
+qE
+qE
+qE
+dk
mV
Pb
Cr
@@ -32682,7 +32941,7 @@ Qb
Qb
ub
kn
-pM
+bB
RM
pM
GL
@@ -32704,12 +32963,12 @@ nb
to
EV
KA
-hr
-bV
-gW
-gW
-PH
-hr
+nb
+qE
+qE
+qE
+qE
+dk
Vb
Pb
ll
@@ -32846,12 +33105,12 @@ nb
rF
Tc
Te
-hr
-vo
-hF
-cw
-fj
-hr
+nb
+qE
+qE
+qE
+qE
+dk
mw
Pb
CL
@@ -32991,8 +33250,8 @@ DQ
DQ
DQ
DQ
-bb
-bb
+qE
+qE
dk
dk
kB
@@ -34030,9 +34289,9 @@ aw
aw
aw
aw
-xN
-QE
-xN
+iN
+mp
+iN
aw
aw
Lt
@@ -34175,7 +34434,7 @@ xD
ME
ME
ME
-iN
+mu
aw
Lt
Lt
@@ -34997,7 +35256,7 @@ MK
Wl
fv
ga
-pp
+aU
Cq
Cq
Cq
@@ -35146,14 +35405,14 @@ pe
Wl
VC
XJ
-ez
+bw
zv
NY
ER
jf
BH
-FW
-hS
+bD
+bH
JM
ph
aE
@@ -35671,7 +35930,7 @@ Ro
MK
MK
MK
-MK
+JB
qE
sm
my
@@ -35813,7 +36072,7 @@ KT
MK
MK
MK
-MK
+YI
MK
MK
MK
@@ -35953,10 +36212,10 @@ iG
MK
KT
MK
-MK
-MK
-MK
Ah
+MK
+Os
+MK
Ah
MK
MK
@@ -36095,10 +36354,10 @@ MK
MK
KT
MK
+Ah
+MK
+Os
MK
-Ah
-Ah
-Ah
Ah
Ah
Ah
@@ -36238,9 +36497,9 @@ eR
KT
MK
Ah
-Ah
-Ah
-Ah
+MK
+Os
+MK
Ah
Ah
Ah
@@ -36381,7 +36640,7 @@ KT
XX
MK
MK
-MK
+Os
MK
MK
MK
@@ -36523,7 +36782,7 @@ HG
ho
ho
ho
-ho
+hG
ho
ho
ho
@@ -36564,7 +36823,7 @@ Lt
Lt
Lt
iS
-vS
+bq
wu
aM
iS
@@ -39067,7 +39326,7 @@ df
uH
uH
eW
-eW
+RB
eW
uH
uH
@@ -39620,7 +39879,7 @@ eW
eW
eW
eW
-eW
+RB
eW
eW
eW
@@ -39651,11 +39910,11 @@ eW
eW
eW
eW
+RB
eW
eW
eW
-eW
-eW
+RB
eW
eW
eW
@@ -39823,7 +40082,7 @@ iW
iW
ce
ce
-ce
+iW
Cw
jF
vu
@@ -39922,13 +40181,13 @@ eW
eW
eW
eW
+RB
eW
eW
eW
eW
eW
-eW
-eW
+RB
eW
eW
eW
@@ -39965,7 +40224,7 @@ iW
ce
ce
ce
-ce
+iW
iW
iW
zf
@@ -40107,7 +40366,7 @@ iW
ce
ce
ce
-ce
+iW
iW
iW
zf
@@ -40199,7 +40458,7 @@ uH
uH
uH
eW
-eW
+RB
eW
eW
eW
@@ -40250,8 +40509,8 @@ ce
ce
ce
ce
-ce
-ce
+iW
+vj
Cw
jF
jF
@@ -40392,13 +40651,13 @@ ce
ce
ce
ce
+iW
+vj
+vj
+uh
+dA
ce
ce
-iW
-iW
-iW
-iW
-iW
ce
ce
ce
@@ -40535,11 +40794,11 @@ ce
ce
ce
ce
+vj
+vj
+uh
+dA
ce
-iW
-iW
-iW
-iW
ce
ce
ce
@@ -40677,10 +40936,10 @@ ce
ce
ce
ce
-ce
-ce
-ce
-ce
+dA
+dA
+dA
+dA
ce
ce
ce
diff --git a/maps/groundbase/gb-z2.dmm b/maps/groundbase/gb-z2.dmm
index 6a67f3c585c..e8a8f8356ff 100644
--- a/maps/groundbase/gb-z2.dmm
+++ b/maps/groundbase/gb-z2.dmm
@@ -22,6 +22,16 @@
},
/turf/simulated/floor/tiled/eris/cafe,
/area/groundbase/civilian/kitchen)
+"ac" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/machinery/hologram/holopad,
+/mob/living/simple_mob/vore/alienanimals/catslug/custom/medislug{
+ ghostjoin = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/groundbase/medical/lobby)
"ad" = (
/obj/structure/bed/chair/office/light{
dir = 1
@@ -35,6 +45,20 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/science/rd)
+"ae" = (
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/effect/landmark{
+ name = "lightsout"
+ },
+/mob/living/simple_mob/vore/alienanimals/catslug/custom/capslug{
+ ghostjoin = 1
+ },
+/turf/simulated/floor/tiled/dark,
+/area/groundbase/command/bridge)
"af" = (
/obj/structure/railing/grey{
dir = 8
@@ -44,6 +68,12 @@
"ag" = (
/turf/simulated/floor/outdoors/grass/virgo3c,
/area/groundbase/science/picnic)
+"ah" = (
+/obj/structure/bed/chair/office/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/groundbase/science/rnd)
"ai" = (
/obj/machinery/door/airlock{
id_tag = null;
@@ -51,6 +81,18 @@
},
/turf/simulated/floor/tiled/steel_ridged,
/area/groundbase/dorms/room2)
+"aj" = (
+/obj/machinery/button/remote/blast_door{
+ id = "cirshutters";
+ name = "Privacy Shutter Control";
+ pixel_y = 30
+ },
+/obj/machinery/atmospherics/unary/vent_pump/on,
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/groundbase/science/circuits)
"ak" = (
/obj/machinery/atmospherics/pipe/simple/hidden/cyan,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
@@ -58,6 +100,13 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/triage)
+"al" = (
+/obj/effect/landmark/start/roboticist,
+/obj/structure/bed/chair/office/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/groundbase/science/robotics)
"am" = (
/obj/item/toy/figure/mime,
/obj/item/weapon/pen/crayon/marker/mime,
@@ -90,6 +139,22 @@
},
/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
/area/groundbase/level2/ne)
+"aq" = (
+/obj/machinery/atmospherics/unary/vent_pump/on{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/machinery/camera/network/research{
+ dir = 1
+ },
+/obj/structure/table/standard,
+/obj/machinery/computer/med_data/laptop{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/groundbase/science/robotics)
"ar" = (
/obj/machinery/light,
/obj/structure/bed/double/padded,
@@ -131,6 +196,18 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/lobby)
+"av" = (
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 1
+ },
+/obj/machinery/alarm{
+ dir = 1
+ },
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/groundbase/science/robotics)
"ax" = (
/obj/structure/closet/secure_closet/personal,
/obj/item/weapon/towel/random,
@@ -466,7 +543,7 @@
/turf/simulated/floor/lino,
/area/groundbase/civilian/chapel/office)
"bl" = (
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/groundbase/civilian/kitchen/backroom)
"bn" = (
/obj/machinery/door/airlock{
@@ -510,9 +587,6 @@
/obj/machinery/atmospherics/unary/vent_pump/on,
/turf/simulated/floor/tiled/white,
/area/medical/virology)
-"bt" = (
-/turf/simulated/wall/r_wall,
-/area/groundbase/science)
"bu" = (
/obj/machinery/door/airlock/freezer{
name = "Kitchen";
@@ -673,6 +747,7 @@
/obj/machinery/light/small{
dir = 8
},
+/obj/random/paicard,
/turf/simulated/floor/wood,
/area/groundbase/command/captainq)
"bQ" = (
@@ -809,11 +884,8 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"cm" = (
/obj/structure/closet/secure_closet/freezer/meat,
/turf/simulated/floor/tiled/eris/cafe,
@@ -859,6 +931,9 @@
icon_state = "pipe-c"
},
/obj/structure/table/standard,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled,
/area/groundbase/cargo/office)
"cs" = (
@@ -866,7 +941,7 @@
dir = 8
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"ct" = (
/obj/effect/floor_decal/industrial/outline/yellow,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
@@ -1022,7 +1097,7 @@
"cU" = (
/obj/structure/table/bench/padded,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"cV" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 8
@@ -1219,7 +1294,7 @@
"dx" = (
/obj/machinery/door/airlock{
id_tag = "toilet1";
- name = "Toilet 1"
+ name = "Room 9"
},
/turf/simulated/floor/tiled/white,
/area/groundbase/dorms/bathroom)
@@ -1453,10 +1528,14 @@
/turf/simulated/floor/carpet/blucarpet,
/area/groundbase/command/captain)
"en" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/turf/simulated/floor/outdoors/sidewalk/virgo3c,
-/area/groundbase/medical/lobby)
+/obj/machinery/door/firedoor/glass,
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/plating,
+/area/groundbase/cargo/office)
"eo" = (
/obj/structure/table/standard,
/obj/item/weapon/reagent_containers/dropper,
@@ -1962,7 +2041,7 @@
dir = 4
},
/turf/simulated/floor/outdoors/grass/virgo3c,
-/area/groundbase/medical/lobby)
+/area/groundbase/level2/ne)
"fK" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -2108,6 +2187,9 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
/turf/simulated/floor/tiled,
/area/groundbase/cargo/office)
"gd" = (
@@ -2151,6 +2233,13 @@
outdoors = 0
},
/area/groundbase/cargo/office)
+"go" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/light/small/fairylights{
+ pixel_y = -2
+ },
+/turf/simulated/floor/outdoors/sidewalk/virgo3c,
+/area/groundbase/level2/nw)
"gq" = (
/obj/structure/table/woodentable,
/obj/item/weapon/paper_bin{
@@ -2318,7 +2407,7 @@
"gP" = (
/obj/machinery/button/remote/airlock{
dir = 4;
- id = "dorm6";
+ id = "dorm4";
pixel_x = -27;
specialfunctions = 4
},
@@ -2389,7 +2478,7 @@
/obj/machinery/light{
dir = 4
},
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/groundbase/civilian/kitchen/backroom)
"gZ" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
@@ -2485,7 +2574,7 @@
/obj/structure/bed/chair/sofa/black,
/obj/machinery/alarm,
/obj/effect/landmark/start/chef,
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/groundbase/civilian/kitchen/backroom)
"hp" = (
/obj/structure/bed/chair/sofa/pew/left{
@@ -2662,7 +2751,7 @@
"hL" = (
/obj/machinery/light,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"hM" = (
/obj/structure/grille,
/obj/structure/window/reinforced/full,
@@ -2709,7 +2798,7 @@
/area/rnd/xenobiology)
"hU" = (
/obj/machinery/button/remote/blast_door{
- id = "rndshutters";
+ id = "robshutters";
name = "Privacy Shutter Control";
pixel_y = 30
},
@@ -2756,7 +2845,7 @@
pixel_x = 32
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"hZ" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -2785,7 +2874,7 @@
dir = 8
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"ic" = (
/obj/structure/extinguisher_cabinet{
dir = 8;
@@ -2860,7 +2949,7 @@
icon_state = "2-4"
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"ir" = (
/obj/machinery/firealarm{
dir = 8
@@ -2948,7 +3037,7 @@
},
/obj/effect/landmark/start/intern,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"iC" = (
/turf/simulated/wall/r_wall,
/area/groundbase/command/hop)
@@ -3261,7 +3350,7 @@
dir = 4
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"jv" = (
/obj/machinery/appliance/cooker/grill,
/turf/simulated/floor/tiled/eris/cafe,
@@ -3440,7 +3529,7 @@
},
/obj/machinery/light,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"jU" = (
/obj/machinery/door/firedoor/glass,
/obj/machinery/door/airlock/glass_research{
@@ -3471,8 +3560,11 @@
/turf/simulated/floor/tiled,
/area/groundbase/civilian/janitor)
"jY" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
/turf/simulated/floor/outdoors/sidewalk/virgo3c,
-/area/groundbase/cargo/office)
+/area/groundbase/level2/ne)
"ka" = (
/obj/structure/sign/directions/stairs_up{
dir = 8;
@@ -3767,7 +3859,7 @@
pixel_y = 5
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"kY" = (
/obj/machinery/power/apc{
dir = 8
@@ -3876,6 +3968,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
+ },
/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
/area/groundbase/level2/ne)
"ll" = (
@@ -3930,7 +4025,7 @@
},
/obj/effect/landmark/start/visitor,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"lv" = (
/obj/structure/closet/secure_closet/hydroponics{
req_access = list(77)
@@ -4074,6 +4169,10 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/Chemistry)
+"lM" = (
+/obj/machinery/light/small/fairylights,
+/turf/simulated/floor/outdoors/grass/virgo3c,
+/area/groundbase/level2/nw)
"lN" = (
/obj/structure/cable/yellow{
icon_state = "1-8"
@@ -4258,7 +4357,7 @@
/obj/machinery/light{
dir = 4
},
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/groundbase/civilian/kitchen/backroom)
"mo" = (
/obj/structure/table/woodentable,
@@ -4430,7 +4529,7 @@
},
/obj/random/coin/sometimes,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"mN" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
@@ -4515,7 +4614,7 @@
/area/groundbase/civilian/janitor)
"nf" = (
/obj/structure/table/wooden_reinforced,
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/groundbase/civilian/kitchen/backroom)
"ng" = (
/obj/machinery/camera/network/research{
@@ -4641,20 +4740,6 @@
/obj/machinery/microwave,
/turf/simulated/floor/wood,
/area/groundbase/dorms/room8)
-"nC" = (
-/mob/living/simple_mob/vore/alienanimals/catslug/custom/capslug{
- ghostjoin = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/effect/landmark{
- name = "lightsout"
- },
-/turf/simulated/floor/tiled/dark,
-/area/groundbase/command/bridge)
"nD" = (
/obj/machinery/disposal/wall{
dir = 8;
@@ -4936,6 +5021,11 @@
/obj/machinery/light,
/turf/simulated/floor/tiled,
/area/groundbase/science/xenobot)
+"oy" = (
+/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c{
+ outdoors = 0
+ },
+/area/groundbase/level2/se)
"oA" = (
/obj/machinery/door/blast/regular{
id = "xenobiodiv3";
@@ -4983,6 +5073,12 @@
outdoors = 0
},
/area/groundbase/level2/se)
+"oG" = (
+/obj/machinery/light/small/fairylights{
+ pixel_y = -1
+ },
+/turf/simulated/floor/outdoors/grass/virgo3c,
+/area/groundbase/level2/nw)
"oH" = (
/turf/simulated/open/virgo3c,
/area/groundbase/level2/eastspur)
@@ -5276,7 +5372,7 @@
/area/groundbase/command/hop)
"pA" = (
/obj/structure/table/hardwoodtable,
-/obj/item/device/paicard,
+/obj/random/paicard,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -5472,6 +5568,15 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/tiled/dark,
/area/groundbase/dorms)
+"qc" = (
+/obj/structure/railing/grey{
+ dir = 1
+ },
+/obj/structure/railing/grey{
+ dir = 8
+ },
+/turf/simulated/open,
+/area/groundbase/civilian/bar)
"qd" = (
/obj/structure/sign/nanotrasen{
pixel_x = 32;
@@ -5702,6 +5807,9 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/wood,
/area/groundbase/dorms/room6)
+"qG" = (
+/turf/simulated/floor/outdoors/sidewalk/side/virgo3c,
+/area/groundbase/level2/ne)
"qH" = (
/obj/structure/table/woodentable,
/obj/random/donkpocketbox,
@@ -5746,10 +5854,18 @@
/turf/simulated/floor/tiled,
/area/groundbase/science/xenobot)
"qQ" = (
-/obj/structure/table/standard,
-/obj/structure/noticeboard{
- pixel_y = -32
+/obj/structure/closet/chefcloset,
+/obj/item/glass_jar,
+/obj/item/device/retail_scanner/civilian,
+/obj/item/weapon/soap/nanotrasen,
+/obj/item/device/destTagger{
+ pixel_x = 4;
+ pixel_y = 3
},
+/obj/item/weapon/packageWrap,
+/obj/item/weapon/packageWrap,
+/obj/item/weapon/packageWrap,
+/obj/item/weapon/tool/wrench,
/turf/simulated/floor/tiled/eris/cafe,
/area/groundbase/civilian/kitchen)
"qS" = (
@@ -5887,7 +6003,7 @@
/obj/structure/window/reinforced/full,
/obj/machinery/door/firedoor,
/turf/simulated/floor,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"rm" = (
/obj/machinery/light,
/turf/simulated/floor/wood,
@@ -6035,7 +6151,7 @@
dir = 1
},
/turf/simulated/floor/outdoors/grass/virgo3c,
-/area/groundbase/cargo/office)
+/area/groundbase/level2/ne)
"rF" = (
/obj/machinery/light/small,
/turf/simulated/floor/outdoors/grass/virgo3c,
@@ -6200,7 +6316,7 @@
},
/obj/effect/landmark/start/intern,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"se" = (
/obj/item/device/aicard,
/obj/structure/table/reinforced,
@@ -6244,7 +6360,7 @@
dir = 8
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"sn" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/light{
@@ -6383,7 +6499,7 @@
dir = 5
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"sI" = (
/obj/structure/disposalpipe/sortjunction/flipped{
dir = 1;
@@ -6462,6 +6578,13 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/bmarble,
/area/groundbase/cargo/office)
+"sQ" = (
+/obj/structure/railing/grey,
+/obj/structure/railing/grey{
+ dir = 1
+ },
+/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
+/area/groundbase/level2/eastspur)
"sS" = (
/obj/structure/grille,
/obj/structure/window/reinforced/polarized/full{
@@ -7146,18 +7269,18 @@
/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
/area/groundbase/level2/northspur)
"uU" = (
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,
/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,
/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,
@@ -7177,7 +7300,7 @@
"vb" = (
/obj/machinery/light/bigfloorlamp,
/turf/simulated/floor/outdoors/grass/virgo3c,
-/area/groundbase/medical/Chemistry)
+/area/groundbase/level2/ne)
"vc" = (
/obj/structure/sign/department/chem,
/turf/simulated/wall,
@@ -7527,7 +7650,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/effect/landmark/start/visitor,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"we" = (
/obj/structure/cable/yellow{
icon_state = "2-4"
@@ -7578,6 +7701,12 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/dorms/room1)
+"wl" = (
+/obj/machinery/light/small/fairylights{
+ pixel_y = -1
+ },
+/turf/simulated/floor/outdoors/newdirt/virgo3c,
+/area/groundbase/level2/nw)
"wm" = (
/obj/machinery/computer/supplycomp/control{
dir = 8
@@ -7634,7 +7763,7 @@
},
/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"ww" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -7792,7 +7921,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/outdoors/sidewalk/virgo3c,
-/area/groundbase/cargo/office)
+/area/groundbase/level2/ne)
"wY" = (
/obj/machinery/alarm{
dir = 8
@@ -7878,7 +8007,7 @@
icon_state = "1-2"
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"xo" = (
/obj/structure/table/reinforced,
/obj/machinery/chemical_dispenser/biochemistry/full,
@@ -8076,7 +8205,7 @@
},
/obj/machinery/alarm,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"xN" = (
/obj/machinery/door/blast/regular{
density = 0;
@@ -8102,7 +8231,7 @@
/obj/structure/table/glass,
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"xU" = (
/obj/structure/grille,
/obj/machinery/door/firedoor,
@@ -8201,13 +8330,13 @@
},
/obj/effect/landmark/start/intern,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"yh" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"yj" = (
/obj/structure/sign/directions/kitchen{
pixel_x = -32
@@ -8395,7 +8524,7 @@
pixel_x = 32
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"yJ" = (
/obj/structure/bed/chair{
dir = 4
@@ -8535,6 +8664,9 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 8
},
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled,
/area/groundbase/cargo/office)
"zg" = (
@@ -8971,7 +9103,7 @@
pixel_y = 4
},
/obj/item/weapon/circuitboard/teleporter,
-/obj/item/device/paicard{
+/obj/random/paicard{
pixel_x = 4
},
/obj/item/device/taperecorder{
@@ -9034,14 +9166,8 @@
"AK" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/power/apc{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "0-2"
- },
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"AL" = (
/obj/effect/floor_decal/industrial/outline/yellow,
/turf/simulated/floor/tiled/dark,
@@ -9165,7 +9291,7 @@
},
/obj/effect/landmark/start/visitor,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"AT" = (
/turf/simulated/floor/outdoors/grass/virgo3c,
/area/groundbase/science/xenobot)
@@ -9176,11 +9302,6 @@
},
/turf/simulated/wall,
/area/groundbase/cargo/office)
-"AV" = (
-/turf/simulated/floor/virgo3c{
- edge_blending_priority = -1
- },
-/area/groundbase/level2/westspur)
"AX" = (
/obj/structure/table/woodentable,
/obj/random/coin/sometimes,
@@ -9458,7 +9579,7 @@
icon_state = "4-8"
},
/turf/simulated/floor/bmarble,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"BU" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -9600,7 +9721,7 @@
icon_state = "4-8"
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Cj" = (
/obj/structure/sign/directions/stairs_down{
pixel_y = 38
@@ -9710,7 +9831,7 @@
dir = 1
},
/turf/simulated/open,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"CE" = (
/turf/simulated/floor/wood,
/area/groundbase/dorms/room8)
@@ -10017,7 +10138,7 @@
pixel_x = 25
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Du" = (
/turf/simulated/wall,
/area/groundbase/medical/lobby)
@@ -10040,7 +10161,7 @@
},
/obj/machinery/camera/network/civilian,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Dy" = (
/obj/structure/table/reinforced,
/obj/machinery/requests_console{
@@ -10216,7 +10337,7 @@
dir = 1
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"DV" = (
/obj/structure/table/rack,
/obj/item/weapon/tank/jetpack/oxygen,
@@ -10278,13 +10399,13 @@
},
/obj/effect/landmark/start/entertainer,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Ea" = (
/obj/structure/table/bench/padded,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Eb" = (
/obj/machinery/atmospherics/portables_connector{
dir = 1
@@ -10570,7 +10691,7 @@
/area/groundbase/medical/psych)
"EW" = (
/obj/structure/bed/chair/sofa/right/black,
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/groundbase/civilian/kitchen/backroom)
"EX" = (
/obj/structure/closet/secure_closet/quartermaster,
@@ -10589,6 +10710,10 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled/white,
/area/medical/virology)
+"EZ" = (
+/obj/machinery/light/small/fairylights,
+/turf/simulated/floor/outdoors/newdirt/virgo3c,
+/area/groundbase/level2/nw)
"Fa" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/command{
@@ -10801,7 +10926,7 @@
/area/groundbase/cargo/office)
"FF" = (
/turf/simulated/wall,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"FI" = (
/obj/structure/fence/corner{
dir = 5
@@ -10867,7 +10992,7 @@
},
/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"FU" = (
/obj/structure/table/bench/standard,
/obj/effect/landmark/start/rd,
@@ -10997,7 +11122,7 @@
icon_state = "1-4"
},
/turf/simulated/wall,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Gp" = (
/turf/simulated/wall,
/area/groundbase/level2/nw)
@@ -11103,6 +11228,12 @@
/obj/machinery/atmospherics/pipe/manifold4w/visible,
/turf/simulated/floor/tiled,
/area/groundbase/science/xenobot/storage)
+"Gz" = (
+/obj/structure/railing/grey{
+ dir = 1
+ },
+/turf/simulated/open,
+/area/groundbase/civilian/bar)
"GA" = (
/obj/structure/table/wooden_reinforced,
/obj/machinery/atmospherics/unary/vent_scrubber/on{
@@ -11399,6 +11530,18 @@
},
/turf/simulated/floor/bmarble,
/area/groundbase/civilian/chapel)
+"Hr" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/light/small/fairylights{
+ pixel_y = -2
+ },
+/turf/simulated/floor/outdoors/sidewalk/virgo3c,
+/area/groundbase/level2/nw)
"Hs" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -11449,10 +11592,6 @@
},
/turf/simulated/floor/bmarble,
/area/groundbase/cargo/office)
-"Hy" = (
-/obj/effect/landmark/start/roboticist,
-/turf/simulated/floor/tiled,
-/area/groundbase/science/robotics)
"Hz" = (
/obj/structure/table/marble,
/obj/machinery/camera/network/civilian{
@@ -11619,6 +11758,14 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/dorms/room7)
+"HW" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/freezer{
+ name = "Kitchen";
+ req_access = list(28)
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"HX" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -11894,8 +12041,15 @@
/turf/simulated/floor/tiled,
/area/groundbase/science/xenobot)
"IK" = (
-/turf/simulated/floor/outdoors/grass/virgo3c,
-/area/groundbase/medical/lobby)
+/obj/effect/floor_decal/industrial/outline/yellow,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/tiled/virgo3c{
+ edge_blending_priority = -1;
+ outdoors = 0
+ },
+/area/groundbase/cargo/office)
"IL" = (
/obj/machinery/transhuman/resleever,
/turf/simulated/floor/tiled,
@@ -12040,15 +12194,6 @@
"Jc" = (
/turf/simulated/floor/outdoors/grass/forest/virgo3c,
/area/groundbase/level2/nw)
-"Jd" = (
-/obj/machinery/button/remote/blast_door{
- id = "cirshutters";
- name = "Privacy Shutter Control";
- pixel_y = 30
- },
-/obj/machinery/atmospherics/unary/vent_pump/on,
-/turf/simulated/floor/tiled,
-/area/groundbase/science/circuits)
"Je" = (
/obj/effect/floor_decal/chapel,
/obj/structure/disposalpipe/segment,
@@ -12216,7 +12361,7 @@
dir = 8
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"JD" = (
/obj/machinery/appliance/cooker/oven,
/turf/simulated/floor/tiled/eris/cafe,
@@ -12498,8 +12643,8 @@
/turf/simulated/floor/tiled,
/area/groundbase/cargo/office)
"Kl" = (
-/turf/simulated/floor/outdoors/grass/virgo3c,
-/area/groundbase/cargo/office)
+/turf/simulated/open/virgo3c,
+/area/groundbase/level2/nw)
"Km" = (
/obj/effect/shuttle_landmark{
base_area = /area/groundbase/cargo/bay;
@@ -12595,7 +12740,7 @@
dir = 4
},
/turf/simulated/floor/outdoors/sidewalk/side/virgo3c,
-/area/groundbase/medical/triage)
+/area/groundbase/level2/ne)
"KB" = (
/obj/structure/flora/pottedplant/minitree,
/turf/simulated/floor/wood,
@@ -13058,7 +13203,7 @@
"LS" = (
/obj/structure/table/glass,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"LT" = (
/obj/machinery/light/small{
dir = 8
@@ -13079,7 +13224,7 @@
dir = 4
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"LW" = (
/obj/structure/sign/xenobio{
plane = -34
@@ -13357,7 +13502,7 @@
icon_state = "1-2"
},
/turf/simulated/wall,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"ME" = (
/turf/simulated/wall,
/area/groundbase/civilian/chapel/office)
@@ -13426,6 +13571,9 @@
dir = 1
},
/obj/item/weapon/stamp/accepted,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled,
/area/groundbase/cargo/office)
"MR" = (
@@ -13444,12 +13592,6 @@
edge_blending_priority = -1
},
/area/groundbase/level2/ne)
-"MU" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/simulated/floor/outdoors/grass/virgo3c,
-/area/groundbase/medical/Chemistry)
"MV" = (
/obj/machinery/alarm{
dir = 8
@@ -13616,16 +13758,6 @@
},
/turf/simulated/floor/tiled/steel_ridged,
/area/groundbase/medical/triage)
-"Np" = (
-/mob/living/simple_mob/vore/alienanimals/catslug/custom/medislug{
- ghostjoin = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/hologram/holopad,
-/turf/simulated/floor/tiled/white,
-/area/groundbase/medical/lobby)
"Nq" = (
/turf/simulated/floor/reinforced/virgo3c{
edge_blending_priority = -1
@@ -13650,10 +13782,10 @@
dir = 8
},
/turf/simulated/floor/outdoors/grass/virgo3c,
-/area/groundbase/medical/triage)
+/area/groundbase/level2/ne)
"Ny" = (
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Nz" = (
/obj/structure/bed/chair/sofa/pew/right{
dir = 1
@@ -13794,7 +13926,7 @@
/obj/structure/bed/chair/sofa/black{
dir = 8
},
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/groundbase/civilian/kitchen/backroom)
"NU" = (
/obj/structure/sign/painting/library_secure{
@@ -13893,7 +14025,7 @@
/obj/structure/bed/chair/sofa/left/black{
dir = 8
},
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/groundbase/civilian/kitchen/backroom)
"Oi" = (
/obj/structure/disposalpipe/tagger{
@@ -13915,7 +14047,7 @@
layer = 3.3;
pixel_y = -27
},
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/groundbase/civilian/kitchen/backroom)
"Ok" = (
/obj/machinery/power/apc{
@@ -13999,7 +14131,7 @@
pixel_y = -32
},
/turf/simulated/floor/outdoors/grass/virgo3c,
-/area/groundbase/medical/lobby)
+/area/groundbase/level2/ne)
"Ov" = (
/obj/structure/closet/wardrobe/robotics_black,
/turf/simulated/floor/tiled,
@@ -14055,7 +14187,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/computer/timeclock/premade/east,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"OD" = (
/obj/structure/table/reinforced,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -14099,7 +14231,7 @@
/turf/simulated/floor/virgo3c{
edge_blending_priority = -1
},
-/area/groundbase/level2/northspur)
+/area/groundbase/level2/nw)
"OJ" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -14300,6 +14432,9 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 6
},
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled,
/area/groundbase/cargo/office)
"Pp" = (
@@ -14487,7 +14622,7 @@
dir = 8
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"PT" = (
/obj/machinery/button/remote/airlock{
dir = 8;
@@ -14513,7 +14648,7 @@
dir = 4
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"PV" = (
/turf/simulated/floor/wood,
/area/groundbase/dorms/room2)
@@ -15015,7 +15150,7 @@
dir = 1
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Rn" = (
/obj/machinery/atmospherics/binary/pump{
dir = 1;
@@ -15024,11 +15159,14 @@
/turf/simulated/floor/tiled,
/area/groundbase/science/xenobot/storage)
"Ro" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
},
-/turf/simulated/floor/outdoors/sidewalk/side/virgo3c,
-/area/groundbase/medical/lobby)
+/turf/simulated/floor/tiled/virgo3c{
+ edge_blending_priority = -1;
+ outdoors = 0
+ },
+/area/groundbase/cargo/office)
"Rp" = (
/mob/living/simple_mob/animal/passive/cow,
/turf/simulated/floor/outdoors/grass/forest/virgo3c,
@@ -15141,6 +15279,9 @@
},
/turf/simulated/floor/outdoors/grass/virgo3c,
/area/groundbase/science/rnd)
+"RF" = (
+/turf/simulated/open/virgo3c,
+/area/groundbase/level2/se)
"RG" = (
/obj/machinery/camera/network/civilian{
dir = 8
@@ -15236,7 +15377,7 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"RV" = (
/obj/structure/cable/yellow{
icon_state = "1-8"
@@ -15408,20 +15549,10 @@
/turf/simulated/floor/tiled/dark,
/area/groundbase/dorms)
"Ss" = (
-/obj/structure/closet/chefcloset,
-/obj/item/glass_jar,
-/obj/item/device/retail_scanner/civilian,
-/obj/item/weapon/soap/nanotrasen,
-/obj/item/device/destTagger{
- pixel_x = 4;
- pixel_y = 3
+/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c{
+ outdoors = 0
},
-/obj/item/weapon/packageWrap,
-/obj/item/weapon/packageWrap,
-/obj/item/weapon/packageWrap,
-/obj/item/weapon/tool/wrench,
-/turf/simulated/floor/tiled/eris/cafe,
-/area/groundbase/civilian/kitchen)
+/area/groundbase/level2/nw)
"St" = (
/obj/structure/fence/corner{
dir = 8
@@ -15923,7 +16054,7 @@
/obj/machinery/light,
/obj/effect/landmark/start/entertainer,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"TO" = (
/obj/structure/bed/chair/office/dark,
/obj/effect/landmark/start/cargo,
@@ -15941,7 +16072,7 @@
dir = 4
},
/turf/simulated/floor/bmarble,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"TT" = (
/obj/structure/railing/grey{
dir = 8
@@ -15991,21 +16122,13 @@
},
/turf/simulated/floor/tiled,
/area/rnd/xenobiology)
+"Uc" = (
+/obj/structure/stairs/spawner/south,
+/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
+/area/groundbase/level2/nw)
"Ud" = (
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/lobby)
-"Ue" = (
-/obj/machinery/atmospherics/unary/vent_pump/on{
- dir = 1
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/camera/network/research{
- dir = 1
- },
-/turf/simulated/floor/tiled,
-/area/groundbase/science/robotics)
"Uf" = (
/obj/structure/filingcabinet/filingcabinet,
/obj/machinery/camera/network/command,
@@ -16032,6 +16155,9 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/science/xenobot/storage)
+"Ui" = (
+/turf/simulated/open,
+/area/groundbase/civilian/bar)
"Uj" = (
/obj/machinery/door/blast/regular{
id = "xenobiodiv4";
@@ -16054,7 +16180,7 @@
icon_state = "1-8"
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Un" = (
/obj/machinery/atmospherics/pipe/simple/hidden/cyan{
dir = 10
@@ -16118,14 +16244,14 @@
"Ux" = (
/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Uy" = (
/obj/machinery/light{
dir = 4
},
/obj/random/vendorall,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Uz" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -16192,8 +16318,14 @@
/turf/simulated/mineral/cave/virgo3c,
/area/groundbase/unexplored/rock)
"UI" = (
-/turf/simulated/floor/outdoors/grass/virgo3c,
-/area/groundbase/medical/Chemistry)
+/obj/machinery/power/apc{
+ dir = 8
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-2"
+ },
+/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
+/area/groundbase/level2/ne)
"UK" = (
/obj/structure/table/glass,
/obj/item/weapon/storage/box/beakers{
@@ -16397,7 +16529,7 @@
"Vm" = (
/obj/machinery/light/small,
/turf/simulated/floor/outdoors/grass/virgo3c,
-/area/groundbase/medical/lobby)
+/area/groundbase/level2/ne)
"Vo" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 6
@@ -16418,8 +16550,14 @@
/turf/simulated/floor/tiled,
/area/groundbase/science/hall)
"Vs" = (
-/turf/simulated/open/virgo3c,
-/area/groundbase/level2/se)
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/outdoors/sidewalk/side/virgo3c,
+/area/groundbase/level2/ne)
"Vt" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -16697,7 +16835,7 @@
dir = 4
},
/turf/simulated/wall,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Wd" = (
/obj/structure/railing/grey{
dir = 8
@@ -16749,7 +16887,7 @@
},
/obj/effect/landmark/start/entertainer,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Wj" = (
/turf/simulated/wall,
/area/groundbase/cargo/office)
@@ -16835,6 +16973,7 @@
dir = 4;
pixel_x = -30
},
+/obj/random/paicard,
/turf/simulated/floor/tiled,
/area/groundbase/science/rd)
"Wz" = (
@@ -16947,15 +17086,6 @@
edge_blending_priority = 0.1
},
/area/groundbase/civilian/kitchen)
-"WU" = (
-/obj/machinery/atmospherics/unary/vent_scrubber/on{
- dir = 1
- },
-/obj/machinery/alarm{
- dir = 1
- },
-/turf/simulated/floor/tiled,
-/area/groundbase/science/robotics)
"WV" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 8
@@ -17058,7 +17188,7 @@
/obj/structure/table/bench/padded,
/obj/effect/landmark/start/visitor,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Xl" = (
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 8
@@ -17150,7 +17280,7 @@
pixel_x = -25
},
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"XB" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
@@ -17365,7 +17495,7 @@
},
/obj/machinery/firealarm,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Yg" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 6
@@ -17389,7 +17519,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Ym" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
dir = 1
@@ -17421,7 +17551,7 @@
"Yr" = (
/obj/structure/sign/department/bar,
/turf/simulated/wall,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"Ys" = (
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 1
@@ -17560,7 +17690,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled/dark,
-/area/groundbase/civilian/bar/upper)
+/area/groundbase/civilian/bar)
"YS" = (
/obj/machinery/biogenerator,
/turf/simulated/floor/tiled,
@@ -17676,7 +17806,7 @@
/area/groundbase/cargo/office)
"Zi" = (
/obj/machinery/firealarm,
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/groundbase/civilian/kitchen/backroom)
"Zk" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -17762,6 +17892,9 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/effect/landmark/start/qm,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled,
/area/groundbase/cargo/office)
"Zz" = (
@@ -17798,8 +17931,14 @@
/turf/simulated/floor/wood,
/area/groundbase/cargo/qm)
"ZE" = (
-/turf/simulated/floor/outdoors/newdirt/virgo3c,
-/area/groundbase/cargo/office)
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/turf/simulated/floor/outdoors/sidewalk/side/virgo3c,
+/area/groundbase/level2/ne)
"ZF" = (
/obj/structure/table/glass,
/obj/item/weapon/storage/box/gloves{
@@ -18121,12 +18260,12 @@ UH
UH
UH
UH
-UH
-UH
-UH
-UH
-UH
-UH
+xE
+xE
+xE
+xE
+xE
+xE
xE
xE
xE
@@ -18263,12 +18402,12 @@ UH
UH
UH
UH
-UH
-UH
-UH
-UH
-UH
-UH
+xE
+xE
+xE
+xE
+xE
+xE
xE
xE
xE
@@ -18404,13 +18543,13 @@ UH
UH
UH
UH
-UH
-UH
-UH
-UH
-UH
-UH
wS
+Ss
+Kl
+Kl
+xE
+xE
+KW
xE
xE
xE
@@ -18545,14 +18684,14 @@ UH
UH
UH
UH
-UH
-UH
-UH
-UH
wS
wS
-wS
-Fw
+Ss
+Kl
+Kl
+xE
+KW
+Fs
Fs
pw
bY
@@ -18687,14 +18826,14 @@ UH
UH
UH
UH
-UH
wS
wS
wS
wS
wS
-wS
-Fw
+xE
+Fs
+Fs
Fs
pw
bY
@@ -18834,9 +18973,9 @@ wS
wS
UH
wS
-UH
-UH
-Fw
+xE
+Fs
+Fs
Fs
pw
bY
@@ -18975,11 +19114,11 @@ wS
wS
wS
wS
-wS
-UH
-UH
Fw
Fs
+Fs
+Fs
+Fs
xE
bY
bY
@@ -19116,11 +19255,11 @@ wS
wS
wS
wS
-wS
-UH
-UH
-UH
-wS
+Fw
+Fw
+Fs
+Fs
+KW
KW
xE
bY
@@ -19260,9 +19399,9 @@ wS
wS
wS
wS
-UH
-UH
-UH
+Fs
+xE
+xE
xE
xE
bY
@@ -21416,11 +21555,11 @@ il
il
LA
bY
-Jc
-Jc
-Jc
bY
bY
+Jc
+Jc
+Jc
bY
bY
bY
@@ -21556,12 +21695,12 @@ bY
bY
bY
bY
-bY
-bY
-bY
-bY
-bY
-bY
+Hn
+Ja
+Hn
+Hn
+Uc
+Gp
bY
bY
bY
@@ -21700,7 +21839,7 @@ Vl
Vl
Vl
Vl
-Vl
+HW
Vl
Vl
JJ
@@ -21842,7 +21981,7 @@ Oz
Ej
ep
LD
-Ss
+Gc
Wp
JO
JJ
@@ -22747,7 +22886,7 @@ Rh
EJ
YI
ng
-bt
+PD
AH
lO
Ga
@@ -22889,7 +23028,7 @@ Rh
bO
AZ
ff
-bt
+PD
IO
qW
PZ
@@ -23031,7 +23170,7 @@ Rh
ff
AZ
ff
-bt
+PD
nw
qW
lw
@@ -23173,7 +23312,7 @@ Rh
Fk
AZ
yw
-bt
+PD
ws
qW
lw
@@ -23305,7 +23444,7 @@ mP
mP
FL
Rh
-Jd
+aj
UX
Dn
ww
@@ -23315,7 +23454,7 @@ Rh
vh
Nb
Ys
-bt
+PD
aB
PR
lw
@@ -23391,7 +23530,7 @@ Bb
Bb
Iz
yh
-GS
+qc
CD
FF
bY
@@ -23457,7 +23596,7 @@ Rh
PD
qU
PD
-bt
+PD
Ov
PR
lw
@@ -23533,8 +23672,8 @@ Ny
Ny
Ny
yh
-YO
-Gl
+Gz
+Ui
rl
bY
sZ
@@ -24112,13 +24251,13 @@ bY
bY
pw
pw
-LT
+lM
ml
LT
-pw
+EZ
pw
bY
-bY
+lM
bY
bY
bY
@@ -24254,13 +24393,13 @@ bY
bY
bY
bY
-pw
+wl
ml
pw
+oG
bY
bY
-bY
-bY
+oG
bY
bY
bY
@@ -24396,13 +24535,13 @@ Hm
Hm
Hm
Hm
-Hm
+Hr
pJ
sF
-sF
+go
sF
vV
-sF
+go
sF
sF
sF
@@ -24442,7 +24581,7 @@ pt
RE
Wn
hU
-Hy
+al
CA
AR
ov
@@ -24538,13 +24677,13 @@ bY
bY
bY
bY
-pw
+wl
sN
pw
-bY
+oG
bY
Oa
-bY
+oG
bY
bY
bY
@@ -24680,13 +24819,13 @@ bY
bY
bY
bY
-yS
+lM
sN
bY
-bY
+lM
bY
Oa
-yS
+lM
bY
Aq
bY
@@ -24721,7 +24860,7 @@ bZ
Fm
Fm
Fm
-Fm
+ah
Fm
MR
Wn
@@ -25018,7 +25157,7 @@ de
Wn
Yz
ir
-Ue
+aq
Wn
Gu
Nn
@@ -25160,7 +25299,7 @@ Ph
bD
Hb
wp
-WU
+av
Wn
zT
zT
@@ -25544,12 +25683,12 @@ In
bY
bY
bY
-AV
-AV
-AV
-AV
-AV
-AV
+OI
+OI
+OI
+OI
+OI
+OI
eN
eN
eN
@@ -25688,10 +25827,10 @@ bY
bY
bY
bY
-AV
-AV
-AV
-AV
+OI
+OI
+OI
+OI
eN
eN
eN
@@ -25830,10 +25969,10 @@ bY
bY
bY
bY
-AV
-AV
-AV
-AV
+OI
+OI
+OI
+OI
eN
eN
eN
@@ -25972,10 +26111,10 @@ bY
bY
bY
bY
-AV
-AV
-AV
-AV
+OI
+OI
+OI
+OI
eN
eN
eN
@@ -26113,11 +26252,11 @@ bY
bY
bY
bY
-AV
-AV
-AV
-AV
-AV
+OI
+OI
+OI
+OI
+OI
eN
eN
eN
@@ -26254,12 +26393,12 @@ In
bY
bY
bY
-AV
-AV
-AV
-AV
-AV
-AV
+OI
+OI
+OI
+OI
+OI
+OI
eN
eN
eN
@@ -27934,16 +28073,16 @@ VR
VR
VR
VR
-VR
-VR
-VR
-VR
-VR
-VR
-VR
-VR
-VR
-VR
+fp
+fp
+fp
+fp
+fp
+fp
+fp
+fp
+fp
+fp
VR
VR
VR
@@ -28076,16 +28215,16 @@ VR
VR
VR
VR
-VR
-VR
-VR
-VR
-VR
-VR
-VR
-VR
-VR
-VR
+fp
+fp
+fp
+fp
+fp
+fp
+fp
+fp
+fp
+fp
VR
VR
VR
@@ -28218,21 +28357,21 @@ Wd
VR
VR
VR
-VR
-VR
-VR
-VR
+fp
+fp
+fp
+fp
to
-OI
-OI
+fp
+fp
to
to
to
-VR
-QD
-QD
-QD
-QD
+fp
+fp
+fp
+fp
+fp
VR
oH
oH
@@ -28360,8 +28499,8 @@ BW
VR
to
to
-VR
-VR
+fp
+fp
to
to
to
@@ -28370,12 +28509,12 @@ to
to
to
to
-QD
-QD
-QD
-QD
-QD
-QD
+fp
+fp
+fp
+fp
+fp
+fp
oH
oH
oH
@@ -28512,12 +28651,12 @@ iw
iw
to
to
-QD
-QD
-QD
-QD
-QD
-QD
+fp
+fp
+fp
+fp
+fp
+fp
oH
oH
oH
@@ -28632,7 +28771,7 @@ Qi
PJ
nP
YZ
-Kl
+to
Aw
XJ
to
@@ -28656,10 +28795,10 @@ iw
to
to
to
-QD
-QD
-QD
-QD
+fp
+fp
+fp
+fp
oH
oH
oH
@@ -28774,14 +28913,14 @@ sP
sI
Zh
nP
-ZE
+XJ
Aw
to
to
Ou
-IK
-IK
-Ro
+to
+to
+NC
fJ
to
to
@@ -28799,9 +28938,9 @@ to
to
to
to
-QD
-QD
-QD
+fp
+fp
+fp
oH
oH
oH
@@ -28920,7 +29059,7 @@ wX
Sp
to
to
-IK
+to
Du
mv
ci
@@ -28941,9 +29080,9 @@ to
to
to
to
-QD
-QD
-QD
+fp
+fp
+fp
oH
oH
oH
@@ -29058,11 +29197,11 @@ mq
uq
nP
nP
-Kl
+to
iD
XJ
to
-IK
+to
mv
We
tw
@@ -29084,8 +29223,8 @@ to
to
to
to
-QD
-QD
+fp
+fp
oH
oH
oH
@@ -29196,15 +29335,15 @@ cr
Po
Zy
MQ
-mq
-uq
-nP
-nP
+en
+IK
+Ro
+Ro
jY
lk
gZ
gZ
-en
+gZ
Ft
mT
lr
@@ -29226,8 +29365,8 @@ to
to
to
to
-QD
-QD
+fp
+fp
oH
oH
oH
@@ -29342,8 +29481,8 @@ UL
gn
nP
nP
-ZE
-NC
+XJ
+Vs
to
to
Vm
@@ -29368,8 +29507,8 @@ to
to
to
to
-QD
-QD
+fp
+fp
oH
oH
oH
@@ -29484,8 +29623,8 @@ dH
Jt
gI
Lz
-Kl
-NC
+to
+Vs
to
to
to
@@ -29509,9 +29648,9 @@ to
to
to
to
-QD
-QD
-QD
+fp
+fp
+fp
oH
oH
oH
@@ -29627,7 +29766,7 @@ oa
oa
Wj
rE
-NC
+Vs
to
to
to
@@ -29649,11 +29788,11 @@ yG
yL
to
to
-QD
-QD
-QD
-QD
-QD
+fp
+fp
+fp
+fp
+fp
oH
oH
oH
@@ -29767,9 +29906,9 @@ dv
Wj
to
to
-to
-to
-NC
+UI
+jY
+ZE
to
to
to
@@ -29792,9 +29931,9 @@ yL
to
to
to
-QD
-QD
-QD
+fp
+fp
+fp
oH
oH
oH
@@ -30060,7 +30199,7 @@ to
HL
WZ
cM
-Np
+ac
WQ
qT
Bx
@@ -30220,7 +30359,7 @@ to
to
to
to
-QD
+fp
oH
oH
oH
@@ -30362,7 +30501,7 @@ to
to
to
to
-QD
+fp
oH
oH
oH
@@ -30504,7 +30643,7 @@ to
to
to
to
-QD
+fp
oH
oH
oH
@@ -30646,7 +30785,7 @@ to
to
to
to
-QD
+fp
oH
oH
oH
@@ -30668,7 +30807,7 @@ vr
sx
ld
jg
-nC
+ae
ss
Mb
vr
@@ -30788,7 +30927,7 @@ to
iw
to
to
-QD
+fp
oH
oH
oH
@@ -30929,8 +31068,8 @@ to
iw
to
to
-QD
-QD
+fp
+fp
oH
oH
oH
@@ -31071,8 +31210,8 @@ to
iw
to
to
-QD
-QD
+fp
+fp
oH
oH
oH
@@ -31213,8 +31352,8 @@ to
iw
to
to
-QD
-QD
+fp
+fp
oH
oH
oH
@@ -31355,8 +31494,8 @@ to
iw
iw
to
-QD
-QD
+fp
+fp
oH
oH
oH
@@ -31618,7 +31757,7 @@ to
NC
to
to
-UI
+to
sW
Mi
Xc
@@ -31760,7 +31899,7 @@ to
NC
to
vb
-UI
+to
sW
sW
ki
@@ -31902,9 +32041,9 @@ to
NC
XJ
to
-UI
-MU
-UI
+to
+Nw
+to
to
to
to
@@ -32183,7 +32322,7 @@ vk
zt
to
vb
-to
+qG
to
to
to
@@ -32325,7 +32464,7 @@ to
oH
oH
oH
-oH
+sQ
to
to
to
@@ -36036,7 +36175,7 @@ Bo
At
Bo
Bo
-Bo
+UE
UE
UE
Bo
@@ -36178,10 +36317,10 @@ Bo
At
tA
Bo
+Bo
+UE
UE
UE
-Bo
-Bo
Bo
Bu
KG
@@ -36319,12 +36458,12 @@ oH
Bo
At
gC
-UE
-UE
-UE
Bo
Bo
Bo
+UE
+UE
+Bo
Bu
KG
cG
@@ -36461,11 +36600,11 @@ oH
Bo
Bo
sr
-UE
-UE
-UE
Bo
Bo
+UE
+UE
+Bo
Bo
pe
nT
@@ -36604,7 +36743,7 @@ Bo
Bo
Bo
Bo
-UE
+Bo
UE
Bo
Bo
@@ -36745,7 +36884,7 @@ Bo
Bo
Bo
Bo
-Bo
+UE
Bo
Bo
Bo
@@ -36764,10 +36903,10 @@ cG
Zc
pe
fk
-UH
+fk
UH
wS
-UH
+wS
UH
UH
wS
@@ -36906,11 +37045,11 @@ Ju
Vz
pe
fk
-UH
+fk
+tN
+tN
wS
wS
-UH
-UH
wS
wS
wS
@@ -37025,7 +37164,7 @@ oH
oH
oH
oH
-Vs
+oH
fk
fk
fk
@@ -37047,13 +37186,13 @@ pe
Vj
LJ
pe
-fk
-UH
+RF
+RF
+oy
+tN
wS
wS
wS
-UH
-wS
wS
wS
wS
@@ -37189,10 +37328,10 @@ pe
pe
pe
pe
-fk
-UH
-wS
-wS
+RF
+RF
+oy
+tN
wS
wS
wS
@@ -37332,9 +37471,9 @@ fk
fk
fk
fk
-UH
-wS
-wS
+fk
+tN
+tN
wS
wS
wS
@@ -37474,10 +37613,10 @@ fk
fk
fk
fk
-UH
-UH
-wS
-wS
+fk
+fk
+tN
+tN
wS
UH
UH
@@ -37616,10 +37755,10 @@ fk
fk
fk
fk
-UH
-UH
-UH
-UH
+fk
+fk
+fk
+fk
UH
UH
UH
diff --git a/maps/groundbase/gb-z3.dmm b/maps/groundbase/gb-z3.dmm
index d2eb7dbd379..508002d17d7 100644
--- a/maps/groundbase/gb-z3.dmm
+++ b/maps/groundbase/gb-z3.dmm
@@ -2,6 +2,24 @@
"aa" = (
/turf/simulated/wall,
/area/groundbase/exploration/equipment)
+"ab" = (
+/obj/machinery/suit_cycler/medical,
+/obj/structure/sign/scenery/fakefireaxe{
+ pixel_y = 32
+ },
+/turf/simulated/floor/tiled/white,
+/area/groundbase/medical/paramedic)
+"ac" = (
+/obj/effect/landmark/start/pilot,
+/obj/structure/closet/walllocker_double{
+ dir = 8;
+ name = "misc equipment cabinet";
+ pixel_x = -32
+ },
+/obj/item/weapon/storage/box/nifsofts_pilot,
+/obj/item/device/multitool/groundbase_buffered,
+/turf/simulated/floor/tiled,
+/area/groundbase/civilian/pilot)
"ak" = (
/obj/structure/table/glass,
/obj/item/weapon/paper_bin,
@@ -19,6 +37,12 @@
},
/turf/simulated/floor/carpet,
/area/groundbase/medical/cmo)
+"aN" = (
+/obj/item/weapon/stool/padded{
+ dir = 4
+ },
+/turf/simulated/floor/wmarble,
+/area/groundbase/civilian/kitchen)
"aQ" = (
/obj/structure/table/glass,
/obj/item/weapon/folder/white_cmo,
@@ -115,12 +139,18 @@
/obj/effect/shuttle_landmark{
base_area = /area/groundbase/level3/escapepad;
base_turf = /turf/simulated/floor/outdoors/sidewalk/slab/virgo3c;
- docking_controller = "escape_dock";
+ docking_controller = null;
landmark_tag = "escape_station";
name = "Ship Arrivals"
},
/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
/area/groundbase/level3/escapepad)
+"cD" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"cE" = (
/obj/structure/bed/chair/shuttle{
dir = 8
@@ -291,6 +321,11 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/uhallway)
+"fn" = (
+/obj/structure/table/steel,
+/obj/random/paicard,
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"fu" = (
/obj/structure/table/bench/marble,
/obj/effect/landmark/start/chemist,
@@ -393,6 +428,11 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/uhallway)
+"gV" = (
+/obj/structure/railing,
+/obj/structure/table/steel,
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"gZ" = (
/obj/structure/cable/yellow{
icon_state = "1-4"
@@ -418,6 +458,13 @@
},
/turf/simulated/floor/tiled,
/area/shuttle/groundbase/exploration)
+"hM" = (
+/obj/structure/railing,
+/obj/structure/bed/chair/backed_red{
+ dir = 4
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"hN" = (
/obj/structure/table/bench/marble,
/obj/effect/landmark/start/medical,
@@ -455,6 +502,9 @@
},
/turf/simulated/floor,
/area/groundbase/medical/patient4)
+"ip" = (
+/turf/simulated/floor/carpet/retro,
+/area/groundbase/dorms/bathroom)
"it" = (
/obj/structure/grille,
/obj/structure/window/reinforced/full,
@@ -547,6 +597,10 @@
},
/turf/simulated/floor/tiled/steel_ridged,
/area/groundbase/medical/cmo)
+"jP" = (
+/obj/structure/bed/chair/sofa/corp/right,
+/turf/simulated/floor/carpet/retro,
+/area/groundbase/dorms/bathroom)
"jX" = (
/obj/structure/grille,
/obj/machinery/door/firedoor,
@@ -628,6 +682,23 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/patient4)
+"lD" = (
+/obj/machinery/door/window/southleft{
+ dir = 1;
+ name = "shower door";
+ req_access = null
+ },
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 10
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/groundbase/dorms/bathroom)
"lF" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/tiled/white,
@@ -673,6 +744,16 @@
},
/turf/simulated/wall/r_wall,
/area/groundbase/level3/escapepad)
+"mS" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/structure/table/steel,
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
+"mT" = (
+/turf/simulated/floor/wmarble,
+/area/groundbase/civilian/kitchen)
"mU" = (
/obj/structure/cable/yellow{
icon_state = "1-4"
@@ -688,6 +769,12 @@
},
/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
/area/groundbase/level3/nw)
+"mY" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/wmarble,
+/area/groundbase/civilian/kitchen)
"nb" = (
/obj/structure/grille,
/obj/structure/window/reinforced/polarized/full{
@@ -696,6 +783,15 @@
/obj/machinery/door/firedoor,
/turf/simulated/floor,
/area/groundbase/medical/cmo)
+"nh" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"nq" = (
/obj/structure/railing/grey{
dir = 1
@@ -742,8 +838,18 @@
dir = 1
},
/obj/machinery/light,
+/obj/random/paicard,
/turf/simulated/floor/wood,
/area/groundbase/medical/cmo)
+"nD" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/structure/bed/chair/backed_red{
+ dir = 4
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"nN" = (
/obj/machinery/light,
/obj/effect/landmark/start/explorer,
@@ -800,6 +906,12 @@
/obj/effect/overmap/visitable/sector/virgo3c,
/turf/unsimulated/wall/planetary/virgo3c,
/area/groundbase/level3/sw)
+"oI" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/wmarble,
+/area/groundbase/civilian/kitchen)
"oK" = (
/obj/structure/grille,
/obj/structure/window/reinforced/full,
@@ -853,6 +965,10 @@
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/patient4)
+"pa" = (
+/obj/item/weapon/stool/padded,
+/turf/simulated/floor/wmarble,
+/area/groundbase/civilian/kitchen)
"pd" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/obj/machinery/alarm{
@@ -921,6 +1037,12 @@
edge_blending_priority = -1
},
/area/groundbase/exploration/shuttlepad)
+"pP" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/wmarble,
+/area/groundbase/civilian/kitchen)
"pY" = (
/obj/structure/sign/nanotrasen,
/turf/simulated/wall,
@@ -1001,6 +1123,13 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/patient1)
+"rr" = (
+/obj/structure/railing,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"rD" = (
/obj/structure/bookcase,
/obj/machinery/atmospherics/unary/vent_pump/on,
@@ -1027,6 +1156,13 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/exploration/equipment)
+"sa" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/machinery/light,
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"sb" = (
/obj/machinery/power/apc{
dir = 8
@@ -1117,6 +1253,12 @@
"tZ" = (
/turf/simulated/mineral/cave/virgo3c,
/area/groundbase/level3/se)
+"ud" = (
+/obj/structure/bed/chair/backed_red{
+ dir = 8
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"ui" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled/white,
@@ -1130,6 +1272,12 @@
},
/turf/simulated/floor/tiled,
/area/shuttle/groundbase/exploration)
+"uv" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/groundbase/dorms/bathroom)
"uF" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -1193,6 +1341,20 @@
edge_blending_priority = -1
},
/area/groundbase/exploration/shuttlepad)
+"vD" = (
+/obj/machinery/alarm,
+/obj/structure/bed/chair/sofa/corp/left,
+/turf/simulated/floor/carpet/retro,
+/area/groundbase/dorms/bathroom)
+"vJ" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"vV" = (
/obj/structure/bed/chair/shuttle{
dir = 8
@@ -1357,6 +1519,10 @@
/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/paramedic)
+"yu" = (
+/obj/machinery/light,
+/turf/simulated/floor/wmarble,
+/area/groundbase/civilian/kitchen)
"yy" = (
/obj/structure/dispenser{
phorontanks = 0
@@ -1473,6 +1639,12 @@
},
/turf/simulated/floor/tiled,
/area/shuttle/groundbase/exploration)
+"Al" = (
+/obj/machinery/light,
+/obj/structure/table/woodentable,
+/obj/random/donkpocketbox,
+/turf/simulated/floor/carpet/retro,
+/area/groundbase/dorms/bathroom)
"As" = (
/obj/structure/grille,
/obj/machinery/door/firedoor,
@@ -1481,6 +1653,16 @@
},
/turf/simulated/floor,
/area/groundbase/medical/patient2)
+"AY" = (
+/obj/structure/bed/double/padded,
+/obj/item/weapon/bedsheet/cosmosdouble{
+ icon_state = "dobulesheetcosmos"
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/dorms/bathroom)
+"AZ" = (
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"Bd" = (
/obj/effect/floor_decal/industrial/warning{
dir = 1
@@ -1543,6 +1725,25 @@
"BH" = (
/turf/simulated/wall,
/area/groundbase/medical/patient3)
+"BM" = (
+/obj/structure/catwalk,
+/turf/simulated/floor/virgo3c{
+ edge_blending_priority = -1
+ },
+/area/groundbase/level3/nw/open)
+"Ck" = (
+/obj/structure/table/woodentable,
+/obj/machinery/computer/security/telescreen/entertainment{
+ pixel_y = -32
+ },
+/turf/simulated/floor/carpet/retro,
+/area/groundbase/dorms/bathroom)
+"Ct" = (
+/obj/structure/bed/chair/backed_red{
+ dir = 4
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"Cv" = (
/obj/structure/bed/padded,
/obj/item/weapon/bedsheet/medical,
@@ -1565,12 +1766,27 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/exploration/equipment)
+"De" = (
+/obj/structure/curtain/open/shower,
+/obj/machinery/shower{
+ pixel_y = 16
+ },
+/turf/simulated/floor/tiled{
+ icon_state = "techmaint"
+ },
+/area/groundbase/dorms/bathroom)
"Dm" = (
/obj/structure/bed/chair/shuttle{
dir = 1
},
/turf/simulated/floor/tiled,
/area/shuttle/groundbase/exploration)
+"Dw" = (
+/obj/machinery/firealarm{
+ dir = 4
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/dorms/bathroom)
"Dy" = (
/obj/effect/floor_decal/industrial/warning{
dir = 4
@@ -1652,6 +1868,15 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/exploration/equipment)
+"Em" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"Es" = (
/obj/structure/closet/secure_closet/pathfinder{
req_access = list(62,43,67)
@@ -1757,6 +1982,15 @@
},
/turf/simulated/floor/tiled/steel_ridged,
/area/groundbase/medical/patient2)
+"Fh" = (
+/turf/simulated/floor/wood,
+/area/groundbase/dorms/bathroom)
+"Fr" = (
+/obj/item/weapon/stool/padded{
+ dir = 1
+ },
+/turf/simulated/floor/wmarble,
+/area/groundbase/civilian/kitchen)
"Fx" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -1789,6 +2023,9 @@
},
/turf/simulated/floor/bmarble,
/area/groundbase/civilian/pilot)
+"FU" = (
+/turf/simulated/floor/lino,
+/area/groundbase/civilian/kitchen)
"FV" = (
/obj/item/weapon/storage/backpack/parachute{
pixel_x = 4;
@@ -1839,6 +2076,13 @@
/obj/machinery/light/bigfloorlamp,
/turf/simulated/floor/outdoors/grass/virgo3c,
/area/groundbase/level3/escapepad)
+"Gk" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/machinery/light,
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"Gn" = (
/obj/effect/floor_decal/industrial/warning{
dir = 1
@@ -1869,6 +2113,9 @@
"GW" = (
/turf/simulated/floor/outdoors/sidewalk/virgo3c,
/area/groundbase/level3/escapepad)
+"Ha" = (
+/turf/simulated/wall,
+/area/groundbase/civilian/kitchen)
"Hm" = (
/turf/simulated/floor/reinforced/virgo3c{
edge_blending_priority = -1
@@ -2015,6 +2262,15 @@
"IS" = (
/turf/simulated/open/virgo3c,
/area/groundbase/level3/ne/open)
+"IW" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/structure/bed/chair/backed_red{
+ dir = 8
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"Jf" = (
/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled/virgo3c,
@@ -2063,6 +2319,13 @@
"JL" = (
/turf/unsimulated/wall/planetary/virgo3c,
/area/groundbase/level3/se)
+"JU" = (
+/obj/machinery/door/airlock{
+ id_tag = null;
+ name = "Bathroom"
+ },
+/turf/simulated/floor/tiled/steel_ridged,
+/area/groundbase/dorms/bathroom)
"JW" = (
/obj/structure/table/glass,
/obj/machinery/computer/med_data/laptop{
@@ -2099,6 +2362,10 @@
"KG" = (
/turf/simulated/floor/tiled,
/area/groundbase/exploration/equipment)
+"KN" = (
+/obj/structure/table/steel,
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"KZ" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -2146,6 +2413,12 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/patient3)
+"Ms" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"Mz" = (
/obj/structure/railing{
dir = 4
@@ -2214,6 +2487,28 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/paramedic)
+"NR" = (
+/obj/structure/sink/kitchen{
+ pixel_y = 16
+ },
+/turf/simulated/floor/lino,
+/area/groundbase/civilian/kitchen)
+"NT" = (
+/obj/machinery/alarm{
+ dir = 8
+ },
+/obj/machinery/door/window/southright{
+ dir = 1;
+ name = "shower door"
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 10
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/groundbase/dorms/bathroom)
"NX" = (
/obj/structure/table/rack/shelf,
/obj/item/weapon/tank/oxygen,
@@ -2290,6 +2585,10 @@
},
/turf/simulated/floor/outdoors/sidewalk/slab/virgo3c,
/area/groundbase/level3/nw)
+"OT" = (
+/obj/structure/lattice,
+/turf/simulated/open/virgo3c,
+/area/groundbase/dorms/bathroom)
"Pd" = (
/obj/item/device/radio/intercom{
pixel_y = -24
@@ -2308,6 +2607,10 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/uhallway)
+"Pq" = (
+/obj/structure/table/steel,
+/turf/simulated/floor/lino,
+/area/groundbase/civilian/kitchen)
"Pr" = (
/obj/machinery/button/remote/airlock{
dir = 8;
@@ -2331,6 +2634,16 @@
"Px" = (
/turf/simulated/open,
/area/groundbase/cargo/office)
+"PC" = (
+/obj/structure/bed/chair/sofa/corp,
+/turf/simulated/floor/carpet/retro,
+/area/groundbase/dorms/bathroom)
+"PG" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/wood,
+/area/groundbase/dorms/bathroom)
"PH" = (
/turf/simulated/wall/rshull,
/area/shuttle/groundbase/exploration)
@@ -2343,6 +2656,18 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/patient3)
+"PO" = (
+/obj/structure/mirror{
+ dir = 4;
+ pixel_x = -23
+ },
+/obj/structure/sink{
+ dir = 8;
+ pixel_x = -12;
+ pixel_y = 2
+ },
+/turf/simulated/floor/tiled/white,
+/area/groundbase/dorms/bathroom)
"PQ" = (
/obj/machinery/camera/network/medbay{
dir = 8
@@ -2366,6 +2691,15 @@
"Qa" = (
/turf/simulated/floor/outdoors/grass/forest/virgo3c,
/area/groundbase/level3/nw)
+"Qb" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"Qe" = (
/obj/structure/table/bench/marble,
/obj/structure/cable/yellow{
@@ -2401,6 +2735,13 @@
outdoors = 0
},
/area/groundbase/level3/escapepad)
+"Qs" = (
+/obj/structure/railing,
+/obj/structure/bed/chair/backed_red{
+ dir = 8
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"QC" = (
/obj/machinery/door/airlock/multi_tile/glass/polarized{
id_tag = null;
@@ -2457,6 +2798,15 @@
outdoors = 0
},
/area/groundbase/level3/escapepad)
+"Rq" = (
+/turf/simulated/wall/r_wall,
+/area/groundbase/dorms/bathroom)
+"RH" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"RM" = (
/obj/machinery/photocopier/faxmachine{
department = "Exploration"
@@ -2608,6 +2958,11 @@
/obj/effect/map_helper/airlock/door/simple,
/turf/simulated/floor/tiled/steel_ridged,
/area/shuttle/groundbase/exploration)
+"TU" = (
+/obj/structure/table/woodentable,
+/obj/machinery/microwave,
+/turf/simulated/floor/carpet/retro,
+/area/groundbase/dorms/bathroom)
"TV" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -2746,6 +3101,10 @@
},
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/patient1)
+"Wh" = (
+/obj/structure/railing,
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"Wm" = (
/obj/structure/closet/secure_closet/pilot,
/obj/machinery/light{
@@ -2782,6 +3141,13 @@
"Xv" = (
/turf/simulated/floor/outdoors/grass/forest/virgo3c,
/area/groundbase/unexplored/outdoors)
+"Xz" = (
+/obj/structure/railing,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/bmarble,
+/area/groundbase/civilian/kitchen)
"XB" = (
/obj/structure/bed/padded,
/obj/item/weapon/bedsheet/medical,
@@ -2805,6 +3171,9 @@
/obj/machinery/computer/ship/helm,
/turf/simulated/floor/tiled,
/area/shuttle/groundbase/exploration)
+"Yn" = (
+/turf/simulated/floor/tiled/white,
+/area/groundbase/dorms/bathroom)
"Yy" = (
/obj/structure/table/rack,
/obj/item/clothing/shoes/magboots,
@@ -2813,6 +3182,17 @@
/obj/item/clothing/head/helmet/space/void/medical/emt,
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/paramedic)
+"Yz" = (
+/obj/structure/toilet{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/groundbase/dorms/bathroom)
+"YG" = (
+/turf/simulated/floor/virgo3c{
+ edge_blending_priority = -1
+ },
+/area/groundbase/civilian/kitchen)
"YJ" = (
/obj/structure/cable/yellow{
icon_state = "2-8"
@@ -5237,7 +5617,7 @@ Qa
qO
fz
bm
-Tk
+ac
pd
Tk
bm
@@ -5840,7 +6220,7 @@ QD
QD
QD
QD
-Kr
+ly
Kr
pf
pf
@@ -5982,7 +6362,7 @@ QD
QD
QD
QD
-Kr
+ly
Kr
pf
pf
@@ -6124,7 +6504,7 @@ QD
QD
QD
QD
-Kr
+ly
Kr
Kr
Kr
@@ -6262,6 +6642,7 @@ Kr
Kr
Kr
Kr
+Kr
QO
By
By
@@ -6271,7 +6652,6 @@ Kr
Kr
Kr
Kr
-Kr
pf
pf
pf
@@ -6404,6 +6784,7 @@ Kr
Kr
Kr
Kr
+Kr
QO
By
By
@@ -6413,7 +6794,6 @@ Kr
Kr
Kr
Kr
-Kr
pf
pf
pf
@@ -6546,8 +6926,9 @@ Kr
Kr
Kr
Kr
-QO
-By
+Kr
+QD
+BM
By
ly
Kr
@@ -6555,7 +6936,6 @@ Kr
Kr
Kr
Kr
-Kr
pf
pf
pf
@@ -6680,22 +7060,22 @@ nU
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
Kr
Kr
pf
@@ -6822,22 +7202,22 @@ pe
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+Ha
+nh
+Ms
+Ms
+Ms
+Ms
+Ms
+Ms
+Ms
+AZ
+AZ
+Ms
+sa
+Ha
+YG
Kr
Kr
pf
@@ -6964,22 +7344,22 @@ BE
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+Em
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+rr
+YG
Kr
Kr
pf
@@ -7106,22 +7486,22 @@ BE
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+nD
+Ct
+Ct
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+Ct
+Ct
+hM
+YG
Kr
Kr
pf
@@ -7248,22 +7628,22 @@ BE
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+mS
+KN
+KN
+mT
+mT
+mT
+mT
+mT
+mT
+mT
+mT
+KN
+KN
+gV
+YG
Kr
Kr
pf
@@ -7390,22 +7770,22 @@ BE
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+IW
+ud
+ud
+mT
+mT
+pP
+aN
+aN
+pP
+mT
+mT
+ud
+ud
+Qs
+YG
Kr
Kr
pf
@@ -7532,22 +7912,22 @@ BE
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+RH
+AZ
+AZ
+mT
+yu
+Ha
+Pq
+Pq
+Ha
+oI
+mT
+AZ
+AZ
+Wh
+YG
Kr
Kr
pf
@@ -7674,22 +8054,22 @@ BE
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+RH
+AZ
+AZ
+mT
+pa
+Pq
+FU
+FU
+Pq
+Fr
+mT
+AZ
+AZ
+Wh
+YG
Kr
Kr
pf
@@ -7816,22 +8196,22 @@ BE
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+RH
+AZ
+AZ
+mT
+pa
+Pq
+FU
+FU
+Pq
+Fr
+mT
+AZ
+AZ
+Wh
+YG
Kr
Kr
pf
@@ -7958,22 +8338,22 @@ BE
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+RH
+AZ
+AZ
+mT
+pa
+Pq
+FU
+FU
+Pq
+Fr
+mT
+AZ
+AZ
+Wh
+YG
Kr
Kr
pf
@@ -8100,22 +8480,22 @@ BE
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+RH
+AZ
+AZ
+mT
+yu
+Ha
+NR
+FU
+Ha
+oI
+mT
+AZ
+AZ
+Wh
+YG
Kr
Kr
pf
@@ -8242,22 +8622,22 @@ BE
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+nD
+Ct
+Ct
+mT
+mT
+mY
+mT
+mT
+mY
+mT
+mT
+Ct
+Ct
+hM
+YG
Kr
Kr
pf
@@ -8325,12 +8705,12 @@ Bg
"}
(39,1,1) = {"
mr
-jv
-jv
-jv
-jv
-jv
-jv
+Rq
+Rq
+Rq
+Rq
+Rq
+Rq
jv
jv
jv
@@ -8384,22 +8764,22 @@ BE
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+mS
+fn
+KN
+mT
+mT
+mT
+mT
+mT
+mT
+mT
+mT
+KN
+KN
+gV
+YG
Kr
Kr
pf
@@ -8467,12 +8847,12 @@ Bg
"}
(40,1,1) = {"
mr
-jv
-jv
-jv
-jv
-jv
-jv
+Rq
+De
+lD
+PO
+uv
+Rq
jv
jv
jv
@@ -8526,22 +8906,22 @@ BE
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+IW
+ud
+ud
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+ud
+ud
+Qs
+YG
Kr
Kr
pf
@@ -8609,12 +8989,12 @@ Bg
"}
(41,1,1) = {"
mr
-jv
-jv
-jv
-jv
-jv
-jv
+Rq
+De
+NT
+Yn
+Yz
+Rq
jv
jv
jv
@@ -8668,22 +9048,22 @@ BE
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+vJ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+AZ
+Xz
+YG
Kr
Kr
pf
@@ -8751,12 +9131,12 @@ Bg
"}
(42,1,1) = {"
mr
-jv
-jv
-jv
-jv
-jv
-jv
+Rq
+Rq
+Rq
+JU
+Rq
+Rq
jv
jv
jv
@@ -8810,22 +9190,22 @@ pe
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+Ha
+Qb
+cD
+cD
+cD
+cD
+cD
+cD
+AZ
+AZ
+cD
+cD
+Gk
+Ha
+YG
Kr
Kr
pf
@@ -8893,12 +9273,12 @@ Bg
"}
(43,1,1) = {"
mr
-jv
-jv
-jv
-jv
-jv
-jv
+Rq
+jP
+ip
+ip
+TU
+Rq
jv
jv
jv
@@ -8952,22 +9332,22 @@ VR
Kr
Kr
Kr
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
-QD
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
+YG
Kr
Kr
pf
@@ -9035,12 +9415,12 @@ Bg
"}
(44,1,1) = {"
mr
-jv
-jv
-jv
-jv
-jv
-jv
+Rq
+PC
+ip
+ip
+Al
+Rq
jv
jv
jv
@@ -9177,12 +9557,12 @@ Bg
"}
(45,1,1) = {"
mr
-jv
-jv
-jv
-jv
-jv
-jv
+Rq
+vD
+ip
+ip
+Ck
+Rq
jv
jv
jv
@@ -9319,12 +9699,12 @@ Bg
"}
(46,1,1) = {"
mr
-jv
-jv
-jv
-jv
-jv
-jv
+Rq
+Fh
+Fh
+Fh
+Rq
+Rq
jv
jv
jv
@@ -9461,11 +9841,11 @@ Bg
"}
(47,1,1) = {"
mr
-jv
-jv
-jv
-jv
-jv
+Rq
+PG
+Fh
+AY
+Rq
jv
jv
jv
@@ -9603,11 +9983,11 @@ Bg
"}
(48,1,1) = {"
mr
-jv
-jv
-jv
-jv
-jv
+Rq
+Fh
+Fh
+Dw
+Rq
jv
jv
Zo
@@ -9745,11 +10125,11 @@ Bg
"}
(49,1,1) = {"
mr
-jv
-jv
-jv
-jv
-jv
+Rq
+OT
+Rq
+Rq
+Rq
jv
jv
Zo
@@ -9887,9 +10267,9 @@ Bg
"}
(50,1,1) = {"
mr
-jv
-jv
-jv
+Rq
+Rq
+Rq
jv
jv
jv
@@ -14752,9 +15132,9 @@ Lf
Lf
Lf
Lf
-Lf
-Lf
-Lf
+IS
+IS
+IS
IS
IS
IS
@@ -14894,9 +15274,9 @@ Lf
Lf
Lf
Lf
-Lf
-Lf
-Lf
+IS
+IS
+IS
IS
IS
IS
@@ -15036,9 +15416,9 @@ Lf
Lf
Lf
Lf
-Lf
-Lf
-Lf
+IS
+IS
+IS
IS
IS
IS
@@ -15178,9 +15558,9 @@ Lf
Lf
Lf
Lf
-Lf
-Lf
-Lf
+IS
+IS
+IS
IS
IS
IS
@@ -16473,7 +16853,7 @@ ID
lz
Cv
Vm
-og
+ab
to
to
Qk
diff --git a/maps/groundbase/groundbase.dm b/maps/groundbase/groundbase.dm
index c3db48594f6..1a38bc0c850 100644
--- a/maps/groundbase/groundbase.dm
+++ b/maps/groundbase/groundbase.dm
@@ -8,7 +8,8 @@
#include "..\offmap_vr\common_offmaps.dm"
#include "..\tether\tether_jobs.dm"
#include "groundbase_poi_stuff.dm"
- #include "gb-wilds.dm"
+ #include "groundbase_wilds.dm"
+ #include "..\~map_system\maps_vr.dm"
#if !AWAY_MISSION_TEST //Don't include these for just testing away missions
#include "gb-z1.dmm"
diff --git a/maps/groundbase/groundbase_areas.dm b/maps/groundbase/groundbase_areas.dm
index e5eac280c44..f814f390530 100644
--- a/maps/groundbase/groundbase_areas.dm
+++ b/maps/groundbase/groundbase_areas.dm
@@ -359,6 +359,8 @@
/area/groundbase/civilian/arrivals
name = "Arrivals"
lightswitch = 1
+ forbid_events = TRUE
+ forbid_singulo = TRUE
/area/groundbase/civilian/toolstorage
name = "Tool Storage"
lightswitch = 1
@@ -417,10 +419,12 @@
name = "Men's Restroom"
sound_env = SOUND_ENVIRONMENT_BATHROOM
lightswitch = 1
+ forbid_events = TRUE
/area/groundbase/civilian/womensrestroom
name = "Women's Restroom"
sound_env = SOUND_ENVIRONMENT_BATHROOM
lightswitch = 1
+ forbid_events = TRUE
/area/groundbase/exploration
name = "Exploration"
@@ -443,6 +447,7 @@
limit_mob_size = FALSE
block_suit_sensors = TRUE
forbid_events = TRUE
+ forbid_singulo = TRUE
/area/groundbase/dorms/bathroom
name = "Dormitory Bathroom"
diff --git a/maps/groundbase/groundbase_defines.dm b/maps/groundbase/groundbase_defines.dm
index 4f3fedd2aa6..1a74e22b62c 100644
--- a/maps/groundbase/groundbase_defines.dm
+++ b/maps/groundbase/groundbase_defines.dm
@@ -124,6 +124,9 @@
default_skybox = /datum/skybox_settings/groundbase
unit_test_exempt_areas = list( //These are all outside
+ /area/groundbase/cargo/bay,
+ /area/groundbase/civilian/bar/upper,
+ /area/groundbase/exploration/shuttlepad,
/area/groundbase/level1,
/area/groundbase/level1/ne,
/area/groundbase/level1/nw,
@@ -140,11 +143,20 @@
/area/groundbase/level2/nw,
/area/groundbase/level2/se,
/area/groundbase/level2/sw,
+ /area/groundbase/level2/northspur,
+ /area/groundbase/level2/eastspur,
+ /area/groundbase/level2/westspur,
+ /area/groundbase/level2/southeastspur,
+ /area/groundbase/level2/southwestspur,
/area/groundbase/level3,
/area/groundbase/level3/ne,
/area/groundbase/level3/nw,
/area/groundbase/level3/se,
/area/groundbase/level3/sw,
+ /area/groundbase/level3/ne/open,
+ /area/groundbase/level3/nw/open,
+ /area/groundbase/level3/se/open,
+ /area/groundbase/level3/sw/open,
/area/maintenance/groundbase/level1/netunnel,
/area/maintenance/groundbase/level1/nwtunnel,
/area/maintenance/groundbase/level1/setunnel,
@@ -165,6 +177,11 @@
unit_test_exempt_from_atmos = list()
+ unit_test_z_levels = list(
+ Z_LEVEL_GB_BOTTOM,
+ Z_LEVEL_GB_MIDDLE,
+ Z_LEVEL_GB_TOP
+ )
lateload_z_levels = list(
list("Groundbase - Central Command"),
@@ -393,7 +410,7 @@
name = "Misc"
flags = MAP_LEVEL_ADMIN|MAP_LEVEL_SEALED|MAP_LEVEL_CONTACT|MAP_LEVEL_XENOARCH_EXEMPT
-#include "gb-mining.dm"
+#include "groundbase_mining.dm"
/datum/map_template/gb_lateload/mining
name = "V3c Underground"
desc = "The caves underneath the survace of Virgo 3C"
@@ -405,7 +422,7 @@
. = ..()
// seed_submaps(list(Z_LEVEL_MINING), 60, /area/gb_mine/unexplored, /datum/map_template/space_rocks) //POI seeding
new /datum/random_map/automata/cave_system/no_cracks(null, 3, 3, Z_LEVEL_MINING, world.maxx - 4, world.maxy - 4)
- new /datum/random_map/noise/ore/mining(null, 1, 1, Z_LEVEL_MINING, 64, 64)
+ new /datum/random_map/noise/ore/gb_mining(null, 1, 1, Z_LEVEL_MINING, 64, 64)
/datum/map_z_level/gb_lateload/mining
z = Z_LEVEL_MINING
@@ -534,4 +551,3 @@
*/
////////////////////////////////////////////////////////////////////////
-
diff --git a/maps/groundbase/gb-mining.dm b/maps/groundbase/groundbase_mining.dm
similarity index 86%
rename from maps/groundbase/gb-mining.dm
rename to maps/groundbase/groundbase_mining.dm
index 27cd9c6a0a1..c4ee180a409 100644
--- a/maps/groundbase/gb-mining.dm
+++ b/maps/groundbase/groundbase_mining.dm
@@ -8,7 +8,7 @@
"uranium" = 10,
"platinum" = 10,
"hematite" = 20,
- "carbon" = 5,
+ "carbon" = 20,
"diamond" = 1,
"gold" = 8,
"silver" = 8,
@@ -21,7 +21,7 @@
"uranium" = 5,
"platinum" = 5,
"hematite" = 35,
- "carbon" = 5,
+ "carbon" = 35,
"gold" = 3,
"silver" = 3,
"phoron" = 25,
@@ -32,10 +32,10 @@
UpdateMineral()
update_icon()
-/datum/random_map/noise/ore/mining
- descriptor = "asteroid field ore distribution map"
- deep_val = 0.2
- rare_val = 0.1
+/datum/random_map/noise/ore/gb_mining
+ descriptor = "groundbase underground ore distribution map"
+ deep_val = 0.7
+ rare_val = 0.5
/datum/random_map/noise/ore/mining/check_map_sanity()
return 1 //Totally random, but probably beneficial.
diff --git a/maps/groundbase/groundbase_poi_stuff.dm b/maps/groundbase/groundbase_poi_stuff.dm
index c2ff36f9bc8..161472287d8 100644
--- a/maps/groundbase/groundbase_poi_stuff.dm
+++ b/maps/groundbase/groundbase_poi_stuff.dm
@@ -965,6 +965,7 @@
ambience = AMBIENCE_OUTPOST
flags = AREA_FLAG_IS_NOT_PERSISTENT
requires_power = 0
+ base_turf = /turf/simulated/mineral/floor/virgo3c
/area/submap/groundbase/poi/wildvillage/plot
icon_state = "grewhisqu"
@@ -1062,7 +1063,11 @@
name = "wide building 6"
mappath = 'southwilds/villagepois/wide6.dmm'
/area/submap/groundbase/poi/wildvillage/wide/wide6
-
+/obj/item/weapon/paper/wide6
+ name = "\improper hand written letter"
+ info = {"It is hard for me to write this out, and I hope you will be back soon, but I fear that by the time you return I will already be gone. I will try my best to hold on, but even as I write this, I can feel myself slipping.
+ I know that you all do not believe me but I really can see them, just beyond the walls, and they're even closer now than they were before. I can see them even when I close my eyes. Seven golden eyes watch me, and I can feel their heat pouring into me. As they come closer, I can feel myself being tugged in. Like I'm a little lost moon being tugged into the embrace of a passing star.
It still doesn't hurt. It's getting hard to see anything else, and I can't move anymore. I feel like everything is going to be okay. If you see seven eyes, don't be afraid. Just promise you'll come find me, okay?
+ I'll keep hol"}
/datum/map_template/groundbase/wildvillage/long/long1
name = "long building 1"
@@ -1072,11 +1077,11 @@
name = "long building 2"
mappath = 'southwilds/villagepois/long2.dmm'
/area/submap/groundbase/poi/wildvillage/long/long2
-/datum/map_template/groundbase/wildvillage/wide/long3
+/datum/map_template/groundbase/wildvillage/long/long3
name = "wide building 3"
mappath = 'southwilds/villagepois/long3.dmm'
/area/submap/groundbase/poi/wildvillage/long/long3
-/datum/map_template/groundbase/wildvillage/wide/long4
+/datum/map_template/groundbase/wildvillage/long/long4
name = "wide building 4"
mappath = 'southwilds/villagepois/long4.dmm'
/area/submap/groundbase/poi/wildvillage/long/long4
diff --git a/maps/groundbase/groundbase_things.dm b/maps/groundbase/groundbase_things.dm
index 5ff10617c97..f1a1dfb8a08 100644
--- a/maps/groundbase/groundbase_things.dm
+++ b/maps/groundbase/groundbase_things.dm
@@ -76,6 +76,7 @@ VIRGO3B_TURF_CREATE(/turf/simulated/floor/outdoors/rocks)
desc = "Magnetic levitation tram tracks. Caution! Electrified!"
icon = 'icons/turf/flooring/maglevs.dmi'
icon_state = "maglevup"
+ can_be_plated = FALSE
var/area/shock_area = /area/centcom/terminal/tramfluff
diff --git a/maps/groundbase/gb-wilds.dm b/maps/groundbase/groundbase_wilds.dm
similarity index 97%
rename from maps/groundbase/gb-wilds.dm
rename to maps/groundbase/groundbase_wilds.dm
index ad2969a4736..dee73d1c511 100644
--- a/maps/groundbase/gb-wilds.dm
+++ b/maps/groundbase/groundbase_wilds.dm
@@ -47,6 +47,7 @@
name = "wilderness"
icon = 'icons/turf/areas_vr.dmi'
icon_state = "greblacir"
+ base_turf = /turf/simulated/mineral/floor/virgo3c
/area/submap/groundbase/wilderness/north
/area/submap/groundbase/wilderness/north/unexplored
icon_state = "orablacir"
diff --git a/maps/groundbase/southwilds/southwilds1.dmm b/maps/groundbase/southwilds/southwilds1.dmm
index f8fe87f859b..f2c050a458e 100644
--- a/maps/groundbase/southwilds/southwilds1.dmm
+++ b/maps/groundbase/southwilds/southwilds1.dmm
@@ -10,6 +10,12 @@
edge_blending_priority = -1
},
/area/submap/groundbase/wilderness/south)
+"o" = (
+/obj/effect/landmark{
+ name = "carpspawn"
+ },
+/turf/simulated/floor/water/deep/virgo3c,
+/area/submap/groundbase/wilderness/south)
"p" = (
/turf/simulated/floor/outdoors/grass/virgo3c,
/area/submap/groundbase/wilderness/south)
@@ -34,6 +40,12 @@
"H" = (
/turf/simulated/floor/outdoors/grass/virgo3c,
/area/submap/groundbase/wilderness/south/unexplored)
+"I" = (
+/obj/effect/landmark{
+ name = "carpspawn"
+ },
+/turf/simulated/floor/water/virgo3c,
+/area/submap/groundbase/wilderness/south)
"K" = (
/obj/effect/map_effect/portal/line/side_b,
/turf/simulated/floor/outdoors/grass/forest/virgo3c,
@@ -1243,7 +1255,7 @@ d
d
c
c
-F
+o
c
c
c
@@ -4771,7 +4783,7 @@ H
d
d
c
-c
+I
c
F
F
@@ -4917,7 +4929,7 @@ c
c
F
F
-F
+o
c
c
c
@@ -6511,7 +6523,7 @@ d
d
c
c
-c
+I
c
c
c
@@ -7085,7 +7097,7 @@ c
c
c
c
-F
+o
F
c
c
@@ -10217,7 +10229,7 @@ d
c
c
c
-F
+o
c
c
c
@@ -11761,7 +11773,7 @@ d
c
F
F
-c
+I
c
d
d
@@ -12927,7 +12939,7 @@ d
d
c
c
-c
+I
c
c
c
@@ -13156,7 +13168,7 @@ c
c
c
c
-c
+I
c
c
d
@@ -13784,7 +13796,7 @@ d
d
c
c
-c
+I
c
c
c
@@ -13931,7 +13943,7 @@ d
c
c
c
-F
+o
F
F
c
@@ -14023,7 +14035,7 @@ F
F
F
F
-F
+o
F
F
F
@@ -14878,7 +14890,7 @@ c
c
F
F
-F
+o
F
c
c
@@ -15234,7 +15246,7 @@ d
d
c
F
-F
+o
c
c
c
@@ -16689,7 +16701,7 @@ d
c
c
F
-F
+o
c
c
d
@@ -17687,7 +17699,7 @@ H
d
c
c
-F
+o
c
c
d
@@ -18497,7 +18509,7 @@ d
c
c
F
-F
+o
F
F
F
@@ -18643,7 +18655,7 @@ F
F
F
F
-F
+o
F
c
c
diff --git a/maps/groundbase/southwilds/villagepois/square7.dmm b/maps/groundbase/southwilds/villagepois/square7.dmm
index 5cc3728a75e..e92257e2a18 100644
--- a/maps/groundbase/southwilds/villagepois/square7.dmm
+++ b/maps/groundbase/southwilds/villagepois/square7.dmm
@@ -119,18 +119,18 @@
/turf/simulated/floor/tiled/eris/cafe,
/area/submap/groundbase/poi/wildvillage/square/square7)
"G" = (
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,
/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,
/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,
diff --git a/maps/groundbase/southwilds/villagepois/wide5.dmm b/maps/groundbase/southwilds/villagepois/wide5.dmm
index 170e791a899..a106381ee35 100644
--- a/maps/groundbase/southwilds/villagepois/wide5.dmm
+++ b/maps/groundbase/southwilds/villagepois/wide5.dmm
@@ -59,7 +59,7 @@
layer = 3.3;
pixel_y = 30
},
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/submap/groundbase/poi/wildvillage/wide/wide5)
"j" = (
/obj/structure/bed/chair/office/light{
@@ -138,7 +138,7 @@
/turf/simulated/floor/bmarble,
/area/submap/groundbase/poi/wildvillage/wide/wide5)
"u" = (
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/submap/groundbase/poi/wildvillage/wide/wide5)
"v" = (
/turf/simulated/floor/bmarble,
@@ -150,7 +150,7 @@
/obj/structure/curtain/open/bed{
color = "#5e0c1d"
},
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/submap/groundbase/poi/wildvillage/wide/wide5)
"y" = (
/obj/machinery/light/small{
@@ -170,14 +170,14 @@
/obj/structure/table/standard,
/obj/random/maintenance/misc,
/obj/random/maintenance/misc,
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/submap/groundbase/poi/wildvillage/wide/wide5)
"B" = (
/turf/simulated/wall,
/area/submap/groundbase/poi/wildvillage/wide/wide5)
"C" = (
/obj/structure/undies_wardrobe,
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/submap/groundbase/poi/wildvillage/wide/wide5)
"D" = (
/obj/structure/table/rack/shelf,
@@ -284,7 +284,7 @@
/obj/structure/table/standard,
/obj/random/maintenance/misc,
/obj/random/maintenance/misc,
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/submap/groundbase/poi/wildvillage/wide/wide5)
"V" = (
/obj/structure/bed/chair/sofa/corp/left,
@@ -297,7 +297,7 @@
color = "#4287f5"
},
/obj/machinery/light/small,
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/submap/groundbase/poi/wildvillage/wide/wide5)
"X" = (
/obj/machinery/door/airlock/silver{
diff --git a/maps/groundbase/southwilds/villagepois/wide6.dmm b/maps/groundbase/southwilds/villagepois/wide6.dmm
index 90f8197b9cd..78b99a7bebe 100644
--- a/maps/groundbase/southwilds/villagepois/wide6.dmm
+++ b/maps/groundbase/southwilds/villagepois/wide6.dmm
@@ -53,10 +53,7 @@
/obj/item/weapon/bedsheet/double,
/obj/random/plushie,
/obj/structure/curtain/open/privacy,
-/obj/item/weapon/paper{
- info = "It is hard for me to write this out, and I hope you will be back soon, but I fear that by the time you return I will already be gone. I will try my best to hold on, but even as I write this, I can feel myself slipping.
I know that you all do not believe me but I really can see them, just beyond the walls, and they're even closer now than they were before. I can see them even when I close my eyes. Seven golden eyes watch me, and I can feel their heat pouring into me. As they come closer, I can feel myself being tugged in. Like I'm a little lost moon being tugged into the embrace of a passing star.
It still doesn't hurt. It's getting hard to see anything else, and I can't move anymore. I feel like everything is going to be okay. If you see seven eyes, don't be afraid. Just promise you'll come find me, okay?
I'll keep hol";
- name = "A hand written letter"
- },
+/obj/item/weapon/paper/wide6,
/turf/simulated/floor/tiled/white,
/area/submap/groundbase/poi/wildvillage/wide/wide6)
"n" = (
diff --git a/maps/groundbase/westwilds/westwilds1.dmm b/maps/groundbase/westwilds/westwilds1.dmm
index 614234c8237..d9ba406ce00 100644
--- a/maps/groundbase/westwilds/westwilds1.dmm
+++ b/maps/groundbase/westwilds/westwilds1.dmm
@@ -691,7 +691,7 @@
name = "Burn Chamber Air Control";
output_tag = "burn_out";
pressure_setting = 0;
- sensors = list("burn_sensor" = "Burn Chamber Sensor")
+ sensors = list("burn_sensor"="Burn Chamber Sensor")
},
/turf/simulated/floor/tiled/white,
/area/groundbase/science/outpost/toxins_mixing)
@@ -1722,7 +1722,7 @@
/obj/machinery/vending/phoronresearch{
dir = 8;
name = "Toximate 2556";
- products = list(/obj/item/device/transfer_valve = 3, /obj/item/device/assembly/timer = 6, /obj/item/device/assembly/signaler = 6, /obj/item/device/assembly/prox_sensor = 6, /obj/item/device/assembly/igniter = 12)
+ products = list(/obj/item/device/transfer_valve=3,/obj/item/device/assembly/timer=6,/obj/item/device/assembly/signaler=6,/obj/item/device/assembly/prox_sensor=6,/obj/item/device/assembly/igniter=12)
},
/turf/simulated/floor/tiled,
/area/groundbase/science/outpost/toxins_lab)
@@ -2038,7 +2038,7 @@
/obj/machinery/vending/wallmed1{
pixel_x = 30
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/tiled/dark,
/area/groundbase/science/outpost/anomaly_lab)
"zz" = (
@@ -2144,7 +2144,6 @@
/area/groundbase/science/outpost/atmos)
"AD" = (
/obj/machinery/artifact_scanpad,
-/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/tiled/dark,
/area/groundbase/science/outpost/anomaly_lab)
"AH" = (
@@ -4375,7 +4374,6 @@
/area/groundbase/science/outpost/anomaly_storage)
"YX" = (
/obj/machinery/artifact_analyser,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled/dark,
/area/groundbase/science/outpost/anomaly_lab)
"Zk" = (
diff --git a/maps/groundbase/westwilds/westwilds2.dmm b/maps/groundbase/westwilds/westwilds2.dmm
index 31d7f3e8d05..f1f03cad6eb 100644
--- a/maps/groundbase/westwilds/westwilds2.dmm
+++ b/maps/groundbase/westwilds/westwilds2.dmm
@@ -13,6 +13,23 @@
/obj/item/weapon/tool/wrench,
/turf/simulated/floor/tiled/white,
/area/groundbase/science/outpost/toxins_mixing)
+"ab" = (
+/obj/machinery/artifact_scanpad,
+/turf/simulated/floor/tiled/dark,
+/area/groundbase/science/outpost/anomaly_lab)
+"ac" = (
+/obj/machinery/artifact_analyser,
+/turf/simulated/floor/tiled/dark,
+/area/groundbase/science/outpost/anomaly_lab)
+"ad" = (
+/obj/structure/table/standard,
+/obj/item/device/flashlight/lamp,
+/obj/machinery/vending/wallmed1{
+ pixel_x = 30
+ },
+/obj/machinery/atmospherics/unary/vent_scrubber/on,
+/turf/simulated/floor/tiled/dark,
+/area/groundbase/science/outpost/anomaly_lab)
"am" = (
/obj/machinery/atmospherics/pipe/simple/visible/blue{
dir = 9
@@ -438,11 +455,6 @@
},
/turf/simulated/floor/tiled/dark,
/area/groundbase/science/outpost/anomaly_lab)
-"gg" = (
-/obj/machinery/artifact_scanpad,
-/obj/machinery/atmospherics/unary/vent_scrubber/on,
-/turf/simulated/floor/tiled/dark,
-/area/groundbase/science/outpost/anomaly_lab)
"gi" = (
/obj/structure/table/standard,
/obj/machinery/computer/atmoscontrol/laptop{
@@ -952,11 +964,6 @@
},
/turf/simulated/floor/tiled,
/area/groundbase/science/outpost/toxins_lab)
-"lq" = (
-/obj/machinery/artifact_analyser,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/turf/simulated/floor/tiled/dark,
-/area/groundbase/science/outpost/anomaly_lab)
"lw" = (
/obj/structure/cable/green{
icon_state = "1-2"
@@ -2674,15 +2681,6 @@
/obj/machinery/atmospherics/portables_connector,
/turf/simulated/floor,
/area/groundbase/science/outpost/atmos)
-"DN" = (
-/obj/structure/table/standard,
-/obj/item/device/flashlight/lamp,
-/obj/machinery/vending/wallmed1{
- pixel_x = 30
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/turf/simulated/floor/tiled/dark,
-/area/groundbase/science/outpost/anomaly_lab)
"DP" = (
/obj/machinery/atmospherics/pipe/manifold/visible/supply,
/obj/machinery/meter,
@@ -18616,9 +18614,9 @@ MY
qy
Sh
mh
-gg
-lq
-DN
+ab
+ac
+ad
bp
hm
qg
diff --git a/maps/offmap_vr/common_offmaps.dm b/maps/offmap_vr/common_offmaps.dm
index b726a2fec39..1076f00dd38 100644
--- a/maps/offmap_vr/common_offmaps.dm
+++ b/maps/offmap_vr/common_offmaps.dm
@@ -220,6 +220,7 @@
mappath = 'maps/gateway_vr/wildwest.dmm'
associated_map_datum = /datum/map_z_level/common_lateload/gateway_destination
+#include "../gateway_vr/lucky_7.dm"
/////////////////////////////////////////////////////////////////////////////////////
diff --git a/maps/offmap_vr/om_ships/abductor.dmm b/maps/offmap_vr/om_ships/abductor.dmm
index 11f3098ca68..c96d1b89948 100644
--- a/maps/offmap_vr/om_ships/abductor.dmm
+++ b/maps/offmap_vr/om_ships/abductor.dmm
@@ -105,8 +105,8 @@
/area/abductor/interior)
"hj" = (
/obj/structure/table/alien,
-/obj/item/device/paicard,
-/obj/item/device/paicard,
+/obj/random/paicard,
+/obj/random/paicard,
/turf/simulated/shuttle/floor/alienplating,
/area/abductor/interior)
"hq" = (
diff --git a/maps/offmap_vr/om_ships/itglight.dmm b/maps/offmap_vr/om_ships/itglight.dmm
index 99c70134b52..8a11ecf0b96 100644
--- a/maps/offmap_vr/om_ships/itglight.dmm
+++ b/maps/offmap_vr/om_ships/itglight.dmm
@@ -1985,16 +1985,16 @@
/turf/simulated/floor,
/area/itglight/portengi)
"lO" = (
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
/obj/item/weapon/reagent_containers/food/condiment/small/sugar,
/obj/item/weapon/reagent_containers/food/condiment/small/sugar,
/obj/item/weapon/reagent_containers/food/condiment/small/sugar,
@@ -2003,10 +2003,10 @@
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
/obj/item/weapon/material/knife/butch,
/obj/item/weapon/material/minihoe,
/obj/item/weapon/material/knife/machete/hatchet,
@@ -6353,7 +6353,7 @@
/area/itglight/common)
"MF" = (
/obj/structure/table/wooden_reinforced,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/glass/reinforced,
/area/itglight/common)
"MG" = (
diff --git a/maps/offmap_vr/talon/talon_v2.dmm b/maps/offmap_vr/talon/talon_v2.dmm
index 43f02d7f6ea..368368c3a93 100644
--- a/maps/offmap_vr/talon/talon_v2.dmm
+++ b/maps/offmap_vr/talon/talon_v2.dmm
@@ -190,7 +190,7 @@
/obj/machinery/light/small{
dir = 1
},
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/tiled/techfloor,
/area/talon_v2/workroom)
"aw" = (
@@ -15549,7 +15549,7 @@
/area/talon_v2/crew_quarters/eng_room)
"Xi" = (
/obj/structure/table/woodentable,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/wood,
/area/talon_v2/crew_quarters/meditation)
"Xl" = (
diff --git a/maps/om_adventure/pois/darkstar.dmm b/maps/om_adventure/pois/darkstar.dmm
index a41ef6cb59b..809c5b7aa7d 100644
--- a/maps/om_adventure/pois/darkstar.dmm
+++ b/maps/om_adventure/pois/darkstar.dmm
@@ -2,11 +2,13 @@
"a" = (
/turf/template_noop,
/area/template_noop)
-"e" = (
+"b" = (
+/mob/living/simple_mob/vore/alienanimals/space_ghost{
+ faction = "spookyland"
+ },
/turf/simulated/floor/weird_things/dark,
/area/om_adventure/poi/darkstar)
-"z" = (
-/mob/living/simple_mob/vore/alienanimals/space_ghost,
+"e" = (
/turf/simulated/floor/weird_things/dark,
/area/om_adventure/poi/darkstar)
@@ -50,7 +52,7 @@ a
e
e
e
-z
+b
e
e
e
diff --git a/maps/om_adventure/pois/fleshtear1.dmm b/maps/om_adventure/pois/fleshtear1.dmm
index e2a3d25f185..bfe4b8089f7 100644
--- a/maps/om_adventure/pois/fleshtear1.dmm
+++ b/maps/om_adventure/pois/fleshtear1.dmm
@@ -3,7 +3,9 @@
/turf/template_noop,
/area/template_noop)
"b" = (
-/mob/living/simple_mob/creature,
+/mob/living/simple_mob/creature{
+ faction = "spookyland"
+ },
/turf/simulated/floor/flesh{
base_icon = 'icons/turf/stomach_vr.dmi'
},
diff --git a/maps/om_adventure/pois/fleshtear2.dmm b/maps/om_adventure/pois/fleshtear2.dmm
index 19d435ce330..970059ac127 100644
--- a/maps/om_adventure/pois/fleshtear2.dmm
+++ b/maps/om_adventure/pois/fleshtear2.dmm
@@ -4,15 +4,17 @@
base_icon = 'icons/turf/stomach_vr.dmi'
},
/area/om_adventure/poi/fleshtear2)
+"b" = (
+/mob/living/simple_mob/creature{
+ faction = "spookyland"
+ },
+/turf/simulated/floor/flesh{
+ base_icon = 'icons/turf/stomach_vr.dmi'
+ },
+/area/om_adventure/poi/fleshtear2)
"B" = (
/turf/template_noop,
/area/template_noop)
-"H" = (
-/mob/living/simple_mob/creature,
-/turf/simulated/floor/flesh{
- base_icon = 'icons/turf/stomach_vr.dmi'
- },
-/area/om_adventure/poi/fleshtear2)
(1,1,1) = {"
B
@@ -45,7 +47,7 @@ B
B
B
a
-H
+b
a
a
B
diff --git a/maps/om_adventure/pois/fleshtear3.dmm b/maps/om_adventure/pois/fleshtear3.dmm
index 1c77a349960..c23cca7ebd7 100644
--- a/maps/om_adventure/pois/fleshtear3.dmm
+++ b/maps/om_adventure/pois/fleshtear3.dmm
@@ -2,8 +2,10 @@
"a" = (
/turf/template_noop,
/area/template_noop)
-"M" = (
-/mob/living/simple_mob/creature,
+"b" = (
+/mob/living/simple_mob/creature{
+ faction = "spookyland"
+ },
/turf/simulated/floor/flesh{
base_icon = 'icons/turf/stomach_vr.dmi'
},
@@ -62,7 +64,7 @@ Q
Q
a
Q
-M
+b
Q
Q
a
diff --git a/maps/om_adventure/pois/fleshtear4.dmm b/maps/om_adventure/pois/fleshtear4.dmm
index 077d29a8b7c..b41923a34cf 100644
--- a/maps/om_adventure/pois/fleshtear4.dmm
+++ b/maps/om_adventure/pois/fleshtear4.dmm
@@ -2,13 +2,15 @@
"a" = (
/turf/template_noop,
/area/template_noop)
-"m" = (
+"b" = (
+/mob/living/simple_mob/creature{
+ faction = "spookyland"
+ },
/turf/simulated/floor/flesh{
base_icon = 'icons/turf/stomach_vr.dmi'
},
/area/om_adventure/poi/fleshtear4)
-"n" = (
-/mob/living/simple_mob/creature,
+"m" = (
/turf/simulated/floor/flesh{
base_icon = 'icons/turf/stomach_vr.dmi'
},
@@ -31,7 +33,7 @@ a
(3,1,1) = {"
a
a
-n
+b
m
a
"}
@@ -65,7 +67,7 @@ a
"}
(8,1,1) = {"
a
-n
+b
m
m
a
diff --git a/maps/stellardelight/overmap.dmm b/maps/stellar_delight/overmap.dmm
similarity index 99%
rename from maps/stellardelight/overmap.dmm
rename to maps/stellar_delight/overmap.dmm
index 2890f0159bf..8edb64c5020 100644
--- a/maps/stellardelight/overmap.dmm
+++ b/maps/stellar_delight/overmap.dmm
@@ -9,7 +9,7 @@
/turf/unsimulated/map,
/area/overmap)
"I" = (
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/space)
"J" = (
/obj/effect/overmap/bluespace_rift,
diff --git a/maps/stellardelight/ship_centcom.dmm b/maps/stellar_delight/ship_centcom.dmm
similarity index 99%
rename from maps/stellardelight/ship_centcom.dmm
rename to maps/stellar_delight/ship_centcom.dmm
index 23be338ccd5..b0e1314f595 100644
--- a/maps/stellardelight/ship_centcom.dmm
+++ b/maps/stellar_delight/ship_centcom.dmm
@@ -1139,8 +1139,8 @@
/area/centcom/specops)
"dv" = (
/obj/structure/table/rack,
-/obj/item/weapon/gun/energy/gun/martin,
-/obj/item/weapon/gun/energy/gun/martin,
+/obj/item/weapon/gun/energy/gun/compact,
+/obj/item/weapon/gun/energy/gun/compact,
/obj/item/device/flash,
/obj/item/device/flash,
/turf/simulated/floor/tiled/dark,
@@ -2276,8 +2276,8 @@
/area/centcom/control)
"hq" = (
/obj/structure/table/rack,
-/obj/item/weapon/gun/energy/gun/martin,
-/obj/item/weapon/gun/energy/gun/martin,
+/obj/item/weapon/gun/energy/gun/compact,
+/obj/item/weapon/gun/energy/gun/compact,
/obj/item/device/flash,
/obj/item/device/flash,
/turf/simulated/floor/tiled{
diff --git a/maps/stellardelight/ship_misc.dmm b/maps/stellar_delight/ship_misc.dmm
similarity index 100%
rename from maps/stellardelight/ship_misc.dmm
rename to maps/stellar_delight/ship_misc.dmm
diff --git a/maps/stellardelight/stelardelightskybox.dmi b/maps/stellar_delight/stelardelightskybox.dmi
similarity index 100%
rename from maps/stellardelight/stelardelightskybox.dmi
rename to maps/stellar_delight/stelardelightskybox.dmi
diff --git a/maps/stellardelight/stellar_delight.dm b/maps/stellar_delight/stellar_delight.dm
similarity index 100%
rename from maps/stellardelight/stellar_delight.dm
rename to maps/stellar_delight/stellar_delight.dm
diff --git a/maps/stellardelight/stellar_delight1.dmm b/maps/stellar_delight/stellar_delight1.dmm
similarity index 99%
rename from maps/stellardelight/stellar_delight1.dmm
rename to maps/stellar_delight/stellar_delight1.dmm
index c4e5b2dfaaa..2a1622a32f9 100644
--- a/maps/stellardelight/stellar_delight1.dmm
+++ b/maps/stellar_delight/stellar_delight1.dmm
@@ -1,4 +1,17 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aa" = (
+/obj/structure/cable/pink{
+ icon_state = "4-8"
+ },
+/obj/effect/floor_decal/milspec/color/red/half{
+ dir = 1
+ },
+/obj/machinery/newscaster/security_unit{
+ pixel_y = 28
+ },
+/mob/living/simple_mob/vore/fennec/bridgette,
+/turf/simulated/floor/tiled/dark,
+/area/security/security_cell_hallway)
"ab" = (
/obj/structure/cable/pink{
icon_state = "2-4"
@@ -37,6 +50,19 @@
/obj/effect/floor_decal/milspec/color/red,
/turf/simulated/floor/tiled/dark,
/area/security/security_lockerroom)
+"af" = (
+/obj/machinery/computer/transhuman/resleeving{
+ dir = 8
+ },
+/obj/effect/floor_decal/industrial/warning{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/item/weapon/book/manual/resleeving,
+/turf/simulated/floor/tiled/steel_grid,
+/area/assembly/robotics)
"ag" = (
/obj/structure/cable/pink{
icon_state = "1-4"
@@ -98,6 +124,20 @@
},
/turf/simulated/floor/tiled/dark,
/area/prison/cell_block)
+"al" = (
+/obj/structure/table/standard,
+/obj/structure/extinguisher_cabinet{
+ dir = 8;
+ pixel_x = 30
+ },
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 8
+ },
+/obj/machinery/computer/med_data/laptop{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/steel,
+/area/assembly/robotics)
"am" = (
/obj/machinery/door/firedoor/glass/hidden/steel{
dir = 2
@@ -167,6 +207,19 @@
/obj/machinery/atmospherics/pipe/simple/hidden/universal,
/turf/simulated/floor/tiled/dark,
/area/security/tactical)
+"av" = (
+/obj/structure/table/standard,
+/obj/machinery/cell_charger,
+/obj/machinery/power/apc/angled{
+ dir = 8
+ },
+/obj/structure/cable/green{
+ color = "#42038a";
+ icon_state = "0-4"
+ },
+/obj/item/weapon/storage/box/backup_kit,
+/turf/simulated/floor/tiled/steel_dirty,
+/area/assembly/robotics)
"aw" = (
/obj/structure/stairs/spawner/north,
/obj/structure/railing/grey{
@@ -192,6 +245,18 @@
"ay" = (
/turf/simulated/floor/tiled/eris/steel/cargo,
/area/stellardelight/deck1/pathfinder)
+"az" = (
+/obj/structure/cable/green{
+ color = "#42038a";
+ icon_state = "1-2"
+ },
+/obj/structure/cable/green{
+ color = "#42038a";
+ icon_state = "2-8"
+ },
+/mob/living/simple_mob/animal/passive/mimepet/gregory,
+/turf/simulated/floor/tiled/eris,
+/area/rnd/xenobiology/xenoflora)
"aA" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -204,18 +269,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor,
/area/maintenance/stellardelight/deck1/exploration)
-"aB" = (
-/obj/structure/table/standard,
-/obj/machinery/cell_charger,
-/obj/machinery/power/apc/angled{
- dir = 8
- },
-/obj/structure/cable/green{
- color = "#42038a";
- icon_state = "0-4"
- },
-/turf/simulated/floor/tiled/steel_dirty,
-/area/assembly/robotics)
"aC" = (
/obj/structure/cable/green{
color = "#42038a";
@@ -1285,19 +1338,6 @@
},
/turf/simulated/floor/tiled/techmaint,
/area/stellardelight/deck1/port)
-"cP" = (
-/obj/structure/cable/pink{
- icon_state = "4-8"
- },
-/obj/effect/floor_decal/milspec/color/red/half{
- dir = 1
- },
-/mob/living/simple_mob/vore/fennec/bridgette,
-/obj/machinery/newscaster/security_unit{
- pixel_y = 28
- },
-/turf/simulated/floor/tiled/dark,
-/area/security/security_cell_hallway)
"cQ" = (
/obj/machinery/mineral/unloading_machine,
/turf/simulated/floor/tiled/eris/steel/cargo,
@@ -5275,18 +5315,6 @@
},
/turf/simulated/floor/carpet/purcarpet,
/area/stellardelight/deck1/dorms/dorm6)
-"lk" = (
-/obj/machinery/computer/transhuman/resleeving{
- dir = 8
- },
-/obj/effect/floor_decal/industrial/warning{
- dir = 1
- },
-/obj/machinery/light{
- dir = 4
- },
-/turf/simulated/floor/tiled/steel_grid,
-/area/assembly/robotics)
"ll" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
@@ -5399,19 +5427,6 @@
},
/turf/simulated/floor/tiled/techmaint,
/area/stellardelight/deck1/aft)
-"lu" = (
-/obj/structure/table/standard,
-/obj/item/weapon/book/manual/resleeving,
-/obj/item/weapon/storage/box/backup_kit,
-/obj/structure/extinguisher_cabinet{
- dir = 8;
- pixel_x = 30
- },
-/obj/machinery/atmospherics/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/simulated/floor/tiled/steel,
-/area/assembly/robotics)
"lv" = (
/obj/structure/bed/chair/comfy/brown{
dir = 8
@@ -6135,6 +6150,7 @@
/area/stellardelight/deck1/lowermed)
"mK" = (
/obj/structure/table/sifwooden_reinforced,
+/obj/item/weapon/storage/box/nifsofts_pilot,
/turf/simulated/floor/tiled/eris/steel/panels,
/area/stellardelight/deck1/pilot)
"mL" = (
@@ -8364,6 +8380,7 @@
pixel_x = -3;
pixel_y = -2
},
+/obj/item/weapon/book/manual/robotics_manual,
/obj/item/weapon/book/manual/robotics_cyborgs,
/turf/simulated/floor/tiled/steel_dirty,
/area/assembly/robotics)
@@ -9217,18 +9234,6 @@
},
/turf/simulated/floor/airless,
/area/stellardelight/deck1/exterior)
-"tl" = (
-/obj/structure/cable/green{
- color = "#42038a";
- icon_state = "1-2"
- },
-/mob/living/simple_mob/animal/passive/mimepet/gregory,
-/obj/structure/cable/green{
- color = "#42038a";
- icon_state = "2-8"
- },
-/turf/simulated/floor/tiled/eris,
-/area/rnd/xenobiology/xenoflora)
"tm" = (
/obj/structure/dogbed,
/mob/living/simple_mob/animal/passive/tindalos/twigs,
@@ -10619,12 +10624,18 @@
/obj/item/clothing/shoes/magboots,
/obj/item/clothing/mask/breath,
/obj/item/clothing/mask/breath,
+/obj/item/device/suit_cooling_unit{
+ pixel_y = -5
+ },
+/obj/item/device/suit_cooling_unit{
+ pixel_y = -5
+ },
+/obj/item/weapon/tank/oxygen,
+/obj/item/weapon/tank/oxygen,
/obj/item/clothing/suit/space/void/pilot,
/obj/item/clothing/suit/space/void/pilot,
/obj/item/clothing/head/helmet/space/void/pilot,
/obj/item/clothing/head/helmet/space/void/pilot,
-/obj/item/weapon/tank/oxygen,
-/obj/item/weapon/tank/oxygen,
/turf/simulated/floor/tiled/eris/steel/panels,
/area/stellardelight/deck1/pilot)
"wu" = (
@@ -21786,7 +21797,7 @@
/area/library)
"Uj" = (
/obj/structure/table/woodentable,
-/obj/item/device/paicard,
+/obj/random/paicard,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
@@ -22365,6 +22376,7 @@
/obj/item/weapon/book/manual/resleeving,
/obj/item/weapon/book/manual/ripley_build_and_repair,
/obj/item/weapon/book/manual/robotics_cyborgs,
+/obj/item/weapon/book/manual/robotics_manual,
/obj/item/weapon/book/manual/rust_engine,
/obj/item/weapon/book/manual/security_space_law,
/obj/item/weapon/book/manual/standard_operating_procedure,
@@ -35218,7 +35230,7 @@ Ne
Ne
Ne
Qu
-cP
+aa
wT
QC
Iq
@@ -36395,7 +36407,7 @@ xs
zG
Ih
ru
-aB
+av
aD
Mr
fo
@@ -36960,8 +36972,8 @@ JU
LB
nu
yI
-lk
-lu
+af
+al
rz
ss
aD
@@ -37558,7 +37570,7 @@ Yc
zI
CS
Gl
-tl
+az
KN
Yw
FA
diff --git a/maps/stellardelight/stellar_delight2.dmm b/maps/stellar_delight/stellar_delight2.dmm
similarity index 99%
rename from maps/stellardelight/stellar_delight2.dmm
rename to maps/stellar_delight/stellar_delight2.dmm
index 61649271d2c..6b6601dda94 100644
--- a/maps/stellardelight/stellar_delight2.dmm
+++ b/maps/stellar_delight/stellar_delight2.dmm
@@ -1896,6 +1896,18 @@
/obj/machinery/hologram/holopad,
/turf/simulated/floor/tiled/eris/dark/orangecorner,
/area/engineering/locker_room)
+"dT" = (
+/obj/machinery/computer/atmos_alert{
+ dir = 1
+ },
+/obj/machinery/camera/network/engineering{
+ dir = 4
+ },
+/obj/structure/sign/scenery/fakefireaxe{
+ pixel_x = -32
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/engineering/atmos/monitoring)
"dU" = (
/obj/structure/bed/chair/backed_red{
dir = 4
@@ -1907,6 +1919,12 @@
/obj/structure/disposalpipe/segment,
/turf/simulated/wall/bay/r_wall/steel,
/area/stellardelight/deck2/o2production)
+"dW" = (
+/obj/structure/closet/secure_closet/engineering_electrical/double{
+ anchored = 1
+ },
+/turf/simulated/floor/tiled/eris/dark/orangecorner,
+/area/engineering/locker_room)
"dX" = (
/obj/machinery/light{
dir = 8
@@ -2059,6 +2077,10 @@
},
/turf/simulated/open,
/area/stellardelight/deck2/aftstarboard)
+"eo" = (
+/obj/structure/closet/secure_closet/engineering_welding/double,
+/turf/simulated/floor/tiled/eris/dark/orangecorner,
+/area/engineering/locker_room)
"ep" = (
/obj/machinery/power/apc/angled{
dir = 4;
@@ -2125,7 +2147,7 @@
},
/obj/item/clothing/shoes/black,
/obj/item/device/communicator,
-/turf/simulated/floor/holofloor/tiled/dark,
+/turf/simulated/floor/tiled/dark,
/area/crew_quarters/locker)
"ew" = (
/obj/structure/table/steel_reinforced,
@@ -2469,6 +2491,10 @@
},
/turf/simulated/floor/tiled/eris/steel/brown_platform,
/area/crew_quarters/bar)
+"fj" = (
+/obj/structure/closet/secure_closet/engineering_electrical,
+/turf/simulated/floor/tiled/techfloor,
+/area/stellardelight/deck2/o2production)
"fk" = (
/obj/machinery/vending/engivend,
/obj/machinery/light{
@@ -2522,6 +2548,10 @@
},
/turf/simulated/floor/lino,
/area/crew_quarters/bar)
+"fq" = (
+/obj/structure/closet/secure_closet/engineering_welding,
+/turf/simulated/floor/tiled/techfloor,
+/area/stellardelight/deck2/o2production)
"fr" = (
/obj/structure/sign/painting/public{
pixel_x = -30
@@ -3568,7 +3598,7 @@
/obj/machinery/disposal/wall/cleaner{
dir = 4
},
-/turf/simulated/floor/holofloor/tiled/dark,
+/turf/simulated/floor/tiled/dark,
/area/crew_quarters/locker)
"hQ" = (
/obj/structure/table/standard,
@@ -5604,7 +5634,7 @@
/obj/machinery/vending/loadout/loadout_misc,
/obj/machinery/atmospherics/unary/vent_pump/on,
/obj/effect/landmark/vines,
-/turf/simulated/floor/holofloor/tiled/dark,
+/turf/simulated/floor/tiled/dark,
/area/crew_quarters/locker)
"me" = (
/obj/structure/cable/white{
@@ -5835,7 +5865,7 @@
/obj/item/clothing/shoes/black,
/obj/machinery/light,
/obj/item/device/communicator,
-/turf/simulated/floor/holofloor/tiled/dark,
+/turf/simulated/floor/tiled/dark,
/area/crew_quarters/locker)
"mH" = (
/obj/structure/table/steel_reinforced,
@@ -5862,7 +5892,7 @@
/area/maintenance/stellardelight/deck2/atmos)
"mJ" = (
/obj/structure/table/woodentable,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/tiled/eris/steel/brown_platform,
/area/crew_quarters/bar)
"mK" = (
@@ -7081,12 +7111,6 @@
/obj/effect/floor_decal/industrial/warning,
/turf/simulated/floor/tiled/eris/steel/cargo,
/area/quartermaster/storage)
-"pF" = (
-/obj/structure/closet/secure_closet/engineering_electrical,
-/obj/item/clothing/gloves/yellow,
-/obj/item/clothing/gloves/yellow,
-/turf/simulated/floor/tiled/eris/dark/orangecorner,
-/area/engineering/locker_room)
"pG" = (
/obj/structure/cable/green{
icon_state = "4-8"
@@ -7898,9 +7922,6 @@
},
/turf/simulated/floor/tiled/eris/cafe,
/area/crew_quarters/kitchen)
-"ro" = (
-/turf/simulated/floor/tiled/techfloor,
-/area/stellardelight/deck2/o2production)
"rp" = (
/obj/structure/cable/cyan{
icon_state = "1-2"
@@ -7931,18 +7952,18 @@
pixel_x = -1;
pixel_y = -42
},
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
/obj/item/weapon/reagent_containers/food/condiment/spacespice,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,
/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,
/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,
@@ -8066,7 +8087,7 @@
/obj/random/tech_supply,
/obj/random/tech_supply,
/obj/random/tech_supply,
-/obj/item/device/paicard,
+/obj/random/paicard,
/obj/machinery/atmospherics/unary/vent_pump/on,
/obj/machinery/newscaster{
pixel_y = 28
@@ -10630,7 +10651,7 @@
/obj/machinery/light{
dir = 1
},
-/turf/simulated/floor/holofloor/tiled/dark,
+/turf/simulated/floor/tiled/dark,
/area/crew_quarters/locker)
"xJ" = (
/obj/structure/table/reinforced,
@@ -11229,6 +11250,7 @@
/obj/machinery/light{
dir = 4
},
+/obj/item/weapon/gun/energy/mouseray/medical,
/turf/simulated/floor/tiled/eris/white/bluecorner,
/area/medical/cmostore)
"yW" = (
@@ -11696,7 +11718,7 @@
},
/obj/machinery/vending/loadout/uniform,
/obj/machinery/atmospherics/unary/vent_scrubber/on,
-/turf/simulated/floor/holofloor/tiled/dark,
+/turf/simulated/floor/tiled/dark,
/area/crew_quarters/locker)
"Af" = (
/obj/structure/table/reinforced,
@@ -12895,7 +12917,7 @@
},
/obj/machinery/vending/loadout/clothing,
/obj/machinery/alarm/angled,
-/turf/simulated/floor/holofloor/tiled/dark,
+/turf/simulated/floor/tiled/dark,
/area/crew_quarters/locker)
"CW" = (
/obj/effect/floor_decal/steeldecal/steel_decals5{
@@ -13084,7 +13106,7 @@
},
/obj/structure/undies_wardrobe,
/obj/effect/landmark/vermin,
-/turf/simulated/floor/holofloor/tiled/dark,
+/turf/simulated/floor/tiled/dark,
/area/crew_quarters/locker)
"Dv" = (
/obj/structure/cable/white{
@@ -13909,12 +13931,6 @@
/obj/structure/cable/orange{
icon_state = "2-4"
},
-/obj/structure/cable/orange{
- icon_state = "2-4"
- },
-/obj/structure/cable/orange{
- icon_state = "2-4"
- },
/turf/simulated/floor/airless,
/area/stellardelight/deck2/exterior)
"Fi" = (
@@ -14284,7 +14300,7 @@
},
/obj/machinery/vending/loadout/overwear,
/obj/machinery/camera/network/civilian,
-/turf/simulated/floor/holofloor/tiled/dark,
+/turf/simulated/floor/tiled/dark,
/area/crew_quarters/locker)
"FS" = (
/obj/structure/cable/green{
@@ -14635,15 +14651,6 @@
},
/turf/simulated/floor/tiled/eris/cafe,
/area/crew_quarters/kitchen)
-"GC" = (
-/obj/machinery/computer/atmos_alert{
- dir = 1
- },
-/obj/machinery/camera/network/engineering{
- dir = 4
- },
-/turf/simulated/floor/tiled/techfloor,
-/area/engineering/atmos/monitoring)
"GD" = (
/obj/machinery/door/firedoor/glass,
/obj/machinery/atmospherics/pipe/simple/hidden/green,
@@ -15267,7 +15274,7 @@
/area/engineering/storage)
"HV" = (
/obj/machinery/washing_machine,
-/turf/simulated/floor/holofloor/tiled/dark,
+/turf/simulated/floor/tiled/dark,
/area/crew_quarters/locker)
"HW" = (
/obj/machinery/door/firedoor/glass,
@@ -18296,10 +18303,6 @@
},
/turf/simulated/floor/tiled/eris/cafe,
/area/crew_quarters/kitchen)
-"OB" = (
-/obj/structure/closet/secure_closet/engineering_welding,
-/turf/simulated/floor/tiled/eris/dark/orangecorner,
-/area/engineering/locker_room)
"OC" = (
/obj/structure/closet/crate/bin{
anchored = 1
@@ -21569,7 +21572,7 @@
dir = 8
},
/obj/machinery/vending/loadout/gadget,
-/turf/simulated/floor/holofloor/tiled/dark,
+/turf/simulated/floor/tiled/dark,
/area/crew_quarters/locker)
"VV" = (
/obj/structure/cable/orange{
@@ -21981,7 +21984,7 @@
/area/medical/reception)
"WR" = (
/obj/structure/table/wooden_reinforced,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/tiled/eris/dark/cargo,
/area/crew_quarters/recreation_area)
"WS" = (
@@ -29892,7 +29895,7 @@ NK
eq
sz
to
-GC
+dT
Ag
Fl
sp
@@ -30188,7 +30191,7 @@ UY
OK
pO
Qu
-ro
+fj
Sz
ZG
Jh
@@ -30330,7 +30333,7 @@ pY
DE
sT
WM
-ro
+fq
Sz
QW
Jh
@@ -35566,7 +35569,7 @@ Re
OI
da
iw
-pF
+dW
To
To
Vo
@@ -35710,7 +35713,7 @@ Kv
dS
vb
Nm
-OB
+eo
OF
Oq
rf
diff --git a/maps/stellardelight/stellar_delight3.dmm b/maps/stellar_delight/stellar_delight3.dmm
similarity index 99%
rename from maps/stellardelight/stellar_delight3.dmm
rename to maps/stellar_delight/stellar_delight3.dmm
index 067cf7585ba..96c47124593 100644
--- a/maps/stellardelight/stellar_delight3.dmm
+++ b/maps/stellar_delight/stellar_delight3.dmm
@@ -1032,8 +1032,12 @@
/obj/structure/cable/green{
icon_state = "2-8"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 8
+ },
/turf/simulated/floor,
/area/maintenance/stellardelight/deck3/portcent)
"ei" = (
@@ -1606,7 +1610,7 @@
/area/maintenance/stellardelight/deck3/foreportroomb)
"gk" = (
/obj/structure/table/woodentable,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/wood,
/area/stellardelight/deck3/cafe)
"gl" = (
@@ -5054,7 +5058,7 @@
/area/space)
"sI" = (
/obj/structure/table/standard,
-/obj/item/device/paicard,
+/obj/random/paicard,
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/bluegrid,
/area/ai_cyborg_station)
@@ -6294,6 +6298,8 @@
/obj/structure/cable/green{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/wood,
/area/stellardelight/deck3/readingroom)
"xw" = (
@@ -6558,6 +6564,8 @@
/obj/structure/cable/green{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/wood,
/area/stellardelight/deck3/readingroom)
"ys" = (
@@ -7083,6 +7091,7 @@
/obj/structure/closet/crate/bin{
anchored = 1
},
+/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/wood,
/area/stellardelight/deck3/readingroom)
"Ai" = (
@@ -7125,6 +7134,8 @@
/obj/structure/cable/green{
icon_state = "0-2"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/unary/vent_pump/on,
/turf/simulated/floor/wood,
/area/stellardelight/deck3/readingroom)
"An" = (
@@ -7384,6 +7395,7 @@
dir = 8
},
/obj/structure/bookcase,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/wood,
/area/stellardelight/deck3/readingroom)
"Be" = (
@@ -8114,7 +8126,7 @@
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
dir = 1
},
-/turf/simulated/floor/carpet/deco,
+/turf/simulated/floor/carpet/geo,
/area/ai)
"Dy" = (
/obj/machinery/atmospherics/pipe/simple/hidden/black,
@@ -9267,6 +9279,8 @@
/obj/structure/cable/green{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/tiled/steel_ridged,
/area/stellardelight/deck3/readingroom)
"HR" = (
@@ -10254,7 +10268,7 @@
/turf/simulated/floor,
/area/maintenance/stellardelight/deck3/starboardaft)
"Lm" = (
-/obj/item/device/paicard,
+/obj/random/paicard,
/obj/structure/table/glass,
/obj/machinery/camera/network/civilian{
dir = 8
@@ -11687,7 +11701,7 @@
layer = 3.1;
name = "HoP's Shutters"
},
-/obj/structure/low_wall/bay/reinforced/blue,
+/obj/structure/table/reinforced,
/turf/simulated/floor/tiled,
/area/crew_quarters/heads/hop)
"PL" = (
@@ -13710,7 +13724,7 @@
name = "station intercom (Science)";
pixel_y = 24
},
-/obj/item/device/paicard{
+/obj/random/paicard{
pixel_x = 4
},
/obj/item/weapon/paper_bin{
@@ -13966,6 +13980,18 @@
/obj/structure/girder/displaced,
/turf/simulated/floor/tiled/techfloor/grid,
/area/maintenance/stellardelight/deck3/forestarroomb)
+"Yk" = (
+/obj/structure/cable/green{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/turf/simulated/floor,
+/area/maintenance/stellardelight/deck3/portcent)
"Yl" = (
/obj/structure/cable/green{
icon_state = "2-8"
@@ -14292,6 +14318,8 @@
/obj/structure/cable/green{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor,
/area/maintenance/stellardelight/deck3/portcent)
"Zt" = (
@@ -22452,7 +22480,7 @@ yq
xv
HQ
Zp
-My
+Yk
RM
WQ
OX
diff --git a/maps/stellardelight/stellar_delight_areas.dm b/maps/stellar_delight/stellar_delight_areas.dm
similarity index 98%
rename from maps/stellardelight/stellar_delight_areas.dm
rename to maps/stellar_delight/stellar_delight_areas.dm
index 47bb681c0a8..a720cb6060f 100644
--- a/maps/stellardelight/stellar_delight_areas.dm
+++ b/maps/stellar_delight/stellar_delight_areas.dm
@@ -130,6 +130,7 @@
limit_mob_size = FALSE
block_suit_sensors = TRUE
forbid_events = TRUE
+ forbid_singulo = TRUE
/area/stellardelight/deck1/dorms/dorm1
name = "Dormitory One"
@@ -272,8 +273,12 @@
/area/stellardelight/deck3/transitgateway
name = "Transit Gateway"
+ forbid_events = TRUE
+ forbid_singulo = TRUE
/area/stellardelight/deck3/cryo
name = "Cryogenic Storage"
+ forbid_events = TRUE
+ forbid_singulo = TRUE
/area/stellardelight/deck3/readingroom
name = "Reading Rooms"
@@ -281,7 +286,7 @@
flags = RAD_SHIELDED| BLUE_SHIELDED |AREA_FLAG_IS_NOT_PERSISTENT
soundproofed = TRUE
block_suit_sensors = TRUE
- forbid_events = TRUE
+ forbid_events = TRUE
/area/stellardelight/deck3/portdock
name = "Port Dock"
diff --git a/maps/stellardelight/stellar_delight_defines.dm b/maps/stellar_delight/stellar_delight_defines.dm
similarity index 96%
rename from maps/stellardelight/stellar_delight_defines.dm
rename to maps/stellar_delight/stellar_delight_defines.dm
index 3cafb69e00d..36553996ec6 100644
--- a/maps/stellardelight/stellar_delight_defines.dm
+++ b/maps/stellar_delight/stellar_delight_defines.dm
@@ -120,11 +120,24 @@
unit_test_exempt_areas = list(
/area/stellardelight/deck1/exterior,
/area/stellardelight/deck1/exploshuttle,
- /area/stellardelight/deck1/miningshuttle
+ /area/stellardelight/deck1/miningshuttle,
+ /area/stellardelight/deck2/exterior,
+ /area/stellardelight/deck2/portescape,
+ /area/stellardelight/deck2/starboardescape,
+ /area/stellardelight/deck3/exterior,
+
+ /area/medical/cryo,
+ /area/holodeck_control,
+ /area/tcommsat/chamber
)
unit_test_exempt_from_atmos = list() //it maint
+ unit_test_z_levels = list(
+ Z_LEVEL_SHIP_LOW,
+ Z_LEVEL_SHIP_MID,
+ Z_LEVEL_SHIP_HIGH
+ )
lateload_z_levels = list(
list("Ship - Central Command"),
@@ -326,7 +339,7 @@
. = ..()
seed_submaps(list(Z_LEVEL_SPACE_ROCKS), 60, /area/sdmine/unexplored, /datum/map_template/space_rocks)
new /datum/random_map/automata/cave_system/no_cracks(null, 3, 3, Z_LEVEL_SPACE_ROCKS, world.maxx - 4, world.maxy - 4)
- new /datum/random_map/noise/ore/spacerocks(null, 1, 1, Z_LEVEL_SPACE_ROCKS, 64, 64)
+ new /datum/random_map/noise/ore(null, 1, 1, Z_LEVEL_SPACE_ROCKS, 64, 64)
/datum/map_z_level/ship_lateload/space_rocks
z = Z_LEVEL_SPACE_ROCKS
diff --git a/maps/stellardelight/stellar_delight_jobs.dm b/maps/stellar_delight/stellar_delight_jobs.dm
similarity index 100%
rename from maps/stellardelight/stellar_delight_jobs.dm
rename to maps/stellar_delight/stellar_delight_jobs.dm
diff --git a/maps/stellardelight/stellar_delight_shuttle_defs.dm b/maps/stellar_delight/stellar_delight_shuttle_defs.dm
similarity index 100%
rename from maps/stellardelight/stellar_delight_shuttle_defs.dm
rename to maps/stellar_delight/stellar_delight_shuttle_defs.dm
diff --git a/maps/stellardelight/stellar_delight_telecomms.dm b/maps/stellar_delight/stellar_delight_telecomms.dm
similarity index 100%
rename from maps/stellardelight/stellar_delight_telecomms.dm
rename to maps/stellar_delight/stellar_delight_telecomms.dm
diff --git a/maps/stellardelight/stellar_delight_things.dm b/maps/stellar_delight/stellar_delight_things.dm
similarity index 98%
rename from maps/stellardelight/stellar_delight_things.dm
rename to maps/stellar_delight/stellar_delight_things.dm
index 90c50ddf4f0..2cdc2a0382c 100644
--- a/maps/stellardelight/stellar_delight_things.dm
+++ b/maps/stellar_delight/stellar_delight_things.dm
@@ -10,6 +10,7 @@
desc = "Magnetic levitation tram tracks. Caution! Electrified!"
icon = 'icons/turf/flooring/maglevs.dmi'
icon_state = "maglevup"
+ can_be_plated = FALSE
var/area/shock_area = /area/tether/surfacebase/tram
@@ -151,7 +152,7 @@
layer = ABOVE_WINDOW_LAYER
/obj/machinery/vending/wallmed2
layer = ABOVE_WINDOW_LAYER
-/obj/structure/closet/fireaxecabinet
+/obj/structure/fireaxecabinet
layer = ABOVE_WINDOW_LAYER
/obj/structure/extinguisher_cabinet
layer = ABOVE_WINDOW_LAYER
@@ -174,3 +175,6 @@
/obj/machinery/power/quantumpad/scioutpost
+/datum/random_map/noise/ore/virgo2 // Less OP generation map, but better than Underdark
+ deep_val = 0.7
+ rare_val = 0.5
\ No newline at end of file
diff --git a/maps/stellardelight/stellar_delight_turfs.dm b/maps/stellar_delight/stellar_delight_turfs.dm
similarity index 63%
rename from maps/stellardelight/stellar_delight_turfs.dm
rename to maps/stellar_delight/stellar_delight_turfs.dm
index 9e7927efe2c..6e8e86fb33c 100644
--- a/maps/stellardelight/stellar_delight_turfs.dm
+++ b/maps/stellar_delight/stellar_delight_turfs.dm
@@ -45,3 +45,38 @@ VIRGO3B_TURF_CREATE(/turf/simulated/floor/outdoors/dirt)
icon_state = "asteroid"
VIRGO3B_TURF_CREATE(/turf/simulated/floor/outdoors/rocks)
+
+/turf/simulated/mineral/virgo2/make_ore(var/rare_ore) // Override V2 ore generation
+ if(mineral || ignore_mapgen)
+ return
+ var/mineral_name
+ if(rare_ore)
+ mineral_name = pickweight(list(
+ "marble" = 7,
+ "uranium" = 10,
+ "platinum" = 10,
+ "hematite" = 10,
+ "carbon" = 10,
+ "diamond" = 4,
+ "gold" = 15,
+ "silver" = 15,
+ "lead" = 5,
+ "verdantium" = 2,
+ "rutile" = 10))
+ else
+ mineral_name = pickweight(list(
+ "marble" = 5,
+ "uranium" = 7,
+ "platinum" = 7,
+ "hematite" = 28,
+ "carbon" = 28,
+ "diamond" = 2,
+ "gold" = 7,
+ "silver" = 7,
+ "lead" = 4,
+ "verdantium" = 1,
+ "rutile" = 10))
+ if(mineral_name && (mineral_name in GLOB.ore_data))
+ mineral = GLOB.ore_data[mineral_name]
+ UpdateMineral()
+ update_icon()
diff --git a/maps/submaps/admin_use_vr/dhael_centcom.dmm b/maps/submaps/admin_use_vr/dhael_centcom.dmm
index ebf1d392003..0e66e67a78d 100644
--- a/maps/submaps/admin_use_vr/dhael_centcom.dmm
+++ b/maps/submaps/admin_use_vr/dhael_centcom.dmm
@@ -307,8 +307,8 @@
/area/centcom/specops)
"aP" = (
/obj/structure/table/rack,
-/obj/item/weapon/gun/energy/gun/martin,
-/obj/item/weapon/gun/energy/gun/martin,
+/obj/item/weapon/gun/energy/gun/compact,
+/obj/item/weapon/gun/energy/gun/compact,
/obj/item/device/flash,
/obj/item/device/flash,
/turf/unsimulated/floor{
@@ -16126,8 +16126,8 @@
/area/centcom/evac)
"UO" = (
/obj/structure/table/rack,
-/obj/item/weapon/gun/energy/gun/martin,
-/obj/item/weapon/gun/energy/gun/martin,
+/obj/item/weapon/gun/energy/gun/compact,
+/obj/item/weapon/gun/energy/gun/compact,
/obj/item/device/flash,
/obj/item/device/flash,
/turf/unsimulated/floor{
diff --git a/maps/submaps/admin_use_vr/dojo.dmm b/maps/submaps/admin_use_vr/dojo.dmm
index fd50bcf52f6..a2bd85f37f5 100644
--- a/maps/submaps/admin_use_vr/dojo.dmm
+++ b/maps/submaps/admin_use_vr/dojo.dmm
@@ -432,7 +432,7 @@
/area/ninja_dojo/dojo)
"bc" = (
/obj/structure/table/steel_reinforced,
-/obj/item/device/paicard,
+/obj/random/paicard,
/obj/item/device/pda/syndicate,
/turf/simulated/shuttle/floor/voidcraft/light,
/area/shuttle/ninja)
diff --git a/maps/submaps/admin_use_vr/fun.dm b/maps/submaps/admin_use_vr/fun.dm
index 05df720d4ec..e703fc811a3 100644
--- a/maps/submaps/admin_use_vr/fun.dm
+++ b/maps/submaps/admin_use_vr/fun.dm
@@ -3,7 +3,10 @@
requires_power = 0
dynamic_lighting = 0
-
+/area/submap/casino_event
+ name = "\improper Space Casino"
+ requires_power = 0
+ dynamic_lighting = 0
// NEVER EVER use these on an actual included map.
diff --git a/maps/submaps/admin_use_vr/lucky_7.dmm b/maps/submaps/admin_use_vr/lucky_7.dmm
new file mode 100644
index 00000000000..356e3cb461b
--- /dev/null
+++ b/maps/submaps/admin_use_vr/lucky_7.dmm
@@ -0,0 +1,631 @@
+"aa" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"ab" = (/obj/structure/table/borosilicate,/turf/simulated/floor/tiled/eris/steel/bar_dance,/area/submap/casino_event)
+"ac" = (/obj/structure/table/borosilicate,/obj/structure/dancepole,/turf/simulated/floor/tiled/eris/steel/bar_dance,/area/submap/casino_event)
+"ad" = (/obj/structure/table/borosilicate,/turf/simulated/floor/tiled/eris/steel/bar_light,/area/submap/casino_event)
+"ae" = (/turf/simulated/wall,/area/submap/casino_event)
+"af" = (/obj/structure/table/bench/padded,/obj/effect/floor_decal/spline/plain,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/eris/steel/bar_dance,/area/submap/casino_event)
+"ag" = (/obj/structure/table/bench/padded,/obj/effect/floor_decal/spline/plain,/turf/simulated/floor/tiled/eris/steel/bar_dance,/area/submap/casino_event)
+"ah" = (/obj/structure/table/bench/padded,/obj/effect/floor_decal/spline/plain,/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/eris/steel/bar_dance,/area/submap/casino_event)
+"ai" = (/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"aj" = (/obj/structure/bed/chair/bay/comfy/blue,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"ak" = (/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"al" = (/obj/structure/table/darkglass,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"am" = (/obj/structure/bed/chair/bay/comfy/blue{dir = 1},/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"an" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"ao" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"ap" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"aq" = (/turf/simulated/floor/carpet/retro,/area/submap/casino_event)
+"ar" = (/obj/machinery/computer/arcade/orion_trail,/turf/simulated/floor/carpet/retro,/area/submap/casino_event)
+"as" = (/obj/machinery/computer/arcade/battle,/turf/simulated/floor/carpet/retro,/area/submap/casino_event)
+"at" = (/obj/machinery/atm{pixel_y = 30},/turf/simulated/floor/carpet/retro,/area/submap/casino_event)
+"au" = (/obj/structure/flora/pottedplant/largebush,/turf/simulated/floor/carpet/retro,/area/submap/casino_event)
+"av" = (/obj/machinery/door/morgue{dir = 2; name = "Private Room"; req_access = null},/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"aw" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/retro,/area/submap/casino_event)
+"ax" = (/obj/item/weapon/stool/baystool/padded{dir = 1},/turf/simulated/floor/carpet/retro,/area/submap/casino_event)
+"ay" = (/obj/structure/flora/pottedplant/tall,/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"az" = (/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"aA" = (/obj/structure/table/woodentable,/obj/machinery/light{dir = 8},/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"aB" = (/obj/machinery/door/airlock{name = "Arcade"},/turf/simulated/floor/carpet/retro,/area/submap/casino_event)
+"aC" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/carpet/retro,/area/submap/casino_event)
+"aD" = (/obj/structure/table/gamblingtable,/turf/simulated/floor/carpet/retro,/area/submap/casino_event)
+"aE" = (/obj/structure/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/carpet/retro,/area/submap/casino_event)
+"aF" = (/obj/machinery/clawmachine,/turf/simulated/floor/carpet/retro,/area/submap/casino_event)
+"aG" = (/obj/structure/table/woodentable,/obj/machinery/light,/turf/simulated/floor/carpet/retro,/area/submap/casino_event)
+"aH" = (/obj/structure/table/gamblingtable,/obj/item/weapon/storage/pill_bottle/dice_nerd,/obj/machinery/light,/turf/simulated/floor/carpet/retro,/area/submap/casino_event)
+"aI" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"aJ" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"aK" = (/obj/structure/flora/pottedplant/tall,/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"aL" = (/obj/structure/closet,/obj/random/junk,/obj/random/junk,/obj/random/maintenance,/turf/simulated/floor/plating,/area/submap/casino_event)
+"aM" = (/obj/structure/closet,/obj/random/junk,/obj/random/junk,/obj/random/maintenance,/obj/random/maintenance,/turf/simulated/floor/plating,/area/submap/casino_event)
+"aN" = (/obj/structure/table/steel,/obj/random/junk,/obj/random/maintenance,/turf/simulated/floor/plating,/area/submap/casino_event)
+"aO" = (/turf/simulated/floor/plating,/area/submap/casino_event)
+"aP" = (/obj/random/junk,/turf/simulated/floor/plating,/area/submap/casino_event)
+"aQ" = (/obj/structure/bed/chair/wood,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"aR" = (/obj/structure/table/woodentable,/obj/machinery/light{dir = 4},/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"aS" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/submap/casino_event)
+"aT" = (/obj/structure/catwalk,/turf/simulated/floor/plating,/area/submap/casino_event)
+"aU" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"aV" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/submap/casino_event)
+"aW" = (/obj/random/trash,/obj/structure/railing{dir = 8},/obj/structure/railing{dir = 1},/obj/random/junk,/turf/simulated/floor/plating,/area/submap/casino_event)
+"aX" = (/obj/random/trash,/obj/random/trash,/turf/simulated/floor/plating,/area/submap/casino_event)
+"aY" = (/obj/random/trash,/obj/machinery/light/small{dir = 4},/obj/random/junk,/turf/simulated/floor/plating,/area/submap/casino_event)
+"aZ" = (/obj/structure/bed/chair/wood{dir = 1},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"ba" = (/obj/structure/window/basic,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"bb" = (/obj/machinery/door/airlock{id_tag = "L7 PGR 1"; name = "Private Game Room 1"},/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"bc" = (/obj/machinery/door/airlock{id_tag = "L7 PGR 2"; name = "Private Game Room 2"},/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"bd" = (/obj/machinery/door/airlock{id_tag = "L7 PGR 3"; name = "Private Game Room 3"},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"be" = (/obj/random/trash,/obj/random/trash,/obj/machinery/light/small,/obj/structure/railing{dir = 8},/obj/random/junk,/turf/simulated/floor/plating,/area/submap/casino_event)
+"bf" = (/obj/random/trash,/obj/random/trash,/obj/random/junk,/obj/random/junk,/turf/simulated/floor/plating,/area/submap/casino_event)
+"bg" = (/obj/random/trash_pile,/obj/random/trash,/obj/random/trash,/obj/random/junk,/turf/simulated/floor/plating,/area/submap/casino_event)
+"bh" = (/obj/machinery/slot_machine,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"bi" = (/obj/machinery/slot_machine,/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"bj" = (/obj/structure/closet/walllocker_double{dir = 8; name = "Game Cabinet"; pixel_x = -28},/obj/item/weapon/book/manual/wizzoffguide,/obj/item/weapon/deck/wizoff,/obj/item/weapon/storage/pill_bottle/dice_nerd,/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/deck/cards/casino,/obj/item/weapon/deck/cah,/obj/item/weapon/deck/cah/black,/obj/item/weapon/storage/dicecup,/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"bk" = (/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"bl" = (/obj/machinery/button/remote/airlock{id = "L7 PGR 1"; name = "Door Lock"; pixel_x = 24; pixel_y = 26; specialfunctions = 4},/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"bm" = (/obj/structure/closet/walllocker_double{dir = 8; name = "Game Cabinet"; pixel_x = -28},/obj/item/weapon/book/manual/wizzoffguide,/obj/item/weapon/deck/wizoff,/obj/item/weapon/storage/pill_bottle/dice_nerd,/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/deck/cards/casino,/obj/item/weapon/deck/cah,/obj/item/weapon/deck/cah/black,/obj/item/weapon/storage/dicecup,/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"bn" = (/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"bo" = (/obj/machinery/button/remote/airlock{id = "L7 PGR 2"; name = "Door Lock"; pixel_x = 24; pixel_y = 26; specialfunctions = 4},/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"bp" = (/obj/structure/closet/walllocker_double{dir = 8; name = "Game Cabinet"; pixel_x = -28},/obj/item/weapon/book/manual/wizzoffguide,/obj/item/weapon/deck/wizoff,/obj/item/weapon/storage/pill_bottle/dice_nerd,/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/deck/cards/casino,/obj/item/weapon/deck/cah,/obj/item/weapon/deck/cah/black,/obj/item/weapon/storage/dicecup,/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"bq" = (/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"br" = (/obj/machinery/button/remote/airlock{id = "L7 PGR 3"; name = "Door Lock"; pixel_x = 24; pixel_y = 26; specialfunctions = 4},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"bs" = (/obj/structure/railing{dir = 1},/obj/random/trash_pile,/turf/simulated/floor/plating,/area/submap/casino_event)
+"bt" = (/obj/random/trash_pile,/obj/random/trash,/obj/random/junk,/obj/random/junk,/turf/simulated/floor/plating,/area/submap/casino_event)
+"bu" = (/obj/random/trash,/obj/random/junk,/turf/simulated/floor/plating,/area/submap/casino_event)
+"bv" = (/obj/item/weapon/stool/baystool/padded{dir = 1},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"bw" = (/obj/structure/bed/chair/comfy/beige,/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"bx" = (/obj/structure/bed/chair/comfy/beige,/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"by" = (/obj/structure/bed/chair/comfy/beige,/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"bz" = (/obj/machinery/door/airlock/maintenance/common{name = "Trash Collection"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/submap/casino_event)
+"bA" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"bB" = (/obj/structure/table/gamblingtable,/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"bC" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"bD" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"bE" = (/obj/structure/table/gamblingtable,/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"bF" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"bG" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"bH" = (/obj/structure/table/gamblingtable,/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"bI" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"bJ" = (/obj/random/trash_pile,/turf/simulated/floor/plating,/area/submap/casino_event)
+"bK" = (/obj/random/trash_pile,/obj/effect/floor_decal/rust,/obj/random/junk,/turf/simulated/floor/plating,/area/submap/casino_event)
+"bL" = (/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/submap/casino_event)
+"bM" = (/obj/effect/floor_decal/rust,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/submap/casino_event)
+"bN" = (/obj/effect/floor_decal/rust,/obj/random/trash_pile,/turf/simulated/floor/plating,/area/submap/casino_event)
+"bO" = (/obj/effect/floor_decal/rust,/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/submap/casino_event)
+"bP" = (/obj/effect/floor_decal/rust,/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/submap/casino_event)
+"bQ" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"bR" = (/obj/structure/bed/chair/sofa/left/black{dir = 4},/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"bS" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/casino,/obj/item/weapon/pen,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"bT" = (/obj/structure/bed/chair/sofa/right/black{dir = 8},/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"bU" = (/obj/structure/mirror{pixel_y = 38},/obj/structure/sink{pixel_y = 20},/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"bV" = (/obj/structure/toilet{pixel_y = 10},/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"bW" = (/obj/structure/table/woodentable,/obj/item/trash/asian_bowl,/obj/item/weapon/material/kitchen/utensil/fork/plastic,/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"bX" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"bY" = (/obj/structure/bed/chair/wood{dir = 1},/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"bZ" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"ca" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"cb" = (/obj/structure/bed/chair/wood{dir = 1},/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"cc" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"cd" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"ce" = (/obj/structure/bed/chair/wood{dir = 1},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"cf" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"cg" = (/obj/structure/closet,/obj/random/junk,/obj/random/junk,/obj/random/maintenance,/obj/random/maintenance,/obj/effect/floor_decal/rust,/obj/random/contraband,/turf/simulated/floor/plating,/area/submap/casino_event)
+"ch" = (/obj/machinery/door/airlock/maintenance/common,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/submap/casino_event)
+"ci" = (/obj/machinery/door/airlock/maintenance/common,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"cj" = (/obj/structure/bed/chair/sofa/black{dir = 4},/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"ck" = (/obj/structure/table/woodentable,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"cl" = (/obj/structure/bed/chair/sofa/black{dir = 8},/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"cm" = (/obj/machinery/door/airlock{id_tag = "br bathroom"; name = "Bathroom"},/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"cn" = (/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"co" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"cp" = (/obj/structure/closet,/obj/random/junk,/obj/random/junk,/obj/random/junk,/obj/random/maintenance,/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/submap/casino_event)
+"cq" = (/obj/structure/railing{dir = 1},/turf/simulated/floor/plating,/area/submap/casino_event)
+"cr" = (/obj/structure/catwalk,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/submap/casino_event)
+"cs" = (/obj/structure/bed/chair/sofa/right/black{dir = 4},/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"ct" = (/obj/structure/bed/chair/sofa/left/black{dir = 8},/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"cu" = (/obj/structure/table/standard,/obj/machinery/button/remote/airlock{id = "br bathroom"; name = "Bathroom Lock"; pixel_x = -20; pixel_y = 10; specialfunctions = 4},/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"cv" = (/obj/machinery/vending/wallmed1/public{pixel_x = 28},/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"cw" = (/obj/structure/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair_preview"},/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"cx" = (/obj/structure/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair_preview"},/obj/machinery/light,/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"cy" = (/obj/structure/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair_preview"},/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"cz" = (/obj/structure/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair_preview"},/obj/machinery/light,/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"cA" = (/obj/structure/bed/chair/comfy/beige{dir = 1},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"cB" = (/obj/structure/bed/chair/comfy/beige{dir = 1},/obj/machinery/light,/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"cC" = (/obj/machinery/door/airlock/maintenance/common,/turf/simulated/floor/plating,/area/submap/casino_event)
+"cD" = (/turf/simulated/wall/r_wall,/area/submap/casino_event)
+"cE" = (/obj/structure/table/steel,/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/blood/oil,/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/submap/casino_event)
+"cF" = (/obj/structure/table/rack/steel,/obj/random/maintenance,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/submap/casino_event)
+"cG" = (/turf/simulated/floor/tiled,/area/submap/casino_event)
+"cH" = (/obj/effect/floor_decal/corner/lightorange{dir = 5},/obj/effect/floor_decal/borderfloor/shifted{dir = 1},/obj/effect/floor_decal/corner/lightorange/border/shifted{dir = 1},/obj/structure/closet/secure_closet/brig{id = "Cell 2"},/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"cI" = (/obj/effect/floor_decal/borderfloor/shifted{dir = 1},/obj/effect/floor_decal/corner/lightorange/border/shifted{dir = 1},/obj/effect/floor_decal/corner/lightorange{dir = 5},/obj/machinery/light/small{dir = 1},/obj/structure/bed/padded,/obj/item/weapon/bedsheet,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"cJ" = (/obj/effect/floor_decal/corner/lightorange{dir = 5},/obj/effect/floor_decal/borderfloor/shifted{dir = 1},/obj/effect/floor_decal/corner/lightorange/border/shifted{dir = 1},/obj/structure/table/steel,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"cK" = (/obj/structure/table/steel,/obj/random/maintenance/engineering,/obj/random/junk,/obj/effect/floor_decal/rust,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/submap/casino_event)
+"cL" = (/obj/effect/floor_decal/rust,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/submap/casino_event)
+"cM" = (/obj/structure/table/rack/steel,/obj/random/maintenance,/obj/random/junk,/obj/random/junk,/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/blood/oil,/obj/random/contraband,/turf/simulated/floor/plating,/area/submap/casino_event)
+"cN" = (/obj/structure/table/rack/shelf,/obj/item/device/slow_sizegun,/obj/item/device/slow_sizegun,/obj/item/device/slow_sizegun,/obj/item/weapon/gun/energy/sizegun,/obj/item/weapon/gun/energy/sizegun,/obj/item/weapon/gun/energy/sizegun,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"cO" = (/obj/machinery/atm{pixel_y = 30},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"cP" = (/obj/machinery/casino_prize_dispenser,/obj/effect/floor_decal/spline/plain{dir = 10},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"cQ" = (/obj/effect/floor_decal/spline/plain,/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/glass,/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"cR" = (/obj/machinery/casino_prize_dispenser,/obj/effect/floor_decal/spline/plain{dir = 6},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"cS" = (/obj/machinery/casinosentientprize_handler{casinosentientprize_sale = "enabled"; pixel_y = 32},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"cT" = (/obj/machinery/chipmachine{pixel_y = 32},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"cU" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/security,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"cV" = (/obj/structure/table/rack/shelf,/obj/item/weapon/storage/box/roulette_balls_cheat,/obj/item/weapon/storage/box/roulette_balls_cheat,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"cW" = (/obj/structure/table/rack/shelf,/obj/item/weapon/deck/cards/casino,/obj/item/weapon/deck/cards/casino,/obj/item/weapon/deck/cards/casino,/obj/item/weapon/deck/cards/casino,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"cX" = (/obj/structure/table/rack/shelf,/obj/item/weapon/deck/cah,/obj/item/weapon/deck/cah,/obj/item/weapon/deck/cah/black,/obj/item/weapon/deck/schnapsen,/obj/item/weapon/deck/wizoff,/obj/item/weapon/deck/tarot,/obj/item/weapon/deck/egy,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"cY" = (/obj/structure/table/rack/shelf,/obj/item/weapon/gun/energy/mouseray/metamorphosis/advanced,/obj/item/weapon/gun/energy/mouseray/metamorphosis/advanced,/obj/item/weapon/gun/energy/mouseray/metamorphosis/advanced,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"cZ" = (/obj/effect/floor_decal/spline/plain{dir = 9},/obj/structure/flora/pottedplant/stoutbush,/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"da" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"db" = (/obj/structure/table/steel,/obj/item/weapon/spacecasinocash/c1000{pixel_x = -3; pixel_y = -3},/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000{pixel_x = 3; pixel_y = 3},/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/turf/simulated/floor/tiled/techfloor,/area/submap/casino_event)
+"dc" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/submap/casino_event)
+"dd" = (/obj/structure/table/rack/steel,/obj/item/weapon/spacecash/c1000{pixel_x = 6; pixel_y = 6},/obj/item/weapon/spacecash/c1000{pixel_x = 3; pixel_y = 3},/obj/item/weapon/spacecash/c1000,/turf/simulated/floor/tiled/techfloor,/area/submap/casino_event)
+"de" = (/obj/structure/closet,/obj/random/junk,/obj/random/junk,/obj/random/maintenance,/obj/random/maintenance/engineering,/obj/item/device/flashlight/color,/obj/structure/railing{dir = 4},/turf/simulated/floor/plating,/area/submap/casino_event)
+"df" = (/obj/structure/table/rack/shelf,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"dg" = (/obj/structure/table/rack/shelf,/obj/item/device/bodysnatcher,/obj/item/device/bodysnatcher,/obj/item/device/sleevemate,/obj/item/device/sleevemate,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"dh" = (/obj/structure/flora/pottedplant/unusual,/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"di" = (/obj/structure/bed/chair/wood{dir = 4},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"dj" = (/obj/structure/bed/chair/wood{dir = 8},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"dk" = (/obj/machinery/light/floortube{dir = 8},/obj/structure/casino_table/roulette_chart,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"dl" = (/obj/structure/casino_table/roulette_table,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"dm" = (/obj/structure/casino_table/craps,/obj/item/weapon/dice{pixel_x = 4; pixel_y = 6},/obj/machinery/light/floortube{dir = 8},/obj/item/weapon/dice{pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/dicecup,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"dn" = (/obj/structure/casino_table/craps{dir = 1},/obj/item/weapon/dice{pixel_x = 4; pixel_y = 6},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"do" = (/obj/structure/table/woodentable,/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"dp" = (/obj/machinery/shower{pixel_y = 20},/obj/structure/curtain/open/shower,/obj/effect/floor_decal/steeldecal/steel_decals5,/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 6},/obj/random/soap,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"dq" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"dr" = (/obj/machinery/chipmachine{pixel_y = 32},/obj/machinery/atm{pixel_x = 32},/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"ds" = (/obj/structure/toilet{pixel_y = 10},/turf/simulated/floor/tiled/kafel_full,/area/submap/casino_event)
+"dt" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"du" = (/obj/machinery/chipmachine{pixel_y = 32},/obj/machinery/atm{pixel_x = 32},/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"dv" = (/obj/structure/sink{dir = 8; pixel_x = -13; pixel_y = -4},/obj/structure/mirror{pixel_x = -24},/turf/simulated/floor/tiled/kafel_full,/area/submap/casino_event)
+"dw" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"dx" = (/obj/machinery/chipmachine{pixel_y = 32},/obj/machinery/atm{pixel_x = 32},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"dy" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/kafel_full,/area/submap/casino_event)
+"dz" = (/turf/simulated/floor/carpet/sblucarpet,/area/submap/casino_event)
+"dA" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet/sblucarpet,/area/submap/casino_event)
+"dB" = (/obj/machinery/chipmachine{pixel_y = 32},/obj/machinery/atm{pixel_x = 32},/turf/simulated/floor/carpet/sblucarpet,/area/submap/casino_event)
+"dC" = (/obj/machinery/door/airlock{id_tag = "br bathroom"; name = "Bathroom"},/turf/simulated/floor/tiled/kafel_full,/area/submap/casino_event)
+"dD" = (/turf/simulated/floor/carpet/purcarpet,/area/submap/casino_event)
+"dE" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet/purcarpet,/area/submap/casino_event)
+"dF" = (/obj/machinery/chipmachine{pixel_y = 32},/obj/machinery/atm{pixel_x = 32},/turf/simulated/floor/carpet/purcarpet,/area/submap/casino_event)
+"dG" = (/obj/effect/floor_decal/corner/lightorange{dir = 5},/obj/effect/floor_decal/borderfloor/shifted{dir = 1},/obj/effect/floor_decal/corner/lightorange/border/shifted{dir = 1},/obj/structure/closet/secure_closet/brig{id = "Cell 1"},/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"dH" = (/obj/structure/table/steel,/obj/item/stack/material/diamond{amount = 50; pixel_x = -5; pixel_y = -5},/obj/item/stack/material/diamond{amount = 50},/obj/item/stack/material/diamond{amount = 50; pixel_x = 5; pixel_y = 5},/turf/simulated/floor/tiled/techfloor,/area/submap/casino_event)
+"dI" = (/turf/simulated/floor/tiled/techfloor,/area/submap/casino_event)
+"dJ" = (/obj/random/junk,/obj/random/junk,/obj/random/junk,/obj/random/maintenance,/obj/random/maintenance,/obj/random/maintenance/engineering,/obj/structure/table/rack/steel,/obj/random/contraband,/obj/structure/railing,/obj/structure/railing{dir = 4},/turf/simulated/floor/plating,/area/submap/casino_event)
+"dK" = (/obj/structure/table/rack/shelf,/obj/item/weapon/storage/box/roulette_balls_fancy,/obj/item/weapon/storage/box/roulette_balls_fancy,/obj/item/weapon/storage/box/roulette_balls_fancy,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"dL" = (/obj/structure/table/rack/shelf,/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/storage/pill_bottle/dice,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"dM" = (/obj/structure/table/woodentable,/obj/item/trash/asian_bowl,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"dN" = (/obj/structure/table/woodentable,/obj/item/weapon/material/kitchen/utensil/fork/plastic,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"dO" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"dP" = (/obj/structure/casino_table/blackjack_r{dir = 4},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"dQ" = (/obj/item/weapon/stool/padded{dir = 8},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"dR" = (/obj/effect/floor_decal/spline/plain{dir = 10},/obj/structure/flora/pottedplant/stoutbush,/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"dS" = (/obj/structure/casino_table/roulette_chart,/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"dT" = (/obj/structure/casino_table/roulette_table,/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"dU" = (/obj/structure/casino_table/roulette_chart,/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"dV" = (/obj/structure/casino_table/roulette_table,/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"dW" = (/obj/structure/casino_table/roulette_chart,/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"dX" = (/obj/structure/casino_table/roulette_table,/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"dY" = (/obj/structure/casino_table/craps,/obj/item/weapon/dice{pixel_x = 4; pixel_y = 6},/turf/simulated/floor/carpet/sblucarpet,/area/submap/casino_event)
+"dZ" = (/obj/structure/casino_table/craps{dir = 1},/obj/item/weapon/dice{pixel_x = 4; pixel_y = 6},/obj/item/weapon/dice{pixel_x = 4; pixel_y = 6},/turf/simulated/floor/carpet/sblucarpet,/area/submap/casino_event)
+"ea" = (/obj/structure/casino_table/craps,/obj/item/weapon/dice{pixel_x = 4; pixel_y = 6},/turf/simulated/floor/carpet/purcarpet,/area/submap/casino_event)
+"eb" = (/obj/structure/casino_table/craps{dir = 1},/obj/item/weapon/dice{pixel_x = 4; pixel_y = 6},/obj/item/weapon/dice{pixel_x = 4; pixel_y = 6},/turf/simulated/floor/carpet/purcarpet,/area/submap/casino_event)
+"ec" = (/obj/structure/table/steel,/obj/random/cash/huge{pixel_y = 8},/obj/random/cash/huge,/obj/item/weapon/bikehorn{pixel_x = -7; pixel_y = 7},/turf/simulated/floor/tiled/techfloor,/area/submap/casino_event)
+"ed" = (/obj/structure/table/rack/shelf,/obj/item/weapon/storage/pill_bottle/dice_nerd,/obj/item/weapon/storage/pill_bottle/dice_nerd,/obj/item/weapon/storage/pill_bottle/dice_nerd,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"ee" = (/obj/machinery/door/airlock{name = "Breakroom"; req_access = list(101)},/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"ef" = (/obj/item/weapon/stool/padded{dir = 4},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"eg" = (/obj/structure/casino_table/blackjack_m{dir = 4},/obj/item/weapon/deck/cards/casino,/obj/machinery/light/floortube{dir = 8},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"eh" = (/obj/machinery/button/remote/airlock{id = "roulette_1"; name = "Door Lock"; pixel_x = 24; pixel_y = -26; specialfunctions = 4},/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"ei" = (/obj/machinery/button/remote/airlock{id = "roulette_2"; name = "Door Lock"; pixel_x = 24; pixel_y = -26; specialfunctions = 4},/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"ej" = (/obj/machinery/button/remote/airlock{id = "roulette_3"; name = "Door Lock"; pixel_x = 24; pixel_y = -26; specialfunctions = 4},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"ek" = (/obj/machinery/button/remote/airlock{id = "craps_1"; name = "Door Lock"; pixel_x = 24; pixel_y = -26; specialfunctions = 4},/turf/simulated/floor/carpet/sblucarpet,/area/submap/casino_event)
+"el" = (/obj/machinery/button/remote/airlock{id = "craps_2"; name = "Door Lock"; pixel_x = 24; pixel_y = -26; specialfunctions = 4},/turf/simulated/floor/carpet/purcarpet,/area/submap/casino_event)
+"em" = (/obj/machinery/door/airlock/highsecurity{locked = 1; name = "Safe"; req_access = list(101); req_one_access = null},/turf/simulated/floor/tiled/techfloor,/area/submap/casino_event)
+"en" = (/obj/structure/table/rack/shelf,/obj/item/weapon/storage/box/roulette_balls_normal,/obj/item/weapon/storage/box/roulette_balls_normal,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"eo" = (/obj/structure/table/rack/shelf,/obj/item/weapon/storage/dicecup,/obj/item/weapon/storage/dicecup,/obj/item/weapon/storage/dicecup,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"ep" = (/obj/structure/table/rack/shelf,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c1000,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"eq" = (/obj/structure/table/woodentable,/obj/random/drinkbottle,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"er" = (/obj/structure/casino_table/blackjack_l{dir = 4},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"es" = (/obj/structure/closet/walllocker_double{dir = 8; name = "Game Cabinet"; pixel_x = -28},/obj/item/weapon/storage/box/roulette_balls_normal,/obj/item/weapon/storage/box/roulette_balls_fancy,/obj/item/weapon/storage/box/roulette_balls_cheat,/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"et" = (/obj/structure/casino_table/craps{dir = 1},/obj/item/weapon/dice,/obj/item/weapon/dice{pixel_x = 4; pixel_y = 6},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"eu" = (/obj/machinery/door/airlock{id_tag = "roulette_1"; name = "Private Roulette Room 1"},/turf/simulated/floor/carpet/green,/area/submap/casino_event)
+"ev" = (/obj/machinery/door/airlock{id_tag = "roulette_2"; name = "Private Roulette Room 2"},/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"ew" = (/obj/machinery/door/airlock{id_tag = "roulette_3"; name = "Private Roulette Room 3"},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"ex" = (/obj/machinery/door/airlock{id_tag = "craps_1"; name = "Private Craps Room 1"},/turf/simulated/floor/carpet/sblucarpet,/area/submap/casino_event)
+"ey" = (/obj/machinery/door/airlock{id_tag = "craps_2"; name = "Private Craps Room 2"},/turf/simulated/floor/carpet/purcarpet,/area/submap/casino_event)
+"ez" = (/obj/machinery/door/airlock/glass_security{req_access = list(101); req_one_access = null},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"eA" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/red/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 4},/obj/structure/flora/pottedplant/unusual,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"eB" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/red/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 1},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 1},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"eC" = (/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/red/border{dir = 5},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 4},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"eD" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/obj/machinery/vending/security{dir = 8; req_access = list(101)},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"eE" = (/obj/structure/table/woodentable,/obj/random/maintenance/foodstuff,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"eF" = (/obj/structure/flora/pottedplant/tropical,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"eG" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"eH" = (/obj/machinery/door/airlock/maintenance/common,/obj/effect/floor_decal/rust,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/submap/casino_event)
+"eI" = (/obj/structure/coatrack,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"eJ" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 8},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"eK" = (/obj/structure/table/reinforced,/obj/item/device/radio/headset/casino,/obj/item/device/radio/headset/casino,/obj/item/device/radio/headset/casino,/obj/item/device/radio/headset/casino,/obj/item/device/radio/headset/casino/bowman,/obj/item/device/radio/headset/casino/bowman,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"eL" = (/obj/structure/table/glass,/obj/machinery/vending/wallmed1/public{pixel_y = -32},/obj/item/weapon/backup_implanter,/obj/item/weapon/backup_implanter,/obj/item/weapon/backup_implanter,/obj/item/weapon/backup_implanter,/obj/item/weapon/backup_implanter,/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"eM" = (/obj/random/trash_pile,/obj/random/maintenance,/obj/effect/floor_decal/rust,/obj/structure/railing{dir = 4},/turf/simulated/floor/plating,/area/submap/casino_event)
+"eN" = (/turf/simulated/floor/lino,/area/submap/casino_event)
+"eO" = (/obj/structure/casino_table/craps{dir = 1},/obj/item/weapon/dice{pixel_x = 4; pixel_y = 6},/obj/item/weapon/dice{pixel_x = 4; pixel_y = 6},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"eP" = (/obj/structure/closet,/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"eQ" = (/obj/machinery/light{dir = 1},/obj/machinery/vending/loadout/uniform,/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"eR" = (/obj/machinery/transhuman/autoresleever,/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"eS" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/red/border{dir = 9},/obj/effect/floor_decal/borderfloor/corner2{dir = 1},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 1},/obj/machinery/vending/wallmed1/public{pixel_y = 28},/obj/structure/table/rack,/obj/item/weapon/spacecasinocash/c500,/obj/item/weapon/spacecasinocash/c500,/obj/item/weapon/spacecasinocash/c500,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"eT" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/red/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"eU" = (/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/red/border{dir = 5},/obj/structure/closet/firecloset,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"eV" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"eW" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/obj/item/device/radio,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"eX" = (/obj/structure/bed/chair/office/light{dir = 4},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"eY" = (/obj/item/modular_computer/console{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"eZ" = (/obj/random/trash_pile,/obj/effect/floor_decal/rust,/obj/structure/railing{dir = 4},/turf/simulated/floor/plating,/area/submap/casino_event)
+"fa" = (/obj/machinery/door/airlock/maintenance/common,/turf/simulated/floor/wood,/area/submap/casino_event)
+"fb" = (/obj/structure/table/woodentable,/obj/item/trash/bowl,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"fc" = (/obj/machinery/door/airlock{id_tag = "blackjack_1"; name = "Private Blackjack Room 1"},/turf/simulated/floor/carpet/bcarpet,/area/submap/casino_event)
+"fd" = (/obj/machinery/door/airlock{id_tag = "blackjack_2"; name = "Private Blackjack Room 2"},/turf/simulated/floor/carpet/gaycarpet,/area/submap/casino_event)
+"fe" = (/obj/machinery/door/airlock{id_tag = "blackjack_3"; name = "Private Blackjack Room 3"},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"ff" = (/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "casino_check"},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"fg" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"fh" = (/obj/structure/table/reinforced,/obj/item/ammo_magazine/m45{pixel_x = -5; pixel_y = -3},/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45{pixel_x = 5; pixel_y = 3},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"fi" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/handcuffs{pixel_y = -5},/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs{pixel_y = 5},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"fj" = (/obj/structure/casino_table/blackjack_m{dir = 4},/obj/machinery/light/floortube{dir = 8},/obj/item/weapon/deck/cards/casino,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"fk" = (/obj/machinery/chipmachine{pixel_x = -32},/obj/machinery/atm{pixel_y = 30},/turf/simulated/floor/carpet/bcarpet,/area/submap/casino_event)
+"fl" = (/turf/simulated/floor/carpet/bcarpet,/area/submap/casino_event)
+"fm" = (/obj/machinery/button/remote/airlock{id = "blackjack_1"; name = "Door Lock"; pixel_x = 24; pixel_y = 26; specialfunctions = 4},/turf/simulated/floor/carpet/bcarpet,/area/submap/casino_event)
+"fn" = (/obj/structure/closet/walllocker_double{dir = 8; name = "Game Cabinet"; pixel_x = -28},/obj/item/weapon/storage/box/roulette_balls_normal,/obj/item/weapon/storage/box/roulette_balls_fancy,/obj/item/weapon/storage/box/roulette_balls_cheat,/turf/simulated/floor/carpet/purple,/area/submap/casino_event)
+"fo" = (/obj/machinery/chipmachine{pixel_x = -32},/obj/machinery/atm{pixel_y = 30},/turf/simulated/floor/carpet/gaycarpet,/area/submap/casino_event)
+"fp" = (/turf/simulated/floor/carpet/gaycarpet,/area/submap/casino_event)
+"fq" = (/obj/machinery/button/remote/airlock{id = "blackjack_2"; name = "Door Lock"; pixel_x = 24; pixel_y = 26; specialfunctions = 4},/turf/simulated/floor/carpet/gaycarpet,/area/submap/casino_event)
+"fr" = (/obj/structure/closet/walllocker_double{dir = 8; name = "Game Cabinet"; pixel_x = -28},/obj/item/weapon/storage/box/roulette_balls_normal,/obj/item/weapon/storage/box/roulette_balls_fancy,/obj/item/weapon/storage/box/roulette_balls_cheat,/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"fs" = (/obj/machinery/chipmachine{pixel_x = -32},/obj/machinery/atm{pixel_y = 30},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"ft" = (/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"fu" = (/obj/machinery/button/remote/airlock{id = "blackjack_3"; name = "Door Lock"; pixel_x = 24; pixel_y = 26; specialfunctions = 4},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"fv" = (/obj/structure/closet/walllocker_double{dir = 8; name = "Game Cabinet"; pixel_x = -28},/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/storage/pill_bottle/dice_nerd,/obj/item/weapon/storage/dicecup,/turf/simulated/floor/carpet/sblucarpet,/area/submap/casino_event)
+"fw" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/reddouble,/turf/simulated/floor/wood,/area/submap/casino_event)
+"fx" = (/obj/item/weapon/stool/baystool/padded,/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"fy" = (/obj/item/modular_computer/console{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/red/border{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 9},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"fz" = (/obj/structure/bed/chair/office/light,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"fA" = (/obj/structure/table/reinforced,/obj/item/weapon/handcuffs,/obj/item/weapon/handcuffs,/obj/item/ammo_casing/spent,/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/red/border{dir = 6},/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/corner/red/bordercorner2,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"fB" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/red/border{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 9},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"fC" = (/obj/item/weapon/gun/projectile/shotgun/pump{ammo_type = /obj/item/ammo_casing/a12g/pellet; pixel_x = 1; pixel_y = 4},/obj/item/weapon/gun/projectile/shotgun/pump{ammo_type = /obj/item/ammo_casing/a12g/pellet; pixel_x = 2; pixel_y = -6},/obj/structure/table/rack/gun_rack,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/red/border,/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/corner/red/bordercorner2,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"fD" = (/obj/structure/table/rack,/obj/item/ammo_magazine/ammo_box/b12g/pellet{pixel_x = 3; pixel_y = -3},/obj/item/ammo_magazine/ammo_box/b12g/pellet{pixel_x = -5; pixel_y = -3},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/red/border,/obj/item/ammo_magazine/ammo_box/b12g/pellet{pixel_x = 3; pixel_y = 3},/obj/item/ammo_magazine/ammo_box/b12g/pellet{pixel_x = -5; pixel_y = 3},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"fE" = (/obj/structure/table/rack,/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/red/border{dir = 6},/obj/item/clothing/suit/armor/bulletproof/alt{pixel_x = -6},/obj/item/clothing/suit/armor/bulletproof/alt{pixel_x = 6},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"fF" = (/obj/structure/table/rack/shelf,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"fG" = (/obj/structure/table/rack/shelf,/obj/item/device/radio/headset/casino,/obj/item/device/radio/headset/casino,/obj/item/device/radio/headset/casino,/obj/item/device/radio/headset/casino,/obj/item/device/radio/headset/casino,/obj/item/device/radio/headset/casino,/obj/item/device/radio/headset/casino/bowman,/obj/item/device/radio/headset/casino/bowman,/obj/item/device/radio/headset/casino/bowman,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"fH" = (/obj/machinery/telecomms/allinone/casino,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"fI" = (/obj/structure/table/woodentable,/obj/item/trash/plate,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"fJ" = (/obj/structure/casino_table/blackjack_l{dir = 8},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"fK" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/carpet/bcarpet,/area/submap/casino_event)
+"fL" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/floor/carpet/bcarpet,/area/submap/casino_event)
+"fM" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/carpet/gaycarpet,/area/submap/casino_event)
+"fN" = (/obj/structure/bed/chair/comfy/red,/turf/simulated/floor/carpet/gaycarpet,/area/submap/casino_event)
+"fO" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"fP" = (/obj/structure/bed/chair/comfy/green,/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"fQ" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"fR" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"fS" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor/eastleft{dir = 2},/obj/item/weapon/pen,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "casino_check"; opacity = 0},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"fT" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor/eastright{dir = 2},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "casino_check"; opacity = 0},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"fU" = (/obj/structure/table/woodentable,/obj/item/trash/plate,/obj/item/weapon/material/kitchen/utensil/fork/plastic,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"fV" = (/obj/structure/casino_table/blackjack_m{dir = 8},/obj/machinery/light/floortube{dir = 4},/obj/item/weapon/deck/cards/casino,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"fW" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/bcarpet,/area/submap/casino_event)
+"fX" = (/obj/structure/casino_table/blackjack_l{dir = 1},/turf/simulated/floor/carpet/bcarpet,/area/submap/casino_event)
+"fY" = (/obj/item/weapon/stool/padded{dir = 4},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"fZ" = (/obj/structure/casino_table/blackjack_r{dir = 1},/turf/simulated/floor/carpet/bcarpet,/area/submap/casino_event)
+"ga" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet/bcarpet,/area/submap/casino_event)
+"gb" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/gaycarpet,/area/submap/casino_event)
+"gc" = (/obj/structure/casino_table/blackjack_l{dir = 1},/turf/simulated/floor/carpet/gaycarpet,/area/submap/casino_event)
+"gd" = (/obj/structure/casino_table/blackjack_l,/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"ge" = (/obj/structure/casino_table/blackjack_r{dir = 1},/turf/simulated/floor/carpet/gaycarpet,/area/submap/casino_event)
+"gf" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet/gaycarpet,/area/submap/casino_event)
+"gg" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"gh" = (/obj/structure/casino_table/blackjack_l{dir = 1},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"gi" = (/obj/structure/casino_table/blackjack_m,/obj/machinery/light/floortube{dir = 1},/obj/item/weapon/deck/cards/casino,/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"gj" = (/obj/structure/casino_table/blackjack_r{dir = 1},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"gk" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"gl" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"gm" = (/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/industrial/danger/corner{dir = 4},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"gn" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/industrial/danger{dir = 1},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"go" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/industrial/danger/corner{dir = 8},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"gp" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"gq" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 1},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 1},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"gr" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 4},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"gs" = (/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/lightgrey/bordercorner{dir = 1},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"gt" = (/turf/simulated/floor/wood,/area/submap/casino_event)
+"gu" = (/obj/structure/flora/pottedplant/stoutbush,/obj/effect/floor_decal/spline/plain{dir = 10},/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"gv" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/fancy/cigar/havana{pixel_x = -2; pixel_y = 2},/obj/item/weapon/storage/fancy/cigar{pixel_x = 2; pixel_y = 3},/obj/effect/floor_decal/spline/plain,/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"gw" = (/obj/structure/flora/pottedplant/stoutbush,/obj/effect/floor_decal/spline/plain{dir = 6},/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"gx" = (/obj/structure/casino_table/blackjack_r{dir = 8},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"gy" = (/obj/item/weapon/stool/baystool/padded{dir = 1},/turf/simulated/floor/carpet/bcarpet,/area/submap/casino_event)
+"gz" = (/obj/item/weapon/stool/baystool/padded{dir = 1},/turf/simulated/floor/carpet/gaycarpet,/area/submap/casino_event)
+"gA" = (/obj/item/weapon/stool/baystool/padded{dir = 1},/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"gB" = (/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/floor/wood,/area/submap/casino_event)
+"gC" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"gD" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"gE" = (/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/lightgrey/bordercorner,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"gF" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lightgrey/border,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"gG" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lightgrey/border,/obj/machinery/light,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"gH" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/lightgrey/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"gI" = (/obj/structure/casino_table/blackjack_l,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"gJ" = (/obj/structure/casino_table/blackjack_m,/obj/machinery/light/floortube{dir = 1},/obj/item/weapon/deck/cards/casino,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"gK" = (/obj/structure/casino_table/blackjack_r,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"gL" = (/obj/structure/bed/chair/wood,/turf/simulated/floor/wood,/area/submap/casino_event)
+"gM" = (/obj/item/weapon/stool/padded{dir = 1},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"gN" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/submap/casino_event)
+"gO" = (/obj/structure/table/woodentable,/obj/item/pizzabox/margherita,/turf/simulated/floor/wood,/area/submap/casino_event)
+"gP" = (/obj/structure/table/woodentable,/obj/item/weapon/flame/candle,/turf/simulated/floor/wood,/area/submap/casino_event)
+"gQ" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/submap/casino_event)
+"gR" = (/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/glass,/turf/simulated/floor/wood,/area/submap/casino_event)
+"gS" = (/obj/structure/table/woodentable,/obj/random/maintenance/foodstuff,/turf/simulated/floor/wood,/area/submap/casino_event)
+"gT" = (/obj/structure/table/woodentable,/obj/random/drinkbottle,/turf/simulated/floor/wood,/area/submap/casino_event)
+"gU" = (/obj/structure/table/woodentable,/obj/effect/floor_decal/spline/plain{dir = 8},/obj/item/clothing/mask/smokable/pipe,/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"gV" = (/obj/structure/bed/chair/wood{dir = 1},/turf/simulated/floor/wood,/area/submap/casino_event)
+"gW" = (/obj/machinery/light,/turf/simulated/floor/wood,/area/submap/casino_event)
+"gX" = (/obj/machinery/light,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"gY" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/grey/border{dir = 9},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"gZ" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/grey/border{dir = 1},/obj/machinery/vending/wallmed1/public{pixel_y = 28},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"ha" = (/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/grey/border{dir = 5},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"hb" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/grey/border{dir = 8},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"hc" = (/obj/machinery/washing_machine,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"hd" = (/obj/structure/table/standard,/obj/item/weapon/towel/random,/obj/item/weapon/towel/random,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"he" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/grey/border{dir = 4},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"hf" = (/obj/machinery/washing_machine,/obj/item/clothing/under/modjump3,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"hg" = (/obj/structure/table/standard,/obj/item/clothing/under/suit_jacket/really_black{pixel_x = 5; pixel_y = 10},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"hh" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/grey/border{dir = 10},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"hi" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/grey/bordercorner{dir = 8},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"hj" = (/obj/effect/floor_decal/borderfloor/corner,/obj/effect/floor_decal/corner/grey/bordercorner,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"hk" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/grey/border{dir = 6},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"hl" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/grey/border{dir = 10},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"hm" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/grey/border,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"hn" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/grey/border{dir = 6},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"ho" = (/obj/effect/floor_decal/corner/lightgrey{dir = 10},/obj/effect/floor_decal/corner/lightgrey{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/machinery/vending/bepis,/turf/simulated/floor/tiled/monotile,/area/submap/casino_event)
+"hp" = (/obj/effect/floor_decal/corner/lightgrey{dir = 10},/obj/effect/floor_decal/corner/lightgrey{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/machinery/vending/sol,/turf/simulated/floor/tiled/monotile,/area/submap/casino_event)
+"hq" = (/obj/effect/floor_decal/spline/plain{dir = 1},/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"hr" = (/obj/machinery/door/airlock{id_tag = "L7 Room 1"; name = "Private Room 1"},/turf/simulated/floor/wood,/area/submap/casino_event)
+"hs" = (/obj/machinery/door/airlock{id_tag = "L7 Room 2"; name = "Private Room 2"},/turf/simulated/floor/wood,/area/submap/casino_event)
+"ht" = (/obj/machinery/door/airlock{id_tag = "L7 Room 3"; name = "Private Room 3"},/turf/simulated/floor/wood,/area/submap/casino_event)
+"hu" = (/obj/machinery/door/airlock{id_tag = "L7 Room 4"; name = "Private Room 4"},/turf/simulated/floor/wood,/area/submap/casino_event)
+"hv" = (/obj/machinery/door/airlock{id_tag = "L7 VIP Room"; name = "VIP Room"},/turf/simulated/floor/wood,/area/submap/casino_event)
+"hw" = (/obj/structure/toilet{dir = 4},/obj/machinery/button/remote/airlock{id = "casino_stall_1"; name = "Door Lock"; pixel_x = 24; pixel_y = 26; specialfunctions = 4},/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"hx" = (/obj/structure/closet/secure_closet/personal/cabinet,/obj/item/weapon/towel/random,/turf/simulated/floor/wood,/area/submap/casino_event)
+"hy" = (/obj/structure/toilet{dir = 4},/obj/machinery/button/remote/airlock{id = "casino_stall_2"; name = "Door Lock"; pixel_x = 24; pixel_y = 26; specialfunctions = 4},/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"hz" = (/obj/machinery/button/remote/airlock{id = "L7 Room 1"; name = "Door Lock"; pixel_x = 24; pixel_y = 26; specialfunctions = 4},/turf/simulated/floor/wood,/area/submap/casino_event)
+"hA" = (/obj/machinery/button/remote/airlock{id = "L7 Room 2"; name = "Door Lock"; pixel_x = 24; pixel_y = 26; specialfunctions = 4},/turf/simulated/floor/wood,/area/submap/casino_event)
+"hB" = (/obj/machinery/button/remote/airlock{id = "L7 Room 3"; name = "Door Lock"; pixel_x = 24; pixel_y = 26; specialfunctions = 4},/turf/simulated/floor/wood,/area/submap/casino_event)
+"hC" = (/obj/machinery/button/remote/airlock{id = "L7 Room 4"; name = "Door Lock"; pixel_x = 24; pixel_y = 26; specialfunctions = 4},/turf/simulated/floor/wood,/area/submap/casino_event)
+"hD" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/submap/casino_event)
+"hE" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/floor/wood,/area/submap/casino_event)
+"hF" = (/obj/structure/undies_wardrobe,/turf/simulated/floor/wood,/area/submap/casino_event)
+"hG" = (/obj/structure/closet/secure_closet/personal/cabinet,/obj/item/weapon/storage/pill_bottle/happy,/obj/item/clothing/under/bathrobe,/obj/item/clothing/under/bathrobe,/turf/simulated/floor/wood,/area/submap/casino_event)
+"hH" = (/obj/structure/bed/chair/sofa/right/purp,/turf/simulated/floor/wood,/area/submap/casino_event)
+"hI" = (/obj/structure/bed/chair/sofa/left/purp,/turf/simulated/floor/wood,/area/submap/casino_event)
+"hJ" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet/purcarpet,/area/submap/casino_event)
+"hK" = (/obj/structure/table/woodentable,/obj/random/drinkbottle,/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/submap/casino_event)
+"hL" = (/obj/structure/undies_wardrobe,/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/submap/casino_event)
+"hM" = (/obj/item/weapon/flame/candle/candelabra/everburn,/obj/structure/table/fancyblack,/turf/simulated/floor/wood,/area/submap/casino_event)
+"hN" = (/obj/random/drinkbottle,/obj/structure/table/fancyblack,/turf/simulated/floor/wood,/area/submap/casino_event)
+"hO" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/captaindouble,/obj/structure/curtain/open/bed,/turf/simulated/floor/carpet/purcarpet,/area/submap/casino_event)
+"hP" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/wood,/area/submap/casino_event)
+"hQ" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/yellowdouble,/turf/simulated/floor/wood,/area/submap/casino_event)
+"hR" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/purpledouble,/turf/simulated/floor/wood,/area/submap/casino_event)
+"hS" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/orangedouble,/turf/simulated/floor/wood,/area/submap/casino_event)
+"hT" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/greendouble,/turf/simulated/floor/wood,/area/submap/casino_event)
+"hU" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/bluedouble,/turf/simulated/floor/wood,/area/submap/casino_event)
+"hV" = (/obj/structure/bed/chair/sofa/left/purp{dir = 1},/turf/simulated/floor/wood,/area/submap/casino_event)
+"hW" = (/obj/structure/bed/chair/sofa/right/purp{dir = 1},/turf/simulated/floor/wood,/area/submap/casino_event)
+"hX" = (/obj/structure/table/rack/shelf,/obj/item/weapon/deck/cards,/obj/item/weapon/deck/cards,/obj/item/weapon/deck/cards,/obj/item/weapon/deck/cards,/turf/simulated/floor/tiled/dark,/area/submap/casino_event)
+"hY" = (/obj/effect/floor_decal/steeldecal/steel_decals10,/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 4},/turf/simulated/floor/tiled/freezer,/area/submap/casino_event)
+"hZ" = (/obj/effect/floor_decal/spline/plain{dir = 9},/turf/simulated/floor/water/pool,/area/submap/casino_event)
+"ia" = (/obj/effect/floor_decal/spline/plain{dir = 1},/turf/simulated/floor/water/pool,/area/submap/casino_event)
+"ib" = (/obj/effect/floor_decal/spline/plain{dir = 5},/turf/simulated/floor/water/pool,/area/submap/casino_event)
+"ic" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"id" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"ie" = (/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/water/pool,/area/submap/casino_event)
+"if" = (/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/water/pool,/area/submap/casino_event)
+"ig" = (/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/floor/water/pool,/area/submap/casino_event)
+"ih" = (/obj/random/soap,/obj/structure/table/standard,/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"ii" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower,/obj/effect/floor_decal/steeldecal/steel_decals5{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 10},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"ij" = (/obj/structure/table/glass,/obj/random/soap,/obj/item/weapon/towel/random,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"ik" = (/turf/simulated/floor/water/pool,/area/submap/casino_event)
+"il" = (/obj/effect/floor_decal/spline/plain{dir = 4},/obj/machinery/light{dir = 4},/turf/simulated/floor/water/pool,/area/submap/casino_event)
+"im" = (/obj/machinery/holoplant,/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"in" = (/obj/effect/floor_decal/spline/plain{dir = 10},/turf/simulated/floor/water/pool,/area/submap/casino_event)
+"io" = (/obj/effect/floor_decal/spline/plain,/turf/simulated/floor/water/pool,/area/submap/casino_event)
+"ip" = (/obj/effect/floor_decal/spline/plain{dir = 6},/turf/simulated/floor/water/pool,/area/submap/casino_event)
+"iq" = (/obj/structure/casino_table/blackjack_r,/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"ir" = (/obj/machinery/door/airlock{id_tag = "br bathroom"; name = "Bathroom"},/turf/simulated/floor/wood,/area/submap/casino_event)
+"is" = (/obj/item/weapon/stool/padded{dir = 8},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"it" = (/obj/item/weapon/stool/padded{dir = 1},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"iu" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"iv" = (/obj/structure/casino_table/blackjack_l{dir = 8},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"iw" = (/obj/structure/casino_table/blackjack_m{dir = 8},/obj/machinery/light/floortube{dir = 4},/obj/item/weapon/deck/cards/casino,/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"ix" = (/obj/item/weapon/stool/baystool/padded{dir = 8},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"iy" = (/obj/structure/casino_table/blackjack_r{dir = 8},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"iz" = (/obj/structure/casino_table/blackjack_l{dir = 1},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"iA" = (/obj/structure/casino_table/blackjack_m{dir = 1},/obj/item/weapon/deck/cards/casino,/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"iB" = (/obj/structure/casino_table/blackjack_r{dir = 1},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"iC" = (/obj/item/weapon/stool/baystool/padded{dir = 1},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"iD" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/browndouble,/turf/simulated/floor/wood,/area/submap/casino_event)
+"iE" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/double,/turf/simulated/floor/wood,/area/submap/casino_event)
+"iF" = (/obj/machinery/button/remote/airlock{id = "L7 Room 5"; name = "Door Lock"; pixel_x = 24; pixel_y = 26; specialfunctions = 4},/turf/simulated/floor/wood,/area/submap/casino_event)
+"iG" = (/obj/machinery/door/airlock{id_tag = "casino_stall_1"; name = "Stall 1"},/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"iH" = (/obj/machinery/door/airlock{name = "Backroom"},/turf/simulated/floor/wood,/area/submap/casino_event)
+"iI" = (/obj/structure/closet/walllocker_double{dir = 8; name = "Game Cabinet"; pixel_x = -28},/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/storage/pill_bottle/dice_nerd,/obj/item/weapon/storage/dicecup,/turf/simulated/floor/carpet/purcarpet,/area/submap/casino_event)
+"iJ" = (/obj/machinery/computer/timeclock/premade/north,/turf/simulated/floor/tiled,/area/submap/casino_event)
+"iK" = (/obj/machinery/item_bank{pixel_y = 28},/turf/simulated/floor/tiled,/area/submap/casino_event)
+"iL" = (/turf/space,/area/submap/casino_event)
+"iM" = (/obj/structure/casino_table/craps,/obj/machinery/light/floortube{dir = 8},/obj/item/weapon/dice{pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/dicecup,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"iN" = (/obj/structure/sink{pixel_y = 20},/obj/structure/mirror{pixel_y = 38},/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"iO" = (/obj/effect/floor_decal/spline/plain{dir = 1},/turf/simulated/floor/wood,/area/submap/casino_event)
+"iP" = (/obj/structure/casino_table/blackjack_m{dir = 1},/obj/item/weapon/deck/cards/casino,/turf/simulated/floor/carpet/bcarpet,/area/submap/casino_event)
+"iQ" = (/obj/structure/casino_table/blackjack_m{dir = 1},/obj/item/weapon/deck/cards/casino,/turf/simulated/floor/carpet/gaycarpet,/area/submap/casino_event)
+"iR" = (/obj/structure/casino_table/blackjack_m{dir = 1},/obj/item/weapon/deck/cards/casino,/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"iS" = (/obj/structure/sink{pixel_y = 20},/obj/structure/mirror{pixel_y = 38},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"iT" = (/obj/machinery/door/airlock{id_tag = "casino_stall_2"; name = "Stall 2"},/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"iU" = (/obj/structure/toilet{dir = 8},/turf/simulated/floor/tiled/kafel_full,/area/submap/casino_event)
+"iV" = (/obj/machinery/recharge_station,/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"iW" = (/obj/machinery/door/airlock{id_tag = "casino_stall_3"; name = "Stall 3"},/turf/simulated/floor/tiled/white,/area/submap/casino_event)
+"iX" = (/obj/machinery/button/remote/airlock{id = "L7 VIP Room"; name = "Door Lock"; pixel_x = 24; pixel_y = 26; specialfunctions = 4},/turf/simulated/floor/wood,/area/submap/casino_event)
+"iY" = (/obj/effect/overmap/visitable/sector/common_gateway/lucky7,/turf/space,/area/submap/casino_event)
+"iZ" = (/obj/effect/landmark/hidden_level,/turf/space,/area/submap/casino_event)
+"ja" = (/obj/structure/closet/walllocker_double{dir = 8; name = "Game Cabinet"; pixel_x = -28},/obj/item/weapon/deck/cards/casino,/obj/item/weapon/deck/cards,/turf/simulated/floor/carpet/bcarpet,/area/submap/casino_event)
+"jb" = (/obj/structure/closet/walllocker_double{dir = 8; name = "Game Cabinet"; pixel_x = -28},/obj/item/weapon/deck/cards/casino,/obj/item/weapon/deck/cards,/turf/simulated/floor/carpet/gaycarpet,/area/submap/casino_event)
+"jc" = (/obj/structure/closet/walllocker_double{dir = 8; name = "Game Cabinet"; pixel_x = -28},/obj/item/weapon/deck/cards/casino,/obj/item/weapon/deck/cards,/turf/simulated/floor/carpet/turcarpet,/area/submap/casino_event)
+"jd" = (/obj/effect/floor_decal/spline/plain{dir = 5},/turf/simulated/floor/wood,/area/submap/casino_event)
+"je" = (/obj/machinery/door/airlock{id_tag = "L7 Room 5"; name = "Private Room 5"},/turf/simulated/floor/wood,/area/submap/casino_event)
+"jn" = (/obj/machinery/door/airlock{name = "Tournament Room"},/turf/simulated/floor/carpet/blue2,/area/submap/casino_event)
+"jq" = (/obj/structure/flora/pottedplant/tall,/turf/simulated/floor/carpet/brown,/area/submap/casino_event)
+"jx" = (/obj/machinery/vending/foodasian,/turf/simulated/floor/lino,/area/submap/casino_event)
+"jy" = (/obj/machinery/vending/fooditalian,/turf/simulated/floor/lino,/area/submap/casino_event)
+"jz" = (/obj/machinery/vending/foodfast,/turf/simulated/floor/lino,/area/submap/casino_event)
+"jA" = (/obj/machinery/vending/fooddessert{dir = 1},/turf/simulated/floor/lino,/area/submap/casino_event)
+"jB" = (/obj/machinery/vending/foodstuffing{dir = 1},/turf/simulated/floor/lino,/area/submap/casino_event)
+"jC" = (/obj/machinery/vending/foodfish,/turf/simulated/floor/lino,/area/submap/casino_event)
+"jD" = (/obj/machinery/vending/foodveggie,/turf/simulated/floor/lino,/area/submap/casino_event)
+"jE" = (/obj/machinery/vending/foodmeat,/turf/simulated/floor/lino,/area/submap/casino_event)
+"jG" = (/obj/machinery/vending/foodfish{dir = 1},/turf/simulated/floor/lino,/area/submap/casino_event)
+"jH" = (/obj/machinery/vending/foodmeat{dir = 1},/turf/simulated/floor/lino,/area/submap/casino_event)
+"jI" = (/obj/machinery/vending/deluxe_boozeomat/open,/turf/simulated/floor/lino,/area/submap/casino_event)
+"jJ" = (/obj/machinery/vending/deluxe_cigs/open,/turf/simulated/floor/lino,/area/submap/casino_event)
+"jK" = (/obj/machinery/vending/deluxe_dinner/open,/turf/simulated/floor/lino,/area/submap/casino_event)
+
+(1,1,1) = {"
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaaaaaaaaaaiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaaaaabacabaaaaiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaaabadabadabaaiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaeafagagagahaeaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaiaiaiaiaiaiaiaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeajajaiakaiajajaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaealalaiaeaialalaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeamamaianaiamamaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaiaiaiaiaiaiaiaeaeaaaaaaaeaaaaaaaeaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaeaoaiaiaiapaeaeaqarasaratasarasauaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaeaeavavavaeaeaeawaxaxaxaqaxaxaxaqaaiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeayazazazazazazaeaqaqaqaqaqaqaqaqaqaaiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaAazazazazazazaBaqaqaqaqaqaCaDaEaqaaiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeayazazazazazazaeaqaFaGaFaqaCaHaEaqaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaeaeazazazaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaeaeaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaeaeaeaeaeaeaeiLiLiLiLiLiLiLiLaeaIazazazazazazazazazaJazazazazazaJazazazazazazaKaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaLaMaNaOaOaPaeiLiLiLiLiLiLiLiLaaaQaQazazazazazazazazazazazazazazazazazazazazazaRaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaSaTaTaTaOaOaeiLiLiLiLiLiLiLiLaaaUaUazazazazazazazazazazazazazazazazazazazazazaKaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaVaTaPaWaXaYaeiLiLiLiLiLiLiLiLaaaZaZazazazbabaaeaeaebbaeaeaeaeaebcaeaeaeaeaebdaeaeaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaOaTaSbebfbgaeiLiLiLiLiLiLiLiLaeazazazazazbhbiaebjbkblbkbkaebmbnbobnbnaebpbqbrbqbqaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaOaTbsaebtbuaeiLiLiLiLiLiLiLiLaeazazazazazbvbvaebkbwbwbwbkaebnbxbxbxbnaebqbybybybqaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaeaeaeaeaeaeaeaebzaeaeaeaeaeaeaaaaaaaeaeaeaeaeaQaQazazazbabaaebAbBbBbBbCaebDbEbEbEbFaebGbHbHbHbIaeaeaeaeiLaeaeaeaeiLaeaeaeaeiLaeaeaeaeiLaeaeaeaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaOaOaSbJbKbLaOaObMbNaebObPaebQbRbSbTaiaebUbVaebWaUazazazbhbiaebXbBbYbBbZaecabEcbbEccaecdbHcebHcfaedpdsaeiLaedpdsaeiLaedpdsaeiLaedpdsaeiLaedpdsaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaecgaTaTaTaTbMbMaTaTbMchaTaTciaicjckclaicmcncoaeaZaZazazazbvbvaebAbBbBbBbCaebDbEbEbEbFaebGbHbHbHbIaedvdyaeiLaedvdyaeiLaedvdyaeiLaedvdyaeiLaedvdyaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaecpaTaOaPaObJaScqcqcqaeaOcraeaicsckctaiaecucvaeazazazazazazazaebkcwcxcwbkaebncyczcybnaebqcAcBcAbqaeaedCaeaeaeaedCaeaeaeaedCaeaeaeaedCaeaeaeaedCaeaeaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLcDcDcDcDcDaecCcDcDcDcDcDcEaOcFaeaOaTaeaiaiaiaiaiaeaeaeaeaeaeazazazaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaehxgthEhTaehxgthEhRaehxgthEhUaehxgthEhSaehxgthEfwaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLcDcHcIcJcDcGcGcDcHcIcJcDcKcLcMaeaSbMaeaiaiaiaiaiaiaicNaeazazazazazaJazcOcScPcQcRazcTazaJazazazazazazaJazazaehFgtgWgtaehFgtgWgtaehFgtgWgtaehFgtgWgtaehFgtgWgtaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLcDaiaiaicUcGcGcUaiaiaicDcDcDcDcDaObMaecVaiaicWcXaiaicYaeazazazazazazazazazazazazazazazazazazazazazazazazcZaeaeiHaeaeaeaeiHaeaeaeaeiHaeaeaeaeiHaeaeaeaeiHaeaeaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLcDcDcDcDcDcGdacDcDcDcDcDdbdcddcDdebMaecVaiaihXdfaiaidgaedhazdiaUaUdjazazazazazazazazazazdkdlazazdmdnazazdoaeesbndqdraefnbkdtduaefrbqdwdxaefvdzdAdBaeiIdDdEdFaeaeaeaeaeaeaeaeaeaeaeaeaeaeiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLcDdGcIcJcDcGcGcDdGcIcJcDdHdIddcDdJaTaedKaiaidLdfaiaiaiaeazazdidMdNdjdOaeaIazdPdQdOaeaIazazazazazazazazazdRaebndSdTbnaebkdUdVbkaebqdWdXbqaedzdYdZdzaedDeaebdDaebqbqfxbqbqbqbqfxbqbqbqbqaeiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLcDaiaiaicUcGcGcUaiaiaicDecdIddcDaOaTaedKaiaieddfaiaiaieeazazazazazazazazazefegdQazazazazazazazazazazazazazaebnbnehbnaebkbkeibkaebqbqejbqaedzdzekdzaedDdDeldDaefYgdgiiqisfYgdgiiqisbqbqaeiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLcDcDcDcDcDcGdacDcDcDcDcDcDemcDcDbNaTaeenaiaieoepaiaiaiaeazazdiaUeqdjazazazazerdQazazazazdkdlazaziMetazazdOaeaeaeeuaeaeaeaeevaeaeaeaeewaeaeaeaeexaeaeaeaeeyaeaebqitititbqbqitititbqiubqaeiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaecGcGcGcGezcGeAeBcGeCcCbLaTaeaiaiaiaiaiaiaiaiaeaIazdiaUeEdjazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazaebqbqbqbqbqbqbqbqbqfYivbqaeiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeeFcGcGcGezcGcGcGcGeGaeaeeHaeaiaiaiaeaeaeaeaeaeeIazazazazazdOaeaIazazazdOaeaIazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazazjnbqbqbqbqbqbqbqbqbqfYiwixaeiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaeaeaeaeaeaeezaeaeaeeJcGeKcGeDaeeMbMaeaiaiaiaejxjyjxjzjyjzazdieEaUdjazazazazazazazazazazdkdlazaziMeOazazazazazazazazazazazazazazazazazazazazazazazazazazazjqaebqbqbqbqbqbqbqbqbqfYiybqaeiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeePeQePeRaeeScGeTeUaeeVcGeWeXeYaeeZaTfaaiaiaiaeeNeNeNeNeNeNazdiaUfbdjazazazazdPdQazazazazazazazazazazazazazaeaeaefcaeaeaeaeaefdaeaeaeaeaefeaeaeaeaeaeaeaeaeaeaebqiuiuiubqbqiuiuiubqitbqaeiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaecncncncnaeeVcGcGffaefgcGfhcGfiaeaSaOaeaiaiaiaejAjGjBjAjBjHazazazazazazazazeffjdQazazazazazazazazazazazazdOaefkflfmflflaefofpfqfpfpaefsftfuftftaeiLiLiLiLiLiLaefYiziAiBisfYiziAiBisbqbqaeiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaeaeaeaeaeaeeLeLcncnaefyfzcGfAaefBcGfCfDfEaeaPaOaefFfGfHaejCjDjEjIjJjKazdiaUfIdjdOaeaIazerdQdOaeaIazazeffJazazazdPdQazaeflfKfLfKflaefpfMfNfMfpaeftfOfPfOftaeiLiLiLiLiLiLaebqbqiCbqbqbqbqiCbqbqbqbqaeiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaecGcGfQiKiJaeaeaefRaeaeaefSfTaeaeaeezaeaeaeaeaeaeaeaeaeaeaeeNeNeNeNeNeNazdifUaUdjazcOazazazazazcTazazazeffVdQazeffjdQazaefWfXiPfZgaaegbgciQgegfaeggghiRgjgkaeiLiLiLiLiLiLaeaeaeaeaeaeaeaeaeaeaeaeaeaeiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaecGcGcGcGcGcGcGcGcGcGglgmgngngogpgqcGgrgpgsglgtgtgtgugvgwgTiOiOiOiOiOjdazazazazazazazazazazazazazazazazefgxazazazerdQazaejaflgyflflaejbfpgzfpfpaejcftgAftftaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaecGcGcGcGcGcGcGcGcGcGglcGcGcGcGcGcGcGcGcGcGglgtgtgtgtgtgtgtgtgtgtgtgtgBazbababababaazazgCazazbababababaazazazgCazazazazaeaeiHaeaeaeaeaeiHaeaeaeaeaeiHaeaeaeaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaecGcGcGcGcGcGcGgDcGcGglgEgFgGgFgFgFgFgGgFgHglgtgtgtgtgtgtgtgtgtgtgtgtgBazbhbhbhbhbhazgIgJgKazbhbhbhbhbhazazgIgJgKazazdOaehxgtgthEhQaehxgtgthEiDaehxgtgthEiEaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaecGcGgDcGcGaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaegtgLgLgLgtgLgLgLgtgLgLgLgBazbvbvbvbvbvazgMgMgMazbvbvbvbvbvazazgMgMgMazazcZaehFgtgWgtgtaehFgtgWgtgtaehFgtgWgtgtaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaeaeaeaeaeaeiLiLiLiLiLiLiLiLiLaehwiGiNiNiSaegNgOgPgQgtgQgRgSgtgQgPgTgBazbababababaazazazazazbababababaazazbababaazazgUaeaedCaeaeaeaeaedCaeaeaeaeaedCaeaeaeaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaeaecncncnirgtgVgVgVgtgVgVgVgtgVgVgVgBazbhbhbhbhbhazazazazazbhbhbhbhbhazazbhbhbhazazdRaedpdyaeiLiLaedpdyaeiLiLaedpdyaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaehyiTcncncnaegtgtgtgtgWgtgtgtgWgtgtgtgBgXbvbvbvbvbvgXazazazgXbvbvbvbvbvgXazbvbvbvgXazazaedviUaeiLiLaedviUaeiLiLaedviUaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaeaecncncnaeaeaaaaaaaeaaaaaaaeaaaaaaaeaeaeaeaeaeaeaeazazazaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeiLiLaeaeaeaeiLiLaeaeaeaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeiViWcncncoaeiLiLiLiLiLiLiLiLiLiLiLiLiLaegYgZgZgZhaaeazazazaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaeaeaeaeaeaeiLiLiLiLiLiLiLiLiLiLiLiLiLaahbhccGhdheaeazazazaaiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaahbhfcGhgheaeazazazaaiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaahbhccGcGheaeazazazaaiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaehhhicGhjhkaeazazazaeiLiLiLiLiLiLiLaeaeaeaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaeaeaeaeaehlhmhnaeaeazazazaeaeaeaeaeaeaeaeaehohpaeaeaeaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeayazazazazhqhqhqazaJazazazaJazazazazazazazazhqhqaJazaKaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaAazazazazazazazazazazazazazazazazazazazazazazazazazaRaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeayazazgXazazazazazazazgXazazazazazazazgXazazazazazazaKaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaehraeaeaehsaeaeaehtaeaeaehuaeaeaejeaeaeaehvaeaeaeaeaeaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaegthzhxaegthAhxaegthBhxaegthChxaegtiFhxaegtiXgtgtgthDgtaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaehEgthFaehEgthFaehEgthFaehEgthFaehEgthFaehGgthHhIdDdDhJaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaehKgtgtaehKgtgtaehKgtgtaehKgtgtaehKgtgtaehLgthMhNdDdDhOaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaehPgthQaehPgthRaehPgthSaehPgthTaehPgthUaegtgthVhWdDdDhJaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaegtgtgtaegtgtgtaegtgtgtaegtgtgtaegtgtgtaegtgtgtgtgtgWgtaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaecmaeaeaecmaeaeaecmaeaeaecmaeaeaecmaeaeaecmaeaeaeaeaeaeaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaecnbUbVaecnbUbVaecnbUbVaecnbUbVaecnbUbVaecnbUbVhYhZiaibaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeiccncnaeiccncnaeiccncnaeiccncnaeiccncnaeidcncnhYieifigaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaecnihiiaecnihiiaecnihiiaecnihiiaecnihiiaeijcncnhYieikilaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeidcncnhYieikigaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeiicnimhYinioipaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLaeaeaeaeaeaeaeaeaeiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiYiZiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+iLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiLiL
+"}
diff --git a/maps/submaps/admin_use_vr/skipjack.dmm b/maps/submaps/admin_use_vr/skipjack.dmm
index 2c252f6ad8a..2e12a90bc45 100644
--- a/maps/submaps/admin_use_vr/skipjack.dmm
+++ b/maps/submaps/admin_use_vr/skipjack.dmm
@@ -14,7 +14,7 @@
/area/skipjack_station)
"ad" = (
/obj/structure/table/standard,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/unsimulated/floor{
icon_state = "steel"
},
diff --git a/maps/submaps/admin_use_vr/wizard.dmm b/maps/submaps/admin_use_vr/wizard.dmm
index b85af43205e..aa97a3f0822 100644
--- a/maps/submaps/admin_use_vr/wizard.dmm
+++ b/maps/submaps/admin_use_vr/wizard.dmm
@@ -240,7 +240,7 @@
/area/wizard_station)
"aB" = (
/obj/structure/table/woodentable,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/unsimulated/floor{
dir = 8;
icon_state = "wood"
diff --git a/maps/submaps/depreciated_vr/ert_base.dmm b/maps/submaps/depreciated_vr/ert_base.dmm
index 811010e5d0f..e16d4b09ed3 100644
--- a/maps/submaps/depreciated_vr/ert_base.dmm
+++ b/maps/submaps/depreciated_vr/ert_base.dmm
@@ -456,16 +456,16 @@
/obj/item/weapon/gun/energy/sniperrifle{
battery_lock = 0
},
-/obj/item/weapon/gun/energy/gun/martin{
+/obj/item/weapon/gun/energy/gun/compact{
battery_lock = 0
},
-/obj/item/weapon/gun/energy/gun/martin{
+/obj/item/weapon/gun/energy/gun/compact{
battery_lock = 0
},
-/obj/item/weapon/gun/energy/gun/martin{
+/obj/item/weapon/gun/energy/gun/compact{
battery_lock = 0
},
-/obj/item/weapon/gun/energy/gun/martin{
+/obj/item/weapon/gun/energy/gun/compact{
battery_lock = 0
},
/obj/item/weapon/cell/device/weapon,
diff --git a/maps/submaps/space_rocks/space_rocks.dm b/maps/submaps/space_rocks/space_rocks.dm
index 3951d511718..62437676d55 100644
--- a/maps/submaps/space_rocks/space_rocks.dm
+++ b/maps/submaps/space_rocks/space_rocks.dm
@@ -11,7 +11,7 @@
"uranium" = 10,
"platinum" = 10,
"hematite" = 20,
- "carbon" = 5,
+ "carbon" = 20,
"diamond" = 1,
"gold" = 8,
"silver" = 8,
@@ -24,7 +24,7 @@
"uranium" = 5,
"platinum" = 5,
"hematite" = 35,
- "carbon" = 5,
+ "carbon" = 35,
"gold" = 3,
"silver" = 3,
"phoron" = 25,
@@ -35,15 +35,7 @@
UpdateMineral()
update_icon()
-/datum/random_map/noise/ore/spacerocks
- descriptor = "asteroid field ore distribution map"
- deep_val = 0.2
- rare_val = 0.1
-
-/datum/random_map/noise/ore/spacerocks/check_map_sanity()
- return 1 //Totally random, but probably beneficial.
-
-/area/sdmine/
+/area/sdmine
ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg')
base_turf = /turf/simulated/mineral/floor/vacuum
/area/sdmine/unexplored
diff --git a/maps/submaps/surface_submaps/mountains/quarantineshuttle.dmm b/maps/submaps/surface_submaps/mountains/quarantineshuttle.dmm
index c641f359b8b..5e8cc12496e 100644
--- a/maps/submaps/surface_submaps/mountains/quarantineshuttle.dmm
+++ b/maps/submaps/surface_submaps/mountains/quarantineshuttle.dmm
@@ -344,7 +344,7 @@
},
/area/submap/cave/qShuttle)
"aX" = (
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/shuttle/floor{
icon_state = "floor_yellow"
},
diff --git a/maps/submaps/surface_submaps/plains/Diner.dmm b/maps/submaps/surface_submaps/plains/Diner.dmm
index 69f2b63996c..d6fa3316b41 100644
--- a/maps/submaps/surface_submaps/plains/Diner.dmm
+++ b/maps/submaps/surface_submaps/plains/Diner.dmm
@@ -43,7 +43,7 @@
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"ak" = (
-/obj/machinery/vending/cola,
+/obj/machinery/vending/hotfood,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"al" = (
@@ -113,8 +113,8 @@
"aw" = (
/obj/machinery/appliance/mixer/cereal,
/obj/machinery/light{
- icon_state = "tube1";
- dir = 4
+ dir = 4;
+ icon_state = "tube1"
},
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
@@ -134,7 +134,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"az" = (
@@ -180,13 +180,13 @@
/area/submap/Diner)
"aI" = (
/obj/structure/closet/crate/freezer,
-/obj/item/weapon/reagent_containers/food/snacks/meat,
-/obj/item/weapon/reagent_containers/food/snacks/meat,
-/obj/item/weapon/reagent_containers/food/snacks/meat,
-/obj/item/weapon/reagent_containers/food/snacks/meat,
-/obj/item/weapon/reagent_containers/food/snacks/meat,
-/obj/item/weapon/reagent_containers/food/snacks/meat,
-/obj/item/weapon/reagent_containers/food/snacks/meat,
+/obj/random/meat,
+/obj/random/meat,
+/obj/random/meat,
+/obj/random/meat,
+/obj/random/meat,
+/obj/random/meat,
+/obj/random/meat,
/turf/simulated/floor/tiled/freezer,
/area/submap/Diner)
"aJ" = (
@@ -198,8 +198,8 @@
"aK" = (
/obj/effect/floor_decal/corner/red/diagonal,
/obj/machinery/light{
- icon_state = "tube1";
- dir = 4
+ dir = 4;
+ icon_state = "tube1"
},
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
@@ -250,13 +250,13 @@
/area/submap/Diner)
"aQ" = (
/obj/structure/closet/crate/freezer,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
/turf/simulated/floor/tiled/freezer,
/area/submap/Diner)
"aR" = (
@@ -317,8 +317,8 @@
/area/submap/Diner)
"bc" = (
/obj/machinery/light{
- icon_state = "tube1";
- dir = 4
+ dir = 4;
+ icon_state = "tube1"
},
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
@@ -361,6 +361,11 @@
"bi" = (
/turf/simulated/floor/lino,
/area/submap/Diner)
+"bj" = (
+/obj/structure/table/standard,
+/obj/random/mug,
+/turf/simulated/floor/tiled/white,
+/area/submap/Diner)
"bk" = (
/obj/machinery/light/small{
dir = 8
@@ -374,6 +379,7 @@
/area/submap/Diner)
"bm" = (
/obj/structure/table/woodentable,
+/obj/random/mug,
/turf/simulated/floor/lino,
/area/submap/Diner)
"bn" = (
@@ -389,8 +395,8 @@
"bp" = (
/obj/effect/floor_decal/corner/red/diagonal,
/obj/structure/windoor_assembly{
- icon_state = "l_windoor_assembly01";
- dir = 2
+ dir = 2;
+ icon_state = "l_windoor_assembly01"
},
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
@@ -406,8 +412,8 @@
/area/submap/Diner)
"bs" = (
/obj/structure/sink{
- icon_state = "sink";
dir = 8;
+ icon_state = "sink";
pixel_x = -12;
pixel_y = 2
},
@@ -452,6 +458,7 @@
/area/submap/Diner)
"bA" = (
/obj/structure/table/standard,
+/obj/random/soap/anom,
/turf/simulated/floor/tiled/hydro,
/area/submap/Diner)
@@ -863,7 +870,7 @@ aa
(16,1,1) = {"
aa
ad
-ah
+bj
ap
ap
ap
diff --git a/maps/submaps/surface_submaps/plains/Diner_vr.dmm b/maps/submaps/surface_submaps/plains/Diner_vr.dmm
index 1ef47715cbd..a2eedcc00d3 100644
--- a/maps/submaps/surface_submaps/plains/Diner_vr.dmm
+++ b/maps/submaps/surface_submaps/plains/Diner_vr.dmm
@@ -130,7 +130,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"az" = (
@@ -245,13 +245,13 @@
/area/submap/Diner)
"aQ" = (
/obj/structure/closet/crate/freezer,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
-/obj/item/weapon/reagent_containers/food/condiment/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
/turf/simulated/floor/tiled/freezer,
/area/submap/Diner)
"aR" = (
diff --git a/maps/submaps/surface_submaps/plains/Thiefc.dmm b/maps/submaps/surface_submaps/plains/Thiefc.dmm
index d83aa9631fc..a19b8e603e7 100644
--- a/maps/submaps/surface_submaps/plains/Thiefc.dmm
+++ b/maps/submaps/surface_submaps/plains/Thiefc.dmm
@@ -13,7 +13,7 @@
"m" = (/obj/structure/table/steel,/obj/item/weapon/paper{desc = "This is some bullshit. First chance we got to knick something that looks half decent turns out to be mostly junk. And now we're getting calls that the other stash we've got has got a spider problem. Fuck this, Between the shitty weather, The pissed of bugs, And now apparently some NT goon running around in the area there's hardly enough reason to stick around. I'm telling Carl I'm out tommorow."; name = "Note"},/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Thiefc)
"n" = (/obj/vehicle/train/trolley,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Thiefc)
"o" = (/obj/structure/closet/crate,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Thiefc)
-"p" = (/obj/structure/closet/crate,/obj/item/ammo_magazine/ammo_box/b12g,/obj/item/weapon/storage/box/practiceshells,/obj/random/projectile/scrapped_gun,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Thiefc)
+"p" = (/obj/structure/closet/crate,/obj/item/ammo_magazine/ammo_box/b12g,/obj/item/ammo_magazine/ammo_box/b12g/practice,/obj/random/projectile/scrapped_gun,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Thiefc)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/submaps/surface_submaps/plains/Thiefc_vr.dmm b/maps/submaps/surface_submaps/plains/Thiefc_vr.dmm
index 599d3521551..5528c6029ca 100644
--- a/maps/submaps/surface_submaps/plains/Thiefc_vr.dmm
+++ b/maps/submaps/surface_submaps/plains/Thiefc_vr.dmm
@@ -119,7 +119,7 @@
/area/submap/Thiefc)
"p" = (
/obj/structure/closet/crate,
-/obj/item/weapon/storage/box/practiceshells,
+/obj/item/ammo_magazine/ammo_box/b12g/practice,
/turf/simulated/floor/outdoors/dirt/virgo3b{
outdoors = 0
},
diff --git a/maps/submaps/surface_submaps/plains/lonehome.dmm b/maps/submaps/surface_submaps/plains/lonehome.dmm
index 2b0fca5b59c..b610c17a87a 100644
--- a/maps/submaps/surface_submaps/plains/lonehome.dmm
+++ b/maps/submaps/surface_submaps/plains/lonehome.dmm
@@ -86,7 +86,7 @@
"zN" = (/obj/item/weapon/paper{info = "Seems to be filled with odd runes drawn with blood"; name = "Blood stained paper"},/turf/simulated/floor/wood,/area/submap/lonehome)
"AQ" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/item/weapon/material/shard,/turf/simulated/floor/outdoors/dirt,/area/submap/lonehome)
"BH" = (/obj/item/weapon/paper{info = "F%$K this detective, I swear I can see them peeking from behind the window, these tinted glasses help but I swear I can still see them snooping around. His days are counted... I am so close to figuring this out, just need a few more days. Then Shepiffany will be part of the family once again, then our two kids and I can go back on having a normal life... a normal life..."; name = "Stained sheet of paper"},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/carpet/sblucarpet,/area/submap/lonehome)
-"Dd" = (/obj/machinery/button/windowtint{id = "h_kitchen"},/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/condimentbottles,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/structure/curtain/open/bed,/obj/structure/table/rack,/obj/structure/window/reinforced/polarized{dir = 4; id = "h_kitchen"},/turf/simulated/floor/tiled/white,/area/submap/lonehome)
+"Dd" = (/obj/machinery/button/windowtint{id = "h_kitchen"},/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/condimentbottles,/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,/obj/structure/curtain/open/bed,/obj/structure/table/rack,/obj/structure/window/reinforced/polarized{dir = 4; id = "h_kitchen"},/turf/simulated/floor/tiled/white,/area/submap/lonehome)
"Dk" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/white,/area/submap/lonehome)
"DE" = (/obj/structure/window/reinforced/tinted/frosted{dir = 8},/obj/item/weapon/storage/box/glasses/square{pixel_y = -2},/obj/item/weapon/storage/box/glass_extras/sticks{pixel_y = 4},/obj/item/weapon/storage/box/glass_extras/straws{pixel_y = 7},/obj/item/weapon/packageWrap,/obj/structure/curtain/open/bed,/obj/item/weapon/material/kitchen/utensil/fork,/obj/item/weapon/material/kitchen/utensil/fork,/obj/item/weapon/material/kitchen/utensil/spoon{pixel_x = 2},/obj/item/weapon/material/kitchen/utensil/spoon{pixel_x = 2},/obj/structure/table/rack,/turf/simulated/floor/tiled/white,/area/submap/lonehome)
"DG" = (/obj/structure/simple_door/wood,/turf/simulated/floor,/area/submap/lonehome)
diff --git a/maps/submaps/surface_submaps/plains/lonehome_vr.dmm b/maps/submaps/surface_submaps/plains/lonehome_vr.dmm
index 776d5a25a21..6cee63decc5 100644
--- a/maps/submaps/surface_submaps/plains/lonehome_vr.dmm
+++ b/maps/submaps/surface_submaps/plains/lonehome_vr.dmm
@@ -166,7 +166,7 @@
},
/obj/item/weapon/storage/box/donkpockets,
/obj/item/weapon/storage/box/condimentbottles,
-/obj/item/weapon/reagent_containers/food/condiment/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
/obj/structure/curtain/open/bed,
/obj/structure/table/rack,
/obj/structure/window/reinforced/polarized{
diff --git a/maps/tether/submaps/_tether_submaps.dm b/maps/tether/submaps/_tether_submaps.dm
index 4173ca91f04..097a6b43383 100644
--- a/maps/tether/submaps/_tether_submaps.dm
+++ b/maps/tether/submaps/_tether_submaps.dm
@@ -48,7 +48,7 @@
. = ..()
seed_submaps(list(Z_LEVEL_UNDERDARK), 100, /area/mine/unexplored/underdark, /datum/map_template/underdark)
new /datum/random_map/automata/cave_system/no_cracks(null, 3, 3, Z_LEVEL_UNDERDARK, world.maxx - 4, world.maxy - 4) // Create the mining Z-level.
- new /datum/random_map/noise/ore(null, 1, 1, Z_LEVEL_UNDERDARK, 64, 64) // Create the mining ore distribution map.
+ new /datum/random_map/noise/ore/underdark(null, 1, 1, Z_LEVEL_UNDERDARK, 64, 64) // Create the mining ore distribution map.
#include "../../submaps/surface_submaps/plains/plains_vr.dm"
#include "../../submaps/surface_submaps/plains/plains_areas.dm"
diff --git a/maps/tether/submaps/tether_centcom.dmm b/maps/tether/submaps/tether_centcom.dmm
index bd6de68333b..736d80200d7 100644
--- a/maps/tether/submaps/tether_centcom.dmm
+++ b/maps/tether/submaps/tether_centcom.dmm
@@ -456,6 +456,20 @@
/obj/machinery/status_display/supply_display,
/turf/simulated/wall/r_wall,
/area/centcom)
+"bn" = (
+/obj/machinery/atmospherics/unary/vent_pump/high_volume{
+ dir = 1;
+ frequency = 1380;
+ id_tag = null
+ },
+/obj/effect/map_helper/airlock/atmos/pump_out_internal,
+/obj/machinery/embedded_controller/radio/airlock/docking_port{
+ frequency = 1380;
+ id_tag = "ccboat";
+ pixel_y = 29
+ },
+/turf/simulated/floor/plating,
+/area/shuttle/ccboat)
"bo" = (
/obj/structure/sign/department/bar,
/turf/simulated/wall/r_wall,
@@ -500,6 +514,25 @@
/obj/structure/sign/warning/nosmoking_2,
/turf/simulated/wall/r_wall,
/area/centcom/terminal)
+"by" = (
+/obj/machinery/airlock_sensor{
+ dir = 8;
+ frequency = 1380;
+ id_tag = null;
+ pixel_x = 24
+ },
+/obj/effect/map_helper/airlock/sensor/chamber_sensor,
+/obj/machinery/atmospherics/unary/vent_pump/high_volume{
+ dir = 1;
+ frequency = 1380;
+ id_tag = null
+ },
+/obj/effect/map_helper/airlock/atmos/pump_out_internal,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/simulated/floor/plating,
+/area/shuttle/ccboat)
"bz" = (
/obj/structure/sign/securearea{
desc = "A warning sign which reads 'HIGH VOLTAGE'";
@@ -524,15 +557,73 @@
},
/turf/simulated/shuttle/floor,
/area/shuttle/supply)
+"bC" = (
+/obj/machinery/atmospherics/unary/vent_pump/high_volume{
+ frequency = 1380;
+ id_tag = null
+ },
+/obj/effect/map_helper/airlock/atmos/chamber_pump,
+/obj/effect/shuttle_landmark/shuttle_initializer/ccboat,
+/obj/effect/overmap/visitable/ship/landable/ccboat,
+/turf/simulated/floor/plating,
+/area/shuttle/ccboat)
+"bD" = (
+/obj/machinery/atmospherics/unary/vent_pump/high_volume{
+ frequency = 1380;
+ id_tag = null
+ },
+/obj/effect/map_helper/airlock/atmos/chamber_pump,
+/turf/simulated/floor/plating,
+/area/shuttle/ccboat)
"bE" = (
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "tram"
},
/obj/structure/closet/walllocker/medical/east,
+/obj/item/stack/medical/crude_pack,
+/obj/item/stack/medical/crude_pack,
+/obj/item/stack/medical/ointment,
+/obj/item/stack/medical/ointment,
+/obj/item/stack/medical/splint,
/turf/simulated/floor/tiled,
/area/shuttle/escape{
base_turf = /turf/simulated/floor/tiled/techfloor/grid
})
+"bF" = (
+/obj/machinery/door/firedoor/glass,
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/machinery/door/blast/angled/open{
+ id = "ccshuttleshutter"
+ },
+/turf/simulated/floor/plating,
+/area/shuttle/ccboat)
+"bG" = (
+/obj/machinery/door/firedoor/glass,
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/door/blast/angled/open{
+ dir = 4;
+ id = "ccshuttleshutter"
+ },
+/turf/simulated/floor/plating,
+/area/shuttle/ccboat)
+"bH" = (
+/obj/machinery/atmospherics/unary/engine{
+ dir = 1
+ },
+/turf/simulated/floor/plating,
+/area/shuttle/ccboat)
"bJ" = (
/obj/structure/table/rack,
/obj/item/weapon/storage/box/pillbottles,
@@ -826,7 +917,9 @@
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "tram"
},
-/obj/structure/closet/walllocker/medical/west,
+/obj/machinery/vending/wallmed1/public{
+ pixel_x = -28
+ },
/turf/simulated/floor/tiled,
/area/shuttle/escape{
base_turf = /turf/simulated/floor/tiled/techfloor/grid
@@ -1024,12 +1117,6 @@
icon_state = "dark"
},
/area/centcom/specops)
-"df" = (
-/obj/machinery/atmospherics/unary/engine{
- dir = 1
- },
-/turf/simulated/floor/airless,
-/area/shuttle/ccboat)
"dh" = (
/turf/simulated/floor/tiled/white,
/area/centcom/bar)
@@ -1124,8 +1211,8 @@
/area/centcom/specops)
"dv" = (
/obj/structure/table/rack,
-/obj/item/weapon/gun/energy/gun/martin,
-/obj/item/weapon/gun/energy/gun/martin,
+/obj/item/weapon/gun/energy/gun/compact,
+/obj/item/weapon/gun/energy/gun/compact,
/obj/item/device/flash,
/obj/item/device/flash,
/turf/simulated/floor/tiled/dark,
@@ -1892,16 +1979,6 @@
},
/turf/simulated/floor/wood,
/area/centcom/specops)
-"gh" = (
-/obj/machinery/atmospherics/unary/vent_pump/high_volume{
- frequency = 1380;
- id_tag = null
- },
-/obj/effect/map_helper/airlock/atmos/chamber_pump,
-/obj/effect/shuttle_landmark/shuttle_initializer/ccboat,
-/obj/effect/overmap/visitable/ship/landable/ccboat,
-/turf/simulated/floor/airless,
-/area/shuttle/ccboat)
"gj" = (
/obj/machinery/vending/cola{
name = "hacked Robust Softdrinks";
@@ -2085,25 +2162,6 @@
/area/centcom/security{
name = "\improper CentCom Residential Security"
})
-"gN" = (
-/obj/machinery/airlock_sensor{
- dir = 8;
- frequency = 1380;
- id_tag = null;
- pixel_x = 24
- },
-/obj/effect/map_helper/airlock/sensor/chamber_sensor,
-/obj/machinery/atmospherics/unary/vent_pump/high_volume{
- dir = 1;
- frequency = 1380;
- id_tag = null
- },
-/obj/effect/map_helper/airlock/atmos/pump_out_internal,
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/simulated/floor/airless,
-/area/shuttle/ccboat)
"gP" = (
/obj/structure/table/rack,
/obj/item/clothing/under/color/green,
@@ -2258,8 +2316,8 @@
/area/centcom/control)
"hq" = (
/obj/structure/table/rack,
-/obj/item/weapon/gun/energy/gun/martin,
-/obj/item/weapon/gun/energy/gun/martin,
+/obj/item/weapon/gun/energy/gun/compact,
+/obj/item/weapon/gun/energy/gun/compact,
/obj/item/device/flash,
/obj/item/device/flash,
/turf/simulated/floor/tiled{
@@ -3775,22 +3833,6 @@
/obj/item/weapon/melee/energy/sword/red,
/turf/unsimulated/floor/techfloor_grid,
/area/tdome/tdome1)
-"mS" = (
-/obj/machinery/door/firedoor/glass,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/machinery/door/blast/angled/open{
- dir = 4;
- id = "ccshuttleshutter"
- },
-/turf/simulated/floor,
-/area/shuttle/ccboat)
"mT" = (
/obj/machinery/camera/network/crescent,
/obj/structure/table/reinforced,
@@ -5472,19 +5514,6 @@
},
/turf/unsimulated/floor/techfloor_grid,
/area/tdome/tdome1)
-"vY" = (
-/obj/machinery/door/firedoor/glass,
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
-/obj/structure/window/reinforced,
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/machinery/door/blast/angled/open{
- id = "ccshuttleshutter"
- },
-/turf/simulated/floor,
-/area/shuttle/ccboat)
"vZ" = (
/obj/structure/table/reinforced,
/obj/effect/floor_decal/borderfloorblack{
@@ -5610,14 +5639,6 @@
},
/turf/simulated/floor/tiled,
/area/centcom/control)
-"ww" = (
-/obj/machinery/atmospherics/unary/vent_pump/high_volume{
- frequency = 1380;
- id_tag = null
- },
-/obj/effect/map_helper/airlock/atmos/chamber_pump,
-/turf/simulated/floor/airless,
-/area/shuttle/ccboat)
"wx" = (
/obj/structure/bed/chair/shuttle{
dir = 1
@@ -6625,20 +6646,6 @@
"Cj" = (
/turf/simulated/shuttle/floor,
/area/shuttle/supply)
-"Cl" = (
-/obj/machinery/atmospherics/unary/vent_pump/high_volume{
- dir = 1;
- frequency = 1380;
- id_tag = null
- },
-/obj/effect/map_helper/airlock/atmos/pump_out_internal,
-/obj/machinery/embedded_controller/radio/airlock/docking_port{
- frequency = 1380;
- id_tag = "ccboat";
- pixel_y = 29
- },
-/turf/simulated/floor/airless,
-/area/shuttle/ccboat)
"Cn" = (
/turf/unsimulated/wall,
/area/centcom/main_hall)
@@ -25750,7 +25757,7 @@ gn
mY
zN
uf
-mS
+bG
uf
sX
sX
@@ -25886,11 +25893,11 @@ sX
WO
uf
uf
-mS
-mS
+bG
+bG
go
-Cl
-gh
+bn
+bC
gn
wr
uf
@@ -26025,14 +26032,14 @@ nJ
px
uf
uf
-mS
+bG
uf
vq
bP
Bn
go
-gN
-ww
+by
+bD
xJ
wm
HU
@@ -26165,7 +26172,7 @@ ZQ
ac
nJ
px
-vY
+bF
Bc
DW
uf
@@ -26307,7 +26314,7 @@ ZQ
ac
nJ
px
-vY
+bF
LB
cX
qL
@@ -26321,7 +26328,7 @@ uf
vi
YD
cY
-df
+bH
pR
nJ
ac
@@ -26449,7 +26456,7 @@ ZQ
ac
nJ
px
-vY
+bF
Ti
nA
sp
@@ -26591,7 +26598,7 @@ ZQ
ac
nJ
px
-vY
+bF
UE
CK
jK
@@ -26605,7 +26612,7 @@ uf
fG
YD
cY
-df
+bH
pR
nJ
ac
@@ -26733,7 +26740,7 @@ ZQ
ac
nJ
px
-vY
+bF
VJ
vG
uf
@@ -26877,7 +26884,7 @@ nJ
px
uf
uf
-mS
+bG
uf
vq
bP
@@ -27022,8 +27029,8 @@ sX
sX
uf
uf
-mS
-mS
+bG
+bG
pw
tT
tT
@@ -27170,7 +27177,7 @@ UC
uf
uf
uf
-mS
+bG
uf
sX
sX
diff --git a/maps/tether/submaps/tether_underdark.dmm b/maps/tether/submaps/tether_underdark.dmm
index e81b9daf601..3f9cab4abbc 100644
--- a/maps/tether/submaps/tether_underdark.dmm
+++ b/maps/tether/submaps/tether_underdark.dmm
@@ -1,5 +1,129 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"a" = (
+"aa" = (
+/obj/structure/cable/green{
+ icon_state = "2-4"
+ },
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
+ },
+/area/mine/explored/underdark)
+"ab" = (
+/turf/simulated/mineral/floor/virgo3b,
+/area/mine/explored/underdark)
+"ac" = (
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
+ },
+/area/mine/explored/underdark)
+"ad" = (
+/obj/effect/decal/remains/deer,
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
+ },
+/area/mine/explored/underdark)
+"ae" = (
+/turf/unsimulated/mineral/virgo3b,
+/area/mine/explored/underdark)
+"af" = (
+/turf/simulated/mineral/virgo3b/rich,
+/area/mine/unexplored/underdark)
+"ag" = (
+/turf/simulated/mineral/virgo3b/rich,
+/area/mine/explored/underdark)
+"ah" = (
+/turf/simulated/wall/r_wall,
+/area/mine/explored/underdark)
+"ai" = (
+/obj/structure/cable/green{
+ icon_state = "2-4"
+ },
+/turf/simulated/floor/outdoors/dirt/virgo3b,
+/area/mine/explored/underdark)
+"aj" = (
+/obj/machinery/power/port_gen/pacman,
+/obj/structure/cable/green{
+ icon_state = "0-8"
+ },
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
+ },
+/area/mine/explored/underdark)
+"ak" = (
+/obj/structure/cable/green{
+ icon_state = "4-10"
+ },
+/obj/machinery/light/small{
+ icon_state = "bulb1";
+ dir = 1
+ },
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
+ },
+/area/mine/explored/underdark)
+"al" = (
+/obj/structure/cable/green{
+ icon_state = "2-8"
+ },
+/turf/simulated/floor/outdoors/dirt/virgo3b,
+/area/mine/explored/underdark)
+"am" = (
+/obj/structure/cable/green{
+ icon_state = "0-8"
+ },
+/turf/simulated/floor/outdoors/dirt/virgo3b,
+/area/mine/explored/underdark)
+"an" = (
+/obj/structure/cable/green{
+ icon_state = "2-8"
+ },
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
+ },
+/area/mine/explored/underdark)
+"ao" = (
+/turf/simulated/floor/outdoors/dirt/virgo3b,
+/area/mine/explored/underdark)
+"ap" = (
+/obj/structure/cable/green{
+ icon_state = "1-4"
+ },
+/turf/simulated/floor/outdoors/dirt/virgo3b,
+/area/mine/explored/underdark)
+"aq" = (
+/obj/structure/cable/green{
+ icon_state = "5-8"
+ },
+/turf/simulated/floor/outdoors/dirt/virgo3b,
+/area/mine/explored/underdark)
+"ar" = (
+/obj/structure/cable/green{
+ icon_state = "1-5"
+ },
+/turf/simulated/floor/outdoors/dirt/virgo3b,
+/area/mine/explored/underdark)
+"as" = (
+/turf/simulated/floor/tiled/steel_dirty/virgo3b,
+/area/mine/explored/underdark)
+"at" = (
+/obj/effect/step_trigger/teleporter/from_underdark{
+ dir = 4;
+ pixel_x = -16
+ },
+/turf/simulated/floor/tiled/steel_dirty/virgo3b,
+/area/mine/explored/underdark)
+"au" = (
+/obj/item/weapon/newspaper{
+ pixel_x = 4
+ },
+/turf/simulated/floor/tiled/steel_dirty/virgo3b,
+/area/mine/explored/underdark)
+"av" = (
+/obj/structure/cable/green{
+ icon_state = "4-10"
+ },
+/turf/simulated/floor/outdoors/dirt/virgo3b,
+/area/mine/explored/underdark)
+"aw" = (
/obj/structure/cable/green{
icon_state = "0-10"
},
@@ -10,20101 +134,20083 @@
pixel_y = 24;
alarms_hidden = 1
},
-/turf/simulated/floor/outdoors/dirt/virgo3b,
-/area/mine/explored/underdark)
-"b" = (
-/turf/simulated/mineral/floor/virgo3b,
-/area/mine/explored/underdark)
-"c" = (
/turf/simulated/mineral/floor/virgo3b{
ignore_mapgen = 1
},
/area/mine/explored/underdark)
-"d" = (
-/obj/effect/decal/remains/deer,
+"ax" = (
+/obj/effect/decal/remains/mouse,
/turf/simulated/mineral/floor/virgo3b{
ignore_mapgen = 1
},
/area/mine/explored/underdark)
-"e" = (
-/turf/unsimulated/mineral/virgo3b,
-/area/mine/explored/underdark)
-"f" = (
-/turf/simulated/mineral/virgo3b/rich,
-/area/mine/unexplored/underdark)
-"g" = (
-/turf/simulated/mineral/virgo3b/rich,
-/area/mine/explored/underdark)
-"h" = (
-/turf/simulated/wall/r_wall,
-/area/mine/explored/underdark)
-"i" = (
-/obj/structure/cable/green{
- icon_state = "2-4"
- },
-/turf/simulated/floor/outdoors/dirt/virgo3b,
-/area/mine/explored/underdark)
-"j" = (
-/obj/machinery/power/port_gen/pacman,
-/obj/structure/cable/green{
- icon_state = "0-8"
- },
-/turf/simulated/floor/outdoors/dirt/virgo3b,
-/area/mine/explored/underdark)
-"k" = (
-/obj/structure/cable/green{
- icon_state = "4-10"
- },
-/obj/machinery/light/small{
- icon_state = "bulb1";
- dir = 1
- },
-/turf/simulated/floor/outdoors/dirt/virgo3b,
-/area/mine/explored/underdark)
-"l" = (
-/obj/structure/cable/green{
- icon_state = "2-8"
- },
-/turf/simulated/floor/outdoors/dirt/virgo3b,
-/area/mine/explored/underdark)
-"n" = (
-/obj/structure/railing,
-/turf/simulated/floor/outdoors/dirt/virgo3b,
-/area/mine/explored/underdark)
-"o" = (
-/turf/simulated/floor/outdoors/dirt/virgo3b,
-/area/mine/explored/underdark)
-"p" = (
-/obj/structure/cable/green{
- icon_state = "1-4"
- },
-/turf/simulated/floor/outdoors/dirt/virgo3b,
-/area/mine/explored/underdark)
-"q" = (
-/obj/structure/cable/green{
- icon_state = "5-8"
- },
-/turf/simulated/floor/outdoors/dirt/virgo3b,
-/area/mine/explored/underdark)
-"r" = (
-/obj/structure/cable/green{
- icon_state = "1-5"
- },
-/turf/simulated/floor/outdoors/dirt/virgo3b,
-/area/mine/explored/underdark)
-"s" = (
-/turf/simulated/floor/tiled/steel_dirty/virgo3b,
-/area/mine/explored/underdark)
-"t" = (
-/obj/effect/step_trigger/teleporter/from_underdark{
- dir = 4;
- pixel_x = -16
- },
-/turf/simulated/floor/tiled/steel_dirty/virgo3b,
-/area/mine/explored/underdark)
-"u" = (
-/obj/item/weapon/newspaper{
- pixel_x = 4
- },
-/turf/simulated/floor/tiled/steel_dirty/virgo3b,
-/area/mine/explored/underdark)
-"v" = (
-/obj/machinery/light/small{
- icon_state = "bulb1";
- dir = 4
- },
-/obj/structure/railing{
- icon_state = "railing0";
- dir = 8
- },
-/turf/simulated/floor/outdoors/dirt/virgo3b,
-/area/mine/explored/underdark)
-"w" = (
-/obj/structure/railing{
- icon_state = "railing0";
- dir = 8
- },
-/turf/simulated/floor/outdoors/dirt/virgo3b,
-/area/mine/explored/underdark)
-"x" = (
-/obj/structure/railing{
- icon_state = "railing0";
- dir = 1
- },
-/turf/simulated/floor/outdoors/dirt/virgo3b,
-/area/mine/explored/underdark)
-"y" = (
+"ay" = (
/turf/simulated/wall/iron,
/area/mine/explored/underdark)
-"z" = (
+"az" = (
/obj/structure/ore_box,
/turf/simulated/floor/tiled/steel_dirty/virgo3b,
/area/mine/explored/underdark)
-"B" = (
-/obj/machinery/light/small{
- icon_state = "bulb1";
- dir = 8
+"aA" = (
+/obj/structure/cable/green{
+ icon_state = "0-10"
},
/turf/simulated/floor/outdoors/dirt/virgo3b,
/area/mine/explored/underdark)
-"C" = (
+"aB" = (
+/obj/structure/cable/green{
+ icon_state = "1-4"
+ },
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
+ },
+/area/mine/explored/underdark)
+"aC" = (
/obj/machinery/door/airlock/maintenance/cargo,
/turf/simulated/floor/virgo3b,
/area/mine/explored/underdark)
-"D" = (
+"aD" = (
/obj/machinery/light/small{
icon_state = "bulb1";
dir = 4
},
/turf/simulated/floor/tiled/steel_dirty/virgo3b,
/area/mine/explored/underdark)
-"E" = (
+"aE" = (
/obj/item/weapon/tool/wrench,
/turf/simulated/floor/tiled/steel_dirty/virgo3b,
/area/mine/explored/underdark)
-"F" = (
+"aF" = (
/obj/structure/frame,
/turf/simulated/floor/tiled/steel_dirty/virgo3b,
/area/mine/explored/underdark)
-"G" = (
-/obj/machinery/door/airlock/multi_tile/metal/mait{
- dir = 2
+"aG" = (
+/turf/simulated/floor/virgo3b,
+/area/mine/explored/underdark)
+"aH" = (
+/obj/structure/girder,
+/turf/simulated/floor/virgo3b,
+/area/mine/explored/underdark)
+"aI" = (
+/obj/structure/cable/green{
+ icon_state = "5-8"
},
-/turf/simulated/floor/tiled/steel_dirty/virgo3b,
-/area/mine/explored/underdark)
-"H" = (
-/obj/machinery/light/small{
- icon_state = "bulb1";
- dir = 4
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
},
-/turf/simulated/mineral/floor/virgo3b,
/area/mine/explored/underdark)
-"I" = (
-/obj/machinery/light/small,
-/turf/simulated/floor/outdoors/dirt/virgo3b,
-/area/mine/explored/underdark)
-"J" = (
+"aJ" = (
/turf/simulated/mineral/floor/virgo3b,
/area/mine/unexplored/underdark)
-"K" = (
+"aK" = (
/obj/structure/sign/graffiti/pisoff{
pixel_x = 5;
pixel_y = 3
},
/turf/simulated/wall/r_wall,
/area/mine/explored/underdark)
-"L" = (
+"aL" = (
/obj/structure/sign/hostilefauna,
/turf/simulated/wall/r_wall,
/area/mine/explored/underdark)
-"N" = (
+"aM" = (
+/obj/structure/ore_box,
+/turf/simulated/floor/virgo3b,
+/area/mine/explored/underdark)
+"aN" = (
/obj/effect/decal/remains/posi,
/turf/simulated/floor/outdoors/dirt/virgo3b,
/area/mine/explored/underdark)
-"R" = (
+"aO" = (
+/obj/item/weapon/tool/wrench,
+/turf/simulated/floor/virgo3b,
+/area/mine/explored/underdark)
+"aP" = (
+/obj/structure/frame,
+/turf/simulated/floor/virgo3b,
+/area/mine/explored/underdark)
+"aQ" = (
+/obj/machinery/door/airlock/multi_tile/metal/mait{
+ dir = 2
+ },
+/turf/simulated/floor/tiled/steel_dirty/virgo3b,
+/area/mine/explored/underdark)
+"aR" = (
/obj/item/weapon/bone,
/turf/simulated/floor/outdoors/dirt/virgo3b,
/area/mine/explored/underdark)
-"S" = (
+"aS" = (
/obj/item/weapon/bone,
/turf/simulated/mineral/floor/virgo3b{
ignore_mapgen = 1
},
/area/mine/explored/underdark)
-"T" = (
+"aT" = (
/obj/effect/decal/remains/mouse,
/turf/simulated/floor/outdoors/dirt/virgo3b,
/area/mine/explored/underdark)
-"W" = (
+"aU" = (
+/obj/structure/cable/green{
+ icon_state = "1-5"
+ },
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
+ },
+/area/mine/explored/underdark)
+"aV" = (
+/obj/machinery/light/small{
+ icon_state = "bulb1";
+ dir = 8
+ },
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
+ },
+/area/mine/explored/underdark)
+"aW" = (
/obj/item/weapon/bone/skull,
/turf/simulated/mineral/floor/virgo3b{
ignore_mapgen = 1
},
/area/mine/explored/underdark)
-"Z" = (
+"aX" = (
+/obj/machinery/light/small{
+ icon_state = "bulb1";
+ dir = 4
+ },
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
+ },
+/area/mine/explored/underdark)
+"aY" = (
+/obj/item/weapon/bone,
+/obj/machinery/light/small{
+ icon_state = "bulb1";
+ dir = 4
+ },
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
+ },
+/area/mine/explored/underdark)
+"aZ" = (
/obj/effect/decal/remains/ribcage,
/turf/simulated/mineral/floor/virgo3b{
ignore_mapgen = 1
},
/area/mine/explored/underdark)
+"ba" = (
+/obj/structure/railing,
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
+ },
+/area/mine/explored/underdark)
+"bb" = (
+/obj/effect/decal/remains/posi,
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
+ },
+/area/mine/explored/underdark)
+"bc" = (
+/obj/structure/railing{
+ icon_state = "railing0";
+ dir = 8
+ },
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
+ },
+/area/mine/explored/underdark)
+"bd" = (
+/obj/machinery/light/small,
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
+ },
+/area/mine/explored/underdark)
+"be" = (
+/obj/structure/railing{
+ icon_state = "railing0";
+ dir = 1
+ },
+/turf/simulated/mineral/floor/virgo3b{
+ ignore_mapgen = 1
+ },
+/area/mine/explored/underdark)
(1,1,1) = {"
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
"}
(2,1,1) = {"
-e
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ae
"}
(3,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(4,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(5,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(6,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(7,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(8,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(9,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(10,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(11,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(12,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(13,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(14,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(15,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(16,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(17,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(18,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(19,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(20,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(21,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(22,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(23,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(24,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(25,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(26,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(27,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(28,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(29,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(30,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(31,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(32,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(33,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(34,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(35,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(36,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(37,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(38,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(39,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(40,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(41,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(42,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(43,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(44,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(45,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(46,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(47,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(48,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-J
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+aJ
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(49,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(50,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(51,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(52,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(53,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(54,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(55,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(56,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(57,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(58,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(59,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(60,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(61,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-f
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+af
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(62,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(63,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(64,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(65,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(66,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(67,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(68,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-h
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ah
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(69,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(70,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(71,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(72,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(73,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(74,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(75,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(76,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(77,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-h
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ah
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(78,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(79,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(80,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-f
-c
-c
-c
-f
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+af
+ac
+ac
+ac
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(81,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(82,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(83,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(84,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-h
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ah
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(85,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(86,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(87,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(88,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(89,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(90,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-h
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ah
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(91,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(92,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(93,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(94,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-h
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ah
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(95,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(96,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(97,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(98,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(99,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-f
-f
-f
-f
-f
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(100,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-f
-f
-f
-f
-f
-f
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(101,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-f
-f
-f
-f
-f
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(102,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-f
-f
-f
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(103,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-f
-f
-f
-c
-c
-c
-h
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+af
+af
+af
+ac
+ac
+ac
+ah
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(104,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(105,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(106,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-f
-f
-f
-c
-c
-c
-c
-c
-f
-f
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+af
+af
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(107,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-f
-f
-f
-c
-c
-c
-c
-c
-f
-f
-f
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(108,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-h
-c
-c
-c
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ah
+ac
+ac
+ac
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(109,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(110,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(111,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-f
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(112,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(113,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-g
-g
-g
-g
-c
-c
-h
-W
-f
-f
-f
-f
-f
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ag
+ag
+ag
+ac
+ac
+ah
+aW
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(114,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-g
-g
-g
-g
-c
-c
-c
-c
-c
-c
-f
-f
-f
-c
-c
-h
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ag
+ag
+ag
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+ac
+ac
+ah
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(115,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-g
-g
-g
-g
-g
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ag
+ag
+ag
+ag
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(116,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-g
-g
-g
-g
-c
-S
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ag
+ag
+ag
+ac
+aS
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(117,1,1) = {"
-e
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-g
-g
-c
-c
-c
-K
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ag
+ac
+ac
+ac
+aK
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(118,1,1) = {"
-e
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-c
-c
-c
-c
-c
-c
-c
-b
-c
-c
-c
-h
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ab
+ac
+ac
+ac
+ah
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(119,1,1) = {"
-e
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-Z
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+aZ
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(120,1,1) = {"
-e
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-c
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ae
"}
(121,1,1) = {"
-e
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-c
-c
-c
-c
-c
-c
-c
-c
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ag
+ag
+ag
+ac
+ac
+ac
+ac
+ac
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ae
"}
(122,1,1) = {"
-e
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-c
-s
-s
-H
-d
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ac
+aG
+as
+ab
+ad
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ag
+ag
+ag
+ag
+ac
+as
+as
+aX
+ac
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ae
"}
(123,1,1) = {"
-e
-g
-g
-g
-g
-g
-h
-h
-h
-h
-h
-h
-h
-h
-s
-G
-L
-h
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+as
+aG
+aL
+ah
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ah
+ah
+ah
+ah
+ah
+as
+aQ
+aL
+ah
+ah
+ah
+ah
+ah
+ag
+ag
+ag
+ag
+ag
+ae
"}
(124,1,1) = {"
-e
-g
-g
-g
-g
-g
-h
-g
-g
-g
-g
-T
-o
-B
-o
-o
-o
-h
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ah
+ag
+ag
+ag
+ag
+aT
+ao
+ao
+ao
+ao
+ao
+ah
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ah
+ag
+ax
+ac
+aV
+ac
+ac
+ac
+ac
+ag
+ag
+ag
+ah
+ag
+ag
+ag
+ag
+ag
+ae
"}
(125,1,1) = {"
-e
-g
-g
-g
-g
-g
-h
-g
-g
-g
-o
-R
-o
-o
-o
-o
-o
-h
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ah
+ag
+ag
+ag
+ao
+aR
+ao
+ao
+ao
+ao
+ao
+ah
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ah
+ac
+aS
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ag
+ag
+ah
+ag
+ag
+ag
+ag
+ag
+ae
"}
(126,1,1) = {"
-e
-g
-g
-g
-g
-g
-h
-g
-N
-o
-o
-o
-o
-o
-o
-o
-o
-h
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ah
+ag
+aN
+ao
+ao
+ao
+ao
+ao
+ao
+ao
+ao
+ah
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ah
+aa
+aB
+ac
+ac
+ac
+ac
+ac
+ac
+bb
+ac
+ag
+ah
+ag
+ag
+ag
+ag
+ag
+ae
"}
(127,1,1) = {"
-e
-g
-g
-g
-g
-g
-h
-i
-p
-o
-o
-o
-o
-o
-o
-s
-o
-h
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ah
+ai
+ap
+ao
+ao
+ao
+ao
+ao
+ao
+aG
+ao
+ah
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ah
+aj
+aI
+ac
+ac
+ac
+as
+ac
+ac
+ac
+ac
+ag
+ah
+ag
+ag
+ag
+ag
+ag
+ae
"}
(128,1,1) = {"
-e
-g
-g
-g
-g
-g
-h
-j
-q
-o
-o
-o
-o
-o
-o
-o
-o
-h
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ah
+am
+aq
+ao
+ao
+ao
+ao
+ao
+ao
+ao
+ao
+ah
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ah
+ak
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ah
+ag
+ag
+ag
+ag
+ag
+ae
"}
(129,1,1) = {"
-e
-g
-g
-g
-g
-g
-h
-k
-o
-o
-o
-o
-o
-s
-o
-o
-I
-h
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ah
+av
+ao
+ao
+ao
+ao
+ao
+as
+ao
+ao
+ao
+ah
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ah
+an
+aU
+ac
+as
+ac
+ac
+ac
+ac
+ac
+ac
+bd
+ah
+ag
+ag
+ag
+ag
+ag
+ae
"}
(130,1,1) = {"
-e
-g
-g
-g
-g
-g
-h
-l
-r
-o
-o
-y
-y
-C
-y
-y
-o
-h
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ah
+al
+ar
+ao
+ao
+ay
+ay
+aG
+ay
+ay
+ao
+ah
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ah
+aw
+ay
+ay
+aC
+ay
+ay
+ac
+ac
+ac
+ac
+ac
+ah
+ag
+ag
+ag
+ag
+ag
+ae
"}
(131,1,1) = {"
-e
-g
-g
-g
-g
-g
-h
-a
-s
-s
-o
-y
-s
-s
-E
-y
-o
-h
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ah
+aA
+aG
+aG
+ao
+aH
+as
+aG
+aO
+aH
+ao
+ah
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ah
+ac
+ay
+as
+as
+aE
+ay
+ac
+ac
+as
+as
+ac
+ah
+ag
+ag
+ag
+ag
+ag
+ae
"}
(132,1,1) = {"
-e
-g
-g
-g
-g
-g
-h
-n
-t
-t
-x
-y
-z
-D
-F
-y
-o
-h
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ah
+ao
+aG
+aG
+ao
+ay
+aM
+aG
+aP
+aH
+ao
+ah
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ah
+ac
+ay
+az
+aD
+aF
+ay
+ac
+ba
+at
+at
+be
+ah
+ag
+ag
+ag
+ag
+ag
+ae
"}
(133,1,1) = {"
-e
-g
-g
-g
-g
-g
-h
-n
-u
-s
-x
-y
-y
-y
-y
-y
-o
-h
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ah
+ao
+aG
+aG
+ao
+ay
+aH
+ay
+ay
+ay
+ao
+ah
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ah
+ac
+ay
+ay
+ay
+ay
+ay
+ac
+ba
+au
+as
+be
+ah
+ag
+ag
+ag
+ag
+ag
+ae
"}
(134,1,1) = {"
-e
-g
-g
-g
-g
-g
-h
-o
-v
-w
-o
-o
-o
-o
-o
-o
-R
-h
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ah
+ao
+ao
+ao
+ao
+ao
+ao
+ao
+ao
+ao
+aR
+ah
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ah
+ac
+ac
+ac
+ac
+ac
+ac
+aY
+ac
+bc
+bc
+ac
+ah
+ag
+ag
+ag
+ag
+ag
+ae
"}
(135,1,1) = {"
-e
-g
-g
-g
-g
-g
-h
-h
-h
-h
-h
-h
-h
-h
-h
-h
-h
-h
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ah
+ag
+ag
+ag
+ag
+ag
+ae
"}
(136,1,1) = {"
-e
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ae
"}
(137,1,1) = {"
-e
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ae
"}
(138,1,1) = {"
-e
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ae
"}
(139,1,1) = {"
-e
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-g
-e
+ae
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ag
+ae
"}
(140,1,1) = {"
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
-e
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
"}
diff --git a/maps/tether/submaps/underdark_pois/underdark_things.dm b/maps/tether/submaps/underdark_pois/underdark_things.dm
index 22dd2e4e5ea..c53b37c8a6d 100644
--- a/maps/tether/submaps/underdark_pois/underdark_things.dm
+++ b/maps/tether/submaps/underdark_pois/underdark_things.dm
@@ -1,3 +1,8 @@
+/datum/random_map/noise/ore/underdark
+ descriptor = "Underdark ore distribution map"
+ deep_val = 0.7
+ rare_val = 0.5
+
// Weakened version of Phoron spiders
/mob/living/simple_mob/animal/giant_spider/phorogenic/weak
maxHealth = 100
diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm
index 9cd83ea37d8..6d8e8206b1f 100644
--- a/maps/tether/tether-01-surface1.dmm
+++ b/maps/tether/tether-01-surface1.dmm
@@ -7759,7 +7759,7 @@
pixel_x = 32
},
/obj/structure/table/standard,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/tiled,
/area/storage/primary)
"amW" = (
@@ -28761,7 +28761,7 @@
dir = 8
},
/obj/structure/table/standard,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/tiled,
/area/crew_quarters/visitor_laundry)
"aWW" = (
@@ -33813,7 +33813,7 @@
d2 = 8;
icon_state = "4-8"
},
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/tiled,
/area/crew_quarters/locker)
"hTw" = (
diff --git a/maps/tether/tether-02-surface2.dmm b/maps/tether/tether-02-surface2.dmm
index f67738972f1..660a826ec62 100644
--- a/maps/tether/tether-02-surface2.dmm
+++ b/maps/tether/tether-02-surface2.dmm
@@ -10172,9 +10172,15 @@
d2 = 2;
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 6
+ },
/turf/simulated/floor/tiled/dark,
/area/tether/surfacebase/security/warden)
"apL" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
/turf/simulated/floor/tiled/dark,
/area/tether/surfacebase/security/warden)
"apM" = (
@@ -10184,19 +10190,29 @@
req_one_access = list()
},
/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
/turf/simulated/floor/tiled/dark,
/area/tether/surfacebase/security/warden)
"apN" = (
/turf/simulated/floor/tiled,
/area/tether/surfacebase/security/evastorage)
"apO" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/structure/cable/green{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
+ },
/turf/simulated/floor/tiled,
/area/tether/surfacebase/security/evastorage)
"apP" = (
@@ -10703,6 +10719,9 @@
d2 = 8;
icon_state = "1-8"
},
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 1
+ },
/turf/simulated/floor/tiled/dark,
/area/tether/surfacebase/security/warden)
"aqM" = (
@@ -10711,6 +10730,9 @@
/obj/item/device/radio{
pixel_x = -4
},
+/obj/machinery/atmospherics/unary/vent_pump/on{
+ dir = 4
+ },
/turf/simulated/floor/tiled/dark,
/area/tether/surfacebase/security/warden)
"aqN" = (
@@ -11238,6 +11260,8 @@
/obj/effect/floor_decal/corner/red/border{
dir = 8
},
+/obj/item/clothing/shoes/magboots,
+/obj/item/clothing/shoes/magboots,
/turf/simulated/floor/tiled,
/area/tether/surfacebase/security/evastorage)
"arK" = (
@@ -13264,7 +13288,7 @@
/obj/machinery/recharger,
/obj/item/weapon/storage/toolbox/mechanical,
/obj/random/drinkbottle,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/lower/bar)
"avg" = (
@@ -22134,7 +22158,7 @@
/obj/item/device/taperecorder{
pixel_x = -3
},
-/obj/item/device/paicard{
+/obj/random/paicard{
pixel_x = 4
},
/obj/item/weapon/circuitboard/teleporter,
@@ -31053,7 +31077,7 @@
/obj/structure/sign/painting/public{
pixel_x = -30
},
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/wood,
/area/tether/surfacebase/reading_room)
"biK" = (
@@ -31624,7 +31648,7 @@
pixel_x = -23
},
/obj/random/junk,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/plating,
/area/maintenance/lower/atmos)
"bkE" = (
@@ -32894,6 +32918,15 @@
/obj/structure/table/rack,
/turf/simulated/floor/plating,
/area/maintenance/lower/south)
+"dea" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/security/evastorage)
"dio" = (
/obj/structure/closet/crate,
/obj/random/maintenance/clean,
@@ -32974,6 +33007,15 @@
},
/turf/simulated/floor/tiled/dark,
/area/chapel/main)
+"dXC" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/dark,
+/area/tether/surfacebase/security/warden)
"dXJ" = (
/obj/structure/railing,
/obj/structure/railing{
@@ -33764,6 +33806,15 @@
},
/turf/simulated/floor/plating,
/area/maintenance/lower/rnd)
+"lGN" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/dark,
+/area/tether/surfacebase/security/warden)
"lJc" = (
/obj/effect/floor_decal/borderfloor{
dir = 1
@@ -34972,6 +35023,12 @@
/obj/effect/floor_decal/techfloor,
/turf/simulated/floor/tiled/techfloor/grid,
/area/ai)
+"wEf" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/dark,
+/area/tether/surfacebase/security/warden)
"wIA" = (
/obj/structure/cable/cyan,
/obj/machinery/power/apc{
@@ -44152,8 +44209,8 @@ alo
amr
anq
aox
-apL
-apL
+dXC
+wEf
arH
asH
ann
@@ -44294,7 +44351,7 @@ alp
ams
ano
aoy
-apL
+lGN
aqN
arI
asI
@@ -44578,7 +44635,7 @@ alr
amu
anr
aoz
-apN
+dea
aqO
arJ
asJ
diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm
index be5642fd3b4..a9270e4a072 100644
--- a/maps/tether/tether-03-surface3.dmm
+++ b/maps/tether/tether-03-surface3.dmm
@@ -557,6 +557,7 @@
/obj/machinery/status_display{
pixel_x = -32
},
+/obj/item/weapon/gun/energy/mouseray/medical,
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/storage)
"aaT" = (
@@ -1989,7 +1990,7 @@
/obj/effect/floor_decal/spline/plain{
dir = 5
},
-/obj/structure/flora/pottedplant/stoutbush,
+/obj/structure/closet/athletic_swimwear,
/turf/simulated/floor/tiled/freezer,
/area/crew_quarters/pool)
"acZ" = (
@@ -2455,9 +2456,6 @@
/obj/effect/floor_decal/steeldecal/steel_decals6{
dir = 1
},
-/obj/machinery/door/firedoor/glass/hidden/steel{
- dir = 1
- },
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/admin)
"adD" = (
@@ -2467,9 +2465,6 @@
/obj/effect/floor_decal/steeldecal/steel_decals6{
dir = 4
},
-/obj/machinery/door/firedoor/glass/hidden/steel{
- dir = 1
- },
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/admin)
"adE" = (
@@ -4090,9 +4085,12 @@
/turf/simulated/floor/tiled,
/area/rnd/xenobiology/xenoflora_storage)
"aga" = (
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/white,
-/area/tether/surfacebase/medical/uppersouthstairwell)
+/area/tether/surfacebase/medical/admin)
"agb" = (
/obj/structure/cable/green{
d1 = 4;
@@ -8328,7 +8326,7 @@
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 8
},
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/wood,
/area/crew_quarters/recreation_area)
"anb" = (
@@ -9173,23 +9171,14 @@
/turf/simulated/floor/tiled,
/area/tether/surfacebase/surface_three_hall)
"aoD" = (
-/obj/machinery/firealarm{
- layer = 3.3;
- pixel_x = 4;
- pixel_y = 26
+/obj/structure/window/reinforced{
+ dir = 8
},
-/obj/effect/floor_decal/borderfloor{
+/obj/structure/disposalpipe/junction{
dir = 1
},
-/obj/effect/floor_decal/corner/mauve/border{
- dir = 1
- },
-/obj/effect/floor_decal/steeldecal/steel_decals7{
- dir = 4
- },
-/obj/effect/floor_decal/steeldecal/steel_decals7,
-/turf/simulated/floor/tiled,
-/area/tether/surfacebase/surface_three_hall)
+/turf/simulated/floor/tiled/white,
+/area/tether/surfacebase/medical/admin)
"aoE" = (
/obj/structure/sign/directions/evac{
dir = 1
@@ -9784,7 +9773,7 @@
/obj/random/maintenance/medical,
/obj/random/maintenance/clean,
/obj/random/maintenance/clean,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/plating,
/area/tether/surfacebase/surface_three_hall)
"apA" = (
@@ -19968,6 +19957,7 @@
/obj/item/weapon/book/manual/resleeving,
/obj/item/weapon/book/manual/ripley_build_and_repair,
/obj/item/weapon/book/manual/robotics_cyborgs,
+/obj/item/weapon/book/manual/robotics_manual,
/obj/item/weapon/book/manual/rust_engine,
/obj/item/weapon/book/manual/security_space_law,
/obj/item/weapon/book/manual/standard_operating_procedure,
@@ -23186,12 +23176,14 @@
/turf/simulated/floor/tiled,
/area/tether/surfacebase/shuttle_pad)
"aMd" = (
-/obj/structure/window/reinforced{
- dir = 8
+/obj/effect/floor_decal/borderfloorwhite,
+/obj/effect/floor_decal/corner/paleblue/border,
+/obj/structure/disposalpipe/segment{
+ dir = 8;
+ icon_state = "pipe-c"
},
-/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/white,
-/area/tether/surfacebase/medical/uppersouthstairwell)
+/area/tether/surfacebase/medical/admin)
"aMe" = (
/obj/structure/cable/orange{
d2 = 2;
@@ -23990,14 +23982,24 @@
/turf/simulated/floor/tiled/monotile,
/area/tether/surfacebase/shuttle_pad)
"aNH" = (
-/obj/structure/window/reinforced{
- dir = 8
+/obj/machinery/firealarm{
+ layer = 3.3;
+ pixel_x = 4;
+ pixel_y = 26
},
-/obj/structure/disposalpipe/junction{
+/obj/effect/floor_decal/borderfloor{
dir = 1
},
-/turf/simulated/floor/tiled/white,
-/area/tether/surfacebase/medical/uppersouthstairwell)
+/obj/effect/floor_decal/corner/mauve/border{
+ dir = 1
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7{
+ dir = 4
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7,
+/obj/machinery/atmospherics/unary/vent_pump/on,
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/surface_three_hall)
"aNI" = (
/obj/effect/floor_decal/steeldecal/steel_decals4{
dir = 6
@@ -25055,6 +25057,21 @@
/obj/structure/sign/department/xenolab,
/turf/simulated/wall,
/area/rnd/outpost/xenobiology/outpost_breakroom)
+"aPU" = (
+/obj/structure/disposalpipe/segment{
+ dir = 8
+ },
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/surface_three_hall)
"aPV" = (
/obj/machinery/light{
dir = 4
@@ -25084,6 +25101,23 @@
},
/turf/simulated/floor/tiled,
/area/rnd/outpost/xenobiology/outpost_breakroom)
+"aPZ" = (
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/mauve/border,
+/obj/effect/floor_decal/steeldecal/steel_decals7{
+ dir = 1
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7{
+ dir = 8
+ },
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/surface_three_hall)
+"aQa" = (
+/turf/simulated/wall,
+/area/rnd/research/researchdivision)
"aQb" = (
/obj/machinery/papershredder,
/turf/simulated/floor/wood,
@@ -25906,15 +25940,6 @@
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/carpet/blue,
/area/tether/surfacebase/security/breakroom)
-"aRK" = (
-/obj/effect/floor_decal/borderfloorwhite,
-/obj/effect/floor_decal/corner/paleblue/border,
-/obj/structure/disposalpipe/segment{
- dir = 8;
- icon_state = "pipe-c"
- },
-/turf/simulated/floor/tiled/white,
-/area/tether/surfacebase/medical/uppersouthstairwell)
"aRL" = (
/obj/machinery/washing_machine,
/turf/simulated/floor/tiled/white,
@@ -31643,10 +31668,10 @@
dir = 1;
fancy_shuttle_tag = "tourbus"
},
-/obj/effect/fancy_shuttle_floor_preview/tourbus{
+/obj/machinery/atmospherics/unary/engine/fancy_shuttle{
dir = 1
},
-/obj/machinery/atmospherics/unary/engine/fancy_shuttle{
+/obj/effect/fancy_shuttle_floor_preview/tourbus{
dir = 1
},
/turf/simulated/wall/fancy_shuttle{
@@ -36263,6 +36288,7 @@
"bkS" = (
/obj/structure/table/standard,
/obj/item/weapon/book/manual/robotics_cyborgs,
+/obj/item/weapon/book/manual/robotics_manual,
/obj/item/clothing/glasses/omnihud/rnd,
/obj/machinery/light{
dir = 8
@@ -38696,18 +38722,6 @@
},
/turf/simulated/floor/tiled,
/area/rnd/outpost/xenobiology/outpost_main)
-"eGv" = (
-/obj/effect/floor_decal/fancy_shuttle{
- fancy_shuttle_tag = "tourbus";
- name = "tourbus"
- },
-/obj/machinery/atmospherics/binary/pump,
-/obj/structure/cable/green{
- dir = 1;
- icon_state = "1-2"
- },
-/turf/simulated/floor/tiled,
-/area/shuttle/tourbus/general)
"eHk" = (
/obj/structure/sign/nosmoking_2{
pixel_x = 29
@@ -39271,9 +39285,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/yellow{
dir = 9
},
-/obj/machinery/power/terminal{
- dir = 4
- },
/obj/machinery/light,
/obj/machinery/power/apc{
name = "south bump";
@@ -40243,7 +40254,7 @@
/turf/simulated/wall,
/area/tether/surfacebase/security/iaa/officeb)
"jZe" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/yellow,
+/obj/machinery/atmospherics/binary/pump,
/turf/simulated/floor/tiled/monotile,
/area/tether/surfacebase/shuttle_pad)
"kar" = (
@@ -40771,7 +40782,7 @@
/area/tether/surfacebase/security/hos)
"lHr" = (
/obj/structure/table/woodentable,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/wood,
/area/tether/surfacebase/entertainment)
"lIe" = (
@@ -42478,6 +42489,13 @@
/obj/machinery/vending/fitness,
/turf/simulated/floor/tiled,
/area/tether/surfacebase/cafeteria)
+"rwb" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/obj/structure/flora/pottedplant/stoutbush,
+/turf/simulated/floor/tiled/freezer,
+/area/crew_quarters/pool)
"rxh" = (
/obj/machinery/atmospherics/pipe/simple/hidden/yellow{
dir = 10
@@ -52106,7 +52124,7 @@ fkn
aWF
aiJ
akT
-alE
+rwb
sSK
amN
amN
@@ -52857,11 +52875,11 @@ aHI
aHj
aTh
aJN
-aJW
+aQa
aKR
aFW
aMz
-aNF
+aJW
bkp
aKk
bkP
@@ -52999,11 +53017,11 @@ aBL
ahf
aJe
aJO
-aJW
+aQa
aKS
aLX
aMP
-aNF
+aJW
bkq
bkE
bkQ
@@ -53141,11 +53159,11 @@ apK
aCe
aJf
aJP
-aJW
+aQa
aLq
aLY
aMQ
-aNF
+aJW
bkr
bkF
bkR
@@ -53287,11 +53305,11 @@ aqS
aLr
aLZ
aLr
-aqS
+aJW
bks
bkG
bks
-aqS
+aNF
aac
aac
aac
@@ -55989,7 +56007,7 @@ xOa
aXa
aXa
kcC
-eGv
+sJY
sJY
fEX
gCZ
@@ -59619,10 +59637,10 @@ iLq
aSU
ahQ
aTb
+aTb
aga
+aoD
aMd
-aNH
-aRK
aSn
aoo
aXU
@@ -59766,9 +59784,9 @@ bkd
bkc
aRG
aSn
-aoD
-aXU
-asr
+aNH
+aPU
+aPZ
aio
ajn
akg
diff --git a/maps/tether/tether-04-transit.dmm b/maps/tether/tether-04-transit.dmm
index 72748da792d..02b5d5e84de 100644
--- a/maps/tether/tether-04-transit.dmm
+++ b/maps/tether/tether-04-transit.dmm
@@ -419,6 +419,10 @@
"Dz" = (
/turf/simulated/wall/r_wall,
/area/maintenance/tether_midpoint)
+"El" = (
+/obj/structure/closet/firecloset,
+/turf/simulated/floor/plating,
+/area/maintenance/tether_midpoint)
"Et" = (
/obj/structure/grille,
/obj/structure/window/reinforced/full,
@@ -683,7 +687,7 @@
/area/tether/midpoint)
"Ud" = (
/obj/structure/table/woodentable,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/midpoint_glass/reinf,
/area/tether/midpoint)
"Ui" = (
@@ -9356,7 +9360,7 @@ Dz
iK
pM
pM
-pM
+El
Dz
oN
yi
diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm
index 62779227b6b..2396932f10e 100644
--- a/maps/tether/tether-05-station1.dmm
+++ b/maps/tether/tether-05-station1.dmm
@@ -650,16 +650,9 @@
/turf/simulated/floor/tiled,
/area/hallway/station/atrium)
"abn" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/glass{
- name = "Long-Range Teleporter Access"
- },
-/obj/structure/cable/green{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/turf/simulated/floor/tiled/monotile,
+/obj/machinery/door/airlock/maintenance/common,
+/obj/machinery/door/firedoor/glass,
+/turf/simulated/floor,
/area/teleporter/departing)
"abo" = (
/obj/effect/floor_decal/corner_steel_grid{
@@ -1032,16 +1025,15 @@
/turf/simulated/floor/tiled,
/area/hallway/station/atrium)
"abU" = (
-/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/glass{
name = "Long-Range Teleporter Access"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
},
+/obj/machinery/door/firedoor/glass,
/turf/simulated/floor/tiled/monotile,
/area/teleporter/departing)
"abV" = (
@@ -1120,7 +1112,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/tiled,
/area/teleporter/departing)
"acc" = (
@@ -1296,9 +1288,17 @@
/turf/simulated/floor,
/area/maintenance/station/exploration)
"act" = (
-/obj/machinery/door/airlock/maintenance/common,
-/obj/machinery/door/firedoor,
-/turf/simulated/floor,
+/obj/machinery/door/airlock/glass{
+ name = "Long-Range Teleporter Access"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/door/firedoor/glass,
+/turf/simulated/floor/tiled/monotile,
/area/teleporter/departing)
"acu" = (
/obj/machinery/atmospherics/pipe/simple/hidden/black{
@@ -2519,6 +2519,16 @@
/obj/structure/closet/emcloset,
/turf/simulated/floor/tiled,
/area/quartermaster/foyer)
+"aed" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/obj/machinery/door/airlock{
+ name = "Docking Arm Storage"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/door/firedoor/glass,
+/turf/simulated/floor/tiled/steel_grid,
+/area/tether/station/dock_two)
"aee" = (
/obj/machinery/atmospherics/pipe/simple/hidden/universal,
/obj/structure/railing{
@@ -2545,6 +2555,21 @@
},
/turf/simulated/floor/tiled/monotile,
/area/tether/exploration)
+"aeg" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 8
+ },
+/obj/machinery/door/airlock/glass_mining{
+ name = "Delivery Office";
+ req_access = list(50);
+ req_one_access = list()
+ },
+/obj/machinery/door/firedoor/glass,
+/turf/simulated/floor/tiled/steel_grid,
+/area/quartermaster/delivery)
"aeh" = (
/obj/structure/cable{
d1 = 1;
@@ -2627,6 +2652,50 @@
"aen" = (
/turf/simulated/floor/tiled,
/area/engineering/workshop)
+"aeo" = (
+/obj/structure/plasticflaps,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/machinery/conveyor{
+ dir = 8;
+ id = "crate-belt"
+ },
+/obj/machinery/door/window/brigdoor/westleft{
+ id = "mailing-door";
+ name = "Mail Room";
+ req_access = list(50)
+ },
+/obj/machinery/door/firedoor/glass,
+/turf/simulated/floor/plating,
+/area/quartermaster/delivery)
+"aep" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/table/steel_reinforced,
+/obj/machinery/door/window/northright{
+ dir = 2;
+ name = "Mailing Room";
+ req_access = list(50)
+ },
+/obj/machinery/door/firedoor/glass,
+/turf/simulated/floor/tiled,
+/area/quartermaster/foyer)
+"aeq" = (
+/obj/structure/table/steel_reinforced,
+/obj/machinery/door/window/northright{
+ dir = 2;
+ name = "Cargo Ordering";
+ req_access = list(50)
+ },
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/door/firedoor/glass,
+/turf/simulated/floor/tiled,
+/area/quartermaster/office)
"aer" = (
/obj/machinery/atmospherics/pipe/simple/hidden/red{
dir = 4
@@ -2690,6 +2759,46 @@
},
/turf/simulated/floor/tiled,
/area/engineering/engine_monitoring)
+"aeu" = (
+/obj/machinery/door/airlock/glass_mining{
+ name = "Delivery Office";
+ req_access = list(50);
+ req_one_access = list()
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/door/firedoor/glass,
+/turf/simulated/floor/tiled,
+/area/quartermaster/office)
+"aev" = (
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/door/airlock/mining{
+ name = "Quartermaster";
+ req_access = list(41);
+ req_one_access = list()
+ },
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/door/firedoor/glass,
+/turf/simulated/floor/tiled/steel_grid,
+/area/quartermaster/qm)
"aew" = (
/obj/structure/grille,
/obj/structure/window/reinforced/full,
@@ -2715,6 +2824,18 @@
},
/turf/simulated/floor,
/area/engineering/engine_monitoring)
+"aex" = (
+/obj/machinery/door/airlock/maintenance/cargo{
+ req_access = list(50);
+ req_one_access = list(48)
+ },
+/obj/machinery/door/firedoor/glass,
+/turf/simulated/floor,
+/area/quartermaster/delivery)
+"aey" = (
+/obj/machinery/smartfridge/sheets/persistent_lossy,
+/turf/simulated/wall,
+/area/quartermaster/belterdock/gear)
"aez" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
dir = 1
@@ -2801,6 +2922,48 @@
/obj/structure/catwalk,
/turf/simulated/floor,
/area/maintenance/station/eng_lower)
+"aeF" = (
+/obj/machinery/door/airlock/glass_mining{
+ name = "Mining Operations";
+ req_access = list(31);
+ req_one_access = list()
+ },
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/door/firedoor/glass,
+/obj/structure/disposalpipe/segment,
+/turf/simulated/floor/tiled/steel_grid,
+/area/quartermaster/belterdock/gear)
+"aeG" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/cable/green{
+ icon_state = "4-8"
+ },
+/obj/structure/window/reinforced/full,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/door/firedoor/glass,
+/turf/simulated/floor/plating,
+/area/quartermaster/belterdock/refinery)
+"aeH" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/structure/window/reinforced,
+/obj/machinery/door/firedoor/glass,
+/turf/simulated/floor/plating,
+/area/quartermaster/belterdock)
"aeK" = (
/obj/structure/cable/green{
d1 = 1;
@@ -2955,6 +3118,9 @@
fancy_shuttle_tag = "medbus";
name = "medbus"
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled,
/area/shuttle/medivac/general)
"afe" = (
@@ -9084,16 +9250,6 @@
},
/turf/simulated/floor/tiled,
/area/engineering/hallway)
-"avA" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/table/steel_reinforced,
-/obj/machinery/door/window/northright{
- dir = 2;
- name = "Mailing Room";
- req_access = list(50)
- },
-/turf/simulated/floor/tiled,
-/area/quartermaster/foyer)
"avB" = (
/obj/structure/disposalpipe/segment{
dir = 2;
@@ -14565,9 +14721,6 @@
"bnG" = (
/obj/machinery/door/airlock/glass,
/obj/machinery/atmospherics/pipe/simple/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/structure/cable/green{
icon_state = "1-2"
},
@@ -15164,6 +15317,14 @@
/obj/machinery/portable_atmospherics/canister/oxygen,
/turf/simulated/floor/tiled/dark,
/area/gateway/prep_room)
+"bIK" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/simulated/wall/fancy_shuttle{
+ fancy_shuttle_tag = "medbus"
+ },
+/area/shuttle/medivac/engines)
"bIO" = (
/obj/machinery/exonet_node{
anchored = 1
@@ -15345,6 +15506,7 @@
/obj/machinery/light{
dir = 1
},
+/obj/item/clothing/shoes/magboots,
/turf/simulated/floor/tiled,
/area/quartermaster/belterdock/gear)
"bPl" = (
@@ -15814,8 +15976,8 @@
/obj/machinery/atmospherics/pipe/simple/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/hidden/yellow{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/hidden/fuel{
+ dir = 8
},
/turf/simulated/wall/fancy_shuttle{
fancy_shuttle_tag = "secbus"
@@ -16302,6 +16464,16 @@
},
/turf/simulated/floor,
/area/maintenance/cargo)
+"czD" = (
+/obj/effect/floor_decal/fancy_shuttle{
+ fancy_shuttle_tag = "medbus";
+ name = "medbus"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/tiled,
+/area/shuttle/medivac/general)
"czS" = (
/obj/structure/cable/green{
d1 = 1;
@@ -16452,8 +16624,8 @@
/obj/machinery/atmospherics/pipe/simple/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/hidden/yellow{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/hidden/fuel{
+ dir = 8
},
/turf/simulated/wall/fancy_shuttle{
fancy_shuttle_tag = "medbus"
@@ -17229,11 +17401,11 @@
d2 = 8;
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/yellow,
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "medbus";
name = "medbus"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/fuel,
/turf/simulated/floor/tiled,
/area/shuttle/medivac/engines)
"dqh" = (
@@ -17770,9 +17942,6 @@
d2 = 8;
icon_state = "0-8"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/yellow{
- dir = 10
- },
/obj/structure/table/standard,
/obj/item/weapon/tank/phoron,
/obj/random/medical,
@@ -17780,11 +17949,11 @@
fancy_shuttle_tag = "medbus";
name = "medbus"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/fuel{
+ dir = 10
+ },
/turf/simulated/floor/tiled,
/area/shuttle/medivac/engines)
-"dSp" = (
-/turf/simulated/wall,
-/area/mine/explored/upper_level)
"dSJ" = (
/obj/machinery/disposal/deliveryChute,
/obj/structure/disposalpipe/trunk{
@@ -18404,23 +18573,6 @@
},
/turf/simulated/floor/tiled/dark,
/area/tcommsat/computer)
-"eIy" = (
-/obj/machinery/door/airlock/glass_mining{
- name = "Mining Operations";
- req_access = list(31);
- req_one_access = list()
- },
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/door/firedoor/glass,
-/obj/structure/disposalpipe/segment,
-/turf/simulated/floor/tiled/steel_grid,
-/area/quartermaster/belterdock)
"eIJ" = (
/obj/structure/cable/cyan{
d1 = 1;
@@ -18604,7 +18756,7 @@
/turf/simulated/floor/plating,
/area/tether/station/dock_two)
"eVl" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/yellow{
+/obj/machinery/atmospherics/pipe/simple/hidden/fuel{
dir = 6
},
/turf/simulated/wall/fancy_shuttle/low{
@@ -19398,11 +19550,6 @@
/turf/simulated/floor/tiled/steel,
/area/shuttle/excursion/cargo)
"fNX" = (
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
/obj/machinery/door/airlock/maintenance/common{
name = "Engine Access";
req_one_access = list(1,67)
@@ -20047,14 +20194,6 @@
/area/quartermaster/foyer)
"gqN" = (
/obj/machinery/atmospherics/pipe/simple/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- d1 = 2;
- d2 = 4;
- icon_state = "2-4"
- },
/obj/structure/cable/green{
icon_state = "1-2"
},
@@ -20062,6 +20201,9 @@
fancy_shuttle_tag = "medbus";
name = "medbus"
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/simulated/floor/tiled,
/area/shuttle/medivac/general)
"gsz" = (
@@ -21085,10 +21227,12 @@
/area/maintenance/substation/cargo)
"hsf" = (
/obj/machinery/shipsensors/fancy_shuttle,
-/turf/simulated/wall/fancy_shuttle{
- fancy_shuttle_tag = "secbus"
+/turf/simulated/wall/fancy_shuttle/nondense{
+ fancy_shuttle_tag = "secbus";
+ nitrogen = 0;
+ oxygen = 0
},
-/area/shuttle/securiship/cockpit)
+/area/shuttle/securiship/general)
"hsq" = (
/obj/structure/catwalk,
/obj/random/junk,
@@ -22623,14 +22767,10 @@
/obj/effect/floor_decal/corner/brown/bordercorner2{
dir = 4
},
+/obj/item/clothing/shoes/magboots,
/turf/simulated/floor/tiled,
/area/quartermaster/belterdock/gear)
"iEn" = (
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
/obj/structure/cable{
icon_state = "1-2"
},
@@ -22914,11 +23054,6 @@
/turf/simulated/floor/airless,
/area/shuttle/belter)
"iVi" = (
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
/obj/structure/cable{
icon_state = "2-8"
},
@@ -23202,6 +23337,7 @@
/obj/effect/floor_decal/corner/brown/border{
dir = 5
},
+/obj/item/clothing/shoes/magboots,
/turf/simulated/floor/tiled,
/area/quartermaster/belterdock/gear)
"jnG" = (
@@ -23914,15 +24050,6 @@
/area/tcommsat/entrance{
name = "\improper Telecomms Entrance"
})
-"jYg" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden,
-/obj/machinery/door/airlock{
- name = "Docking Arm Storage"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/turf/simulated/floor/tiled/steel_grid,
-/area/tether/station/dock_two)
"jYB" = (
/obj/machinery/teleport/station{
dir = 2
@@ -24208,13 +24335,16 @@
/obj/structure/fuel_port{
pixel_y = 32
},
-/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{
- dir = 1
- },
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "medbus";
name = "medbus"
},
+/obj/machinery/atmospherics/pipe/manifold/hidden/fuel{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled,
/area/shuttle/medivac/engines)
"kjA" = (
@@ -24589,6 +24719,9 @@
fancy_shuttle_tag = "secbus";
name = "secbus"
},
+/obj/structure/cable/green{
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled,
/area/shuttle/securiship/general)
"kzY" = (
@@ -24700,9 +24833,6 @@
/area/tether/exploration/hallway)
"kEt" = (
/obj/machinery/atmospherics/pipe/simple/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/structure/cable/green{
icon_state = "1-2"
},
@@ -25601,8 +25731,8 @@
/turf/simulated/floor/tiled/white,
/area/tether/station/dock_two)
"lof" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/yellow{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/hidden/fuel{
+ dir = 8
},
/turf/simulated/wall/fancy_shuttle{
fancy_shuttle_tag = "medbus"
@@ -25924,24 +26054,6 @@
},
/turf/simulated/floor/tiled,
/area/tether/exploration/crew)
-"lzt" = (
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/grille,
-/obj/structure/cable/green{
- icon_state = "4-8"
- },
-/obj/structure/window/reinforced/full,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/turf/simulated/floor/plating,
-/area/quartermaster/belterdock/refinery)
"lzB" = (
/obj/structure/closet/crate,
/obj/random/maintenance/engineering,
@@ -26133,14 +26245,6 @@
/area/tcomsat{
name = "\improper Telecomms Lobby"
})
-"lHr" = (
-/obj/machinery/door/airlock/maintenance/cargo{
- req_access = list(50);
- req_one_access = list(48)
- },
-/obj/machinery/door/firedoor/border_only,
-/turf/simulated/floor,
-/area/quartermaster/delivery)
"lHv" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/obj/effect/floor_decal/borderfloor{
@@ -26598,7 +26702,7 @@
/obj/random/maintenance/clean,
/obj/random/maintenance/clean,
/obj/random/junk,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor,
/area/maintenance/station/exploration)
"lVJ" = (
@@ -27250,22 +27354,6 @@
/area/tcomsat{
name = "\improper Telecomms Lobby"
})
-"mFS" = (
-/obj/structure/plasticflaps,
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/machinery/conveyor{
- dir = 8;
- id = "crate-belt"
- },
-/obj/machinery/door/window/brigdoor/westleft{
- id = "mailing-door";
- name = "Mail Room";
- req_access = list(50)
- },
-/turf/simulated/floor/plating,
-/area/quartermaster/delivery)
"mHR" = (
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 8
@@ -27303,12 +27391,6 @@
/turf/simulated/floor/tiled,
/area/tether/station/dock_one)
"mIV" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/yellow{
- dir = 6
- },
-/obj/structure/cable/green{
- icon_state = "4-8"
- },
/obj/structure/cable{
icon_state = "2-4"
},
@@ -27319,6 +27401,12 @@
fancy_shuttle_tag = "secbus";
name = "secbus"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/fuel{
+ dir = 6
+ },
+/obj/structure/cable/green{
+ icon_state = "1-8"
+ },
/turf/simulated/floor/tiled,
/area/shuttle/securiship/engines)
"mJd" = (
@@ -27519,21 +27607,6 @@
},
/turf/simulated/shuttle/plating/airless/carry,
/area/shuttle/belter)
-"mRX" = (
-/obj/structure/table/steel_reinforced,
-/obj/machinery/door/window/northright{
- dir = 2;
- name = "Cargo Ordering";
- req_access = list(50)
- },
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/turf/simulated/floor/tiled,
-/area/quartermaster/office)
"mTK" = (
/obj/machinery/door/airlock/glass_external,
/obj/effect/map_helper/airlock/door/int_door,
@@ -27759,10 +27832,10 @@
/turf/simulated/floor/tiled,
/area/tether/station/dock_two)
"ncN" = (
-/obj/machinery/atmospherics/pipe/manifold/hidden/yellow,
/obj/machinery/atmospherics/pipe/simple/hidden{
dir = 10
},
+/obj/machinery/atmospherics/pipe/manifold/hidden/fuel,
/turf/simulated/wall/fancy_shuttle{
fancy_shuttle_tag = "secbus"
},
@@ -28155,11 +28228,6 @@
req_access = list();
req_one_access = list(11,67)
},
-/obj/structure/cable{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
- },
/obj/structure/cable{
icon_state = "0-4"
},
@@ -28167,6 +28235,9 @@
fancy_shuttle_tag = "medbus";
name = "medbus"
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/simulated/floor/tiled,
/area/shuttle/medivac/engines)
"nyL" = (
@@ -28192,7 +28263,7 @@
/turf/simulated/floor/tiled,
/area/quartermaster/belterdock/gear)
"nAr" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/yellow{
+/obj/machinery/atmospherics/pipe/simple/hidden/fuel{
dir = 10
},
/turf/simulated/wall/fancy_shuttle/low{
@@ -28202,9 +28273,6 @@
},
/area/shuttle/securiship/engines)
"nAx" = (
-/obj/machinery/atmospherics/portables_connector{
- dir = 4
- },
/obj/machinery/portable_atmospherics/canister/phoron,
/obj/machinery/light{
dir = 8
@@ -28213,6 +28281,9 @@
fancy_shuttle_tag = "medbus";
name = "medbus"
},
+/obj/machinery/atmospherics/portables_connector/fuel{
+ dir = 4
+ },
/turf/simulated/floor/tiled,
/area/shuttle/medivac/engines)
"nAA" = (
@@ -28243,7 +28314,7 @@
layer = 2.9
},
/obj/random/junk,
-/obj/item/device/paicard,
+/obj/random/paicard,
/turf/simulated/floor/plating,
/area/maintenance/station/cargo)
"nCS" = (
@@ -28827,8 +28898,8 @@
/obj/machinery/atmospherics/pipe/simple/hidden{
dir = 6
},
-/obj/machinery/atmospherics/pipe/simple/hidden/yellow{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/hidden/fuel{
+ dir = 8
},
/turf/simulated/wall/fancy_shuttle{
fancy_shuttle_tag = "medbus"
@@ -29230,21 +29301,6 @@
},
/turf/simulated/floor/tiled,
/area/shuttle/securiship/general)
-"oUP" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 8
- },
-/obj/machinery/door/airlock/glass_mining{
- name = "Delivery Office";
- req_access = list(50);
- req_one_access = list()
- },
-/obj/machinery/door/firedoor/border_only,
-/turf/simulated/floor/tiled/steel_grid,
-/area/quartermaster/delivery)
"oWu" = (
/obj/structure/cable/green{
icon_state = "4-8"
@@ -29606,10 +29662,6 @@
oxygen = 0
},
/area/shuttle/securiship/engines)
-"ptc" = (
-/obj/machinery/smartfridge/sheets/persistent_lossy,
-/turf/simulated/wall,
-/area/quartermaster/belterdock)
"pty" = (
/obj/machinery/conveyor{
dir = 8;
@@ -30136,7 +30188,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/hidden/yellow,
+/obj/machinery/atmospherics/pipe/manifold/hidden/fuel,
/turf/simulated/wall/fancy_shuttle{
fancy_shuttle_tag = "medbus"
},
@@ -31095,8 +31147,8 @@
/turf/simulated/floor,
/area/storage/emergency_storage/emergency4)
"rkl" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/yellow{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/hidden/fuel{
+ dir = 8
},
/turf/simulated/wall/fancy_shuttle{
fancy_shuttle_tag = "secbus"
@@ -31166,7 +31218,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden{
dir = 5
},
-/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{
+/obj/machinery/atmospherics/pipe/manifold/hidden/fuel{
dir = 1
},
/turf/simulated/wall/fancy_shuttle{
@@ -31392,6 +31444,14 @@
/obj/structure/plasticflaps,
/turf/simulated/floor,
/area/quartermaster/delivery)
+"rEr" = (
+/obj/structure/cable/green{
+ icon_state = "1-2"
+ },
+/turf/simulated/wall/fancy_shuttle{
+ fancy_shuttle_tag = "secbus"
+ },
+/area/shuttle/securiship/general)
"rFi" = (
/obj/structure/cable/green{
d1 = 1;
@@ -32000,9 +32060,6 @@
req_one_access = list(5,67)
},
/obj/machinery/atmospherics/pipe/simple/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/structure/cable/green{
icon_state = "1-2"
},
@@ -32508,7 +32565,7 @@
/turf/simulated/floor/tiled,
/area/tether/exploration/hallway)
"sOn" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/yellow{
+/obj/machinery/atmospherics/pipe/simple/hidden/fuel{
dir = 6
},
/turf/simulated/wall/fancy_shuttle{
@@ -32537,6 +32594,14 @@
},
/turf/simulated/floor/tiled,
/area/quartermaster/belterdock/refinery)
+"sRA" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/simulated/wall/fancy_shuttle{
+ fancy_shuttle_tag = "medbus"
+ },
+/area/shuttle/medivac/general)
"sRG" = (
/obj/structure/cable{
d1 = 1;
@@ -32751,6 +32816,9 @@
fancy_shuttle_tag = "medbus";
name = "medbus"
},
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
/turf/simulated/floor/tiled,
/area/shuttle/medivac/general)
"teI" = (
@@ -32784,9 +32852,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden{
dir = 6
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/structure/cable/green{
d1 = 2;
d2 = 4;
@@ -32796,6 +32861,9 @@
fancy_shuttle_tag = "medbus";
name = "medbus"
},
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
/turf/simulated/floor/tiled,
/area/shuttle/medivac/general)
"tgr" = (
@@ -33344,6 +33412,9 @@
fancy_shuttle_tag = "secbus";
name = "secbus"
},
+/obj/structure/cable/green{
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled,
/area/shuttle/securiship/general)
"tGV" = (
@@ -33522,9 +33593,6 @@
/turf/simulated/floor/tiled,
/area/quartermaster/belterdock)
"tOn" = (
-/obj/structure/cable/green{
- icon_state = "4-8"
- },
/obj/structure/cable{
d1 = 1;
d2 = 4;
@@ -33537,6 +33605,11 @@
fancy_shuttle_tag = "secbus";
name = "secbus"
},
+/obj/structure/cable/green{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
/turf/simulated/floor/tiled,
/area/shuttle/securiship/general)
"tOp" = (
@@ -33550,11 +33623,6 @@
/turf/simulated/floor/tiled,
/area/quartermaster/office)
"tOr" = (
-/obj/structure/cable/green{
- d1 = 2;
- d2 = 8;
- icon_state = "2-8"
- },
/obj/structure/cable{
icon_state = "2-8"
},
@@ -33760,6 +33828,9 @@
fancy_shuttle_tag = "medbus";
name = "medbus"
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled,
/area/shuttle/medivac/general)
"udq" = (
@@ -33775,9 +33846,6 @@
/area/maintenance/station/cargo)
"udG" = (
/obj/machinery/atmospherics/pipe/simple/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/structure/cable/green{
icon_state = "1-2"
},
@@ -33964,12 +34032,6 @@
oxygen = 0
},
/area/shuttle/medivac/cockpit)
-"usX" = (
-/obj/structure/grille,
-/obj/structure/window/reinforced/full,
-/obj/structure/window/reinforced,
-/turf/simulated/floor/plating,
-/area/quartermaster/belterdock)
"utf" = (
/obj/effect/floor_decal/industrial/warning/corner{
dir = 4
@@ -33996,14 +34058,14 @@
/turf/simulated/shuttle/wall,
/area/shuttle/belter)
"uvN" = (
-/obj/machinery/atmospherics/portables_connector{
- dir = 4
- },
/obj/machinery/portable_atmospherics/canister/phoron,
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "medbus";
name = "medbus"
},
+/obj/machinery/atmospherics/portables_connector/fuel{
+ dir = 4
+ },
/turf/simulated/floor/tiled,
/area/shuttle/medivac/engines)
"uxR" = (
@@ -34872,13 +34934,16 @@
/turf/simulated/floor/tiled,
/area/hallway/station/docks)
"vtg" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/yellow{
- dir = 9
- },
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "medbus";
name = "medbus"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/fuel{
+ dir = 9
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
/turf/simulated/floor/tiled,
/area/shuttle/medivac/engines)
"vtx" = (
@@ -35288,6 +35353,12 @@
fancy_shuttle_tag = "medbus";
name = "medbus"
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
/turf/simulated/floor/tiled,
/area/shuttle/medivac/general)
"vVA" = (
@@ -35413,13 +35484,16 @@
name = "secbus"
},
/obj/effect/map_helper/airlock/sensor/int_sensor,
+/obj/structure/cable/green{
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled,
/area/shuttle/securiship/general)
"waj" = (
/obj/machinery/atmospherics/pipe/simple/hidden{
dir = 9
},
-/obj/machinery/atmospherics/pipe/simple/hidden/yellow{
+/obj/machinery/atmospherics/pipe/simple/hidden/fuel{
dir = 10
},
/turf/simulated/wall/fancy_shuttle{
@@ -35483,19 +35557,16 @@
/area/quartermaster/belterdock/gear)
"weP" = (
/obj/machinery/atmospherics/pipe/simple/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/structure/cable/green{
icon_state = "1-4"
},
-/obj/machinery/atmospherics/binary/pump{
- dir = 4
- },
/obj/effect/floor_decal/fancy_shuttle{
fancy_shuttle_tag = "medbus";
name = "medbus"
},
+/obj/machinery/atmospherics/binary/pump/fuel{
+ dir = 4
+ },
/turf/simulated/floor/tiled,
/area/shuttle/medivac/engines)
"whg" = (
@@ -35674,7 +35745,7 @@
/turf/simulated/floor/tiled,
/area/tether/station/dock_two)
"wwJ" = (
-/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{
+/obj/machinery/atmospherics/pipe/manifold/hidden/fuel{
dir = 1
},
/turf/simulated/wall/fancy_shuttle{
@@ -35729,6 +35800,9 @@
fancy_shuttle_tag = "secbus";
name = "secbus"
},
+/obj/structure/cable/green{
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled,
/area/shuttle/securiship/general)
"wBw" = (
@@ -35748,6 +35822,7 @@
/obj/effect/floor_decal/corner/green/border,
/obj/machinery/light,
/obj/machinery/portable_atmospherics/canister/oxygen,
+/obj/item/weapon/storage/box/nifsofts_pilot,
/turf/simulated/floor/tiled,
/area/tether/exploration/pilot_office)
"wEF" = (
@@ -35866,11 +35941,6 @@
/turf/simulated/floor/tiled,
/area/quartermaster/belterdock/surface_mining_outpost_shuttle_hangar)
"wLR" = (
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
/obj/machinery/door/airlock/glass_security,
/obj/structure/cable{
icon_state = "1-2"
@@ -36164,29 +36234,6 @@
},
/turf/simulated/floor/grass,
/area/crew_quarters/heads/chief)
-"xbQ" = (
-/obj/machinery/door/airlock/glass_mining{
- name = "Delivery Office";
- req_access = list(50);
- req_one_access = list()
- },
-/obj/machinery/door/firedoor/border_only,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/structure/cable/green{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/turf/simulated/floor/tiled,
-/area/quartermaster/office)
"xcE" = (
/obj/structure/bed/chair/shuttle{
dir = 8
@@ -36239,6 +36286,14 @@
/obj/structure/sign/department/gravi,
/turf/simulated/wall/r_wall,
/area/engineering/hallway)
+"xfE" = (
+/obj/structure/cable/green{
+ icon_state = "1-2"
+ },
+/turf/simulated/wall/fancy_shuttle{
+ fancy_shuttle_tag = "secbus"
+ },
+/area/shuttle/securiship/engines)
"xfN" = (
/obj/structure/flora/pottedplant/stoutbush,
/obj/effect/floor_decal/borderfloor{
@@ -36455,22 +36510,6 @@
/obj/structure/closet,
/turf/simulated/floor/tiled,
/area/janitor)
-"xuh" = (
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/door/airlock/mining{
- name = "Quartermaster";
- req_access = list(41);
- req_one_access = list()
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/turf/simulated/floor/tiled/steel_grid,
-/area/quartermaster/qm)
"xur" = (
/turf/simulated/wall/r_wall,
/area/quartermaster/belterdock/refinery)
@@ -36732,12 +36771,6 @@
/turf/simulated/floor/tiled,
/area/hallway/station/docks)
"xMQ" = (
-/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{
- dir = 1
- },
-/obj/structure/cable/green{
- icon_state = "1-8"
- },
/obj/structure/cable{
d1 = 1;
d2 = 8;
@@ -36755,6 +36788,9 @@
fancy_shuttle_tag = "secbus";
name = "secbus"
},
+/obj/machinery/atmospherics/pipe/manifold/hidden/fuel{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
/area/shuttle/securiship/engines)
"xMZ" = (
@@ -37002,9 +37038,6 @@
/turf/simulated/floor/tiled,
/area/quartermaster/belterdock/surface_mining_outpost_shuttle_hangar)
"xZE" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/yellow{
- dir = 10
- },
/obj/structure/cable{
icon_state = "0-8"
},
@@ -37018,6 +37051,9 @@
fancy_shuttle_tag = "secbus";
name = "secbus"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/fuel{
+ dir = 10
+ },
/turf/simulated/floor/tiled,
/area/shuttle/securiship/engines)
"xZW" = (
@@ -37095,7 +37131,6 @@
/obj/structure/cable{
icon_state = "1-8"
},
-/obj/machinery/atmospherics/binary/pump,
/obj/machinery/light,
/obj/machinery/atmospherics/pipe/simple/hidden{
dir = 9
@@ -37104,6 +37139,7 @@
fancy_shuttle_tag = "secbus";
name = "secbus"
},
+/obj/machinery/atmospherics/binary/pump/fuel,
/turf/simulated/floor/tiled,
/area/shuttle/securiship/engines)
"ydT" = (
@@ -46797,7 +46833,7 @@ nbO
nsz
awo
iYG
-lHr
+aex
bnl
azc
azc
@@ -46932,14 +46968,14 @@ adP
adT
aec
aAD
-oUP
-mFS
+aeg
+aeo
aAD
sjc
wwR
jfP
awL
-aBM
+azc
azc
azc
iqs
@@ -46967,7 +47003,7 @@ uJM
lBS
exi
cUF
-usX
+aeH
lVJ
mRU
eLX
@@ -47081,7 +47117,7 @@ qCY
obh
qWq
tos
-ayY
+sgp
aBo
uMR
pGq
@@ -47109,7 +47145,7 @@ tNG
tIc
tts
bGw
-usX
+aeH
lVJ
mRU
eLX
@@ -47218,12 +47254,12 @@ aVY
qjn
wnV
aux
-avA
+aep
sVp
xbp
oYq
cCL
-ayY
+sgp
oZy
ngC
oQe
@@ -47362,7 +47398,7 @@ qCg
auC
azc
rIt
-xbQ
+aeu
aDR
sgp
xfN
@@ -47656,7 +47692,7 @@ nPQ
awN
aOC
xOx
-aBM
+awN
aBe
aBe
aBe
@@ -47776,17 +47812,17 @@ aaD
aaD
aaD
aaD
-abn
-aaD
abU
aaD
+act
+aaD
ahL
phy
vYO
dUA
mAh
afV
-mRX
+aeq
nkl
oFl
riU
@@ -47806,7 +47842,7 @@ czS
aDX
pnV
aDz
-ptc
+aey
cNJ
wdk
meW
@@ -47948,7 +47984,7 @@ wZj
aDY
axq
vDW
-eIy
+aeF
kqW
wYD
wYD
@@ -48090,7 +48126,7 @@ wkd
oyD
aDz
kJz
-bmW
+xyO
iEl
duh
meW
@@ -48215,7 +48251,7 @@ kum
iZJ
xuc
kPu
-xuh
+aev
hVn
fxO
avv
@@ -48232,8 +48268,8 @@ aDB
kQQ
lEt
awN
-bmW
-dSp
+xyO
+xyO
bOV
meW
qfA
@@ -48375,7 +48411,7 @@ oPH
tHB
bOm
jVr
-dSp
+xyO
jms
hQk
meW
@@ -48482,7 +48518,7 @@ rci
smz
hrw
hrw
-act
+abn
aaM
aaZ
abi
@@ -48521,7 +48557,7 @@ xur
jzz
jzz
tQT
-lzt
+aeG
tQT
jzz
jzz
@@ -49483,7 +49519,7 @@ hFV
hUm
iOq
jEb
-jYg
+aed
wbf
btr
fQr
@@ -51345,12 +51381,12 @@ qtf
vyd
ter
ucL
-tda
+sRA
afa
-kXu
-kXu
+czD
+czD
vVy
-hDi
+bIK
kiN
vtg
lof
@@ -53894,7 +53930,7 @@ aaa
aaa
aaa
aaa
-hsf
+osM
osM
scB
sJw
@@ -54043,11 +54079,11 @@ sJM
abJ
tOn
vZG
-kok
+rEr
wAK
kzv
tGO
-kKj
+xfE
mIV
ydq
ncN
@@ -54754,7 +54790,7 @@ aaa
aaa
aaa
aaa
-tqu
+hsf
tqu
mRq
psE
diff --git a/maps/tether/tether-06-mining.dmm b/maps/tether/tether-06-mining.dmm
index 7ca97d15657..0b2e5837bda 100644
--- a/maps/tether/tether-06-mining.dmm
+++ b/maps/tether/tether-06-mining.dmm
@@ -13815,7 +13815,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -14239,7 +14239,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -14666,7 +14666,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -14949,7 +14949,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -15516,7 +15516,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -15657,7 +15657,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -15942,7 +15942,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -16367,7 +16367,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -17079,7 +17079,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -17219,7 +17219,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -17363,7 +17363,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -17645,7 +17645,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -17790,7 +17790,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -18073,8 +18073,8 @@ ab
ab
ab
ab
-ab
-ab
+af
+af
ab
ab
ab
@@ -18498,7 +18498,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -18926,7 +18926,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -19211,8 +19211,8 @@ ab
ab
ab
ab
-ab
-ab
+af
+af
ab
ab
ab
@@ -19354,7 +19354,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -19497,7 +19497,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -19781,7 +19781,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -20065,7 +20065,7 @@ ab
ab
ab
ab
-ab
+af
ab
ab
ab
@@ -20224,6 +20224,128 @@ ab
ab
ab
ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
Nh
Nh
ab
@@ -20233,128 +20355,6 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
aa
"}
(130,1,1) = {"
@@ -20365,6 +20365,128 @@ ab
ab
ab
ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
SW
Cx
Cx
@@ -20375,128 +20497,6 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
aa
"}
(131,1,1) = {"
@@ -20507,6 +20507,128 @@ ab
ab
ab
ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
SW
IY
IY
@@ -20517,128 +20639,6 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
aa
"}
(132,1,1) = {"
@@ -20649,6 +20649,128 @@ ab
ab
ab
ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
SW
ab
ab
@@ -20659,128 +20781,6 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
aa
"}
(133,1,1) = {"
@@ -20932,6 +20932,128 @@ ab
ab
ab
ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
QI
ab
ab
@@ -20943,128 +21065,6 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
aa
"}
(135,1,1) = {"
diff --git a/maps/tether/tether_defines.dm b/maps/tether/tether_defines.dm
index ef8cc70e64c..a4ab8f277ca 100644
--- a/maps/tether/tether_defines.dm
+++ b/maps/tether/tether_defines.dm
@@ -140,18 +140,36 @@
/area/crew_quarters/sleep/Dorm_5/holo,
/area/crew_quarters/sleep/Dorm_7/holo,
/area/looking_glass/lg_1,
- /area/rnd/miscellaneous_lab
+ /area/rnd/miscellaneous_lab,
+ /area/tether/transit, // Tether Debug Transit
+ /area/tether/surfacebase/outside/outside2, // Very Outside
+ /area/tether/surfacebase/outside/outside3 // Very Outside
)
unit_test_exempt_from_atmos = list(
/area/engineering/atmos_intake, // Outside,
+ /area/engineering/engine_gas,
/area/rnd/external, // Outside,
+ /area/rnd/outpost/xenobiology/outpost_stairs,
+ /area/tether/surfacebase/entertainment/stage, // Connected to entertainment area
+ /area/tether/surfacebase/emergency_storage/atmos,
/area/tether/surfacebase/emergency_storage/rnd,
/area/tether/surfacebase/emergency_storage/atrium,
/area/tether/surfacebase/lowernortheva, // it airlock
/area/tether/surfacebase/lowernortheva/external, //it outside
- /area/tether/surfacebase/security/gasstorage) //it maint
+ /area/tether/surfacebase/security/gasstorage, // Maint
+ /area/tcommsat/chamber,
+ /area/tether/outpost/solars_outside, // Outside
+ /area/vacant/vacant_bar_upper // Maint
+ )
+ unit_test_z_levels = list(
+ Z_LEVEL_SURFACE_LOW,
+ Z_LEVEL_SURFACE_MID,
+ Z_LEVEL_SURFACE_HIGH,
+ Z_LEVEL_TRANSIT,
+ Z_LEVEL_SPACE_LOW
+ )
lateload_z_levels = list(
list("Tether - Centcom","Tether - Misc","Tether - Underdark","Tether - Plains"), //Stock Tether lateload maps
diff --git a/maps/tether/tether_jobs.dm b/maps/tether/tether_jobs.dm
index 5d9be113cf8..feffb107d3d 100644
--- a/maps/tether/tether_jobs.dm
+++ b/maps/tether/tether_jobs.dm
@@ -25,7 +25,10 @@
selection_color = "#999999"
economic_modifier = 7
minimal_player_age = 14
- pto_type = null
+ playtime_only = TRUE
+ pto_type = PTO_TALON
+ timeoff_factor = 1
+ dept_time_required = 60
access = list(access_talon)
minimal_access = list(access_talon)
alt_titles = list("Talon Commander" = /datum/alt_title/talon_commander)
@@ -49,7 +52,9 @@
selection_color = "#aaaaaa"
economic_modifier = 5
minimal_player_age = 14
- pto_type = null
+ playtime_only = TRUE
+ pto_type = PTO_TALON
+ timeoff_factor = 1
access = list(access_talon)
minimal_access = list(access_talon)
alt_titles = list("Talon Medic" = /datum/alt_title/talon_medic)
@@ -74,7 +79,9 @@
selection_color = "#aaaaaa"
economic_modifier = 5
minimal_player_age = 14
- pto_type = null
+ playtime_only = TRUE
+ pto_type = PTO_TALON
+ timeoff_factor = 1
access = list(access_talon)
minimal_access = list(access_talon)
alt_titles = list("Talon Technician" = /datum/alt_title/talon_tech)
@@ -99,7 +106,9 @@
selection_color = "#aaaaaa"
economic_modifier = 5
minimal_player_age = 14
- pto_type = null
+ playtime_only = TRUE
+ pto_type = PTO_TALON
+ timeoff_factor = 1
access = list(access_talon)
minimal_access = list(access_talon)
alt_titles = list("Talon Helmsman" = /datum/alt_title/talon_helmsman)
@@ -124,7 +133,9 @@
selection_color = "#aaaaaa"
economic_modifier = 5
minimal_player_age = 14
- pto_type = null
+ playtime_only = TRUE
+ pto_type = PTO_TALON
+ timeoff_factor = 1
access = list(access_talon)
minimal_access = list(access_talon)
alt_titles = list("Talon Security" = /datum/alt_title/talon_security)
@@ -148,7 +159,9 @@
selection_color = "#aaaaaa"
economic_modifier = 5
minimal_player_age = 14
- pto_type = null
+ playtime_only = TRUE
+ pto_type = PTO_TALON
+ timeoff_factor = 1
access = list(access_talon)
minimal_access = list(access_talon)
alt_titles = list("Talon Excavator" = /datum/alt_title/talon_excavator)
@@ -273,4 +286,4 @@
uniform = /obj/item/clothing/under/rank/talon/basic
backpack = /obj/item/weapon/storage/backpack/talon
satchel_one = /obj/item/weapon/storage/backpack/satchel/talon
- messenger_bag = /obj/item/weapon/storage/backpack/messenger/talon
\ No newline at end of file
+ messenger_bag = /obj/item/weapon/storage/backpack/messenger/talon
diff --git a/maps/tether/tether_shuttles.dm b/maps/tether/tether_shuttles.dm
index 27caa00596b..ea8d600caa7 100644
--- a/maps/tether/tether_shuttles.dm
+++ b/maps/tether/tether_shuttles.dm
@@ -101,18 +101,18 @@
#define MOVE_PER(x) move_time*(x/100) SECONDS
- computer.visible_message("[bicon(computer)] Beginning flight and telemetry monitoring.")
+ computer.visible_message("\icon[computer][bicon(computer)] Beginning flight and telemetry monitoring.")
sleep(MOVE_PER(5))
if(failures >= 1)
- computer.visible_message("[bicon(computer)] Single engine failure, continuing flight.")
+ computer.visible_message("\icon[computer][bicon(computer)] Single engine failure, continuing flight.")
sleep(MOVE_PER(10))
if(failures >= 2)
- computer.visible_message("[bicon(computer)] Second engine failure, unable to complete flight.")
+ computer.visible_message("\icon[computer][bicon(computer)] Second engine failure, unable to complete flight.")
playsound(computer,'sound/mecha/internaldmgalarm.ogg',100,0)
sleep(MOVE_PER(10))
- computer.visible_message("[bicon(computer)] Commencing RTLS abort mode.")
+ computer.visible_message("\icon[computer][bicon(computer)] Commencing RTLS abort mode.")
sleep(MOVE_PER(20))
if(failures < 3)
move(area_transition,origin)
@@ -120,18 +120,18 @@
return 1
if(failures >= 3)
- computer.visible_message("[bicon(computer)] Total engine failure, unable to complete abort mode.")
+ computer.visible_message("\icon[computer][bicon(computer)] Total engine failure, unable to complete abort mode.")
playsound(computer,'sound/mecha/internaldmgalarm.ogg',100,0)
sleep(MOVE_PER(5))
- computer.visible_message("[bicon(computer)] Distress signal broadcast.")
+ computer.visible_message("\icon[computer][bicon(computer)] Distress signal broadcast.")
playsound(computer,'sound/mecha/internaldmgalarm.ogg',100,0)
sleep(MOVE_PER(5))
- computer.visible_message("[bicon(computer)] Stall. Stall. Stall. Stall.")
+ computer.visible_message("\icon[computer][bicon(computer)] Stall. Stall. Stall. Stall.")
playsound(computer,'sound/mecha/internaldmgalarm.ogg',100,0)
sleep(MOVE_PER(5))
playsound(computer,'sound/mecha/internaldmgalarm.ogg',100,0)
sleep(MOVE_PER(5))
- computer.visible_message("[bicon(computer)] Terrain! Pull up! Terrain! Pull up!")
+ computer.visible_message("\icon[computer][bicon(computer)] Terrain! Pull up! Terrain! Pull up!")
playsound(computer,'sound/mecha/internaldmgalarm.ogg',100,0)
playsound(computer,'sound/misc/bloblarm.ogg',100,0)
sleep(MOVE_PER(10))
diff --git a/maps/tether/tether_things.dm b/maps/tether/tether_things.dm
index 91f1435f053..476c9b6ed17 100644
--- a/maps/tether/tether_things.dm
+++ b/maps/tether/tether_things.dm
@@ -145,6 +145,7 @@
desc = "Magnetic levitation tram tracks. Caution! Electrified!"
icon = 'icons/turf/flooring/maglevs.dmi'
icon_state = "maglevup"
+ can_be_plated = FALSE
var/area/shock_area = /area/tether/surfacebase/tram
@@ -211,7 +212,7 @@
var/mob/living/carbon/human/user = AM
- var/choice = tgui_alert(user, "Do you want to depart via the tram? Your character will leave the round.","Departure",list("Yes","No"))
+ var/choice = tgui_alert(usr, "Do you want to depart via the tram? Your character will leave the round.","Departure",list("Yes","No"))
if(user && Adjacent(user) && choice == "Yes")
var/mob/observer/dead/newghost = user.ghostize()
newghost.timeofdeath = world.time
@@ -329,7 +330,7 @@
layer = ABOVE_WINDOW_LAYER
/obj/machinery/vending/wallmed2
layer = ABOVE_WINDOW_LAYER
-/obj/structure/closet/fireaxecabinet
+/obj/structure/fireaxecabinet
layer = ABOVE_WINDOW_LAYER
/obj/structure/extinguisher_cabinet
layer = ABOVE_WINDOW_LAYER
diff --git a/maps/tether/tether_turfs.dm b/maps/tether/tether_turfs.dm
index eb6de8e37b8..e81ffdeb390 100644
--- a/maps/tether/tether_turfs.dm
+++ b/maps/tether/tether_turfs.dm
@@ -277,6 +277,9 @@ VIRGO3B_TURF_CREATE(/turf/simulated/mineral/floor)
for(var/obj/effect/step_trigger/teleporter/planetary_fall/virgo3b/F in src)
qdel(F)
+/turf/space/v3b_midpoint/CanZPass(atom, direction)
+ return 0 // We're not Space
+
// Tram transit floor
/turf/simulated/floor/tiled/techfloor/grid/transit
icon = 'icons/turf/transit_vr.dmi'
diff --git a/maps/virgo_minitest/virgo_minitest_defines.dm b/maps/virgo_minitest/virgo_minitest_defines.dm
index 716815b7b34..ec26a643519 100644
--- a/maps/virgo_minitest/virgo_minitest_defines.dm
+++ b/maps/virgo_minitest/virgo_minitest_defines.dm
@@ -7,7 +7,9 @@
path = "virgo_minitest"
lobby_icon = 'icons/misc/title_vr.dmi'
- lobby_screens = list("tether2_night")
+ lobby_screens = list("logo2")
+
+ id_hud_icons = 'icons/mob/hud_jobs_vr.dmi'
accessible_z_levels = list("1" = 100)
base_turf_by_z = list("1" = /turf/space)
diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm
index 7fc7fca28f8..f94fa19a39a 100644
--- a/maps/~map_system/maps.dm
+++ b/maps/~map_system/maps.dm
@@ -133,6 +133,7 @@ var/list/all_maps = list()
var/list/unit_test_exempt_areas = list()
var/list/unit_test_exempt_from_atmos = list()
var/list/unit_test_exempt_from_apc = list()
+ var/list/unit_test_exempt_from_wires = list()
var/list/unit_test_z_levels //To test more than Z1, set your z-levels to test here.
var/list/planet_datums_to_make = list() // Types of `/datum/planet`s that will be instantiated by SSPlanets.
@@ -353,4 +354,4 @@ var/list/all_maps = list()
return ..()
/datum/map/proc/get_map_info()
- return "No map information available"
\ No newline at end of file
+ return "No map information available"
diff --git a/sound/effects/mentorhelp.mp3 b/sound/effects/mentorhelp.mp3
new file mode 100644
index 00000000000..a72cec612ac
Binary files /dev/null and b/sound/effects/mentorhelp.mp3 differ
diff --git a/sound/effects/pai-restore.ogg b/sound/effects/pai-restore.ogg
new file mode 100644
index 00000000000..858b519a10c
Binary files /dev/null and b/sound/effects/pai-restore.ogg differ
diff --git a/sound/effects/pai_login.ogg b/sound/effects/pai_login.ogg
new file mode 100644
index 00000000000..b3aa1329058
Binary files /dev/null and b/sound/effects/pai_login.ogg differ
diff --git a/sound/effects/weather/indoorrain_end.ogg b/sound/effects/weather/indoorrain_end.ogg
index c82039d95b7..2b83d6b6a44 100644
Binary files a/sound/effects/weather/indoorrain_end.ogg and b/sound/effects/weather/indoorrain_end.ogg differ
diff --git a/sound/effects/weather/indoorrain_mid.ogg b/sound/effects/weather/indoorrain_mid.ogg
index 60ab5f16240..088aec86ef8 100644
Binary files a/sound/effects/weather/indoorrain_mid.ogg and b/sound/effects/weather/indoorrain_mid.ogg differ
diff --git a/sound/effects/weather/indoorrain_start.ogg b/sound/effects/weather/indoorrain_start.ogg
index 23165836a1f..ca43575d5f5 100644
Binary files a/sound/effects/weather/indoorrain_start.ogg and b/sound/effects/weather/indoorrain_start.ogg differ
diff --git a/sound/talksounds/a.ogg b/sound/talksounds/a.ogg
new file mode 100644
index 00000000000..5c9920eafff
Binary files /dev/null and b/sound/talksounds/a.ogg differ
diff --git a/sound/talksounds/b.ogg b/sound/talksounds/b.ogg
new file mode 100644
index 00000000000..294af704dcb
Binary files /dev/null and b/sound/talksounds/b.ogg differ
diff --git a/sound/talksounds/c.ogg b/sound/talksounds/c.ogg
new file mode 100644
index 00000000000..54d1dce5b45
Binary files /dev/null and b/sound/talksounds/c.ogg differ
diff --git a/sound/talksounds/d.ogg b/sound/talksounds/d.ogg
new file mode 100644
index 00000000000..e82bd21a8b8
Binary files /dev/null and b/sound/talksounds/d.ogg differ
diff --git a/sound/talksounds/e.ogg b/sound/talksounds/e.ogg
new file mode 100644
index 00000000000..2637136bbb9
Binary files /dev/null and b/sound/talksounds/e.ogg differ
diff --git a/sound/talksounds/f.ogg b/sound/talksounds/f.ogg
new file mode 100644
index 00000000000..2a30912e27f
Binary files /dev/null and b/sound/talksounds/f.ogg differ
diff --git a/sound/talksounds/g.ogg b/sound/talksounds/g.ogg
new file mode 100644
index 00000000000..5f61e4b39d0
Binary files /dev/null and b/sound/talksounds/g.ogg differ
diff --git a/sound/talksounds/goon/blub.ogg b/sound/talksounds/goon/blub.ogg
new file mode 100644
index 00000000000..ee6de6ede44
Binary files /dev/null and b/sound/talksounds/goon/blub.ogg differ
diff --git a/sound/talksounds/goon/blub_ask.ogg b/sound/talksounds/goon/blub_ask.ogg
new file mode 100644
index 00000000000..193c3952b0a
Binary files /dev/null and b/sound/talksounds/goon/blub_ask.ogg differ
diff --git a/sound/talksounds/goon/blub_exclaim.ogg b/sound/talksounds/goon/blub_exclaim.ogg
new file mode 100644
index 00000000000..b879fbd4643
Binary files /dev/null and b/sound/talksounds/goon/blub_exclaim.ogg differ
diff --git a/sound/talksounds/goon/bottalk_1.ogg b/sound/talksounds/goon/bottalk_1.ogg
new file mode 100644
index 00000000000..b7272249989
Binary files /dev/null and b/sound/talksounds/goon/bottalk_1.ogg differ
diff --git a/sound/talksounds/goon/bottalk_2.ogg b/sound/talksounds/goon/bottalk_2.ogg
new file mode 100644
index 00000000000..745b1a4edcc
Binary files /dev/null and b/sound/talksounds/goon/bottalk_2.ogg differ
diff --git a/sound/talksounds/goon/bottalk_3.ogg b/sound/talksounds/goon/bottalk_3.ogg
new file mode 100644
index 00000000000..e91f6bc1567
Binary files /dev/null and b/sound/talksounds/goon/bottalk_3.ogg differ
diff --git a/sound/talksounds/goon/bottalk_4.wav b/sound/talksounds/goon/bottalk_4.wav
new file mode 100644
index 00000000000..130dfc3a8ee
Binary files /dev/null and b/sound/talksounds/goon/bottalk_4.wav differ
diff --git a/sound/talksounds/goon/buwoo.ogg b/sound/talksounds/goon/buwoo.ogg
new file mode 100644
index 00000000000..45bcbd50c6b
Binary files /dev/null and b/sound/talksounds/goon/buwoo.ogg differ
diff --git a/sound/talksounds/goon/buwoo_ask.ogg b/sound/talksounds/goon/buwoo_ask.ogg
new file mode 100644
index 00000000000..d7011219b52
Binary files /dev/null and b/sound/talksounds/goon/buwoo_ask.ogg differ
diff --git a/sound/talksounds/goon/buwoo_exclaim.ogg b/sound/talksounds/goon/buwoo_exclaim.ogg
new file mode 100644
index 00000000000..935a8028629
Binary files /dev/null and b/sound/talksounds/goon/buwoo_exclaim.ogg differ
diff --git a/sound/talksounds/goon/cow.ogg b/sound/talksounds/goon/cow.ogg
new file mode 100644
index 00000000000..db6c0a63ca2
Binary files /dev/null and b/sound/talksounds/goon/cow.ogg differ
diff --git a/sound/talksounds/goon/cow_ask.ogg b/sound/talksounds/goon/cow_ask.ogg
new file mode 100644
index 00000000000..aabd6f75c11
Binary files /dev/null and b/sound/talksounds/goon/cow_ask.ogg differ
diff --git a/sound/talksounds/goon/cow_exclaim.ogg b/sound/talksounds/goon/cow_exclaim.ogg
new file mode 100644
index 00000000000..dfac2254636
Binary files /dev/null and b/sound/talksounds/goon/cow_exclaim.ogg differ
diff --git a/sound/talksounds/goon/lizard.ogg b/sound/talksounds/goon/lizard.ogg
new file mode 100644
index 00000000000..48638b0f236
Binary files /dev/null and b/sound/talksounds/goon/lizard.ogg differ
diff --git a/sound/talksounds/goon/lizard_ask.ogg b/sound/talksounds/goon/lizard_ask.ogg
new file mode 100644
index 00000000000..60cf84ff098
Binary files /dev/null and b/sound/talksounds/goon/lizard_ask.ogg differ
diff --git a/sound/talksounds/goon/lizard_exclaim.ogg b/sound/talksounds/goon/lizard_exclaim.ogg
new file mode 100644
index 00000000000..20d3c0b768f
Binary files /dev/null and b/sound/talksounds/goon/lizard_exclaim.ogg differ
diff --git a/sound/talksounds/goon/pug.ogg b/sound/talksounds/goon/pug.ogg
new file mode 100644
index 00000000000..86d50225a52
Binary files /dev/null and b/sound/talksounds/goon/pug.ogg differ
diff --git a/sound/talksounds/goon/pug_ask.ogg b/sound/talksounds/goon/pug_ask.ogg
new file mode 100644
index 00000000000..4cdf1c8a5e3
Binary files /dev/null and b/sound/talksounds/goon/pug_ask.ogg differ
diff --git a/sound/talksounds/goon/pug_exclaim.ogg b/sound/talksounds/goon/pug_exclaim.ogg
new file mode 100644
index 00000000000..ed47bcf1c6e
Binary files /dev/null and b/sound/talksounds/goon/pug_exclaim.ogg differ
diff --git a/sound/talksounds/goon/pugg.ogg b/sound/talksounds/goon/pugg.ogg
new file mode 100644
index 00000000000..90fa070e8b7
Binary files /dev/null and b/sound/talksounds/goon/pugg.ogg differ
diff --git a/sound/talksounds/goon/pugg_ask.ogg b/sound/talksounds/goon/pugg_ask.ogg
new file mode 100644
index 00000000000..463aa0afa08
Binary files /dev/null and b/sound/talksounds/goon/pugg_ask.ogg differ
diff --git a/sound/talksounds/goon/pugg_exclaim.ogg b/sound/talksounds/goon/pugg_exclaim.ogg
new file mode 100644
index 00000000000..c8d4ae1b4f3
Binary files /dev/null and b/sound/talksounds/goon/pugg_exclaim.ogg differ
diff --git a/sound/talksounds/goon/radio.ogg b/sound/talksounds/goon/radio.ogg
new file mode 100644
index 00000000000..0dcb87214ff
Binary files /dev/null and b/sound/talksounds/goon/radio.ogg differ
diff --git a/sound/talksounds/goon/radio2.ogg b/sound/talksounds/goon/radio2.ogg
new file mode 100644
index 00000000000..a9364857a53
Binary files /dev/null and b/sound/talksounds/goon/radio2.ogg differ
diff --git a/sound/talksounds/goon/radio_ai.ogg b/sound/talksounds/goon/radio_ai.ogg
new file mode 100644
index 00000000000..97eaf17417d
Binary files /dev/null and b/sound/talksounds/goon/radio_ai.ogg differ
diff --git a/sound/talksounds/goon/roach.ogg b/sound/talksounds/goon/roach.ogg
new file mode 100644
index 00000000000..55a2ad8ac7b
Binary files /dev/null and b/sound/talksounds/goon/roach.ogg differ
diff --git a/sound/talksounds/goon/roach_ask.ogg b/sound/talksounds/goon/roach_ask.ogg
new file mode 100644
index 00000000000..dc15d884cdf
Binary files /dev/null and b/sound/talksounds/goon/roach_ask.ogg differ
diff --git a/sound/talksounds/goon/roach_exclaim.ogg b/sound/talksounds/goon/roach_exclaim.ogg
new file mode 100644
index 00000000000..3a5a17d47a4
Binary files /dev/null and b/sound/talksounds/goon/roach_exclaim.ogg differ
diff --git a/sound/talksounds/goon/skelly.ogg b/sound/talksounds/goon/skelly.ogg
new file mode 100644
index 00000000000..b8e1a2921a4
Binary files /dev/null and b/sound/talksounds/goon/skelly.ogg differ
diff --git a/sound/talksounds/goon/skelly_ask.ogg b/sound/talksounds/goon/skelly_ask.ogg
new file mode 100644
index 00000000000..e81552d8df4
Binary files /dev/null and b/sound/talksounds/goon/skelly_ask.ogg differ
diff --git a/sound/talksounds/goon/skelly_exclaim.ogg b/sound/talksounds/goon/skelly_exclaim.ogg
new file mode 100644
index 00000000000..79eb112d1a0
Binary files /dev/null and b/sound/talksounds/goon/skelly_exclaim.ogg differ
diff --git a/sound/talksounds/goon/speak_1.ogg b/sound/talksounds/goon/speak_1.ogg
new file mode 100644
index 00000000000..ab8ddde4a66
Binary files /dev/null and b/sound/talksounds/goon/speak_1.ogg differ
diff --git a/sound/talksounds/goon/speak_1_ask.ogg b/sound/talksounds/goon/speak_1_ask.ogg
new file mode 100644
index 00000000000..89d631c6f6e
Binary files /dev/null and b/sound/talksounds/goon/speak_1_ask.ogg differ
diff --git a/sound/talksounds/goon/speak_1_exclaim.ogg b/sound/talksounds/goon/speak_1_exclaim.ogg
new file mode 100644
index 00000000000..3be20fef392
Binary files /dev/null and b/sound/talksounds/goon/speak_1_exclaim.ogg differ
diff --git a/sound/talksounds/goon/speak_2.ogg b/sound/talksounds/goon/speak_2.ogg
new file mode 100644
index 00000000000..a8c9444a52f
Binary files /dev/null and b/sound/talksounds/goon/speak_2.ogg differ
diff --git a/sound/talksounds/goon/speak_2_ask.ogg b/sound/talksounds/goon/speak_2_ask.ogg
new file mode 100644
index 00000000000..a2c9c863854
Binary files /dev/null and b/sound/talksounds/goon/speak_2_ask.ogg differ
diff --git a/sound/talksounds/goon/speak_2_exclaim.ogg b/sound/talksounds/goon/speak_2_exclaim.ogg
new file mode 100644
index 00000000000..7e0838d721a
Binary files /dev/null and b/sound/talksounds/goon/speak_2_exclaim.ogg differ
diff --git a/sound/talksounds/goon/speak_3.ogg b/sound/talksounds/goon/speak_3.ogg
new file mode 100644
index 00000000000..33ec079b84d
Binary files /dev/null and b/sound/talksounds/goon/speak_3.ogg differ
diff --git a/sound/talksounds/goon/speak_3_ask.ogg b/sound/talksounds/goon/speak_3_ask.ogg
new file mode 100644
index 00000000000..13156c332e0
Binary files /dev/null and b/sound/talksounds/goon/speak_3_ask.ogg differ
diff --git a/sound/talksounds/goon/speak_3_exclaim.ogg b/sound/talksounds/goon/speak_3_exclaim.ogg
new file mode 100644
index 00000000000..e10eb615b06
Binary files /dev/null and b/sound/talksounds/goon/speak_3_exclaim.ogg differ
diff --git a/sound/talksounds/goon/speak_4.ogg b/sound/talksounds/goon/speak_4.ogg
new file mode 100644
index 00000000000..6de26114aee
Binary files /dev/null and b/sound/talksounds/goon/speak_4.ogg differ
diff --git a/sound/talksounds/goon/speak_4_ask.ogg b/sound/talksounds/goon/speak_4_ask.ogg
new file mode 100644
index 00000000000..76421d8fddc
Binary files /dev/null and b/sound/talksounds/goon/speak_4_ask.ogg differ
diff --git a/sound/talksounds/goon/speak_4_exclaim.ogg b/sound/talksounds/goon/speak_4_exclaim.ogg
new file mode 100644
index 00000000000..ae6f3985bec
Binary files /dev/null and b/sound/talksounds/goon/speak_4_exclaim.ogg differ
diff --git a/sound/talksounds/h.ogg b/sound/talksounds/h.ogg
new file mode 100644
index 00000000000..9ed1f01341b
Binary files /dev/null and b/sound/talksounds/h.ogg differ
diff --git a/sound/talksounds/me_a.ogg b/sound/talksounds/me_a.ogg
new file mode 100644
index 00000000000..8cb55c54f57
Binary files /dev/null and b/sound/talksounds/me_a.ogg differ
diff --git a/sound/talksounds/me_b.ogg b/sound/talksounds/me_b.ogg
new file mode 100644
index 00000000000..48e6b61d595
Binary files /dev/null and b/sound/talksounds/me_b.ogg differ
diff --git a/sound/talksounds/me_c.ogg b/sound/talksounds/me_c.ogg
new file mode 100644
index 00000000000..65476ee7209
Binary files /dev/null and b/sound/talksounds/me_c.ogg differ
diff --git a/sound/talksounds/me_d.ogg b/sound/talksounds/me_d.ogg
new file mode 100644
index 00000000000..45d44bf2a11
Binary files /dev/null and b/sound/talksounds/me_d.ogg differ
diff --git a/sound/talksounds/me_e.ogg b/sound/talksounds/me_e.ogg
new file mode 100644
index 00000000000..d56c27d97d2
Binary files /dev/null and b/sound/talksounds/me_e.ogg differ
diff --git a/sound/talksounds/me_f.ogg b/sound/talksounds/me_f.ogg
new file mode 100644
index 00000000000..25e9754fec2
Binary files /dev/null and b/sound/talksounds/me_f.ogg differ
diff --git a/sound/talksounds/subtle_sound.ogg b/sound/talksounds/subtle_sound.ogg
new file mode 100644
index 00000000000..b8986f13fc9
Binary files /dev/null and b/sound/talksounds/subtle_sound.ogg differ
diff --git a/sound/voice/moth/moth_chitter.ogg b/sound/voice/moth/moth_chitter.ogg
new file mode 100644
index 00000000000..842bcf8e533
Binary files /dev/null and b/sound/voice/moth/moth_chitter.ogg differ
diff --git a/sound/voice/moth/moth_laugh.ogg b/sound/voice/moth/moth_laugh.ogg
new file mode 100644
index 00000000000..391d6c5aefe
Binary files /dev/null and b/sound/voice/moth/moth_laugh.ogg differ
diff --git a/sound/voice/roboboop.ogg b/sound/voice/roboboop.ogg
new file mode 100644
index 00000000000..6a2d9fd0af9
Binary files /dev/null and b/sound/voice/roboboop.ogg differ
diff --git a/sound/voice/robochirp.ogg b/sound/voice/robochirp.ogg
new file mode 100644
index 00000000000..51d534662d1
Binary files /dev/null and b/sound/voice/robochirp.ogg differ
diff --git a/sound/weapons/chargeup.ogg b/sound/weapons/chargeup.ogg
new file mode 100644
index 00000000000..263d2b1d990
Binary files /dev/null and b/sound/weapons/chargeup.ogg differ
diff --git a/tgui/.eslintrc.yml b/tgui/.eslintrc.yml
index f384182d80b..7fd4b2914c1 100644
--- a/tgui/.eslintrc.yml
+++ b/tgui/.eslintrc.yml
@@ -1,4 +1,5 @@
root: true
+extends: prettier
parser: '@typescript-eslint/parser'
parserOptions:
ecmaVersion: 2020
@@ -12,6 +13,7 @@ env:
plugins:
- radar
- react
+ - unused-imports
settings:
react:
version: '16.10'
@@ -348,15 +350,15 @@ rules:
## Enforce the location of arrow function bodies
# implicit-arrow-linebreak: error
## Enforce consistent indentation
- indent: [error, 2, { SwitchCase: 1 }]
+ # indent: [warn, 2, { SwitchCase: 1 }]
## Enforce the consistent use of either double or single quotes in JSX
## attributes
- jsx-quotes: [error, prefer-double]
+ # jsx-quotes: [warn, prefer-double]
## Enforce consistent spacing between keys and values in object literal
## properties
- key-spacing: [error, { beforeColon: false, afterColon: true }]
+ # key-spacing: [warn, { beforeColon: false, afterColon: true }]
## Enforce consistent spacing before and after keywords
- keyword-spacing: [error, { before: true, after: true }]
+ # keyword-spacing: [warn, { before: true, after: true }]
## Enforce position of line comments
# line-comment-position: error
## Enforce consistent linebreak style
@@ -368,14 +370,15 @@ rules:
## Enforce a maximum depth that blocks can be nested
# max-depth: error
## Enforce a maximum line length
- max-len: [error, {
- code: 120,
- ## Ignore imports
- ignorePattern: '^(import\s.+\sfrom\s|.*require\()',
- ignoreUrls: true,
- ignoreRegExpLiterals: true,
- ignoreStrings: true,
- }]
+ # max-len: [warn, {
+ # code: 120,
+ # ## Ignore imports
+ # ignorePattern: '^(import\s.+\sfrom\s|.*require\()',
+ # ignoreUrls: true,
+ # ignoreRegExpLiterals: true,
+ # ignoreStrings: true,
+ # ignoreTemplateLiterals: true,
+ # }]
## Enforce a maximum number of lines per file
# max-lines: error
## Enforce a maximum number of line of code in a function
@@ -412,7 +415,7 @@ rules:
## Disallow mixed binary operators
# no-mixed-operators: error
## Disallow mixed spaces and tabs for indentation
- no-mixed-spaces-and-tabs: error
+ no-mixed-spaces-and-tabs: warn
## Disallow use of chained assignment expressions
# no-multi-assign: error
## Disallow multiple empty lines
@@ -438,7 +441,7 @@ rules:
## Disallow ternary operators when simpler alternatives exist
# no-unneeded-ternary: error
## Disallow whitespace before properties
- no-whitespace-before-property: error
+ # no-whitespace-before-property: warn
## Enforce the location of single-line statements
# nonblock-statement-body-position: error
## Enforce consistent line breaks inside braces
@@ -455,7 +458,7 @@ rules:
## Require or disallow assignment operator shorthand where possible
# operator-assignment: error
## Enforce consistent linebreak style for operators
- operator-linebreak: [error, before]
+ # operator-linebreak: [warn, before]
## Require or disallow padding within blocks
# padded-blocks: error
## Require or disallow padding lines between statements
@@ -480,11 +483,11 @@ rules:
## Enforce consistent spacing before blocks
space-before-blocks: [error, always]
## Enforce consistent spacing before function definition opening parenthesis
- space-before-function-paren: [error, {
- anonymous: always,
- named: never,
- asyncArrow: always,
- }]
+ # space-before-function-paren: [warn, {
+ # anonymous: always,
+ # named: never,
+ # asyncArrow: always,
+ # }]
## Enforce consistent spacing inside parentheses
space-in-parens: [error, never]
## Require spacing around infix operators
@@ -668,7 +671,7 @@ rules:
# react/sort-prop-types: error
## Enforce the state initialization style to be either in a constructor or
## with a class property
- react/state-in-constructor: error
+ # react/state-in-constructor: error
## Enforces where React component static properties should be positioned.
# react/static-property-placement: error
## Enforce style prop value being an object
@@ -693,7 +696,7 @@ rules:
react/jsx-closing-tag-location: error
## Enforce or disallow newlines inside of curly braces in JSX attributes and
## expressions (fixable)
- react/jsx-curly-newline: error
+ # react/jsx-curly-newline: warn
## Enforce or disallow spaces inside of curly braces in JSX attributes and
## expressions (fixable)
react/jsx-curly-spacing: error
@@ -706,13 +709,13 @@ rules:
## Enforce event handler naming conventions in JSX
react/jsx-handler-names: error
## Validate JSX indentation (fixable)
- react/jsx-indent: [error, 2, {
- checkAttributes: true,
- }]
+ # react/jsx-indent: [warn, 2, {
+ # checkAttributes: true,
+ # }]
## Validate props indentation in JSX (fixable)
- react/jsx-indent-props: [error, 2]
+ # react/jsx-indent-props: [warn, 2]
## Validate JSX has key prop when in array or iterator
- react/jsx-key: error
+ # react/jsx-key: warn
## Validate JSX maximum depth
react/jsx-max-depth: [error, { max: 10 }] ## Generous
## Limit maximum of props on a single line in JSX (fixable)
@@ -756,3 +759,6 @@ rules:
react/jsx-uses-vars: error
## Prevent missing parentheses around multilines JSX (fixable)
react/jsx-wrap-multilines: error
+ ## Prevents the use of unused imports.
+ ## This could be done by enabling no-unused-vars, but we're doing this for now
+ unused-imports/no-unused-imports: error
diff --git a/tgui/.gitattributes b/tgui/.gitattributes
index 71550f35c1c..ce30adb9e25 100644
--- a/tgui/.gitattributes
+++ b/tgui/.gitattributes
@@ -15,8 +15,8 @@
yarn.lock text eol=lf
bin/tgui text eol=lf
-## Treat bundles as binary and ignore them during conflicts
-*.bundle.* binary merge=tgui-merge-bundle
-*.chunk.* binary merge=tgui-merge-bundle
+## Treat bundles as binary
+*.bundle.* binary
+*.chunk.* binary
.yarn/releases/**/* binary
.yarn/plugins/**/* binary
diff --git a/tgui/.gitignore b/tgui/.gitignore
index 56cb38b290a..bcdbd1c91a4 100644
--- a/tgui/.gitignore
+++ b/tgui/.gitignore
@@ -14,6 +14,7 @@ package-lock.json
## Build artifacts
/public/.tmp/**/*
+/public/*.map
## Previously ignored locations that are kept to avoid confusing git
## while transitioning to a new project structure.
diff --git a/tgui/.prettierignore b/tgui/.prettierignore
new file mode 100644
index 00000000000..2522dec056c
--- /dev/null
+++ b/tgui/.prettierignore
@@ -0,0 +1,19 @@
+## NPM
+/**/node_modules
+
+## Yarn
+/.yarn
+/yarn.lock
+/.pnp.*
+
+/docs
+/public
+/packages/tgui-polyfill
+/packages/tgfont/static
+**/*.json
+**/*.yml
+**/*.md
+
+## Build artifacts
+/public/.tmp/**/*
+/public/*.map
diff --git a/tgui/.prettierrc.yml b/tgui/.prettierrc.yml
index b64bef0cd05..5dbf435cf14 100644
--- a/tgui/.prettierrc.yml
+++ b/tgui/.prettierrc.yml
@@ -1,8 +1,10 @@
arrowParens: always
-bracketSpacing: true
+breakLongMethodChains: true
endOfLine: lf
+importFormatting: oneline
jsxBracketSameLine: true
jsxSingleQuote: false
+offsetTernaryExpressions: true
printWidth: 120
proseWrap: preserve
quoteProps: preserve
@@ -10,3 +12,4 @@ semi: true
singleQuote: true
tabWidth: 2
trailingComma: es5
+useTabs: false
diff --git a/tgui/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs b/tgui/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
index e64e6dda163..2a614bf0fb4 100644
--- a/tgui/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
+++ b/tgui/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
@@ -1,4 +1,5 @@
/* eslint-disable */
+//prettier-ignore
module.exports = {
name: "@yarnpkg/plugin-interactive-tools",
factory: function (require) {
@@ -74,4 +75,4 @@ function(r){function i(e,t){return function(){e.apply(t,arguments)}}function o(e
*/var n,r,i,o,u;if(Object.defineProperty(t,"__esModule",{value:!0}),"undefined"==typeof window||"function"!=typeof MessageChannel){var a=null,l=null,s=function(){if(null!==a)try{var e=t.unstable_now();a(!0,e),a=null}catch(e){throw setTimeout(s,0),e}},c=Date.now();t.unstable_now=function(){return Date.now()-c},n=function(e){null!==a?setTimeout(n,0,e):(a=e,setTimeout(s,0))},r=function(e,t){l=setTimeout(e,t)},i=function(){clearTimeout(l)},o=function(){return!1},u=t.unstable_forceFrameRate=function(){}}else{var f=window.performance,d=window.Date,p=window.setTimeout,h=window.clearTimeout;if("undefined"!=typeof console){var v=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),"function"!=typeof v&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")}if("object"==typeof f&&"function"==typeof f.now)t.unstable_now=function(){return f.now()};else{var m=d.now();t.unstable_now=function(){return d.now()-m}}var g=!1,y=null,_=-1,b=5,w=0;o=function(){return t.unstable_now()>=w},u=function(){},t.unstable_forceFrameRate=function(e){0>e||125T(u,n))void 0!==l&&0>T(l,u)?(e[r]=l,e[a]=n,r=a):(e[r]=u,e[o]=n,r=o);else{if(!(void 0!==l&&0>T(l,n)))break e;e[r]=l,e[a]=n,r=a}}}return t}return null}function T(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var x=[],A=[],O=1,P=null,I=3,N=!1,M=!1,R=!1;function F(e){for(var t=C(A);null!==t;){if(null===t.callback)k(A);else{if(!(t.startTime<=e))break;k(A),t.sortIndex=t.expirationTime,S(x,t)}t=C(A)}}function L(e){if(R=!1,F(e),!M)if(null!==C(x))M=!0,n(B);else{var t=C(A);null!==t&&r(L,t.startTime-e)}}function B(e,n){M=!1,R&&(R=!1,i()),N=!0;var u=I;try{for(F(n),P=C(x);null!==P&&(!(P.expirationTime>n)||e&&!o());){var a=P.callback;if(null!==a){P.callback=null,I=P.priorityLevel;var l=a(P.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?P.callback=l:P===C(x)&&k(x),F(n)}else k(x);P=C(x)}if(null!==P)var s=!0;else{var c=C(A);null!==c&&r(L,c.startTime-n),s=!1}return s}finally{P=null,I=u,N=!1}}function j(e){switch(e){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1e4;default:return 5e3}}var U=u;t.unstable_ImmediatePriority=1,t.unstable_UserBlockingPriority=2,t.unstable_NormalPriority=3,t.unstable_IdlePriority=5,t.unstable_LowPriority=4,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=I;I=e;try{return t()}finally{I=n}},t.unstable_next=function(e){switch(I){case 1:case 2:case 3:var t=3;break;default:t=I}var n=I;I=t;try{return e()}finally{I=n}},t.unstable_scheduleCallback=function(e,o,u){var a=t.unstable_now();if("object"==typeof u&&null!==u){var l=u.delay;l="number"==typeof l&&0a?(e.sortIndex=l,S(A,e),null===C(x)&&e===C(A)&&(R?i():R=!0,r(L,l-a))):(e.sortIndex=u,S(x,e),M||N||(M=!0,n(B))),e},t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_wrapCallback=function(e){var t=I;return function(){var n=I;I=t;try{return e.apply(this,arguments)}finally{I=n}}},t.unstable_getCurrentPriorityLevel=function(){return I},t.unstable_shouldYield=function(){var e=t.unstable_now();F(e);var n=C(x);return n!==P&&null!==P&&null!==n&&null!==n.callback&&n.startTime<=e&&n.expirationTime{"use strict";e.exports=n(706)},6458:(e,t,n)=>{var r,i=n(2357),o=n(8082),u=n(8614);function a(){c&&(c=!1,o.forEach((function(e){try{process.removeListener(e,s[e])}catch(e){}})),process.emit=h,process.reallyExit=d,r.count-=1)}function l(e,t,n){r.emitted[e]||(r.emitted[e]=!0,r.emit(e,t,n))}"function"!=typeof u&&(u=u.EventEmitter),process.__signal_exit_emitter__?r=process.__signal_exit_emitter__:((r=process.__signal_exit_emitter__=new u).count=0,r.emitted={}),r.infinite||(r.setMaxListeners(1/0),r.infinite=!0),e.exports=function(e,t){i.equal(typeof e,"function","a callback must be provided for exit handler"),!1===c&&f();var n="exit";t&&t.alwaysLast&&(n="afterexit");return r.on(n,e),function(){r.removeListener(n,e),0===r.listeners("exit").length&&0===r.listeners("afterexit").length&&a()}},e.exports.unload=a;var s={};o.forEach((function(e){s[e]=function(){process.listeners(e).length===r.count&&(a(),l("exit",null,e),l("afterexit",null,e),process.kill(process.pid,e))}})),e.exports.signals=function(){return o},e.exports.load=f;var c=!1;function f(){c||(c=!0,r.count+=1,o=o.filter((function(e){try{return process.on(e,s[e]),!0}catch(e){return!1}})),process.emit=v,process.reallyExit=p)}var d=process.reallyExit;function p(e){process.exitCode=e||0,l("exit",process.exitCode,null),l("afterexit",process.exitCode,null),d.call(process,process.exitCode)}var h=process.emit;function v(e,t){if("exit"===e){void 0!==t&&(process.exitCode=t);var n=h.apply(this,arguments);return l("exit",process.exitCode,null),l("afterexit",process.exitCode,null),n}return h.apply(this,arguments)}},8082:e=>{e.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"],"win32"!==process.platform&&e.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT"),"linux"===process.platform&&e.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")},1566:(e,t,n)=>{"use strict";const r=n(7347),i=n(409),o=n(8483),u=["","›"],a=e=>`${u[0]}[${e}m`,l=(e,t,n)=>{let r=[];e=[...e];for(let n of e){const i=n;n.match(";")&&(n=n.split(";")[0][0]+"0");const u=o.codes.get(parseInt(n,10));if(u){const n=e.indexOf(u.toString());n>=0?e.splice(n,1):r.push(a(t?u:i))}else{if(t){r.push(a(0));break}r.push(a(i))}}if(t&&(r=r.filter((e,t)=>r.indexOf(e)===t),void 0!==n)){const e=a(o.codes.get(parseInt(n,10)));r=r.reduce((t,n)=>n===e?[n,...t]:[...t,n],[])}return r.join("")};e.exports=(e,t,n)=>{const o=[...e.normalize()],a=[];n="number"==typeof n?n:o.length;let s,c=!1,f=0,d="";for(const[p,h]of o.entries()){let o=!1;if(u.includes(h)){const t=/\d[^m]*/.exec(e.slice(p,p+18));s=t&&t.length>0?t[0]:void 0,ft&&f<=n)d+=h;else if(f!==t||c||void 0===s){if(f>=n){d+=l(a,!0,s);break}}else d=l(a)}return d}},9796:(e,t,n)=>{"use strict";const r=n(8759),i=[].concat(n(2282).builtinModules,"bootstrap_node","node").map(e=>new RegExp(`(?:\\(${e}\\.js:\\d+:\\d+\\)$|^\\s*at ${e}\\.js:\\d+:\\d+$)`));i.push(/\(internal\/[^:]+:\d+:\d+\)$/,/\s*at internal\/[^:]+:\d+:\d+$/,/\/\.node-spawn-wrap-\w+-\w+\/node:\d+:\d+\)?$/);class o{constructor(e){"internals"in(e={ignoredPackages:[],...e})==!1&&(e.internals=o.nodeInternals()),"cwd"in e==!1&&(e.cwd=process.cwd()),this._cwd=e.cwd.replace(/\\/g,"/"),this._internals=[].concat(e.internals,function(e){if(0===e.length)return[];const t=e.map(e=>r(e));return new RegExp(`[/\\\\]node_modules[/\\\\](?:${t.join("|")})[/\\\\][^:]+:\\d+:\\d+`)}(e.ignoredPackages)),this._wrapCallSite=e.wrapCallSite||!1}static nodeInternals(){return[...i]}clean(e,t=0){t=" ".repeat(t),Array.isArray(e)||(e=e.split("\n")),!/^\s*at /.test(e[0])&&/^\s*at /.test(e[1])&&(e=e.slice(1));let n=!1,r=null;const i=[];return e.forEach(e=>{if(e=e.replace(/\\/g,"/"),this._internals.some(t=>t.test(e)))return;const t=/^\s*at /.test(e);n?e=e.trimEnd().replace(/^(\s+)at /,"$1"):(e=e.trim(),t&&(e=e.slice(3))),(e=e.replace(this._cwd+"/",""))&&(t?(r&&(i.push(r),r=null),i.push(e)):(n=!0,r=e))}),i.map(e=>`${t}${e}\n`).join("")}captureString(e,t=this.captureString){"function"==typeof e&&(t=e,e=1/0);const{stackTraceLimit:n}=Error;e&&(Error.stackTraceLimit=e);const r={};Error.captureStackTrace(r,t);const{stack:i}=r;return Error.stackTraceLimit=n,this.clean(i)}capture(e,t=this.capture){"function"==typeof e&&(t=e,e=1/0);const{prepareStackTrace:n,stackTraceLimit:r}=Error;Error.prepareStackTrace=(e,t)=>this._wrapCallSite?t.map(this._wrapCallSite):t,e&&(Error.stackTraceLimit=e);const i={};Error.captureStackTrace(i,t);const{stack:o}=i;return Object.assign(Error,{prepareStackTrace:n,stackTraceLimit:r}),o}at(e=this.at){const[t]=this.capture(1,e);if(!t)return{};const n={line:t.getLineNumber(),column:t.getColumnNumber()};let r;u(n,t.getFileName(),this._cwd),t.isConstructor()&&(n.constructor=!0),t.isEval()&&(n.evalOrigin=t.getEvalOrigin()),t.isNative()&&(n.native=!0);try{r=t.getTypeName()}catch(e){}r&&"Object"!==r&&"[object Object]"!==r&&(n.type=r);const i=t.getFunctionName();i&&(n.function=i);const o=t.getMethodName();return o&&i!==o&&(n.method=o),n}parseLine(e){const t=e&&e.match(a);if(!t)return null;const n="new"===t[1];let r=t[2];const i=t[3],o=t[4],s=Number(t[5]),c=Number(t[6]);let f=t[7];const d=t[8],p=t[9],h="native"===t[10],v=")"===t[11];let m;const g={};if(d&&(g.line=Number(d)),p&&(g.column=Number(p)),v&&f){let e=0;for(let t=f.length-1;t>0;t--)if(")"===f.charAt(t))e++;else if("("===f.charAt(t)&&" "===f.charAt(t-1)&&(e--,-1===e&&" "===f.charAt(t-1))){const e=f.slice(0,t-1),n=f.slice(t+1);f=n,r+=" ("+e;break}}if(r){const e=r.match(l);e&&(r=e[1],m=e[2])}return u(g,f,this._cwd),n&&(g.constructor=!0),i&&(g.evalOrigin=i,g.evalLine=s,g.evalColumn=c,g.evalFile=o&&o.replace(/\\/g,"/")),h&&(g.native=!0),r&&(g.function=r),m&&r!==m&&(g.method=m),g}}function u(e,t,n){t&&((t=t.replace(/\\/g,"/")).startsWith(n+"/")&&(t=t.slice(n.length+1)),e.file=t)}const a=new RegExp("^(?:\\s*at )?(?:(new) )?(?:(.*?) \\()?(?:eval at ([^ ]+) \\((.+?):(\\d+):(\\d+)\\), )?(?:(.+?):(\\d+):(\\d+)|(native))(\\)?)$"),l=/^(.*?) \[as (.*?)\]$/;e.exports=o},3262:(e,t,n)=>{"use strict";const r=n(7402),i=n(5640),o=e=>r(e).replace(i()," ").length;e.exports=o,e.exports.default=o},5043:(e,t,n)=>{"use strict";const r=n(7915),i=n(7347),o=n(1013),u=e=>{if("string"!=typeof(e=e.replace(o()," "))||0===e.length)return 0;e=r(e);let t=0;for(let n=0;n=127&&r<=159||(r>=768&&r<=879||(r>65535&&n++,t+=i(r)?2:1))}return t};e.exports=u,e.exports.default=u},7402:(e,t,n)=>{"use strict";const r=n(5378),i=e=>"string"==typeof e?e.replace(r(),""):e;e.exports=i,e.exports.default=i},7915:(e,t,n)=>{"use strict";const r=n(1337);e.exports=e=>"string"==typeof e?e.replace(r(),""):e},9428:(e,t,n)=>{"use strict";const r=n(2087),i=n(3867),o=n(2918),{env:u}=process;let a;function l(e){return 0!==e&&{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function s(e,t){if(0===a)return 0;if(o("color=16m")||o("color=full")||o("color=truecolor"))return 3;if(o("color=256"))return 2;if(e&&!t&&void 0===a)return 0;const n=a||0;if("dumb"===u.TERM)return n;if("win32"===process.platform){const e=r.release().split(".");return Number(e[0])>=10&&Number(e[2])>=10586?Number(e[2])>=14931?3:2:1}if("CI"in u)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(e=>e in u)||"codeship"===u.CI_NAME?1:n;if("TEAMCITY_VERSION"in u)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(u.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in u)return 1;if("truecolor"===u.COLORTERM)return 3;if("TERM_PROGRAM"in u){const e=parseInt((u.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(u.TERM_PROGRAM){case"iTerm.app":return e>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(u.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(u.TERM)||"COLORTERM"in u?1:n}o("no-color")||o("no-colors")||o("color=false")||o("color=never")?a=0:(o("color")||o("colors")||o("color=true")||o("color=always"))&&(a=1),"FORCE_COLOR"in u&&(a="true"===u.FORCE_COLOR?1:"false"===u.FORCE_COLOR?0:0===u.FORCE_COLOR.length?1:Math.min(parseInt(u.FORCE_COLOR,10),3)),e.exports={supportsColor:function(e){return l(s(e,e&&e.isTTY))},stdout:l(s(!0,i.isatty(1))),stderr:l(s(!0,i.isatty(2)))}},8949:(e,t,n)=>{"use strict";const r=n(5043),i=e=>{let t=0;for(const n of e.split("\n"))t=Math.max(t,r(n));return t};e.exports=i,e.exports.default=i},4332:(e,t,n)=>{"use strict";const r=n(5043),i=n(7915),o=n(8483),u=new Set(["","›"]),a=e=>`${u.values().next().value}[${e}m`,l=(e,t,n)=>{const o=[...t];let a=!1,l=r(i(e[e.length-1]));for(const[t,i]of o.entries()){const s=r(i);if(l+s<=n?e[e.length-1]+=i:(e.push(i),l=0),u.has(i))a=!0;else if(a&&"m"===i){a=!1;continue}a||(l+=s,l===n&&t0&&e.length>1&&(e[e.length-2]+=e.pop())},s=e=>{const t=e.split(" ");let n=t.length;for(;n>0&&!(r(t[n-1])>0);)n--;return n===t.length?e:t.slice(0,n).join(" ")+t.slice(n).join("")},c=(e,t,n={})=>{if(!1!==n.trim&&""===e.trim())return"";let i,c="",f="";const d=(e=>e.split(" ").map(e=>r(e)))(e);let p=[""];for(const[i,o]of e.split(" ").entries()){!1!==n.trim&&(p[p.length-1]=p[p.length-1].trimLeft());let e=r(p[p.length-1]);if(0!==i&&(e>=t&&(!1===n.wordWrap||!1===n.trim)&&(p.push(""),e=0),(e>0||!1===n.trim)&&(p[p.length-1]+=" ",e++)),n.hard&&d[i]>t){const n=t-e,r=1+Math.floor((d[i]-n-1)/t);Math.floor((d[i]-1)/t)t&&e>0&&d[i]>0){if(!1===n.wordWrap&&et&&!1===n.wordWrap?l(p,o,t):p[p.length-1]+=o}}!1!==n.trim&&(p=p.map(s)),c=p.join("\n");for(const[e,t]of[...c].entries()){if(f+=t,u.has(t)){const t=parseFloat(/\d[^m]*/.exec(c.slice(e,e+4)));i=39===t?null:t}const n=o.codes.get(Number(i));i&&n&&("\n"===c[e+1]?f+=a(n):"\n"===t&&(f+=a(i)))}return f};e.exports=(e,t,n)=>String(e).normalize().replace(/\r\n/g,"\n").split("\n").map(e=>c(e,t,n)).join("\n")},3354:function(module,exports){var __WEBPACK_AMD_DEFINE_ARRAY__,__WEBPACK_AMD_DEFINE_RESULT__,wrapper;wrapper=function(Module,cb){var Module;"function"==typeof Module&&(cb=Module,Module={}),Module.onRuntimeInitialized=function(e,t){return function(){e&&e.apply(this,arguments);try{Module.ccall("nbind_init")}catch(e){return void t(e)}t(null,{bind:Module._nbind_value,reflect:Module.NBind.reflect,queryType:Module.NBind.queryType,toggleLightGC:Module.toggleLightGC,lib:Module})}}(Module.onRuntimeInitialized,cb),Module||(Module=(void 0!==Module?Module:null)||{});var moduleOverrides={};for(var key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var ENVIRONMENT_IS_WEB=!1,ENVIRONMENT_IS_WORKER=!1,ENVIRONMENT_IS_NODE=!1,ENVIRONMENT_IS_SHELL=!1,nodeFS,nodePath;if(Module.ENVIRONMENT)if("WEB"===Module.ENVIRONMENT)ENVIRONMENT_IS_WEB=!0;else if("WORKER"===Module.ENVIRONMENT)ENVIRONMENT_IS_WORKER=!0;else if("NODE"===Module.ENVIRONMENT)ENVIRONMENT_IS_NODE=!0;else{if("SHELL"!==Module.ENVIRONMENT)throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");ENVIRONMENT_IS_SHELL=!0}else ENVIRONMENT_IS_WEB="object"==typeof window,ENVIRONMENT_IS_WORKER="function"==typeof importScripts,ENVIRONMENT_IS_NODE="object"==typeof process&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE)Module.print||(Module.print=console.log),Module.printErr||(Module.printErr=console.warn),Module.read=function(e,t){nodeFS||(nodeFS={}("")),nodePath||(nodePath={}("")),e=nodePath.normalize(e);var n=nodeFS.readFileSync(e);return t?n:n.toString()},Module.readBinary=function(e){var t=Module.read(e,!0);return t.buffer||(t=new Uint8Array(t)),assert(t.buffer),t},Module.load=function(e){globalEval(read(e))},Module.thisProgram||(process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program"),Module.arguments=process.argv.slice(2),module.exports=Module,Module.inspect=function(){return"[Emscripten Module object]"};else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),"undefined"!=typeof printErr&&(Module.printErr=printErr),"undefined"!=typeof read?Module.read=read:Module.read=function(){throw"no read() available"},Module.readBinary=function(e){if("function"==typeof readbuffer)return new Uint8Array(readbuffer(e));var t=read(e,"binary");return assert("object"==typeof t),t},"undefined"!=typeof scriptArgs?Module.arguments=scriptArgs:void 0!==arguments&&(Module.arguments=arguments),"function"==typeof quit&&(Module.quit=function(e,t){quit(e)});else{if(!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER)throw"Unknown runtime environment. Where are we?";if(Module.read=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),Module.readAsync=function(e,t,n){var r=new XMLHttpRequest;r.open("GET",e,!0),r.responseType="arraybuffer",r.onload=function(){200==r.status||0==r.status&&r.response?t(r.response):n()},r.onerror=n,r.send(null)},void 0!==arguments&&(Module.arguments=arguments),"undefined"!=typeof console)Module.print||(Module.print=function(e){console.log(e)}),Module.printErr||(Module.printErr=function(e){console.warn(e)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&"undefined"!=typeof dump?function(e){dump(e)}:function(e){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),void 0===Module.setWindowTitle&&(Module.setWindowTitle=function(e){document.title=e})}function globalEval(e){eval.call(null,e)}for(var key in!Module.load&&Module.read&&(Module.load=function(e){globalEval(Module.read(e))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram="./this.program"),Module.quit||(Module.quit=function(e,t){throw t}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[],moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(e){return tempRet0=e,e},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(e){STACKTOP=e},getNativeTypeSize:function(e){switch(e){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:if("*"===e[e.length-1])return Runtime.QUANTUM_SIZE;if("i"===e[0]){var t=parseInt(e.substr(1));return assert(t%8==0),t/8}return 0}},getNativeFieldSize:function(e){return Math.max(Runtime.getNativeTypeSize(e),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(e,t){return"double"===t||"i64"===t?7&e&&(assert(4==(7&e)),e+=4):assert(0==(3&e)),e},getAlignSize:function(e,t,n){return n||"i64"!=e&&"double"!=e?e?Math.min(t||(e?Runtime.getNativeFieldSize(e):0),Runtime.QUANTUM_SIZE):Math.min(t,8):8},dynCall:function(e,t,n){return n&&n.length?Module["dynCall_"+e].apply(null,[t].concat(n)):Module["dynCall_"+e].call(null,t)},functionPointers:[],addFunction:function(e){for(var t=0;t>2],n=-16&(t+e+15|0);return HEAP32[DYNAMICTOP_PTR>>2]=n,n>=TOTAL_MEMORY&&!enlargeMemory()?(HEAP32[DYNAMICTOP_PTR>>2]=t,0):t},alignMemory:function(e,t){return e=Math.ceil(e/(t||16))*(t||16)},makeBigInt:function(e,t,n){return n?+(e>>>0)+4294967296*+(t>>>0):+(e>>>0)+4294967296*+(0|t)},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0,cwrap,ccall;function assert(e,t){e||abort("Assertion failed: "+t)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(e){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}function setValue(e,t,n,r){switch("*"===(n=n||"i8").charAt(n.length-1)&&(n="i32"),n){case"i1":case"i8":HEAP8[e>>0]=t;break;case"i16":HEAP16[e>>1]=t;break;case"i32":HEAP32[e>>2]=t;break;case"i64":tempI64=[t>>>0,(tempDouble=t,+Math_abs(tempDouble)>=1?tempDouble>0?(0|Math_min(+Math_floor(tempDouble/4294967296),4294967295))>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[e>>2]=tempI64[0],HEAP32[e+4>>2]=tempI64[1];break;case"float":HEAPF32[e>>2]=t;break;case"double":HEAPF64[e>>3]=t;break;default:abort("invalid type for setValue: "+n)}}function getValue(e,t,n){switch("*"===(t=t||"i8").charAt(t.length-1)&&(t="i32"),t){case"i1":case"i8":return HEAP8[e>>0];case"i16":return HEAP16[e>>1];case"i32":case"i64":return HEAP32[e>>2];case"float":return HEAPF32[e>>2];case"double":return HEAPF64[e>>3];default:abort("invalid type for setValue: "+t)}return null}!function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(e){var t=Runtime.stackAlloc(e.length);return writeArrayToMemory(e,t),t},stringToC:function(e){var t=0;if(null!=e&&0!==e){var n=1+(e.length<<2);stringToUTF8(e,t=Runtime.stackAlloc(n),n)}return t}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(e,t,n,r,i){var o=getCFunc(e),u=[],a=0;if(r)for(var l=0;l>2]=0;for(l=u+o;r>0]=0;return u}if("i8"===a)return e.subarray||e.slice?HEAPU8.set(e,u):HEAPU8.set(new Uint8Array(e),u),u;for(var s,c,f,d=0;d>0],(0!=n||t)&&(i++,!t||i!=t););t||(t=i);var o="";if(r<128){for(var u;t>0;)u=String.fromCharCode.apply(String,HEAPU8.subarray(e,e+Math.min(t,1024))),o=o?o+u:u,e+=1024,t-=1024;return o}return Module.UTF8ToString(e)}function AsciiToString(e){for(var t="";;){var n=HEAP8[e++>>0];if(!n)return t;t+=String.fromCharCode(n)}}function stringToAscii(e,t){return writeAsciiToMemory(e,t,!1)}Module.ALLOC_NORMAL=ALLOC_NORMAL,Module.ALLOC_STACK=ALLOC_STACK,Module.ALLOC_STATIC=ALLOC_STATIC,Module.ALLOC_DYNAMIC=ALLOC_DYNAMIC,Module.ALLOC_NONE=ALLOC_NONE,Module.allocate=allocate,Module.getMemory=getMemory,Module.Pointer_stringify=Pointer_stringify,Module.AsciiToString=AsciiToString,Module.stringToAscii=stringToAscii;var UTF8Decoder="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function UTF8ArrayToString(e,t){for(var n=t;e[n];)++n;if(n-t>16&&e.subarray&&UTF8Decoder)return UTF8Decoder.decode(e.subarray(t,n));for(var r,i,o,u,a,l="";;){if(!(r=e[t++]))return l;if(128&r)if(i=63&e[t++],192!=(224&r))if(o=63&e[t++],224==(240&r)?r=(15&r)<<12|i<<6|o:(u=63&e[t++],240==(248&r)?r=(7&r)<<18|i<<12|o<<6|u:(a=63&e[t++],r=248==(252&r)?(3&r)<<24|i<<18|o<<12|u<<6|a:(1&r)<<30|i<<24|o<<18|u<<12|a<<6|63&e[t++])),r<65536)l+=String.fromCharCode(r);else{var s=r-65536;l+=String.fromCharCode(55296|s>>10,56320|1023&s)}else l+=String.fromCharCode((31&r)<<6|i);else l+=String.fromCharCode(r)}}function UTF8ToString(e){return UTF8ArrayToString(HEAPU8,e)}function stringToUTF8Array(e,t,n,r){if(!(r>0))return 0;for(var i=n,o=n+r-1,u=0;u=55296&&a<=57343&&(a=65536+((1023&a)<<10)|1023&e.charCodeAt(++u)),a<=127){if(n>=o)break;t[n++]=a}else if(a<=2047){if(n+1>=o)break;t[n++]=192|a>>6,t[n++]=128|63&a}else if(a<=65535){if(n+2>=o)break;t[n++]=224|a>>12,t[n++]=128|a>>6&63,t[n++]=128|63&a}else if(a<=2097151){if(n+3>=o)break;t[n++]=240|a>>18,t[n++]=128|a>>12&63,t[n++]=128|a>>6&63,t[n++]=128|63&a}else if(a<=67108863){if(n+4>=o)break;t[n++]=248|a>>24,t[n++]=128|a>>18&63,t[n++]=128|a>>12&63,t[n++]=128|a>>6&63,t[n++]=128|63&a}else{if(n+5>=o)break;t[n++]=252|a>>30,t[n++]=128|a>>24&63,t[n++]=128|a>>18&63,t[n++]=128|a>>12&63,t[n++]=128|a>>6&63,t[n++]=128|63&a}}return t[n]=0,n-i}function stringToUTF8(e,t,n){return stringToUTF8Array(e,HEAPU8,t,n)}function lengthBytesUTF8(e){for(var t=0,n=0;n=55296&&r<=57343&&(r=65536+((1023&r)<<10)|1023&e.charCodeAt(++n)),r<=127?++t:t+=r<=2047?2:r<=65535?3:r<=2097151?4:r<=67108863?5:6}return t}Module.UTF8ArrayToString=UTF8ArrayToString,Module.UTF8ToString=UTF8ToString,Module.stringToUTF8Array=stringToUTF8Array,Module.stringToUTF8=stringToUTF8,Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0,HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64,STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR;function demangle(e){var t=Module.___cxa_demangle||Module.__cxa_demangle;if(t){try{var n=e.substr(1),r=lengthBytesUTF8(n)+1,i=_malloc(r);stringToUTF8(n,i,r);var o=_malloc(4),u=t(i,0,0,o);if(0===getValue(o,"i32")&&u)return Pointer_stringify(u)}catch(e){}finally{i&&_free(i),o&&_free(o),u&&_free(u)}return e}return Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),e}function demangleAll(e){return e.replace(/__Z[\w\d_]+/g,(function(e){var t=demangle(e);return e===t?e:e+" ["+t+"]"}))}function jsStackTrace(){var e=new Error;if(!e.stack){try{throw new Error(0)}catch(t){e=t}if(!e.stack)return"(no stack trace available)"}return e.stack.toString()}function stackTrace(){var e=jsStackTrace();return Module.extraStackTrace&&(e+="\n"+Module.extraStackTrace()),demangleAll(e)}function updateGlobalBufferViews(){Module.HEAP8=HEAP8=new Int8Array(buffer),Module.HEAP16=HEAP16=new Int16Array(buffer),Module.HEAP32=HEAP32=new Int32Array(buffer),Module.HEAPU8=HEAPU8=new Uint8Array(buffer),Module.HEAPU16=HEAPU16=new Uint16Array(buffer),Module.HEAPU32=HEAPU32=new Uint32Array(buffer),Module.HEAPF32=HEAPF32=new Float32Array(buffer),Module.HEAPF64=HEAPF64=new Float64Array(buffer)}function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}Module.stackTrace=stackTrace,STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1;var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||134217728;function getTotalMemory(){return TOTAL_MEMORY}if(TOTAL_MEMORY0;){var t=e.shift();if("function"!=typeof t){var n=t.func;"number"==typeof n?void 0===t.arg?Module.dynCall_v(n):Module.dynCall_vi(n,t.arg):n(void 0===t.arg?null:t.arg)}else t()}}Module.HEAP=HEAP,Module.buffer=buffer,Module.HEAP8=HEAP8,Module.HEAP16=HEAP16,Module.HEAP32=HEAP32,Module.HEAPU8=HEAPU8,Module.HEAPU16=HEAPU16,Module.HEAPU32=HEAPU32,Module.HEAPF32=HEAPF32,Module.HEAPF64=HEAPF64;var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for("function"==typeof Module.preRun&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__),runtimeExited=!0}function postRun(){if(Module.postRun)for("function"==typeof Module.postRun&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(e){__ATPRERUN__.unshift(e)}function addOnInit(e){__ATINIT__.unshift(e)}function addOnPreMain(e){__ATMAIN__.unshift(e)}function addOnExit(e){__ATEXIT__.unshift(e)}function addOnPostRun(e){__ATPOSTRUN__.unshift(e)}function intArrayFromString(e,t,n){var r=n>0?n:lengthBytesUTF8(e)+1,i=new Array(r),o=stringToUTF8Array(e,i,0,i.length);return t&&(i.length=o),i}function intArrayToString(e){for(var t=[],n=0;n255&&(r&=255),t.push(String.fromCharCode(r))}return t.join("")}function writeStringToMemory(e,t,n){var r,i;Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!"),n&&(i=t+lengthBytesUTF8(e),r=HEAP8[i]),stringToUTF8(e,t,1/0),n&&(HEAP8[i]=r)}function writeArrayToMemory(e,t){HEAP8.set(e,t)}function writeAsciiToMemory(e,t,n){for(var r=0;r>0]=e.charCodeAt(r);n||(HEAP8[t>>0]=0)}if(Module.addOnPreRun=addOnPreRun,Module.addOnInit=addOnInit,Module.addOnPreMain=addOnPreMain,Module.addOnExit=addOnExit,Module.addOnPostRun=addOnPostRun,Module.intArrayFromString=intArrayFromString,Module.intArrayToString=intArrayToString,Module.writeStringToMemory=writeStringToMemory,Module.writeArrayToMemory=writeArrayToMemory,Module.writeAsciiToMemory=writeAsciiToMemory,Math.imul&&-5===Math.imul(4294967295,5)||(Math.imul=function(e,t){var n=65535&e,r=65535&t;return n*r+((e>>>16)*r+n*(t>>>16)<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(e){return froundBuffer[0]=e,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(e){e>>>=0;for(var t=0;t<32;t++)if(e&1<<31-t)return t;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(e){return e<0?Math.ceil(e):Math.floor(e)}),Math.trunc=Math.trunc;var Math_abs=Math.abs,Math_cos=Math.cos,Math_sin=Math.sin,Math_tan=Math.tan,Math_acos=Math.acos,Math_asin=Math.asin,Math_atan=Math.atan,Math_atan2=Math.atan2,Math_exp=Math.exp,Math_log=Math.log,Math_sqrt=Math.sqrt,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_pow=Math.pow,Math_imul=Math.imul,Math_fround=Math.fround,Math_round=Math.round,Math_min=Math.min,Math_clz32=Math.clz32,Math_trunc=Math.trunc,runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;function getUniqueRunDependency(e){return e}function addRunDependency(e){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}function removeRunDependency(e){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),0==runDependencies&&(null!==runDependencyWatcher&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var t=dependenciesFulfilled;dependenciesFulfilled=null,t()}}Module.addRunDependency=addRunDependency,Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var ASM_CONSTS=[function(e,t,n,r,i,o,u,a){return _nbind.callbackSignatureList[e].apply(this,arguments)}];function _emscripten_asm_const_iiiiiiii(e,t,n,r,i,o,u,a){return ASM_CONSTS[e](t,n,r,i,o,u,a)}function _emscripten_asm_const_iiiii(e,t,n,r,i){return ASM_CONSTS[e](t,n,r,i)}function _emscripten_asm_const_iiidddddd(e,t,n,r,i,o,u,a,l){return ASM_CONSTS[e](t,n,r,i,o,u,a,l)}function _emscripten_asm_const_iiididi(e,t,n,r,i,o,u){return ASM_CONSTS[e](t,n,r,i,o,u)}function _emscripten_asm_const_iiii(e,t,n,r){return ASM_CONSTS[e](t,n,r)}function _emscripten_asm_const_iiiid(e,t,n,r,i){return ASM_CONSTS[e](t,n,r,i)}function _emscripten_asm_const_iiiiii(e,t,n,r,i,o){return ASM_CONSTS[e](t,n,r,i,o)}STATIC_BASE=Runtime.GLOBAL_BASE,STATICTOP=STATIC_BASE+12800,__ATINIT__.push({func:function(){__GLOBAL__sub_I_Yoga_cpp()}},{func:function(){__GLOBAL__sub_I_nbind_cc()}},{func:function(){__GLOBAL__sub_I_common_cc()}},{func:function(){__GLOBAL__sub_I_Binding_cc()}}),allocate([0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,192,127,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,128,191,0,0,128,191,0,0,192,127,0,0,0,0,0,0,0,0,0,0,128,63,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,190,12,0,0,200,12,0,0,208,12,0,0,216,12,0,0,230,12,0,0,242,12,0,0,1,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,192,127,3,0,0,0,180,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,182,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,183,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,184,45,0,0,185,45,0,0,181,45,0,0,181,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,148,4,0,0,3,0,0,0,187,45,0,0,164,4,0,0,188,45,0,0,2,0,0,0,189,45,0,0,164,4,0,0,188,45,0,0,185,45,0,0,164,4,0,0,185,45,0,0,164,4,0,0,188,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,183,45,0,0,182,45,0,0,181,45,0,0,190,45,0,0,190,45,0,0,182,45,0,0,182,45,0,0,185,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,185,45,0,0,48,5,0,0,3,0,0,0,56,5,0,0,1,0,0,0,189,45,0,0,185,45,0,0,164,4,0,0,76,5,0,0,2,0,0,0,191,45,0,0,186,45,0,0,182,45,0,0,185,45,0,0,192,45,0,0,185,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,76,5,0,0,76,5,0,0,136,5,0,0,182,45,0,0,181,45,0,0,2,0,0,0,190,45,0,0,136,5,0,0,56,19,0,0,156,5,0,0,2,0,0,0,184,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,204,5,0,0,181,45,0,0,181,45,0,0,2,0,0,0,180,45,0,0,204,5,0,0,2,0,0,0,195,45,0,0,236,5,0,0,97,19,0,0,198,45,0,0,211,45,0,0,212,45,0,0,213,45,0,0,214,45,0,0,215,45,0,0,188,45,0,0,182,45,0,0,216,45,0,0,217,45,0,0,218,45,0,0,219,45,0,0,192,45,0,0,181,45,0,0,0,0,0,0,185,45,0,0,110,19,0,0,186,45,0,0,115,19,0,0,221,45,0,0,120,19,0,0,148,4,0,0,132,19,0,0,96,6,0,0,145,19,0,0,222,45,0,0,164,19,0,0,223,45,0,0,173,19,0,0,0,0,0,0,3,0,0,0,104,6,0,0,1,0,0,0,187,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,11,0,0,0,12,0,0,0,1,0,0,0,13,0,0,0,185,45,0,0,224,45,0,0,164,6,0,0,188,45,0,0,172,6,0,0,180,6,0,0,2,0,0,0,188,6,0,0,7,0,0,0,224,45,0,0,7,0,0,0,164,6,0,0,1,0,0,0,213,45,0,0,185,45,0,0,224,45,0,0,172,6,0,0,185,45,0,0,224,45,0,0,164,6,0,0,185,45,0,0,224,45,0,0,211,45,0,0,211,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,172,6,0,0,222,45,0,0,211,45,0,0,224,45,0,0,188,45,0,0,222,45,0,0,211,45,0,0,40,7,0,0,188,45,0,0,2,0,0,0,224,45,0,0,185,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,222,45,0,0,224,45,0,0,148,4,0,0,185,45,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,185,45,0,0,164,6,0,0,148,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,14,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,148,7,0,0,2,0,0,0,225,45,0,0,183,45,0,0,188,45,0,0,168,7,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,234,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,9,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,242,45,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,110,111,100,101,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,119,104,105,99,104,32,115,116,105,108,108,32,104,97,115,32,99,104,105,108,100,114,101,110,32,97,116,116,97,99,104,101,100,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,115,116,105,108,108,32,97,116,116,97,99,104,101,100,32,116,111,32,97,32,112,97,114,101,110,116,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,99,111,110,102,105,103,0,67,97,110,110,111,116,32,115,101,116,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,67,104,105,108,100,32,97,108,114,101,97,100,121,32,104,97,115,32,97,32,112,97,114,101,110,116,44,32,105,116,32,109,117,115,116,32,98,101,32,114,101,109,111,118,101,100,32,102,105,114,115,116,46,0,67,97,110,110,111,116,32,97,100,100,32,99,104,105,108,100,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,79,110,108,121,32,108,101,97,102,32,110,111,100,101,115,32,119,105,116,104,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,115,104,111,117,108,100,32,109,97,110,117,97,108,108,121,32,109,97,114,107,32,116,104,101,109,115,101,108,118,101,115,32,97,115,32,100,105,114,116,121,0,67,97,110,110,111,116,32,103,101,116,32,108,97,121,111,117,116,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,109,117,108,116,105,45,101,100,103,101,32,115,104,111,114,116,104,97,110,100,115,0,37,115,37,100,46,123,91,115,107,105,112,112,101,100,93,32,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,61,62,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,37,115,37,100,46,123,37,115,0,42,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,37,115,10,0,37,115,37,100,46,125,37,115,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,79,117,116,32,111,102,32,99,97,99,104,101,32,101,110,116,114,105,101,115,33,10,0,83,99,97,108,101,32,102,97,99,116,111,114,32,115,104,111,117,108,100,32,110,111,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,122,101,114,111,0,105,110,105,116,105,97,108,0,37,115,10,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,85,78,68,69,70,73,78,69,68,0,69,88,65,67,84,76,89,0,65,84,95,77,79,83,84,0,76,65,89,95,85,78,68,69,70,73,78,69,68,0,76,65,89,95,69,88,65,67,84,76,89,0,76,65,89,95,65,84,95,77,79,83,84,0,97,118,97,105,108,97,98,108,101,87,105,100,116,104,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,119,105,100,116,104,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,97,118,97,105,108,97,98,108,101,72,101,105,103,104,116,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,104,101,105,103,104,116,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,102,108,101,120,0,115,116,114,101,116,99,104,0,109,117,108,116,105,108,105,110,101,45,115,116,114,101,116,99,104,0,69,120,112,101,99,116,101,100,32,110,111,100,101,32,116,111,32,104,97,118,101,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,0,109,101,97,115,117,114,101,0,69,120,112,101,99,116,32,99,117,115,116,111,109,32,98,97,115,101,108,105,110,101,32,102,117,110,99,116,105,111,110,32,116,111,32,110,111,116,32,114,101,116,117,114,110,32,78,97,78,0,97,98,115,45,109,101,97,115,117,114,101,0,97,98,115,45,108,97,121,111,117,116,0,78,111,100,101,0,99,114,101,97,116,101,68,101,102,97,117,108,116,0,99,114,101,97,116,101,87,105,116,104,67,111,110,102,105,103,0,100,101,115,116,114,111,121,0,114,101,115,101,116,0,99,111,112,121,83,116,121,108,101,0,115,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,115,101,116,80,111,115,105,116,105,111,110,0,115,101,116,80,111,115,105,116,105,111,110,80,101,114,99,101,110,116,0,115,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,115,101,116,65,108,105,103,110,73,116,101,109,115,0,115,101,116,65,108,105,103,110,83,101,108,102,0,115,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,115,101,116,70,108,101,120,87,114,97,112,0,115,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,115,101,116,77,97,114,103,105,110,0,115,101,116,77,97,114,103,105,110,80,101,114,99,101,110,116,0,115,101,116,77,97,114,103,105,110,65,117,116,111,0,115,101,116,79,118,101,114,102,108,111,119,0,115,101,116,68,105,115,112,108,97,121,0,115,101,116,70,108,101,120,0,115,101,116,70,108,101,120,66,97,115,105,115,0,115,101,116,70,108,101,120,66,97,115,105,115,80,101,114,99,101,110,116,0,115,101,116,70,108,101,120,71,114,111,119,0,115,101,116,70,108,101,120,83,104,114,105,110,107,0,115,101,116,87,105,100,116,104,0,115,101,116,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,87,105,100,116,104,65,117,116,111,0,115,101,116,72,101,105,103,104,116,0,115,101,116,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,72,101,105,103,104,116,65,117,116,111,0,115,101,116,77,105,110,87,105,100,116,104,0,115,101,116,77,105,110,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,105,110,72,101,105,103,104,116,0,115,101,116,77,105,110,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,77,97,120,87,105,100,116,104,0,115,101,116,77,97,120,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,97,120,72,101,105,103,104,116,0,115,101,116,77,97,120,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,65,115,112,101,99,116,82,97,116,105,111,0,115,101,116,66,111,114,100,101,114,0,115,101,116,80,97,100,100,105,110,103,0,115,101,116,80,97,100,100,105,110,103,80,101,114,99,101,110,116,0,103,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,103,101,116,80,111,115,105,116,105,111,110,0,103,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,103,101,116,65,108,105,103,110,73,116,101,109,115,0,103,101,116,65,108,105,103,110,83,101,108,102,0,103,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,103,101,116,70,108,101,120,87,114,97,112,0,103,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,103,101,116,77,97,114,103,105,110,0,103,101,116,70,108,101,120,66,97,115,105,115,0,103,101,116,70,108,101,120,71,114,111,119,0,103,101,116,70,108,101,120,83,104,114,105,110,107,0,103,101,116,87,105,100,116,104,0,103,101,116,72,101,105,103,104,116,0,103,101,116,77,105,110,87,105,100,116,104,0,103,101,116,77,105,110,72,101,105,103,104,116,0,103,101,116,77,97,120,87,105,100,116,104,0,103,101,116,77,97,120,72,101,105,103,104,116,0,103,101,116,65,115,112,101,99,116,82,97,116,105,111,0,103,101,116,66,111,114,100,101,114,0,103,101,116,79,118,101,114,102,108,111,119,0,103,101,116,68,105,115,112,108,97,121,0,103,101,116,80,97,100,100,105,110,103,0,105,110,115,101,114,116,67,104,105,108,100,0,114,101,109,111,118,101,67,104,105,108,100,0,103,101,116,67,104,105,108,100,67,111,117,110,116,0,103,101,116,80,97,114,101,110,116,0,103,101,116,67,104,105,108,100,0,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,117,110,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,109,97,114,107,68,105,114,116,121,0,105,115,68,105,114,116,121,0,99,97,108,99,117,108,97,116,101,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,76,101,102,116,0,103,101,116,67,111,109,112,117,116,101,100,82,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,84,111,112,0,103,101,116,67,111,109,112,117,116,101,100,66,111,116,116,111,109,0,103,101,116,67,111,109,112,117,116,101,100,87,105,100,116,104,0,103,101,116,67,111,109,112,117,116,101,100,72,101,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,77,97,114,103,105,110,0,103,101,116,67,111,109,112,117,116,101,100,66,111,114,100,101,114,0,103,101,116,67,111,109,112,117,116,101,100,80,97,100,100,105,110,103,0,67,111,110,102,105,103,0,99,114,101,97,116,101,0,115,101,116,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,115,101,116,80,111,105,110,116,83,99,97,108,101,70,97,99,116,111,114,0,105,115,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,86,97,108,117,101,0,76,97,121,111,117,116,0,83,105,122,101,0,103,101,116,73,110,115,116,97,110,99,101,67,111,117,110,116,0,73,110,116,54,52,0,1,1,1,2,2,4,4,4,4,8,8,4,8,118,111,105,100,0,98,111,111,108,0,115,116,100,58,58,115,116,114,105,110,103,0,99,98,70,117,110,99,116,105,111,110,32,38,0,99,111,110,115,116,32,99,98,70,117,110,99,116,105,111,110,32,38,0,69,120,116,101,114,110,97,108,0,66,117,102,102,101,114,0,78,66,105,110,100,73,68,0,78,66,105,110,100,0,98,105,110,100,95,118,97,108,117,101,0,114,101,102,108,101,99,116,0,113,117,101,114,121,84,121,112,101,0,108,97,108,108,111,99,0,108,114,101,115,101,116,0,123,114,101,116,117,114,110,40,95,110,98,105,110,100,46,99,97,108,108,98,97,99,107,83,105,103,110,97,116,117,114,101,76,105,115,116,91,36,48,93,46,97,112,112,108,121,40,116,104,105,115,44,97,114,103,117,109,101,110,116,115,41,41,59,125,0,95,110,98,105,110,100,95,110,101,119,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;function _atexit(e,t){__ATEXIT__.unshift({func:e,arg:t})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}function _abort(){Module.abort()}function __ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj(){Module.printErr("missing function: _ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj"),abort(-1)}function __decorate(e,t,n,r){var i,o=arguments.length,u=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)u=Reflect.decorate(e,t,n,r);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(u=(o<3?i(u):o>3?i(t,n,u):i(t,n))||u);return o>3&&u&&Object.defineProperty(t,n,u),u}function _defineHidden(e){return function(t,n){Object.defineProperty(t,n,{configurable:!1,enumerable:!1,value:e,writable:!0})}}STATICTOP+=16;var _nbind={};function __nbind_free_external(e){_nbind.externalList[e].dereference(e)}function __nbind_reference_external(e){_nbind.externalList[e].reference()}function _llvm_stackrestore(e){var t=_llvm_stacksave,n=t.LLVM_SAVEDSTACKS[e];t.LLVM_SAVEDSTACKS.splice(e,1),Runtime.stackRestore(n)}function __nbind_register_pool(e,t,n,r){_nbind.Pool.pageSize=e,_nbind.Pool.usedPtr=t/4,_nbind.Pool.rootPtr=n,_nbind.Pool.pagePtr=r/4,HEAP32[t/4]=16909060,1==HEAP8[t]&&(_nbind.bigEndian=!0),HEAP32[t/4]=0,_nbind.makeTypeKindTbl=((i={})[1024]=_nbind.PrimitiveType,i[64]=_nbind.Int64Type,i[2048]=_nbind.BindClass,i[3072]=_nbind.BindClassPtr,i[4096]=_nbind.SharedClassPtr,i[5120]=_nbind.ArrayType,i[6144]=_nbind.ArrayType,i[7168]=_nbind.CStringType,i[9216]=_nbind.CallbackType,i[10240]=_nbind.BindType,i),_nbind.makeTypeNameTbl={Buffer:_nbind.BufferType,External:_nbind.ExternalType,Int64:_nbind.Int64Type,_nbind_new:_nbind.CreateValueType,bool:_nbind.BooleanType,"cbFunction &":_nbind.CallbackType,"const cbFunction &":_nbind.CallbackType,"const std::string &":_nbind.StringType,"std::string":_nbind.StringType},Module.toggleLightGC=_nbind.toggleLightGC,_nbind.callUpcast=Module.dynCall_ii;var i,o=_nbind.makeType(_nbind.constructType,{flags:2048,id:0,name:""});o.proto=Module,_nbind.BindClass.list.push(o)}function _emscripten_set_main_loop_timing(e,t){if(Browser.mainLoop.timingMode=e,Browser.mainLoop.timingValue=t,!Browser.mainLoop.func)return 1;if(0==e)Browser.mainLoop.scheduler=function(){var e=0|Math.max(0,Browser.mainLoop.tickStartTime+t-_emscripten_get_now());setTimeout(Browser.mainLoop.runner,e)},Browser.mainLoop.method="timeout";else if(1==e)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method="rAF";else if(2==e){if(!window.setImmediate){var n=[];window.addEventListener("message",(function(e){e.source===window&&"setimmediate"===e.data&&(e.stopPropagation(),n.shift()())}),!0),window.setImmediate=function(e){n.push(e),ENVIRONMENT_IS_WORKER?(void 0===Module.setImmediates&&(Module.setImmediates=[]),Module.setImmediates.push(e),window.postMessage({target:"setimmediate"})):window.postMessage("setimmediate","*")}}Browser.mainLoop.scheduler=function(){window.setImmediate(Browser.mainLoop.runner)},Browser.mainLoop.method="immediate"}return 0}function _emscripten_get_now(){abort()}function _emscripten_set_main_loop(e,t,n,r,i){var o;Module.noExitRuntime=!0,assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters."),Browser.mainLoop.func=e,Browser.mainLoop.arg=r,o=void 0!==r?function(){Module.dynCall_vi(e,r)}:function(){Module.dynCall_v(e)};var u=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT)if(Browser.mainLoop.queue.length>0){var e=Date.now(),t=Browser.mainLoop.queue.shift();if(t.func(t.arg),Browser.mainLoop.remainingBlockers){var n=Browser.mainLoop.remainingBlockers,r=n%1==0?n-1:Math.floor(n);t.counted?Browser.mainLoop.remainingBlockers=r:(r+=.5,Browser.mainLoop.remainingBlockers=(8*n+r)/9)}if(console.log('main loop blocker "'+t.name+'" took '+(Date.now()-e)+" ms"),Browser.mainLoop.updateStatus(),u1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0?Browser.mainLoop.scheduler():(0==Browser.mainLoop.timingMode&&(Browser.mainLoop.tickStartTime=_emscripten_get_now()),"timeout"===Browser.mainLoop.method&&Module.ctx&&(Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!"),Browser.mainLoop.method=""),Browser.mainLoop.runIter(o),u0?_emscripten_set_main_loop_timing(0,1e3/t):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),n)throw"SimulateInfiniteLoop"}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null,Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var e=Browser.mainLoop.timingMode,t=Browser.mainLoop.timingValue,n=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(n,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(e,t),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var e=Module.statusMessage||"Please wait...",t=Browser.mainLoop.remainingBlockers,n=Browser.mainLoop.expectedBlockers;t?t=6;){var u=r>>i-6&63;i-=6,n+=t[u]}return 2==i?(n+=t[(3&r)<<4],n+="=="):4==i&&(n+=t[(15&r)<<2],n+="="),n}(e),o(s))},s.src=l,Browser.safeSetTimeout((function(){o(s)}),1e4)}};Module.preloadPlugins.push(t);var n=Module.canvas;n&&(n.requestPointerLock=n.requestPointerLock||n.mozRequestPointerLock||n.webkitRequestPointerLock||n.msRequestPointerLock||function(){},n.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},n.exitPointerLock=n.exitPointerLock.bind(document),document.addEventListener("pointerlockchange",r,!1),document.addEventListener("mozpointerlockchange",r,!1),document.addEventListener("webkitpointerlockchange",r,!1),document.addEventListener("mspointerlockchange",r,!1),Module.elementPointerLock&&n.addEventListener("click",(function(e){!Browser.pointerLock&&Module.canvas.requestPointerLock&&(Module.canvas.requestPointerLock(),e.preventDefault())}),!1))}function r(){Browser.pointerLock=document.pointerLockElement===Module.canvas||document.mozPointerLockElement===Module.canvas||document.webkitPointerLockElement===Module.canvas||document.msPointerLockElement===Module.canvas}},createContext:function(e,t,n,r){if(t&&Module.ctx&&e==Module.canvas)return Module.ctx;var i,o;if(t){var u={antialias:!1,alpha:!1};if(r)for(var a in r)u[a]=r[a];(o=GL.createContext(e,u))&&(i=GL.getContext(o).GLctx)}else i=e.getContext("2d");return i?(n&&(t||assert("undefined"==typeof GLctx,"cannot set in module if GLctx is used, but we are a non-GL context that would replace it"),Module.ctx=i,t&&GL.makeContextCurrent(o),Module.useWebGL=t,Browser.moduleContextCreatedCallbacks.forEach((function(e){e()})),Browser.init()),i):null},destroyContext:function(e,t,n){},fullscreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullscreen:function(e,t,n){Browser.lockPointer=e,Browser.resizeCanvas=t,Browser.vrDevice=n,void 0===Browser.lockPointer&&(Browser.lockPointer=!0),void 0===Browser.resizeCanvas&&(Browser.resizeCanvas=!1),void 0===Browser.vrDevice&&(Browser.vrDevice=null);var r=Module.canvas;function i(){Browser.isFullscreen=!1;var e=r.parentNode;(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===e?(r.exitFullscreen=document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.msExitFullscreen||document.webkitCancelFullScreen||function(){},r.exitFullscreen=r.exitFullscreen.bind(document),Browser.lockPointer&&r.requestPointerLock(),Browser.isFullscreen=!0,Browser.resizeCanvas&&Browser.setFullscreenCanvasSize()):(e.parentNode.insertBefore(r,e),e.parentNode.removeChild(e),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullscreen),Module.onFullscreen&&Module.onFullscreen(Browser.isFullscreen),Browser.updateCanvasDimensions(r)}Browser.fullscreenHandlersInstalled||(Browser.fullscreenHandlersInstalled=!0,document.addEventListener("fullscreenchange",i,!1),document.addEventListener("mozfullscreenchange",i,!1),document.addEventListener("webkitfullscreenchange",i,!1),document.addEventListener("MSFullscreenChange",i,!1));var o=document.createElement("div");r.parentNode.insertBefore(o,r),o.appendChild(r),o.requestFullscreen=o.requestFullscreen||o.mozRequestFullScreen||o.msRequestFullscreen||(o.webkitRequestFullscreen?function(){o.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}:null)||(o.webkitRequestFullScreen?function(){o.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),n?o.requestFullscreen({vrDisplay:n}):o.requestFullscreen()},requestFullScreen:function(e,t,n){return Module.printErr("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead."),Browser.requestFullScreen=function(e,t,n){return Browser.requestFullscreen(e,t,n)},Browser.requestFullscreen(e,t,n)},nextRAF:0,fakeRequestAnimationFrame:function(e){var t=Date.now();if(0===Browser.nextRAF)Browser.nextRAF=t+1e3/60;else for(;t+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var n=Math.max(Browser.nextRAF-t,0);setTimeout(e,n)},requestAnimationFrame:function(e){"undefined"==typeof window?Browser.fakeRequestAnimationFrame(e):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(e))},safeCallback:function(e){return function(){if(!ABORT)return e.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var e=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],e.forEach((function(e){e()}))}},safeRequestAnimationFrame:function(e){return Browser.requestAnimationFrame((function(){ABORT||(Browser.allowAsyncCallbacks?e():Browser.queuedAsyncCallbacks.push(e))}))},safeSetTimeout:function(e,t){return Module.noExitRuntime=!0,setTimeout((function(){ABORT||(Browser.allowAsyncCallbacks?e():Browser.queuedAsyncCallbacks.push(e))}),t)},safeSetInterval:function(e,t){return Module.noExitRuntime=!0,setInterval((function(){ABORT||Browser.allowAsyncCallbacks&&e()}),t)},getMimetype:function(e){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[e.substr(e.lastIndexOf(".")+1)]},getUserMedia:function(e){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(e)},getMovementX:function(e){return e.movementX||e.mozMovementX||e.webkitMovementX||0},getMovementY:function(e){return e.movementY||e.mozMovementY||e.webkitMovementY||0},getMouseWheelDelta:function(e){var t=0;switch(e.type){case"DOMMouseScroll":t=e.detail;break;case"mousewheel":t=e.wheelDelta;break;case"wheel":t=e.deltaY;break;default:throw"unrecognized mouse wheel event: "+e.type}return t},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(e){if(Browser.pointerLock)"mousemove"!=e.type&&"mozMovementX"in e?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(e),Browser.mouseMovementY=Browser.getMovementY(e)),"undefined"!=typeof SDL?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var t=Module.canvas.getBoundingClientRect(),n=Module.canvas.width,r=Module.canvas.height,i=void 0!==window.scrollX?window.scrollX:window.pageXOffset,o=void 0!==window.scrollY?window.scrollY:window.pageYOffset;if("touchstart"===e.type||"touchend"===e.type||"touchmove"===e.type){var u=e.touch;if(void 0===u)return;var a=u.pageX-(i+t.left),l=u.pageY-(o+t.top),s={x:a*=n/t.width,y:l*=r/t.height};if("touchstart"===e.type)Browser.lastTouches[u.identifier]=s,Browser.touches[u.identifier]=s;else if("touchend"===e.type||"touchmove"===e.type){var c=Browser.touches[u.identifier];c||(c=s),Browser.lastTouches[u.identifier]=c,Browser.touches[u.identifier]=s}return}var f=e.pageX-(i+t.left),d=e.pageY-(o+t.top);f*=n/t.width,d*=r/t.height,Browser.mouseMovementX=f-Browser.mouseX,Browser.mouseMovementY=d-Browser.mouseY,Browser.mouseX=f,Browser.mouseY=d}},asyncLoad:function(e,t,n,r){var i=r?"":getUniqueRunDependency("al "+e);Module.readAsync(e,(function(n){assert(n,'Loading data file "'+e+'" failed (no arrayBuffer).'),t(new Uint8Array(n)),i&&removeRunDependency(i)}),(function(t){if(!n)throw'Loading data file "'+e+'" failed.';n()})),i&&addRunDependency(i)},resizeListeners:[],updateResizeListeners:function(){var e=Module.canvas;Browser.resizeListeners.forEach((function(t){t(e.width,e.height)}))},setCanvasSize:function(e,t,n){var r=Module.canvas;Browser.updateCanvasDimensions(r,e,t),n||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if("undefined"!=typeof SDL){var e=HEAPU32[SDL.screen+0*Runtime.QUANTUM_SIZE>>2];e|=8388608,HEAP32[SDL.screen+0*Runtime.QUANTUM_SIZE>>2]=e}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if("undefined"!=typeof SDL){var e=HEAPU32[SDL.screen+0*Runtime.QUANTUM_SIZE>>2];e&=-8388609,HEAP32[SDL.screen+0*Runtime.QUANTUM_SIZE>>2]=e}Browser.updateResizeListeners()},updateCanvasDimensions:function(e,t,n){t&&n?(e.widthNative=t,e.heightNative=n):(t=e.widthNative,n=e.heightNative);var r=t,i=n;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(r/i>2]},getStr:function(){return Pointer_stringify(SYSCALLS.get())},get64:function(){var e=SYSCALLS.get(),t=SYSCALLS.get();return assert(e>=0?0===t:-1===t),e},getZero:function(){assert(0===SYSCALLS.get())}};function ___syscall6(e,t){SYSCALLS.varargs=t;try{var n=SYSCALLS.getStreamFromFD();return FS.close(n),0}catch(e){return"undefined"!=typeof FS&&e instanceof FS.ErrnoError||abort(e),-e.errno}}function ___syscall54(e,t){SYSCALLS.varargs=t;try{return 0}catch(e){return"undefined"!=typeof FS&&e instanceof FS.ErrnoError||abort(e),-e.errno}}function _typeModule(e){var t=[[0,1,"X"],[1,1,"const X"],[128,1,"X *"],[256,1,"X &"],[384,1,"X &&"],[512,1,"std::shared_ptr"],[640,1,"std::unique_ptr"],[5120,1,"std::vector"],[6144,2,"std::array"],[9216,-1,"std::function"]];function n(e,t,n,r,i,o){if(1==t){var u=896&r;128!=u&&256!=u&&384!=u||(e="X const")}return(o?n.replace("X",e).replace("Y",i):e.replace("X",n).replace("Y",i)).replace(/([*&]) (?=[*&])/g,"$1")}function r(e,t){var n=t.flags,r=896&n,i=15360&n;return t.name||1024!=i||(1==t.ptrSize?t.name=(16&n?"":(8&n?"un":"")+"signed ")+"char":t.name=(8&n?"u":"")+(32&n?"float":"int")+8*t.ptrSize+"_t"),8!=t.ptrSize||32&n||(i=64),2048==i&&(512==r||640==r?i=4096:r&&(i=3072)),e(i,t)}var i={Type:function(){function e(e){this.id=e.id,this.name=e.name,this.flags=e.flags,this.spec=e}return e.prototype.toString=function(){return this.name},e}(),getComplexType:function e(i,o,u,a,l,s,c,f){void 0===s&&(s="X"),void 0===f&&(f=1);var d=u(i);if(d)return d;var p,h=a(i),v=h.placeholderFlag,m=t[v];c&&m&&(s=n(c[2],c[0],s,m[0],"?",!0)),0==v&&(p="Unbound"),v>=10&&(p="Corrupt"),f>20&&(p="Deeply nested"),p&&function(e,t,n,r,i){throw new Error(e+" type "+n.replace("X",t+"?")+(r?" with flag "+r:"")+" in "+i)}(p,i,s,v,l||"?");var g,y=e(h.paramList[0],o,u,a,l,s,m,f+1),_={flags:m[0],id:i,name:"",paramList:[y]},b=[],w="?";switch(h.placeholderFlag){case 1:g=y.spec;break;case 2:if(1024==(15360&y.flags)&&1==y.spec.ptrSize){_.flags=7168;break}case 3:case 6:case 5:g=y.spec,y.flags;break;case 8:w=""+h.paramList[1],_.paramList.push(h.paramList[1]);break;case 9:for(var E=0,D=h.paramList[1];E>2]=e),e}function _llvm_stacksave(){var e=_llvm_stacksave;return e.LLVM_SAVEDSTACKS||(e.LLVM_SAVEDSTACKS=[]),e.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),e.LLVM_SAVEDSTACKS.length-1}function ___syscall140(e,t){SYSCALLS.varargs=t;try{var n=SYSCALLS.getStreamFromFD(),r=(SYSCALLS.get(),SYSCALLS.get()),i=SYSCALLS.get(),o=SYSCALLS.get(),u=r;return FS.llseek(n,u,o),HEAP32[i>>2]=n.position,n.getdents&&0===u&&0===o&&(n.getdents=null),0}catch(e){return"undefined"!=typeof FS&&e instanceof FS.ErrnoError||abort(e),-e.errno}}function ___syscall146(e,t){SYSCALLS.varargs=t;try{var n=SYSCALLS.get(),r=SYSCALLS.get(),i=SYSCALLS.get(),o=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(e,t){var n=___syscall146.buffers[e];assert(n),0===t||10===t?((1===e?Module.print:Module.printErr)(UTF8ArrayToString(n,0)),n.length=0):n.push(t)});for(var u=0;u>2],l=HEAP32[r+(8*u+4)>>2],s=0;se.pageSize/2||t>e.pageSize-n?_nbind.typeNameTbl.NBind.proto.lalloc(t):(HEAPU32[e.usedPtr]=n+t,e.rootPtr+n)},e.lreset=function(t,n){HEAPU32[e.pagePtr]?_nbind.typeNameTbl.NBind.proto.lreset(t,n):HEAPU32[e.usedPtr]=t},e}();function constructType(e,t){var n=new(10240==e?_nbind.makeTypeNameTbl[t.name]||_nbind.BindType:_nbind.makeTypeKindTbl[e])(t);return typeIdTbl[t.id]=n,_nbind.typeNameTbl[t.name]=n,n}function getType(e){return typeIdTbl[e]}function queryType(e){var t=HEAPU8[e],n=_nbind.structureList[t][1];e/=4,n<0&&(++e,n=HEAPU32[e]+1);var r=Array.prototype.slice.call(HEAPU32.subarray(e+1,e+1+n));return 9==t&&(r=[r[0],r.slice(1)]),{paramList:r,placeholderFlag:t}}function getTypes(e,t){return e.map((function(e){return"number"==typeof e?_nbind.getComplexType(e,constructType,getType,queryType,t):_nbind.typeNameTbl[e]}))}function readTypeIdList(e,t){return Array.prototype.slice.call(HEAPU32,e/4,e/4+t)}function readAsciiString(e){for(var t=e;HEAPU8[t++];);return String.fromCharCode.apply("",HEAPU8.subarray(e,t-1))}function readPolicyList(e){var t={};if(e)for(;;){var n=HEAPU32[e/4];if(!n)break;t[readAsciiString(n)]=!0,e+=4}return t}function getDynCall(e,t){var n={float32_t:"d",float64_t:"d",int64_t:"d",uint64_t:"d",void:"v"},r=e.map((function(e){return n[e.name]||"i"})).join(""),i=Module["dynCall_"+r];if(!i)throw new Error("dynCall_"+r+" not found for "+t+"("+e.map((function(e){return e.name})).join(", ")+")");return i}function addMethod(e,t,n,r){var i=e[t];e.hasOwnProperty(t)&&i?((i.arity||0===i.arity)&&(i=_nbind.makeOverloader(i,i.arity),e[t]=i),i.addMethod(n,r)):(n.arity=r,e[t]=n)}function throwError(e){throw new Error(e)}_nbind.Pool=Pool,_nbind.constructType=constructType,_nbind.getType=getType,_nbind.queryType=queryType,_nbind.getTypes=getTypes,_nbind.readTypeIdList=readTypeIdList,_nbind.readAsciiString=readAsciiString,_nbind.readPolicyList=readPolicyList,_nbind.getDynCall=getDynCall,_nbind.addMethod=addMethod,_nbind.throwError=throwError,_nbind.bigEndian=!1,_a=_typeModule(_typeModule),_nbind.Type=_a.Type,_nbind.makeType=_a.makeType,_nbind.getComplexType=_a.getComplexType,_nbind.structureList=_a.structureList;var BindType=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.heap=HEAPU32,t.ptrSize=4,t}return __extends(t,e),t.prototype.needsWireRead=function(e){return!!this.wireRead||!!this.makeWireRead},t.prototype.needsWireWrite=function(e){return!!this.wireWrite||!!this.makeWireWrite},t}(_nbind.Type);_nbind.BindType=BindType;var PrimitiveType=function(e){function t(t){var n=e.call(this,t)||this,r=32&t.flags?{32:HEAPF32,64:HEAPF64}:8&t.flags?{8:HEAPU8,16:HEAPU16,32:HEAPU32}:{8:HEAP8,16:HEAP16,32:HEAP32};return n.heap=r[8*t.ptrSize],n.ptrSize=t.ptrSize,n}return __extends(t,e),t.prototype.needsWireWrite=function(e){return!!e&&!!e.Strict},t.prototype.makeWireWrite=function(e,t){return t&&t.Strict&&function(e){if("number"==typeof e)return e;throw new Error("Type mismatch")}},t}(BindType);function pushCString(e,t){if(null==e){if(t&&t.Nullable)return 0;throw new Error("Type mismatch")}if(t&&t.Strict){if("string"!=typeof e)throw new Error("Type mismatch")}else e=e.toString();var n=Module.lengthBytesUTF8(e)+1,r=_nbind.Pool.lalloc(n);return Module.stringToUTF8Array(e,HEAPU8,r,n),r}function popCString(e){return 0===e?null:Module.Pointer_stringify(e)}_nbind.PrimitiveType=PrimitiveType,_nbind.pushCString=pushCString,_nbind.popCString=popCString;var CStringType=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.wireRead=popCString,t.wireWrite=pushCString,t.readResources=[_nbind.resources.pool],t.writeResources=[_nbind.resources.pool],t}return __extends(t,e),t.prototype.makeWireWrite=function(e,t){return function(e){return pushCString(e,t)}},t}(BindType);_nbind.CStringType=CStringType;var BooleanType=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.wireRead=function(e){return!!e},t}return __extends(t,e),t.prototype.needsWireWrite=function(e){return!!e&&!!e.Strict},t.prototype.makeWireRead=function(e){return"!!("+e+")"},t.prototype.makeWireWrite=function(e,t){return t&&t.Strict&&function(e){if("boolean"==typeof e)return e;throw new Error("Type mismatch")}||e},t}(BindType);_nbind.BooleanType=BooleanType;var Wrapper=function(){function e(){}return e.prototype.persist=function(){this.__nbindState|=1},e}();function makeBound(e,t){var n=function(e){function n(t,r,i,o){var u=e.call(this)||this;if(!(u instanceof n))return new(Function.prototype.bind.apply(n,Array.prototype.concat.apply([null],arguments)));var a=r,l=i,s=o;if(t!==_nbind.ptrMarker){var c=u.__nbindConstructor.apply(u,arguments);a=4608,s=HEAPU32[c/4],l=HEAPU32[c/4+1]}var f={configurable:!0,enumerable:!1,value:null,writable:!1},d={__nbindFlags:a,__nbindPtr:l};s&&(d.__nbindShared=s,_nbind.mark(u));for(var p=0,h=Object.keys(d);p>=1;var n=_nbind.valueList[e];return _nbind.valueList[e]=firstFreeValue,firstFreeValue=e,n}if(t)return _nbind.popShared(e,t);throw new Error("Invalid value slot "+e)}_nbind.pushValue=pushValue,_nbind.popValue=popValue;var valueBase=0x10000000000000000;function push64(e){return"number"==typeof e?e:4096*pushValue(e)+valueBase}function pop64(e){return e=3?Buffer.from(o):new Buffer(o)).copy(r):getBuffer(r).set(o)}}_nbind.BufferType=BufferType,_nbind.commitBuffer=commitBuffer;var dirtyList=[],gcTimer=0;function sweep(){for(var e=0,t=dirtyList;e>2]=DYNAMIC_BASE,staticSealed=!0,Module.asmGlobalArg={Math,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Float32Array,Float64Array,NaN:NaN,Infinity:1/0},Module.asmLibraryArg={abort,assert,enlargeMemory,getTotalMemory,abortOnCannotGrowMemory,invoke_viiiii,invoke_vif,invoke_vid,invoke_fiff,invoke_vi,invoke_vii,invoke_ii,invoke_viddi,invoke_vidd,invoke_iiii,invoke_diii,invoke_di,invoke_iid,invoke_iii,invoke_viiddi,invoke_viiiiii,invoke_dii,invoke_i,invoke_iiiiii,invoke_viiid,invoke_viififi,invoke_viii,invoke_v,invoke_viid,invoke_idd,invoke_viiii,_emscripten_asm_const_iiiii,_emscripten_asm_const_iiidddddd,_emscripten_asm_const_iiiid,__nbind_reference_external,_emscripten_asm_const_iiiiiiii,_removeAccessorPrefix,_typeModule,__nbind_register_pool,__decorate,_llvm_stackrestore,___cxa_atexit,__extends,__nbind_get_value_object,__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,_emscripten_set_main_loop_timing,__nbind_register_primitive,__nbind_register_type,_emscripten_memcpy_big,__nbind_register_function,___setErrNo,__nbind_register_class,__nbind_finish,_abort,_nbind_value,_llvm_stacksave,___syscall54,_defineHidden,_emscripten_set_main_loop,_emscripten_get_now,__nbind_register_callback_signature,_emscripten_asm_const_iiiiii,__nbind_free_external,_emscripten_asm_const_iiii,_emscripten_asm_const_iiididi,___syscall6,_atexit,___syscall140,___syscall146,DYNAMICTOP_PTR,tempDoublePtr,ABORT,STACKTOP,STACK_MAX,cttz_i8,___dso_handle};var asm=function(e,t,n){"use asm";var r=new e.Int8Array(n);var i=new e.Int16Array(n);var o=new e.Int32Array(n);var u=new e.Uint8Array(n);var a=new e.Uint16Array(n);var l=new e.Uint32Array(n);var s=new e.Float32Array(n);var c=new e.Float64Array(n);var f=t.DYNAMICTOP_PTR|0;var d=t.tempDoublePtr|0;var p=t.ABORT|0;var h=t.STACKTOP|0;var v=t.STACK_MAX|0;var m=t.cttz_i8|0;var g=t.___dso_handle|0;var y=0;var _=0;var b=0;var w=0;var E=e.NaN,D=e.Infinity;var S=0,C=0,k=0,T=0,x=0.0;var A=0;var O=e.Math.floor;var P=e.Math.abs;var I=e.Math.sqrt;var N=e.Math.pow;var M=e.Math.cos;var R=e.Math.sin;var F=e.Math.tan;var L=e.Math.acos;var B=e.Math.asin;var j=e.Math.atan;var U=e.Math.atan2;var z=e.Math.exp;var W=e.Math.log;var H=e.Math.ceil;var V=e.Math.imul;var q=e.Math.min;var G=e.Math.max;var $=e.Math.clz32;var Y=e.Math.fround;var K=t.abort;var X=t.assert;var Q=t.enlargeMemory;var J=t.getTotalMemory;var Z=t.abortOnCannotGrowMemory;var ee=t.invoke_viiiii;var te=t.invoke_vif;var ne=t.invoke_vid;var re=t.invoke_fiff;var ie=t.invoke_vi;var oe=t.invoke_vii;var ue=t.invoke_ii;var ae=t.invoke_viddi;var le=t.invoke_vidd;var se=t.invoke_iiii;var ce=t.invoke_diii;var fe=t.invoke_di;var de=t.invoke_iid;var pe=t.invoke_iii;var he=t.invoke_viiddi;var ve=t.invoke_viiiiii;var me=t.invoke_dii;var ge=t.invoke_i;var ye=t.invoke_iiiiii;var _e=t.invoke_viiid;var be=t.invoke_viififi;var we=t.invoke_viii;var Ee=t.invoke_v;var De=t.invoke_viid;var Se=t.invoke_idd;var Ce=t.invoke_viiii;var ke=t._emscripten_asm_const_iiiii;var Te=t._emscripten_asm_const_iiidddddd;var xe=t._emscripten_asm_const_iiiid;var Ae=t.__nbind_reference_external;var Oe=t._emscripten_asm_const_iiiiiiii;var Pe=t._removeAccessorPrefix;var Ie=t._typeModule;var Ne=t.__nbind_register_pool;var Me=t.__decorate;var Re=t._llvm_stackrestore;var Fe=t.___cxa_atexit;var Le=t.__extends;var Be=t.__nbind_get_value_object;var je=t.__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj;var Ue=t._emscripten_set_main_loop_timing;var ze=t.__nbind_register_primitive;var We=t.__nbind_register_type;var He=t._emscripten_memcpy_big;var Ve=t.__nbind_register_function;var qe=t.___setErrNo;var Ge=t.__nbind_register_class;var $e=t.__nbind_finish;var Ye=t._abort;var Ke=t._nbind_value;var Xe=t._llvm_stacksave;var Qe=t.___syscall54;var Je=t._defineHidden;var Ze=t._emscripten_set_main_loop;var et=t._emscripten_get_now;var tt=t.__nbind_register_callback_signature;var nt=t._emscripten_asm_const_iiiiii;var rt=t.__nbind_free_external;var it=t._emscripten_asm_const_iiii;var ot=t._emscripten_asm_const_iiididi;var ut=t.___syscall6;var at=t._atexit;var lt=t.___syscall140;var st=t.___syscall146;var ct=Y(0);const ft=Y(0);function dt(e){e=e|0;var t=0;t=h;h=h+e|0;h=h+15&-16;return t|0}function pt(){return h|0}function ht(e){e=e|0;h=e}function vt(e,t){e=e|0;t=t|0;h=e;v=t}function mt(e,t){e=e|0;t=t|0;if(!y){y=e;_=t}}function gt(e){e=e|0;A=e}function yt(){return A|0}function _t(){var e=0,t=0;ix(8104,8,400)|0;ix(8504,408,540)|0;e=9044;t=e+44|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));r[9088]=0;r[9089]=1;o[2273]=0;o[2274]=948;o[2275]=948;Fe(17,8104,g|0)|0;return}function bt(e){e=e|0;qt(e+948|0);return}function wt(e){e=Y(e);return((Ii(e)|0)&2147483647)>>>0>2139095040|0}function Et(e,t,n){e=e|0;t=t|0;n=n|0;e:do{if(!(o[e+(t<<3)+4>>2]|0)){if((t|2|0)==3?o[e+60>>2]|0:0){e=e+56|0;break}switch(t|0){case 0:case 2:case 4:case 5:{if(o[e+52>>2]|0){e=e+48|0;break e}break}default:{}}if(!(o[e+68>>2]|0)){e=(t|1|0)==5?948:n;break}else{e=e+64|0;break}}else e=e+(t<<3)|0}while(0);return e|0}function Dt(e){e=e|0;var t=0;t=qk(1e3)|0;St(e,(t|0)!=0,2456);o[2276]=(o[2276]|0)+1;ix(t|0,8104,1e3)|0;if(r[e+2>>0]|0){o[t+4>>2]=2;o[t+12>>2]=4}o[t+976>>2]=e;return t|0}function St(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0;i=h;h=h+16|0;r=i;if(!t){o[r>>2]=n;Lr(e,5,3197,r)}h=i;return}function Ct(){return Dt(956)|0}function kt(e){e=e|0;var t=0;t=$T(1e3)|0;Tt(t,e);St(o[e+976>>2]|0,1,2456);o[2276]=(o[2276]|0)+1;o[t+944>>2]=0;return t|0}function Tt(e,t){e=e|0;t=t|0;var n=0;ix(e|0,t|0,948)|0;Ur(e+948|0,t+948|0);n=e+960|0;e=t+960|0;t=n+40|0;do{o[n>>2]=o[e>>2];n=n+4|0;e=e+4|0}while((n|0)<(t|0));return}function xt(e){e=e|0;var t=0,n=0,r=0,i=0;t=e+944|0;n=o[t>>2]|0;if(n|0){At(n+948|0,e)|0;o[t>>2]=0}n=Ot(e)|0;if(n|0){t=0;do{o[(Pt(e,t)|0)+944>>2]=0;t=t+1|0}while((t|0)!=(n|0))}n=e+948|0;r=o[n>>2]|0;i=e+952|0;t=o[i>>2]|0;if((t|0)!=(r|0))o[i>>2]=t+(~((t+-4-r|0)>>>2)<<2);It(n);Gk(e);o[2276]=(o[2276]|0)+-1;return}function At(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0;r=o[e>>2]|0;l=e+4|0;n=o[l>>2]|0;u=n;e:do{if((r|0)==(n|0)){i=r;a=4}else{e=r;while(1){if((o[e>>2]|0)==(t|0)){i=e;a=4;break e}e=e+4|0;if((e|0)==(n|0)){e=0;break}}}}while(0);if((a|0)==4)if((i|0)!=(n|0)){r=i+4|0;e=u-r|0;t=e>>2;if(t){sx(i|0,r|0,e|0)|0;n=o[l>>2]|0}e=i+(t<<2)|0;if((n|0)==(e|0))e=1;else{o[l>>2]=n+(~((n+-4-e|0)>>>2)<<2);e=1}}else e=0;return e|0}function Ot(e){e=e|0;return(o[e+952>>2]|0)-(o[e+948>>2]|0)>>2|0}function Pt(e,t){e=e|0;t=t|0;var n=0;n=o[e+948>>2]|0;if((o[e+952>>2]|0)-n>>2>>>0>t>>>0)e=o[n+(t<<2)>>2]|0;else e=0;return e|0}function It(e){e=e|0;var t=0,n=0,r=0,i=0;r=h;h=h+32|0;t=r;i=o[e>>2]|0;n=(o[e+4>>2]|0)-i|0;if(((o[e+8>>2]|0)-i|0)>>>0>n>>>0){i=n>>2;Ni(t,i,i,e+8|0);Mi(e,t);Ri(t)}h=r;return}function Nt(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0;c=Ot(e)|0;do{if(c|0){if((o[(Pt(e,0)|0)+944>>2]|0)==(e|0)){if(!(At(e+948|0,t)|0))break;ix(t+400|0,8504,540)|0;o[t+944>>2]=0;Vt(e);break}a=o[(o[e+976>>2]|0)+12>>2]|0;l=e+948|0;s=(a|0)==0;n=0;u=0;do{r=o[(o[l>>2]|0)+(u<<2)>>2]|0;if((r|0)==(t|0))Vt(e);else{i=kt(r)|0;o[(o[l>>2]|0)+(n<<2)>>2]=i;o[i+944>>2]=e;if(!s)RA[a&15](r,i,e,n);n=n+1|0}u=u+1|0}while((u|0)!=(c|0));if(n>>>0>>0){s=e+948|0;l=e+952|0;a=n;n=o[l>>2]|0;do{u=(o[s>>2]|0)+(a<<2)|0;r=u+4|0;i=n-r|0;t=i>>2;if(!t)i=n;else{sx(u|0,r|0,i|0)|0;n=o[l>>2]|0;i=n}r=u+(t<<2)|0;if((i|0)!=(r|0)){n=i+(~((i+-4-r|0)>>>2)<<2)|0;o[l>>2]=n}a=a+1|0}while((a|0)!=(c|0))}}}while(0);return}function Mt(e){e=e|0;var t=0,n=0,i=0,u=0;Rt(e,(Ot(e)|0)==0,2491);Rt(e,(o[e+944>>2]|0)==0,2545);t=e+948|0;n=o[t>>2]|0;i=e+952|0;u=o[i>>2]|0;if((u|0)!=(n|0))o[i>>2]=u+(~((u+-4-n|0)>>>2)<<2);It(t);t=e+976|0;n=o[t>>2]|0;ix(e|0,8104,1e3)|0;if(r[n+2>>0]|0){o[e+4>>2]=2;o[e+12>>2]=4}o[t>>2]=n;return}function Rt(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0;i=h;h=h+16|0;r=i;if(!t){o[r>>2]=n;Cr(e,5,3197,r)}h=i;return}function Ft(){return o[2276]|0}function Lt(){var e=0;e=qk(20)|0;Bt((e|0)!=0,2592);o[2277]=(o[2277]|0)+1;o[e>>2]=o[239];o[e+4>>2]=o[240];o[e+8>>2]=o[241];o[e+12>>2]=o[242];o[e+16>>2]=o[243];return e|0}function Bt(e,t){e=e|0;t=t|0;var n=0,r=0;r=h;h=h+16|0;n=r;if(!e){o[n>>2]=t;Cr(0,5,3197,n)}h=r;return}function jt(e){e=e|0;Gk(e);o[2277]=(o[2277]|0)+-1;return}function Ut(e,t){e=e|0;t=t|0;var n=0;if(!t){n=0;t=0}else{Rt(e,(Ot(e)|0)==0,2629);n=1}o[e+964>>2]=t;o[e+988>>2]=n;return}function zt(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;u=r+8|0;i=r+4|0;a=r;o[i>>2]=t;Rt(e,(o[t+944>>2]|0)==0,2709);Rt(e,(o[e+964>>2]|0)==0,2763);Wt(e);t=e+948|0;o[a>>2]=(o[t>>2]|0)+(n<<2);o[u>>2]=o[a>>2];Ht(t,u,i)|0;o[(o[i>>2]|0)+944>>2]=e;Vt(e);h=r;return}function Wt(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0;n=Ot(e)|0;if(n|0?(o[(Pt(e,0)|0)+944>>2]|0)!=(e|0):0){r=o[(o[e+976>>2]|0)+12>>2]|0;i=e+948|0;u=(r|0)==0;t=0;do{a=o[(o[i>>2]|0)+(t<<2)>>2]|0;l=kt(a)|0;o[(o[i>>2]|0)+(t<<2)>>2]=l;o[l+944>>2]=e;if(!u)RA[r&15](a,l,e,t);t=t+1|0}while((t|0)!=(n|0))}return}function Ht(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0,m=0,g=0,y=0,_=0;y=h;h=h+64|0;d=y+52|0;l=y+48|0;p=y+28|0;v=y+24|0;m=y+20|0;g=y;r=o[e>>2]|0;u=r;t=r+((o[t>>2]|0)-u>>2<<2)|0;r=e+4|0;i=o[r>>2]|0;a=e+8|0;do{if(i>>>0<(o[a>>2]|0)>>>0){if((t|0)==(i|0)){o[t>>2]=o[n>>2];o[r>>2]=(o[r>>2]|0)+4;break}Fi(e,t,i,t+4|0);if(t>>>0<=n>>>0)n=(o[r>>2]|0)>>>0>n>>>0?n+4|0:n;o[t>>2]=o[n>>2]}else{r=(i-u>>2)+1|0;i=Hr(e)|0;if(i>>>0>>0)UT(e);f=o[e>>2]|0;c=(o[a>>2]|0)-f|0;u=c>>1;Ni(g,c>>2>>>0>>1>>>0?u>>>0>>0?r:u:i,t-f>>2,e+8|0);f=g+8|0;r=o[f>>2]|0;u=g+12|0;c=o[u>>2]|0;a=c;s=r;do{if((r|0)==(c|0)){c=g+4|0;r=o[c>>2]|0;_=o[g>>2]|0;i=_;if(r>>>0<=_>>>0){r=a-i>>1;r=(r|0)==0?1:r;Ni(p,r,r>>>2,o[g+16>>2]|0);o[v>>2]=o[c>>2];o[m>>2]=o[f>>2];o[l>>2]=o[v>>2];o[d>>2]=o[m>>2];Bi(p,l,d);r=o[g>>2]|0;o[g>>2]=o[p>>2];o[p>>2]=r;r=p+4|0;_=o[c>>2]|0;o[c>>2]=o[r>>2];o[r>>2]=_;r=p+8|0;_=o[f>>2]|0;o[f>>2]=o[r>>2];o[r>>2]=_;r=p+12|0;_=o[u>>2]|0;o[u>>2]=o[r>>2];o[r>>2]=_;Ri(p);r=o[f>>2]|0;break}u=r;a=((u-i>>2)+1|0)/-2|0;l=r+(a<<2)|0;i=s-u|0;u=i>>2;if(u){sx(l|0,r|0,i|0)|0;r=o[c>>2]|0}_=l+(u<<2)|0;o[f>>2]=_;o[c>>2]=r+(a<<2);r=_}}while(0);o[r>>2]=o[n>>2];o[f>>2]=(o[f>>2]|0)+4;t=Li(e,g,t)|0;Ri(g)}}while(0);h=y;return t|0}function Vt(e){e=e|0;var t=0;do{t=e+984|0;if(r[t>>0]|0)break;r[t>>0]=1;s[e+504>>2]=Y(E);e=o[e+944>>2]|0}while((e|0)!=0);return}function qt(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-4-r|0)>>>2)<<2);KT(n)}return}function Gt(e){e=e|0;return o[e+944>>2]|0}function $t(e){e=e|0;Rt(e,(o[e+964>>2]|0)!=0,2832);Vt(e);return}function Yt(e){e=e|0;return(r[e+984>>0]|0)!=0|0}function Kt(e,t){e=e|0;t=t|0;if(iT(e,t,400)|0){ix(e|0,t|0,400)|0;Vt(e)}return}function Xt(e){e=e|0;var t=ft;t=Y(s[e+44>>2]);e=wt(t)|0;return Y(e?Y(0.0):t)}function Qt(e){e=e|0;var t=ft;t=Y(s[e+48>>2]);if(wt(t)|0)t=r[(o[e+976>>2]|0)+2>>0]|0?Y(1.0):Y(0.0);return Y(t)}function Jt(e,t){e=e|0;t=t|0;o[e+980>>2]=t;return}function Zt(e){e=e|0;return o[e+980>>2]|0}function en(e,t){e=e|0;t=t|0;var n=0;n=e+4|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function tn(e){e=e|0;return o[e+4>>2]|0}function nn(e,t){e=e|0;t=t|0;var n=0;n=e+8|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function rn(e){e=e|0;return o[e+8>>2]|0}function on(e,t){e=e|0;t=t|0;var n=0;n=e+12|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function un(e){e=e|0;return o[e+12>>2]|0}function an(e,t){e=e|0;t=t|0;var n=0;n=e+16|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function ln(e){e=e|0;return o[e+16>>2]|0}function sn(e,t){e=e|0;t=t|0;var n=0;n=e+20|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function cn(e){e=e|0;return o[e+20>>2]|0}function fn(e,t){e=e|0;t=t|0;var n=0;n=e+24|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function dn(e){e=e|0;return o[e+24>>2]|0}function pn(e,t){e=e|0;t=t|0;var n=0;n=e+28|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function hn(e){e=e|0;return o[e+28>>2]|0}function vn(e,t){e=e|0;t=t|0;var n=0;n=e+32|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function mn(e){e=e|0;return o[e+32>>2]|0}function gn(e,t){e=e|0;t=t|0;var n=0;n=e+36|0;if((o[n>>2]|0)!=(t|0)){o[n>>2]=t;Vt(e)}return}function yn(e){e=e|0;return o[e+36>>2]|0}function _n(e,t){e=e|0;t=Y(t);var n=0;n=e+40|0;if(Y(s[n>>2])!=t){s[n>>2]=t;Vt(e)}return}function bn(e,t){e=e|0;t=Y(t);var n=0;n=e+44|0;if(Y(s[n>>2])!=t){s[n>>2]=t;Vt(e)}return}function wn(e,t){e=e|0;t=Y(t);var n=0;n=e+48|0;if(Y(s[n>>2])!=t){s[n>>2]=t;Vt(e)}return}function En(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=(u^1)&1;r=e+52|0;i=e+56|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function Dn(e,t){e=e|0;t=Y(t);var n=0,r=0;r=e+52|0;n=e+56|0;if(!(!(Y(s[r>>2])!=t)?(o[n>>2]|0)==2:0)){s[r>>2]=t;r=wt(t)|0;o[n>>2]=r?3:2;Vt(e)}return}function Sn(e,t){e=e|0;t=t|0;var n=0,r=0;r=t+52|0;n=o[r+4>>2]|0;t=e;o[t>>2]=o[r>>2];o[t+4>>2]=n;return}function Cn(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0,u=0;u=wt(n)|0;r=(u^1)&1;i=e+132+(t<<3)|0;t=e+132+(t<<3)+4|0;if(!(u|Y(s[i>>2])==n?(o[t>>2]|0)==(r|0):0)){s[i>>2]=n;o[t>>2]=r;Vt(e)}return}function kn(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0,u=0;u=wt(n)|0;r=u?0:2;i=e+132+(t<<3)|0;t=e+132+(t<<3)+4|0;if(!(u|Y(s[i>>2])==n?(o[t>>2]|0)==(r|0):0)){s[i>>2]=n;o[t>>2]=r;Vt(e)}return}function Tn(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=t+132+(n<<3)|0;t=o[r+4>>2]|0;n=e;o[n>>2]=o[r>>2];o[n+4>>2]=t;return}function xn(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0,u=0;u=wt(n)|0;r=(u^1)&1;i=e+60+(t<<3)|0;t=e+60+(t<<3)+4|0;if(!(u|Y(s[i>>2])==n?(o[t>>2]|0)==(r|0):0)){s[i>>2]=n;o[t>>2]=r;Vt(e)}return}function An(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0,u=0;u=wt(n)|0;r=u?0:2;i=e+60+(t<<3)|0;t=e+60+(t<<3)+4|0;if(!(u|Y(s[i>>2])==n?(o[t>>2]|0)==(r|0):0)){s[i>>2]=n;o[t>>2]=r;Vt(e)}return}function On(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=t+60+(n<<3)|0;t=o[r+4>>2]|0;n=e;o[n>>2]=o[r>>2];o[n+4>>2]=t;return}function Pn(e,t){e=e|0;t=t|0;var n=0;n=e+60+(t<<3)+4|0;if((o[n>>2]|0)!=3){s[e+60+(t<<3)>>2]=Y(E);o[n>>2]=3;Vt(e)}return}function In(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0,u=0;u=wt(n)|0;r=(u^1)&1;i=e+204+(t<<3)|0;t=e+204+(t<<3)+4|0;if(!(u|Y(s[i>>2])==n?(o[t>>2]|0)==(r|0):0)){s[i>>2]=n;o[t>>2]=r;Vt(e)}return}function Nn(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0,u=0;u=wt(n)|0;r=u?0:2;i=e+204+(t<<3)|0;t=e+204+(t<<3)+4|0;if(!(u|Y(s[i>>2])==n?(o[t>>2]|0)==(r|0):0)){s[i>>2]=n;o[t>>2]=r;Vt(e)}return}function Mn(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=t+204+(n<<3)|0;t=o[r+4>>2]|0;n=e;o[n>>2]=o[r>>2];o[n+4>>2]=t;return}function Rn(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0,u=0;u=wt(n)|0;r=(u^1)&1;i=e+276+(t<<3)|0;t=e+276+(t<<3)+4|0;if(!(u|Y(s[i>>2])==n?(o[t>>2]|0)==(r|0):0)){s[i>>2]=n;o[t>>2]=r;Vt(e)}return}function Fn(e,t){e=e|0;t=t|0;return Y(s[e+276+(t<<3)>>2])}function Ln(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=(u^1)&1;r=e+348|0;i=e+352|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function Bn(e,t){e=e|0;t=Y(t);var n=0,r=0;r=e+348|0;n=e+352|0;if(!(!(Y(s[r>>2])!=t)?(o[n>>2]|0)==2:0)){s[r>>2]=t;r=wt(t)|0;o[n>>2]=r?3:2;Vt(e)}return}function jn(e){e=e|0;var t=0;t=e+352|0;if((o[t>>2]|0)!=3){s[e+348>>2]=Y(E);o[t>>2]=3;Vt(e)}return}function Un(e,t){e=e|0;t=t|0;var n=0,r=0;r=t+348|0;n=o[r+4>>2]|0;t=e;o[t>>2]=o[r>>2];o[t+4>>2]=n;return}function zn(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=(u^1)&1;r=e+356|0;i=e+360|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function Wn(e,t){e=e|0;t=Y(t);var n=0,r=0;r=e+356|0;n=e+360|0;if(!(!(Y(s[r>>2])!=t)?(o[n>>2]|0)==2:0)){s[r>>2]=t;r=wt(t)|0;o[n>>2]=r?3:2;Vt(e)}return}function Hn(e){e=e|0;var t=0;t=e+360|0;if((o[t>>2]|0)!=3){s[e+356>>2]=Y(E);o[t>>2]=3;Vt(e)}return}function Vn(e,t){e=e|0;t=t|0;var n=0,r=0;r=t+356|0;n=o[r+4>>2]|0;t=e;o[t>>2]=o[r>>2];o[t+4>>2]=n;return}function qn(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=(u^1)&1;r=e+364|0;i=e+368|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function Gn(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=u?0:2;r=e+364|0;i=e+368|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function $n(e,t){e=e|0;t=t|0;var n=0,r=0;r=t+364|0;n=o[r+4>>2]|0;t=e;o[t>>2]=o[r>>2];o[t+4>>2]=n;return}function Yn(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=(u^1)&1;r=e+372|0;i=e+376|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function Kn(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=u?0:2;r=e+372|0;i=e+376|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function Xn(e,t){e=e|0;t=t|0;var n=0,r=0;r=t+372|0;n=o[r+4>>2]|0;t=e;o[t>>2]=o[r>>2];o[t+4>>2]=n;return}function Qn(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=(u^1)&1;r=e+380|0;i=e+384|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function Jn(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=u?0:2;r=e+380|0;i=e+384|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function Zn(e,t){e=e|0;t=t|0;var n=0,r=0;r=t+380|0;n=o[r+4>>2]|0;t=e;o[t>>2]=o[r>>2];o[t+4>>2]=n;return}function er(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=(u^1)&1;r=e+388|0;i=e+392|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function tr(e,t){e=e|0;t=Y(t);var n=0,r=0,i=0,u=0;u=wt(t)|0;n=u?0:2;r=e+388|0;i=e+392|0;if(!(u|Y(s[r>>2])==t?(o[i>>2]|0)==(n|0):0)){s[r>>2]=t;o[i>>2]=n;Vt(e)}return}function nr(e,t){e=e|0;t=t|0;var n=0,r=0;r=t+388|0;n=o[r+4>>2]|0;t=e;o[t>>2]=o[r>>2];o[t+4>>2]=n;return}function rr(e,t){e=e|0;t=Y(t);var n=0;n=e+396|0;if(Y(s[n>>2])!=t){s[n>>2]=t;Vt(e)}return}function ir(e){e=e|0;return Y(s[e+396>>2])}function or(e){e=e|0;return Y(s[e+400>>2])}function ur(e){e=e|0;return Y(s[e+404>>2])}function ar(e){e=e|0;return Y(s[e+408>>2])}function lr(e){e=e|0;return Y(s[e+412>>2])}function sr(e){e=e|0;return Y(s[e+416>>2])}function cr(e){e=e|0;return Y(s[e+420>>2])}function fr(e,t){e=e|0;t=t|0;Rt(e,(t|0)<6,2918);switch(t|0){case 0:{t=(o[e+496>>2]|0)==2?5:4;break}case 2:{t=(o[e+496>>2]|0)==2?4:5;break}default:{}}return Y(s[e+424+(t<<2)>>2])}function dr(e,t){e=e|0;t=t|0;Rt(e,(t|0)<6,2918);switch(t|0){case 0:{t=(o[e+496>>2]|0)==2?5:4;break}case 2:{t=(o[e+496>>2]|0)==2?4:5;break}default:{}}return Y(s[e+448+(t<<2)>>2])}function pr(e,t){e=e|0;t=t|0;Rt(e,(t|0)<6,2918);switch(t|0){case 0:{t=(o[e+496>>2]|0)==2?5:4;break}case 2:{t=(o[e+496>>2]|0)==2?4:5;break}default:{}}return Y(s[e+472+(t<<2)>>2])}function hr(e,t){e=e|0;t=t|0;var n=0,r=ft;n=o[e+4>>2]|0;if((n|0)==(o[t+4>>2]|0)){if(!n)e=1;else{r=Y(s[e>>2]);e=Y(P(Y(r-Y(s[t>>2]))))>2]=0;o[i+4>>2]=0;o[i+8>>2]=0;je(i|0,e|0,t|0,0);Cr(e,3,(r[i+11>>0]|0)<0?o[i>>2]|0:i,n);XT(i);h=n;return}function yr(e,t,n,r){e=Y(e);t=Y(t);n=n|0;r=r|0;var i=ft;e=Y(e*t);i=Y(LT(e,Y(1.0)));do{if(!(vr(i,Y(0.0))|0)){e=Y(e-i);if(vr(i,Y(1.0))|0){e=Y(e+Y(1.0));break}if(n){e=Y(e+Y(1.0));break}if(!r){if(i>Y(.5))i=Y(1.0);else{r=vr(i,Y(.5))|0;i=r?Y(1.0):Y(0.0)}e=Y(e+i)}}else e=Y(e-i)}while(0);return Y(e/t)}function _r(e,t,n,r,i,o,u,a,l,c,f,d,p){e=e|0;t=Y(t);n=n|0;r=Y(r);i=i|0;o=Y(o);u=u|0;a=Y(a);l=Y(l);c=Y(c);f=Y(f);d=Y(d);p=p|0;var h=0,v=ft,m=ft,g=ft,y=ft,_=ft,b=ft;if(l>2]),v!=Y(0.0)):0){g=Y(yr(t,v,0,0));y=Y(yr(r,v,0,0));m=Y(yr(o,v,0,0));v=Y(yr(a,v,0,0))}else{m=o;g=t;v=a;y=r}if((i|0)==(e|0))h=vr(m,g)|0;else h=0;if((u|0)==(n|0))p=vr(v,y)|0;else p=0;if((!h?(_=Y(t-f),!(br(e,_,l)|0)):0)?!(wr(e,_,i,l)|0):0)h=Er(e,_,i,o,l)|0;else h=1;if((!p?(b=Y(r-d),!(br(n,b,c)|0)):0)?!(wr(n,b,u,c)|0):0)p=Er(n,b,u,a,c)|0;else p=1;p=h&p}return p|0}function br(e,t,n){e=e|0;t=Y(t);n=Y(n);if((e|0)==1)e=vr(t,n)|0;else e=0;return e|0}function wr(e,t,n,r){e=e|0;t=Y(t);n=n|0;r=Y(r);if((e|0)==2&(n|0)==0){if(!(t>=r))e=vr(t,r)|0;else e=1}else e=0;return e|0}function Er(e,t,n,r,i){e=e|0;t=Y(t);n=n|0;r=Y(r);i=Y(i);if((e|0)==2&(n|0)==2&r>t){if(!(i<=t))e=vr(t,i)|0;else e=1}else e=0;return e|0}function Dr(e,t,n,i,u,a,l,f,d,p,v){e=e|0;t=Y(t);n=Y(n);i=i|0;u=u|0;a=a|0;l=Y(l);f=Y(f);d=d|0;p=p|0;v=v|0;var m=0,g=0,y=0,_=0,b=ft,w=ft,E=0,D=0,S=0,C=0,k=0,T=0,x=0,A=0,O=0,P=0,I=0,N=ft,M=ft,R=ft,F=0.0,L=0.0;I=h;h=h+160|0;A=I+152|0;x=I+120|0;T=I+104|0;S=I+72|0;_=I+56|0;k=I+8|0;D=I;C=(o[2279]|0)+1|0;o[2279]=C;O=e+984|0;if((r[O>>0]|0)!=0?(o[e+512>>2]|0)!=(o[2278]|0):0)E=4;else if((o[e+516>>2]|0)==(i|0))P=0;else E=4;if((E|0)==4){o[e+520>>2]=0;o[e+924>>2]=-1;o[e+928>>2]=-1;s[e+932>>2]=Y(-1.0);s[e+936>>2]=Y(-1.0);P=1}e:do{if(!(o[e+964>>2]|0)){if(d){m=e+916|0;if(!(vr(Y(s[m>>2]),t)|0)){E=21;break}if(!(vr(Y(s[e+920>>2]),n)|0)){E=21;break}if((o[e+924>>2]|0)!=(u|0)){E=21;break}m=(o[e+928>>2]|0)==(a|0)?m:0;E=22;break}y=o[e+520>>2]|0;if(!y)E=21;else{g=0;while(1){m=e+524+(g*24|0)|0;if(((vr(Y(s[m>>2]),t)|0?vr(Y(s[e+524+(g*24|0)+4>>2]),n)|0:0)?(o[e+524+(g*24|0)+8>>2]|0)==(u|0):0)?(o[e+524+(g*24|0)+12>>2]|0)==(a|0):0){E=22;break e}g=g+1|0;if(g>>>0>=y>>>0){E=21;break}}}}else{b=Y(Sr(e,2,l));w=Y(Sr(e,0,l));m=e+916|0;R=Y(s[m>>2]);M=Y(s[e+920>>2]);N=Y(s[e+932>>2]);if(!(_r(u,t,a,n,o[e+924>>2]|0,R,o[e+928>>2]|0,M,N,Y(s[e+936>>2]),b,w,v)|0)){y=o[e+520>>2]|0;if(!y)E=21;else{g=0;while(1){m=e+524+(g*24|0)|0;N=Y(s[m>>2]);M=Y(s[e+524+(g*24|0)+4>>2]);R=Y(s[e+524+(g*24|0)+16>>2]);if(_r(u,t,a,n,o[e+524+(g*24|0)+8>>2]|0,N,o[e+524+(g*24|0)+12>>2]|0,M,R,Y(s[e+524+(g*24|0)+20>>2]),b,w,v)|0){E=22;break e}g=g+1|0;if(g>>>0>=y>>>0){E=21;break}}}}else E=22}}while(0);do{if((E|0)==21){if(!(r[11697]|0)){m=0;E=31}else{m=0;E=28}}else if((E|0)==22){g=(r[11697]|0)!=0;if(!((m|0)!=0&(P^1)))if(g){E=28;break}else{E=31;break}_=m+16|0;o[e+908>>2]=o[_>>2];y=m+20|0;o[e+912>>2]=o[y>>2];if(!((r[11698]|0)==0|g^1)){o[D>>2]=kr(C)|0;o[D+4>>2]=C;Cr(e,4,2972,D);g=o[e+972>>2]|0;if(g|0)hA[g&127](e);u=Tr(u,d)|0;a=Tr(a,d)|0;L=+Y(s[_>>2]);F=+Y(s[y>>2]);o[k>>2]=u;o[k+4>>2]=a;c[k+8>>3]=+t;c[k+16>>3]=+n;c[k+24>>3]=L;c[k+32>>3]=F;o[k+40>>2]=p;Cr(e,4,2989,k)}}}while(0);if((E|0)==28){g=kr(C)|0;o[_>>2]=g;o[_+4>>2]=C;o[_+8>>2]=P?3047:11699;Cr(e,4,3038,_);g=o[e+972>>2]|0;if(g|0)hA[g&127](e);k=Tr(u,d)|0;E=Tr(a,d)|0;o[S>>2]=k;o[S+4>>2]=E;c[S+8>>3]=+t;c[S+16>>3]=+n;o[S+24>>2]=p;Cr(e,4,3049,S);E=31}if((E|0)==31){xr(e,t,n,i,u,a,l,f,d,v);if(r[11697]|0){g=o[2279]|0;k=kr(g)|0;o[T>>2]=k;o[T+4>>2]=g;o[T+8>>2]=P?3047:11699;Cr(e,4,3083,T);g=o[e+972>>2]|0;if(g|0)hA[g&127](e);k=Tr(u,d)|0;T=Tr(a,d)|0;F=+Y(s[e+908>>2]);L=+Y(s[e+912>>2]);o[x>>2]=k;o[x+4>>2]=T;c[x+8>>3]=F;c[x+16>>3]=L;o[x+24>>2]=p;Cr(e,4,3092,x)}o[e+516>>2]=i;if(!m){g=e+520|0;m=o[g>>2]|0;if((m|0)==16){if(r[11697]|0)Cr(e,4,3124,A);o[g>>2]=0;m=0}if(d)m=e+916|0;else{o[g>>2]=m+1;m=e+524+(m*24|0)|0}s[m>>2]=t;s[m+4>>2]=n;o[m+8>>2]=u;o[m+12>>2]=a;o[m+16>>2]=o[e+908>>2];o[m+20>>2]=o[e+912>>2];m=0}}if(d){o[e+416>>2]=o[e+908>>2];o[e+420>>2]=o[e+912>>2];r[e+985>>0]=1;r[O>>0]=0}o[2279]=(o[2279]|0)+-1;o[e+512>>2]=o[2278];h=I;return P|(m|0)==0|0}function Sr(e,t,n){e=e|0;t=t|0;n=Y(n);var r=ft;r=Y(Vr(e,t,n));return Y(r+Y(qr(e,t,n)))}function Cr(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=h;h=h+16|0;i=u;o[i>>2]=r;if(!e)r=0;else r=o[e+976>>2]|0;Br(r,e,t,n,i);h=u;return}function kr(e){e=e|0;return(e>>>0>60?3201:3201+(60-e)|0)|0}function Tr(e,t){e=e|0;t=t|0;var n=0,r=0,i=0;i=h;h=h+32|0;n=i+12|0;r=i;o[n>>2]=o[254];o[n+4>>2]=o[255];o[n+8>>2]=o[256];o[r>>2]=o[257];o[r+4>>2]=o[258];o[r+8>>2]=o[259];if((e|0)>2)e=11699;else e=o[(t?r:n)+(e<<2)>>2]|0;h=i;return e|0}function xr(e,t,n,i,a,l,c,f,p,v){e=e|0;t=Y(t);n=Y(n);i=i|0;a=a|0;l=l|0;c=Y(c);f=Y(f);p=p|0;v=v|0;var m=0,g=0,y=0,_=0,b=ft,w=ft,E=ft,D=ft,S=ft,C=ft,k=ft,T=0,x=0,A=0,O=ft,P=ft,I=0,N=ft,M=0,R=0,F=0,L=0,B=0,j=0,U=0,z=0,W=0,H=0,V=0,q=0,G=0,$=0,K=0,X=0,Q=0,J=0,Z=ft,ee=ft,te=ft,ne=ft,re=ft,ie=0,oe=0,ue=0,ae=0,le=0,se=ft,ce=ft,fe=ft,de=ft,pe=ft,he=ft,ve=0,me=ft,ge=ft,ye=ft,_e=ft,be=ft,we=ft,Ee=0,De=0,Se=ft,Ce=ft,ke=0,Te=0,xe=0,Ae=0,Oe=ft,Pe=0,Ie=0,Ne=0,Me=0,Re=0,Fe=0,Le=0,Be=ft,je=0,Ue=0;Le=h;h=h+16|0;ie=Le+12|0;oe=Le+8|0;ue=Le+4|0;ae=Le;Rt(e,(a|0)==0|(wt(t)|0)^1,3326);Rt(e,(l|0)==0|(wt(n)|0)^1,3406);Ie=Yr(e,i)|0;o[e+496>>2]=Ie;Re=Kr(2,Ie)|0;Fe=Kr(0,Ie)|0;s[e+440>>2]=Y(Vr(e,Re,c));s[e+444>>2]=Y(qr(e,Re,c));s[e+428>>2]=Y(Vr(e,Fe,c));s[e+436>>2]=Y(qr(e,Fe,c));s[e+464>>2]=Y(Xr(e,Re));s[e+468>>2]=Y(Qr(e,Re));s[e+452>>2]=Y(Xr(e,Fe));s[e+460>>2]=Y(Qr(e,Fe));s[e+488>>2]=Y(Jr(e,Re,c));s[e+492>>2]=Y(Zr(e,Re,c));s[e+476>>2]=Y(Jr(e,Fe,c));s[e+484>>2]=Y(Zr(e,Fe,c));do{if(!(o[e+964>>2]|0)){Ne=e+948|0;Me=(o[e+952>>2]|0)-(o[Ne>>2]|0)>>2;if(!Me){ti(e,t,n,a,l,c,f);break}if(!p?ni(e,t,n,a,l,c,f)|0:0)break;Wt(e);X=e+508|0;r[X>>0]=0;Re=Kr(o[e+4>>2]|0,Ie)|0;Fe=ri(Re,Ie)|0;Pe=Gr(Re)|0;Q=o[e+8>>2]|0;Te=e+28|0;J=(o[Te>>2]|0)!=0;be=Pe?c:f;Se=Pe?f:c;Z=Y(ii(e,Re,c));ee=Y(oi(e,Re,c));b=Y(ii(e,Fe,c));we=Y(ui(e,Re,c));Ce=Y(ui(e,Fe,c));A=Pe?a:l;ke=Pe?l:a;Oe=Pe?we:Ce;S=Pe?Ce:we;_e=Y(Sr(e,2,c));D=Y(Sr(e,0,c));w=Y(Y(Nr(e+364|0,c))-Oe);E=Y(Y(Nr(e+380|0,c))-Oe);C=Y(Y(Nr(e+372|0,f))-S);k=Y(Y(Nr(e+388|0,f))-S);te=Pe?w:C;ne=Pe?E:k;_e=Y(t-_e);t=Y(_e-Oe);if(wt(t)|0)Oe=t;else Oe=Y(NT(Y(RT(t,E)),w));ge=Y(n-D);t=Y(ge-S);if(wt(t)|0)ye=t;else ye=Y(NT(Y(RT(t,k)),C));w=Pe?Oe:ye;me=Pe?ye:Oe;e:do{if((A|0)==1){i=0;g=0;while(1){m=Pt(e,g)|0;if(!i){if(Y(li(m))>Y(0.0)?Y(si(m))>Y(0.0):0)i=m;else i=0}else if(ai(m)|0){_=0;break e}g=g+1|0;if(g>>>0>=Me>>>0){_=i;break}}}else _=0}while(0);T=_+500|0;x=_+504|0;i=0;m=0;t=Y(0.0);y=0;do{g=o[(o[Ne>>2]|0)+(y<<2)>>2]|0;if((o[g+36>>2]|0)==1){ci(g);r[g+985>>0]=1;r[g+984>>0]=0}else{Pr(g);if(p)Mr(g,Yr(g,Ie)|0,w,me,Oe);do{if((o[g+24>>2]|0)!=1){if((g|0)==(_|0)){o[T>>2]=o[2278];s[x>>2]=Y(0.0);break}else{fi(e,g,Oe,a,ye,Oe,ye,l,Ie,v);break}}else{if(m|0)o[m+960>>2]=g;o[g+960>>2]=0;m=g;i=(i|0)==0?g:i}}while(0);he=Y(s[g+504>>2]);t=Y(t+Y(he+Y(Sr(g,Re,Oe))))}y=y+1|0}while((y|0)!=(Me|0));F=t>w;ve=J&((A|0)==2&F)?1:A;M=(ke|0)==1;B=M&(p^1);j=(ve|0)==1;U=(ve|0)==2;z=976+(Re<<2)|0;W=(ke|2|0)==2;$=M&(J^1);H=1040+(Fe<<2)|0;V=1040+(Re<<2)|0;q=976+(Fe<<2)|0;G=(ke|0)!=1;F=J&((A|0)!=0&F);R=e+976|0;M=M^1;t=w;I=0;L=0;he=Y(0.0);re=Y(0.0);while(1){e:do{if(I>>>0>>0){x=o[Ne>>2]|0;y=0;k=Y(0.0);C=Y(0.0);E=Y(0.0);w=Y(0.0);g=0;m=0;_=I;while(1){T=o[x+(_<<2)>>2]|0;if((o[T+36>>2]|0)!=1?(o[T+940>>2]=L,(o[T+24>>2]|0)!=1):0){D=Y(Sr(T,Re,Oe));K=o[z>>2]|0;n=Y(Nr(T+380+(K<<3)|0,be));S=Y(s[T+504>>2]);n=Y(RT(n,S));n=Y(NT(Y(Nr(T+364+(K<<3)|0,be)),n));if(J&(y|0)!=0&Y(D+Y(C+n))>t){l=y;D=k;A=_;break e}D=Y(D+n);n=Y(C+D);D=Y(k+D);if(ai(T)|0){E=Y(E+Y(li(T)));w=Y(w-Y(S*Y(si(T))))}if(m|0)o[m+960>>2]=T;o[T+960>>2]=0;y=y+1|0;m=T;g=(g|0)==0?T:g}else{D=k;n=C}_=_+1|0;if(_>>>0>>0){k=D;C=n}else{l=y;A=_;break}}}else{l=0;D=Y(0.0);E=Y(0.0);w=Y(0.0);g=0;A=I}}while(0);K=E>Y(0.0)&EY(0.0)&wne&((wt(ne)|0)^1))){if(!(r[(o[R>>2]|0)+3>>0]|0)){if(!(O==Y(0.0))?!(Y(li(e))==Y(0.0)):0){K=53;break}t=D;K=53}else K=51}else{t=ne;K=51}}else{t=te;K=51}}else K=51}while(0);if((K|0)==51){K=0;if(wt(t)|0)K=53;else{P=Y(t-D);N=t}}if((K|0)==53){K=0;if(D>2]|0;_=PY(0.0);C=Y(P/O);E=Y(0.0);D=Y(0.0);t=Y(0.0);m=g;do{n=Y(Nr(m+380+(y<<3)|0,be));w=Y(Nr(m+364+(y<<3)|0,be));w=Y(RT(n,Y(NT(w,Y(s[m+504>>2])))));if(_){n=Y(w*Y(si(m)));if(n!=Y(-0.0)?(Be=Y(w-Y(S*n)),se=Y(di(m,Re,Be,N,Oe)),Be!=se):0){E=Y(E-Y(se-w));t=Y(t+n)}}else if((T?(ce=Y(li(m)),ce!=Y(0.0)):0)?(Be=Y(w+Y(C*ce)),fe=Y(di(m,Re,Be,N,Oe)),Be!=fe):0){E=Y(E-Y(fe-w));D=Y(D-ce)}m=o[m+960>>2]|0}while((m|0)!=0);t=Y(k+t);w=Y(P+E);if(!le){S=Y(O+D);_=o[z>>2]|0;T=wY(0.0);S=Y(w/S);t=Y(0.0);do{Be=Y(Nr(g+380+(_<<3)|0,be));E=Y(Nr(g+364+(_<<3)|0,be));E=Y(RT(Be,Y(NT(E,Y(s[g+504>>2])))));if(T){Be=Y(E*Y(si(g)));w=Y(-Be);if(Be!=Y(-0.0)){Be=Y(C*w);w=Y(di(g,Re,Y(E+(x?w:Be)),N,Oe))}else w=E}else if(y?(de=Y(li(g)),de!=Y(0.0)):0)w=Y(di(g,Re,Y(E+Y(S*de)),N,Oe));else w=E;t=Y(t-Y(w-E));D=Y(Sr(g,Re,Oe));n=Y(Sr(g,Fe,Oe));w=Y(w+D);s[oe>>2]=w;o[ae>>2]=1;E=Y(s[g+396>>2]);e:do{if(wt(E)|0){m=wt(me)|0;do{if(!m){if(F|(Ir(g,Fe,me)|0|M))break;if((pi(e,g)|0)!=4)break;if((o[(hi(g,Fe)|0)+4>>2]|0)==3)break;if((o[(vi(g,Fe)|0)+4>>2]|0)==3)break;s[ie>>2]=me;o[ue>>2]=1;break e}}while(0);if(Ir(g,Fe,me)|0){m=o[g+992+(o[q>>2]<<2)>>2]|0;Be=Y(n+Y(Nr(m,me)));s[ie>>2]=Be;m=G&(o[m+4>>2]|0)==2;o[ue>>2]=((wt(Be)|0|m)^1)&1;break}else{s[ie>>2]=me;o[ue>>2]=m?0:2;break}}else{Be=Y(w-D);O=Y(Be/E);Be=Y(E*Be);o[ue>>2]=1;s[ie>>2]=Y(n+(Pe?O:Be))}}while(0);mi(g,Re,N,Oe,ae,oe);mi(g,Fe,me,Oe,ue,ie);do{if(!(Ir(g,Fe,me)|0)?(pi(e,g)|0)==4:0){if((o[(hi(g,Fe)|0)+4>>2]|0)==3){m=0;break}m=(o[(vi(g,Fe)|0)+4>>2]|0)!=3}else m=0}while(0);Be=Y(s[oe>>2]);O=Y(s[ie>>2]);je=o[ae>>2]|0;Ue=o[ue>>2]|0;Dr(g,Pe?Be:O,Pe?O:Be,Ie,Pe?je:Ue,Pe?Ue:je,Oe,ye,p&(m^1),3488,v)|0;r[X>>0]=r[X>>0]|r[g+508>>0];g=o[g+960>>2]|0}while((g|0)!=0)}else t=Y(0.0)}else t=Y(0.0);t=Y(P+t);Ue=t>0]=Ue|u[X>>0];if(U&t>Y(0.0)){m=o[z>>2]|0;if((o[e+364+(m<<3)+4>>2]|0)!=0?(pe=Y(Nr(e+364+(m<<3)|0,be)),pe>=Y(0.0)):0)w=Y(NT(Y(0.0),Y(pe-Y(N-t))));else w=Y(0.0)}else w=t;T=I>>>0>>0;if(T){_=o[Ne>>2]|0;y=I;m=0;do{g=o[_+(y<<2)>>2]|0;if(!(o[g+24>>2]|0)){m=((o[(hi(g,Re)|0)+4>>2]|0)==3&1)+m|0;m=m+((o[(vi(g,Re)|0)+4>>2]|0)==3&1)|0}y=y+1|0}while((y|0)!=(A|0));if(m){D=Y(0.0);n=Y(0.0)}else K=101}else K=101;e:do{if((K|0)==101){K=0;switch(Q|0){case 1:{m=0;D=Y(w*Y(.5));n=Y(0.0);break e}case 2:{m=0;D=w;n=Y(0.0);break e}case 3:{if(l>>>0<=1){m=0;D=Y(0.0);n=Y(0.0);break e}n=Y((l+-1|0)>>>0);m=0;D=Y(0.0);n=Y(Y(NT(w,Y(0.0)))/n);break e}case 5:{n=Y(w/Y((l+1|0)>>>0));m=0;D=n;break e}case 4:{n=Y(w/Y(l>>>0));m=0;D=Y(n*Y(.5));break e}default:{m=0;D=Y(0.0);n=Y(0.0);break e}}}}while(0);t=Y(Z+D);if(T){E=Y(w/Y(m|0));y=o[Ne>>2]|0;g=I;w=Y(0.0);do{m=o[y+(g<<2)>>2]|0;e:do{if((o[m+36>>2]|0)!=1){switch(o[m+24>>2]|0){case 1:{if(gi(m,Re)|0){if(!p)break e;Be=Y(yi(m,Re,N));Be=Y(Be+Y(Xr(e,Re)));Be=Y(Be+Y(Vr(m,Re,Oe)));s[m+400+(o[V>>2]<<2)>>2]=Be;break e}break}case 0:{Ue=(o[(hi(m,Re)|0)+4>>2]|0)==3;Be=Y(E+t);t=Ue?Be:t;if(p){Ue=m+400+(o[V>>2]<<2)|0;s[Ue>>2]=Y(t+Y(s[Ue>>2]))}Ue=(o[(vi(m,Re)|0)+4>>2]|0)==3;Be=Y(E+t);t=Ue?Be:t;if(B){Be=Y(n+Y(Sr(m,Re,Oe)));w=me;t=Y(t+Y(Be+Y(s[m+504>>2])));break e}else{t=Y(t+Y(n+Y(_i(m,Re,Oe))));w=Y(NT(w,Y(_i(m,Fe,Oe))));break e}}default:{}}if(p){Be=Y(D+Y(Xr(e,Re)));Ue=m+400+(o[V>>2]<<2)|0;s[Ue>>2]=Y(Be+Y(s[Ue>>2]))}}}while(0);g=g+1|0}while((g|0)!=(A|0))}else w=Y(0.0);n=Y(ee+t);if(W)D=Y(Y(di(e,Fe,Y(Ce+w),Se,c))-Ce);else D=me;E=Y(Y(di(e,Fe,Y(Ce+($?me:w)),Se,c))-Ce);if(T&p){g=I;do{y=o[(o[Ne>>2]|0)+(g<<2)>>2]|0;do{if((o[y+36>>2]|0)!=1){if((o[y+24>>2]|0)==1){if(gi(y,Fe)|0){Be=Y(yi(y,Fe,me));Be=Y(Be+Y(Xr(e,Fe)));Be=Y(Be+Y(Vr(y,Fe,Oe)));m=o[H>>2]|0;s[y+400+(m<<2)>>2]=Be;if(!(wt(Be)|0))break}else m=o[H>>2]|0;Be=Y(Xr(e,Fe));s[y+400+(m<<2)>>2]=Y(Be+Y(Vr(y,Fe,Oe)));break}m=pi(e,y)|0;do{if((m|0)==4){if((o[(hi(y,Fe)|0)+4>>2]|0)==3){K=139;break}if((o[(vi(y,Fe)|0)+4>>2]|0)==3){K=139;break}if(Ir(y,Fe,me)|0){t=b;break}je=o[y+908+(o[z>>2]<<2)>>2]|0;o[ie>>2]=je;t=Y(s[y+396>>2]);Ue=wt(t)|0;w=(o[d>>2]=je,Y(s[d>>2]));if(Ue)t=E;else{P=Y(Sr(y,Fe,Oe));Be=Y(w/t);t=Y(t*w);t=Y(P+(Pe?Be:t))}s[oe>>2]=t;s[ie>>2]=Y(Y(Sr(y,Re,Oe))+w);o[ue>>2]=1;o[ae>>2]=1;mi(y,Re,N,Oe,ue,ie);mi(y,Fe,me,Oe,ae,oe);t=Y(s[ie>>2]);P=Y(s[oe>>2]);Be=Pe?t:P;t=Pe?P:t;Ue=((wt(Be)|0)^1)&1;Dr(y,Be,t,Ie,Ue,((wt(t)|0)^1)&1,Oe,ye,1,3493,v)|0;t=b}else K=139}while(0);e:do{if((K|0)==139){K=0;t=Y(D-Y(_i(y,Fe,Oe)));do{if((o[(hi(y,Fe)|0)+4>>2]|0)==3){if((o[(vi(y,Fe)|0)+4>>2]|0)!=3)break;t=Y(b+Y(NT(Y(0.0),Y(t*Y(.5)))));break e}}while(0);if((o[(vi(y,Fe)|0)+4>>2]|0)==3){t=b;break}if((o[(hi(y,Fe)|0)+4>>2]|0)==3){t=Y(b+Y(NT(Y(0.0),t)));break}switch(m|0){case 1:{t=b;break e}case 2:{t=Y(b+Y(t*Y(.5)));break e}default:{t=Y(b+t);break e}}}}while(0);Be=Y(he+t);Ue=y+400+(o[H>>2]<<2)|0;s[Ue>>2]=Y(Be+Y(s[Ue>>2]))}}while(0);g=g+1|0}while((g|0)!=(A|0))}he=Y(he+E);re=Y(NT(re,n));l=L+1|0;if(A>>>0>=Me>>>0)break;else{t=N;I=A;L=l}}do{if(p){m=l>>>0>1;if(!m?!(bi(e)|0):0)break;if(!(wt(me)|0)){t=Y(me-he);e:do{switch(o[e+12>>2]|0){case 3:{b=Y(b+t);C=Y(0.0);break}case 2:{b=Y(b+Y(t*Y(.5)));C=Y(0.0);break}case 4:{if(me>he)C=Y(t/Y(l>>>0));else C=Y(0.0);break}case 7:if(me>he){b=Y(b+Y(t/Y(l<<1>>>0)));C=Y(t/Y(l>>>0));C=m?C:Y(0.0);break e}else{b=Y(b+Y(t*Y(.5)));C=Y(0.0);break e}case 6:{C=Y(t/Y(L>>>0));C=me>he&m?C:Y(0.0);break}default:C=Y(0.0)}}while(0);if(l|0){T=1040+(Fe<<2)|0;x=976+(Fe<<2)|0;_=0;g=0;while(1){e:do{if(g>>>0>>0){w=Y(0.0);E=Y(0.0);t=Y(0.0);y=g;while(1){m=o[(o[Ne>>2]|0)+(y<<2)>>2]|0;do{if((o[m+36>>2]|0)!=1?(o[m+24>>2]|0)==0:0){if((o[m+940>>2]|0)!=(_|0))break e;if(wi(m,Fe)|0){Be=Y(s[m+908+(o[x>>2]<<2)>>2]);t=Y(NT(t,Y(Be+Y(Sr(m,Fe,Oe)))))}if((pi(e,m)|0)!=5)break;pe=Y(Ei(m));pe=Y(pe+Y(Vr(m,0,Oe)));Be=Y(s[m+912>>2]);Be=Y(Y(Be+Y(Sr(m,0,Oe)))-pe);pe=Y(NT(E,pe));Be=Y(NT(w,Be));w=Be;E=pe;t=Y(NT(t,Y(pe+Be)))}}while(0);m=y+1|0;if(m>>>0>>0)y=m;else{y=m;break}}}else{E=Y(0.0);t=Y(0.0);y=g}}while(0);S=Y(C+t);n=b;b=Y(b+S);if(g>>>0>>0){D=Y(n+E);m=g;do{g=o[(o[Ne>>2]|0)+(m<<2)>>2]|0;e:do{if((o[g+36>>2]|0)!=1?(o[g+24>>2]|0)==0:0)switch(pi(e,g)|0){case 1:{Be=Y(n+Y(Vr(g,Fe,Oe)));s[g+400+(o[T>>2]<<2)>>2]=Be;break e}case 3:{Be=Y(Y(b-Y(qr(g,Fe,Oe)))-Y(s[g+908+(o[x>>2]<<2)>>2]));s[g+400+(o[T>>2]<<2)>>2]=Be;break e}case 2:{Be=Y(n+Y(Y(S-Y(s[g+908+(o[x>>2]<<2)>>2]))*Y(.5)));s[g+400+(o[T>>2]<<2)>>2]=Be;break e}case 4:{Be=Y(n+Y(Vr(g,Fe,Oe)));s[g+400+(o[T>>2]<<2)>>2]=Be;if(Ir(g,Fe,me)|0)break e;if(Pe){w=Y(s[g+908>>2]);t=Y(w+Y(Sr(g,Re,Oe)));E=S}else{E=Y(s[g+912>>2]);E=Y(E+Y(Sr(g,Fe,Oe)));t=S;w=Y(s[g+908>>2])}if(vr(t,w)|0?vr(E,Y(s[g+912>>2]))|0:0)break e;Dr(g,t,E,Ie,1,1,Oe,ye,1,3501,v)|0;break e}case 5:{s[g+404>>2]=Y(Y(D-Y(Ei(g)))+Y(yi(g,0,me)));break e}default:break e}}while(0);m=m+1|0}while((m|0)!=(y|0))}_=_+1|0;if((_|0)==(l|0))break;else g=y}}}}}while(0);s[e+908>>2]=Y(di(e,2,_e,c,c));s[e+912>>2]=Y(di(e,0,ge,f,c));if((ve|0)!=0?(Ee=o[e+32>>2]|0,De=(ve|0)==2,!(De&(Ee|0)!=2)):0){if(De&(Ee|0)==2){t=Y(we+N);t=Y(NT(Y(RT(t,Y(Di(e,Re,re,be)))),we));K=198}}else{t=Y(di(e,Re,re,be,c));K=198}if((K|0)==198)s[e+908+(o[976+(Re<<2)>>2]<<2)>>2]=t;if((ke|0)!=0?(xe=o[e+32>>2]|0,Ae=(ke|0)==2,!(Ae&(xe|0)!=2)):0){if(Ae&(xe|0)==2){t=Y(Ce+me);t=Y(NT(Y(RT(t,Y(Di(e,Fe,Y(Ce+he),Se)))),Ce));K=204}}else{t=Y(di(e,Fe,Y(Ce+he),Se,c));K=204}if((K|0)==204)s[e+908+(o[976+(Fe<<2)>>2]<<2)>>2]=t;if(p){if((o[Te>>2]|0)==2){g=976+(Fe<<2)|0;y=1040+(Fe<<2)|0;m=0;do{_=Pt(e,m)|0;if(!(o[_+24>>2]|0)){je=o[g>>2]|0;Be=Y(s[e+908+(je<<2)>>2]);Ue=_+400+(o[y>>2]<<2)|0;Be=Y(Be-Y(s[Ue>>2]));s[Ue>>2]=Y(Be-Y(s[_+908+(je<<2)>>2]))}m=m+1|0}while((m|0)!=(Me|0))}if(i|0){m=Pe?ve:a;do{Si(e,i,Oe,m,ye,Ie,v);i=o[i+960>>2]|0}while((i|0)!=0)}m=(Re|2|0)==3;g=(Fe|2|0)==3;if(m|g){i=0;do{y=o[(o[Ne>>2]|0)+(i<<2)>>2]|0;if((o[y+36>>2]|0)!=1){if(m)Ci(e,y,Re);if(g)Ci(e,y,Fe)}i=i+1|0}while((i|0)!=(Me|0))}}}else ei(e,t,n,a,l,c,f)}while(0);h=Le;return}function Ar(e,t){e=e|0;t=Y(t);var n=0;St(e,t>=Y(0.0),3147);n=t==Y(0.0);s[e+4>>2]=n?Y(0.0):t;return}function Or(e,t,n,i){e=e|0;t=Y(t);n=Y(n);i=i|0;var u=ft,a=ft,l=0,c=0,f=0;o[2278]=(o[2278]|0)+1;Pr(e);if(!(Ir(e,2,t)|0)){u=Y(Nr(e+380|0,t));if(!(u>=Y(0.0))){f=((wt(t)|0)^1)&1;u=t}else f=2}else{u=Y(Nr(o[e+992>>2]|0,t));f=1;u=Y(u+Y(Sr(e,2,t)))}if(!(Ir(e,0,n)|0)){a=Y(Nr(e+388|0,n));if(!(a>=Y(0.0))){c=((wt(n)|0)^1)&1;a=n}else c=2}else{a=Y(Nr(o[e+996>>2]|0,n));c=1;a=Y(a+Y(Sr(e,0,t)))}l=e+976|0;if(Dr(e,u,a,i,f,c,t,n,1,3189,o[l>>2]|0)|0?(Mr(e,o[e+496>>2]|0,t,n,t),Rr(e,Y(s[(o[l>>2]|0)+4>>2]),Y(0.0),Y(0.0)),r[11696]|0):0)mr(e,7);return}function Pr(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;a=l+24|0;u=l+16|0;r=l+8|0;i=l;n=0;do{t=e+380+(n<<3)|0;if(!((o[e+380+(n<<3)+4>>2]|0)!=0?(s=t,c=o[s+4>>2]|0,f=r,o[f>>2]=o[s>>2],o[f+4>>2]=c,f=e+364+(n<<3)|0,c=o[f+4>>2]|0,s=i,o[s>>2]=o[f>>2],o[s+4>>2]=c,o[u>>2]=o[r>>2],o[u+4>>2]=o[r+4>>2],o[a>>2]=o[i>>2],o[a+4>>2]=o[i+4>>2],hr(u,a)|0):0))t=e+348+(n<<3)|0;o[e+992+(n<<2)>>2]=t;n=n+1|0}while((n|0)!=2);h=l;return}function Ir(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0;e=o[e+992+(o[976+(t<<2)>>2]<<2)>>2]|0;switch(o[e+4>>2]|0){case 0:case 3:{e=0;break}case 1:{if(Y(s[e>>2])>2])>2]|0){case 2:{t=Y(Y(Y(s[e>>2])*t)/Y(100.0));break}case 1:{t=Y(s[e>>2]);break}default:t=Y(E)}return Y(t)}function Mr(e,t,n,r,i){e=e|0;t=t|0;n=Y(n);r=Y(r);i=Y(i);var u=0,a=ft;t=o[e+944>>2]|0?t:1;u=Kr(o[e+4>>2]|0,t)|0;t=ri(u,t)|0;n=Y(Pi(e,u,n));r=Y(Pi(e,t,r));a=Y(n+Y(Vr(e,u,i)));s[e+400+(o[1040+(u<<2)>>2]<<2)>>2]=a;n=Y(n+Y(qr(e,u,i)));s[e+400+(o[1e3+(u<<2)>>2]<<2)>>2]=n;n=Y(r+Y(Vr(e,t,i)));s[e+400+(o[1040+(t<<2)>>2]<<2)>>2]=n;i=Y(r+Y(qr(e,t,i)));s[e+400+(o[1e3+(t<<2)>>2]<<2)>>2]=i;return}function Rr(e,t,n,r){e=e|0;t=Y(t);n=Y(n);r=Y(r);var i=0,u=0,a=ft,l=ft,c=0,f=0,d=ft,p=0,h=ft,v=ft,m=ft,g=ft;if(!(t==Y(0.0))){i=e+400|0;g=Y(s[i>>2]);u=e+404|0;m=Y(s[u>>2]);p=e+416|0;v=Y(s[p>>2]);f=e+420|0;a=Y(s[f>>2]);h=Y(g+n);d=Y(m+r);r=Y(h+v);l=Y(d+a);c=(o[e+988>>2]|0)==1;s[i>>2]=Y(yr(g,t,0,c));s[u>>2]=Y(yr(m,t,0,c));n=Y(LT(Y(v*t),Y(1.0)));if(vr(n,Y(0.0))|0)u=0;else u=(vr(n,Y(1.0))|0)^1;n=Y(LT(Y(a*t),Y(1.0)));if(vr(n,Y(0.0))|0)i=0;else i=(vr(n,Y(1.0))|0)^1;g=Y(yr(r,t,c&u,c&(u^1)));s[p>>2]=Y(g-Y(yr(h,t,0,c)));g=Y(yr(l,t,c&i,c&(i^1)));s[f>>2]=Y(g-Y(yr(d,t,0,c)));u=(o[e+952>>2]|0)-(o[e+948>>2]|0)>>2;if(u|0){i=0;do{Rr(Pt(e,i)|0,t,h,d);i=i+1|0}while((i|0)!=(u|0))}}return}function Fr(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;switch(n|0){case 5:case 0:{e=oT(o[489]|0,r,i)|0;break}default:e=jT(r,i)|0}return e|0}function Lr(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;i=h;h=h+16|0;u=i;o[u>>2]=r;Br(e,0,t,n,u);h=i;return}function Br(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;e=e|0?e:956;xA[o[e+8>>2]&1](e,t,n,r,i)|0;if((n|0)==5)Ye();else return}function jr(e,t,n){e=e|0;t=t|0;n=n|0;r[e+t>>0]=n&1;return}function Ur(e,t){e=e|0;t=t|0;var n=0,r=0;o[e>>2]=0;o[e+4>>2]=0;o[e+8>>2]=0;n=t+4|0;r=(o[n>>2]|0)-(o[t>>2]|0)>>2;if(r|0){zr(e,r);Wr(e,o[t>>2]|0,o[n>>2]|0,r)}return}function zr(e,t){e=e|0;t=t|0;var n=0;if((Hr(e)|0)>>>0>>0)UT(e);if(t>>>0>1073741823)Ye();else{n=$T(t<<2)|0;o[e+4>>2]=n;o[e>>2]=n;o[e+8>>2]=n+(t<<2);return}}function Wr(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;r=e+4|0;e=n-t|0;if((e|0)>0){ix(o[r>>2]|0,t|0,e|0)|0;o[r>>2]=(o[r>>2]|0)+(e>>>2<<2)}return}function Hr(e){e=e|0;return 1073741823}function Vr(e,t,n){e=e|0;t=t|0;n=Y(n);if(Gr(t)|0?(o[e+96>>2]|0)!=0:0)e=e+92|0;else e=Et(e+60|0,o[1040+(t<<2)>>2]|0,992)|0;return Y($r(e,n))}function qr(e,t,n){e=e|0;t=t|0;n=Y(n);if(Gr(t)|0?(o[e+104>>2]|0)!=0:0)e=e+100|0;else e=Et(e+60|0,o[1e3+(t<<2)>>2]|0,992)|0;return Y($r(e,n))}function Gr(e){e=e|0;return(e|1|0)==3|0}function $r(e,t){e=e|0;t=Y(t);if((o[e+4>>2]|0)==3)t=Y(0.0);else t=Y(Nr(e,t));return Y(t)}function Yr(e,t){e=e|0;t=t|0;e=o[e>>2]|0;return((e|0)==0?(t|0)>1?t:1:e)|0}function Kr(e,t){e=e|0;t=t|0;var n=0;e:do{if((t|0)==2){switch(e|0){case 2:{e=3;break e}case 3:break;default:{n=4;break e}}e=2}else n=4}while(0);return e|0}function Xr(e,t){e=e|0;t=t|0;var n=ft;if(!((Gr(t)|0?(o[e+312>>2]|0)!=0:0)?(n=Y(s[e+308>>2]),n>=Y(0.0)):0))n=Y(NT(Y(s[(Et(e+276|0,o[1040+(t<<2)>>2]|0,992)|0)>>2]),Y(0.0)));return Y(n)}function Qr(e,t){e=e|0;t=t|0;var n=ft;if(!((Gr(t)|0?(o[e+320>>2]|0)!=0:0)?(n=Y(s[e+316>>2]),n>=Y(0.0)):0))n=Y(NT(Y(s[(Et(e+276|0,o[1e3+(t<<2)>>2]|0,992)|0)>>2]),Y(0.0)));return Y(n)}function Jr(e,t,n){e=e|0;t=t|0;n=Y(n);var r=ft;if(!((Gr(t)|0?(o[e+240>>2]|0)!=0:0)?(r=Y(Nr(e+236|0,n)),r>=Y(0.0)):0))r=Y(NT(Y(Nr(Et(e+204|0,o[1040+(t<<2)>>2]|0,992)|0,n)),Y(0.0)));return Y(r)}function Zr(e,t,n){e=e|0;t=t|0;n=Y(n);var r=ft;if(!((Gr(t)|0?(o[e+248>>2]|0)!=0:0)?(r=Y(Nr(e+244|0,n)),r>=Y(0.0)):0))r=Y(NT(Y(Nr(Et(e+204|0,o[1e3+(t<<2)>>2]|0,992)|0,n)),Y(0.0)));return Y(r)}function ei(e,t,n,r,i,u,a){e=e|0;t=Y(t);n=Y(n);r=r|0;i=i|0;u=Y(u);a=Y(a);var l=ft,c=ft,f=ft,d=ft,p=ft,v=ft,m=0,g=0,y=0;y=h;h=h+16|0;m=y;g=e+964|0;Rt(e,(o[g>>2]|0)!=0,3519);l=Y(ui(e,2,t));c=Y(ui(e,0,t));f=Y(Sr(e,2,t));d=Y(Sr(e,0,t));if(wt(t)|0)p=t;else p=Y(NT(Y(0.0),Y(Y(t-f)-l)));if(wt(n)|0)v=n;else v=Y(NT(Y(0.0),Y(Y(n-d)-c)));if((r|0)==1&(i|0)==1){s[e+908>>2]=Y(di(e,2,Y(t-f),u,u));t=Y(di(e,0,Y(n-d),a,u))}else{OA[o[g>>2]&1](m,e,p,r,v,i);p=Y(l+Y(s[m>>2]));v=Y(t-f);s[e+908>>2]=Y(di(e,2,(r|2|0)==2?p:v,u,u));v=Y(c+Y(s[m+4>>2]));t=Y(n-d);t=Y(di(e,0,(i|2|0)==2?v:t,a,u))}s[e+912>>2]=t;h=y;return}function ti(e,t,n,r,i,o,u){e=e|0;t=Y(t);n=Y(n);r=r|0;i=i|0;o=Y(o);u=Y(u);var a=ft,l=ft,c=ft,f=ft;c=Y(ui(e,2,o));a=Y(ui(e,0,o));f=Y(Sr(e,2,o));l=Y(Sr(e,0,o));t=Y(t-f);s[e+908>>2]=Y(di(e,2,(r|2|0)==2?c:t,o,o));n=Y(n-l);s[e+912>>2]=Y(di(e,0,(i|2|0)==2?a:n,u,o));return}function ni(e,t,n,r,i,o,u){e=e|0;t=Y(t);n=Y(n);r=r|0;i=i|0;o=Y(o);u=Y(u);var a=0,l=ft,c=ft;a=(r|0)==2;if((!(t<=Y(0.0)&a)?!(n<=Y(0.0)&(i|0)==2):0)?!((r|0)==1&(i|0)==1):0)e=0;else{l=Y(Sr(e,0,o));c=Y(Sr(e,2,o));a=t>2]=Y(di(e,2,a?Y(0.0):t,o,o));t=Y(n-l);a=n>2]=Y(di(e,0,a?Y(0.0):t,u,o));e=1}return e|0}function ri(e,t){e=e|0;t=t|0;if(ki(e)|0)e=Kr(2,t)|0;else e=0;return e|0}function ii(e,t,n){e=e|0;t=t|0;n=Y(n);n=Y(Jr(e,t,n));return Y(n+Y(Xr(e,t)))}function oi(e,t,n){e=e|0;t=t|0;n=Y(n);n=Y(Zr(e,t,n));return Y(n+Y(Qr(e,t)))}function ui(e,t,n){e=e|0;t=t|0;n=Y(n);var r=ft;r=Y(ii(e,t,n));return Y(r+Y(oi(e,t,n)))}function ai(e){e=e|0;if(!(o[e+24>>2]|0)){if(Y(li(e))!=Y(0.0))e=1;else e=Y(si(e))!=Y(0.0)}else e=0;return e|0}function li(e){e=e|0;var t=ft;if(o[e+944>>2]|0){t=Y(s[e+44>>2]);if(wt(t)|0){t=Y(s[e+40>>2]);e=t>Y(0.0)&((wt(t)|0)^1);return Y(e?t:Y(0.0))}}else t=Y(0.0);return Y(t)}function si(e){e=e|0;var t=ft,n=0,i=ft;do{if(o[e+944>>2]|0){t=Y(s[e+48>>2]);if(wt(t)|0){n=r[(o[e+976>>2]|0)+2>>0]|0;if(n<<24>>24==0?(i=Y(s[e+40>>2]),i>24?Y(1.0):Y(0.0)}}else t=Y(0.0)}while(0);return Y(t)}function ci(e){e=e|0;var t=0,n=0;tx(e+400|0,0,540)|0;r[e+985>>0]=1;Wt(e);n=Ot(e)|0;if(n|0){t=e+948|0;e=0;do{ci(o[(o[t>>2]|0)+(e<<2)>>2]|0);e=e+1|0}while((e|0)!=(n|0))}return}function fi(e,t,n,r,i,u,a,l,c,f){e=e|0;t=t|0;n=Y(n);r=r|0;i=Y(i);u=Y(u);a=Y(a);l=l|0;c=c|0;f=f|0;var d=0,p=ft,v=0,m=0,g=ft,y=ft,_=0,b=ft,w=0,D=ft,S=0,C=0,k=0,T=0,x=0,A=0,O=0,P=0,I=0,N=0;I=h;h=h+16|0;k=I+12|0;T=I+8|0;x=I+4|0;A=I;P=Kr(o[e+4>>2]|0,c)|0;S=Gr(P)|0;p=Y(Nr(Ti(t)|0,S?u:a));C=Ir(t,2,u)|0;O=Ir(t,0,a)|0;do{if(!(wt(p)|0)?!(wt(S?n:i)|0):0){d=t+504|0;if(!(wt(Y(s[d>>2]))|0)){if(!(xi(o[t+976>>2]|0,0)|0))break;if((o[t+500>>2]|0)==(o[2278]|0))break}s[d>>2]=Y(NT(p,Y(ui(t,P,u))))}else v=7}while(0);do{if((v|0)==7){w=S^1;if(!(w|C^1)){a=Y(Nr(o[t+992>>2]|0,u));s[t+504>>2]=Y(NT(a,Y(ui(t,2,u))));break}if(!(S|O^1)){a=Y(Nr(o[t+996>>2]|0,a));s[t+504>>2]=Y(NT(a,Y(ui(t,0,u))));break}s[k>>2]=Y(E);s[T>>2]=Y(E);o[x>>2]=0;o[A>>2]=0;b=Y(Sr(t,2,u));D=Y(Sr(t,0,u));if(C){g=Y(b+Y(Nr(o[t+992>>2]|0,u)));s[k>>2]=g;o[x>>2]=1;m=1}else{m=0;g=Y(E)}if(O){p=Y(D+Y(Nr(o[t+996>>2]|0,a)));s[T>>2]=p;o[A>>2]=1;d=1}else{d=0;p=Y(E)}v=o[e+32>>2]|0;if(!(S&(v|0)==2)){if(wt(g)|0?!(wt(n)|0):0){s[k>>2]=n;o[x>>2]=2;m=2;g=n}}else v=2;if((!((v|0)==2&w)?wt(p)|0:0)?!(wt(i)|0):0){s[T>>2]=i;o[A>>2]=2;d=2;p=i}y=Y(s[t+396>>2]);_=wt(y)|0;do{if(!_){if((m|0)==1&w){s[T>>2]=Y(Y(g-b)/y);o[A>>2]=1;d=1;v=1;break}if(S&(d|0)==1){s[k>>2]=Y(y*Y(p-D));o[x>>2]=1;d=1;v=1}else v=m}else v=m}while(0);N=wt(n)|0;m=(pi(e,t)|0)!=4;if(!(S|C|((r|0)!=1|N)|(m|(v|0)==1))?(s[k>>2]=n,o[x>>2]=1,!_):0){s[T>>2]=Y(Y(n-b)/y);o[A>>2]=1;d=1}if(!(O|w|((l|0)!=1|(wt(i)|0))|(m|(d|0)==1))?(s[T>>2]=i,o[A>>2]=1,!_):0){s[k>>2]=Y(y*Y(i-D));o[x>>2]=1}mi(t,2,u,u,x,k);mi(t,0,a,u,A,T);n=Y(s[k>>2]);i=Y(s[T>>2]);Dr(t,n,i,c,o[x>>2]|0,o[A>>2]|0,u,a,0,3565,f)|0;a=Y(s[t+908+(o[976+(P<<2)>>2]<<2)>>2]);s[t+504>>2]=Y(NT(a,Y(ui(t,P,u))))}}while(0);o[t+500>>2]=o[2278];h=I;return}function di(e,t,n,r,i){e=e|0;t=t|0;n=Y(n);r=Y(r);i=Y(i);r=Y(Di(e,t,n,r));return Y(NT(r,Y(ui(e,t,i))))}function pi(e,t){e=e|0;t=t|0;t=t+20|0;t=o[((o[t>>2]|0)==0?e+16|0:t)>>2]|0;if((t|0)==5?ki(o[e+4>>2]|0)|0:0)t=1;return t|0}function hi(e,t){e=e|0;t=t|0;if(Gr(t)|0?(o[e+96>>2]|0)!=0:0)t=4;else t=o[1040+(t<<2)>>2]|0;return e+60+(t<<3)|0}function vi(e,t){e=e|0;t=t|0;if(Gr(t)|0?(o[e+104>>2]|0)!=0:0)t=5;else t=o[1e3+(t<<2)>>2]|0;return e+60+(t<<3)|0}function mi(e,t,n,r,i,u){e=e|0;t=t|0;n=Y(n);r=Y(r);i=i|0;u=u|0;n=Y(Nr(e+380+(o[976+(t<<2)>>2]<<3)|0,n));n=Y(n+Y(Sr(e,t,r)));switch(o[i>>2]|0){case 2:case 1:{i=wt(n)|0;r=Y(s[u>>2]);s[u>>2]=i|r>2]=2;s[u>>2]=n}break}default:{}}return}function gi(e,t){e=e|0;t=t|0;e=e+132|0;if(Gr(t)|0?(o[(Et(e,4,948)|0)+4>>2]|0)!=0:0)e=1;else e=(o[(Et(e,o[1040+(t<<2)>>2]|0,948)|0)+4>>2]|0)!=0;return e|0}function yi(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0;e=e+132|0;if(Gr(t)|0?(r=Et(e,4,948)|0,(o[r+4>>2]|0)!=0):0)i=4;else{r=Et(e,o[1040+(t<<2)>>2]|0,948)|0;if(!(o[r+4>>2]|0))n=Y(0.0);else i=4}if((i|0)==4)n=Y(Nr(r,n));return Y(n)}function _i(e,t,n){e=e|0;t=t|0;n=Y(n);var r=ft;r=Y(s[e+908+(o[976+(t<<2)>>2]<<2)>>2]);r=Y(r+Y(Vr(e,t,n)));return Y(r+Y(qr(e,t,n)))}function bi(e){e=e|0;var t=0,n=0,r=0;e:do{if(!(ki(o[e+4>>2]|0)|0)){if((o[e+16>>2]|0)!=5){n=Ot(e)|0;if(!n)t=0;else{t=0;while(1){r=Pt(e,t)|0;if((o[r+24>>2]|0)==0?(o[r+20>>2]|0)==5:0){t=1;break e}t=t+1|0;if(t>>>0>=n>>>0){t=0;break}}}}else t=1}else t=0}while(0);return t|0}function wi(e,t){e=e|0;t=t|0;var n=ft;n=Y(s[e+908+(o[976+(t<<2)>>2]<<2)>>2]);return n>=Y(0.0)&((wt(n)|0)^1)|0}function Ei(e){e=e|0;var t=ft,n=0,r=0,i=0,u=0,a=0,l=0,c=ft;n=o[e+968>>2]|0;if(!n){u=Ot(e)|0;do{if(u|0){n=0;i=0;while(1){r=Pt(e,i)|0;if(o[r+940>>2]|0){a=8;break}if((o[r+24>>2]|0)!=1){l=(pi(e,r)|0)==5;if(l){n=r;break}else n=(n|0)==0?r:n}i=i+1|0;if(i>>>0>=u>>>0){a=8;break}}if((a|0)==8)if(!n)break;t=Y(Ei(n));return Y(t+Y(s[n+404>>2]))}}while(0);t=Y(s[e+912>>2])}else{c=Y(s[e+908>>2]);t=Y(s[e+912>>2]);t=Y(pA[n&0](e,c,t));Rt(e,(wt(t)|0)^1,3573)}return Y(t)}function Di(e,t,n,r){e=e|0;t=t|0;n=Y(n);r=Y(r);var i=ft,o=0;if(!(ki(t)|0)){if(Gr(t)|0){t=0;o=3}else{r=Y(E);i=Y(E)}}else{t=1;o=3}if((o|0)==3){i=Y(Nr(e+364+(t<<3)|0,r));r=Y(Nr(e+380+(t<<3)|0,r))}o=r=Y(0.0)&((wt(r)|0)^1));n=o?r:n;o=i>=Y(0.0)&((wt(i)|0)^1)&n>2]|0,u)|0;m=ri(y,u)|0;g=Gr(y)|0;p=Y(Sr(t,2,n));h=Y(Sr(t,0,n));if(!(Ir(t,2,n)|0)){if(gi(t,2)|0?Ai(t,2)|0:0){l=Y(s[e+908>>2]);c=Y(Xr(e,2));c=Y(l-Y(c+Y(Qr(e,2))));l=Y(yi(t,2,n));l=Y(di(t,2,Y(c-Y(l+Y(Oi(t,2,n)))),n,n))}else l=Y(E)}else l=Y(p+Y(Nr(o[t+992>>2]|0,n)));if(!(Ir(t,0,i)|0)){if(gi(t,0)|0?Ai(t,0)|0:0){c=Y(s[e+912>>2]);b=Y(Xr(e,0));b=Y(c-Y(b+Y(Qr(e,0))));c=Y(yi(t,0,i));c=Y(di(t,0,Y(b-Y(c+Y(Oi(t,0,i)))),i,n))}else c=Y(E)}else c=Y(h+Y(Nr(o[t+996>>2]|0,i)));f=wt(l)|0;d=wt(c)|0;do{if(f^d?(v=Y(s[t+396>>2]),!(wt(v)|0)):0)if(f){l=Y(p+Y(Y(c-h)*v));break}else{b=Y(h+Y(Y(l-p)/v));c=d?b:c;break}}while(0);d=wt(l)|0;f=wt(c)|0;if(d|f){w=(d^1)&1;r=n>Y(0.0)&((r|0)!=0&d);l=g?l:r?n:l;Dr(t,l,c,u,g?w:r?2:w,d&(f^1)&1,l,c,0,3623,a)|0;l=Y(s[t+908>>2]);l=Y(l+Y(Sr(t,2,n)));c=Y(s[t+912>>2]);c=Y(c+Y(Sr(t,0,n)))}Dr(t,l,c,u,1,1,l,c,1,3635,a)|0;if(Ai(t,y)|0?!(gi(t,y)|0):0){w=o[976+(y<<2)>>2]|0;b=Y(s[e+908+(w<<2)>>2]);b=Y(b-Y(s[t+908+(w<<2)>>2]));b=Y(b-Y(Qr(e,y)));b=Y(b-Y(qr(t,y,n)));b=Y(b-Y(Oi(t,y,g?n:i)));s[t+400+(o[1040+(y<<2)>>2]<<2)>>2]=b}else _=21;do{if((_|0)==21){if(!(gi(t,y)|0)?(o[e+8>>2]|0)==1:0){w=o[976+(y<<2)>>2]|0;b=Y(s[e+908+(w<<2)>>2]);b=Y(Y(b-Y(s[t+908+(w<<2)>>2]))*Y(.5));s[t+400+(o[1040+(y<<2)>>2]<<2)>>2]=b;break}if(!(gi(t,y)|0)?(o[e+8>>2]|0)==2:0){w=o[976+(y<<2)>>2]|0;b=Y(s[e+908+(w<<2)>>2]);b=Y(b-Y(s[t+908+(w<<2)>>2]));s[t+400+(o[1040+(y<<2)>>2]<<2)>>2]=b}}}while(0);if(Ai(t,m)|0?!(gi(t,m)|0):0){w=o[976+(m<<2)>>2]|0;b=Y(s[e+908+(w<<2)>>2]);b=Y(b-Y(s[t+908+(w<<2)>>2]));b=Y(b-Y(Qr(e,m)));b=Y(b-Y(qr(t,m,n)));b=Y(b-Y(Oi(t,m,g?i:n)));s[t+400+(o[1040+(m<<2)>>2]<<2)>>2]=b}else _=30;do{if((_|0)==30?!(gi(t,m)|0):0){if((pi(e,t)|0)==2){w=o[976+(m<<2)>>2]|0;b=Y(s[e+908+(w<<2)>>2]);b=Y(Y(b-Y(s[t+908+(w<<2)>>2]))*Y(.5));s[t+400+(o[1040+(m<<2)>>2]<<2)>>2]=b;break}w=(pi(e,t)|0)==3;if(w^(o[e+28>>2]|0)==2){w=o[976+(m<<2)>>2]|0;b=Y(s[e+908+(w<<2)>>2]);b=Y(b-Y(s[t+908+(w<<2)>>2]));s[t+400+(o[1040+(m<<2)>>2]<<2)>>2]=b}}}while(0);return}function Ci(e,t,n){e=e|0;t=t|0;n=n|0;var r=ft,i=0;i=o[976+(n<<2)>>2]|0;r=Y(s[t+908+(i<<2)>>2]);r=Y(Y(s[e+908+(i<<2)>>2])-r);r=Y(r-Y(s[t+400+(o[1040+(n<<2)>>2]<<2)>>2]));s[t+400+(o[1e3+(n<<2)>>2]<<2)>>2]=r;return}function ki(e){e=e|0;return(e|1|0)==1|0}function Ti(e){e=e|0;var t=ft;switch(o[e+56>>2]|0){case 0:case 3:{t=Y(s[e+40>>2]);if(t>Y(0.0)&((wt(t)|0)^1))e=r[(o[e+976>>2]|0)+2>>0]|0?1056:992;else e=1056;break}default:e=e+52|0}return e|0}function xi(e,t){e=e|0;t=t|0;return(r[e+t>>0]|0)!=0|0}function Ai(e,t){e=e|0;t=t|0;e=e+132|0;if(Gr(t)|0?(o[(Et(e,5,948)|0)+4>>2]|0)!=0:0)e=1;else e=(o[(Et(e,o[1e3+(t<<2)>>2]|0,948)|0)+4>>2]|0)!=0;return e|0}function Oi(e,t,n){e=e|0;t=t|0;n=Y(n);var r=0,i=0;e=e+132|0;if(Gr(t)|0?(r=Et(e,5,948)|0,(o[r+4>>2]|0)!=0):0)i=4;else{r=Et(e,o[1e3+(t<<2)>>2]|0,948)|0;if(!(o[r+4>>2]|0))n=Y(0.0);else i=4}if((i|0)==4)n=Y(Nr(r,n));return Y(n)}function Pi(e,t,n){e=e|0;t=t|0;n=Y(n);if(gi(e,t)|0)n=Y(yi(e,t,n));else n=Y(-Y(Oi(e,t,n)));return Y(n)}function Ii(e){e=Y(e);return(s[d>>2]=e,o[d>>2]|0)|0}function Ni(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>1073741823)Ye();else{i=$T(t<<2)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<2)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<2);return}function Mi(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>2)<<2)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Ri(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-4-t|0)>>>2)<<2);e=o[e>>2]|0;if(e|0)KT(e);return}function Fi(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0;a=e+4|0;l=o[a>>2]|0;i=l-r|0;u=i>>2;e=t+(u<<2)|0;if(e>>>0>>0){r=l;do{o[r>>2]=o[e>>2];e=e+4|0;r=(o[a>>2]|0)+4|0;o[a>>2]=r}while(e>>>0>>0)}if(u|0)sx(l+(0-u<<2)|0,t|0,i|0)|0;return}function Li(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0;l=t+4|0;s=o[l>>2]|0;i=o[e>>2]|0;a=n;u=a-i|0;r=s+(0-(u>>2)<<2)|0;o[l>>2]=r;if((u|0)>0)ix(r|0,i|0,u|0)|0;i=e+4|0;u=t+8|0;r=(o[i>>2]|0)-a|0;if((r|0)>0){ix(o[u>>2]|0,n|0,r|0)|0;o[u>>2]=(o[u>>2]|0)+(r>>>2<<2)}a=o[e>>2]|0;o[e>>2]=o[l>>2];o[l>>2]=a;a=o[i>>2]|0;o[i>>2]=o[u>>2];o[u>>2]=a;a=e+8|0;n=t+12|0;e=o[a>>2]|0;o[a>>2]=o[n>>2];o[n>>2]=e;o[t>>2]=o[l>>2];return s|0}function Bi(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;a=o[t>>2]|0;u=o[n>>2]|0;if((a|0)!=(u|0)){i=e+8|0;n=((u+-4-a|0)>>>2)+1|0;e=a;r=o[i>>2]|0;do{o[r>>2]=o[e>>2];r=(o[i>>2]|0)+4|0;o[i>>2]=r;e=e+4|0}while((e|0)!=(u|0));o[t>>2]=a+(n<<2)}return}function ji(){_t();return}function Ui(){var e=0;e=$T(4)|0;zi(e);return e|0}function zi(e){e=e|0;o[e>>2]=Lt()|0;return}function Wi(e){e=e|0;if(e|0){Hi(e);KT(e)}return}function Hi(e){e=e|0;jt(o[e>>2]|0);return}function Vi(e,t,n){e=e|0;t=t|0;n=n|0;jr(o[e>>2]|0,t,n);return}function qi(e,t){e=e|0;t=Y(t);Ar(o[e>>2]|0,t);return}function Gi(e,t){e=e|0;t=t|0;return xi(o[e>>2]|0,t)|0}function $i(){var e=0;e=$T(8)|0;Yi(e,0);return e|0}function Yi(e,t){e=e|0;t=t|0;if(!t)t=Ct()|0;else t=Dt(o[t>>2]|0)|0;o[e>>2]=t;o[e+4>>2]=0;Jt(t,e);return}function Ki(e){e=e|0;var t=0;t=$T(8)|0;Yi(t,e);return t|0}function Xi(e){e=e|0;if(e|0){Qi(e);KT(e)}return}function Qi(e){e=e|0;var t=0;xt(o[e>>2]|0);t=e+4|0;e=o[t>>2]|0;o[t>>2]=0;if(e|0){Ji(e);KT(e)}return}function Ji(e){e=e|0;Zi(e);return}function Zi(e){e=e|0;e=o[e>>2]|0;if(e|0)rt(e|0);return}function eo(e){e=e|0;return Zt(e)|0}function to(e){e=e|0;var t=0,n=0;n=e+4|0;t=o[n>>2]|0;o[n>>2]=0;if(t|0){Ji(t);KT(t)}Mt(o[e>>2]|0);return}function no(e,t){e=e|0;t=t|0;Kt(o[e>>2]|0,o[t>>2]|0);return}function ro(e,t){e=e|0;t=t|0;fn(o[e>>2]|0,t);return}function io(e,t,n){e=e|0;t=t|0;n=+n;Cn(o[e>>2]|0,t,Y(n));return}function oo(e,t,n){e=e|0;t=t|0;n=+n;kn(o[e>>2]|0,t,Y(n));return}function uo(e,t){e=e|0;t=t|0;on(o[e>>2]|0,t);return}function ao(e,t){e=e|0;t=t|0;an(o[e>>2]|0,t);return}function lo(e,t){e=e|0;t=t|0;sn(o[e>>2]|0,t);return}function so(e,t){e=e|0;t=t|0;en(o[e>>2]|0,t);return}function co(e,t){e=e|0;t=t|0;pn(o[e>>2]|0,t);return}function fo(e,t){e=e|0;t=t|0;nn(o[e>>2]|0,t);return}function po(e,t,n){e=e|0;t=t|0;n=+n;xn(o[e>>2]|0,t,Y(n));return}function ho(e,t,n){e=e|0;t=t|0;n=+n;An(o[e>>2]|0,t,Y(n));return}function vo(e,t){e=e|0;t=t|0;Pn(o[e>>2]|0,t);return}function mo(e,t){e=e|0;t=t|0;vn(o[e>>2]|0,t);return}function go(e,t){e=e|0;t=t|0;gn(o[e>>2]|0,t);return}function yo(e,t){e=e|0;t=+t;_n(o[e>>2]|0,Y(t));return}function _o(e,t){e=e|0;t=+t;En(o[e>>2]|0,Y(t));return}function bo(e,t){e=e|0;t=+t;Dn(o[e>>2]|0,Y(t));return}function wo(e,t){e=e|0;t=+t;bn(o[e>>2]|0,Y(t));return}function Eo(e,t){e=e|0;t=+t;wn(o[e>>2]|0,Y(t));return}function Do(e,t){e=e|0;t=+t;Ln(o[e>>2]|0,Y(t));return}function So(e,t){e=e|0;t=+t;Bn(o[e>>2]|0,Y(t));return}function Co(e){e=e|0;jn(o[e>>2]|0);return}function ko(e,t){e=e|0;t=+t;zn(o[e>>2]|0,Y(t));return}function To(e,t){e=e|0;t=+t;Wn(o[e>>2]|0,Y(t));return}function xo(e){e=e|0;Hn(o[e>>2]|0);return}function Ao(e,t){e=e|0;t=+t;qn(o[e>>2]|0,Y(t));return}function Oo(e,t){e=e|0;t=+t;Gn(o[e>>2]|0,Y(t));return}function Po(e,t){e=e|0;t=+t;Yn(o[e>>2]|0,Y(t));return}function Io(e,t){e=e|0;t=+t;Kn(o[e>>2]|0,Y(t));return}function No(e,t){e=e|0;t=+t;Qn(o[e>>2]|0,Y(t));return}function Mo(e,t){e=e|0;t=+t;Jn(o[e>>2]|0,Y(t));return}function Ro(e,t){e=e|0;t=+t;er(o[e>>2]|0,Y(t));return}function Fo(e,t){e=e|0;t=+t;tr(o[e>>2]|0,Y(t));return}function Lo(e,t){e=e|0;t=+t;rr(o[e>>2]|0,Y(t));return}function Bo(e,t,n){e=e|0;t=t|0;n=+n;Rn(o[e>>2]|0,t,Y(n));return}function jo(e,t,n){e=e|0;t=t|0;n=+n;In(o[e>>2]|0,t,Y(n));return}function Uo(e,t,n){e=e|0;t=t|0;n=+n;Nn(o[e>>2]|0,t,Y(n));return}function zo(e){e=e|0;return dn(o[e>>2]|0)|0}function Wo(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0;r=h;h=h+16|0;i=r;Tn(i,o[t>>2]|0,n);Ho(e,i);h=r;return}function Ho(e,t){e=e|0;t=t|0;Vo(e,o[t+4>>2]|0,+Y(s[t>>2]));return}function Vo(e,t,n){e=e|0;t=t|0;n=+n;o[e>>2]=t;c[e+8>>3]=n;return}function qo(e){e=e|0;return un(o[e>>2]|0)|0}function Go(e){e=e|0;return ln(o[e>>2]|0)|0}function $o(e){e=e|0;return cn(o[e>>2]|0)|0}function Yo(e){e=e|0;return tn(o[e>>2]|0)|0}function Ko(e){e=e|0;return hn(o[e>>2]|0)|0}function Xo(e){e=e|0;return rn(o[e>>2]|0)|0}function Qo(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0;r=h;h=h+16|0;i=r;On(i,o[t>>2]|0,n);Ho(e,i);h=r;return}function Jo(e){e=e|0;return mn(o[e>>2]|0)|0}function Zo(e){e=e|0;return yn(o[e>>2]|0)|0}function eu(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;Sn(r,o[t>>2]|0);Ho(e,r);h=n;return}function tu(e){e=e|0;return+ +Y(Xt(o[e>>2]|0))}function nu(e){e=e|0;return+ +Y(Qt(o[e>>2]|0))}function ru(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;Un(r,o[t>>2]|0);Ho(e,r);h=n;return}function iu(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;Vn(r,o[t>>2]|0);Ho(e,r);h=n;return}function ou(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;$n(r,o[t>>2]|0);Ho(e,r);h=n;return}function uu(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;Xn(r,o[t>>2]|0);Ho(e,r);h=n;return}function au(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;Zn(r,o[t>>2]|0);Ho(e,r);h=n;return}function lu(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;nr(r,o[t>>2]|0);Ho(e,r);h=n;return}function su(e){e=e|0;return+ +Y(ir(o[e>>2]|0))}function cu(e,t){e=e|0;t=t|0;return+ +Y(Fn(o[e>>2]|0,t))}function fu(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0;r=h;h=h+16|0;i=r;Mn(i,o[t>>2]|0,n);Ho(e,i);h=r;return}function du(e,t,n){e=e|0;t=t|0;n=n|0;zt(o[e>>2]|0,o[t>>2]|0,n);return}function pu(e,t){e=e|0;t=t|0;Nt(o[e>>2]|0,o[t>>2]|0);return}function hu(e){e=e|0;return Ot(o[e>>2]|0)|0}function vu(e){e=e|0;e=Gt(o[e>>2]|0)|0;if(!e)e=0;else e=eo(e)|0;return e|0}function mu(e,t){e=e|0;t=t|0;e=Pt(o[e>>2]|0,t)|0;if(!e)e=0;else e=eo(e)|0;return e|0}function gu(e,t){e=e|0;t=t|0;var n=0,r=0;r=$T(4)|0;yu(r,t);n=e+4|0;t=o[n>>2]|0;o[n>>2]=r;if(t|0){Ji(t);KT(t)}Ut(o[e>>2]|0,1);return}function yu(e,t){e=e|0;t=t|0;Bu(e,t);return}function _u(e,t,n,r,i,o){e=e|0;t=t|0;n=Y(n);r=r|0;i=Y(i);o=o|0;var u=0,a=0;u=h;h=h+16|0;a=u;bu(a,Zt(t)|0,+n,r,+i,o);s[e>>2]=Y(+c[a>>3]);s[e+4>>2]=Y(+c[a+8>>3]);h=u;return}function bu(e,t,n,r,i,u){e=e|0;t=t|0;n=+n;r=r|0;i=+i;u=u|0;var a=0,l=0,s=0,f=0,d=0;a=h;h=h+32|0;d=a+8|0;f=a+20|0;s=a;l=a+16|0;c[d>>3]=n;o[f>>2]=r;c[s>>3]=i;o[l>>2]=u;wu(e,o[t+4>>2]|0,d,f,s,l);h=a;return}function wu(e,t,n,r,i,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;var a=0,l=0;a=h;h=h+16|0;l=a;Dk(l);t=Eu(t)|0;Du(e,t,+c[n>>3],o[r>>2]|0,+c[i>>3],o[u>>2]|0);Ck(l);h=a;return}function Eu(e){e=e|0;return o[e>>2]|0}function Du(e,t,n,r,i,o){e=e|0;t=t|0;n=+n;r=r|0;i=+i;o=o|0;var u=0;u=Cu(Su()|0)|0;n=+ku(n);r=Tu(r)|0;i=+ku(i);xu(e,ot(0,u|0,t|0,+n,r|0,+i,Tu(o)|0)|0);return}function Su(){var e=0;if(!(r[7608]|0)){Ru(9120);e=7608;o[e>>2]=1;o[e+4>>2]=0}return 9120}function Cu(e){e=e|0;return o[e+8>>2]|0}function ku(e){e=+e;return+ +Mu(e)}function Tu(e){e=e|0;return Nu(e)|0}function xu(e,t){e=e|0;t=t|0;var n=0,r=0,i=0;i=h;h=h+32|0;n=i;r=t;if(!(r&1)){o[e>>2]=o[t>>2];o[e+4>>2]=o[t+4>>2];o[e+8>>2]=o[t+8>>2];o[e+12>>2]=o[t+12>>2]}else{Au(n,0);Be(r|0,n|0)|0;Ou(e,n);Pu(n)}h=i;return}function Au(e,t){e=e|0;t=t|0;Iu(e,t);o[e+8>>2]=0;r[e+24>>0]=0;return}function Ou(e,t){e=e|0;t=t|0;t=t+8|0;o[e>>2]=o[t>>2];o[e+4>>2]=o[t+4>>2];o[e+8>>2]=o[t+8>>2];o[e+12>>2]=o[t+12>>2];return}function Pu(e){e=e|0;r[e+24>>0]=0;return}function Iu(e,t){e=e|0;t=t|0;o[e>>2]=t;return}function Nu(e){e=e|0;return e|0}function Mu(e){e=+e;return+e}function Ru(e){e=e|0;Lu(e,Fu()|0,4);return}function Fu(){return 1064}function Lu(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;o[e+8>>2]=tt(t|0,n+1|0)|0;return}function Bu(e,t){e=e|0;t=t|0;t=o[t>>2]|0;o[e>>2]=t;Ae(t|0);return}function ju(e){e=e|0;var t=0,n=0;n=e+4|0;t=o[n>>2]|0;o[n>>2]=0;if(t|0){Ji(t);KT(t)}Ut(o[e>>2]|0,0);return}function Uu(e){e=e|0;$t(o[e>>2]|0);return}function zu(e){e=e|0;return Yt(o[e>>2]|0)|0}function Wu(e,t,n,r){e=e|0;t=+t;n=+n;r=r|0;Or(o[e>>2]|0,Y(t),Y(n),r);return}function Hu(e){e=e|0;return+ +Y(or(o[e>>2]|0))}function Vu(e){e=e|0;return+ +Y(ar(o[e>>2]|0))}function qu(e){e=e|0;return+ +Y(ur(o[e>>2]|0))}function Gu(e){e=e|0;return+ +Y(lr(o[e>>2]|0))}function $u(e){e=e|0;return+ +Y(sr(o[e>>2]|0))}function Yu(e){e=e|0;return+ +Y(cr(o[e>>2]|0))}function Ku(e,t){e=e|0;t=t|0;c[e>>3]=+Y(or(o[t>>2]|0));c[e+8>>3]=+Y(ar(o[t>>2]|0));c[e+16>>3]=+Y(ur(o[t>>2]|0));c[e+24>>3]=+Y(lr(o[t>>2]|0));c[e+32>>3]=+Y(sr(o[t>>2]|0));c[e+40>>3]=+Y(cr(o[t>>2]|0));return}function Xu(e,t){e=e|0;t=t|0;return+ +Y(fr(o[e>>2]|0,t))}function Qu(e,t){e=e|0;t=t|0;return+ +Y(dr(o[e>>2]|0,t))}function Ju(e,t){e=e|0;t=t|0;return+ +Y(pr(o[e>>2]|0,t))}function Zu(){return Ft()|0}function ea(){ta();na();ra();ia();oa();ua();return}function ta(){zb(11713,4938,1);return}function na(){tb(10448);return}function ra(){R_(10408);return}function ia(){Jy(10324);return}function oa(){qm(10096);return}function ua(){aa(9132);return}function aa(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0,m=0,g=0,y=0,_=0,b=0,w=0,E=0,D=0,S=0,C=0,k=0,T=0,x=0,A=0,O=0,P=0,I=0,N=0,M=0,R=0,F=0,L=0,B=0,j=0,U=0,z=0,W=0,H=0,V=0,q=0,G=0,$=0,Y=0,K=0,X=0,Q=0,J=0,Z=0,ee=0,te=0,ne=0,re=0,ie=0,oe=0,ue=0,ae=0,le=0,se=0,ce=0,fe=0,de=0,pe=0,he=0,ve=0,me=0,ge=0,ye=0,_e=0,be=0,we=0,Ee=0,De=0,Se=0,Ce=0,ke=0,Te=0,xe=0,Ae=0,Oe=0,Pe=0,Ie=0;t=h;h=h+672|0;n=t+656|0;Ie=t+648|0;Pe=t+640|0;Oe=t+632|0;Ae=t+624|0;xe=t+616|0;Te=t+608|0;ke=t+600|0;Ce=t+592|0;Se=t+584|0;De=t+576|0;Ee=t+568|0;we=t+560|0;be=t+552|0;_e=t+544|0;ye=t+536|0;ge=t+528|0;me=t+520|0;ve=t+512|0;he=t+504|0;pe=t+496|0;de=t+488|0;fe=t+480|0;ce=t+472|0;se=t+464|0;le=t+456|0;ae=t+448|0;ue=t+440|0;oe=t+432|0;ie=t+424|0;re=t+416|0;ne=t+408|0;te=t+400|0;ee=t+392|0;Z=t+384|0;J=t+376|0;Q=t+368|0;X=t+360|0;K=t+352|0;Y=t+344|0;$=t+336|0;G=t+328|0;q=t+320|0;V=t+312|0;H=t+304|0;W=t+296|0;z=t+288|0;U=t+280|0;j=t+272|0;B=t+264|0;L=t+256|0;F=t+248|0;R=t+240|0;M=t+232|0;N=t+224|0;I=t+216|0;P=t+208|0;O=t+200|0;A=t+192|0;x=t+184|0;T=t+176|0;k=t+168|0;C=t+160|0;S=t+152|0;D=t+144|0;E=t+136|0;w=t+128|0;b=t+120|0;_=t+112|0;y=t+104|0;g=t+96|0;m=t+88|0;v=t+80|0;p=t+72|0;d=t+64|0;f=t+56|0;c=t+48|0;s=t+40|0;l=t+32|0;a=t+24|0;u=t+16|0;i=t+8|0;r=t;la(e,3646);sa(e,3651,2)|0;ca(e,3665,2)|0;fa(e,3682,18)|0;o[Ie>>2]=19;o[Ie+4>>2]=0;o[n>>2]=o[Ie>>2];o[n+4>>2]=o[Ie+4>>2];da(e,3690,n)|0;o[Pe>>2]=1;o[Pe+4>>2]=0;o[n>>2]=o[Pe>>2];o[n+4>>2]=o[Pe+4>>2];pa(e,3696,n)|0;o[Oe>>2]=2;o[Oe+4>>2]=0;o[n>>2]=o[Oe>>2];o[n+4>>2]=o[Oe+4>>2];ha(e,3706,n)|0;o[Ae>>2]=1;o[Ae+4>>2]=0;o[n>>2]=o[Ae>>2];o[n+4>>2]=o[Ae+4>>2];va(e,3722,n)|0;o[xe>>2]=2;o[xe+4>>2]=0;o[n>>2]=o[xe>>2];o[n+4>>2]=o[xe+4>>2];va(e,3734,n)|0;o[Te>>2]=3;o[Te+4>>2]=0;o[n>>2]=o[Te>>2];o[n+4>>2]=o[Te+4>>2];ha(e,3753,n)|0;o[ke>>2]=4;o[ke+4>>2]=0;o[n>>2]=o[ke>>2];o[n+4>>2]=o[ke+4>>2];ha(e,3769,n)|0;o[Ce>>2]=5;o[Ce+4>>2]=0;o[n>>2]=o[Ce>>2];o[n+4>>2]=o[Ce+4>>2];ha(e,3783,n)|0;o[Se>>2]=6;o[Se+4>>2]=0;o[n>>2]=o[Se>>2];o[n+4>>2]=o[Se+4>>2];ha(e,3796,n)|0;o[De>>2]=7;o[De+4>>2]=0;o[n>>2]=o[De>>2];o[n+4>>2]=o[De+4>>2];ha(e,3813,n)|0;o[Ee>>2]=8;o[Ee+4>>2]=0;o[n>>2]=o[Ee>>2];o[n+4>>2]=o[Ee+4>>2];ha(e,3825,n)|0;o[we>>2]=3;o[we+4>>2]=0;o[n>>2]=o[we>>2];o[n+4>>2]=o[we+4>>2];va(e,3843,n)|0;o[be>>2]=4;o[be+4>>2]=0;o[n>>2]=o[be>>2];o[n+4>>2]=o[be+4>>2];va(e,3853,n)|0;o[_e>>2]=9;o[_e+4>>2]=0;o[n>>2]=o[_e>>2];o[n+4>>2]=o[_e+4>>2];ha(e,3870,n)|0;o[ye>>2]=10;o[ye+4>>2]=0;o[n>>2]=o[ye>>2];o[n+4>>2]=o[ye+4>>2];ha(e,3884,n)|0;o[ge>>2]=11;o[ge+4>>2]=0;o[n>>2]=o[ge>>2];o[n+4>>2]=o[ge+4>>2];ha(e,3896,n)|0;o[me>>2]=1;o[me+4>>2]=0;o[n>>2]=o[me>>2];o[n+4>>2]=o[me+4>>2];ma(e,3907,n)|0;o[ve>>2]=2;o[ve+4>>2]=0;o[n>>2]=o[ve>>2];o[n+4>>2]=o[ve+4>>2];ma(e,3915,n)|0;o[he>>2]=3;o[he+4>>2]=0;o[n>>2]=o[he>>2];o[n+4>>2]=o[he+4>>2];ma(e,3928,n)|0;o[pe>>2]=4;o[pe+4>>2]=0;o[n>>2]=o[pe>>2];o[n+4>>2]=o[pe+4>>2];ma(e,3948,n)|0;o[de>>2]=5;o[de+4>>2]=0;o[n>>2]=o[de>>2];o[n+4>>2]=o[de+4>>2];ma(e,3960,n)|0;o[fe>>2]=6;o[fe+4>>2]=0;o[n>>2]=o[fe>>2];o[n+4>>2]=o[fe+4>>2];ma(e,3974,n)|0;o[ce>>2]=7;o[ce+4>>2]=0;o[n>>2]=o[ce>>2];o[n+4>>2]=o[ce+4>>2];ma(e,3983,n)|0;o[se>>2]=20;o[se+4>>2]=0;o[n>>2]=o[se>>2];o[n+4>>2]=o[se+4>>2];da(e,3999,n)|0;o[le>>2]=8;o[le+4>>2]=0;o[n>>2]=o[le>>2];o[n+4>>2]=o[le+4>>2];ma(e,4012,n)|0;o[ae>>2]=9;o[ae+4>>2]=0;o[n>>2]=o[ae>>2];o[n+4>>2]=o[ae+4>>2];ma(e,4022,n)|0;o[ue>>2]=21;o[ue+4>>2]=0;o[n>>2]=o[ue>>2];o[n+4>>2]=o[ue+4>>2];da(e,4039,n)|0;o[oe>>2]=10;o[oe+4>>2]=0;o[n>>2]=o[oe>>2];o[n+4>>2]=o[oe+4>>2];ma(e,4053,n)|0;o[ie>>2]=11;o[ie+4>>2]=0;o[n>>2]=o[ie>>2];o[n+4>>2]=o[ie+4>>2];ma(e,4065,n)|0;o[re>>2]=12;o[re+4>>2]=0;o[n>>2]=o[re>>2];o[n+4>>2]=o[re+4>>2];ma(e,4084,n)|0;o[ne>>2]=13;o[ne+4>>2]=0;o[n>>2]=o[ne>>2];o[n+4>>2]=o[ne+4>>2];ma(e,4097,n)|0;o[te>>2]=14;o[te+4>>2]=0;o[n>>2]=o[te>>2];o[n+4>>2]=o[te+4>>2];ma(e,4117,n)|0;o[ee>>2]=15;o[ee+4>>2]=0;o[n>>2]=o[ee>>2];o[n+4>>2]=o[ee+4>>2];ma(e,4129,n)|0;o[Z>>2]=16;o[Z+4>>2]=0;o[n>>2]=o[Z>>2];o[n+4>>2]=o[Z+4>>2];ma(e,4148,n)|0;o[J>>2]=17;o[J+4>>2]=0;o[n>>2]=o[J>>2];o[n+4>>2]=o[J+4>>2];ma(e,4161,n)|0;o[Q>>2]=18;o[Q+4>>2]=0;o[n>>2]=o[Q>>2];o[n+4>>2]=o[Q+4>>2];ma(e,4181,n)|0;o[X>>2]=5;o[X+4>>2]=0;o[n>>2]=o[X>>2];o[n+4>>2]=o[X+4>>2];va(e,4196,n)|0;o[K>>2]=6;o[K+4>>2]=0;o[n>>2]=o[K>>2];o[n+4>>2]=o[K+4>>2];va(e,4206,n)|0;o[Y>>2]=7;o[Y+4>>2]=0;o[n>>2]=o[Y>>2];o[n+4>>2]=o[Y+4>>2];va(e,4217,n)|0;o[$>>2]=3;o[$+4>>2]=0;o[n>>2]=o[$>>2];o[n+4>>2]=o[$+4>>2];ga(e,4235,n)|0;o[G>>2]=1;o[G+4>>2]=0;o[n>>2]=o[G>>2];o[n+4>>2]=o[G+4>>2];ya(e,4251,n)|0;o[q>>2]=4;o[q+4>>2]=0;o[n>>2]=o[q>>2];o[n+4>>2]=o[q+4>>2];ga(e,4263,n)|0;o[V>>2]=5;o[V+4>>2]=0;o[n>>2]=o[V>>2];o[n+4>>2]=o[V+4>>2];ga(e,4279,n)|0;o[H>>2]=6;o[H+4>>2]=0;o[n>>2]=o[H>>2];o[n+4>>2]=o[H+4>>2];ga(e,4293,n)|0;o[W>>2]=7;o[W+4>>2]=0;o[n>>2]=o[W>>2];o[n+4>>2]=o[W+4>>2];ga(e,4306,n)|0;o[z>>2]=8;o[z+4>>2]=0;o[n>>2]=o[z>>2];o[n+4>>2]=o[z+4>>2];ga(e,4323,n)|0;o[U>>2]=9;o[U+4>>2]=0;o[n>>2]=o[U>>2];o[n+4>>2]=o[U+4>>2];ga(e,4335,n)|0;o[j>>2]=2;o[j+4>>2]=0;o[n>>2]=o[j>>2];o[n+4>>2]=o[j+4>>2];ya(e,4353,n)|0;o[B>>2]=12;o[B+4>>2]=0;o[n>>2]=o[B>>2];o[n+4>>2]=o[B+4>>2];_a(e,4363,n)|0;o[L>>2]=1;o[L+4>>2]=0;o[n>>2]=o[L>>2];o[n+4>>2]=o[L+4>>2];ba(e,4376,n)|0;o[F>>2]=2;o[F+4>>2]=0;o[n>>2]=o[F>>2];o[n+4>>2]=o[F+4>>2];ba(e,4388,n)|0;o[R>>2]=13;o[R+4>>2]=0;o[n>>2]=o[R>>2];o[n+4>>2]=o[R+4>>2];_a(e,4402,n)|0;o[M>>2]=14;o[M+4>>2]=0;o[n>>2]=o[M>>2];o[n+4>>2]=o[M+4>>2];_a(e,4411,n)|0;o[N>>2]=15;o[N+4>>2]=0;o[n>>2]=o[N>>2];o[n+4>>2]=o[N+4>>2];_a(e,4421,n)|0;o[I>>2]=16;o[I+4>>2]=0;o[n>>2]=o[I>>2];o[n+4>>2]=o[I+4>>2];_a(e,4433,n)|0;o[P>>2]=17;o[P+4>>2]=0;o[n>>2]=o[P>>2];o[n+4>>2]=o[P+4>>2];_a(e,4446,n)|0;o[O>>2]=18;o[O+4>>2]=0;o[n>>2]=o[O>>2];o[n+4>>2]=o[O+4>>2];_a(e,4458,n)|0;o[A>>2]=3;o[A+4>>2]=0;o[n>>2]=o[A>>2];o[n+4>>2]=o[A+4>>2];ba(e,4471,n)|0;o[x>>2]=1;o[x+4>>2]=0;o[n>>2]=o[x>>2];o[n+4>>2]=o[x+4>>2];wa(e,4486,n)|0;o[T>>2]=10;o[T+4>>2]=0;o[n>>2]=o[T>>2];o[n+4>>2]=o[T+4>>2];ga(e,4496,n)|0;o[k>>2]=11;o[k+4>>2]=0;o[n>>2]=o[k>>2];o[n+4>>2]=o[k+4>>2];ga(e,4508,n)|0;o[C>>2]=3;o[C+4>>2]=0;o[n>>2]=o[C>>2];o[n+4>>2]=o[C+4>>2];ya(e,4519,n)|0;o[S>>2]=4;o[S+4>>2]=0;o[n>>2]=o[S>>2];o[n+4>>2]=o[S+4>>2];Ea(e,4530,n)|0;o[D>>2]=19;o[D+4>>2]=0;o[n>>2]=o[D>>2];o[n+4>>2]=o[D+4>>2];Da(e,4542,n)|0;o[E>>2]=12;o[E+4>>2]=0;o[n>>2]=o[E>>2];o[n+4>>2]=o[E+4>>2];Sa(e,4554,n)|0;o[w>>2]=13;o[w+4>>2]=0;o[n>>2]=o[w>>2];o[n+4>>2]=o[w+4>>2];Ca(e,4568,n)|0;o[b>>2]=2;o[b+4>>2]=0;o[n>>2]=o[b>>2];o[n+4>>2]=o[b+4>>2];ka(e,4578,n)|0;o[_>>2]=20;o[_+4>>2]=0;o[n>>2]=o[_>>2];o[n+4>>2]=o[_+4>>2];Ta(e,4587,n)|0;o[y>>2]=22;o[y+4>>2]=0;o[n>>2]=o[y>>2];o[n+4>>2]=o[y+4>>2];da(e,4602,n)|0;o[g>>2]=23;o[g+4>>2]=0;o[n>>2]=o[g>>2];o[n+4>>2]=o[g+4>>2];da(e,4619,n)|0;o[m>>2]=14;o[m+4>>2]=0;o[n>>2]=o[m>>2];o[n+4>>2]=o[m+4>>2];xa(e,4629,n)|0;o[v>>2]=1;o[v+4>>2]=0;o[n>>2]=o[v>>2];o[n+4>>2]=o[v+4>>2];Aa(e,4637,n)|0;o[p>>2]=4;o[p+4>>2]=0;o[n>>2]=o[p>>2];o[n+4>>2]=o[p+4>>2];ba(e,4653,n)|0;o[d>>2]=5;o[d+4>>2]=0;o[n>>2]=o[d>>2];o[n+4>>2]=o[d+4>>2];ba(e,4669,n)|0;o[f>>2]=6;o[f+4>>2]=0;o[n>>2]=o[f>>2];o[n+4>>2]=o[f+4>>2];ba(e,4686,n)|0;o[c>>2]=7;o[c+4>>2]=0;o[n>>2]=o[c>>2];o[n+4>>2]=o[c+4>>2];ba(e,4701,n)|0;o[s>>2]=8;o[s+4>>2]=0;o[n>>2]=o[s>>2];o[n+4>>2]=o[s+4>>2];ba(e,4719,n)|0;o[l>>2]=9;o[l+4>>2]=0;o[n>>2]=o[l>>2];o[n+4>>2]=o[l+4>>2];ba(e,4736,n)|0;o[a>>2]=21;o[a+4>>2]=0;o[n>>2]=o[a>>2];o[n+4>>2]=o[a+4>>2];Oa(e,4754,n)|0;o[u>>2]=2;o[u+4>>2]=0;o[n>>2]=o[u>>2];o[n+4>>2]=o[u+4>>2];wa(e,4772,n)|0;o[i>>2]=3;o[i+4>>2]=0;o[n>>2]=o[i>>2];o[n+4>>2]=o[i+4>>2];wa(e,4790,n)|0;o[r>>2]=4;o[r+4>>2]=0;o[n>>2]=o[r>>2];o[n+4>>2]=o[r+4>>2];wa(e,4808,n)|0;h=t;return}function la(e,t){e=e|0;t=t|0;var n=0;n=Mm()|0;o[e>>2]=n;Rm(n,t);cw(o[e>>2]|0);return}function sa(e,t,n){e=e|0;t=t|0;n=n|0;gm(e,Ia(t)|0,n,0);return e|0}function ca(e,t,n){e=e|0;t=t|0;n=n|0;Xv(e,Ia(t)|0,n,0);return e|0}function fa(e,t,n){e=e|0;t=t|0;n=n|0;Nv(e,Ia(t)|0,n,0);return e|0}function da(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];hv(e,t,i);h=r;return e|0}function pa(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Gh(e,t,i);h=r;return e|0}function ha(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Th(e,t,i);h=r;return e|0}function va(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];lh(e,t,i);h=r;return e|0}function ma(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Hp(e,t,i);h=r;return e|0}function ga(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Sp(e,t,i);h=r;return e|0}function ya(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];op(e,t,i);h=r;return e|0}function _a(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Cd(e,t,i);h=r;return e|0}function ba(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];ud(e,t,i);h=r;return e|0}function wa(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];zf(e,t,i);h=r;return e|0}function Ea(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Ef(e,t,i);h=r;return e|0}function Da(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Zc(e,t,i);h=r;return e|0}function Sa(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Nc(e,t,i);h=r;return e|0}function Ca(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];hc(e,t,i);h=r;return e|0}function ka(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];qs(e,t,i);h=r;return e|0}function Ta(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];ws(e,t,i);h=r;return e|0}function xa(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];ts(e,t,i);h=r;return e|0}function Aa(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Ol(e,t,i);h=r;return e|0}function Oa(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Pa(e,t,i);h=r;return e|0}function Pa(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Na(e,n,i,1);h=r;return}function Ia(e){e=e|0;return e|0}function Na(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Ma()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Ra(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Fa(u,r)|0,r);h=i;return}function Ma(){var e=0,t=0;if(!(r[7616]|0)){Ya(9136);Fe(24,9136,g|0)|0;t=7616;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9136)|0)){e=9136;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Ya(9136)}return 9136}function Ra(e){e=e|0;return 0}function Fa(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Ma()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Wa(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Ha(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function La(e,t,n,r,i,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;var a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0;a=h;h=h+32|0;p=a+24|0;d=a+20|0;s=a+16|0;f=a+12|0;c=a+8|0;l=a+4|0;v=a;o[d>>2]=t;o[s>>2]=n;o[f>>2]=r;o[c>>2]=i;o[l>>2]=u;u=e+28|0;o[v>>2]=o[u>>2];o[p>>2]=o[v>>2];Ba(e+24|0,p,d,f,c,s,l)|0;o[u>>2]=o[o[u>>2]>>2];h=a;return}function Ba(e,t,n,r,i,u,a){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;a=a|0;e=ja(t)|0;t=$T(24)|0;Ua(t+4|0,o[n>>2]|0,o[r>>2]|0,o[i>>2]|0,o[u>>2]|0,o[a>>2]|0);o[t>>2]=o[e>>2];o[e>>2]=t;return t|0}function ja(e){e=e|0;return o[e>>2]|0}function Ua(e,t,n,r,i,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;o[e>>2]=t;o[e+4>>2]=n;o[e+8>>2]=r;o[e+12>>2]=i;o[e+16>>2]=u;return}function za(e,t){e=e|0;t=t|0;return t|e|0}function Wa(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Ha(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Va(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;qa(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Wa(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Ga(e,l);$a(l);h=c;return}}function Va(e){e=e|0;return 357913941}function qa(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Ga(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function $a(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Ya(e){e=e|0;Ja(e);return}function Ka(e){e=e|0;Qa(e+24|0);return}function Xa(e){e=e|0;return o[e>>2]|0}function Qa(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function Ja(e){e=e|0;var t=0;t=Za()|0;nl(e,2,3,t,el()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Za(){return 9228}function el(){return 1140}function tl(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0;n=h;h=h+16|0;r=n+8|0;i=n;u=rl(e)|0;e=o[u+4>>2]|0;o[i>>2]=o[u>>2];o[i+4>>2]=e;o[r>>2]=o[i>>2];o[r+4>>2]=o[i+4>>2];t=il(t,r)|0;h=n;return t|0}function nl(e,t,n,r,i,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;o[e>>2]=t;o[e+4>>2]=n;o[e+8>>2]=r;o[e+12>>2]=i;o[e+16>>2]=u;return}function rl(e){e=e|0;return(o[(Ma()|0)+24>>2]|0)+(e*12|0)|0}function il(e,t){e=e|0;t=t|0;var n=0,r=0,i=0;i=h;h=h+48|0;r=i;n=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)n=o[(o[e>>2]|0)+n>>2]|0;vA[n&31](r,e);r=ol(r)|0;h=i;return r|0}function ol(e){e=e|0;var t=0,n=0,r=0,i=0;i=h;h=h+32|0;t=i+12|0;n=i;r=al(ul()|0)|0;if(!r)e=dl(e)|0;else{ll(t,r);sl(n,t);cl(e,n);e=fl(t)|0}h=i;return e|0}function ul(){var e=0;if(!(r[7632]|0)){Dl(9184);Fe(25,9184,g|0)|0;e=7632;o[e>>2]=1;o[e+4>>2]=0}return 9184}function al(e){e=e|0;return o[e+36>>2]|0}function ll(e,t){e=e|0;t=t|0;o[e>>2]=t;o[e+4>>2]=e;o[e+8>>2]=0;return}function sl(e,t){e=e|0;t=t|0;o[e>>2]=o[t>>2];o[e+4>>2]=o[t+4>>2];o[e+8>>2]=0;return}function cl(e,t){e=e|0;t=t|0;gl(t,e,e+8|0,e+16|0,e+24|0,e+32|0,e+40|0)|0;return}function fl(e){e=e|0;return o[(o[e+4>>2]|0)+8>>2]|0}function dl(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0,s=0;s=h;h=h+16|0;n=s+4|0;r=s;i=UD(8)|0;u=i;a=$T(48)|0;l=a;t=l+48|0;do{o[l>>2]=o[e>>2];l=l+4|0;e=e+4|0}while((l|0)<(t|0));t=u+4|0;o[t>>2]=a;l=$T(8)|0;a=o[t>>2]|0;o[r>>2]=0;o[n>>2]=o[r>>2];pl(l,a,n);o[i>>2]=l;h=s;return u|0}function pl(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;n=$T(16)|0;o[n+4>>2]=0;o[n+8>>2]=0;o[n>>2]=1092;o[n+12>>2]=t;o[e+4>>2]=n;return}function hl(e){e=e|0;zT(e);KT(e);return}function vl(e){e=e|0;e=o[e+12>>2]|0;if(e|0)KT(e);return}function ml(e){e=e|0;KT(e);return}function gl(e,t,n,r,i,u,a){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;a=a|0;u=yl(o[e>>2]|0,t,n,r,i,u,a)|0;a=e+4|0;o[(o[a>>2]|0)+8>>2]=u;return o[(o[a>>2]|0)+8>>2]|0}function yl(e,t,n,r,i,o,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;o=o|0;u=u|0;var a=0,l=0;a=h;h=h+16|0;l=a;Dk(l);e=Eu(e)|0;u=_l(e,+c[t>>3],+c[n>>3],+c[r>>3],+c[i>>3],+c[o>>3],+c[u>>3])|0;Ck(l);h=a;return u|0}function _l(e,t,n,r,i,o,u){e=e|0;t=+t;n=+n;r=+r;i=+i;o=+o;u=+u;var a=0;a=Cu(bl()|0)|0;t=+ku(t);n=+ku(n);r=+ku(r);i=+ku(i);o=+ku(o);return Te(0,a|0,e|0,+t,+n,+r,+i,+o,+ +ku(u))|0}function bl(){var e=0;if(!(r[7624]|0)){wl(9172);e=7624;o[e>>2]=1;o[e+4>>2]=0}return 9172}function wl(e){e=e|0;Lu(e,El()|0,6);return}function El(){return 1112}function Dl(e){e=e|0;Al(e);return}function Sl(e){e=e|0;Cl(e+24|0);kl(e+16|0);return}function Cl(e){e=e|0;xl(e);return}function kl(e){e=e|0;Tl(e);return}function Tl(e){e=e|0;var t=0,n=0;t=o[e>>2]|0;if(t|0)do{n=t;t=o[t>>2]|0;KT(n)}while((t|0)!=0);o[e>>2]=0;return}function xl(e){e=e|0;var t=0,n=0;t=o[e>>2]|0;if(t|0)do{n=t;t=o[t>>2]|0;KT(n)}while((t|0)!=0);o[e>>2]=0;return}function Al(e){e=e|0;var t=0;o[e+16>>2]=0;o[e+20>>2]=0;t=e+24|0;o[t>>2]=0;o[e+28>>2]=t;o[e+36>>2]=0;r[e+40>>0]=0;r[e+41>>0]=0;return}function Ol(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Pl(e,n,i,0);h=r;return}function Pl(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Il()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Nl(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Ml(u,r)|0,r);h=i;return}function Il(){var e=0,t=0;if(!(r[7640]|0)){zl(9232);Fe(26,9232,g|0)|0;t=7640;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9232)|0)){e=9232;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));zl(9232)}return 9232}function Nl(e){e=e|0;return 0}function Ml(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Il()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Rl(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Fl(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Rl(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Fl(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Ll(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Bl(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Rl(u,r,n);o[s>>2]=(o[s>>2]|0)+12;jl(e,l);Ul(l);h=c;return}}function Ll(e){e=e|0;return 357913941}function Bl(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function jl(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Ul(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function zl(e){e=e|0;Vl(e);return}function Wl(e){e=e|0;Hl(e+24|0);return}function Hl(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function Vl(e){e=e|0;var t=0;t=Za()|0;nl(e,2,1,t,ql()|0,3);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function ql(){return 1144}function Gl(e,t,n,r,i){e=e|0;t=t|0;n=+n;r=+r;i=i|0;var u=0,a=0,l=0,s=0;u=h;h=h+16|0;a=u+8|0;l=u;s=$l(e)|0;e=o[s+4>>2]|0;o[l>>2]=o[s>>2];o[l+4>>2]=e;o[a>>2]=o[l>>2];o[a+4>>2]=o[l+4>>2];Yl(t,a,n,r,i);h=u;return}function $l(e){e=e|0;return(o[(Il()|0)+24>>2]|0)+(e*12|0)|0}function Yl(e,t,n,r,i){e=e|0;t=t|0;n=+n;r=+r;i=i|0;var u=0,a=0,l=0,s=0,c=0;c=h;h=h+16|0;a=c+2|0;l=c+1|0;s=c;u=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)u=o[(o[e>>2]|0)+u>>2]|0;Kl(a,n);n=+Xl(a,n);Kl(l,r);r=+Xl(l,r);Ql(s,i);s=Jl(s,i)|0;gA[u&1](e,n,r,s);h=c;return}function Kl(e,t){e=e|0;t=+t;return}function Xl(e,t){e=e|0;t=+t;return+ +es(t)}function Ql(e,t){e=e|0;t=t|0;return}function Jl(e,t){e=e|0;t=t|0;return Zl(t)|0}function Zl(e){e=e|0;return e|0}function es(e){e=+e;return+e}function ts(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];ns(e,n,i,1);h=r;return}function ns(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=rs()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=is(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,os(u,r)|0,r);h=i;return}function rs(){var e=0,t=0;if(!(r[7648]|0)){ds(9268);Fe(27,9268,g|0)|0;t=7648;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9268)|0)){e=9268;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));ds(9268)}return 9268}function is(e){e=e|0;return 0}function os(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=rs()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];us(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{as(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function us(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function as(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=ls(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;ss(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];us(u,r,n);o[s>>2]=(o[s>>2]|0)+12;cs(e,l);fs(l);h=c;return}}function ls(e){e=e|0;return 357913941}function ss(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function cs(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function fs(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function ds(e){e=e|0;vs(e);return}function ps(e){e=e|0;hs(e+24|0);return}function hs(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function vs(e){e=e|0;var t=0;t=Za()|0;nl(e,2,4,t,ms()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function ms(){return 1160}function gs(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0;n=h;h=h+16|0;r=n+8|0;i=n;u=ys(e)|0;e=o[u+4>>2]|0;o[i>>2]=o[u>>2];o[i+4>>2]=e;o[r>>2]=o[i>>2];o[r+4>>2]=o[i+4>>2];t=_s(t,r)|0;h=n;return t|0}function ys(e){e=e|0;return(o[(rs()|0)+24>>2]|0)+(e*12|0)|0}function _s(e,t){e=e|0;t=t|0;var n=0;n=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)n=o[(o[e>>2]|0)+n>>2]|0;return bs(mA[n&31](e)|0)|0}function bs(e){e=e|0;return e&1|0}function ws(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Es(e,n,i,0);h=r;return}function Es(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Ds()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Ss(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Cs(u,r)|0,r);h=i;return}function Ds(){var e=0,t=0;if(!(r[7656]|0)){Is(9304);Fe(28,9304,g|0)|0;t=7656;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9304)|0)){e=9304;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Is(9304)}return 9304}function Ss(e){e=e|0;return 0}function Cs(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Ds()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];ks(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Ts(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function ks(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Ts(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=xs(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;As(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];ks(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Os(e,l);Ps(l);h=c;return}}function xs(e){e=e|0;return 357913941}function As(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Os(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Ps(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Is(e){e=e|0;Rs(e);return}function Ns(e){e=e|0;Ms(e+24|0);return}function Ms(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function Rs(e){e=e|0;var t=0;t=Za()|0;nl(e,2,5,t,Fs()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Fs(){return 1164}function Ls(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=Bs(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];js(t,i,n);h=r;return}function Bs(e){e=e|0;return(o[(Ds()|0)+24>>2]|0)+(e*12|0)|0}function js(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;Us(i,n);n=zs(i,n)|0;vA[r&31](e,n);Ws(i);h=u;return}function Us(e,t){e=e|0;t=t|0;Hs(e,t);return}function zs(e,t){e=e|0;t=t|0;return e|0}function Ws(e){e=e|0;Ji(e);return}function Hs(e,t){e=e|0;t=t|0;Vs(e,t);return}function Vs(e,t){e=e|0;t=t|0;o[e>>2]=t;return}function qs(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Gs(e,n,i,0);h=r;return}function Gs(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=$s()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Ys(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Ks(u,r)|0,r);h=i;return}function $s(){var e=0,t=0;if(!(r[7664]|0)){nc(9340);Fe(29,9340,g|0)|0;t=7664;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9340)|0)){e=9340;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));nc(9340)}return 9340}function Ys(e){e=e|0;return 0}function Ks(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=$s()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Xs(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Qs(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Xs(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Qs(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Js(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Zs(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Xs(u,r,n);o[s>>2]=(o[s>>2]|0)+12;ec(e,l);tc(l);h=c;return}}function Js(e){e=e|0;return 357913941}function Zs(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function ec(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function tc(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function nc(e){e=e|0;oc(e);return}function rc(e){e=e|0;ic(e+24|0);return}function ic(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function oc(e){e=e|0;var t=0;t=Za()|0;nl(e,2,4,t,uc()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function uc(){return 1180}function ac(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=lc(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];n=sc(t,i,n)|0;h=r;return n|0}function lc(e){e=e|0;return(o[($s()|0)+24>>2]|0)+(e*12|0)|0}function sc(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;cc(i,n);i=fc(i,n)|0;i=dc(DA[r&15](e,i)|0)|0;h=u;return i|0}function cc(e,t){e=e|0;t=t|0;return}function fc(e,t){e=e|0;t=t|0;return pc(t)|0}function dc(e){e=e|0;return e|0}function pc(e){e=e|0;return e|0}function hc(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];vc(e,n,i,0);h=r;return}function vc(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=mc()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=gc(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,yc(u,r)|0,r);h=i;return}function mc(){var e=0,t=0;if(!(r[7672]|0)){Cc(9376);Fe(30,9376,g|0)|0;t=7672;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9376)|0)){e=9376;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Cc(9376)}return 9376}function gc(e){e=e|0;return 0}function yc(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=mc()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];_c(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{bc(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function _c(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function bc(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=wc(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Ec(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];_c(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Dc(e,l);Sc(l);h=c;return}}function wc(e){e=e|0;return 357913941}function Ec(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Dc(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Sc(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Cc(e){e=e|0;xc(e);return}function kc(e){e=e|0;Tc(e+24|0);return}function Tc(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function xc(e){e=e|0;var t=0;t=Za()|0;nl(e,2,5,t,Ac()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Ac(){return 1196}function Oc(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0;n=h;h=h+16|0;r=n+8|0;i=n;u=Pc(e)|0;e=o[u+4>>2]|0;o[i>>2]=o[u>>2];o[i+4>>2]=e;o[r>>2]=o[i>>2];o[r+4>>2]=o[i+4>>2];t=Ic(t,r)|0;h=n;return t|0}function Pc(e){e=e|0;return(o[(mc()|0)+24>>2]|0)+(e*12|0)|0}function Ic(e,t){e=e|0;t=t|0;var n=0;n=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)n=o[(o[e>>2]|0)+n>>2]|0;return dc(mA[n&31](e)|0)|0}function Nc(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Mc(e,n,i,1);h=r;return}function Mc(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Rc()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Fc(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Lc(u,r)|0,r);h=i;return}function Rc(){var e=0,t=0;if(!(r[7680]|0)){Vc(9412);Fe(31,9412,g|0)|0;t=7680;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9412)|0)){e=9412;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Vc(9412)}return 9412}function Fc(e){e=e|0;return 0}function Lc(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Rc()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Bc(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{jc(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Bc(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function jc(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Uc(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;zc(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Bc(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Wc(e,l);Hc(l);h=c;return}}function Uc(e){e=e|0;return 357913941}function zc(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Wc(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Hc(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Vc(e){e=e|0;$c(e);return}function qc(e){e=e|0;Gc(e+24|0);return}function Gc(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function $c(e){e=e|0;var t=0;t=Za()|0;nl(e,2,6,t,Yc()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Yc(){return 1200}function Kc(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0;n=h;h=h+16|0;r=n+8|0;i=n;u=Xc(e)|0;e=o[u+4>>2]|0;o[i>>2]=o[u>>2];o[i+4>>2]=e;o[r>>2]=o[i>>2];o[r+4>>2]=o[i+4>>2];t=Qc(t,r)|0;h=n;return t|0}function Xc(e){e=e|0;return(o[(Rc()|0)+24>>2]|0)+(e*12|0)|0}function Qc(e,t){e=e|0;t=t|0;var n=0;n=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)n=o[(o[e>>2]|0)+n>>2]|0;return Jc(mA[n&31](e)|0)|0}function Jc(e){e=e|0;return e|0}function Zc(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];ef(e,n,i,0);h=r;return}function ef(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=tf()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=nf(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,rf(u,r)|0,r);h=i;return}function tf(){var e=0,t=0;if(!(r[7688]|0)){ff(9448);Fe(32,9448,g|0)|0;t=7688;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9448)|0)){e=9448;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));ff(9448)}return 9448}function nf(e){e=e|0;return 0}function rf(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=tf()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];of(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{uf(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function of(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function uf(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=af(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;lf(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];of(u,r,n);o[s>>2]=(o[s>>2]|0)+12;sf(e,l);cf(l);h=c;return}}function af(e){e=e|0;return 357913941}function lf(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function sf(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function cf(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function ff(e){e=e|0;hf(e);return}function df(e){e=e|0;pf(e+24|0);return}function pf(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function hf(e){e=e|0;var t=0;t=Za()|0;nl(e,2,6,t,vf()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function vf(){return 1204}function mf(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=gf(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];yf(t,i,n);h=r;return}function gf(e){e=e|0;return(o[(tf()|0)+24>>2]|0)+(e*12|0)|0}function yf(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;_f(i,n);i=bf(i,n)|0;vA[r&31](e,i);h=u;return}function _f(e,t){e=e|0;t=t|0;return}function bf(e,t){e=e|0;t=t|0;return wf(t)|0}function wf(e){e=e|0;return e|0}function Ef(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Df(e,n,i,0);h=r;return}function Df(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Sf()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Cf(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,kf(u,r)|0,r);h=i;return}function Sf(){var e=0,t=0;if(!(r[7696]|0)){Nf(9484);Fe(33,9484,g|0)|0;t=7696;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9484)|0)){e=9484;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Nf(9484)}return 9484}function Cf(e){e=e|0;return 0}function kf(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Sf()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Tf(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{xf(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Tf(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function xf(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Af(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Of(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Tf(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Pf(e,l);If(l);h=c;return}}function Af(e){e=e|0;return 357913941}function Of(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Pf(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function If(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Nf(e){e=e|0;Ff(e);return}function Mf(e){e=e|0;Rf(e+24|0);return}function Rf(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function Ff(e){e=e|0;var t=0;t=Za()|0;nl(e,2,1,t,Lf()|0,2);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Lf(){return 1212}function Bf(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0;i=h;h=h+16|0;u=i+8|0;a=i;l=jf(e)|0;e=o[l+4>>2]|0;o[a>>2]=o[l>>2];o[a+4>>2]=e;o[u>>2]=o[a>>2];o[u+4>>2]=o[a+4>>2];Uf(t,u,n,r);h=i;return}function jf(e){e=e|0;return(o[(Sf()|0)+24>>2]|0)+(e*12|0)|0}function Uf(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0;l=h;h=h+16|0;u=l+1|0;a=l;i=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)i=o[(o[e>>2]|0)+i>>2]|0;_f(u,n);u=bf(u,n)|0;cc(a,r);a=fc(a,r)|0;PA[i&15](e,u,a);h=l;return}function zf(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Wf(e,n,i,1);h=r;return}function Wf(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Hf()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Vf(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,qf(u,r)|0,r);h=i;return}function Hf(){var e=0,t=0;if(!(r[7704]|0)){Jf(9520);Fe(34,9520,g|0)|0;t=7704;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9520)|0)){e=9520;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Jf(9520)}return 9520}function Vf(e){e=e|0;return 0}function qf(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Hf()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Gf(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{$f(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Gf(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function $f(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Yf(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Kf(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Gf(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Xf(e,l);Qf(l);h=c;return}}function Yf(e){e=e|0;return 357913941}function Kf(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Xf(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Qf(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Jf(e){e=e|0;td(e);return}function Zf(e){e=e|0;ed(e+24|0);return}function ed(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function td(e){e=e|0;var t=0;t=Za()|0;nl(e,2,1,t,nd()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function nd(){return 1224}function rd(e,t,n){e=e|0;t=t|0;n=n|0;var r=0.0,i=0,u=0,a=0,l=0;i=h;h=h+16|0;u=i+8|0;a=i;l=id(e)|0;e=o[l+4>>2]|0;o[a>>2]=o[l>>2];o[a+4>>2]=e;o[u>>2]=o[a>>2];o[u+4>>2]=o[a+4>>2];r=+od(t,u,n);h=i;return+r}function id(e){e=e|0;return(o[(Hf()|0)+24>>2]|0)+(e*12|0)|0}function od(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0.0;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;Ql(i,n);i=Jl(i,n)|0;a=+Mu(+kA[r&7](e,i));h=u;return+a}function ud(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];ad(e,n,i,1);h=r;return}function ad(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=ld()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=sd(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,cd(u,r)|0,r);h=i;return}function ld(){var e=0,t=0;if(!(r[7712]|0)){gd(9556);Fe(35,9556,g|0)|0;t=7712;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9556)|0)){e=9556;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));gd(9556)}return 9556}function sd(e){e=e|0;return 0}function cd(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=ld()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];fd(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{dd(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function fd(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function dd(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=pd(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;hd(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];fd(u,r,n);o[s>>2]=(o[s>>2]|0)+12;vd(e,l);md(l);h=c;return}}function pd(e){e=e|0;return 357913941}function hd(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function vd(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function md(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function gd(e){e=e|0;bd(e);return}function yd(e){e=e|0;_d(e+24|0);return}function _d(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function bd(e){e=e|0;var t=0;t=Za()|0;nl(e,2,5,t,wd()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function wd(){return 1232}function Ed(e,t){e=e|0;t=t|0;var n=0.0,r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=Dd(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];n=+Sd(t,i);h=r;return+n}function Dd(e){e=e|0;return(o[(ld()|0)+24>>2]|0)+(e*12|0)|0}function Sd(e,t){e=e|0;t=t|0;var n=0;n=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)n=o[(o[e>>2]|0)+n>>2]|0;return+ +Mu(+wA[n&15](e))}function Cd(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];kd(e,n,i,1);h=r;return}function kd(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Td()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=xd(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Ad(u,r)|0,r);h=i;return}function Td(){var e=0,t=0;if(!(r[7720]|0)){Fd(9592);Fe(36,9592,g|0)|0;t=7720;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9592)|0)){e=9592;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Fd(9592)}return 9592}function xd(e){e=e|0;return 0}function Ad(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Td()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Od(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Pd(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Od(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Pd(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Id(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Nd(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Od(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Md(e,l);Rd(l);h=c;return}}function Id(e){e=e|0;return 357913941}function Nd(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Md(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Rd(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Fd(e){e=e|0;jd(e);return}function Ld(e){e=e|0;Bd(e+24|0);return}function Bd(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function jd(e){e=e|0;var t=0;t=Za()|0;nl(e,2,7,t,Ud()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Ud(){return 1276}function zd(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0;n=h;h=h+16|0;r=n+8|0;i=n;u=Wd(e)|0;e=o[u+4>>2]|0;o[i>>2]=o[u>>2];o[i+4>>2]=e;o[r>>2]=o[i>>2];o[r+4>>2]=o[i+4>>2];t=Hd(t,r)|0;h=n;return t|0}function Wd(e){e=e|0;return(o[(Td()|0)+24>>2]|0)+(e*12|0)|0}function Hd(e,t){e=e|0;t=t|0;var n=0,r=0,i=0;i=h;h=h+16|0;r=i;n=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)n=o[(o[e>>2]|0)+n>>2]|0;vA[n&31](r,e);r=Vd(r)|0;h=i;return r|0}function Vd(e){e=e|0;var t=0,n=0,r=0,i=0;i=h;h=h+32|0;t=i+12|0;n=i;r=al(qd()|0)|0;if(!r)e=$d(e)|0;else{ll(t,r);sl(n,t);Gd(e,n);e=fl(t)|0}h=i;return e|0}function qd(){var e=0;if(!(r[7736]|0)){ip(9640);Fe(25,9640,g|0)|0;e=7736;o[e>>2]=1;o[e+4>>2]=0}return 9640}function Gd(e,t){e=e|0;t=t|0;Jd(t,e,e+8|0)|0;return}function $d(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0;n=h;h=h+16|0;i=n+4|0;a=n;r=UD(8)|0;t=r;l=$T(16)|0;o[l>>2]=o[e>>2];o[l+4>>2]=o[e+4>>2];o[l+8>>2]=o[e+8>>2];o[l+12>>2]=o[e+12>>2];u=t+4|0;o[u>>2]=l;e=$T(8)|0;u=o[u>>2]|0;o[a>>2]=0;o[i>>2]=o[a>>2];Yd(e,u,i);o[r>>2]=e;h=n;return t|0}function Yd(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;n=$T(16)|0;o[n+4>>2]=0;o[n+8>>2]=0;o[n>>2]=1244;o[n+12>>2]=t;o[e+4>>2]=n;return}function Kd(e){e=e|0;zT(e);KT(e);return}function Xd(e){e=e|0;e=o[e+12>>2]|0;if(e|0)KT(e);return}function Qd(e){e=e|0;KT(e);return}function Jd(e,t,n){e=e|0;t=t|0;n=n|0;t=Zd(o[e>>2]|0,t,n)|0;n=e+4|0;o[(o[n>>2]|0)+8>>2]=t;return o[(o[n>>2]|0)+8>>2]|0}function Zd(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0;r=h;h=h+16|0;i=r;Dk(i);e=Eu(e)|0;n=ep(e,o[t>>2]|0,+c[n>>3])|0;Ck(i);h=r;return n|0}function ep(e,t,n){e=e|0;t=t|0;n=+n;var r=0;r=Cu(tp()|0)|0;t=Tu(t)|0;return xe(0,r|0,e|0,t|0,+ +ku(n))|0}function tp(){var e=0;if(!(r[7728]|0)){np(9628);e=7728;o[e>>2]=1;o[e+4>>2]=0}return 9628}function np(e){e=e|0;Lu(e,rp()|0,2);return}function rp(){return 1264}function ip(e){e=e|0;Al(e);return}function op(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];up(e,n,i,1);h=r;return}function up(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=ap()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=lp(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,sp(u,r)|0,r);h=i;return}function ap(){var e=0,t=0;if(!(r[7744]|0)){mp(9684);Fe(37,9684,g|0)|0;t=7744;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9684)|0)){e=9684;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));mp(9684)}return 9684}function lp(e){e=e|0;return 0}function sp(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=ap()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];cp(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{fp(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function cp(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function fp(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=dp(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;pp(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];cp(u,r,n);o[s>>2]=(o[s>>2]|0)+12;hp(e,l);vp(l);h=c;return}}function dp(e){e=e|0;return 357913941}function pp(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function hp(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function vp(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function mp(e){e=e|0;_p(e);return}function gp(e){e=e|0;yp(e+24|0);return}function yp(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function _p(e){e=e|0;var t=0;t=Za()|0;nl(e,2,5,t,bp()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function bp(){return 1280}function wp(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=Ep(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];n=Dp(t,i,n)|0;h=r;return n|0}function Ep(e){e=e|0;return(o[(ap()|0)+24>>2]|0)+(e*12|0)|0}function Dp(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;a=h;h=h+32|0;i=a;u=a+16|0;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;Ql(u,n);u=Jl(u,n)|0;PA[r&15](i,e,u);u=Vd(i)|0;h=a;return u|0}function Sp(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Cp(e,n,i,1);h=r;return}function Cp(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=kp()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Tp(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,xp(u,r)|0,r);h=i;return}function kp(){var e=0,t=0;if(!(r[7752]|0)){Rp(9720);Fe(38,9720,g|0)|0;t=7752;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9720)|0)){e=9720;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Rp(9720)}return 9720}function Tp(e){e=e|0;return 0}function xp(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=kp()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Ap(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Op(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Ap(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Op(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Pp(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Ip(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Ap(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Np(e,l);Mp(l);h=c;return}}function Pp(e){e=e|0;return 357913941}function Ip(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Np(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Mp(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Rp(e){e=e|0;Bp(e);return}function Fp(e){e=e|0;Lp(e+24|0);return}function Lp(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function Bp(e){e=e|0;var t=0;t=Za()|0;nl(e,2,8,t,jp()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function jp(){return 1288}function Up(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0;n=h;h=h+16|0;r=n+8|0;i=n;u=zp(e)|0;e=o[u+4>>2]|0;o[i>>2]=o[u>>2];o[i+4>>2]=e;o[r>>2]=o[i>>2];o[r+4>>2]=o[i+4>>2];t=Wp(t,r)|0;h=n;return t|0}function zp(e){e=e|0;return(o[(kp()|0)+24>>2]|0)+(e*12|0)|0}function Wp(e,t){e=e|0;t=t|0;var n=0;n=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)n=o[(o[e>>2]|0)+n>>2]|0;return Nu(mA[n&31](e)|0)|0}function Hp(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Vp(e,n,i,0);h=r;return}function Vp(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=qp()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Gp(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,$p(u,r)|0,r);h=i;return}function qp(){var e=0,t=0;if(!(r[7760]|0)){eh(9756);Fe(39,9756,g|0)|0;t=7760;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9756)|0)){e=9756;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));eh(9756)}return 9756}function Gp(e){e=e|0;return 0}function $p(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=qp()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Yp(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Kp(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Yp(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Kp(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Xp(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Qp(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Yp(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Jp(e,l);Zp(l);h=c;return}}function Xp(e){e=e|0;return 357913941}function Qp(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Jp(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Zp(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function eh(e){e=e|0;rh(e);return}function th(e){e=e|0;nh(e+24|0);return}function nh(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function rh(e){e=e|0;var t=0;t=Za()|0;nl(e,2,8,t,ih()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function ih(){return 1292}function oh(e,t,n){e=e|0;t=t|0;n=+n;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=uh(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];ah(t,i,n);h=r;return}function uh(e){e=e|0;return(o[(qp()|0)+24>>2]|0)+(e*12|0)|0}function ah(e,t,n){e=e|0;t=t|0;n=+n;var r=0,i=0,u=0;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;Kl(i,n);n=+Xl(i,n);dA[r&31](e,n);h=u;return}function lh(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];sh(e,n,i,0);h=r;return}function sh(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=ch()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=fh(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,dh(u,r)|0,r);h=i;return}function ch(){var e=0,t=0;if(!(r[7768]|0)){_h(9792);Fe(40,9792,g|0)|0;t=7768;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9792)|0)){e=9792;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));_h(9792)}return 9792}function fh(e){e=e|0;return 0}function dh(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=ch()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];ph(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{hh(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function ph(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function hh(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=vh(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;mh(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];ph(u,r,n);o[s>>2]=(o[s>>2]|0)+12;gh(e,l);yh(l);h=c;return}}function vh(e){e=e|0;return 357913941}function mh(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function gh(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function yh(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function _h(e){e=e|0;Eh(e);return}function bh(e){e=e|0;wh(e+24|0);return}function wh(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function Eh(e){e=e|0;var t=0;t=Za()|0;nl(e,2,1,t,Dh()|0,2);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Dh(){return 1300}function Sh(e,t,n,r){e=e|0;t=t|0;n=n|0;r=+r;var i=0,u=0,a=0,l=0;i=h;h=h+16|0;u=i+8|0;a=i;l=Ch(e)|0;e=o[l+4>>2]|0;o[a>>2]=o[l>>2];o[a+4>>2]=e;o[u>>2]=o[a>>2];o[u+4>>2]=o[a+4>>2];kh(t,u,n,r);h=i;return}function Ch(e){e=e|0;return(o[(ch()|0)+24>>2]|0)+(e*12|0)|0}function kh(e,t,n,r){e=e|0;t=t|0;n=n|0;r=+r;var i=0,u=0,a=0,l=0;l=h;h=h+16|0;u=l+1|0;a=l;i=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)i=o[(o[e>>2]|0)+i>>2]|0;Ql(u,n);u=Jl(u,n)|0;Kl(a,r);r=+Xl(a,r);NA[i&15](e,u,r);h=l;return}function Th(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];xh(e,n,i,0);h=r;return}function xh(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Ah()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Oh(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Ph(u,r)|0,r);h=i;return}function Ah(){var e=0,t=0;if(!(r[7776]|0)){Bh(9828);Fe(41,9828,g|0)|0;t=7776;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9828)|0)){e=9828;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Bh(9828)}return 9828}function Oh(e){e=e|0;return 0}function Ph(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Ah()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Ih(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Nh(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Ih(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Nh(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Mh(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Rh(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Ih(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Fh(e,l);Lh(l);h=c;return}}function Mh(e){e=e|0;return 357913941}function Rh(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Fh(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Lh(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Bh(e){e=e|0;zh(e);return}function jh(e){e=e|0;Uh(e+24|0);return}function Uh(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function zh(e){e=e|0;var t=0;t=Za()|0;nl(e,2,7,t,Wh()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Wh(){return 1312}function Hh(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=Vh(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];qh(t,i,n);h=r;return}function Vh(e){e=e|0;return(o[(Ah()|0)+24>>2]|0)+(e*12|0)|0}function qh(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;Ql(i,n);i=Jl(i,n)|0;vA[r&31](e,i);h=u;return}function Gh(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];$h(e,n,i,0);h=r;return}function $h(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=Yh()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Kh(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Xh(u,r)|0,r);h=i;return}function Yh(){var e=0,t=0;if(!(r[7784]|0)){rv(9864);Fe(42,9864,g|0)|0;t=7784;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9864)|0)){e=9864;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));rv(9864)}return 9864}function Kh(e){e=e|0;return 0}function Xh(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=Yh()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Qh(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Jh(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Qh(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Jh(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Zh(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;ev(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Qh(u,r,n);o[s>>2]=(o[s>>2]|0)+12;tv(e,l);nv(l);h=c;return}}function Zh(e){e=e|0;return 357913941}function ev(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function tv(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function nv(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function rv(e){e=e|0;uv(e);return}function iv(e){e=e|0;ov(e+24|0);return}function ov(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function uv(e){e=e|0;var t=0;t=Za()|0;nl(e,2,8,t,av()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function av(){return 1320}function lv(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=sv(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];cv(t,i,n);h=r;return}function sv(e){e=e|0;return(o[(Yh()|0)+24>>2]|0)+(e*12|0)|0}function cv(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;fv(i,n);i=dv(i,n)|0;vA[r&31](e,i);h=u;return}function fv(e,t){e=e|0;t=t|0;return}function dv(e,t){e=e|0;t=t|0;return pv(t)|0}function pv(e){e=e|0;return e|0}function hv(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];vv(e,n,i,0);h=r;return}function vv(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=mv()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=gv(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,yv(u,r)|0,r);h=i;return}function mv(){var e=0,t=0;if(!(r[7792]|0)){Cv(9900);Fe(43,9900,g|0)|0;t=7792;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9900)|0)){e=9900;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Cv(9900)}return 9900}function gv(e){e=e|0;return 0}function yv(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=mv()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];_v(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{bv(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function _v(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function bv(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=wv(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Ev(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];_v(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Dv(e,l);Sv(l);h=c;return}}function wv(e){e=e|0;return 357913941}function Ev(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Dv(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Sv(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Cv(e){e=e|0;xv(e);return}function kv(e){e=e|0;Tv(e+24|0);return}function Tv(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function xv(e){e=e|0;var t=0;t=Za()|0;nl(e,2,22,t,Av()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Av(){return 1344}function Ov(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0;n=h;h=h+16|0;r=n+8|0;i=n;u=Pv(e)|0;e=o[u+4>>2]|0;o[i>>2]=o[u>>2];o[i+4>>2]=e;o[r>>2]=o[i>>2];o[r+4>>2]=o[i+4>>2];Iv(t,r);h=n;return}function Pv(e){e=e|0;return(o[(mv()|0)+24>>2]|0)+(e*12|0)|0}function Iv(e,t){e=e|0;t=t|0;var n=0;n=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)n=o[(o[e>>2]|0)+n>>2]|0;hA[n&127](e);return}function Nv(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=Mv()|0;e=Rv(n)|0;La(u,t,i,e,Fv(n,r)|0,r);return}function Mv(){var e=0,t=0;if(!(r[7800]|0)){Hv(9936);Fe(44,9936,g|0)|0;t=7800;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9936)|0)){e=9936;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Hv(9936)}return 9936}function Rv(e){e=e|0;return e|0}function Fv(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=Mv()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){Lv(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{Bv(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function Lv(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function Bv(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=jv(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;Uv(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;Lv(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;zv(e,i);Wv(i);h=l;return}}function jv(e){e=e|0;return 536870911}function Uv(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function zv(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Wv(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function Hv(e){e=e|0;Gv(e);return}function Vv(e){e=e|0;qv(e+24|0);return}function qv(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function Gv(e){e=e|0;var t=0;t=Za()|0;nl(e,1,23,t,vf()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function $v(e,t){e=e|0;t=t|0;Kv(o[(Yv(e)|0)>>2]|0,t);return}function Yv(e){e=e|0;return(o[(Mv()|0)+24>>2]|0)+(e<<3)|0}function Kv(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;_f(r,t);t=bf(r,t)|0;hA[e&127](t);h=n;return}function Xv(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=Qv()|0;e=Jv(n)|0;La(u,t,i,e,Zv(n,r)|0,r);return}function Qv(){var e=0,t=0;if(!(r[7808]|0)){um(9972);Fe(45,9972,g|0)|0;t=7808;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(9972)|0)){e=9972;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));um(9972)}return 9972}function Jv(e){e=e|0;return e|0}function Zv(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=Qv()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){em(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{tm(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function em(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function tm(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=nm(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;rm(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;em(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;im(e,i);om(i);h=l;return}}function nm(e){e=e|0;return 536870911}function rm(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function im(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function om(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function um(e){e=e|0;sm(e);return}function am(e){e=e|0;lm(e+24|0);return}function lm(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function sm(e){e=e|0;var t=0;t=Za()|0;nl(e,1,9,t,cm()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function cm(){return 1348}function fm(e,t){e=e|0;t=t|0;return pm(o[(dm(e)|0)>>2]|0,t)|0}function dm(e){e=e|0;return(o[(Qv()|0)+24>>2]|0)+(e<<3)|0}function pm(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;hm(r,t);t=vm(r,t)|0;t=dc(mA[e&31](t)|0)|0;h=n;return t|0}function hm(e,t){e=e|0;t=t|0;return}function vm(e,t){e=e|0;t=t|0;return mm(t)|0}function mm(e){e=e|0;return e|0}function gm(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=ym()|0;e=_m(n)|0;La(u,t,i,e,bm(n,r)|0,r);return}function ym(){var e=0,t=0;if(!(r[7816]|0)){Tm(10008);Fe(46,10008,g|0)|0;t=7816;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10008)|0)){e=10008;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Tm(10008)}return 10008}function _m(e){e=e|0;return e|0}function bm(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=ym()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){wm(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{Em(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function wm(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function Em(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=Dm(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;Sm(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;wm(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;Cm(e,i);km(i);h=l;return}}function Dm(e){e=e|0;return 536870911}function Sm(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function Cm(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function km(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function Tm(e){e=e|0;Om(e);return}function xm(e){e=e|0;Am(e+24|0);return}function Am(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function Om(e){e=e|0;var t=0;t=Za()|0;nl(e,1,15,t,Ac()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Pm(e){e=e|0;return Nm(o[(Im(e)|0)>>2]|0)|0}function Im(e){e=e|0;return(o[(ym()|0)+24>>2]|0)+(e<<3)|0}function Nm(e){e=e|0;return dc(TA[e&7]()|0)|0}function Mm(){var e=0;if(!(r[7832]|0)){Vm(10052);Fe(25,10052,g|0)|0;e=7832;o[e>>2]=1;o[e+4>>2]=0}return 10052}function Rm(e,t){e=e|0;t=t|0;o[e>>2]=Fm()|0;o[e+4>>2]=Lm()|0;o[e+12>>2]=t;o[e+8>>2]=Bm()|0;o[e+32>>2]=2;return}function Fm(){return 11709}function Lm(){return 1188}function Bm(){return Wm()|0}function jm(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;if((Um(r,896)|0)==512){if(n|0){zm(n);KT(n)}}else if(t|0){Qi(t);KT(t)}return}function Um(e,t){e=e|0;t=t|0;return t&e|0}function zm(e){e=e|0;e=o[e+4>>2]|0;if(e|0)qT(e);return}function Wm(){var e=0;if(!(r[7824]|0)){o[2511]=Hm()|0;o[2512]=0;e=7824;o[e>>2]=1;o[e+4>>2]=0}return 10044}function Hm(){return 0}function Vm(e){e=e|0;Al(e);return}function qm(e){e=e|0;var t=0,n=0,r=0,i=0,u=0;t=h;h=h+32|0;n=t+24|0;u=t+16|0;i=t+8|0;r=t;Gm(e,4827);$m(e,4834,3)|0;Ym(e,3682,47)|0;o[u>>2]=9;o[u+4>>2]=0;o[n>>2]=o[u>>2];o[n+4>>2]=o[u+4>>2];Km(e,4841,n)|0;o[i>>2]=1;o[i+4>>2]=0;o[n>>2]=o[i>>2];o[n+4>>2]=o[i+4>>2];Xm(e,4871,n)|0;o[r>>2]=10;o[r+4>>2]=0;o[n>>2]=o[r>>2];o[n+4>>2]=o[r+4>>2];Qm(e,4891,n)|0;h=t;return}function Gm(e,t){e=e|0;t=t|0;var n=0;n=Vy()|0;o[e>>2]=n;qy(n,t);cw(o[e>>2]|0);return}function $m(e,t,n){e=e|0;t=t|0;n=n|0;Cy(e,Ia(t)|0,n,0);return e|0}function Ym(e,t,n){e=e|0;t=t|0;n=n|0;ay(e,Ia(t)|0,n,0);return e|0}function Km(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];jg(e,t,i);h=r;return e|0}function Xm(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];gg(e,t,i);h=r;return e|0}function Qm(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=o[n+4>>2]|0;o[u>>2]=o[n>>2];o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Jm(e,t,i);h=r;return e|0}function Jm(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Zm(e,n,i,1);h=r;return}function Zm(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=eg()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=tg(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,ng(u,r)|0,r);h=i;return}function eg(){var e=0,t=0;if(!(r[7840]|0)){sg(10100);Fe(48,10100,g|0)|0;t=7840;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10100)|0)){e=10100;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));sg(10100)}return 10100}function tg(e){e=e|0;return 0}function ng(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=eg()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];rg(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{ig(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function rg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function ig(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=og(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;ug(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];rg(u,r,n);o[s>>2]=(o[s>>2]|0)+12;ag(e,l);lg(l);h=c;return}}function og(e){e=e|0;return 357913941}function ug(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function ag(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function lg(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function sg(e){e=e|0;dg(e);return}function cg(e){e=e|0;fg(e+24|0);return}function fg(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function dg(e){e=e|0;var t=0;t=Za()|0;nl(e,2,6,t,pg()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function pg(){return 1364}function hg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=vg(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];n=mg(t,i,n)|0;h=r;return n|0}function vg(e){e=e|0;return(o[(eg()|0)+24>>2]|0)+(e*12|0)|0}function mg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;Ql(i,n);i=Jl(i,n)|0;i=bs(DA[r&15](e,i)|0)|0;h=u;return i|0}function gg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];yg(e,n,i,0);h=r;return}function yg(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=_g()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=bg(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,wg(u,r)|0,r);h=i;return}function _g(){var e=0,t=0;if(!(r[7848]|0)){xg(10136);Fe(49,10136,g|0)|0;t=7848;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10136)|0)){e=10136;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));xg(10136)}return 10136}function bg(e){e=e|0;return 0}function wg(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=_g()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Eg(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{Dg(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Eg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function Dg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Sg(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;Cg(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Eg(u,r,n);o[s>>2]=(o[s>>2]|0)+12;kg(e,l);Tg(l);h=c;return}}function Sg(e){e=e|0;return 357913941}function Cg(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function kg(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Tg(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function xg(e){e=e|0;Pg(e);return}function Ag(e){e=e|0;Og(e+24|0);return}function Og(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function Pg(e){e=e|0;var t=0;t=Za()|0;nl(e,2,9,t,Ig()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Ig(){return 1372}function Ng(e,t,n){e=e|0;t=t|0;n=+n;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;i=r+8|0;u=r;a=Mg(e)|0;e=o[a+4>>2]|0;o[u>>2]=o[a>>2];o[u+4>>2]=e;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Rg(t,i,n);h=r;return}function Mg(e){e=e|0;return(o[(_g()|0)+24>>2]|0)+(e*12|0)|0}function Rg(e,t,n){e=e|0;t=t|0;n=+n;var r=0,i=0,u=0,a=ft;u=h;h=h+16|0;i=u;r=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)r=o[(o[e>>2]|0)+r>>2]|0;Fg(i,n);a=Y(Lg(i,n));fA[r&1](e,a);h=u;return}function Fg(e,t){e=e|0;t=+t;return}function Lg(e,t){e=e|0;t=+t;return Y(Bg(t))}function Bg(e){e=+e;return Y(e)}function jg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;i=r+8|0;u=r;l=o[n>>2]|0;a=o[n+4>>2]|0;n=Ia(t)|0;o[u>>2]=l;o[u+4>>2]=a;o[i>>2]=o[u>>2];o[i+4>>2]=o[u+4>>2];Ug(e,n,i,0);h=r;return}function Ug(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0;i=h;h=h+32|0;u=i+16|0;f=i+8|0;l=i;c=o[n>>2]|0;s=o[n+4>>2]|0;a=o[e>>2]|0;e=zg()|0;o[f>>2]=c;o[f+4>>2]=s;o[u>>2]=o[f>>2];o[u+4>>2]=o[f+4>>2];n=Wg(u)|0;o[l>>2]=c;o[l+4>>2]=s;o[u>>2]=o[l>>2];o[u+4>>2]=o[l+4>>2];La(a,t,e,n,Hg(u,r)|0,r);h=i;return}function zg(){var e=0,t=0;if(!(r[7856]|0)){Xg(10172);Fe(50,10172,g|0)|0;t=7856;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10172)|0)){e=10172;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Xg(10172)}return 10172}function Wg(e){e=e|0;return 0}function Hg(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0;f=h;h=h+32|0;i=f+24|0;a=f+16|0;l=f;s=f+8|0;u=o[e>>2]|0;r=o[e+4>>2]|0;o[l>>2]=u;o[l+4>>2]=r;d=zg()|0;c=d+24|0;e=za(t,4)|0;o[s>>2]=e;t=d+28|0;n=o[t>>2]|0;if(n>>>0<(o[d+32>>2]|0)>>>0){o[a>>2]=u;o[a+4>>2]=r;o[i>>2]=o[a>>2];o[i+4>>2]=o[a+4>>2];Vg(n,i,e);e=(o[t>>2]|0)+12|0;o[t>>2]=e}else{qg(c,l,s);e=o[t>>2]|0}h=f;return((e-(o[c>>2]|0)|0)/12|0)+-1|0}function Vg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=o[t+4>>2]|0;o[e>>2]=o[t>>2];o[e+4>>2]=r;o[e+8>>2]=n;return}function qg(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0;c=h;h=h+48|0;r=c+32|0;a=c+24|0;l=c;s=e+4|0;i=(((o[s>>2]|0)-(o[e>>2]|0)|0)/12|0)+1|0;u=Gg(e)|0;if(u>>>0>>0)UT(e);else{f=o[e>>2]|0;p=((o[e+8>>2]|0)-f|0)/12|0;d=p<<1;$g(l,p>>>0>>1>>>0?d>>>0>>0?i:d:u,((o[s>>2]|0)-f|0)/12|0,e+8|0);s=l+8|0;u=o[s>>2]|0;i=o[t+4>>2]|0;n=o[n>>2]|0;o[a>>2]=o[t>>2];o[a+4>>2]=i;o[r>>2]=o[a>>2];o[r+4>>2]=o[a+4>>2];Vg(u,r,n);o[s>>2]=(o[s>>2]|0)+12;Yg(e,l);Kg(l);h=c;return}}function Gg(e){e=e|0;return 357913941}function $g(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>357913941)Ye();else{i=$T(t*12|0)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n*12|0)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t*12|0);return}function Yg(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(((i|0)/-12|0)*12|0)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function Kg(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~(((r+-12-t|0)>>>0)/12|0)*12|0);e=o[e>>2]|0;if(e|0)KT(e);return}function Xg(e){e=e|0;Zg(e);return}function Qg(e){e=e|0;Jg(e+24|0);return}function Jg(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~(((t+-12-r|0)>>>0)/12|0)*12|0);KT(n)}return}function Zg(e){e=e|0;var t=0;t=Za()|0;nl(e,2,3,t,ey()|0,2);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function ey(){return 1380}function ty(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0;i=h;h=h+16|0;u=i+8|0;a=i;l=ny(e)|0;e=o[l+4>>2]|0;o[a>>2]=o[l>>2];o[a+4>>2]=e;o[u>>2]=o[a>>2];o[u+4>>2]=o[a+4>>2];ry(t,u,n,r);h=i;return}function ny(e){e=e|0;return(o[(zg()|0)+24>>2]|0)+(e*12|0)|0}function ry(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0;l=h;h=h+16|0;u=l+1|0;a=l;i=o[t>>2]|0;t=o[t+4>>2]|0;e=e+(t>>1)|0;if(t&1)i=o[(o[e>>2]|0)+i>>2]|0;Ql(u,n);u=Jl(u,n)|0;iy(a,r);a=oy(a,r)|0;PA[i&15](e,u,a);h=l;return}function iy(e,t){e=e|0;t=t|0;return}function oy(e,t){e=e|0;t=t|0;return uy(t)|0}function uy(e){e=e|0;return(e|0)!=0|0}function ay(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=ly()|0;e=sy(n)|0;La(u,t,i,e,cy(n,r)|0,r);return}function ly(){var e=0,t=0;if(!(r[7864]|0)){gy(10208);Fe(51,10208,g|0)|0;t=7864;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10208)|0)){e=10208;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));gy(10208)}return 10208}function sy(e){e=e|0;return e|0}function cy(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=ly()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){fy(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{dy(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function fy(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function dy(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=py(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;hy(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;fy(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;vy(e,i);my(i);h=l;return}}function py(e){e=e|0;return 536870911}function hy(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function vy(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function my(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function gy(e){e=e|0;by(e);return}function yy(e){e=e|0;_y(e+24|0);return}function _y(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function by(e){e=e|0;var t=0;t=Za()|0;nl(e,1,24,t,wy()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function wy(){return 1392}function Ey(e,t){e=e|0;t=t|0;Sy(o[(Dy(e)|0)>>2]|0,t);return}function Dy(e){e=e|0;return(o[(ly()|0)+24>>2]|0)+(e<<3)|0}function Sy(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;hm(r,t);t=vm(r,t)|0;hA[e&127](t);h=n;return}function Cy(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=ky()|0;e=Ty(n)|0;La(u,t,i,e,xy(n,r)|0,r);return}function ky(){var e=0,t=0;if(!(r[7872]|0)){Ry(10244);Fe(52,10244,g|0)|0;t=7872;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10244)|0)){e=10244;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));Ry(10244)}return 10244}function Ty(e){e=e|0;return e|0}function xy(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=ky()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){Ay(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{Oy(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function Ay(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function Oy(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=Py(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;Iy(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;Ay(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;Ny(e,i);My(i);h=l;return}}function Py(e){e=e|0;return 536870911}function Iy(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function Ny(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function My(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function Ry(e){e=e|0;By(e);return}function Fy(e){e=e|0;Ly(e+24|0);return}function Ly(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function By(e){e=e|0;var t=0;t=Za()|0;nl(e,1,16,t,jy()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function jy(){return 1400}function Uy(e){e=e|0;return Wy(o[(zy(e)|0)>>2]|0)|0}function zy(e){e=e|0;return(o[(ky()|0)+24>>2]|0)+(e<<3)|0}function Wy(e){e=e|0;return Hy(TA[e&7]()|0)|0}function Hy(e){e=e|0;return e|0}function Vy(){var e=0;if(!(r[7880]|0)){Qy(10280);Fe(25,10280,g|0)|0;e=7880;o[e>>2]=1;o[e+4>>2]=0}return 10280}function qy(e,t){e=e|0;t=t|0;o[e>>2]=Gy()|0;o[e+4>>2]=$y()|0;o[e+12>>2]=t;o[e+8>>2]=Yy()|0;o[e+32>>2]=4;return}function Gy(){return 11711}function $y(){return 1356}function Yy(){return Wm()|0}function Ky(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;if((Um(r,896)|0)==512){if(n|0){Xy(n);KT(n)}}else if(t|0){Hi(t);KT(t)}return}function Xy(e){e=e|0;e=o[e+4>>2]|0;if(e|0)qT(e);return}function Qy(e){e=e|0;Al(e);return}function Jy(e){e=e|0;Zy(e,4920);e_(e)|0;t_(e)|0;return}function Zy(e,t){e=e|0;t=t|0;var n=0;n=qd()|0;o[e>>2]=n;T_(n,t);cw(o[e>>2]|0);return}function e_(e){e=e|0;var t=0;t=o[e>>2]|0;r_(t,v_()|0);return e|0}function t_(e){e=e|0;var t=0;t=o[e>>2]|0;r_(t,n_()|0);return e|0}function n_(){var e=0;if(!(r[7888]|0)){i_(10328);Fe(53,10328,g|0)|0;e=7888;o[e>>2]=1;o[e+4>>2]=0}if(!(Xa(10328)|0))i_(10328);return 10328}function r_(e,t){e=e|0;t=t|0;La(e,0,t,0,0,0);return}function i_(e){e=e|0;a_(e);s_(e,10);return}function o_(e){e=e|0;u_(e+24|0);return}function u_(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function a_(e){e=e|0;var t=0;t=Za()|0;nl(e,5,1,t,d_()|0,2);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function l_(e,t,n){e=e|0;t=t|0;n=+n;c_(e,t,n);return}function s_(e,t){e=e|0;t=t|0;o[e+20>>2]=t;return}function c_(e,t,n){e=e|0;t=t|0;n=+n;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+16|0;u=r+8|0;l=r+13|0;i=r;a=r+12|0;Ql(l,t);o[u>>2]=Jl(l,t)|0;Kl(a,n);c[i>>3]=+Xl(a,n);f_(e,u,i);h=r;return}function f_(e,t,n){e=e|0;t=t|0;n=n|0;Vo(e+8|0,o[t>>2]|0,+c[n>>3]);r[e+24>>0]=1;return}function d_(){return 1404}function p_(e,t){e=e|0;t=+t;return h_(e,t)|0}function h_(e,t){e=e|0;t=+t;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;r=h;h=h+16|0;u=r+4|0;a=r+8|0;l=r;i=UD(8)|0;n=i;s=$T(16)|0;Ql(u,e);e=Jl(u,e)|0;Kl(a,t);Vo(s,e,+Xl(a,t));a=n+4|0;o[a>>2]=s;e=$T(8)|0;a=o[a>>2]|0;o[l>>2]=0;o[u>>2]=o[l>>2];Yd(e,a,u);o[i>>2]=e;h=r;return n|0}function v_(){var e=0;if(!(r[7896]|0)){m_(10364);Fe(54,10364,g|0)|0;e=7896;o[e>>2]=1;o[e+4>>2]=0}if(!(Xa(10364)|0))m_(10364);return 10364}function m_(e){e=e|0;__(e);s_(e,55);return}function g_(e){e=e|0;y_(e+24|0);return}function y_(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function __(e){e=e|0;var t=0;t=Za()|0;nl(e,5,4,t,S_()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function b_(e){e=e|0;w_(e);return}function w_(e){e=e|0;E_(e);return}function E_(e){e=e|0;D_(e+8|0);r[e+24>>0]=1;return}function D_(e){e=e|0;o[e>>2]=0;c[e+8>>3]=0.0;return}function S_(){return 1424}function C_(){return k_()|0}function k_(){var e=0,t=0,n=0,r=0,i=0,u=0,a=0;t=h;h=h+16|0;i=t+4|0;a=t;n=UD(8)|0;e=n;r=$T(16)|0;D_(r);u=e+4|0;o[u>>2]=r;r=$T(8)|0;u=o[u>>2]|0;o[a>>2]=0;o[i>>2]=o[a>>2];Yd(r,u,i);o[n>>2]=r;h=t;return e|0}function T_(e,t){e=e|0;t=t|0;o[e>>2]=x_()|0;o[e+4>>2]=A_()|0;o[e+12>>2]=t;o[e+8>>2]=O_()|0;o[e+32>>2]=5;return}function x_(){return 11710}function A_(){return 1416}function O_(){return N_()|0}function P_(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;if((Um(r,896)|0)==512){if(n|0){I_(n);KT(n)}}else if(t|0)KT(t);return}function I_(e){e=e|0;e=o[e+4>>2]|0;if(e|0)qT(e);return}function N_(){var e=0;if(!(r[7904]|0)){o[2600]=M_()|0;o[2601]=0;e=7904;o[e>>2]=1;o[e+4>>2]=0}return 10400}function M_(){return o[357]|0}function R_(e){e=e|0;F_(e,4926);L_(e)|0;return}function F_(e,t){e=e|0;t=t|0;var n=0;n=ul()|0;o[e>>2]=n;K_(n,t);cw(o[e>>2]|0);return}function L_(e){e=e|0;var t=0;t=o[e>>2]|0;r_(t,B_()|0);return e|0}function B_(){var e=0;if(!(r[7912]|0)){j_(10412);Fe(56,10412,g|0)|0;e=7912;o[e>>2]=1;o[e+4>>2]=0}if(!(Xa(10412)|0))j_(10412);return 10412}function j_(e){e=e|0;W_(e);s_(e,57);return}function U_(e){e=e|0;z_(e+24|0);return}function z_(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function W_(e){e=e|0;var t=0;t=Za()|0;nl(e,5,5,t,G_()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function H_(e){e=e|0;V_(e);return}function V_(e){e=e|0;q_(e);return}function q_(e){e=e|0;var t=0,n=0;t=e+8|0;n=t+48|0;do{o[t>>2]=0;t=t+4|0}while((t|0)<(n|0));r[e+56>>0]=1;return}function G_(){return 1432}function $_(){return Y_()|0}function Y_(){var e=0,t=0,n=0,r=0,i=0,u=0,a=0,l=0;a=h;h=h+16|0;e=a+4|0;t=a;n=UD(8)|0;r=n;i=$T(48)|0;u=i;l=u+48|0;do{o[u>>2]=0;u=u+4|0}while((u|0)<(l|0));u=r+4|0;o[u>>2]=i;l=$T(8)|0;u=o[u>>2]|0;o[t>>2]=0;o[e>>2]=o[t>>2];pl(l,u,e);o[n>>2]=l;h=a;return r|0}function K_(e,t){e=e|0;t=t|0;o[e>>2]=X_()|0;o[e+4>>2]=Q_()|0;o[e+12>>2]=t;o[e+8>>2]=J_()|0;o[e+32>>2]=6;return}function X_(){return 11704}function Q_(){return 1436}function J_(){return N_()|0}function Z_(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;if((Um(r,896)|0)==512){if(n|0){eb(n);KT(n)}}else if(t|0)KT(t);return}function eb(e){e=e|0;e=o[e+4>>2]|0;if(e|0)qT(e);return}function tb(e){e=e|0;nb(e,4933);rb(e)|0;ib(e)|0;return}function nb(e,t){e=e|0;t=t|0;var n=0;n=Nb()|0;o[e>>2]=n;Mb(n,t);cw(o[e>>2]|0);return}function rb(e){e=e|0;var t=0;t=o[e>>2]|0;r_(t,wb()|0);return e|0}function ib(e){e=e|0;var t=0;t=o[e>>2]|0;r_(t,ob()|0);return e|0}function ob(){var e=0;if(!(r[7920]|0)){ub(10452);Fe(58,10452,g|0)|0;e=7920;o[e>>2]=1;o[e+4>>2]=0}if(!(Xa(10452)|0))ub(10452);return 10452}function ub(e){e=e|0;sb(e);s_(e,1);return}function ab(e){e=e|0;lb(e+24|0);return}function lb(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function sb(e){e=e|0;var t=0;t=Za()|0;nl(e,5,1,t,hb()|0,2);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function cb(e,t,n){e=e|0;t=+t;n=+n;fb(e,t,n);return}function fb(e,t,n){e=e|0;t=+t;n=+n;var r=0,i=0,o=0,u=0,a=0;r=h;h=h+32|0;o=r+8|0;a=r+17|0;i=r;u=r+16|0;Kl(a,t);c[o>>3]=+Xl(a,t);Kl(u,n);c[i>>3]=+Xl(u,n);db(e,o,i);h=r;return}function db(e,t,n){e=e|0;t=t|0;n=n|0;pb(e+8|0,+c[t>>3],+c[n>>3]);r[e+24>>0]=1;return}function pb(e,t,n){e=e|0;t=+t;n=+n;c[e>>3]=t;c[e+8>>3]=n;return}function hb(){return 1472}function vb(e,t){e=+e;t=+t;return mb(e,t)|0}function mb(e,t){e=+e;t=+t;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;r=h;h=h+16|0;a=r+4|0;l=r+8|0;s=r;i=UD(8)|0;n=i;u=$T(16)|0;Kl(a,e);e=+Xl(a,e);Kl(l,t);pb(u,e,+Xl(l,t));l=n+4|0;o[l>>2]=u;u=$T(8)|0;l=o[l>>2]|0;o[s>>2]=0;o[a>>2]=o[s>>2];gb(u,l,a);o[i>>2]=u;h=r;return n|0}function gb(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;n=$T(16)|0;o[n+4>>2]=0;o[n+8>>2]=0;o[n>>2]=1452;o[n+12>>2]=t;o[e+4>>2]=n;return}function yb(e){e=e|0;zT(e);KT(e);return}function _b(e){e=e|0;e=o[e+12>>2]|0;if(e|0)KT(e);return}function bb(e){e=e|0;KT(e);return}function wb(){var e=0;if(!(r[7928]|0)){Eb(10488);Fe(59,10488,g|0)|0;e=7928;o[e>>2]=1;o[e+4>>2]=0}if(!(Xa(10488)|0))Eb(10488);return 10488}function Eb(e){e=e|0;Cb(e);s_(e,60);return}function Db(e){e=e|0;Sb(e+24|0);return}function Sb(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function Cb(e){e=e|0;var t=0;t=Za()|0;nl(e,5,6,t,Ob()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function kb(e){e=e|0;Tb(e);return}function Tb(e){e=e|0;xb(e);return}function xb(e){e=e|0;Ab(e+8|0);r[e+24>>0]=1;return}function Ab(e){e=e|0;o[e>>2]=0;o[e+4>>2]=0;o[e+8>>2]=0;o[e+12>>2]=0;return}function Ob(){return 1492}function Pb(){return Ib()|0}function Ib(){var e=0,t=0,n=0,r=0,i=0,u=0,a=0;t=h;h=h+16|0;i=t+4|0;a=t;n=UD(8)|0;e=n;r=$T(16)|0;Ab(r);u=e+4|0;o[u>>2]=r;r=$T(8)|0;u=o[u>>2]|0;o[a>>2]=0;o[i>>2]=o[a>>2];gb(r,u,i);o[n>>2]=r;h=t;return e|0}function Nb(){var e=0;if(!(r[7936]|0)){Ub(10524);Fe(25,10524,g|0)|0;e=7936;o[e>>2]=1;o[e+4>>2]=0}return 10524}function Mb(e,t){e=e|0;t=t|0;o[e>>2]=Rb()|0;o[e+4>>2]=Fb()|0;o[e+12>>2]=t;o[e+8>>2]=Lb()|0;o[e+32>>2]=7;return}function Rb(){return 11700}function Fb(){return 1484}function Lb(){return N_()|0}function Bb(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;if((Um(r,896)|0)==512){if(n|0){jb(n);KT(n)}}else if(t|0)KT(t);return}function jb(e){e=e|0;e=o[e+4>>2]|0;if(e|0)qT(e);return}function Ub(e){e=e|0;Al(e);return}function zb(e,t,n){e=e|0;t=t|0;n=n|0;e=Ia(t)|0;t=Wb(n)|0;n=Hb(n,0)|0;xw(e,t,n,Vb()|0,0);return}function Wb(e){e=e|0;return e|0}function Hb(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=Vb()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){Jb(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{Zb(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function Vb(){var e=0,t=0;if(!(r[7944]|0)){qb(10568);Fe(61,10568,g|0)|0;t=7944;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10568)|0)){e=10568;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));qb(10568)}return 10568}function qb(e){e=e|0;Yb(e);return}function Gb(e){e=e|0;$b(e+24|0);return}function $b(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function Yb(e){e=e|0;var t=0;t=Za()|0;nl(e,1,17,t,Yc()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function Kb(e){e=e|0;return Qb(o[(Xb(e)|0)>>2]|0)|0}function Xb(e){e=e|0;return(o[(Vb()|0)+24>>2]|0)+(e<<3)|0}function Qb(e){e=e|0;return Jc(TA[e&7]()|0)|0}function Jb(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function Zb(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=ew(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;tw(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;Jb(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;nw(e,i);rw(i);h=l;return}}function ew(e){e=e|0;return 536870911}function tw(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function nw(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function rw(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function iw(){ow();return}function ow(){uw(10604);return}function uw(e){e=e|0;aw(e,4955);return}function aw(e,t){e=e|0;t=t|0;var n=0;n=lw()|0;o[e>>2]=n;sw(n,t);cw(o[e>>2]|0);return}function lw(){var e=0;if(!(r[7952]|0)){bw(10612);Fe(25,10612,g|0)|0;e=7952;o[e>>2]=1;o[e+4>>2]=0}return 10612}function sw(e,t){e=e|0;t=t|0;o[e>>2]=vw()|0;o[e+4>>2]=mw()|0;o[e+12>>2]=t;o[e+8>>2]=gw()|0;o[e+32>>2]=8;return}function cw(e){e=e|0;var t=0,n=0;t=h;h=h+16|0;n=t;fw()|0;o[n>>2]=e;dw(10608,n);h=t;return}function fw(){if(!(r[11714]|0)){o[2652]=0;Fe(62,10608,g|0)|0;r[11714]=1}return 10608}function dw(e,t){e=e|0;t=t|0;var n=0;n=$T(8)|0;o[n+4>>2]=o[t>>2];o[n>>2]=o[e>>2];o[e>>2]=n;return}function pw(e){e=e|0;hw(e);return}function hw(e){e=e|0;var t=0,n=0;t=o[e>>2]|0;if(t|0)do{n=t;t=o[t>>2]|0;KT(n)}while((t|0)!=0);o[e>>2]=0;return}function vw(){return 11715}function mw(){return 1496}function gw(){return Wm()|0}function yw(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;if((Um(r,896)|0)==512){if(n|0){_w(n);KT(n)}}else if(t|0)KT(t);return}function _w(e){e=e|0;e=o[e+4>>2]|0;if(e|0)qT(e);return}function bw(e){e=e|0;Al(e);return}function ww(e,t){e=e|0;t=t|0;var n=0,r=0;fw()|0;n=o[2652]|0;e:do{if(n|0){while(1){r=o[n+4>>2]|0;if(r|0?(rT(Ew(r)|0,e)|0)==0:0)break;n=o[n>>2]|0;if(!n)break e}Dw(r,t)}}while(0);return}function Ew(e){e=e|0;return o[e+12>>2]|0}function Dw(e,t){e=e|0;t=t|0;var n=0;e=e+36|0;n=o[e>>2]|0;if(n|0){Ji(n);KT(n)}n=$T(4)|0;yu(n,t);o[e>>2]=n;return}function Sw(){if(!(r[11716]|0)){o[2664]=0;Fe(63,10656,g|0)|0;r[11716]=1}return 10656}function Cw(){var e=0;if(!(r[11717]|0)){kw();o[2665]=1504;r[11717]=1;e=1504}else e=o[2665]|0;return e|0}function kw(){if(!(r[11740]|0)){r[11718]=za(za(8,0)|0,0)|0;r[11719]=za(za(0,0)|0,0)|0;r[11720]=za(za(0,16)|0,0)|0;r[11721]=za(za(8,0)|0,0)|0;r[11722]=za(za(0,0)|0,0)|0;r[11723]=za(za(8,0)|0,0)|0;r[11724]=za(za(0,0)|0,0)|0;r[11725]=za(za(8,0)|0,0)|0;r[11726]=za(za(0,0)|0,0)|0;r[11727]=za(za(8,0)|0,0)|0;r[11728]=za(za(0,0)|0,0)|0;r[11729]=za(za(0,0)|0,32)|0;r[11730]=za(za(0,0)|0,32)|0;r[11740]=1}return}function Tw(){return 1572}function xw(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;var u=0,a=0,l=0,s=0,c=0,f=0;u=h;h=h+32|0;f=u+16|0;c=u+12|0;s=u+8|0;l=u+4|0;a=u;o[f>>2]=e;o[c>>2]=t;o[s>>2]=n;o[l>>2]=r;o[a>>2]=i;Sw()|0;Aw(10656,f,c,s,l,a);h=u;return}function Aw(e,t,n,r,i,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;var a=0;a=$T(24)|0;Ua(a+4|0,o[t>>2]|0,o[n>>2]|0,o[r>>2]|0,o[i>>2]|0,o[u>>2]|0);o[a>>2]=o[e>>2];o[e>>2]=a;return}function Ow(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0,m=0,g=0,y=0,_=0,b=0;b=h;h=h+32|0;m=b+20|0;g=b+8|0;y=b+4|0;_=b;t=o[t>>2]|0;if(t|0){v=m+4|0;s=m+8|0;c=g+4|0;f=g+8|0;d=g+8|0;p=m+8|0;do{a=t+4|0;l=Pw(a)|0;if(l|0){i=Iw(l)|0;o[m>>2]=0;o[v>>2]=0;o[s>>2]=0;r=(Nw(l)|0)+1|0;Mw(m,r);if(r|0)while(1){r=r+-1|0;gk(g,o[i>>2]|0);u=o[v>>2]|0;if(u>>>0<(o[p>>2]|0)>>>0){o[u>>2]=o[g>>2];o[v>>2]=(o[v>>2]|0)+4}else Rw(m,g);if(!r)break;else i=i+4|0}r=Fw(l)|0;o[g>>2]=0;o[c>>2]=0;o[f>>2]=0;e:do{if(o[r>>2]|0){i=0;u=0;while(1){if((i|0)==(u|0))Lw(g,r);else{o[i>>2]=o[r>>2];o[c>>2]=(o[c>>2]|0)+4}r=r+4|0;if(!(o[r>>2]|0))break e;i=o[c>>2]|0;u=o[d>>2]|0}}}while(0);o[y>>2]=Bw(a)|0;o[_>>2]=Xa(l)|0;jw(n,e,y,_,m,g);Uw(g);zw(m)}t=o[t>>2]|0}while((t|0)!=0)}h=b;return}function Pw(e){e=e|0;return o[e+12>>2]|0}function Iw(e){e=e|0;return o[e+12>>2]|0}function Nw(e){e=e|0;return o[e+16>>2]|0}function Mw(e,t){e=e|0;t=t|0;var n=0,r=0,i=0;i=h;h=h+32|0;n=i;r=o[e>>2]|0;if((o[e+8>>2]|0)-r>>2>>>0>>0){bE(n,t,(o[e+4>>2]|0)-r>>2,e+8|0);wE(e,n);EE(n)}h=i;return}function Rw(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0;a=h;h=h+32|0;n=a;r=e+4|0;i=((o[r>>2]|0)-(o[e>>2]|0)>>2)+1|0;u=mE(e)|0;if(u>>>0>>0)UT(e);else{l=o[e>>2]|0;c=(o[e+8>>2]|0)-l|0;s=c>>1;bE(n,c>>2>>>0>>1>>>0?s>>>0>>0?i:s:u,(o[r>>2]|0)-l>>2,e+8|0);u=n+8|0;o[o[u>>2]>>2]=o[t>>2];o[u>>2]=(o[u>>2]|0)+4;wE(e,n);EE(n);h=a;return}}function Fw(e){e=e|0;return o[e+8>>2]|0}function Lw(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0;a=h;h=h+32|0;n=a;r=e+4|0;i=((o[r>>2]|0)-(o[e>>2]|0)>>2)+1|0;u=pE(e)|0;if(u>>>0>>0)UT(e);else{l=o[e>>2]|0;c=(o[e+8>>2]|0)-l|0;s=c>>1;gE(n,c>>2>>>0>>1>>>0?s>>>0>>0?i:s:u,(o[r>>2]|0)-l>>2,e+8|0);u=n+8|0;o[o[u>>2]>>2]=o[t>>2];o[u>>2]=(o[u>>2]|0)+4;yE(e,n);_E(n);h=a;return}}function Bw(e){e=e|0;return o[e>>2]|0}function jw(e,t,n,r,i,o){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;o=o|0;Ww(e,t,n,r,i,o);return}function Uw(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-4-r|0)>>>2)<<2);KT(n)}return}function zw(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-4-r|0)>>>2)<<2);KT(n)}return}function Ww(e,t,n,r,i,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;var a=0,l=0,s=0,c=0,f=0,d=0;a=h;h=h+48|0;f=a+40|0;l=a+32|0;d=a+24|0;s=a+12|0;c=a;Dk(l);e=Eu(e)|0;o[d>>2]=o[t>>2];n=o[n>>2]|0;r=o[r>>2]|0;Hw(s,i);Vw(c,u);o[f>>2]=o[d>>2];qw(e,f,n,r,s,c);Uw(c);zw(s);Ck(l);h=a;return}function Hw(e,t){e=e|0;t=t|0;var n=0,r=0;o[e>>2]=0;o[e+4>>2]=0;o[e+8>>2]=0;n=t+4|0;r=(o[n>>2]|0)-(o[t>>2]|0)>>2;if(r|0){hE(e,r);vE(e,o[t>>2]|0,o[n>>2]|0,r)}return}function Vw(e,t){e=e|0;t=t|0;var n=0,r=0;o[e>>2]=0;o[e+4>>2]=0;o[e+8>>2]=0;n=t+4|0;r=(o[n>>2]|0)-(o[t>>2]|0)>>2;if(r|0){fE(e,r);dE(e,o[t>>2]|0,o[n>>2]|0,r)}return}function qw(e,t,n,r,i,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;var a=0,l=0,s=0,c=0,f=0,d=0;a=h;h=h+32|0;f=a+28|0;d=a+24|0;l=a+12|0;s=a;c=Cu(Gw()|0)|0;o[d>>2]=o[t>>2];o[f>>2]=o[d>>2];t=$w(f)|0;n=Yw(n)|0;r=Kw(r)|0;o[l>>2]=o[i>>2];f=i+4|0;o[l+4>>2]=o[f>>2];d=i+8|0;o[l+8>>2]=o[d>>2];o[d>>2]=0;o[f>>2]=0;o[i>>2]=0;i=Xw(l)|0;o[s>>2]=o[u>>2];f=u+4|0;o[s+4>>2]=o[f>>2];d=u+8|0;o[s+8>>2]=o[d>>2];o[d>>2]=0;o[f>>2]=0;o[u>>2]=0;Oe(0,c|0,e|0,t|0,n|0,r|0,i|0,Qw(s)|0)|0;Uw(s);zw(l);h=a;return}function Gw(){var e=0;if(!(r[7968]|0)){sE(10708);e=7968;o[e>>2]=1;o[e+4>>2]=0}return 10708}function $w(e){e=e|0;return tE(e)|0}function Yw(e){e=e|0;return Zw(e)|0}function Kw(e){e=e|0;return Jc(e)|0}function Xw(e){e=e|0;return eE(e)|0}function Qw(e){e=e|0;return Jw(e)|0}function Jw(e){e=e|0;var t=0,n=0,r=0;r=(o[e+4>>2]|0)-(o[e>>2]|0)|0;n=r>>2;r=UD(r+4|0)|0;o[r>>2]=n;if(n|0){t=0;do{o[r+4+(t<<2)>>2]=Zw(o[(o[e>>2]|0)+(t<<2)>>2]|0)|0;t=t+1|0}while((t|0)!=(n|0))}return r|0}function Zw(e){e=e|0;return e|0}function eE(e){e=e|0;var t=0,n=0,r=0;r=(o[e+4>>2]|0)-(o[e>>2]|0)|0;n=r>>2;r=UD(r+4|0)|0;o[r>>2]=n;if(n|0){t=0;do{o[r+4+(t<<2)>>2]=tE((o[e>>2]|0)+(t<<2)|0)|0;t=t+1|0}while((t|0)!=(n|0))}return r|0}function tE(e){e=e|0;var t=0,n=0,r=0,i=0;i=h;h=h+32|0;t=i+12|0;n=i;r=al(nE()|0)|0;if(!r)e=rE(e)|0;else{ll(t,r);sl(n,t);bk(e,n);e=fl(t)|0}h=i;return e|0}function nE(){var e=0;if(!(r[7960]|0)){lE(10664);Fe(25,10664,g|0)|0;e=7960;o[e>>2]=1;o[e+4>>2]=0}return 10664}function rE(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0;n=h;h=h+16|0;i=n+4|0;a=n;r=UD(8)|0;t=r;l=$T(4)|0;o[l>>2]=o[e>>2];u=t+4|0;o[u>>2]=l;e=$T(8)|0;u=o[u>>2]|0;o[a>>2]=0;o[i>>2]=o[a>>2];iE(e,u,i);o[r>>2]=e;h=n;return t|0}function iE(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;n=$T(16)|0;o[n+4>>2]=0;o[n+8>>2]=0;o[n>>2]=1656;o[n+12>>2]=t;o[e+4>>2]=n;return}function oE(e){e=e|0;zT(e);KT(e);return}function uE(e){e=e|0;e=o[e+12>>2]|0;if(e|0)KT(e);return}function aE(e){e=e|0;KT(e);return}function lE(e){e=e|0;Al(e);return}function sE(e){e=e|0;Lu(e,cE()|0,5);return}function cE(){return 1676}function fE(e,t){e=e|0;t=t|0;var n=0;if((pE(e)|0)>>>0>>0)UT(e);if(t>>>0>1073741823)Ye();else{n=$T(t<<2)|0;o[e+4>>2]=n;o[e>>2]=n;o[e+8>>2]=n+(t<<2);return}}function dE(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;r=e+4|0;e=n-t|0;if((e|0)>0){ix(o[r>>2]|0,t|0,e|0)|0;o[r>>2]=(o[r>>2]|0)+(e>>>2<<2)}return}function pE(e){e=e|0;return 1073741823}function hE(e,t){e=e|0;t=t|0;var n=0;if((mE(e)|0)>>>0>>0)UT(e);if(t>>>0>1073741823)Ye();else{n=$T(t<<2)|0;o[e+4>>2]=n;o[e>>2]=n;o[e+8>>2]=n+(t<<2);return}}function vE(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;r=e+4|0;e=n-t|0;if((e|0)>0){ix(o[r>>2]|0,t|0,e|0)|0;o[r>>2]=(o[r>>2]|0)+(e>>>2<<2)}return}function mE(e){e=e|0;return 1073741823}function gE(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>1073741823)Ye();else{i=$T(t<<2)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<2)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<2);return}function yE(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>2)<<2)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function _E(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-4-t|0)>>>2)<<2);e=o[e>>2]|0;if(e|0)KT(e);return}function bE(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>1073741823)Ye();else{i=$T(t<<2)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<2)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<2);return}function wE(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>2)<<2)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function EE(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-4-t|0)>>>2)<<2);e=o[e>>2]|0;if(e|0)KT(e);return}function DE(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;var u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0,m=0,g=0;g=h;h=h+32|0;f=g+20|0;d=g+12|0;c=g+16|0;p=g+4|0;v=g;m=g+8|0;l=Cw()|0;u=o[l>>2]|0;a=o[u>>2]|0;if(a|0){s=o[l+8>>2]|0;l=o[l+4>>2]|0;while(1){gk(f,a);SE(e,f,l,s);u=u+4|0;a=o[u>>2]|0;if(!a)break;else{s=s+1|0;l=l+1|0}}}u=Tw()|0;a=o[u>>2]|0;if(a|0)do{gk(f,a);o[d>>2]=o[u+4>>2];CE(t,f,d);u=u+8|0;a=o[u>>2]|0}while((a|0)!=0);u=o[(fw()|0)>>2]|0;if(u|0)do{t=o[u+4>>2]|0;gk(f,o[(kE(t)|0)>>2]|0);o[d>>2]=Ew(t)|0;TE(n,f,d);u=o[u>>2]|0}while((u|0)!=0);gk(c,0);u=Sw()|0;o[f>>2]=o[c>>2];Ow(f,u,i);u=o[(fw()|0)>>2]|0;if(u|0){e=f+4|0;t=f+8|0;n=f+8|0;do{s=o[u+4>>2]|0;gk(d,o[(kE(s)|0)>>2]|0);AE(p,xE(s)|0);a=o[p>>2]|0;if(a|0){o[f>>2]=0;o[e>>2]=0;o[t>>2]=0;do{gk(v,o[(kE(o[a+4>>2]|0)|0)>>2]|0);l=o[e>>2]|0;if(l>>>0<(o[n>>2]|0)>>>0){o[l>>2]=o[v>>2];o[e>>2]=(o[e>>2]|0)+4}else Rw(f,v);a=o[a>>2]|0}while((a|0)!=0);OE(r,d,f);zw(f)}o[m>>2]=o[d>>2];c=PE(s)|0;o[f>>2]=o[m>>2];Ow(f,c,i);kl(p);u=o[u>>2]|0}while((u|0)!=0)}h=g;return}function SE(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;qE(e,t,n,r);return}function CE(e,t,n){e=e|0;t=t|0;n=n|0;VE(e,t,n);return}function kE(e){e=e|0;return e|0}function TE(e,t,n){e=e|0;t=t|0;n=n|0;jE(e,t,n);return}function xE(e){e=e|0;return e+16|0}function AE(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;u=h;h=h+16|0;i=u+8|0;n=u;o[e>>2]=0;r=o[t>>2]|0;o[i>>2]=r;o[n>>2]=e;n=LE(n)|0;if(r|0){r=$T(12)|0;a=(BE(i)|0)+4|0;e=o[a+4>>2]|0;t=r+4|0;o[t>>2]=o[a>>2];o[t+4>>2]=e;t=o[o[i>>2]>>2]|0;o[i>>2]=t;if(!t)e=r;else{t=r;while(1){e=$T(12)|0;s=(BE(i)|0)+4|0;l=o[s+4>>2]|0;a=e+4|0;o[a>>2]=o[s>>2];o[a+4>>2]=l;o[t>>2]=e;a=o[o[i>>2]>>2]|0;o[i>>2]=a;if(!a)break;else t=e}}o[e>>2]=o[n>>2];o[n>>2]=r}h=u;return}function OE(e,t,n){e=e|0;t=t|0;n=n|0;IE(e,t,n);return}function PE(e){e=e|0;return e+24|0}function IE(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+32|0;a=r+24|0;i=r+16|0;l=r+12|0;u=r;Dk(i);e=Eu(e)|0;o[l>>2]=o[t>>2];Hw(u,n);o[a>>2]=o[l>>2];NE(e,a,u);zw(u);Ck(i);h=r;return}function NE(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0;r=h;h=h+32|0;a=r+16|0;l=r+12|0;i=r;u=Cu(ME()|0)|0;o[l>>2]=o[t>>2];o[a>>2]=o[l>>2];t=$w(a)|0;o[i>>2]=o[n>>2];a=n+4|0;o[i+4>>2]=o[a>>2];l=n+8|0;o[i+8>>2]=o[l>>2];o[l>>2]=0;o[a>>2]=0;o[n>>2]=0;ke(0,u|0,e|0,t|0,Xw(i)|0)|0;zw(i);h=r;return}function ME(){var e=0;if(!(r[7976]|0)){RE(10720);e=7976;o[e>>2]=1;o[e+4>>2]=0}return 10720}function RE(e){e=e|0;Lu(e,FE()|0,2);return}function FE(){return 1732}function LE(e){e=e|0;return o[e>>2]|0}function BE(e){e=e|0;return o[e>>2]|0}function jE(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+32|0;u=r+16|0;i=r+8|0;a=r;Dk(i);e=Eu(e)|0;o[a>>2]=o[t>>2];n=o[n>>2]|0;o[u>>2]=o[a>>2];UE(e,u,n);Ck(i);h=r;return}function UE(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+16|0;u=r+4|0;a=r;i=Cu(zE()|0)|0;o[a>>2]=o[t>>2];o[u>>2]=o[a>>2];t=$w(u)|0;ke(0,i|0,e|0,t|0,Yw(n)|0)|0;h=r;return}function zE(){var e=0;if(!(r[7984]|0)){WE(10732);e=7984;o[e>>2]=1;o[e+4>>2]=0}return 10732}function WE(e){e=e|0;Lu(e,HE()|0,2);return}function HE(){return 1744}function VE(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0;r=h;h=h+32|0;u=r+16|0;i=r+8|0;a=r;Dk(i);e=Eu(e)|0;o[a>>2]=o[t>>2];n=o[n>>2]|0;o[u>>2]=o[a>>2];UE(e,u,n);Ck(i);h=r;return}function qE(e,t,n,i){e=e|0;t=t|0;n=n|0;i=i|0;var u=0,a=0,l=0,s=0;u=h;h=h+32|0;l=u+16|0;a=u+8|0;s=u;Dk(a);e=Eu(e)|0;o[s>>2]=o[t>>2];n=r[n>>0]|0;i=r[i>>0]|0;o[l>>2]=o[s>>2];GE(e,l,n,i);Ck(a);h=u;return}function GE(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0;i=h;h=h+16|0;a=i+4|0;l=i;u=Cu($E()|0)|0;o[l>>2]=o[t>>2];o[a>>2]=o[l>>2];t=$w(a)|0;n=YE(n)|0;nt(0,u|0,e|0,t|0,n|0,YE(r)|0)|0;h=i;return}function $E(){var e=0;if(!(r[7992]|0)){XE(10744);e=7992;o[e>>2]=1;o[e+4>>2]=0}return 10744}function YE(e){e=e|0;return KE(e)|0}function KE(e){e=e|0;return e&255|0}function XE(e){e=e|0;Lu(e,QE()|0,3);return}function QE(){return 1756}function JE(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0;v=h;h=h+32|0;s=v+8|0;c=v+4|0;f=v+20|0;d=v;Vs(e,0);i=_k(t)|0;o[s>>2]=0;p=s+4|0;o[p>>2]=0;o[s+8>>2]=0;switch(i<<24>>24){case 0:{r[f>>0]=0;ZE(c,n,f);eD(e,c)|0;Zi(c);break}case 8:{p=yk(t)|0;r[f>>0]=8;gk(d,o[p+4>>2]|0);tD(c,n,f,d,p+8|0);eD(e,c)|0;Zi(c);break}case 9:{a=yk(t)|0;t=o[a+4>>2]|0;if(t|0){l=s+8|0;u=a+12|0;while(1){t=t+-1|0;gk(c,o[u>>2]|0);i=o[p>>2]|0;if(i>>>0<(o[l>>2]|0)>>>0){o[i>>2]=o[c>>2];o[p>>2]=(o[p>>2]|0)+4}else Rw(s,c);if(!t)break;else u=u+4|0}}r[f>>0]=9;gk(d,o[a+8>>2]|0);nD(c,n,f,d,s);eD(e,c)|0;Zi(c);break}default:{p=yk(t)|0;r[f>>0]=i;gk(d,o[p+4>>2]|0);rD(c,n,f,d);eD(e,c)|0;Zi(c)}}zw(s);h=v;return}function ZE(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,o=0;i=h;h=h+16|0;o=i;Dk(o);t=Eu(t)|0;gD(e,t,r[n>>0]|0);Ck(o);h=i;return}function eD(e,t){e=e|0;t=t|0;var n=0;n=o[e>>2]|0;if(n|0)rt(n|0);o[e>>2]=o[t>>2];o[t>>2]=0;return e|0}function tD(e,t,n,i,u){e=e|0;t=t|0;n=n|0;i=i|0;u=u|0;var a=0,l=0,s=0,c=0;a=h;h=h+32|0;s=a+16|0;l=a+8|0;c=a;Dk(l);t=Eu(t)|0;n=r[n>>0]|0;o[c>>2]=o[i>>2];u=o[u>>2]|0;o[s>>2]=o[c>>2];pD(e,t,n,s,u);Ck(l);h=a;return}function nD(e,t,n,i,u){e=e|0;t=t|0;n=n|0;i=i|0;u=u|0;var a=0,l=0,s=0,c=0,f=0;a=h;h=h+32|0;c=a+24|0;l=a+16|0;f=a+12|0;s=a;Dk(l);t=Eu(t)|0;n=r[n>>0]|0;o[f>>2]=o[i>>2];Hw(s,u);o[c>>2]=o[f>>2];sD(e,t,n,c,s);zw(s);Ck(l);h=a;return}function rD(e,t,n,i){e=e|0;t=t|0;n=n|0;i=i|0;var u=0,a=0,l=0,s=0;u=h;h=h+32|0;l=u+16|0;a=u+8|0;s=u;Dk(a);t=Eu(t)|0;n=r[n>>0]|0;o[s>>2]=o[i>>2];o[l>>2]=o[s>>2];iD(e,t,n,l);Ck(a);h=u;return}function iD(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0,a=0,l=0;i=h;h=h+16|0;u=i+4|0;l=i;a=Cu(oD()|0)|0;n=YE(n)|0;o[l>>2]=o[r>>2];o[u>>2]=o[l>>2];uD(e,ke(0,a|0,t|0,n|0,$w(u)|0)|0);h=i;return}function oD(){var e=0;if(!(r[8e3]|0)){aD(10756);e=8e3;o[e>>2]=1;o[e+4>>2]=0}return 10756}function uD(e,t){e=e|0;t=t|0;Vs(e,t);return}function aD(e){e=e|0;Lu(e,lD()|0,2);return}function lD(){return 1772}function sD(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;var u=0,a=0,l=0,s=0,c=0;u=h;h=h+32|0;s=u+16|0;c=u+12|0;a=u;l=Cu(cD()|0)|0;n=YE(n)|0;o[c>>2]=o[r>>2];o[s>>2]=o[c>>2];r=$w(s)|0;o[a>>2]=o[i>>2];s=i+4|0;o[a+4>>2]=o[s>>2];c=i+8|0;o[a+8>>2]=o[c>>2];o[c>>2]=0;o[s>>2]=0;o[i>>2]=0;uD(e,nt(0,l|0,t|0,n|0,r|0,Xw(a)|0)|0);zw(a);h=u;return}function cD(){var e=0;if(!(r[8008]|0)){fD(10768);e=8008;o[e>>2]=1;o[e+4>>2]=0}return 10768}function fD(e){e=e|0;Lu(e,dD()|0,3);return}function dD(){return 1784}function pD(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;var u=0,a=0,l=0,s=0;u=h;h=h+16|0;l=u+4|0;s=u;a=Cu(hD()|0)|0;n=YE(n)|0;o[s>>2]=o[r>>2];o[l>>2]=o[s>>2];r=$w(l)|0;uD(e,nt(0,a|0,t|0,n|0,r|0,Kw(i)|0)|0);h=u;return}function hD(){var e=0;if(!(r[8016]|0)){vD(10780);e=8016;o[e>>2]=1;o[e+4>>2]=0}return 10780}function vD(e){e=e|0;Lu(e,mD()|0,3);return}function mD(){return 1800}function gD(e,t,n){e=e|0;t=t|0;n=n|0;var r=0;r=Cu(yD()|0)|0;uD(e,it(0,r|0,t|0,YE(n)|0)|0);return}function yD(){var e=0;if(!(r[8024]|0)){_D(10792);e=8024;o[e>>2]=1;o[e+4>>2]=0}return 10792}function _D(e){e=e|0;Lu(e,bD()|0,1);return}function bD(){return 1816}function wD(){ED();DD();SD();return}function ED(){o[2702]=YT(65536)|0;return}function DD(){$D(10856);return}function SD(){CD(10816);return}function CD(e){e=e|0;kD(e,5044);TD(e)|0;return}function kD(e,t){e=e|0;t=t|0;var n=0;n=nE()|0;o[e>>2]=n;zD(n,t);cw(o[e>>2]|0);return}function TD(e){e=e|0;var t=0;t=o[e>>2]|0;r_(t,xD()|0);return e|0}function xD(){var e=0;if(!(r[8032]|0)){AD(10820);Fe(64,10820,g|0)|0;e=8032;o[e>>2]=1;o[e+4>>2]=0}if(!(Xa(10820)|0))AD(10820);return 10820}function AD(e){e=e|0;ID(e);s_(e,25);return}function OD(e){e=e|0;PD(e+24|0);return}function PD(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function ID(e){e=e|0;var t=0;t=Za()|0;nl(e,5,18,t,LD()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function ND(e,t){e=e|0;t=t|0;MD(e,t);return}function MD(e,t){e=e|0;t=t|0;var n=0,r=0,i=0;n=h;h=h+16|0;r=n;i=n+4|0;cc(i,t);o[r>>2]=fc(i,t)|0;RD(e,r);h=n;return}function RD(e,t){e=e|0;t=t|0;FD(e+4|0,o[t>>2]|0);r[e+8>>0]=1;return}function FD(e,t){e=e|0;t=t|0;o[e>>2]=t;return}function LD(){return 1824}function BD(e){e=e|0;return jD(e)|0}function jD(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0;n=h;h=h+16|0;i=n+4|0;a=n;r=UD(8)|0;t=r;l=$T(4)|0;cc(i,e);FD(l,fc(i,e)|0);u=t+4|0;o[u>>2]=l;e=$T(8)|0;u=o[u>>2]|0;o[a>>2]=0;o[i>>2]=o[a>>2];iE(e,u,i);o[r>>2]=e;h=n;return t|0}function UD(e){e=e|0;var t=0,n=0;e=e+7&-8;if(e>>>0<=32768?(t=o[2701]|0,e>>>0<=(65536-t|0)>>>0):0){n=(o[2702]|0)+t|0;o[2701]=t+e;e=n}else{e=YT(e+8|0)|0;o[e>>2]=o[2703];o[2703]=e;e=e+8|0}return e|0}function zD(e,t){e=e|0;t=t|0;o[e>>2]=WD()|0;o[e+4>>2]=HD()|0;o[e+12>>2]=t;o[e+8>>2]=VD()|0;o[e+32>>2]=9;return}function WD(){return 11744}function HD(){return 1832}function VD(){return N_()|0}function qD(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;if((Um(r,896)|0)==512){if(n|0){GD(n);KT(n)}}else if(t|0)KT(t);return}function GD(e){e=e|0;e=o[e+4>>2]|0;if(e|0)qT(e);return}function $D(e){e=e|0;YD(e,5052);KD(e)|0;XD(e,5058,26)|0;QD(e,5069,1)|0;JD(e,5077,10)|0;ZD(e,5087,19)|0;tS(e,5094,27)|0;return}function YD(e,t){e=e|0;t=t|0;var n=0;n=sk()|0;o[e>>2]=n;ck(n,t);cw(o[e>>2]|0);return}function KD(e){e=e|0;var t=0;t=o[e>>2]|0;r_(t,YC()|0);return e|0}function XD(e,t,n){e=e|0;t=t|0;n=n|0;TC(e,Ia(t)|0,n,0);return e|0}function QD(e,t,n){e=e|0;t=t|0;n=n|0;sC(e,Ia(t)|0,n,0);return e|0}function JD(e,t,n){e=e|0;t=t|0;n=n|0;BS(e,Ia(t)|0,n,0);return e|0}function ZD(e,t,n){e=e|0;t=t|0;n=n|0;bS(e,Ia(t)|0,n,0);return e|0}function eS(e,t){e=e|0;t=t|0;var n=0,r=0;e:while(1){n=o[2703]|0;while(1){if((n|0)==(t|0))break e;r=o[n>>2]|0;o[2703]=r;if(!n)n=r;else break}KT(n)}o[2701]=e;return}function tS(e,t,n){e=e|0;t=t|0;n=n|0;nS(e,Ia(t)|0,n,0);return e|0}function nS(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=rS()|0;e=iS(n)|0;La(u,t,i,e,oS(n,r)|0,r);return}function rS(){var e=0,t=0;if(!(r[8040]|0)){dS(10860);Fe(65,10860,g|0)|0;t=8040;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10860)|0)){e=10860;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));dS(10860)}return 10860}function iS(e){e=e|0;return e|0}function oS(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=rS()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){uS(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{aS(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function uS(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function aS(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=lS(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;sS(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;uS(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;cS(e,i);fS(i);h=l;return}}function lS(e){e=e|0;return 536870911}function sS(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function cS(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function fS(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function dS(e){e=e|0;vS(e);return}function pS(e){e=e|0;hS(e+24|0);return}function hS(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function vS(e){e=e|0;var t=0;t=Za()|0;nl(e,1,11,t,mS()|0,2);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function mS(){return 1840}function gS(e,t,n){e=e|0;t=t|0;n=n|0;_S(o[(yS(e)|0)>>2]|0,t,n);return}function yS(e){e=e|0;return(o[(rS()|0)+24>>2]|0)+(e<<3)|0}function _S(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,o=0;r=h;h=h+16|0;o=r+1|0;i=r;cc(o,t);t=fc(o,t)|0;cc(i,n);n=fc(i,n)|0;vA[e&31](t,n);h=r;return}function bS(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=wS()|0;e=ES(n)|0;La(u,t,i,e,DS(n,r)|0,r);return}function wS(){var e=0,t=0;if(!(r[8048]|0)){OS(10896);Fe(66,10896,g|0)|0;t=8048;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10896)|0)){e=10896;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));OS(10896)}return 10896}function ES(e){e=e|0;return e|0}function DS(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=wS()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){SS(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{CS(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function SS(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function CS(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=kS(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;TS(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;SS(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;xS(e,i);AS(i);h=l;return}}function kS(e){e=e|0;return 536870911}function TS(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function xS(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function AS(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function OS(e){e=e|0;NS(e);return}function PS(e){e=e|0;IS(e+24|0);return}function IS(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function NS(e){e=e|0;var t=0;t=Za()|0;nl(e,1,11,t,MS()|0,1);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function MS(){return 1852}function RS(e,t){e=e|0;t=t|0;return LS(o[(FS(e)|0)>>2]|0,t)|0}function FS(e){e=e|0;return(o[(wS()|0)+24>>2]|0)+(e<<3)|0}function LS(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;cc(r,t);t=fc(r,t)|0;t=Jc(mA[e&31](t)|0)|0;h=n;return t|0}function BS(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=jS()|0;e=US(n)|0;La(u,t,i,e,zS(n,r)|0,r);return}function jS(){var e=0,t=0;if(!(r[8056]|0)){YS(10932);Fe(67,10932,g|0)|0;t=8056;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10932)|0)){e=10932;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));YS(10932)}return 10932}function US(e){e=e|0;return e|0}function zS(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=jS()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){WS(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{HS(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function WS(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function HS(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=VS(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;qS(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;WS(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;GS(e,i);$S(i);h=l;return}}function VS(e){e=e|0;return 536870911}function qS(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function GS(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function $S(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function YS(e){e=e|0;QS(e);return}function KS(e){e=e|0;XS(e+24|0);return}function XS(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function QS(e){e=e|0;var t=0;t=Za()|0;nl(e,1,7,t,JS()|0,2);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function JS(){return 1860}function ZS(e,t,n){e=e|0;t=t|0;n=n|0;return tC(o[(eC(e)|0)>>2]|0,t,n)|0}function eC(e){e=e|0;return(o[(jS()|0)+24>>2]|0)+(e<<3)|0}function tC(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0;r=h;h=h+32|0;a=r+12|0;u=r+8|0;l=r;s=r+16|0;i=r+4|0;nC(s,t);rC(l,s,t);Us(i,n);n=zs(i,n)|0;o[a>>2]=o[l>>2];PA[e&15](u,a,n);n=iC(u)|0;Zi(u);Ws(i);h=r;return n|0}function nC(e,t){e=e|0;t=t|0;return}function rC(e,t,n){e=e|0;t=t|0;n=n|0;oC(e,n);return}function iC(e){e=e|0;return Eu(e)|0}function oC(e,t){e=e|0;t=t|0;var n=0,r=0,i=0;i=h;h=h+16|0;n=i;r=t;if(!(r&1))o[e>>2]=o[t>>2];else{uC(n,0);Be(r|0,n|0)|0;aC(e,n);lC(n)}h=i;return}function uC(e,t){e=e|0;t=t|0;Iu(e,t);o[e+4>>2]=0;r[e+8>>0]=0;return}function aC(e,t){e=e|0;t=t|0;o[e>>2]=o[t+4>>2];return}function lC(e){e=e|0;r[e+8>>0]=0;return}function sC(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=cC()|0;e=fC(n)|0;La(u,t,i,e,dC(n,r)|0,r);return}function cC(){var e=0,t=0;if(!(r[8064]|0)){_C(10968);Fe(68,10968,g|0)|0;t=8064;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(10968)|0)){e=10968;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));_C(10968)}return 10968}function fC(e){e=e|0;return e|0}function dC(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=cC()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){pC(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{hC(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function pC(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function hC(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=vC(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;mC(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;pC(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;gC(e,i);yC(i);h=l;return}}function vC(e){e=e|0;return 536870911}function mC(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function gC(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function yC(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function _C(e){e=e|0;EC(e);return}function bC(e){e=e|0;wC(e+24|0);return}function wC(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function EC(e){e=e|0;var t=0;t=Za()|0;nl(e,1,1,t,DC()|0,5);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function DC(){return 1872}function SC(e,t,n,r,i,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;u=u|0;kC(o[(CC(e)|0)>>2]|0,t,n,r,i,u);return}function CC(e){e=e|0;return(o[(cC()|0)+24>>2]|0)+(e<<3)|0}function kC(e,t,n,r,i,o){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;o=o|0;var u=0,a=0,l=0,s=0,c=0,f=0;u=h;h=h+32|0;a=u+16|0;l=u+12|0;s=u+8|0;c=u+4|0;f=u;Us(a,t);t=zs(a,t)|0;Us(l,n);n=zs(l,n)|0;Us(s,r);r=zs(s,r)|0;Us(c,i);i=zs(c,i)|0;Us(f,o);o=zs(f,o)|0;cA[e&1](t,n,r,i,o);Ws(f);Ws(c);Ws(s);Ws(l);Ws(a);h=u;return}function TC(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=o[e>>2]|0;i=xC()|0;e=AC(n)|0;La(u,t,i,e,OC(n,r)|0,r);return}function xC(){var e=0,t=0;if(!(r[8072]|0)){LC(11004);Fe(69,11004,g|0)|0;t=8072;o[t>>2]=1;o[t+4>>2]=0}if(!(Xa(11004)|0)){e=11004;t=e+36|0;do{o[e>>2]=0;e=e+4|0}while((e|0)<(t|0));LC(11004)}return 11004}function AC(e){e=e|0;return e|0}function OC(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0,l=0,s=0;l=h;h=h+16|0;i=l;u=l+4|0;o[i>>2]=e;s=xC()|0;a=s+24|0;t=za(t,4)|0;o[u>>2]=t;n=s+28|0;r=o[n>>2]|0;if(r>>>0<(o[s+32>>2]|0)>>>0){PC(r,e,t);t=(o[n>>2]|0)+8|0;o[n>>2]=t}else{IC(a,i,u);t=o[n>>2]|0}h=l;return(t-(o[a>>2]|0)>>3)+-1|0}function PC(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;o[e+4>>2]=n;return}function IC(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0;l=h;h=h+32|0;i=l;u=e+4|0;a=((o[u>>2]|0)-(o[e>>2]|0)>>3)+1|0;r=NC(e)|0;if(r>>>0>>0)UT(e);else{s=o[e>>2]|0;f=(o[e+8>>2]|0)-s|0;c=f>>2;MC(i,f>>3>>>0>>1>>>0?c>>>0>>0?a:c:r,(o[u>>2]|0)-s>>3,e+8|0);a=i+8|0;PC(o[a>>2]|0,o[t>>2]|0,o[n>>2]|0);o[a>>2]=(o[a>>2]|0)+8;RC(e,i);FC(i);h=l;return}}function NC(e){e=e|0;return 536870911}function MC(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0;o[e+12>>2]=0;o[e+16>>2]=r;do{if(t){if(t>>>0>536870911)Ye();else{i=$T(t<<3)|0;break}}else i=0}while(0);o[e>>2]=i;r=i+(n<<3)|0;o[e+8>>2]=r;o[e+4>>2]=r;o[e+12>>2]=i+(t<<3);return}function RC(e,t){e=e|0;t=t|0;var n=0,r=0,i=0,u=0,a=0;r=o[e>>2]|0;a=e+4|0;u=t+4|0;i=(o[a>>2]|0)-r|0;n=(o[u>>2]|0)+(0-(i>>3)<<3)|0;o[u>>2]=n;if((i|0)>0){ix(n|0,r|0,i|0)|0;r=u;n=o[u>>2]|0}else r=u;u=o[e>>2]|0;o[e>>2]=n;o[r>>2]=u;u=t+8|0;i=o[a>>2]|0;o[a>>2]=o[u>>2];o[u>>2]=i;u=e+8|0;a=t+12|0;e=o[u>>2]|0;o[u>>2]=o[a>>2];o[a>>2]=e;o[t>>2]=o[r>>2];return}function FC(e){e=e|0;var t=0,n=0,r=0;t=o[e+4>>2]|0;n=e+8|0;r=o[n>>2]|0;if((r|0)!=(t|0))o[n>>2]=r+(~((r+-8-t|0)>>>3)<<3);e=o[e>>2]|0;if(e|0)KT(e);return}function LC(e){e=e|0;UC(e);return}function BC(e){e=e|0;jC(e+24|0);return}function jC(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function UC(e){e=e|0;var t=0;t=Za()|0;nl(e,1,12,t,zC()|0,2);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function zC(){return 1896}function WC(e,t,n){e=e|0;t=t|0;n=n|0;VC(o[(HC(e)|0)>>2]|0,t,n);return}function HC(e){e=e|0;return(o[(xC()|0)+24>>2]|0)+(e<<3)|0}function VC(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,o=0;r=h;h=h+16|0;o=r+4|0;i=r;qC(o,t);t=GC(o,t)|0;Us(i,n);n=zs(i,n)|0;vA[e&31](t,n);Ws(i);h=r;return}function qC(e,t){e=e|0;t=t|0;return}function GC(e,t){e=e|0;t=t|0;return $C(t)|0}function $C(e){e=e|0;return e|0}function YC(){var e=0;if(!(r[8080]|0)){KC(11040);Fe(70,11040,g|0)|0;e=8080;o[e>>2]=1;o[e+4>>2]=0}if(!(Xa(11040)|0))KC(11040);return 11040}function KC(e){e=e|0;JC(e);s_(e,71);return}function XC(e){e=e|0;QC(e+24|0);return}function QC(e){e=e|0;var t=0,n=0,r=0;n=o[e>>2]|0;r=n;if(n|0){e=e+4|0;t=o[e>>2]|0;if((t|0)!=(n|0))o[e>>2]=t+(~((t+-8-r|0)>>>3)<<3);KT(n)}return}function JC(e){e=e|0;var t=0;t=Za()|0;nl(e,5,7,t,nk()|0,0);o[e+24>>2]=0;o[e+28>>2]=0;o[e+32>>2]=0;return}function ZC(e){e=e|0;ek(e);return}function ek(e){e=e|0;tk(e);return}function tk(e){e=e|0;r[e+8>>0]=1;return}function nk(){return 1936}function rk(){return ik()|0}function ik(){var e=0,t=0,n=0,r=0,i=0,u=0,a=0;t=h;h=h+16|0;i=t+4|0;a=t;n=UD(8)|0;e=n;u=e+4|0;o[u>>2]=$T(1)|0;r=$T(8)|0;u=o[u>>2]|0;o[a>>2]=0;o[i>>2]=o[a>>2];ok(r,u,i);o[n>>2]=r;h=t;return e|0}function ok(e,t,n){e=e|0;t=t|0;n=n|0;o[e>>2]=t;n=$T(16)|0;o[n+4>>2]=0;o[n+8>>2]=0;o[n>>2]=1916;o[n+12>>2]=t;o[e+4>>2]=n;return}function uk(e){e=e|0;zT(e);KT(e);return}function ak(e){e=e|0;e=o[e+12>>2]|0;if(e|0)KT(e);return}function lk(e){e=e|0;KT(e);return}function sk(){var e=0;if(!(r[8088]|0)){mk(11076);Fe(25,11076,g|0)|0;e=8088;o[e>>2]=1;o[e+4>>2]=0}return 11076}function ck(e,t){e=e|0;t=t|0;o[e>>2]=fk()|0;o[e+4>>2]=dk()|0;o[e+12>>2]=t;o[e+8>>2]=pk()|0;o[e+32>>2]=10;return}function fk(){return 11745}function dk(){return 1940}function pk(){return Wm()|0}function hk(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;if((Um(r,896)|0)==512){if(n|0){vk(n);KT(n)}}else if(t|0)KT(t);return}function vk(e){e=e|0;e=o[e+4>>2]|0;if(e|0)qT(e);return}function mk(e){e=e|0;Al(e);return}function gk(e,t){e=e|0;t=t|0;o[e>>2]=t;return}function yk(e){e=e|0;return o[e>>2]|0}function _k(e){e=e|0;return r[o[e>>2]>>0]|0}function bk(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;o[r>>2]=o[e>>2];wk(t,r)|0;h=n;return}function wk(e,t){e=e|0;t=t|0;var n=0;n=Ek(o[e>>2]|0,t)|0;t=e+4|0;o[(o[t>>2]|0)+8>>2]=n;return o[(o[t>>2]|0)+8>>2]|0}function Ek(e,t){e=e|0;t=t|0;var n=0,r=0;n=h;h=h+16|0;r=n;Dk(r);e=Eu(e)|0;t=Sk(e,o[t>>2]|0)|0;Ck(r);h=n;return t|0}function Dk(e){e=e|0;o[e>>2]=o[2701];o[e+4>>2]=o[2703];return}function Sk(e,t){e=e|0;t=t|0;var n=0;n=Cu(kk()|0)|0;return it(0,n|0,e|0,Kw(t)|0)|0}function Ck(e){e=e|0;eS(o[e>>2]|0,o[e+4>>2]|0);return}function kk(){var e=0;if(!(r[8096]|0)){Tk(11120);e=8096;o[e>>2]=1;o[e+4>>2]=0}return 11120}function Tk(e){e=e|0;Lu(e,xk()|0,1);return}function xk(){return 1948}function Ak(){Ok();return}function Ok(){var e=0,t=0,n=0,i=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0,m=0,g=0,y=0,_=0;y=h;h=h+16|0;p=y+4|0;v=y;Ne(65536,10804,o[2702]|0,10812);n=Cw()|0;t=o[n>>2]|0;e=o[t>>2]|0;if(e|0){i=o[n+8>>2]|0;n=o[n+4>>2]|0;while(1){ze(e|0,u[n>>0]|0|0,r[i>>0]|0);t=t+4|0;e=o[t>>2]|0;if(!e)break;else{i=i+1|0;n=n+1|0}}}e=Tw()|0;t=o[e>>2]|0;if(t|0)do{We(t|0,o[e+4>>2]|0);e=e+8|0;t=o[e>>2]|0}while((t|0)!=0);We(Pk()|0,5167);d=fw()|0;e=o[d>>2]|0;e:do{if(e|0){do{Ik(o[e+4>>2]|0);e=o[e>>2]|0}while((e|0)!=0);e=o[d>>2]|0;if(e|0){f=d;do{while(1){a=e;e=o[e>>2]|0;a=o[a+4>>2]|0;if(!(Nk(a)|0))break;o[v>>2]=f;o[p>>2]=o[v>>2];Mk(d,p)|0;if(!e)break e}Rk(a);f=o[f>>2]|0;t=Fk(a)|0;l=Xe()|0;s=h;h=h+((1*(t<<2)|0)+15&-16)|0;c=h;h=h+((1*(t<<2)|0)+15&-16)|0;t=o[(xE(a)|0)>>2]|0;if(t|0){n=s;i=c;while(1){o[n>>2]=o[(kE(o[t+4>>2]|0)|0)>>2];o[i>>2]=o[t+8>>2];t=o[t>>2]|0;if(!t)break;else{n=n+4|0;i=i+4|0}}}_=kE(a)|0;t=Lk(a)|0;n=Fk(a)|0;i=Bk(a)|0;Ge(_|0,t|0,s|0,c|0,n|0,i|0,Ew(a)|0);Re(l|0)}while((e|0)!=0)}}}while(0);e=o[(Sw()|0)>>2]|0;if(e|0)do{_=e+4|0;d=Pw(_)|0;a=Fw(d)|0;l=Iw(d)|0;s=(Nw(d)|0)+1|0;c=jk(d)|0;f=Uk(_)|0;d=Xa(d)|0;p=Bw(_)|0;v=zk(_)|0;Ve(0,a|0,l|0,s|0,c|0,f|0,d|0,p|0,v|0,Wk(_)|0);e=o[e>>2]|0}while((e|0)!=0);e=o[(fw()|0)>>2]|0;e:do{if(e|0){t:while(1){t=o[e+4>>2]|0;if(t|0?(m=o[(kE(t)|0)>>2]|0,g=o[(PE(t)|0)>>2]|0,g|0):0){n=g;do{t=n+4|0;i=Pw(t)|0;n:do{if(i|0)switch(Xa(i)|0){case 0:break t;case 4:case 3:case 2:{c=Fw(i)|0;f=Iw(i)|0;d=(Nw(i)|0)+1|0;p=jk(i)|0;v=Xa(i)|0;_=Bw(t)|0;Ve(m|0,c|0,f|0,d|0,p|0,0,v|0,_|0,zk(t)|0,Wk(t)|0);break n}case 1:{s=Fw(i)|0;c=Iw(i)|0;f=(Nw(i)|0)+1|0;d=jk(i)|0;p=Uk(t)|0;v=Xa(i)|0;_=Bw(t)|0;Ve(m|0,s|0,c|0,f|0,d|0,p|0,v|0,_|0,zk(t)|0,Wk(t)|0);break n}case 5:{d=Fw(i)|0;p=Iw(i)|0;v=(Nw(i)|0)+1|0;_=jk(i)|0;Ve(m|0,d|0,p|0,v|0,_|0,Hk(i)|0,Xa(i)|0,0,0,0);break n}default:break n}}while(0);n=o[n>>2]|0}while((n|0)!=0)}e=o[e>>2]|0;if(!e)break e}Ye()}}while(0);$e();h=y;return}function Pk(){return 11703}function Ik(e){e=e|0;r[e+40>>0]=0;return}function Nk(e){e=e|0;return(r[e+40>>0]|0)!=0|0}function Mk(e,t){e=e|0;t=t|0;t=Vk(t)|0;e=o[t>>2]|0;o[t>>2]=o[e>>2];KT(e);return o[t>>2]|0}function Rk(e){e=e|0;r[e+40>>0]=1;return}function Fk(e){e=e|0;return o[e+20>>2]|0}function Lk(e){e=e|0;return o[e+8>>2]|0}function Bk(e){e=e|0;return o[e+32>>2]|0}function jk(e){e=e|0;return o[e+4>>2]|0}function Uk(e){e=e|0;return o[e+4>>2]|0}function zk(e){e=e|0;return o[e+8>>2]|0}function Wk(e){e=e|0;return o[e+16>>2]|0}function Hk(e){e=e|0;return o[e+20>>2]|0}function Vk(e){e=e|0;return o[e>>2]|0}function qk(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0,m=0,g=0,y=0,_=0,b=0,w=0,E=0,D=0;D=h;h=h+16|0;p=D;do{if(e>>>0<245){c=e>>>0<11?16:e+11&-8;e=c>>>3;d=o[2783]|0;n=d>>>e;if(n&3|0){t=(n&1^1)+e|0;e=11172+(t<<1<<2)|0;n=e+8|0;r=o[n>>2]|0;i=r+8|0;u=o[i>>2]|0;if((e|0)==(u|0))o[2783]=d&~(1<>2]=e;o[n>>2]=u}E=t<<3;o[r+4>>2]=E|3;E=r+E+4|0;o[E>>2]=o[E>>2]|1;E=i;h=D;return E|0}f=o[2785]|0;if(c>>>0>f>>>0){if(n|0){t=2<>>12&16;t=t>>>a;n=t>>>5&8;t=t>>>n;i=t>>>2&4;t=t>>>i;e=t>>>1&2;t=t>>>e;r=t>>>1&1;r=(n|a|i|e|r)+(t>>>r)|0;t=11172+(r<<1<<2)|0;e=t+8|0;i=o[e>>2]|0;a=i+8|0;n=o[a>>2]|0;if((t|0)==(n|0)){e=d&~(1<>2]=t;o[e>>2]=n;e=d}u=(r<<3)-c|0;o[i+4>>2]=c|3;r=i+c|0;o[r+4>>2]=u|1;o[r+u>>2]=u;if(f|0){i=o[2788]|0;t=f>>>3;n=11172+(t<<1<<2)|0;t=1<>2]|0}o[e>>2]=i;o[t+12>>2]=i;o[i+8>>2]=t;o[i+12>>2]=n}o[2785]=u;o[2788]=r;E=a;h=D;return E|0}l=o[2784]|0;if(l){n=(l&0-l)+-1|0;a=n>>>12&16;n=n>>>a;u=n>>>5&8;n=n>>>u;s=n>>>2&4;n=n>>>s;r=n>>>1&2;n=n>>>r;e=n>>>1&1;e=o[11436+((u|a|s|r|e)+(n>>>e)<<2)>>2]|0;n=(o[e+4>>2]&-8)-c|0;r=o[e+16+(((o[e+16>>2]|0)==0&1)<<2)>>2]|0;if(!r){s=e;u=n}else{do{a=(o[r+4>>2]&-8)-c|0;s=a>>>0>>0;n=s?a:n;e=s?r:e;r=o[r+16+(((o[r+16>>2]|0)==0&1)<<2)>>2]|0}while((r|0)!=0);s=e;u=n}a=s+c|0;if(s>>>0>>0){i=o[s+24>>2]|0;t=o[s+12>>2]|0;do{if((t|0)==(s|0)){e=s+20|0;t=o[e>>2]|0;if(!t){e=s+16|0;t=o[e>>2]|0;if(!t){n=0;break}}while(1){n=t+20|0;r=o[n>>2]|0;if(r|0){t=r;e=n;continue}n=t+16|0;r=o[n>>2]|0;if(!r)break;else{t=r;e=n}}o[e>>2]=0;n=t}else{n=o[s+8>>2]|0;o[n+12>>2]=t;o[t+8>>2]=n;n=t}}while(0);do{if(i|0){t=o[s+28>>2]|0;e=11436+(t<<2)|0;if((s|0)==(o[e>>2]|0)){o[e>>2]=n;if(!n){o[2784]=l&~(1<>2]|0)!=(s|0)&1)<<2)>>2]=n;if(!n)break}o[n+24>>2]=i;t=o[s+16>>2]|0;if(t|0){o[n+16>>2]=t;o[t+24>>2]=n}t=o[s+20>>2]|0;if(t|0){o[n+20>>2]=t;o[t+24>>2]=n}}}while(0);if(u>>>0<16){E=u+c|0;o[s+4>>2]=E|3;E=s+E+4|0;o[E>>2]=o[E>>2]|1}else{o[s+4>>2]=c|3;o[a+4>>2]=u|1;o[a+u>>2]=u;if(f|0){r=o[2788]|0;t=f>>>3;n=11172+(t<<1<<2)|0;t=1<>2]|0}o[e>>2]=r;o[t+12>>2]=r;o[r+8>>2]=t;o[r+12>>2]=n}o[2785]=u;o[2788]=a}E=s+8|0;h=D;return E|0}else d=c}else d=c}else d=c}else if(e>>>0<=4294967231){e=e+11|0;c=e&-8;s=o[2784]|0;if(s){r=0-c|0;e=e>>>8;if(e){if(c>>>0>16777215)l=31;else{d=(e+1048320|0)>>>16&8;w=e<>>16&4;w=w<>>16&2;l=14-(f|d|l)+(w<>>15)|0;l=c>>>(l+7|0)&1|l<<1}}else l=0;n=o[11436+(l<<2)>>2]|0;e:do{if(!n){n=0;e=0;w=57}else{e=0;a=c<<((l|0)==31?0:25-(l>>>1)|0);u=0;while(1){i=(o[n+4>>2]&-8)-c|0;if(i>>>0>>0)if(!i){e=n;r=0;i=n;w=61;break e}else{e=n;r=i}i=o[n+20>>2]|0;n=o[n+16+(a>>>31<<2)>>2]|0;u=(i|0)==0|(i|0)==(n|0)?u:i;i=(n|0)==0;if(i){n=u;w=57;break}else a=a<<((i^1)&1)}}}while(0);if((w|0)==57){if((n|0)==0&(e|0)==0){e=2<>>12&16;d=d>>>a;u=d>>>5&8;d=d>>>u;l=d>>>2&4;d=d>>>l;f=d>>>1&2;d=d>>>f;n=d>>>1&1;e=0;n=o[11436+((u|a|l|f|n)+(d>>>n)<<2)>>2]|0}if(!n){l=e;a=r}else{i=n;w=61}}if((w|0)==61)while(1){w=0;n=(o[i+4>>2]&-8)-c|0;d=n>>>0>>0;n=d?n:r;e=d?i:e;i=o[i+16+(((o[i+16>>2]|0)==0&1)<<2)>>2]|0;if(!i){l=e;a=n;break}else{r=n;w=61}}if((l|0)!=0?a>>>0<((o[2785]|0)-c|0)>>>0:0){u=l+c|0;if(l>>>0>=u>>>0){E=0;h=D;return E|0}i=o[l+24>>2]|0;t=o[l+12>>2]|0;do{if((t|0)==(l|0)){e=l+20|0;t=o[e>>2]|0;if(!t){e=l+16|0;t=o[e>>2]|0;if(!t){t=0;break}}while(1){n=t+20|0;r=o[n>>2]|0;if(r|0){t=r;e=n;continue}n=t+16|0;r=o[n>>2]|0;if(!r)break;else{t=r;e=n}}o[e>>2]=0}else{E=o[l+8>>2]|0;o[E+12>>2]=t;o[t+8>>2]=E}}while(0);do{if(i){e=o[l+28>>2]|0;n=11436+(e<<2)|0;if((l|0)==(o[n>>2]|0)){o[n>>2]=t;if(!t){r=s&~(1<>2]|0)!=(l|0)&1)<<2)>>2]=t;if(!t){r=s;break}}o[t+24>>2]=i;e=o[l+16>>2]|0;if(e|0){o[t+16>>2]=e;o[e+24>>2]=t}e=o[l+20>>2]|0;if(e){o[t+20>>2]=e;o[e+24>>2]=t;r=s}else r=s}else r=s}while(0);do{if(a>>>0>=16){o[l+4>>2]=c|3;o[u+4>>2]=a|1;o[u+a>>2]=a;t=a>>>3;if(a>>>0<256){n=11172+(t<<1<<2)|0;e=o[2783]|0;t=1<>2]|0}o[e>>2]=u;o[t+12>>2]=u;o[u+8>>2]=t;o[u+12>>2]=n;break}t=a>>>8;if(t){if(a>>>0>16777215)t=31;else{w=(t+1048320|0)>>>16&8;E=t<>>16&4;E=E<>>16&2;t=14-(b|w|t)+(E<>>15)|0;t=a>>>(t+7|0)&1|t<<1}}else t=0;n=11436+(t<<2)|0;o[u+28>>2]=t;e=u+16|0;o[e+4>>2]=0;o[e>>2]=0;e=1<>2]=u;o[u+24>>2]=n;o[u+12>>2]=u;o[u+8>>2]=u;break}e=a<<((t|0)==31?0:25-(t>>>1)|0);n=o[n>>2]|0;while(1){if((o[n+4>>2]&-8|0)==(a|0)){w=97;break}r=n+16+(e>>>31<<2)|0;t=o[r>>2]|0;if(!t){w=96;break}else{e=e<<1;n=t}}if((w|0)==96){o[r>>2]=u;o[u+24>>2]=n;o[u+12>>2]=u;o[u+8>>2]=u;break}else if((w|0)==97){w=n+8|0;E=o[w>>2]|0;o[E+12>>2]=u;o[w>>2]=u;o[u+8>>2]=E;o[u+12>>2]=n;o[u+24>>2]=0;break}}else{E=a+c|0;o[l+4>>2]=E|3;E=l+E+4|0;o[E>>2]=o[E>>2]|1}}while(0);E=l+8|0;h=D;return E|0}else d=c}else d=c}else d=-1}while(0);n=o[2785]|0;if(n>>>0>=d>>>0){t=n-d|0;e=o[2788]|0;if(t>>>0>15){E=e+d|0;o[2788]=E;o[2785]=t;o[E+4>>2]=t|1;o[E+t>>2]=t;o[e+4>>2]=d|3}else{o[2785]=0;o[2788]=0;o[e+4>>2]=n|3;E=e+n+4|0;o[E>>2]=o[E>>2]|1}E=e+8|0;h=D;return E|0}a=o[2786]|0;if(a>>>0>d>>>0){b=a-d|0;o[2786]=b;E=o[2789]|0;w=E+d|0;o[2789]=w;o[w+4>>2]=b|1;o[E+4>>2]=d|3;E=E+8|0;h=D;return E|0}if(!(o[2901]|0)){o[2903]=4096;o[2902]=4096;o[2904]=-1;o[2905]=-1;o[2906]=0;o[2894]=0;e=p&-16^1431655768;o[p>>2]=e;o[2901]=e;e=4096}else e=o[2903]|0;l=d+48|0;s=d+47|0;u=e+s|0;i=0-e|0;c=u&i;if(c>>>0<=d>>>0){E=0;h=D;return E|0}e=o[2893]|0;if(e|0?(f=o[2891]|0,p=f+c|0,p>>>0<=f>>>0|p>>>0>e>>>0):0){E=0;h=D;return E|0}e:do{if(!(o[2894]&4)){n=o[2789]|0;t:do{if(n){r=11580;while(1){e=o[r>>2]|0;if(e>>>0<=n>>>0?(g=r+4|0,(e+(o[g>>2]|0)|0)>>>0>n>>>0):0)break;e=o[r+8>>2]|0;if(!e){w=118;break t}else r=e}t=u-a&i;if(t>>>0<2147483647){e=lx(t|0)|0;if((e|0)==((o[r>>2]|0)+(o[g>>2]|0)|0)){if((e|0)!=(-1|0)){a=t;u=e;w=135;break e}}else{r=e;w=126}}else t=0}else w=118}while(0);do{if((w|0)==118){n=lx(0)|0;if((n|0)!=(-1|0)?(t=n,v=o[2902]|0,m=v+-1|0,t=((m&t|0)==0?0:(m+t&0-v)-t|0)+c|0,v=o[2891]|0,m=t+v|0,t>>>0>d>>>0&t>>>0<2147483647):0){g=o[2893]|0;if(g|0?m>>>0<=v>>>0|m>>>0>g>>>0:0){t=0;break}e=lx(t|0)|0;if((e|0)==(n|0)){a=t;u=n;w=135;break e}else{r=e;w=126}}else t=0}}while(0);do{if((w|0)==126){n=0-t|0;if(!(l>>>0>t>>>0&(t>>>0<2147483647&(r|0)!=(-1|0))))if((r|0)==(-1|0)){t=0;break}else{a=t;u=r;w=135;break e}e=o[2903]|0;e=s-t+e&0-e;if(e>>>0>=2147483647){a=t;u=r;w=135;break e}if((lx(e|0)|0)==(-1|0)){lx(n|0)|0;t=0;break}else{a=e+t|0;u=r;w=135;break e}}}while(0);o[2894]=o[2894]|4;w=133}else{t=0;w=133}}while(0);if(((w|0)==133?c>>>0<2147483647:0)?(b=lx(c|0)|0,g=lx(0)|0,y=g-b|0,_=y>>>0>(d+40|0)>>>0,!((b|0)==(-1|0)|_^1|b>>>0>>0&((b|0)!=(-1|0)&(g|0)!=(-1|0))^1)):0){a=_?y:t;u=b;w=135}if((w|0)==135){t=(o[2891]|0)+a|0;o[2891]=t;if(t>>>0>(o[2892]|0)>>>0)o[2892]=t;s=o[2789]|0;do{if(s){t=11580;while(1){e=o[t>>2]|0;n=t+4|0;r=o[n>>2]|0;if((u|0)==(e+r|0)){w=145;break}i=o[t+8>>2]|0;if(!i)break;else t=i}if(((w|0)==145?(o[t+12>>2]&8|0)==0:0)?s>>>0>>0&s>>>0>=e>>>0:0){o[n>>2]=r+a;E=s+8|0;E=(E&7|0)==0?0:0-E&7;w=s+E|0;E=(o[2786]|0)+(a-E)|0;o[2789]=w;o[2786]=E;o[w+4>>2]=E|1;o[w+E+4>>2]=40;o[2790]=o[2905];break}if(u>>>0<(o[2787]|0)>>>0)o[2787]=u;n=u+a|0;t=11580;while(1){if((o[t>>2]|0)==(n|0)){w=153;break}e=o[t+8>>2]|0;if(!e)break;else t=e}if((w|0)==153?(o[t+12>>2]&8|0)==0:0){o[t>>2]=u;f=t+4|0;o[f>>2]=(o[f>>2]|0)+a;f=u+8|0;f=u+((f&7|0)==0?0:0-f&7)|0;t=n+8|0;t=n+((t&7|0)==0?0:0-t&7)|0;c=f+d|0;l=t-f-d|0;o[f+4>>2]=d|3;do{if((t|0)!=(s|0)){if((t|0)==(o[2788]|0)){E=(o[2785]|0)+l|0;o[2785]=E;o[2788]=c;o[c+4>>2]=E|1;o[c+E>>2]=E;break}e=o[t+4>>2]|0;if((e&3|0)==1){a=e&-8;r=e>>>3;e:do{if(e>>>0<256){e=o[t+8>>2]|0;n=o[t+12>>2]|0;if((n|0)==(e|0)){o[2783]=o[2783]&~(1<>2]=n;o[n+8>>2]=e;break}}else{u=o[t+24>>2]|0;e=o[t+12>>2]|0;do{if((e|0)==(t|0)){r=t+16|0;n=r+4|0;e=o[n>>2]|0;if(!e){e=o[r>>2]|0;if(!e){e=0;break}else n=r}while(1){r=e+20|0;i=o[r>>2]|0;if(i|0){e=i;n=r;continue}r=e+16|0;i=o[r>>2]|0;if(!i)break;else{e=i;n=r}}o[n>>2]=0}else{E=o[t+8>>2]|0;o[E+12>>2]=e;o[e+8>>2]=E}}while(0);if(!u)break;n=o[t+28>>2]|0;r=11436+(n<<2)|0;do{if((t|0)!=(o[r>>2]|0)){o[u+16+(((o[u+16>>2]|0)!=(t|0)&1)<<2)>>2]=e;if(!e)break e}else{o[r>>2]=e;if(e|0)break;o[2784]=o[2784]&~(1<>2]=u;n=t+16|0;r=o[n>>2]|0;if(r|0){o[e+16>>2]=r;o[r+24>>2]=e}n=o[n+4>>2]|0;if(!n)break;o[e+20>>2]=n;o[n+24>>2]=e}}while(0);t=t+a|0;i=a+l|0}else i=l;t=t+4|0;o[t>>2]=o[t>>2]&-2;o[c+4>>2]=i|1;o[c+i>>2]=i;t=i>>>3;if(i>>>0<256){n=11172+(t<<1<<2)|0;e=o[2783]|0;t=1<>2]|0}o[e>>2]=c;o[t+12>>2]=c;o[c+8>>2]=t;o[c+12>>2]=n;break}t=i>>>8;do{if(!t)t=0;else{if(i>>>0>16777215){t=31;break}w=(t+1048320|0)>>>16&8;E=t<>>16&4;E=E<>>16&2;t=14-(b|w|t)+(E<>>15)|0;t=i>>>(t+7|0)&1|t<<1}}while(0);r=11436+(t<<2)|0;o[c+28>>2]=t;e=c+16|0;o[e+4>>2]=0;o[e>>2]=0;e=o[2784]|0;n=1<>2]=c;o[c+24>>2]=r;o[c+12>>2]=c;o[c+8>>2]=c;break}e=i<<((t|0)==31?0:25-(t>>>1)|0);n=o[r>>2]|0;while(1){if((o[n+4>>2]&-8|0)==(i|0)){w=194;break}r=n+16+(e>>>31<<2)|0;t=o[r>>2]|0;if(!t){w=193;break}else{e=e<<1;n=t}}if((w|0)==193){o[r>>2]=c;o[c+24>>2]=n;o[c+12>>2]=c;o[c+8>>2]=c;break}else if((w|0)==194){w=n+8|0;E=o[w>>2]|0;o[E+12>>2]=c;o[w>>2]=c;o[c+8>>2]=E;o[c+12>>2]=n;o[c+24>>2]=0;break}}else{E=(o[2786]|0)+l|0;o[2786]=E;o[2789]=c;o[c+4>>2]=E|1}}while(0);E=f+8|0;h=D;return E|0}t=11580;while(1){e=o[t>>2]|0;if(e>>>0<=s>>>0?(E=e+(o[t+4>>2]|0)|0,E>>>0>s>>>0):0)break;t=o[t+8>>2]|0}i=E+-47|0;e=i+8|0;e=i+((e&7|0)==0?0:0-e&7)|0;i=s+16|0;e=e>>>0>>0?s:e;t=e+8|0;n=u+8|0;n=(n&7|0)==0?0:0-n&7;w=u+n|0;n=a+-40-n|0;o[2789]=w;o[2786]=n;o[w+4>>2]=n|1;o[w+n+4>>2]=40;o[2790]=o[2905];n=e+4|0;o[n>>2]=27;o[t>>2]=o[2895];o[t+4>>2]=o[2896];o[t+8>>2]=o[2897];o[t+12>>2]=o[2898];o[2895]=u;o[2896]=a;o[2898]=0;o[2897]=t;t=e+24|0;do{w=t;t=t+4|0;o[t>>2]=7}while((w+8|0)>>>0>>0);if((e|0)!=(s|0)){u=e-s|0;o[n>>2]=o[n>>2]&-2;o[s+4>>2]=u|1;o[e>>2]=u;t=u>>>3;if(u>>>0<256){n=11172+(t<<1<<2)|0;e=o[2783]|0;t=1<>2]|0}o[e>>2]=s;o[t+12>>2]=s;o[s+8>>2]=t;o[s+12>>2]=n;break}t=u>>>8;if(t){if(u>>>0>16777215)n=31;else{w=(t+1048320|0)>>>16&8;E=t<>>16&4;E=E<>>16&2;n=14-(b|w|n)+(E<>>15)|0;n=u>>>(n+7|0)&1|n<<1}}else n=0;r=11436+(n<<2)|0;o[s+28>>2]=n;o[s+20>>2]=0;o[i>>2]=0;t=o[2784]|0;e=1<>2]=s;o[s+24>>2]=r;o[s+12>>2]=s;o[s+8>>2]=s;break}e=u<<((n|0)==31?0:25-(n>>>1)|0);n=o[r>>2]|0;while(1){if((o[n+4>>2]&-8|0)==(u|0)){w=216;break}r=n+16+(e>>>31<<2)|0;t=o[r>>2]|0;if(!t){w=215;break}else{e=e<<1;n=t}}if((w|0)==215){o[r>>2]=s;o[s+24>>2]=n;o[s+12>>2]=s;o[s+8>>2]=s;break}else if((w|0)==216){w=n+8|0;E=o[w>>2]|0;o[E+12>>2]=s;o[w>>2]=s;o[s+8>>2]=E;o[s+12>>2]=n;o[s+24>>2]=0;break}}}else{E=o[2787]|0;if((E|0)==0|u>>>0>>0)o[2787]=u;o[2895]=u;o[2896]=a;o[2898]=0;o[2792]=o[2901];o[2791]=-1;t=0;do{E=11172+(t<<1<<2)|0;o[E+12>>2]=E;o[E+8>>2]=E;t=t+1|0}while((t|0)!=32);E=u+8|0;E=(E&7|0)==0?0:0-E&7;w=u+E|0;E=a+-40-E|0;o[2789]=w;o[2786]=E;o[w+4>>2]=E|1;o[w+E+4>>2]=40;o[2790]=o[2905]}}while(0);t=o[2786]|0;if(t>>>0>d>>>0){b=t-d|0;o[2786]=b;E=o[2789]|0;w=E+d|0;o[2789]=w;o[w+4>>2]=b|1;o[E+4>>2]=d|3;E=E+8|0;h=D;return E|0}}o[(Jk()|0)>>2]=12;E=0;h=D;return E|0}function Gk(e){e=e|0;var t=0,n=0,r=0,i=0,u=0,a=0,l=0,s=0;if(!e)return;n=e+-8|0;i=o[2787]|0;e=o[e+-4>>2]|0;t=e&-8;s=n+t|0;do{if(!(e&1)){r=o[n>>2]|0;if(!(e&3))return;a=n+(0-r)|0;u=r+t|0;if(a>>>0>>0)return;if((a|0)==(o[2788]|0)){e=s+4|0;t=o[e>>2]|0;if((t&3|0)!=3){l=a;t=u;break}o[2785]=u;o[e>>2]=t&-2;o[a+4>>2]=u|1;o[a+u>>2]=u;return}n=r>>>3;if(r>>>0<256){e=o[a+8>>2]|0;t=o[a+12>>2]|0;if((t|0)==(e|0)){o[2783]=o[2783]&~(1<>2]=t;o[t+8>>2]=e;l=a;t=u;break}}i=o[a+24>>2]|0;e=o[a+12>>2]|0;do{if((e|0)==(a|0)){n=a+16|0;t=n+4|0;e=o[t>>2]|0;if(!e){e=o[n>>2]|0;if(!e){e=0;break}else t=n}while(1){n=e+20|0;r=o[n>>2]|0;if(r|0){e=r;t=n;continue}n=e+16|0;r=o[n>>2]|0;if(!r)break;else{e=r;t=n}}o[t>>2]=0}else{l=o[a+8>>2]|0;o[l+12>>2]=e;o[e+8>>2]=l}}while(0);if(i){t=o[a+28>>2]|0;n=11436+(t<<2)|0;if((a|0)==(o[n>>2]|0)){o[n>>2]=e;if(!e){o[2784]=o[2784]&~(1<>2]|0)!=(a|0)&1)<<2)>>2]=e;if(!e){l=a;t=u;break}}o[e+24>>2]=i;t=a+16|0;n=o[t>>2]|0;if(n|0){o[e+16>>2]=n;o[n+24>>2]=e}t=o[t+4>>2]|0;if(t){o[e+20>>2]=t;o[t+24>>2]=e;l=a;t=u}else{l=a;t=u}}else{l=a;t=u}}else{l=n;a=n}}while(0);if(a>>>0>=s>>>0)return;e=s+4|0;r=o[e>>2]|0;if(!(r&1))return;if(!(r&2)){e=o[2788]|0;if((s|0)==(o[2789]|0)){s=(o[2786]|0)+t|0;o[2786]=s;o[2789]=l;o[l+4>>2]=s|1;if((l|0)!=(e|0))return;o[2788]=0;o[2785]=0;return}if((s|0)==(e|0)){s=(o[2785]|0)+t|0;o[2785]=s;o[2788]=a;o[l+4>>2]=s|1;o[a+s>>2]=s;return}i=(r&-8)+t|0;n=r>>>3;do{if(r>>>0<256){t=o[s+8>>2]|0;e=o[s+12>>2]|0;if((e|0)==(t|0)){o[2783]=o[2783]&~(1<>2]=e;o[e+8>>2]=t;break}}else{u=o[s+24>>2]|0;e=o[s+12>>2]|0;do{if((e|0)==(s|0)){n=s+16|0;t=n+4|0;e=o[t>>2]|0;if(!e){e=o[n>>2]|0;if(!e){n=0;break}else t=n}while(1){n=e+20|0;r=o[n>>2]|0;if(r|0){e=r;t=n;continue}n=e+16|0;r=o[n>>2]|0;if(!r)break;else{e=r;t=n}}o[t>>2]=0;n=e}else{n=o[s+8>>2]|0;o[n+12>>2]=e;o[e+8>>2]=n;n=e}}while(0);if(u|0){e=o[s+28>>2]|0;t=11436+(e<<2)|0;if((s|0)==(o[t>>2]|0)){o[t>>2]=n;if(!n){o[2784]=o[2784]&~(1<>2]|0)!=(s|0)&1)<<2)>>2]=n;if(!n)break}o[n+24>>2]=u;e=s+16|0;t=o[e>>2]|0;if(t|0){o[n+16>>2]=t;o[t+24>>2]=n}e=o[e+4>>2]|0;if(e|0){o[n+20>>2]=e;o[e+24>>2]=n}}}}while(0);o[l+4>>2]=i|1;o[a+i>>2]=i;if((l|0)==(o[2788]|0)){o[2785]=i;return}}else{o[e>>2]=r&-2;o[l+4>>2]=t|1;o[a+t>>2]=t;i=t}e=i>>>3;if(i>>>0<256){n=11172+(e<<1<<2)|0;t=o[2783]|0;e=1<>2]|0}o[t>>2]=l;o[e+12>>2]=l;o[l+8>>2]=e;o[l+12>>2]=n;return}e=i>>>8;if(e){if(i>>>0>16777215)e=31;else{a=(e+1048320|0)>>>16&8;s=e<>>16&4;s=s<>>16&2;e=14-(u|a|e)+(s<>>15)|0;e=i>>>(e+7|0)&1|e<<1}}else e=0;r=11436+(e<<2)|0;o[l+28>>2]=e;o[l+20>>2]=0;o[l+16>>2]=0;t=o[2784]|0;n=1<>>1)|0);n=o[r>>2]|0;while(1){if((o[n+4>>2]&-8|0)==(i|0)){e=73;break}r=n+16+(t>>>31<<2)|0;e=o[r>>2]|0;if(!e){e=72;break}else{t=t<<1;n=e}}if((e|0)==72){o[r>>2]=l;o[l+24>>2]=n;o[l+12>>2]=l;o[l+8>>2]=l;break}else if((e|0)==73){a=n+8|0;s=o[a>>2]|0;o[s+12>>2]=l;o[a>>2]=l;o[l+8>>2]=s;o[l+12>>2]=n;o[l+24>>2]=0;break}}else{o[2784]=t|n;o[r>>2]=l;o[l+24>>2]=r;o[l+12>>2]=l;o[l+8>>2]=l}}while(0);s=(o[2791]|0)+-1|0;o[2791]=s;if(!s)e=11588;else return;while(1){e=o[e>>2]|0;if(!e)break;else e=e+8|0}o[2791]=-1;return}function $k(){return 11628}function Yk(e){e=e|0;var t=0,n=0;t=h;h=h+16|0;n=t;o[n>>2]=tT(o[e+60>>2]|0)|0;e=Qk(ut(6,n|0)|0)|0;h=t;return e|0}function Kk(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0;d=h;h=h+48|0;c=d+16|0;u=d;i=d+32|0;l=e+28|0;r=o[l>>2]|0;o[i>>2]=r;s=e+20|0;r=(o[s>>2]|0)-r|0;o[i+4>>2]=r;o[i+8>>2]=t;o[i+12>>2]=n;r=r+n|0;a=e+60|0;o[u>>2]=o[a>>2];o[u+4>>2]=i;o[u+8>>2]=2;u=Qk(st(146,u|0)|0)|0;e:do{if((r|0)!=(u|0)){t=2;while(1){if((u|0)<0)break;r=r-u|0;v=o[i+4>>2]|0;p=u>>>0>v>>>0;i=p?i+8|0:i;t=(p<<31>>31)+t|0;v=u-(p?v:0)|0;o[i>>2]=(o[i>>2]|0)+v;p=i+4|0;o[p>>2]=(o[p>>2]|0)-v;o[c>>2]=o[a>>2];o[c+4>>2]=i;o[c+8>>2]=t;u=Qk(st(146,c|0)|0)|0;if((r|0)==(u|0)){f=3;break e}}o[e+16>>2]=0;o[l>>2]=0;o[s>>2]=0;o[e>>2]=o[e>>2]|32;if((t|0)==2)n=0;else n=n-(o[i+4>>2]|0)|0}else f=3}while(0);if((f|0)==3){v=o[e+44>>2]|0;o[e+16>>2]=v+(o[e+48>>2]|0);o[l>>2]=v;o[s>>2]=v}h=d;return n|0}function Xk(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0;i=h;h=h+32|0;u=i;r=i+20|0;o[u>>2]=o[e+60>>2];o[u+4>>2]=0;o[u+8>>2]=t;o[u+12>>2]=r;o[u+16>>2]=n;if((Qk(lt(140,u|0)|0)|0)<0){o[r>>2]=-1;e=-1}else e=o[r>>2]|0;h=i;return e|0}function Qk(e){e=e|0;if(e>>>0>4294963200){o[(Jk()|0)>>2]=0-e;e=-1}return e|0}function Jk(){return(Zk()|0)+64|0}function Zk(){return eT()|0}function eT(){return 2084}function tT(e){e=e|0;return e|0}function nT(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,u=0;u=h;h=h+32|0;i=u;o[e+36>>2]=1;if((o[e>>2]&64|0)==0?(o[i>>2]=o[e+60>>2],o[i+4>>2]=21523,o[i+8>>2]=u+16,Qe(54,i|0)|0):0)r[e+75>>0]=-1;i=Kk(e,t,n)|0;h=u;return i|0}function rT(e,t){e=e|0;t=t|0;var n=0,i=0;n=r[e>>0]|0;i=r[t>>0]|0;if(n<<24>>24==0?1:n<<24>>24!=i<<24>>24)e=i;else{do{e=e+1|0;t=t+1|0;n=r[e>>0]|0;i=r[t>>0]|0}while(!(n<<24>>24==0?1:n<<24>>24!=i<<24>>24));e=i}return(n&255)-(e&255)|0}function iT(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,o=0;e:do{if(!n)e=0;else{while(1){i=r[e>>0]|0;o=r[t>>0]|0;if(i<<24>>24!=o<<24>>24)break;n=n+-1|0;if(!n){e=0;break e}else{e=e+1|0;t=t+1|0}}e=(i&255)-(o&255)|0}}while(0);return e|0}function oT(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,v=0,m=0,g=0,y=0;y=h;h=h+224|0;d=y+120|0;p=y+80|0;m=y;g=y+136|0;i=p;u=i+40|0;do{o[i>>2]=0;i=i+4|0}while((i|0)<(u|0));o[d>>2]=o[n>>2];if((uT(0,t,d,m,p)|0)<0)n=-1;else{if((o[e+76>>2]|0)>-1)v=aT(e)|0;else v=0;n=o[e>>2]|0;f=n&32;if((r[e+74>>0]|0)<1)o[e>>2]=n&-33;i=e+48|0;if(!(o[i>>2]|0)){u=e+44|0;a=o[u>>2]|0;o[u>>2]=g;l=e+28|0;o[l>>2]=g;s=e+20|0;o[s>>2]=g;o[i>>2]=80;c=e+16|0;o[c>>2]=g+80;n=uT(e,t,d,m,p)|0;if(a){_A[o[e+36>>2]&7](e,0,0)|0;n=(o[s>>2]|0)==0?-1:n;o[u>>2]=a;o[i>>2]=0;o[c>>2]=0;o[l>>2]=0;o[s>>2]=0}}else n=uT(e,t,d,m,p)|0;i=o[e>>2]|0;o[e>>2]=i|f;if(v|0)lT(e);n=(i&32|0)==0?n:-1}h=y;return n|0}function uT(e,t,n,u,a){e=e|0;t=t|0;n=n|0;u=u|0;a=a|0;var l=0,s=0,f=0,d=0,p=0,v=0,m=0,g=0,y=0,_=0,b=0,w=0,E=0,D=0,S=0,C=0,k=0,T=0,x=0,O=0,P=0,I=0,N=0;N=h;h=h+64|0;x=N+16|0;O=N;k=N+24|0;P=N+8|0;I=N+20|0;o[x>>2]=t;D=(e|0)!=0;S=k+40|0;C=S;k=k+39|0;T=P+4|0;s=0;l=0;v=0;e:while(1){do{if((l|0)>-1)if((s|0)>(2147483647-l|0)){o[(Jk()|0)>>2]=75;l=-1;break}else{l=s+l|0;break}}while(0);s=r[t>>0]|0;if(!(s<<24>>24)){E=87;break}else f=t;t:while(1){switch(s<<24>>24){case 37:{s=f;E=9;break t}case 0:{s=f;break t}default:{}}w=f+1|0;o[x>>2]=w;s=r[w>>0]|0;f=w}t:do{if((E|0)==9)while(1){E=0;if((r[f+1>>0]|0)!=37)break t;s=s+1|0;f=f+2|0;o[x>>2]=f;if((r[f>>0]|0)==37)E=9;else break}}while(0);s=s-t|0;if(D)sT(e,t,s);if(s|0){t=f;continue}d=f+1|0;s=(r[d>>0]|0)+-48|0;if(s>>>0<10){w=(r[f+2>>0]|0)==36;b=w?s:-1;v=w?1:v;d=w?f+3|0:d}else b=-1;o[x>>2]=d;s=r[d>>0]|0;f=(s<<24>>24)+-32|0;t:do{if(f>>>0<32){p=0;m=s;while(1){s=1<>2]=d;s=r[d>>0]|0;f=(s<<24>>24)+-32|0;if(f>>>0>=32)break;else m=s}}else p=0}while(0);if(s<<24>>24==42){f=d+1|0;s=(r[f>>0]|0)+-48|0;if(s>>>0<10?(r[d+2>>0]|0)==36:0){o[a+(s<<2)>>2]=10;s=o[u+((r[f>>0]|0)+-48<<3)>>2]|0;v=1;d=d+3|0}else{if(v|0){l=-1;break}if(D){v=(o[n>>2]|0)+(4-1)&~(4-1);s=o[v>>2]|0;o[n>>2]=v+4;v=0;d=f}else{s=0;v=0;d=f}}o[x>>2]=d;w=(s|0)<0;s=w?0-s|0:s;p=w?p|8192:p}else{s=cT(x)|0;if((s|0)<0){l=-1;break}d=o[x>>2]|0}do{if((r[d>>0]|0)==46){if((r[d+1>>0]|0)!=42){o[x>>2]=d+1;f=cT(x)|0;d=o[x>>2]|0;break}m=d+2|0;f=(r[m>>0]|0)+-48|0;if(f>>>0<10?(r[d+3>>0]|0)==36:0){o[a+(f<<2)>>2]=10;f=o[u+((r[m>>0]|0)+-48<<3)>>2]|0;d=d+4|0;o[x>>2]=d;break}if(v|0){l=-1;break e}if(D){w=(o[n>>2]|0)+(4-1)&~(4-1);f=o[w>>2]|0;o[n>>2]=w+4}else f=0;o[x>>2]=m;d=m}else f=-1}while(0);_=0;while(1){if(((r[d>>0]|0)+-65|0)>>>0>57){l=-1;break e}w=d+1|0;o[x>>2]=w;m=r[(r[d>>0]|0)+-65+(5178+(_*58|0))>>0]|0;g=m&255;if((g+-1|0)>>>0<8){_=g;d=w}else break}if(!(m<<24>>24)){l=-1;break}y=(b|0)>-1;do{if(m<<24>>24==19){if(y){l=-1;break e}else E=49}else{if(y){o[a+(b<<2)>>2]=g;y=u+(b<<3)|0;b=o[y+4>>2]|0;E=O;o[E>>2]=o[y>>2];o[E+4>>2]=b;E=49;break}if(!D){l=0;break e}fT(O,g,n)}}while(0);if((E|0)==49?(E=0,!D):0){s=0;t=w;continue}d=r[d>>0]|0;d=(_|0)!=0&(d&15|0)==3?d&-33:d;y=p&-65537;b=(p&8192|0)==0?p:y;t:do{switch(d|0){case 110:switch((_&255)<<24>>24){case 0:{o[o[O>>2]>>2]=l;s=0;t=w;continue e}case 1:{o[o[O>>2]>>2]=l;s=0;t=w;continue e}case 2:{s=o[O>>2]|0;o[s>>2]=l;o[s+4>>2]=((l|0)<0)<<31>>31;s=0;t=w;continue e}case 3:{i[o[O>>2]>>1]=l;s=0;t=w;continue e}case 4:{r[o[O>>2]>>0]=l;s=0;t=w;continue e}case 6:{o[o[O>>2]>>2]=l;s=0;t=w;continue e}case 7:{s=o[O>>2]|0;o[s>>2]=l;o[s+4>>2]=((l|0)<0)<<31>>31;s=0;t=w;continue e}default:{s=0;t=w;continue e}}case 112:{d=120;f=f>>>0>8?f:8;t=b|8;E=61;break}case 88:case 120:{t=b;E=61;break}case 111:{d=O;t=o[d>>2]|0;d=o[d+4>>2]|0;g=pT(t,d,S)|0;y=C-g|0;p=0;m=5642;f=(b&8|0)==0|(f|0)>(y|0)?f:y+1|0;y=b;E=67;break}case 105:case 100:{d=O;t=o[d>>2]|0;d=o[d+4>>2]|0;if((d|0)<0){t=ZT(0,0,t|0,d|0)|0;d=A;p=O;o[p>>2]=t;o[p+4>>2]=d;p=1;m=5642;E=66;break t}else{p=(b&2049|0)!=0&1;m=(b&2048|0)==0?(b&1|0)==0?5642:5644:5643;E=66;break t}}case 117:{d=O;p=0;m=5642;t=o[d>>2]|0;d=o[d+4>>2]|0;E=66;break}case 99:{r[k>>0]=o[O>>2];t=k;p=0;m=5642;g=S;d=1;f=y;break}case 109:{d=vT(o[(Jk()|0)>>2]|0)|0;E=71;break}case 115:{d=o[O>>2]|0;d=d|0?d:5652;E=71;break}case 67:{o[P>>2]=o[O>>2];o[T>>2]=0;o[O>>2]=P;g=-1;d=P;E=75;break}case 83:{t=o[O>>2]|0;if(!f){gT(e,32,s,0,b);t=0;E=84}else{g=f;d=t;E=75}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{s=_T(e,+c[O>>3],s,f,b,d)|0;t=w;continue e}default:{p=0;m=5642;g=S;d=f;f=b}}}while(0);t:do{if((E|0)==61){b=O;_=o[b>>2]|0;b=o[b+4>>2]|0;g=dT(_,b,S,d&32)|0;m=(t&8|0)==0|(_|0)==0&(b|0)==0;p=m?0:2;m=m?5642:5642+(d>>4)|0;y=t;t=_;d=b;E=67}else if((E|0)==66){g=hT(t,d,S)|0;y=b;E=67}else if((E|0)==71){E=0;b=mT(d,0,f)|0;_=(b|0)==0;t=d;p=0;m=5642;g=_?d+f|0:b;d=_?f:b-d|0;f=y}else if((E|0)==75){E=0;m=d;t=0;f=0;while(1){p=o[m>>2]|0;if(!p)break;f=yT(I,p)|0;if((f|0)<0|f>>>0>(g-t|0)>>>0)break;t=f+t|0;if(g>>>0>t>>>0)m=m+4|0;else break}if((f|0)<0){l=-1;break e}gT(e,32,s,t,b);if(!t){t=0;E=84}else{p=0;while(1){f=o[d>>2]|0;if(!f){E=84;break t}f=yT(I,f)|0;p=f+p|0;if((p|0)>(t|0)){E=84;break t}sT(e,I,f);if(p>>>0>=t>>>0){E=84;break}else d=d+4|0}}}}while(0);if((E|0)==67){E=0;d=(t|0)!=0|(d|0)!=0;b=(f|0)!=0|d;d=((d^1)&1)+(C-g)|0;t=b?g:S;g=S;d=b?(f|0)>(d|0)?f:d:f;f=(f|0)>-1?y&-65537:y}else if((E|0)==84){E=0;gT(e,32,s,t,b^8192);s=(s|0)>(t|0)?s:t;t=w;continue}_=g-t|0;y=(d|0)<(_|0)?_:d;b=y+p|0;s=(s|0)<(b|0)?b:s;gT(e,32,s,b,f);sT(e,m,p);gT(e,48,s,b,f^65536);gT(e,48,y,_,0);sT(e,t,_);gT(e,32,s,b,f^8192);t=w}e:do{if((E|0)==87)if(!e)if(!v)l=0;else{l=1;while(1){t=o[a+(l<<2)>>2]|0;if(!t)break;fT(u+(l<<3)|0,t,n);l=l+1|0;if((l|0)>=10){l=1;break e}}while(1){if(o[a+(l<<2)>>2]|0){l=-1;break e}l=l+1|0;if((l|0)>=10){l=1;break}}}}while(0);h=N;return l|0}function aT(e){e=e|0;return 0}function lT(e){e=e|0;return}function sT(e,t,n){e=e|0;t=t|0;n=n|0;if(!(o[e>>2]&32))PT(t,n,e)|0;return}function cT(e){e=e|0;var t=0,n=0,i=0;n=o[e>>2]|0;i=(r[n>>0]|0)+-48|0;if(i>>>0<10){t=0;do{t=i+(t*10|0)|0;n=n+1|0;o[e>>2]=n;i=(r[n>>0]|0)+-48|0}while(i>>>0<10)}else t=0;return t|0}function fT(e,t,n){e=e|0;t=t|0;n=n|0;var r=0,i=0,u=0.0;e:do{if(t>>>0<=20)do{switch(t|0){case 9:{r=(o[n>>2]|0)+(4-1)&~(4-1);t=o[r>>2]|0;o[n>>2]=r+4;o[e>>2]=t;break e}case 10:{r=(o[n>>2]|0)+(4-1)&~(4-1);t=o[r>>2]|0;o[n>>2]=r+4;r=e;o[r>>2]=t;o[r+4>>2]=((t|0)<0)<<31>>31;break e}case 11:{r=(o[n>>2]|0)+(4-1)&~(4-1);t=o[r>>2]|0;o[n>>2]=r+4;r=e;o[r>>2]=t;o[r+4>>2]=0;break e}case 12:{r=(o[n>>2]|0)+(8-1)&~(8-1);t=r;i=o[t>>2]|0;t=o[t+4>>2]|0;o[n>>2]=r+8;r=e;o[r>>2]=i;o[r+4>>2]=t;break e}case 13:{i=(o[n>>2]|0)+(4-1)&~(4-1);r=o[i>>2]|0;o[n>>2]=i+4;r=(r&65535)<<16>>16;i=e;o[i>>2]=r;o[i+4>>2]=((r|0)<0)<<31>>31;break e}case 14:{i=(o[n>>2]|0)+(4-1)&~(4-1);r=o[i>>2]|0;o[n>>2]=i+4;i=e;o[i>>2]=r&65535;o[i+4>>2]=0;break e}case 15:{i=(o[n>>2]|0)+(4-1)&~(4-1);r=o[i>>2]|0;o[n>>2]=i+4;r=(r&255)<<24>>24;i=e;o[i>>2]=r;o[i+4>>2]=((r|0)<0)<<31>>31;break e}case 16:{i=(o[n>>2]|0)+(4-1)&~(4-1);r=o[i>>2]|0;o[n>>2]=i+4;i=e;o[i>>2]=r&255;o[i+4>>2]=0;break e}case 17:{i=(o[n>>2]|0)+(8-1)&~(8-1);u=+c[i>>3];o[n>>2]=i+8;c[e>>3]=u;break e}case 18:{i=(o[n>>2]|0)+(8-1)&~(8-1);u=+c[i>>3];o[n>>2]=i+8;c[e>>3]=u;break e}default:break e}}while(0)}while(0);return}function dT(e,t,n,i){e=e|0;t=t|0;n=n|0;i=i|0;if(!((e|0)==0&(t|0)==0))do{n=n+-1|0;r[n>>0]=u[5694+(e&15)>>0]|0|i;e=rx(e|0,t|0,4)|0;t=A}while(!((e|0)==0&(t|0)==0));return n|0}function pT(e,t,n){e=e|0;t=t|0;n=n|0;if(!((e|0)==0&(t|0)==0))do{n=n+-1|0;r[n>>0]=e&7|48;e=rx(e|0,t|0,3)|0;t=A}while(!((e|0)==0&(t|0)==0));return n|0}function hT(e,t,n){e=e|0;t=t|0;n=n|0;var i=0;if(t>>>0>0|(t|0)==0&e>>>0>4294967295){while(1){i=cx(e|0,t|0,10,0)|0;n=n+-1|0;r[n>>0]=i&255|48;i=e;e=ax(e|0,t|0,10,0)|0;if(!(t>>>0>9|(t|0)==9&i>>>0>4294967295))break;else t=A}t=e}else t=e;if(t)while(1){n=n+-1|0;r[n>>0]=(t>>>0)%10|0|48;if(t>>>0<10)break;else t=(t>>>0)/10|0}return n|0}function vT(e){e=e|0;return kT(e,o[(CT()|0)+188>>2]|0)|0}function mT(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,u=0,a=0,l=0;a=t&255;i=(n|0)!=0;e:do{if(i&(e&3|0)!=0){u=t&255;while(1){if((r[e>>0]|0)==u<<24>>24){l=6;break e}e=e+1|0;n=n+-1|0;i=(n|0)!=0;if(!(i&(e&3|0)!=0)){l=5;break}}}else l=5}while(0);if((l|0)==5)if(i)l=6;else n=0;e:do{if((l|0)==6){u=t&255;if((r[e>>0]|0)!=u<<24>>24){i=V(a,16843009)|0;t:do{if(n>>>0>3)while(1){a=o[e>>2]^i;if((a&-2139062144^-2139062144)&a+-16843009|0)break;e=e+4|0;n=n+-4|0;if(n>>>0<=3){l=11;break t}}else l=11}while(0);if((l|0)==11)if(!n){n=0;break}while(1){if((r[e>>0]|0)==u<<24>>24)break e;e=e+1|0;n=n+-1|0;if(!n){n=0;break}}}}}while(0);return(n|0?e:0)|0}function gT(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;var o=0,u=0;u=h;h=h+256|0;o=u;if((n|0)>(r|0)&(i&73728|0)==0){i=n-r|0;tx(o|0,t|0,(i>>>0<256?i:256)|0)|0;if(i>>>0>255){t=n-r|0;do{sT(e,o,256);i=i+-256|0}while(i>>>0>255);i=t&255}sT(e,o,i)}h=u;return}function yT(e,t){e=e|0;t=t|0;if(!e)e=0;else e=DT(e,t,0)|0;return e|0}function _T(e,t,n,i,a,l){e=e|0;t=+t;n=n|0;i=i|0;a=a|0;l=l|0;var s=0,c=0,f=0,d=0,p=0,v=0,m=0,g=0.0,y=0,_=0,b=0,w=0,E=0,D=0,S=0,C=0,k=0,T=0,x=0,O=0,P=0,I=0,N=0;N=h;h=h+560|0;f=N+8|0;b=N;I=N+524|0;P=I;d=N+512|0;o[b>>2]=0;O=d+12|0;bT(t)|0;if((A|0)<0){t=-t;T=1;k=5659}else{T=(a&2049|0)!=0&1;k=(a&2048|0)==0?(a&1|0)==0?5660:5665:5662}bT(t)|0;x=A&2146435072;do{if(x>>>0<2146435072|(x|0)==2146435072&0<0){g=+wT(t,b)*2.0;s=g!=0.0;if(s)o[b>>2]=(o[b>>2]|0)+-1;E=l|32;if((E|0)==97){y=l&32;m=(y|0)==0?k:k+9|0;v=T|2;s=12-i|0;do{if(!(i>>>0>11|(s|0)==0)){t=8.0;do{s=s+-1|0;t=t*16.0}while((s|0)!=0);if((r[m>>0]|0)==45){t=-(t+(-g-t));break}else{t=g+t-t;break}}else t=g}while(0);c=o[b>>2]|0;s=(c|0)<0?0-c|0:c;s=hT(s,((s|0)<0)<<31>>31,O)|0;if((s|0)==(O|0)){s=d+11|0;r[s>>0]=48}r[s+-1>>0]=(c>>31&2)+43;p=s+-2|0;r[p>>0]=l+15;d=(i|0)<1;f=(a&8|0)==0;s=I;do{x=~~t;c=s+1|0;r[s>>0]=u[5694+x>>0]|y;t=(t-+(x|0))*16.0;if((c-P|0)==1?!(f&(d&t==0.0)):0){r[c>>0]=46;s=s+2|0}else s=c}while(t!=0.0);x=s-P|0;P=O-p|0;O=(i|0)!=0&(x+-2|0)<(i|0)?i+2|0:x;s=P+v+O|0;gT(e,32,n,s,a);sT(e,m,v);gT(e,48,n,s,a^65536);sT(e,I,x);gT(e,48,O-x|0,0,0);sT(e,p,P);gT(e,32,n,s,a^8192);break}c=(i|0)<0?6:i;if(s){s=(o[b>>2]|0)+-28|0;o[b>>2]=s;t=g*268435456.0}else{t=g;s=o[b>>2]|0}x=(s|0)<0?f:f+288|0;f=x;do{S=~~t>>>0;o[f>>2]=S;f=f+4|0;t=(t-+(S>>>0))*1.0e9}while(t!=0.0);if((s|0)>0){d=x;v=f;while(1){p=(s|0)<29?s:29;s=v+-4|0;if(s>>>0>=d>>>0){f=0;do{D=nx(o[s>>2]|0,0,p|0)|0;D=ex(D|0,A|0,f|0,0)|0;S=A;w=cx(D|0,S|0,1e9,0)|0;o[s>>2]=w;f=ax(D|0,S|0,1e9,0)|0;s=s+-4|0}while(s>>>0>=d>>>0);if(f){d=d+-4|0;o[d>>2]=f}}f=v;while(1){if(f>>>0<=d>>>0)break;s=f+-4|0;if(!(o[s>>2]|0))f=s;else break}s=(o[b>>2]|0)-p|0;o[b>>2]=s;if((s|0)>0)v=f;else break}}else d=x;if((s|0)<0){i=((c+25|0)/9|0)+1|0;_=(E|0)==102;do{y=0-s|0;y=(y|0)<9?y:9;if(d>>>0>>0){p=(1<>>y;m=0;s=d;do{S=o[s>>2]|0;o[s>>2]=(S>>>y)+m;m=V(S&p,v)|0;s=s+4|0}while(s>>>0>>0);s=(o[d>>2]|0)==0?d+4|0:d;if(!m){d=s;s=f}else{o[f>>2]=m;d=s;s=f+4|0}}else{d=(o[d>>2]|0)==0?d+4|0:d;s=f}f=_?x:d;f=(s-f>>2|0)>(i|0)?f+(i<<2)|0:s;s=(o[b>>2]|0)+y|0;o[b>>2]=s}while((s|0)<0);s=d;i=f}else{s=d;i=f}S=x;if(s>>>0>>0){f=(S-s>>2)*9|0;p=o[s>>2]|0;if(p>>>0>=10){d=10;do{d=d*10|0;f=f+1|0}while(p>>>0>=d>>>0)}}else f=0;_=(E|0)==103;w=(c|0)!=0;d=c-((E|0)!=102?f:0)+((w&_)<<31>>31)|0;if((d|0)<(((i-S>>2)*9|0)+-9|0)){d=d+9216|0;y=x+4+(((d|0)/9|0)+-1024<<2)|0;d=((d|0)%9|0)+1|0;if((d|0)<9){p=10;do{p=p*10|0;d=d+1|0}while((d|0)!=9)}else p=10;v=o[y>>2]|0;m=(v>>>0)%(p>>>0)|0;d=(y+4|0)==(i|0);if(!(d&(m|0)==0)){g=(((v>>>0)/(p>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;D=(p|0)/2|0;t=m>>>0>>0?.5:d&(m|0)==(D|0)?1.0:1.5;if(T){D=(r[k>>0]|0)==45;t=D?-t:t;g=D?-g:g}d=v-m|0;o[y>>2]=d;if(g+t!=g){D=d+p|0;o[y>>2]=D;if(D>>>0>999999999){f=y;while(1){d=f+-4|0;o[f>>2]=0;if(d>>>0>>0){s=s+-4|0;o[s>>2]=0}D=(o[d>>2]|0)+1|0;o[d>>2]=D;if(D>>>0>999999999)f=d;else break}}else d=y;f=(S-s>>2)*9|0;v=o[s>>2]|0;if(v>>>0>=10){p=10;do{p=p*10|0;f=f+1|0}while(v>>>0>=p>>>0)}}else d=y}else d=y;d=d+4|0;d=i>>>0>d>>>0?d:i;D=s}else{d=i;D=s}E=d;while(1){if(E>>>0<=D>>>0){b=0;break}s=E+-4|0;if(!(o[s>>2]|0))E=s;else{b=1;break}}i=0-f|0;do{if(_){s=((w^1)&1)+c|0;if((s|0)>(f|0)&(f|0)>-5){p=l+-1|0;c=s+-1-f|0}else{p=l+-2|0;c=s+-1|0}s=a&8;if(!s){if(b?(C=o[E+-4>>2]|0,(C|0)!=0):0){if(!((C>>>0)%10|0)){d=0;s=10;do{s=s*10|0;d=d+1|0}while(!((C>>>0)%(s>>>0)|0|0))}else d=0}else d=9;s=((E-S>>2)*9|0)+-9|0;if((p|32|0)==102){y=s-d|0;y=(y|0)>0?y:0;c=(c|0)<(y|0)?c:y;y=0;break}else{y=s+f-d|0;y=(y|0)>0?y:0;c=(c|0)<(y|0)?c:y;y=0;break}}else y=s}else{p=l;y=a&8}}while(0);_=c|y;v=(_|0)!=0&1;m=(p|32|0)==102;if(m){w=0;s=(f|0)>0?f:0}else{s=(f|0)<0?i:f;s=hT(s,((s|0)<0)<<31>>31,O)|0;d=O;if((d-s|0)<2)do{s=s+-1|0;r[s>>0]=48}while((d-s|0)<2);r[s+-1>>0]=(f>>31&2)+43;s=s+-2|0;r[s>>0]=p;w=s;s=d-s|0}s=T+1+c+v+s|0;gT(e,32,n,s,a);sT(e,k,T);gT(e,48,n,s,a^65536);if(m){p=D>>>0>x>>>0?x:D;y=I+9|0;v=y;m=I+8|0;d=p;do{f=hT(o[d>>2]|0,0,y)|0;if((d|0)==(p|0)){if((f|0)==(y|0)){r[m>>0]=48;f=m}}else if(f>>>0>I>>>0){tx(I|0,48,f-P|0)|0;do{f=f+-1|0}while(f>>>0>I>>>0)}sT(e,f,v-f|0);d=d+4|0}while(d>>>0<=x>>>0);if(_|0)sT(e,5710,1);if(d>>>0>>0&(c|0)>0)while(1){f=hT(o[d>>2]|0,0,y)|0;if(f>>>0>I>>>0){tx(I|0,48,f-P|0)|0;do{f=f+-1|0}while(f>>>0>I>>>0)}sT(e,f,(c|0)<9?c:9);d=d+4|0;f=c+-9|0;if(!(d>>>0>>0&(c|0)>9)){c=f;break}else c=f}gT(e,48,c+9|0,9,0)}else{_=b?E:D+4|0;if((c|0)>-1){b=I+9|0;y=(y|0)==0;i=b;v=0-P|0;m=I+8|0;p=D;do{f=hT(o[p>>2]|0,0,b)|0;if((f|0)==(b|0)){r[m>>0]=48;f=m}do{if((p|0)==(D|0)){d=f+1|0;sT(e,f,1);if(y&(c|0)<1){f=d;break}sT(e,5710,1);f=d}else{if(f>>>0<=I>>>0)break;tx(I|0,48,f+v|0)|0;do{f=f+-1|0}while(f>>>0>I>>>0)}}while(0);P=i-f|0;sT(e,f,(c|0)>(P|0)?P:c);c=c-P|0;p=p+4|0}while(p>>>0<_>>>0&(c|0)>-1)}gT(e,48,c+18|0,18,0);sT(e,w,O-w|0)}gT(e,32,n,s,a^8192)}else{I=(l&32|0)!=0;s=T+3|0;gT(e,32,n,s,a&-65537);sT(e,k,T);sT(e,t!=t|0.0!=0.0?I?5686:5690:I?5678:5682,3);gT(e,32,n,s,a^8192)}}while(0);h=N;return((s|0)<(n|0)?n:s)|0}function bT(e){e=+e;var t=0;c[d>>3]=e;t=o[d>>2]|0;A=o[d+4>>2]|0;return t|0}function wT(e,t){e=+e;t=t|0;return+ +ET(e,t)}function ET(e,t){e=+e;t=t|0;var n=0,r=0,i=0;c[d>>3]=e;n=o[d>>2]|0;r=o[d+4>>2]|0;i=rx(n|0,r|0,52)|0;switch(i&2047){case 0:{if(e!=0.0){e=+ET(e*18446744073709551616.0,t);n=(o[t>>2]|0)+-64|0}else n=0;o[t>>2]=n;break}case 2047:break;default:{o[t>>2]=(i&2047)+-1022;o[d>>2]=n;o[d+4>>2]=r&-2146435073|1071644672;e=+c[d>>3]}}return+e}function DT(e,t,n){e=e|0;t=t|0;n=n|0;do{if(e){if(t>>>0<128){r[e>>0]=t;e=1;break}if(!(o[o[(ST()|0)+188>>2]>>2]|0))if((t&-128|0)==57216){r[e>>0]=t;e=1;break}else{o[(Jk()|0)>>2]=84;e=-1;break}if(t>>>0<2048){r[e>>0]=t>>>6|192;r[e+1>>0]=t&63|128;e=2;break}if(t>>>0<55296|(t&-8192|0)==57344){r[e>>0]=t>>>12|224;r[e+1>>0]=t>>>6&63|128;r[e+2>>0]=t&63|128;e=3;break}if((t+-65536|0)>>>0<1048576){r[e>>0]=t>>>18|240;r[e+1>>0]=t>>>12&63|128;r[e+2>>0]=t>>>6&63|128;r[e+3>>0]=t&63|128;e=4;break}else{o[(Jk()|0)>>2]=84;e=-1;break}}else e=1}while(0);return e|0}function ST(){return eT()|0}function CT(){return eT()|0}function kT(e,t){e=e|0;t=t|0;var n=0,i=0;i=0;while(1){if((u[5712+i>>0]|0)==(e|0)){e=2;break}n=i+1|0;if((n|0)==87){n=5800;i=87;e=5;break}else i=n}if((e|0)==2)if(!i)n=5800;else{n=5800;e=5}if((e|0)==5)while(1){do{e=n;n=n+1|0}while((r[e>>0]|0)!=0);i=i+-1|0;if(!i)break;else e=5}return TT(n,o[t+20>>2]|0)|0}function TT(e,t){e=e|0;t=t|0;return xT(e,t)|0}function xT(e,t){e=e|0;t=t|0;if(!t)t=0;else t=AT(o[t>>2]|0,o[t+4>>2]|0,e)|0;return(t|0?t:e)|0}function AT(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,h=0;h=(o[e>>2]|0)+1794895138|0;a=OT(o[e+8>>2]|0,h)|0;i=OT(o[e+12>>2]|0,h)|0;u=OT(o[e+16>>2]|0,h)|0;e:do{if((a>>>0>>2>>>0?(p=t-(a<<2)|0,i>>>0>>0&u>>>0 >>0):0)?((u|i)&3|0)==0:0){p=i>>>2;d=u>>>2;f=0;while(1){s=a>>>1;c=f+s|0;l=c<<1;u=l+p|0;i=OT(o[e+(u<<2)>>2]|0,h)|0;u=OT(o[e+(u+1<<2)>>2]|0,h)|0;if(!(u>>>0>>0&i>>>0<(t-u|0)>>>0)){i=0;break e}if(r[e+(u+i)>>0]|0){i=0;break e}i=rT(n,e+u|0)|0;if(!i)break;i=(i|0)<0;if((a|0)==1){i=0;break e}else{f=i?f:c;a=i?s:a-s|0}}i=l+d|0;u=OT(o[e+(i<<2)>>2]|0,h)|0;i=OT(o[e+(i+1<<2)>>2]|0,h)|0;if(i>>>0>>0&u>>>0<(t-i|0)>>>0)i=(r[e+(i+u)>>0]|0)==0?e+i|0:0;else i=0}else i=0}while(0);return i|0}function OT(e,t){e=e|0;t=t|0;var n=0;n=fx(e|0)|0;return((t|0)==0?e:n)|0}function PT(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,u=0,a=0,l=0,s=0;i=n+16|0;u=o[i>>2]|0;if(!u){if(!(IT(n)|0)){u=o[i>>2]|0;a=5}else i=0}else a=5;e:do{if((a|0)==5){s=n+20|0;l=o[s>>2]|0;i=l;if((u-l|0)>>>0>>0){i=_A[o[n+36>>2]&7](n,e,t)|0;break}t:do{if((r[n+75>>0]|0)>-1){l=t;while(1){if(!l){a=0;u=e;break t}u=l+-1|0;if((r[e+u>>0]|0)==10)break;else l=u}i=_A[o[n+36>>2]&7](n,e,l)|0;if(i>>>0>>0)break e;a=l;u=e+l|0;t=t-l|0;i=o[s>>2]|0}else{a=0;u=e}}while(0);ix(i|0,u|0,t|0)|0;o[s>>2]=(o[s>>2]|0)+t;i=a+t|0}}while(0);return i|0}function IT(e){e=e|0;var t=0,n=0;t=e+74|0;n=r[t>>0]|0;r[t>>0]=n+255|n;t=o[e>>2]|0;if(!(t&8)){o[e+8>>2]=0;o[e+4>>2]=0;n=o[e+44>>2]|0;o[e+28>>2]=n;o[e+20>>2]=n;o[e+16>>2]=n+(o[e+48>>2]|0);e=0}else{o[e>>2]=t|32;e=-1}return e|0}function NT(e,t){e=Y(e);t=Y(t);var n=0,r=0;n=MT(e)|0;do{if((n&2147483647)>>>0<=2139095040){r=MT(t)|0;if((r&2147483647)>>>0<=2139095040)if((r^n|0)<0){e=(n|0)<0?t:e;break}else{e=e>2]=e,o[d>>2]|0)|0}function RT(e,t){e=Y(e);t=Y(t);var n=0,r=0;n=FT(e)|0;do{if((n&2147483647)>>>0<=2139095040){r=FT(t)|0;if((r&2147483647)>>>0<=2139095040)if((r^n|0)<0){e=(n|0)<0?e:t;break}else{e=e>2]=e,o[d>>2]|0)|0}function LT(e,t){e=Y(e);t=Y(t);var n=0,r=0,i=0,u=0,a=0,l=0,c=0,f=0;u=(s[d>>2]=e,o[d>>2]|0);l=(s[d>>2]=t,o[d>>2]|0);n=u>>>23&255;a=l>>>23&255;c=u&-2147483648;i=l<<1;e:do{if((i|0)!=0?!((n|0)==255|((BT(t)|0)&2147483647)>>>0>2139095040):0){r=u<<1;if(r>>>0<=i>>>0){t=Y(e*Y(0.0));return Y((r|0)==(i|0)?t:e)}if(!n){n=u<<9;if((n|0)>-1){r=n;n=0;do{n=n+-1|0;r=r<<1}while((r|0)>-1)}else n=0;r=u<<1-n}else r=u&8388607|8388608;if(!a){u=l<<9;if((u|0)>-1){i=0;do{i=i+-1|0;u=u<<1}while((u|0)>-1)}else i=0;a=i;l=l<<1-i}else l=l&8388607|8388608;i=r-l|0;u=(i|0)>-1;t:do{if((n|0)>(a|0)){while(1){if(u)if(!i)break;else r=i;r=r<<1;n=n+-1|0;i=r-l|0;u=(i|0)>-1;if((n|0)<=(a|0))break t}t=Y(e*Y(0.0));break e}}while(0);if(u)if(!i){t=Y(e*Y(0.0));break}else r=i;if(r>>>0<8388608)do{r=r<<1;n=n+-1|0}while(r>>>0<8388608);if((n|0)>0)n=r+-8388608|n<<23;else n=r>>>(1-n|0);t=(o[d>>2]=n|c,Y(s[d>>2]))}else f=3}while(0);if((f|0)==3){t=Y(e*t);t=Y(t/t)}return Y(t)}function BT(e){e=Y(e);return(s[d>>2]=e,o[d>>2]|0)|0}function jT(e,t){e=e|0;t=t|0;return oT(o[582]|0,e,t)|0}function UT(e){e=e|0;Ye()}function zT(e){e=e|0;return}function WT(e,t){e=e|0;t=t|0;return 0}function HT(e){e=e|0;if((VT(e+4|0)|0)==-1){hA[o[(o[e>>2]|0)+8>>2]&127](e);e=1}else e=0;return e|0}function VT(e){e=e|0;var t=0;t=o[e>>2]|0;o[e>>2]=t+-1;return t+-1|0}function qT(e){e=e|0;if(HT(e)|0)GT(e);return}function GT(e){e=e|0;var t=0;t=e+8|0;if(!((o[t>>2]|0)!=0?(VT(t)|0)!=-1:0))hA[o[(o[e>>2]|0)+16>>2]&127](e);return}function $T(e){e=e|0;var t=0;t=(e|0)==0?1:e;while(1){e=qk(t)|0;if(e|0)break;e=QT()|0;if(!e){e=0;break}IA[e&0]()}return e|0}function YT(e){e=e|0;return $T(e)|0}function KT(e){e=e|0;Gk(e);return}function XT(e){e=e|0;if((r[e+11>>0]|0)<0)KT(o[e>>2]|0);return}function QT(){var e=0;e=o[2923]|0;o[2923]=e+0;return e|0}function JT(){}function ZT(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;r=t-r-(n>>>0>e>>>0|0)>>>0;return(A=r,e-n>>>0|0)|0}function ex(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;n=e+n>>>0;return(A=t+r+(n>>>0>>0|0)>>>0,n|0)|0}function tx(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,u=0,a=0,l=0;a=e+n|0;t=t&255;if((n|0)>=67){while(e&3){r[e>>0]=t;e=e+1|0}i=a&-4|0;u=i-64|0;l=t|t<<8|t<<16|t<<24;while((e|0)<=(u|0)){o[e>>2]=l;o[e+4>>2]=l;o[e+8>>2]=l;o[e+12>>2]=l;o[e+16>>2]=l;o[e+20>>2]=l;o[e+24>>2]=l;o[e+28>>2]=l;o[e+32>>2]=l;o[e+36>>2]=l;o[e+40>>2]=l;o[e+44>>2]=l;o[e+48>>2]=l;o[e+52>>2]=l;o[e+56>>2]=l;o[e+60>>2]=l;e=e+64|0}while((e|0)<(i|0)){o[e>>2]=l;e=e+4|0}}while((e|0)<(a|0)){r[e>>0]=t;e=e+1|0}return a-n|0}function nx(e,t,n){e=e|0;t=t|0;n=n|0;if((n|0)<32){A=t<>>32-n;return e<>>n;return e>>>n|(t&(1<>>n-32|0}function ix(e,t,n){e=e|0;t=t|0;n=n|0;var i=0,u=0,a=0;if((n|0)>=8192)return He(e|0,t|0,n|0)|0;a=e|0;u=e+n|0;if((e&3)==(t&3)){while(e&3){if(!n)return a|0;r[e>>0]=r[t>>0]|0;e=e+1|0;t=t+1|0;n=n-1|0}n=u&-4|0;i=n-64|0;while((e|0)<=(i|0)){o[e>>2]=o[t>>2];o[e+4>>2]=o[t+4>>2];o[e+8>>2]=o[t+8>>2];o[e+12>>2]=o[t+12>>2];o[e+16>>2]=o[t+16>>2];o[e+20>>2]=o[t+20>>2];o[e+24>>2]=o[t+24>>2];o[e+28>>2]=o[t+28>>2];o[e+32>>2]=o[t+32>>2];o[e+36>>2]=o[t+36>>2];o[e+40>>2]=o[t+40>>2];o[e+44>>2]=o[t+44>>2];o[e+48>>2]=o[t+48>>2];o[e+52>>2]=o[t+52>>2];o[e+56>>2]=o[t+56>>2];o[e+60>>2]=o[t+60>>2];e=e+64|0;t=t+64|0}while((e|0)<(n|0)){o[e>>2]=o[t>>2];e=e+4|0;t=t+4|0}}else{n=u-4|0;while((e|0)<(n|0)){r[e>>0]=r[t>>0]|0;r[e+1>>0]=r[t+1>>0]|0;r[e+2>>0]=r[t+2>>0]|0;r[e+3>>0]=r[t+3>>0]|0;e=e+4|0;t=t+4|0}}while((e|0)<(u|0)){r[e>>0]=r[t>>0]|0;e=e+1|0;t=t+1|0}return a|0}function ox(e){e=e|0;var t=0;t=r[m+(e&255)>>0]|0;if((t|0)<8)return t|0;t=r[m+(e>>8&255)>>0]|0;if((t|0)<8)return t+8|0;t=r[m+(e>>16&255)>>0]|0;if((t|0)<8)return t+16|0;return(r[m+(e>>>24)>>0]|0)+24|0}function ux(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;var u=0,a=0,l=0,s=0,c=0,f=0,d=0,p=0,h=0,v=0;f=e;s=t;c=s;a=n;p=r;l=p;if(!c){u=(i|0)!=0;if(!l){if(u){o[i>>2]=(f>>>0)%(a>>>0);o[i+4>>2]=0}p=0;i=(f>>>0)/(a>>>0)>>>0;return(A=p,i)|0}else{if(!u){p=0;i=0;return(A=p,i)|0}o[i>>2]=e|0;o[i+4>>2]=t&0;p=0;i=0;return(A=p,i)|0}}u=(l|0)==0;do{if(a){if(!u){u=($(l|0)|0)-($(c|0)|0)|0;if(u>>>0<=31){d=u+1|0;l=31-u|0;t=u-31>>31;a=d;e=f>>>(d>>>0)&t|c<>>(d>>>0)&t;u=0;l=f<>2]=e|0;o[i+4>>2]=s|t&0;p=0;i=0;return(A=p,i)|0}u=a-1|0;if(u&a|0){l=($(a|0)|0)+33-($(c|0)|0)|0;v=64-l|0;d=32-l|0;s=d>>31;h=l-32|0;t=h>>31;a=l;e=d-1>>31&c>>>(h>>>0)|(c<>>(l>>>0))&t;t=t&c>>>(l>>>0);u=f<>>(h>>>0))&s|f<>31;break}if(i|0){o[i>>2]=u&f;o[i+4>>2]=0}if((a|0)==1){h=s|t&0;v=e|0|0;return(A=h,v)|0}else{v=ox(a|0)|0;h=c>>>(v>>>0)|0;v=c<<32-v|f>>>(v>>>0)|0;return(A=h,v)|0}}else{if(u){if(i|0){o[i>>2]=(c>>>0)%(a>>>0);o[i+4>>2]=0}h=0;v=(c>>>0)/(a>>>0)>>>0;return(A=h,v)|0}if(!f){if(i|0){o[i>>2]=0;o[i+4>>2]=(c>>>0)%(l>>>0)}h=0;v=(c>>>0)/(l>>>0)>>>0;return(A=h,v)|0}u=l-1|0;if(!(u&l)){if(i|0){o[i>>2]=e|0;o[i+4>>2]=u&c|t&0}h=0;v=c>>>((ox(l|0)|0)>>>0);return(A=h,v)|0}u=($(l|0)|0)-($(c|0)|0)|0;if(u>>>0<=30){t=u+1|0;l=31-u|0;a=t;e=c<>>(t>>>0);t=c>>>(t>>>0);u=0;l=f<>2]=e|0;o[i+4>>2]=s|t&0;h=0;v=0;return(A=h,v)|0}}while(0);if(!a){c=l;s=0;l=0}else{d=n|0|0;f=p|r&0;c=ex(d|0,f|0,-1,-1)|0;n=A;s=l;l=0;do{r=s;s=u>>>31|s<<1;u=l|u<<1;r=e<<1|r>>>31|0;p=e>>>31|t<<1|0;ZT(c|0,n|0,r|0,p|0)|0;v=A;h=v>>31|((v|0)<0?-1:0)<<1;l=h&1;e=ZT(r|0,p|0,h&d|0,(((v|0)<0?-1:0)>>31|((v|0)<0?-1:0)<<1)&f|0)|0;t=A;a=a-1|0}while((a|0)!=0);c=s;s=0}a=0;if(i|0){o[i>>2]=e;o[i+4>>2]=t}h=(u|0)>>>31|(c|a)<<1|(a<<1|u>>>31)&0|s;v=(u<<1|0>>>31)&-2|l;return(A=h,v)|0}function ax(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;return ux(e,t,n,r,0)|0}function lx(e){e=e|0;var t=0,n=0;n=e+15&-16|0;t=o[f>>2]|0;e=t+n|0;if((n|0)>0&(e|0)<(t|0)|(e|0)<0){Z()|0;qe(12);return-1}o[f>>2]=e;if((e|0)>(J()|0)?(Q()|0)==0:0){o[f>>2]=t;qe(12);return-1}return t|0}function sx(e,t,n){e=e|0;t=t|0;n=n|0;var i=0;if((t|0)<(e|0)&(e|0)<(t+n|0)){i=e;t=t+n|0;e=e+n|0;while((n|0)>0){e=e-1|0;t=t-1|0;n=n-1|0;r[e>>0]=r[t>>0]|0}e=i}else ix(e,t,n)|0;return e|0}function cx(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;var i=0,u=0;u=h;h=h+16|0;i=u|0;ux(e,t,n,r,i)|0;h=u;return(A=o[i+4>>2]|0,o[i>>2]|0)|0}function fx(e){e=e|0;return(e&255)<<24|(e>>8&255)<<16|(e>>16&255)<<8|e>>>24|0}function dx(e,t,n,r,i,o){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;o=o|0;cA[e&1](t|0,n|0,r|0,i|0,o|0)}function px(e,t,n){e=e|0;t=t|0;n=Y(n);fA[e&1](t|0,Y(n))}function hx(e,t,n){e=e|0;t=t|0;n=+n;dA[e&31](t|0,+n)}function vx(e,t,n,r){e=e|0;t=t|0;n=Y(n);r=Y(r);return Y(pA[e&0](t|0,Y(n),Y(r)))}function mx(e,t){e=e|0;t=t|0;hA[e&127](t|0)}function gx(e,t,n){e=e|0;t=t|0;n=n|0;vA[e&31](t|0,n|0)}function yx(e,t){e=e|0;t=t|0;return mA[e&31](t|0)|0}function _x(e,t,n,r,i){e=e|0;t=t|0;n=+n;r=+r;i=i|0;gA[e&1](t|0,+n,+r,i|0)}function bx(e,t,n,r){e=e|0;t=t|0;n=+n;r=+r;yA[e&1](t|0,+n,+r)}function wx(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;return _A[e&7](t|0,n|0,r|0)|0}function Ex(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;return+bA[e&1](t|0,n|0,r|0)}function Dx(e,t){e=e|0;t=t|0;return+wA[e&15](t|0)}function Sx(e,t,n){e=e|0;t=t|0;n=+n;return EA[e&1](t|0,+n)|0}function Cx(e,t,n){e=e|0;t=t|0;n=n|0;return DA[e&15](t|0,n|0)|0}function kx(e,t,n,r,i,o){e=e|0;t=t|0;n=n|0;r=+r;i=+i;o=o|0;SA[e&1](t|0,n|0,+r,+i,o|0)}function Tx(e,t,n,r,i,o,u){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;o=o|0;u=u|0;CA[e&1](t|0,n|0,r|0,i|0,o|0,u|0)}function xx(e,t,n){e=e|0;t=t|0;n=n|0;return+kA[e&7](t|0,n|0)}function Ax(e){e=e|0;return TA[e&7]()|0}function Ox(e,t,n,r,i,o){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;o=o|0;return xA[e&1](t|0,n|0,r|0,i|0,o|0)|0}function Px(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=+i;AA[e&1](t|0,n|0,r|0,+i)}function Ix(e,t,n,r,i,o,u){e=e|0;t=t|0;n=n|0;r=Y(r);i=i|0;o=Y(o);u=u|0;OA[e&1](t|0,n|0,Y(r),i|0,Y(o),u|0)}function Nx(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;PA[e&15](t|0,n|0,r|0)}function Mx(e){e=e|0;IA[e&0]()}function Rx(e,t,n,r){e=e|0;t=t|0;n=n|0;r=+r;NA[e&15](t|0,n|0,+r)}function Fx(e,t,n){e=e|0;t=+t;n=+n;return MA[e&1](+t,+n)|0}function Lx(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;RA[e&15](t|0,n|0,r|0,i|0)}function Bx(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;K(0)}function jx(e,t){e=e|0;t=Y(t);K(1)}function Ux(e,t){e=e|0;t=+t;K(2)}function zx(e,t,n){e=e|0;t=Y(t);n=Y(n);K(3);return ft}function Wx(e){e=e|0;K(4)}function Hx(e,t){e=e|0;t=t|0;K(5)}function Vx(e){e=e|0;K(6);return 0}function qx(e,t,n,r){e=e|0;t=+t;n=+n;r=r|0;K(7)}function Gx(e,t,n){e=e|0;t=+t;n=+n;K(8)}function $x(e,t,n){e=e|0;t=t|0;n=n|0;K(9);return 0}function Yx(e,t,n){e=e|0;t=t|0;n=n|0;K(10);return 0.0}function Kx(e){e=e|0;K(11);return 0.0}function Xx(e,t){e=e|0;t=+t;K(12);return 0}function Qx(e,t){e=e|0;t=t|0;K(13);return 0}function Jx(e,t,n,r,i){e=e|0;t=t|0;n=+n;r=+r;i=i|0;K(14)}function Zx(e,t,n,r,i,o){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;o=o|0;K(15)}function eA(e,t){e=e|0;t=t|0;K(16);return 0.0}function tA(){K(17);return 0}function nA(e,t,n,r,i){e=e|0;t=t|0;n=n|0;r=r|0;i=i|0;K(18);return 0}function rA(e,t,n,r){e=e|0;t=t|0;n=n|0;r=+r;K(19)}function iA(e,t,n,r,i,o){e=e|0;t=t|0;n=Y(n);r=r|0;i=Y(i);o=o|0;K(20)}function oA(e,t,n){e=e|0;t=t|0;n=n|0;K(21)}function uA(){K(22)}function aA(e,t,n){e=e|0;t=t|0;n=+n;K(23)}function lA(e,t){e=+e;t=+t;K(24);return 0}function sA(e,t,n,r){e=e|0;t=t|0;n=n|0;r=r|0;K(25)}var cA=[Bx,DE];var fA=[jx,qi];var dA=[Ux,yo,_o,bo,wo,Eo,Do,So,ko,To,Ao,Oo,Po,Io,No,Mo,Ro,Fo,Lo,Ux,Ux,Ux,Ux,Ux,Ux,Ux,Ux,Ux,Ux,Ux,Ux,Ux];var pA=[zx];var hA=[Wx,zT,hl,vl,ml,Kd,Xd,Qd,yb,_b,bb,oE,uE,aE,uk,ak,lk,bt,Xi,to,Co,xo,ju,Uu,Ka,Sl,Wl,ps,Ns,rc,kc,qc,df,Mf,Zf,yd,Ld,gp,Fp,th,bh,jh,iv,kv,Vv,am,xm,Wi,cg,Ag,Qg,yy,Fy,o_,g_,b_,U_,H_,ab,Db,kb,Gb,pw,Cl,OD,pS,PS,KS,bC,BC,XC,ZC,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx,Wx];var vA=[Hx,no,ro,uo,ao,lo,so,co,fo,vo,mo,go,eu,ru,iu,ou,uu,au,lu,pu,gu,Ku,Ov,$v,Ey,ND,ww,eS,Hx,Hx,Hx,Hx];var mA=[Vx,Yk,Ki,zo,qo,Go,$o,Yo,Ko,Xo,Jo,Zo,hu,vu,zu,Pm,Uy,Kb,BD,UD,Vx,Vx,Vx,Vx,Vx,Vx,Vx,Vx,Vx,Vx,Vx,Vx];var gA=[qx,Wu];var yA=[Gx,cb];var _A=[$x,Kk,Xk,nT,ac,wp,hg,ZS];var bA=[Yx,rd];var wA=[Kx,tu,nu,su,Hu,Vu,qu,Gu,$u,Yu,Kx,Kx,Kx,Kx,Kx,Kx];var EA=[Xx,p_];var DA=[Qx,WT,mu,tl,gs,Oc,Kc,zd,Up,fm,Gi,RS,Qx,Qx,Qx,Qx];var SA=[Jx,Gl];var CA=[Zx,SC];var kA=[eA,cu,Xu,Qu,Ju,Ed,eA,eA];var TA=[tA,Zu,$i,Ui,C_,$_,Pb,rk];var xA=[nA,Fr];var AA=[rA,Sh];var OA=[iA,_u];var PA=[oA,Wo,Qo,fu,du,Ls,mf,Hh,lv,Vi,JE,gS,WC,oA,oA,oA];var IA=[uA];var NA=[aA,io,oo,po,ho,Bo,jo,Uo,oh,Ng,l_,aA,aA,aA,aA,aA];var MA=[lA,vb];var RA=[sA,Bf,jm,ty,Ky,P_,Z_,Bb,yw,qD,hk,sA,sA,sA,sA,sA];return{_llvm_bswap_i32:fx,dynCall_idd:Fx,dynCall_i:Ax,_i64Subtract:ZT,___udivdi3:ax,dynCall_vif:px,setThrew:mt,dynCall_viii:Nx,_bitshift64Lshr:rx,_bitshift64Shl:nx,dynCall_vi:mx,dynCall_viiddi:kx,dynCall_diii:Ex,dynCall_iii:Cx,_memset:tx,_sbrk:lx,_memcpy:ix,__GLOBAL__sub_I_Yoga_cpp:ji,dynCall_vii:gx,___uremdi3:cx,dynCall_vid:hx,stackAlloc:dt,_nbind_init:Ak,getTempRet0:yt,dynCall_di:Dx,dynCall_iid:Sx,setTempRet0:gt,_i64Add:ex,dynCall_fiff:vx,dynCall_iiii:wx,_emscripten_get_global_libc:$k,dynCall_viid:Rx,dynCall_viiid:Px,dynCall_viififi:Ix,dynCall_ii:yx,__GLOBAL__sub_I_Binding_cc:wD,dynCall_viiii:Lx,dynCall_iiiiii:Ox,stackSave:pt,dynCall_viiiii:dx,__GLOBAL__sub_I_nbind_cc:ea,dynCall_vidd:bx,_free:Gk,runPostSets:JT,dynCall_viiiiii:Tx,establishStackSpace:vt,_memmove:sx,stackRestore:ht,_malloc:qk,__GLOBAL__sub_I_common_cc:iw,dynCall_viddi:_x,dynCall_dii:xx,dynCall_v:Mx}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer),_llvm_bswap_i32=Module._llvm_bswap_i32=asm._llvm_bswap_i32,getTempRet0=Module.getTempRet0=asm.getTempRet0,___udivdi3=Module.___udivdi3=asm.___udivdi3,setThrew=Module.setThrew=asm.setThrew,_bitshift64Lshr=Module._bitshift64Lshr=asm._bitshift64Lshr,_bitshift64Shl=Module._bitshift64Shl=asm._bitshift64Shl,_memset=Module._memset=asm._memset,_sbrk=Module._sbrk=asm._sbrk,_memcpy=Module._memcpy=asm._memcpy,stackAlloc=Module.stackAlloc=asm.stackAlloc,___uremdi3=Module.___uremdi3=asm.___uremdi3,_nbind_init=Module._nbind_init=asm._nbind_init,_i64Subtract=Module._i64Subtract=asm._i64Subtract,setTempRet0=Module.setTempRet0=asm.setTempRet0,_i64Add=Module._i64Add=asm._i64Add,_emscripten_get_global_libc=Module._emscripten_get_global_libc=asm._emscripten_get_global_libc,__GLOBAL__sub_I_Yoga_cpp=Module.__GLOBAL__sub_I_Yoga_cpp=asm.__GLOBAL__sub_I_Yoga_cpp,__GLOBAL__sub_I_Binding_cc=Module.__GLOBAL__sub_I_Binding_cc=asm.__GLOBAL__sub_I_Binding_cc,stackSave=Module.stackSave=asm.stackSave,__GLOBAL__sub_I_nbind_cc=Module.__GLOBAL__sub_I_nbind_cc=asm.__GLOBAL__sub_I_nbind_cc,_free=Module._free=asm._free,runPostSets=Module.runPostSets=asm.runPostSets,establishStackSpace=Module.establishStackSpace=asm.establishStackSpace,_memmove=Module._memmove=asm._memmove,stackRestore=Module.stackRestore=asm.stackRestore,_malloc=Module._malloc=asm._malloc,__GLOBAL__sub_I_common_cc=Module.__GLOBAL__sub_I_common_cc=asm.__GLOBAL__sub_I_common_cc,dynCall_viiiii=Module.dynCall_viiiii=asm.dynCall_viiiii,dynCall_vif=Module.dynCall_vif=asm.dynCall_vif,dynCall_vid=Module.dynCall_vid=asm.dynCall_vid,dynCall_fiff=Module.dynCall_fiff=asm.dynCall_fiff,dynCall_vi=Module.dynCall_vi=asm.dynCall_vi,dynCall_vii=Module.dynCall_vii=asm.dynCall_vii,dynCall_ii=Module.dynCall_ii=asm.dynCall_ii,dynCall_viddi=Module.dynCall_viddi=asm.dynCall_viddi,dynCall_vidd=Module.dynCall_vidd=asm.dynCall_vidd,dynCall_iiii=Module.dynCall_iiii=asm.dynCall_iiii,dynCall_diii=Module.dynCall_diii=asm.dynCall_diii,dynCall_di=Module.dynCall_di=asm.dynCall_di,dynCall_iid=Module.dynCall_iid=asm.dynCall_iid,dynCall_iii=Module.dynCall_iii=asm.dynCall_iii,dynCall_viiddi=Module.dynCall_viiddi=asm.dynCall_viiddi,dynCall_viiiiii=Module.dynCall_viiiiii=asm.dynCall_viiiiii,dynCall_dii=Module.dynCall_dii=asm.dynCall_dii,dynCall_i=Module.dynCall_i=asm.dynCall_i,dynCall_iiiiii=Module.dynCall_iiiiii=asm.dynCall_iiiiii,dynCall_viiid=Module.dynCall_viiid=asm.dynCall_viiid,dynCall_viififi=Module.dynCall_viififi=asm.dynCall_viififi,dynCall_viii=Module.dynCall_viii=asm.dynCall_viii,dynCall_v=Module.dynCall_v=asm.dynCall_v,dynCall_viid=Module.dynCall_viid=asm.dynCall_viid,dynCall_idd=Module.dynCall_idd=asm.dynCall_idd,dynCall_viiii=Module.dynCall_viiii=asm.dynCall_viiii,initialStackTop;function ExitStatus(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}Runtime.stackAlloc=Module.stackAlloc,Runtime.stackSave=Module.stackSave,Runtime.stackRestore=Module.stackRestore,Runtime.establishStackSpace=Module.establishStackSpace,Runtime.setTempRet0=Module.setTempRet0,Runtime.getTempRet0=Module.getTempRet0,Module.asm=asm,ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var preloadStartTime=null,calledMain=!1;function run(e){function t(){Module.calledRun||(Module.calledRun=!0,ABORT||(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(e),postRun()))}e=e||Module.arguments,null===preloadStartTime&&(preloadStartTime=Date.now()),runDependencies>0||(preRun(),runDependencies>0||Module.calledRun||(Module.setStatus?(Module.setStatus("Running..."),setTimeout((function(){setTimeout((function(){Module.setStatus("")}),1),t()}),1)):t()))}function exit(e,t){t&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,EXITSTATUS=e,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(e)),ENVIRONMENT_IS_NODE&&process.exit(e),Module.quit(e,new ExitStatus(e)))}dependenciesFulfilled=function e(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=e)},Module.callMain=Module.callMain=function(e){e=e||[],ensureInitRuntime();var t=e.length+1;function n(){for(var e=0;e<3;e++)r.push(0)}var r=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];n();for(var i=0;i0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),run()},void 0===(__WEBPACK_AMD_DEFINE_RESULT__=function(){return wrapper}.apply(exports,__WEBPACK_AMD_DEFINE_ARRAY__=[]))||(module.exports=__WEBPACK_AMD_DEFINE_RESULT__)},3019:e=>{"use strict";e.exports={ALIGN_COUNT:8,ALIGN_AUTO:0,ALIGN_FLEX_START:1,ALIGN_CENTER:2,ALIGN_FLEX_END:3,ALIGN_STRETCH:4,ALIGN_BASELINE:5,ALIGN_SPACE_BETWEEN:6,ALIGN_SPACE_AROUND:7,DIMENSION_COUNT:2,DIMENSION_WIDTH:0,DIMENSION_HEIGHT:1,DIRECTION_COUNT:3,DIRECTION_INHERIT:0,DIRECTION_LTR:1,DIRECTION_RTL:2,DISPLAY_COUNT:2,DISPLAY_FLEX:0,DISPLAY_NONE:1,EDGE_COUNT:9,EDGE_LEFT:0,EDGE_TOP:1,EDGE_RIGHT:2,EDGE_BOTTOM:3,EDGE_START:4,EDGE_END:5,EDGE_HORIZONTAL:6,EDGE_VERTICAL:7,EDGE_ALL:8,EXPERIMENTAL_FEATURE_COUNT:1,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:0,FLEX_DIRECTION_COUNT:4,FLEX_DIRECTION_COLUMN:0,FLEX_DIRECTION_COLUMN_REVERSE:1,FLEX_DIRECTION_ROW:2,FLEX_DIRECTION_ROW_REVERSE:3,JUSTIFY_COUNT:6,JUSTIFY_FLEX_START:0,JUSTIFY_CENTER:1,JUSTIFY_FLEX_END:2,JUSTIFY_SPACE_BETWEEN:3,JUSTIFY_SPACE_AROUND:4,JUSTIFY_SPACE_EVENLY:5,LOG_LEVEL_COUNT:6,LOG_LEVEL_ERROR:0,LOG_LEVEL_WARN:1,LOG_LEVEL_INFO:2,LOG_LEVEL_DEBUG:3,LOG_LEVEL_VERBOSE:4,LOG_LEVEL_FATAL:5,MEASURE_MODE_COUNT:3,MEASURE_MODE_UNDEFINED:0,MEASURE_MODE_EXACTLY:1,MEASURE_MODE_AT_MOST:2,NODE_TYPE_COUNT:2,NODE_TYPE_DEFAULT:0,NODE_TYPE_TEXT:1,OVERFLOW_COUNT:3,OVERFLOW_VISIBLE:0,OVERFLOW_HIDDEN:1,OVERFLOW_SCROLL:2,POSITION_TYPE_COUNT:2,POSITION_TYPE_RELATIVE:0,POSITION_TYPE_ABSOLUTE:1,PRINT_OPTIONS_COUNT:3,PRINT_OPTIONS_LAYOUT:1,PRINT_OPTIONS_STYLE:2,PRINT_OPTIONS_CHILDREN:4,UNIT_COUNT:4,UNIT_UNDEFINED:0,UNIT_POINT:1,UNIT_PERCENT:2,UNIT_AUTO:3,WRAP_COUNT:3,WRAP_NO_WRAP:0,WRAP_WRAP:1,WRAP_WRAP_REVERSE:2}},6401:(e,t,n)=>{"use strict";var r=n(7180),i=n(3354),o=!1,u=null;if(i({},(function(e,t){if(!o){if(o=!0,e)throw e;u=t}})),!o)throw new Error("Failed to load the yoga module - it needed to be loaded synchronously, but didn't");e.exports=r(u.bind,u.lib)},7180:(e,t,n)=>{"use strict";var r=Object.assign||function(e){for(var t=1;t"}}]),e}(),s=function(){function e(t,n){u(this,e),this.width=t,this.height=n}return i(e,null,[{key:"fromJS",value:function(t){return new e(t.width,t.height)}}]),i(e,[{key:"fromJS",value:function(e){e(this.width,this.height)}},{key:"toString",value:function(){return""}}]),e}(),c=function(){function e(t,n){u(this,e),this.unit=t,this.value=n}return i(e,[{key:"fromJS",value:function(e){e(this.unit,this.value)}},{key:"toString",value:function(){switch(this.unit){case a.UNIT_POINT:return String(this.value);case a.UNIT_PERCENT:return this.value+"%";case a.UNIT_AUTO:return"auto";default:return this.value+"?"}}},{key:"valueOf",value:function(){return this.value}}]),e}();e.exports=function(e,t){function n(e,t,n){var r=e[t];e[t]=function(){for(var e=arguments.length,t=Array(e),i=0;i1?t-1:0),i=1;i1&&void 0!==arguments[1]?arguments[1]:NaN,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:NaN,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:a.DIRECTION_LTR;return e.call(this,t,n,r)})),r({Config:t.Config,Node:t.Node,Layout:e("Layout",l),Size:e("Size",s),Value:e("Value",c),getInstanceCount:function(){return t.getInstanceCount.apply(t,arguments)}},a)}},2357:e=>{"use strict";e.exports=require("assert")},6417:e=>{"use strict";e.exports=require("crypto")},8614:e=>{"use strict";e.exports=require("events")},5747:e=>{"use strict";e.exports=require("fs")},8605:e=>{"use strict";e.exports=require("http")},7211:e=>{"use strict";e.exports=require("https")},2282:e=>{"use strict";e.exports=require("module")},1631:e=>{"use strict";e.exports=require("net")},2087:e=>{"use strict";e.exports=require("os")},2413:e=>{"use strict";e.exports=require("stream")},4016:e=>{"use strict";e.exports=require("tls")},3867:e=>{"use strict";e.exports=require("tty")},8835:e=>{"use strict";e.exports=require("url")},8761:e=>{"use strict";e.exports=require("zlib")}},__webpack_module_cache__={};function __webpack_require__(e){if(__webpack_module_cache__[e])return __webpack_module_cache__[e].exports;var t=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e].call(t.exports,t,t.exports,__webpack_require__),t.loaded=!0,t.exports}return __webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var n in t)__webpack_require__.o(t,n)&&!__webpack_require__.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),__webpack_require__(7560)})();
return plugin;
}
-};
\ No newline at end of file
+};
diff --git a/tgui/.yarn/releases/yarn-2.4.1.cjs b/tgui/.yarn/releases/yarn-2.4.1.cjs
deleted file mode 100644
index 65ec5dde197..00000000000
--- a/tgui/.yarn/releases/yarn-2.4.1.cjs
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/usr/bin/env node
-module.exports=(()=>{var e={25545:e=>{function t(e){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}t.keys=()=>[],t.resolve=t,t.id=25545,e.exports=t},44692:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>g});var A=r(54143);const n={optional:!0},o=[["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:n,zenObservable:n}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:n,zenObservable:n}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{"supports-color":n}}],["got@<11",{dependencies:{"@types/responselike":"^1.0.0","@types/keyv":"^3.1.1"}}],["cacheable-lookup@<4.1.2",{dependencies:{"@types/keyv":"^3.1.1"}}],["http-link-dataloader@*",{peerDependencies:{graphql:"^0.13.1 || ^14.0.0"}}],["typescript-language-server@*",{dependencies:{"vscode-jsonrpc":"^5.0.1","vscode-languageserver-protocol":"^3.15.0"}}],["postcss-syntax@*",{peerDependenciesMeta:{"postcss-html":n,"postcss-jsx":n,"postcss-less":n,"postcss-markdown":n,"postcss-scss":n}}],["jss-plugin-rule-value-function@<=10.1.1",{dependencies:{"tiny-warning":"^1.0.2"}}],["ink-select-input@<4.1.0",{peerDependencies:{react:"^16.8.2"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:n}}],["reactcss@*",{peerDependencies:{react:"*"}}],["react-color@<=2.19.0",{peerDependencies:{react:"*"}}],["gatsby-plugin-i18n@*",{dependencies:{ramda:"^0.24.1"}}],["useragent@^2.0.0",{dependencies:{request:"^2.88.0",yamlparser:"0.0.x",semver:"5.5.x"}}],["@apollographql/apollo-tools@*",{peerDependencies:{graphql:"^14.2.1 || ^15.0.0"}}],["material-table@^2.0.0",{dependencies:{"@babel/runtime":"^7.11.2"}}],["@babel/parser@*",{dependencies:{"@babel/types":"^7.8.3"}}],["fork-ts-checker-webpack-plugin@*",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4"},peerDependenciesMeta:{eslint:n}}],["rc-animate@*",{peerDependencies:{react:"^15.0.0 || ^16.0.0","react-dom":"^15.0.0 || ^16.0.0"}}],["react-bootstrap-table2-paginator@*",{dependencies:{classnames:"^2.2.6"}}],["react-draggable@<=4.4.3",{peerDependencies:{react:">= 16.3.0","react-dom":">= 16.3.0"}}],["apollo-upload-client@<14",{peerDependencies:{graphql:"14 - 15"}}],["react-instantsearch-core@<=6.7.0",{peerDependencies:{algoliasearch:">= 3.1 < 5"}}],["react-instantsearch-dom@<=6.7.0",{dependencies:{"react-fast-compare":"^3.0.0"}}],["ws@<7.2.1",{peerDependencies:{bufferutil:"^4.0.1","utf-8-validate":"^5.0.2"},peerDependenciesMeta:{bufferutil:n,"utf-8-validate":n}}],["react-portal@*",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}]];let i,s,a;const c=new Map([[A.makeIdent(null,"fsevents").identHash,function(){return void 0===i&&(i=r(78761).brotliDecompressSync(Buffer.from("G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==","base64")).toString()),i}],[A.makeIdent(null,"resolve").identHash,function(){return void 0===s&&(s=r(78761).brotliDecompressSync(Buffer.from("G1QTIIzURnVBnGa0VPvr81orV8AFIqdU0sqrdcVgCdukgAZwi8a50gLk9+19Z2NcUILjmzXkzt4dzm5a6Yoys+/9qnKiaApXukOiuoyUaMcynG4X7X4vBaIE/PL30gwG6HSGJkLxb9PnLjfMr+748n7sM6C/NycK6ber/bX1reVVxta6W/31tZIhfrS+upoE/TPRHj0S/l0T59gTGdtKOp1OmMOJt9rhfucDdLJ2tgyfnO+u4YMkQAcYq/nebTcDmbXhqhgo6iQA4M3m4xya4Cos3p6klmkmQT+S4DLDZfwfMF+sUCx36KleOtaHLQfEIz0Bmncj/Ngi3lqOl4391EWEfIss6gVp3oDUGwsSZJKeOVONJWZg+Mue3KUMV3aMqYJ+7b2219D+GFDi8EV5y/Y+5J+He0oNjKAgqLsJziEsS9uIaCu3BHBKSXxNKKa2ShbfglcWoiiVT2kfGI7Gw+YJ/Sqy1H6wdFWtyVUQIa82JPwbeV25YKLzc5ZIFM6GCPSA+J9dTvJbs5LuuKnLP3f09gCu2jxqsAv6CA+ZySVaUJr2d3A70BC/uBCKr2OVrWgC3fSwb7NlfkgSEEiejrMGvhya9lMbVI6lMsFKN330A1/FOaefHQdNGLEZ3IwFF87H3xVlM0Xxsmbi/7A60oymRcIe0tH90alG6ez/yA7jwYotxuHWZdR+1HlMcddGHAV6QD/gXYPV0wnNv47I+5FGevzZFMqWSO8GU4nQ3FjsdgdJcD+c1rvudERKuLyd7bxiBpnsMDHsvPP4nXdXkld/gUNks3GAE1Otmb90bavDyiw4Mrx496Iw+jbLTgsCZGZXSZ9vM55C7KGe4HyJAKXEk0iT/Cj/PFwLJBN7pcP7ZFfYtUApGTWKkYhI9IE2zt/5ByH72wdvH+88b71zuv/FMCX3w6x5nzhY44Cg5IYv9LeKwHuHIWgPbfgrAcUxOlKkPRdQOIDF/aBuLPJAXD+TgxCNXx4jQxeR/qlBWVikFPfEI4rXMUc4kZ2w9KbPKYRvFUag0dVlVoyUP4zfidbTXAdZF88jAckl+NHjLFCNdX7EQ1PbLSOl+P+MqgwEOCi6dxgWZ7NCwJBjWKpk1LaxwKrhZ4aEC/0lMPJYe5S8xAakDcmA2kSS86GjEMTrv3VEu0S0YGZcxToMV524G4WAc4CReePePdipvs4aXRL5p+aeN96yfMGjsiTbQNxgbdRKc+keQ+NxYIEm1mBtEO29WrcbrqNbQRMR66KpGG4aG0NtmRyZ2JhUvu0paCklRlID8PT3gSiwZrqr4XZXoBBzBMrveWCuOg7iTgGDXDdbGi8XHkQf5KXDGFUxWueu5wkSa6gMWY1599g2piQjwBKIAPt4N5cOZdFBidz2feGwEAy1j1UydGxDSCCUsh314cUIIRV/dWCheceubL2gU8CibewmP7UxmN5kN4I7zfQhPxkP0NCcei8GXQpw4c3krEzW7PR2hgi/hqqqR58UJ/ZVfWxfcH5ZKMo4itkmPK0FCGxzzIRP20lK/gz28Y03sY233KvSVWUKl9rcbX6MbHjpUG8MvNlw72p6FwTejv92zgpnCxVJnIHHZhCBxNcHF5RTveRp513hUtTHHq4BIndlytZT5xoTSYfHKqKNr4o9kcGINIz6tZSKRdtbON3Ydr9cgqxHIeisMNIsvPg/IFMZuBbSqqDLeSO5dak1cGr76FtH2PC7hs0S0Oq3GsmF1Ga4YABAMGcdPAWzTk26B7cKV91I2b0V/GYvnsEQ1YGntRqi5EQqTlgZszbV/32GuZtUF49JOA/r4jAdwUOsbPo6mNoBlJPYjM5axrZaWQf33bFsLWqiyvvDOM4x0Ng802T7cuP2a3q98GWq6yiq6q3M77hcZlOUnmryctRYmI4Hb2F5XixFohkBmySCjU+M7/WQVE5YAtnlxiUJDhFN0y1tNeMWY9E0MfZi2rQ4eC72WXjsAA==","base64")).toString()),s}],[A.makeIdent(null,"typescript").identHash,function(){return void 0===a&&(a=r(78761).brotliDecompressSync(Buffer.from("W1w+GkWwcQCPbZnUKPI4CFN/7EyEjZic7gS0LuAO0yfO0XnBUqmjRfsndcrEHKBP46+kNRcXE9T69UCzOMQD2EWA28SPiEUXz6UxaKl+dNhtngmN0KaY5gpIi1/+TP/v5+ul7zo6uRXScKu4Va6wcMpgwWjlQmZyLR397/MiXMMwmQ2WvoleaS23WLFmcLXTID0zCnXDyL3LdHSWRzWaZNoLpQ9ftzCssvn5UUSQrkz2sjzf3FK1NFu+8MED3YPNhfn/v5/12R4CVF9IQuGG7fgP2feee7pDDUmqVieV+oB0zrn3vaTyUtWAVR8A1BCrGaPH2BFy2OkUfQTXowAdqflCqJlUTVednHQBLhT0zgNplLM1/LC3YUtdVskGoP/n5IyllimTGsG0NiyeBsnDvH4hH244pgDEQlJuVFqDssvZiI4GfTjk18cws931bs/fNgZQUYmiSRwdZE7xvHTIs32JGu2uwAFKZKNm70VPRJNCpGAyptX+XMo0EYIMW+yfv/zpskSSzFwETa/caJp1bP8q7M9KD+vPBeP7ltn/S/T63wuZer7nGibzgC/N86sEdD34FbrYIfv5F55+7bVf/STBcAM9rTWWnzIYiKTay4uuRz9aDz1HiI/TeSXrj01C7+4FeNlKohYUwh1qXjemQMsA7KWH4IRDSrz8UaMQ5e6niK87ZFzvWB+6cn6IpWkrDPYI+LccLeGDX/DjRmmXLSGqSbu/WWcMAapgUUR9G3oqqY9mKz+GXe1HPlxFqBRbdhzQbxghtNtlE5TL2qkf5+arA/5VdO5ZrOH+kWjf6tx/bbXyNntYEVEl+ucEeht+7F++iVCO3lpE64CAVx7+6FNBcAO3m1AB0mTOMwIUDj1x5S+ma30rDtHMWY+KOF6d3arYY4j+tx008aAsS5fNfP1+ykdDDgYoJD9pHr+K2Wh5m1MFc/Vap0k8uXi1iivbu2CuV+oLD00s3gdd7XTaHBIYzGLjy5SjHbYO6IkbTFtHzlwfqdIsdb8CjpaChourHi63UT1gaCFBIvQr/kKbKcUX4sdOFDKI8N/kaaISAVtiu356imQHboaw4apcePacaTwFAXdejxkgicEn0wRpVzhZd1W/sUByw4X7rqPMIVlhS+3o+8I9djctba2396mLfpdNnSzoN2QyZ2A9PzEPmLs+x3EUNH4EPic+KYDtCNNEYKJMwupjr9W6GNPhTs877JpSFYGxiAzFfKZINCng6GQoGbMHX3gxgznmtgDV+apTCz9MzBpe7pUioV6Ckv4bpmXPikXOg2pfxpNn+RhLxQwsU0Y0ILkRGUFsbWdIc3MPVC9Kyp+aRSH7ufRUV5irDZgCzr4oF+ZQpAwLv3hrwX+/c/cqxIsw6oUQcXFCySTK+ZACOwcZm4FwOcoRDlGTdERvi5xePFkjoBz0OrUmoCAB7eRjBm93fmb4Fi/jmDrfAFXG2ryCdGVfkJzOap1qqXsmQgAFjf3UMIyX60yCl5nrZ4RA6PYYoDKP/gabiPKtkHDEzEO2N389febkiCRZPiTlI7Z5fXzo/E+8tKZXrtDRd+fozGKAfMg8l9FbZhHMX+w/2rlggkIouL4LpXxB1PzweCqhj5rdeIremOt1ZKHAU8+547LJnpRQG02p8tMmMeGSuOvsqP6O1KVyB6SWvcw5rFKW87N42c2myjca3Vjt2LMkPrbz9FfYmJJLlI18upFczbc51+dTdxUx0cpNkFIMiBjru9+tXzGHQ+HMT7nsNVfkJjW/asI0WVmvLJzcuDluyz8h+8UGZTQXExSCw9O9kD3lZk+1eXswBd0jthuq+4hm3vQtqQIMtbejHjQCISfPOGFyjjlaEo41utZWunTOz3N1DRK7ho8np0bv4fCTIAOy9+JiaumSo8+7H0Cg4CIICjqp15L84qMQ477qLQeW5Zed2Xn+9DKSxHFYu4UQ1rnFbCIX12+1NScfCujiTVYtcppJAPj2DB27ctiNSLf1bRSbEHmzLwqM7HW7Kn9vzUf+hTRQ6iQ2y3RGUnoanyvESLRxOVNTWrcCY9dXv1/bq+GkwMXbo5PGVYnb9Q/sOq+tpVsOvJnt2nBnq4LIHT6EBYTZXoUHez41cJszqbPoyz4pJMX8nhKFI5dbWls7fpPbVaIrqhkgvkkvuK3oqTbQkKv6RXiUULEgyC6NHvFlAgL0EdVIbMQG+1byGiYRtq31I5U77Cpc7VonG7oPgiYbfuXCAZXXVrmk85BCObe1DRj3obm9xwDY69ZKCemnOlGBkB6+LbAIoGBk34KATc8ktyyoxmtdCjnJ7Uhgihw+QWZzRJwQBSY7Z0R8HeEQ/pUvl6RzCrMFI0lmjTh7pK2cvW4G6APAhAoHu8TlVeL1DJOBqW66oRjtC5VEoig3xg7ybQmx9h3fSCQaefhZbunZbf1DS/YZFSuHZlh+aMb8x5C5uUcv8YLJpUlnNB79aJPt771o4XlpExDHD04Rsfgk/SUwiL5rllcbL9XpCrHVOBZhNNfXqMlDOJjL9sbALIiYV02uk14sOY/JoPnJx8sxIIY+iFouatS7AU//Cw17qSa2uWodwFjeY1/Ouw2iv29QLUKWg77BKwnwPHPf45VFu9dPABATrZ2P/YEYy33tjHJfD6u90W/bqk3fX67VYKbktMpAGbZ6VdPuu4lUg/63irWRiCMtozcM3sCql/Vxdf/mjGFVpYgmoXp4LacW0hWoYnW4sBOVw/FbgOLMCvl4Thg9D21xyqGHeHgQ2H0YPnZTi+7u1P0Lx3nCKpyVVZtEkJs7Mpri/iRBd18aEFdTbzQF37AgVmn9PNUUNNblFpPzuTnvfRrqz9mF1OV9Eu/Ncj7DlxeIc69Q/r53Wdfn5rwffHYx/HsU9ZMIFbra7eRKVJ4zPP8v2ESdKxoFDoYPwNt++y4sU9TJCmvc61y8ecV7Bil1/BWMH2hsRJDvsPXnVtVkKwb6fg20IT9+DLzTx/y3SJrsLIlt/LONXfOiOMjG9riLVagboHG8mPzmewlQWLFvL6NciWO+hcP2lyr+gXx8c70MGCBwKmelr67I0cUzYBlnu2J90JEhPDtT0E57XgAxYO0fVdJSS/MtxQONPfnPBMNY424/sGnpB12aa/FdB3E+7XdOTvtHn61T0MwHh0GtgdgGg18//zwFDcQ9Y6rFZnuyndmycJnWnEz9D7lV2V7IjcvT6GSgxx9E4VjoowXhIEAQtDGPdhA0NcPQhQsAhJnxrsiFLmyBhdW+i5cCJ60RAFiJKq3ePwMDl3ng+8BgpoXv2c3QozfwvNiPvuC3A295+FxgK0PEiQsAIIAZW1gNaNvtNKDX9QgA8AgSmo2yl4P5wGamA6hHL+DYgRemwp8KnjGO3RzcowQrAGznF3/586f/XkYv2IN55GxgOdNm+uBCxtHal2+dmeFPCMboO4IBbRcuAGDT9F1R2GnAyGqf4N2Ji7RGACAaL8IxfVUod2J3/D1eh1/Ulq++EBXu3el1SgYAQJshkP+f67/+7Pz/Y3Rj3KKrny0TjGpV2VFcMKiaXw8G0B5S8pOcbh/N5gvu8IQvrK3tdeotAEDDjLJ4IrIxlir5hDRvTpOsEHZdquzuDth7/rlMAMBCQdNCjD9U08CcebX5TOUISzQxw6LTFgAoctVpw+KqS7RHNeZcqbRLAKBFleRw5DMVOO2/2l6HNoLCYqbXKWwBADsZbWwLYwG21l6bmDKAN60RAChFEdGYhvcCel+cBttJND32cnSl8ioA7Ga50Yxr9No07X0tHwX9N4GPbETVbzNfTZUtALA4Ntxow+AqJ9uPyopxldWNAIDGimRM4+ERcf463QkjY5fMa2K+KsaoSa9TMgAA2pUeqHGzZ4qfreJJbCUzttt3ANkM+xz0Nn4I6yvTOxeLcn9g9IQf2OXudeotAEAxy3kaN9tbDEYNT1ob0Nhq1+FdLxepmQBARO8gIuBv0vaTCeqJtxztcRrDsgsXACjTdLsgbBSetbxo7SfvejkplwDAaemzDxdf44S/VM/f1/5yFBesdeECALV4bvGiCUeeRY7WbnnX5KRsAgAWbQmbrngnXi01Kb39aXSXEqwAcJ3laonKN6Hx3plriPuM0J+oz9LYK5V4pMYFAFbMvlLWcIerqLmbq5jWCACY0PqYQkV37mmlpNS9KjFXIz4uCdxPqgTTUXqcYZu8waKpOxLI6JuC/V5ksD0JpWyHgyT1poEBU9LhF8KTrthVERadLLToCjoSr958kVOhYyzBcDVw5Ndnl0fn5/E7Uu1lV2uJv/V6oe8Tr7qIGZ/FXyhwbF0IGcm+PWuvDt43oObzo4dN3gbiB9M4AOe3H/NxCh7619L5VVqzxfL2JmJ5fXXv4zJ3IY0ErqSfJ7PtGEktqiboa5y/Q52IEn0P8mYMFxAe3t4u3ax2+SY5p5obSRj3F+6kvjC9qstmdnG7T+TjF7+r5nWaYxkFSAEDL3fLK/8bzW6MQwOFhyLVtdnHxsg+EIYpRuoyY6edsN2djKfaEzMckzlI95n3WEGyGlfHyFw4JOw9rTtLtN+bxrAGyEVDdGnVWK8YSwreubXAB1qsoatSBnTTKcv456EvBhSCO17tehk/PyuIBT4gaucnrjhnAPp7DuQisGahq4p0/CRE/HG1qLo0Q7iA0XvTHate9Dh29ogluynBd/gx5I7DbX3w4L2QsEMuP+XCF6UNYcnOuVsGRukgCilp3TSNNF4kUQURoktlSM6Dj9DSUGOUWiwwpKGyzHE//CxgDPBxPyUCGZrxW4ZlkdRgBUIWbF9mG00rsSUy1obI/qbMIZGfjC9yukfd9UhoYUpvDaHjO7hG44Udz7OeR/Zrp5E8nwR3/1mnSuXjfgHEl4mcT17VGU0cOniN9XdALACmBu18UycBEU5/pPKjLXL8Q0E6pTHlrFbyiFBtlJgNfKzYJzHay9Kc+s2DGBwIvDCqj8cn5nS8lm1cXyBfd3l18QmRuiyQWmQPMjmfJRBeP9rxQv8T6fhQUanWZstFi3aNN3DO+9TBG6bDVxnspz4XBtWiwsbVN6cwY0K9j4kJbMPLcTQMP1xKAgAb9mZcea1MX1oXNVeNS882t2HwumNLuGhFk375yWps2MeYtH3cXRYuWv21UwDEy3Jjr+sURkgo45Os3/LkY77VdRKARZNJS1UOZlJH1uwIMIM7bNKYPM9JOMaFgmZh1nSG8aZRChKaLItYBTyOWP8iMV0NWwf1Z7ZMxoZMphQGQkIO6Fp0Xe7ye5npMRFVjzaN5ETLVKiKQzHBu3ocLSODGbF6kZHa7SO+jsz7aO3+EV/zf4/VlfCSRx7ICP5hxjqU7DgTq1gktzOL777yk/gmO5RjY62fRfif39YGBi2J1YKBiTkT14Mh6Ncog6LCearFt3pYpJMTu2QXxjvdtlVY8J4HxBG2V1f2QOKHq5OFB7xo2WT34wIQ0esyQTjlkE/HgAypV1iiWWLHxW/iiB3m6+y+IS3LoAZ+mOEa2qatUK+ZFFyxJj0Wk1E2ZTr16UcSEvwn+rjUyN0k48p8Xm/0iPXaCbDSJTZuDcWySeTCid67IarLslDs7ZpwAC6hcs8eFiZe+um1sdkTCpNjdHG3N1f23j4UwxkLWmaTLbLxSTGDnktFEdfkVKrzmol49ZZRVnafOxvtjROKpRG3N1N2Cnjahr6K09GoGG8UzjazD6J3ZJS7JHKls5Wuex1VarJDBWNdiV8Jelgy9BIChq3EbTUCjo6UBRzCO7Dn86RqagkXvhYr1sMyo0wb/byZo8QspZN/ZOft1AjjBv90LL0vKNKpidcs+MzVW39s44JVOZ6yV4iPPVimkIuasd+2lBNGNXu/RACmVL64PGoiuNbUZjVaz2R1xq4zoVEy9Jiq7kyHJ+g+JVP3mkUMdaVpAIYVYKDGZ5TMAID6i4ZGFz71SWuX+pWiCQBIQDHlDsCTJXDgJvJc0rcnbiSTkib1IrmQjbqDrcdknqx7tSO6zTQqhrUCRNzMAMCQvqJI0o6D1r7B5OuXQxMAWH0DZ1N+BUBnCvSx38rs8wLvsp6KRFOoW92ZnCF68OpeuygxFQCzmsgKEa47efretdO61yaBOU2j1rDWAm0nMwDgY6Co5ZLCCmS1s9QnhyYAkBLYMeUawDobQEJWbFmWkvaP2a93BezvXbyp5e7g/7U4LIj7cYjwxOHKaQYAHIRZnnyCXXlnjs8FSLudBPNOc/MZED4dsVaP5cXApLp9EGJw2OvAmIBdscLuuemG2cHCyKyx7Bml78kupF8cDgybmXnIHz0cVVRUjK803dX5Qab7hSkmaMmHycio6VxwM4+I5V2nzLNXMi0r0EAliMp584sZIc1b8hU7xR8Z5qMzAZGlBdy/OvvIhJWYF1P9mDSjL7LsmKaBIBWXs1+1n1CDTmvK8DKnx4KmYSIVJBK3pMLgUPn/ngu4ZW+Y4jBBKYUSvZ0qe5CDUHn06sFL8eqdg92tKUkezfWR+WzUPH7wZSbPmcCWIsOwqjOiWR43yt6uFtUsq6HBLMXzruosfbKTmCCT5jiW6em5ojGzigzj0oFo9x/sEb00a1t7+t9DeBZ1x5lPQEnvWNfMCgnzM42+1LxOp6+yONAw7UUF7rycap14bp13FpBEoolDn+3wHW09u3jUYHjEQW8ac8ucd8F91GHZRkBlXxDWRJey0sKrL4+ITdBdNYMUXts+Doyeh8gjxYWJ70HIMAgthBhd4xga0pScg+PBlG+zeGSHNTv25Jqym85XIsVBOmSQ46+2Fp+Fu2vIZ8v2JVsaiGQOguhiLD2gfXqasd/I4Qd94PCE8rTg61hVOCyIR2nMAICFs6WCcJZBL15MzlX2qYKvTX+Kx7/LBACmFsuLXTzzB8wXcXfxEr7A8QJmGtEC6LF62dN8hmNO7hjesDCeHePYrMNzr6u7wVU7IRjU6S44B9TP8r4zJ0vbx4iy7VjcGgfccHKY7U31SwutCUfun0NboOw/mgDxuaG+f9W+Hrn1Kv2kNEnthUWP+6SbG1/YjQ5U2X3v+vPZ1HWvT8BhCxUICv93H0bp0SbhVbQPR9A59CMjYSnHzMYvCH/tOEEo4Ggr7Vcx+rHXmmn72aUpi52FNlpSC6TJ0Si+2H2pnh8vepfOrKdGYG0lFgkWWfPD1sl+VHSfNb7fOkWDC6vIXPFzuFvw7ZihgY/FlVuMG30lC5+d2dKZ/Zd7z+c9k10vqUNscuBoxaO1VLfeCbIvOL9+RWpHhzU7G46TgHv5C6aAiCIqK8snWuHnTH/e5Olj1ZcAniIilXcFw3rlNwLuupkBgF2AVhNWopRenOqR3d4GaFyaAIAMzJbdbxGYm40SAGwXLbNKJs8AeVHSlGpkRJePDkDheS3TB9dfK+n2FhFeyioHwEeExFBq0mP+Vuzk5B/I+G/cZ0R0Uk85AD4k5MYNlw71J4f3Jh8Pbyfi+o+IWIfEFvfj1XhGoEnPZAYAJgIxqwlPqSgygGW3NwEehyYA0GTB2az7O/ZDbpMAgEZWNKvpPcz3yNR5aW3w+hzi/7UqfUhscT8GUXtqRfEzzQwAsPwp7fGIKYqMOzY/8KcLx81i18ifpptRmr8VPT6opL9wU3grbmrhz7c9Skaj4AYhpJbH1j5Xgm14ZN0rKEvY7j75ESj9xY8aAdMJFADdy8sMjR2FL8BpN84vrWIUPvdrgpMraslLa2oK+QJETX712brJqogh0j8EtyjJzUOGHIGyn9ONBdIBkD0BkWTfWgkdwItmjaZopqn2P9rRgLXpYFr6RIEr0+4aybofbaud725r7sB7F6TqGUa1BwLjuqjw6wo69En03bIjqOVFnXP9RwgSYaoNnNrWVHfQ9Rph7tqP0pAce+xDXDruL+rHcz6ln2lhl2aY0mE0yb0Byz7yjnVtQw+pv/TcR9ZePJqQKjl3lazZAaKI9TxKhwWhzxbISAmnQzsBiJNtGE3ApmUYUzfA4KaTxK71l3dnVnW9OkwBAF+rnZnUF/dOqbMOYZRMX9tXHlYn16QjrVItvUoPkuGpvqf0YWgPXOSO0IzQod5ofO2O/gzdmk94YAlD/CqD/o1pCP2JNhhFftGwLUaBvNlL+tdJBLOhBUZCOpik6IMamqdK3AnDxBg+16WKa3WE02KzpCC3msVpuGGKnY5zNGVToAc3sZUVgevfZuhzOhfprO0AHJ0ck2kxSE2c2GKlwUhxyZGUmc7JpFh/ZktxOQ47vAAh7I4fD0MRKW6Fk1QYOGhFfVPDUZXawarezdJtWzwpZ2WiQYZfiKDvuwmupCjWqyp2R+hCRtw9DG0ww0EEXEuCUsgexlgwF/05fhIOXAA6/Int1cvu7ni0ptzkn7hi2hQ72CFrpPVG9U7XVPc8bJIVFtuFStUC0Ymw4AsLcrJiqp9gcYoDYrgLHJqRPHcrms4maIQ1Ket4RBgu17M2T0pASvSFthi87RJuDpVEkH6k5dR1ykArccYr+bmFoKY8u8rVz/dMjfe8VwRsMq/5qPLvTKso5B1mV9NptFcJkKAoJ9EiP3/sxVrsVB6MdUuoQxMwIs3Rl21sjpABsWWwbJBBLogFg/UivowbwTjhd6fo7NDhjO/dVML5RAY/PMSSuqOKxtSguJnAG7PYzbuN/CVMlWvz15VfTe5hWjGp4IwZpDQRJcKcsMok0p86BrSMgQrLGaKLgeI+o6Xjs1xw3FXuyxJtM+ZzOco2b8YwxBTw/NHPM8tVu06TiCisjAdElQ3cRxb8Trca+MyL+QbicxmYkVlZZoAtlkVzfEgfak67uNLjxaIdXQFD5ibCBfPpNVHq8Jj250wV7DKILjsePNvIR4x+TD6WWFC5nsNoXj3H7sr7fhYfh3WO8meCv95w2CaVcEXiw0VaCeWhWUWnbirbtKcqlO3nKeFnv45hIvQTRBuGFDvkn7MGDNjoQm50f+la/j5Tkaei+bBnTEzfouLBTeLwIlrIw3saHYRowtRo9P4QDl+NIumkebp5/WnSzE2+xjPAwl+rmqvkwfOkUfXcus1IjdfiLxUzADDgGtk8Yor/17hExdmvqXO5ae2oVI3FbIYrEwDA3BnrbCaLmQ/4a5BLp45+5XsSWD0A1wpoLe769NGrL+CGokfiPiDqMBDP0RVPkuU84euRruOvPSFAdbmsjljUNAWgVh378jd1xZRmqsJPRKODdwKhPiDBBatW7DAMEUoCRQ+HAEqSWPj9XN+/ijxXTFXzt+T0EW0BIN2yZZubSxwHwAddxl1j67kDpzgDjSDSdQlj7YhkxQ62PZsu2rnIbW8BkUaraxON7yZRTwDb00LdMfFa2hmtBjGWzfVm/GOC5LSE0RLHsp8enD811dvrof79paGjqn0SLX8t5TVb0gUQ6MOu2lwJfP+O6d2Vh2ULJSDp+5HB54V5H+CNN25tXvrIM3Exe1jX2WMCJrldyxiIItGuRwvlg1K89N+AyTkg9k0TW1QxO+2ZBH2aNKpNmxxrUvtQUn9AcLo3cNgbDru8mfxwvHPaDHr6k/EvS84yT+8fzP5FpFn75MLfj8EwbhZ8XA2o10BzmE8XWhCsO+vYNg9pGFPWbki0+dipJBpAh3FlZ13n0OzgVbBypRzreqSsdapRzjR+kT8ajyv/wxlufqwztJpldU2HbjTrhHeSBKPhjLO5fveAbAx8KJxm/dl5vaSbdVSNw8xWrmjS4dKOb0LE+bGtct751nCJR/6aieShrRLXiGlk2NTevGkUKt0Jm+XC1TSjbYqQsmK6rtHecJfAVDbEyxvTF1jFp/DAASds88fYKuhmMbWiuZnYTJOWEfXjTsIZrqGZ/fFOBg+ux2bAat12KYxskoRoUeTH6ZLThB/f0+eCqfasE1AxXaAFA20ihHk4cEJsZdaYAVHoQUlLCq4pa4mCAM2NNN5vsDgfLS0jvSP38yfaxiYoOHUmJisj9kr05cPOnh4+9rSPbNJ9Vs/BjnqB/8qr6Y+rew1G+9xsMFWSe4gJ85kz7rpMZ3RGTrM6LbCQAmf1TaWzYGIdqGpcmzyJKaElwibK/S5MK6w5JHjfTNxXohxKX0hlsQy85UphZQbeCA0s+6+nxOzKL3hCyO/j9Ra2d4RN2W0p9OF4xBfEubmu7Mi1Zd5mJ4G+ctkiV67Hv3zUB6IjPW1CW9M01FTYpeP0w42u+I2r1QZVvE2JsSf/Y1X3MHUbJXROEw7yryYQIun3d21drZ5J2ZKUQNcBPkssPg7x2jSqgpgtgtc+1BE7rfDKGKnn3I8ZMx09ZKkxYhdXorKgaZs3St6TuEx5Ejj9CBgsuHyKsWtaZt5hwMAXyYlo0kd6KcxJMyKxGxpItyH/bLPStYdIF6tC05vTSPQEJ5g54kVuqyolx5yEFa6BHUWJdBLHrQWmXZfTEqZbHbtlmeQpmu/NvVITfcb1Um5EIi0dEGJ7cOMls9vbPIamwpPF6qLiUEbvqh06xsT5bk2LQoa9aV9KiiJ2CAEC5iH271UUxo8HDcMN+47Woypfh1IKCFsxV3Bp4+pShdFt5CoVNj5hMn3stg30e5U+9e8WVeM9nsVuw19bcbjRQ1yJ++h0dtPd7ne8E86JIs3uOm8MvvYmbIprFoID8dIBKroQMIaGHclF8KscsOD468XQYSpYMAZhRyd0tBtfvxxeg8g1OFErQaPUIXEmYXnvyt/vnqNY2qkI9wxepu0m0IEVwOLLmOxipZaba2SQlSwwLeZQSGxYbsA7PxY9CpLQnwjsjWwFnJwZuL8pBT4J//q4Gjwi5Lgfp67KUnt8TfEzhRkAiPxx+nicm9h5UyhhMepDcxKbndNje4zmRc5MACBTz8gcdGHBJmeQUyV6d0vremf1AwCZBZEqQq0HtJ2cT9ugHebFcoGWW/jTAWSOTXC3OJsc5D3znTrcEEpqviR7DGEV5imxJZDucrMzQHPMLVYBsbqYvWcQ4fxbPaDhlhXtDDIS30bX0uq8tCmsuteHMM5DeCkNJADP/VujPSY+lNbfxbyZ2ew6+W3396KTckECcJEoN22p9LN+dod6CprLZHcjehyxvHSMarrVYchYxVUaMwDQwmM3Dz2Y8uc6ZNjsmM0jx5tzSkf42KEJAAxo6WLbHIC3WXpX7O9y9gMAU0C2FaUDNk0fBUSMsRbIsv9s4Jxl4AXs5N6KkJWVY7rNaf29153LRy/seL1XA4vkga/jkP5yItMgn6lmAMAKTw956J+WP+0Wx2Lflj/oDSczP9YTlNMcXHGheVk5xrF4YeU4CEl895GLY+G5BERrPEm0Gxe8uYPlguiNi9N5N37A3GXImFDHf/w4vMgTxIvgYogpSQR3zPG1p36WjntvYm3fRYd5LTWqGxOFJwq5OfZThLmbvBn5KRKMXHgXeinFfcqwxjTyU8IxUSDwRG+mxHn6shNUou2su5PoFtDT/gU/xq7htejanGN1k8K259gQj1TMAEChWuK5bR6a8Aqnqhg6+7Ttoj9hjjE7EwDYybeHZoL7W60Zbo/eTwKbZIztZey/exyzXwRLsqz9urZiHo53r14X3urKVNNuHA7h03UPlcUAQK6Ot7mPkhe7knFZWS0+lXYM/3ZXdbNq9Jp+SkSUEugfzw3rUPAGHFt+5hj+7S7MslogGEOCw+CW8c6o97Tz5uxC+RqYL7nyQHbnMpLW03FTT+3tW/1RtigWZHZ9uWJMQGbNSvZYBRlVXfYenyBcYF4R3YX8DB3T4i3/6Kw7SQvS7r96rzkOaS3ux1aiLfZewfPJSes9ovV0El6Lxo54i1VFTiU2XcwAQLfwuSufOHNx+JIVwulQc89aG9ayD7UoNAGAmiwis4uKzYg79gOiu1RuJVpbPbsgABCa27p6YEFhK7OIgVBr9mbEQEAZ4lkxEKZtv5EYiIhVsBIDkTTle2qpUjIpEKSuEiVBvLmoLeVmGIK8nVtkBLKumJ0lyGH+nSuQW2VFKSIjT8f03O2T89sl9uCvL+u9elAgSAD++7dGto5pyfCen2R3VI/Ll07qvXZQNEgAjhIlb9YhqPiIfLpoik+qk9AxQpD/7wUXL/LHhpUHrE5jBgCqzXA5oFYPpt6Yy0VWe6E+yxng7NIEAHBA2rZhAaVMOTULiJwGAUALCFtRS2CV6RsAe43xNhCy/zRA0DJQAyfG+4CszB3TdqxPx3jnd7SK4aOyknbcEMyIAHJmBgkA4IhP+HiRp34/RpwXf9p9ijQeN+9sJoJZEj8+FwZUhXYgky4YhmsuqjBb0lIbY4qSbU8ihKM9yLZIJFhcsscsD7J7vL7jD7O594DyiT+sEsxGCB3Wv1B6/VXeifOVXMtmwBY2O/F4jBs4uClZ+IRem24kbxL38eY+dODEHrfT5/17HQAgHQ8YG52fUA7J7Sy4w6f0OHaIjV4kyTzGkHipCbsY4yNGoRrseJxrHd1cxyN/jnEjRqXvGEM3+TCctjrGgVIdC67AwalQEKQXQZ4P7pSDZ+q/fNHZA2n5rPP4x7cB/cjP3HEDNKsgODUtHinnAIAx/Me1YI4p9mpAXpj0jOpfEE4bFLXNrgWzurnQPnaLBhfnGc7vlfiNLEsVgmWOD/yRf3/4690FmNn84un1rxEc2XDHH82fo6/lwf/WhP6Eyv/2kjxpYw8jcGN4A9Ty7duef514wvg/uTXr/cUvA/cf6Xblhu6DTk32Du+d4+2ek+Mjja2qtkAYByMhh94nWO/lNbjgS0REIgn/8RwxSmSs3VBt1a/hod24mkpBI0O7cX1MmZOsviPEkXbaTATTzlxYtDeeJvMlz9eQ0/YcpbuuTAyQ3cHFZd3NQKPy7k5b5fiA4TovKuYWy3i8Hjq+6H6Vf/vomBh3F0NTx46fzwD5OuUeTp2Hc24PxNPEZrj9EJ3G5XTTsZxeMx681t1EDx6vzC7re1p+IYfM4aN3+fsjFiqNdyz/S7Z3wMwOJGqb7DjsFsqVOhn/WNXp+JmMs/tlY2aGG6RZJSEB9meiAYBgyrd/cxA7eLRRyWc0r0drv9IHZDSne4YmADALkKpsAqW6hre30HlKyCKDUvOz/wAACgVSWPi5NshK7nYRyHd5cTogJ4W/TNNMXCSYRmUgMshUIz+Z3sPdi24M6komM5thYRKgypQy5sU1pDwutSCK+YxIEA/FbAmgrSs26A7Ec2mPFGSkaZh2mbwe73R+Jhb0xys1Q8MK/QjAj//WyLQwrQX+vUXqPNQ369S/kSZZWPEfAfg6lJssYTouITR7ncdIrxdR9HkSbmDMKgaSQrnnAIDUrEUZy8RZuAHGFfucJkkLgTqdnVvoYw4oOTQBAJrWZBMFE8DCNhfUZZAJLCjn/AcAemnxYv80AGL+pjTwxhQ3aW1o/UG0HFgGILBs+rkA","base64")).toString()),a}]]),g={hooks:{registerPackageExtensions:async(e,t)=>{for(const[e,r]of o)t(A.parseDescriptor(e,!0),r)},getBuiltinPatch:async(e,t)=>{var r;if(!t.startsWith("compat/"))return;const n=A.parseIdent(t.slice("compat/".length)),o=null===(r=c.get(n.identHash))||void 0===r?void 0:r();return void 0!==o?o:null},reduceDependency:async(e,t,r,n)=>void 0===c.get(e.identHash)?e:A.makeDescriptor(e,A.makeRange({protocol:"patch:",source:A.stringifyDescriptor(e),selector:`builtin`,params:null}))}}},10189:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>p});var A=r(36370),n=r(25413),o=r(54143),i=r(40822);class s extends n.BaseCommand{constructor(){super(...arguments),this.quiet=!1,this.args=[]}async execute(){const e=[];this.pkg&&e.push("--package",this.pkg),this.quiet&&e.push("--quiet");const t=o.parseIdent(this.command),r=o.makeIdent(t.scope,"create-"+t.name);return this.cli.run(["dlx",...e,o.stringifyIdent(r),...this.args])}}(0,A.gn)([i.Command.String("-p,--package",{description:"The package to run the provided command from"})],s.prototype,"pkg",void 0),(0,A.gn)([i.Command.Boolean("-q,--quiet",{description:"Only report critical errors instead of printing the full install logs"})],s.prototype,"quiet",void 0),(0,A.gn)([i.Command.String()],s.prototype,"command",void 0),(0,A.gn)([i.Command.Proxy()],s.prototype,"args",void 0),(0,A.gn)([i.Command.Path("create")],s.prototype,"execute",null);var a=r(39922),c=r(85824),g=r(63088),l=r(43896),u=r(46009);class h extends n.BaseCommand{constructor(){super(...arguments),this.quiet=!1,this.args=[]}async execute(){return a.VK.telemetry=null,await l.xfs.mktempPromise(async e=>{const t=u.y1.join(e,"dlx-"+process.pid);await l.xfs.mkdirPromise(t),await l.xfs.writeFilePromise(u.y1.join(t,"package.json"),"{}\n"),await l.xfs.writeFilePromise(u.y1.join(t,"yarn.lock"),"");const r=u.y1.join(t,".yarnrc.yml"),A=await a.VK.findProjectCwd(this.context.cwd,u.QS.lockfile),i=null!==A?u.y1.join(A,".yarnrc.yml"):null;null!==i&&l.xfs.existsSync(i)?(await l.xfs.copyFilePromise(i,r),await a.VK.updateConfiguration(t,e=>{const t={...e,enableGlobalCache:!0,enableTelemetry:!1};return Array.isArray(e.plugins)&&(t.plugins=e.plugins.map(e=>{const t="string"==typeof e?e:e.path,r=u.cS.isAbsolute(t)?t:u.cS.resolve(u.cS.fromPortablePath(A),t);return"string"==typeof e?r:{path:r,spec:e.spec}})),t})):await l.xfs.writeFilePromise(r,"enableGlobalCache: true\nenableTelemetry: false\n");const s=void 0!==this.pkg?[this.pkg]:[this.command],h=o.parseDescriptor(this.command).name,p=await this.cli.run(["add","--",...s],{cwd:t,quiet:this.quiet});if(0!==p)return p;this.quiet||this.context.stdout.write("\n");const d=await a.VK.find(t,this.context.plugins),{project:C,workspace:f}=await c.I.find(d,t);if(null===f)throw new n.WorkspaceRequiredError(C.cwd,t);return await C.restoreInstallState(),await g.executeWorkspaceAccessibleBinary(f,h,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}}h.usage=i.Command.Usage({description:"run a package in a temporary environment",details:"\n This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\n\n By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\n\n Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\n ",examples:[["Use create-react-app to create a new React app","yarn dlx create-react-app ./my-app"]]}),(0,A.gn)([i.Command.String("-p,--package",{description:"The package to run the provided command from"})],h.prototype,"pkg",void 0),(0,A.gn)([i.Command.Boolean("-q,--quiet",{description:"Only report critical errors instead of printing the full install logs"})],h.prototype,"quiet",void 0),(0,A.gn)([i.Command.String()],h.prototype,"command",void 0),(0,A.gn)([i.Command.Proxy()],h.prototype,"args",void 0),(0,A.gn)([i.Command.Path("dlx")],h.prototype,"execute",null);const p={commands:[s,h]}},34777:(e,t,r)=>{"use strict";r.r(t),r.d(t,{dedupeUtils:()=>A,default:()=>We,suggestUtils:()=>A});var A={};r.r(A),r.d(A,{Modifier:()=>o,Strategy:()=>i,Target:()=>n,applyModifier:()=>S,extractDescriptorFromPath:()=>N,extractRangeModifier:()=>v,fetchDescriptorFrom:()=>K,findProjectDescriptors:()=>k,getModifier:()=>D,getSuggestedDescriptors:()=>F});var n,o,i,s=r(39922),a=r(36370),c=r(25413),g=r(28148),l=r(62152),u=r(92659),h=r(85824),p=r(15815),d=r(54143),C=r(40822),f=r(61899),I=r(33720),E=r(46611),B=r(71643),y=r(43896),m=r(46009),w=r(53887),Q=r.n(w);function D(e,t){return e.exact?o.EXACT:e.caret?o.CARET:e.tilde?o.TILDE:t.configuration.get("defaultSemverRangePrefix")}!function(e){e.REGULAR="dependencies",e.DEVELOPMENT="devDependencies",e.PEER="peerDependencies"}(n||(n={})),function(e){e.CARET="^",e.TILDE="~",e.EXACT=""}(o||(o={})),function(e){e.KEEP="keep",e.REUSE="reuse",e.PROJECT="project",e.LATEST="latest",e.CACHE="cache"}(i||(i={}));const b=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function v(e,{project:t}){const r=e.match(b);return r?r[1]:t.configuration.get("defaultSemverRangePrefix")}function S(e,t){let{protocol:r,source:A,params:n,selector:o}=d.parseRange(e.range);return Q().valid(o)&&(o=`${t}${e.range}`),d.makeDescriptor(e,d.makeRange({protocol:r,source:A,params:n,selector:o}))}async function k(e,{project:t,target:r}){const A=new Map,o=e=>{let t=A.get(e.descriptorHash);return t||A.set(e.descriptorHash,t={descriptor:e,locators:[]}),t};for(const A of t.workspaces)if(r===n.PEER){const t=A.manifest.peerDependencies.get(e.identHash);void 0!==t&&o(t).locators.push(A.locator)}else{const t=A.manifest.dependencies.get(e.identHash),i=A.manifest.devDependencies.get(e.identHash);r===n.DEVELOPMENT?void 0!==i?o(i).locators.push(A.locator):void 0!==t&&o(t).locators.push(A.locator):void 0!==t?o(t).locators.push(A.locator):void 0!==i&&o(i).locators.push(A.locator)}return A}async function N(e,{cwd:t,workspace:r}){return await async function(e){return await y.xfs.mktempPromise(async t=>{const r=s.VK.create(t);return r.useWithSource(t,{enableMirror:!1,compressionLevel:0},t,{overwrite:!0}),await e(new g.C(t,{configuration:r,check:!1,immutable:!1}))})}(async A=>{m.y1.isAbsolute(e)||(e=m.y1.relative(r.cwd,m.y1.resolve(t,e))).match(/^\.{0,2}\//)||(e="./"+e);const{project:n}=r,o=await K(d.makeIdent(null,"archive"),e,{project:r.project,cache:A,workspace:r});if(!o)throw new Error("Assertion failed: The descriptor should have been found");const i=new I.$,s=n.configuration.makeResolver(),a=n.configuration.makeFetcher(),c={checksums:n.storedChecksums,project:n,cache:A,fetcher:a,report:i,resolver:s},g=s.bindDescriptor(o,r.anchoredLocator,c),l=d.convertDescriptorToLocator(g),u=await a.fetch(l,c),h=await E.G.find(u.prefixPath,{baseFs:u.packageFs});if(!h.name)throw new Error("Target path doesn't have a name");return d.makeDescriptor(h.name,e)})}async function F(e,{project:t,workspace:r,cache:A,target:o,modifier:s,strategies:a,maxResults:c=1/0}){if(!(c>=0))throw new Error(`Invalid maxResults (${c})`);if("unknown"!==e.range)return{suggestions:[{descriptor:e,name:"Use "+d.prettyDescriptor(t.configuration,e),reason:"(unambiguous explicit request)"}],rejections:[]};const g=null!=r&&r.manifest[o].get(e.identHash)||null,l=[],u=[],h=async e=>{try{await e()}catch(e){u.push(e)}};for(const u of a){if(l.length>=c)break;switch(u){case i.KEEP:await h(async()=>{g&&l.push({descriptor:g,name:"Keep "+d.prettyDescriptor(t.configuration,g),reason:"(no changes)"})});break;case i.REUSE:await h(async()=>{for(const{descriptor:A,locators:n}of(await k(e,{project:t,target:o})).values()){if(1===n.length&&n[0].locatorHash===r.anchoredLocator.locatorHash&&a.includes(i.KEEP))continue;let e="(originally used by "+d.prettyLocator(t.configuration,n[0]);e+=n.length>1?` and ${n.length-1} other${n.length>2?"s":""})`:")",l.push({descriptor:A,name:"Reuse "+d.prettyDescriptor(t.configuration,A),reason:e})}});break;case i.CACHE:await h(async()=>{for(const r of t.storedDescriptors.values())r.identHash===e.identHash&&l.push({descriptor:r,name:"Reuse "+d.prettyDescriptor(t.configuration,r),reason:"(already used somewhere in the lockfile)"})});break;case i.PROJECT:await h(async()=>{if(null!==r.manifest.name&&e.identHash===r.manifest.name.identHash)return;const A=t.tryWorkspaceByIdent(e);null!==A&&l.push({descriptor:A.anchoredDescriptor,name:"Attach "+d.prettyWorkspace(t.configuration,A),reason:`(local workspace at ${A.cwd})`})});break;case i.LATEST:await h(async()=>{if("unknown"!==e.range)l.push({descriptor:e,name:"Use "+d.prettyRange(t.configuration,e.range),reason:"(explicit range requested)"});else if(o===n.PEER)l.push({descriptor:d.makeDescriptor(e,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(t.configuration.get("enableNetwork")){let n=await K(e,"latest",{project:t,cache:A,workspace:r,preserveModifier:!1});n&&(n=S(n,s),l.push({descriptor:n,name:"Use "+d.prettyDescriptor(t.configuration,n),reason:"(resolved from latest)"}))}else l.push({descriptor:null,name:"Resolve from latest",reason:B.pretty(t.configuration,"(unavailable because enableNetwork is toggled off)","grey")})})}}return{suggestions:l.slice(0,c),rejections:u.slice(0,c)}}async function K(e,t,{project:r,cache:A,workspace:n,preserveModifier:o=!0}){const i=d.makeDescriptor(e,t),s=new I.$,a=r.configuration.makeFetcher(),c=r.configuration.makeResolver(),g={project:r,fetcher:a,cache:A,checksums:r.storedChecksums,report:s,skipIntegrityCheck:!0},l={...g,resolver:c,fetchOptions:g},u=c.bindDescriptor(i,n.anchoredLocator,l),h=await c.getCandidates(u,new Map,l);if(0===h.length)return null;const p=h[0];let{protocol:C,source:f,params:E,selector:B}=d.parseRange(d.convertToManifestRange(p.reference));if(C===r.configuration.get("defaultProtocol")&&(C=null),Q().valid(B)&&!1!==o){B=v("string"==typeof o?o:i.range,{project:r})+B}return d.makeDescriptor(p,d.makeRange({protocol:C,source:f,params:E,selector:B}))}class M extends c.BaseCommand{constructor(){super(...arguments),this.packages=[],this.json=!1,this.exact=!1,this.tilde=!1,this.caret=!1,this.dev=!1,this.peer=!1,this.optional=!1,this.preferDev=!1,this.interactive=null,this.cached=!1}async execute(){var e;const t=await s.VK.find(this.context.cwd,this.context.plugins),{project:r,workspace:A}=await h.I.find(t,this.context.cwd),o=await g.C.find(t);if(!A)throw new c.WorkspaceRequiredError(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});const a=null!==(e=this.interactive)&&void 0!==e?e:t.get("preferInteractive"),I=D(this,r),E=[...a?[i.REUSE]:[],i.PROJECT,...this.cached?[i.CACHE]:[],i.LATEST],B=a?1/0:1,y=await Promise.all(this.packages.map(async e=>{const t=e.match(/^\.{0,2}\//)?await N(e,{cwd:this.context.cwd,workspace:A}):d.parseDescriptor(e),i=function(e,t,{dev:r,peer:A,preferDev:o,optional:i}){const s=e.manifest[n.REGULAR].has(t.identHash),a=e.manifest[n.DEVELOPMENT].has(t.identHash),c=e.manifest[n.PEER].has(t.identHash);if((r||A)&&s)throw new C.UsageError(`Package "${d.prettyIdent(e.project.configuration,t)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!A&&c)throw new C.UsageError(`Package "${d.prettyIdent(e.project.configuration,t)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(i&&a)throw new C.UsageError(`Package "${d.prettyIdent(e.project.configuration,t)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(i&&!A&&c)throw new C.UsageError(`Package "${d.prettyIdent(e.project.configuration,t)}" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((r||o)&&i)throw new C.UsageError(`Package "${d.prettyIdent(e.project.configuration,t)}" cannot simultaneously be a dev dependency and an optional dependency`);return A?n.PEER:r||o?n.DEVELOPMENT:s?n.REGULAR:a?n.DEVELOPMENT:n.REGULAR}(A,t,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional});return[t,await F(t,{project:r,workspace:A,cache:o,target:i,modifier:I,strategies:E,maxResults:B}),i]})),m=await l.h.start({configuration:t,stdout:this.context.stdout,suggestInstall:!1},async e=>{for(const[A,{suggestions:n,rejections:o}]of y){if(0===n.filter(e=>null!==e.descriptor).length){const[n]=o;if(void 0===n)throw new Error("Assertion failed: Expected an error to have been set");const i=this.cli.error(n);r.configuration.get("enableNetwork")?e.reportError(u.b.CANT_SUGGEST_RESOLUTIONS,`${d.prettyDescriptor(t,A)} can't be resolved to a satisfying range:\n\n${i}`):e.reportError(u.b.CANT_SUGGEST_RESOLUTIONS,`${d.prettyDescriptor(t,A)} can't be resolved to a satisfying range (note: network resolution has been disabled):\n\n${i}`)}}});if(m.hasErrors())return m.exitCode();let w=!1;const Q=[],b=[];for(const[,{suggestions:e},t]of y){let r;const n=e.filter(e=>null!==e.descriptor),o=n[0].descriptor,i=n.every(e=>d.areDescriptorsEqual(e.descriptor,o));1===n.length||i?r=o:(w=!0,({answer:r}=await(0,f.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:e.map(({descriptor:e,name:t,reason:r})=>e?{name:t,hint:r,descriptor:e}:{name:t,hint:r,disabled:!0}),onCancel:()=>process.exit(130),result(e){return this.find(e,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout})));const s=A.manifest[t].get(r.identHash);void 0!==s&&s.descriptorHash===r.descriptorHash||(A.manifest[t].set(r.identHash,r),this.optional&&("dependencies"===t?A.manifest.ensureDependencyMeta({...r,range:"unknown"}).optional=!0:"peerDependencies"===t&&(A.manifest.ensurePeerDependencyMeta({...r,range:"unknown"}).optional=!0)),void 0===s?Q.push([A,t,r,E]):b.push([A,t,s,r]))}await t.triggerMultipleHooks(e=>e.afterWorkspaceDependencyAddition,Q),await t.triggerMultipleHooks(e=>e.afterWorkspaceDependencyReplacement,b),w&&this.context.stdout.write("\n");return(await p.Pk.start({configuration:t,json:this.json,stdout:this.context.stdout,includeLogs:!this.context.quiet},async e=>{await r.install({cache:o,report:e})})).exitCode()}}M.usage=C.Command.Usage({description:"add dependencies to the project",details:"\n This command adds a package to the package.json for the nearest workspace.\n\n - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\n\n - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\n\n - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\n\n - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\"peerDependenciesMeta\": { \"\": { \"optional\": true } }`\n\n - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\n\n - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\n\n If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\n\n If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/features/protocols.\n ",examples:[["Add a regular package to the current workspace","$0 add lodash"],["Add a specific version for a package to the current workspace","$0 add lodash@1.2.3"],["Add a package from a GitHub repository (the master branch) to the current workspace using a URL","$0 add lodash@https://github.com/lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol","$0 add lodash@github:lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)","$0 add lodash@lodash/lodash"],["Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)","$0 add lodash-es@lodash/lodash#es"]]}),(0,a.gn)([C.Command.Rest()],M.prototype,"packages",void 0),(0,a.gn)([C.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],M.prototype,"json",void 0),(0,a.gn)([C.Command.Boolean("-E,--exact",{description:"Don't use any semver modifier on the resolved range"})],M.prototype,"exact",void 0),(0,a.gn)([C.Command.Boolean("-T,--tilde",{description:"Use the `~` semver modifier on the resolved range"})],M.prototype,"tilde",void 0),(0,a.gn)([C.Command.Boolean("-C,--caret",{description:"Use the `^` semver modifier on the resolved range"})],M.prototype,"caret",void 0),(0,a.gn)([C.Command.Boolean("-D,--dev",{description:"Add a package as a dev dependency"})],M.prototype,"dev",void 0),(0,a.gn)([C.Command.Boolean("-P,--peer",{description:"Add a package as a peer dependency"})],M.prototype,"peer",void 0),(0,a.gn)([C.Command.Boolean("-O,--optional",{description:"Add / upgrade a package to an optional regular / peer dependency"})],M.prototype,"optional",void 0),(0,a.gn)([C.Command.Boolean("--prefer-dev",{description:"Add / upgrade a package to a dev dependency"})],M.prototype,"preferDev",void 0),(0,a.gn)([C.Command.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"})],M.prototype,"interactive",void 0),(0,a.gn)([C.Command.Boolean("--cached",{description:"Reuse the highest version already used somewhere within the project"})],M.prototype,"cached",void 0),(0,a.gn)([C.Command.Path("add")],M.prototype,"execute",null);var R=r(63088);class x extends c.BaseCommand{constructor(){super(...arguments),this.verbose=!1,this.json=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t,locator:r}=await h.I.find(e,this.context.cwd);if(await t.restoreInstallState(),this.name){const A=(await R.getPackageAccessibleBinaries(r,{project:t})).get(this.name);if(!A)throw new C.UsageError(`Couldn't find a binary named "${this.name}" for package "${d.prettyLocator(e,r)}"`);const[,n]=A;return this.context.stdout.write(n+"\n"),0}return(await p.Pk.start({configuration:e,json:this.json,stdout:this.context.stdout},async A=>{const n=await R.getPackageAccessibleBinaries(r,{project:t}),o=Array.from(n.keys()).reduce((e,t)=>Math.max(e,t.length),0);for(const[e,[t,r]]of n)A.reportJson({name:e,source:d.stringifyIdent(t),path:r});if(this.verbose)for(const[t,[r]]of n)A.reportInfo(null,`${t.padEnd(o," ")} ${d.prettyLocator(e,r)}`);else for(const e of n.keys())A.reportInfo(null,e)})).exitCode()}}x.usage=C.Command.Usage({description:"get the path to a binary script",details:"\n When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the `-v,--verbose` flag will cause the output to contain both the binary name and the locator of the package that provides the binary.\n\n When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive.\n ",examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]}),(0,a.gn)([C.Command.String({required:!1})],x.prototype,"name",void 0),(0,a.gn)([C.Command.Boolean("-v,--verbose",{description:"Print both the binary name and the locator of the package that provides the binary"})],x.prototype,"verbose",void 0),(0,a.gn)([C.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],x.prototype,"json",void 0),(0,a.gn)([C.Command.Path("bin")],x.prototype,"execute",null);class L extends c.BaseCommand{constructor(){super(...arguments),this.mirror=!1,this.all=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),t=await g.C.find(e);return(await p.Pk.start({configuration:e,stdout:this.context.stdout},async()=>{const e=(this.all||this.mirror)&&null!==t.mirrorCwd,r=!this.mirror;e&&await y.xfs.removePromise(t.mirrorCwd),r&&await y.xfs.removePromise(t.cwd)})).exitCode()}}L.usage=C.Command.Usage({description:"remove the shared cache files",details:"\n This command will remove all the files from the cache.\n ",examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]}),(0,a.gn)([C.Command.Boolean("--mirror",{description:"Remove the global cache files instead of the local cache files"})],L.prototype,"mirror",void 0),(0,a.gn)([C.Command.Boolean("--all",{description:"Remove both the global cache files and the local cache files of the current project"})],L.prototype,"all",void 0),(0,a.gn)([C.Command.Path("cache","clean")],L.prototype,"execute",null);var P=r(73632),O=r(44674),U=r.n(O),T=r(31669);class j extends c.BaseCommand{constructor(){super(...arguments),this.json=!1,this.unsafe=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),t=this.name.replace(/[.[].*$/,""),r=this.name.replace(/^[^.[]*/,"");if(void 0===e.settings.get(t))throw new C.UsageError(`Couldn't find a configuration settings named "${t}"`);const A=e.getSpecial(t,{hideSecrets:!this.unsafe,getNativePaths:!0}),n=P.convertMapsToIndexableObjects(A),o=r?U()(n,r):n,i=await p.Pk.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async e=>{e.reportJson(o)});if(!this.json){if("string"==typeof o)return this.context.stdout.write(o+"\n"),i.exitCode();T.inspect.styles.name="cyan",this.context.stdout.write((0,T.inspect)(o,{depth:1/0,colors:e.get("enableColors"),compact:!1})+"\n")}return i.exitCode()}}j.usage=C.Command.Usage({description:"read a configuration settings",details:"\n This command will print a configuration setting.\n\n Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the `--no-redacted` to get the untransformed value.\n ",examples:[["Print a simple configuration setting","yarn config get yarnPath"],["Print a complex configuration setting","yarn config get packageExtensions"],["Print a nested field from the configuration","yarn config get 'npmScopes[\"my-company\"].npmRegistryServer'"],["Print a token from the configuration","yarn config get npmAuthToken --no-redacted"],["Print a configuration setting as JSON","yarn config get packageExtensions --json"]]}),(0,a.gn)([C.Command.String()],j.prototype,"name",void 0),(0,a.gn)([C.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],j.prototype,"json",void 0),(0,a.gn)([C.Command.Boolean("--no-redacted",{description:"Don't redact secrets (such as tokens) from the output"})],j.prototype,"unsafe",void 0),(0,a.gn)([C.Command.Path("config","get")],j.prototype,"execute",null);var Y=r(82558),G=r.n(Y),H=r(81534),J=r.n(H);class q extends c.BaseCommand{constructor(){super(...arguments),this.json=!1,this.home=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins);if(!e.projectCwd)throw new C.UsageError("This command must be run from within a project folder");const t=this.name.replace(/[.[].*$/,""),r=this.name.replace(/^[^.[]*\.?/,"");if(void 0===e.settings.get(t))throw new C.UsageError(`Couldn't find a configuration settings named "${t}"`);const A=this.json?JSON.parse(this.value):this.value,n=this.home?e=>s.VK.updateHomeConfiguration(e):t=>s.VK.updateConfiguration(e.projectCwd,t);await n(e=>{if(r){const t=G()(e);return J()(t,this.name,A),t}return{...e,[t]:A}});const o=(await s.VK.find(this.context.cwd,this.context.plugins)).getSpecial(t,{hideSecrets:!0,getNativePaths:!0}),i=P.convertMapsToIndexableObjects(o),a=r?U()(i,r):i;return(await p.Pk.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async t=>{T.inspect.styles.name="cyan",t.reportInfo(u.b.UNNAMED,`Successfully set ${this.name} to ${(0,T.inspect)(a,{depth:1/0,colors:e.get("enableColors"),compact:!1})}`)})).exitCode()}}q.usage=C.Command.Usage({description:"change a configuration settings",details:"\n This command will set a configuration setting.\n\n When used without the `--json` flag, it can only set a simple configuration setting (a string, a number, or a boolean).\n\n When used with the `--json` flag, it can set both simple and complex configuration settings, including Arrays and Objects.\n ",examples:[["Set a simple configuration setting (a string, a number, or a boolean)","yarn config set initScope myScope"],["Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag",'yarn config set initScope --json \\"myScope\\"'],["Set a complex configuration setting (an Array) using the `--json` flag",'yarn config set unsafeHttpWhitelist --json \'["*.example.com", "example.com"]\''],["Set a complex configuration setting (an Object) using the `--json` flag",'yarn config set packageExtensions --json \'{ "@babel/parser@*": { "dependencies": { "@babel/types": "*" } } }\''],["Set a nested configuration setting",'yarn config set npmScopes.company.npmRegistryServer "https://npm.example.com"'],["Set a nested configuration setting using indexed access for non-simple keys",'yarn config set \'npmRegistries["//npm.example.com"].npmAuthToken\' "ffffffff-ffff-ffff-ffff-ffffffffffff"']]}),(0,a.gn)([C.Command.String()],q.prototype,"name",void 0),(0,a.gn)([C.Command.String()],q.prototype,"value",void 0),(0,a.gn)([C.Command.Boolean("--json",{description:"Set complex configuration settings to JSON values"})],q.prototype,"json",void 0),(0,a.gn)([C.Command.Boolean("-H,--home",{description:"Update the home configuration instead of the project configuration"})],q.prototype,"home",void 0),(0,a.gn)([C.Command.Path("config","set")],q.prototype,"execute",null);class z extends c.BaseCommand{constructor(){super(...arguments),this.verbose=!1,this.why=!1,this.json=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins,{strict:!1});return(await p.Pk.start({configuration:e,json:this.json,stdout:this.context.stdout},async t=>{if(e.invalid.size>0&&!this.json){for(const[r,A]of e.invalid)t.reportError(u.b.INVALID_CONFIGURATION_KEY,`Invalid configuration key "${r}" in ${A}`);t.reportSeparator()}if(this.json){const r=P.sortMap(e.settings.keys(),e=>e);for(const A of r){const r=e.settings.get(A),n=e.getSpecial(A,{hideSecrets:!0,getNativePaths:!0}),o=e.sources.get(A);this.verbose?t.reportJson({key:A,effective:n,source:o}):t.reportJson({key:A,effective:n,source:o,...r})}}else{const r=P.sortMap(e.settings.keys(),e=>e),A=r.reduce((e,t)=>Math.max(e,t.length),0),n={breakLength:1/0,colors:e.get("enableColors"),maxArrayLength:2};if(this.why||this.verbose){const o=r.map(t=>{const r=e.settings.get(t);if(!r)throw new Error(`Assertion failed: This settings ("${t}") should have been registered`);return[t,this.why?e.sources.get(t)||"":r.description]}),i=o.reduce((e,[,t])=>Math.max(e,t.length),0);for(const[r,s]of o)t.reportInfo(null,`${r.padEnd(A," ")} ${s.padEnd(i," ")} ${(0,T.inspect)(e.getSpecial(r,{hideSecrets:!0,getNativePaths:!0}),n)}`)}else for(const o of r)t.reportInfo(null,`${o.padEnd(A," ")} ${(0,T.inspect)(e.getSpecial(o,{hideSecrets:!0,getNativePaths:!0}),n)}`)}})).exitCode()}}z.usage=C.Command.Usage({description:"display the current configuration",details:"\n This command prints the current active configuration settings.\n ",examples:[["Print the active configuration settings","$0 config"]]}),(0,a.gn)([C.Command.Boolean("-v,--verbose",{description:"Print the setting description on top of the regular key/value information"})],z.prototype,"verbose",void 0),(0,a.gn)([C.Command.Boolean("--why",{description:"Print the reason why a setting is set a particular way"})],z.prototype,"why",void 0),(0,a.gn)([C.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],z.prototype,"json",void 0),(0,a.gn)([C.Command.Path("config")],z.prototype,"execute",null);var W,V=r(15966),X=r(35691),_=r(2401),Z=r.n(_);!function(e){e.HIGHEST="highest"}(W||(W={}));const $=new Set(Object.values(W)),ee={highest:async(e,t,{resolver:r,fetcher:A,resolveOptions:n,fetchOptions:o})=>{const i=new Map;for(const[t,r]of e.storedResolutions){const A=e.storedDescriptors.get(t);if(void 0===A)throw new Error(`Assertion failed: The descriptor (${t}) should have been registered`);P.getSetWithDefault(i,A.identHash).add(r)}return Array.from(e.storedDescriptors.values(),async A=>{if(t.length&&!Z().isMatch(d.stringifyIdent(A),t))return null;const o=e.storedResolutions.get(A.descriptorHash);if(void 0===o)throw new Error(`Assertion failed: The resolution (${A.descriptorHash}) should have been registered`);const s=e.originalPackages.get(o);if(void 0===s)return null;if(!r.shouldPersistResolution(s,n))return null;const a=i.get(A.identHash);if(void 0===a)throw new Error(`Assertion failed: The resolutions (${A.identHash}) should have been registered`);if(1===a.size)return null;const c=[...a].map(t=>{const r=e.originalPackages.get(t);if(void 0===r)throw new Error(`Assertion failed: The package (${t}) should have been registered`);return r.reference}),g=await r.getSatisfying(A,c,n),l=null==g?void 0:g[0];if(void 0===l)return null;const u=l.locatorHash,h=e.originalPackages.get(u);if(void 0===h)throw new Error(`Assertion failed: The package (${u}) should have been registered`);return u===o?null:{descriptor:A,currentPackage:s,updatedPackage:h}})}};class te extends c.BaseCommand{constructor(){super(...arguments),this.patterns=[],this.strategy=W.HIGHEST,this.check=!1,this.json=!1}async execute(){const e=await s.VK.find(this.context.cwd,this.context.plugins),{project:t}=await h.I.find(e,this.context.cwd),r=await g.C.find(e);let A=0;const n=await p.Pk.start({configuration:e,includeFooter:!1,stdout:this.context.stdout,json:this.json},async e=>{A=await async function(e,{strategy:t,patterns:r,cache:A,report:n}){const{configuration:o}=e,i=new I.$,s=o.makeResolver(),a=o.makeFetcher(),c={cache:A,checksums:e.storedChecksums,fetcher:a,project:e,report:i,skipIntegrityCheck:!0},g={project:e,resolver:s,report:i,fetchOptions:c};return await n.startTimerPromise("Deduplication step",async()=>{const A=ee[t],i=await A(e,r,{resolver:s,resolveOptions:g,fetcher:a,fetchOptions:c}),l=X.yG.progressViaCounter(i.length);n.reportProgress(l);let h,p=0;switch(await Promise.all(i.map(t=>t.then(t=>{if(null===t)return;p++;const{descriptor:r,currentPackage:A,updatedPackage:i}=t;n.reportInfo(u.b.UNNAMED,`${d.prettyDescriptor(o,r)} can be deduped from ${d.prettyLocator(o,A)} to ${d.prettyLocator(o,i)}`),n.reportJson({descriptor:d.stringifyDescriptor(r),currentResolution:d.stringifyLocator(A),updatedResolution:d.stringifyLocator(i)}),e.storedResolutions.set(r.descriptorHash,i.locatorHash)}).finally(()=>l.tick()))),p){case 0:h="No packages";break;case 1:h="One package";break;default:h=p+" packages"}const C=B.pretty(o,t,B.Type.CODE);return n.reportInfo(u.b.UNNAMED,`${h} can be deduped using the ${C} strategy`),p})}(t,{strategy:this.strategy,patterns:this.patterns,cache:r,report:e})});if(n.hasErrors())return n.exitCode();if(this.check)return A?1:0;return(await p.Pk.start({configuration:e,stdout:this.context.stdout,json:this.json},async e=>{await t.install({cache:r,report:e})})).exitCode()}}te.schema=V.object().shape({strategy:V.string().test({name:"strategy",message:"${path} must be one of ${strategies}",params:{strategies:[...$].join(", ")},test:e=>$.has(e)})}),te.usage=C.Command.Usage({description:"deduplicate dependencies with overlapping ranges",details:"\n Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\n\n This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\n\n - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\n\n **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\n\n If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n ### In-depth explanation:\n\n Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\n\n Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\n ",examples:[["Dedupe all packages","$0 dedupe"],["Dedupe all packages using a specific strategy","$0 dedupe --strategy highest"],["Dedupe a specific package","$0 dedupe lodash"],["Dedupe all packages with the `@babel/*` scope","$0 dedupe '@babel/*'"],["Check for duplicates (can be used as a CI step)","$0 dedupe --check"]]}),(0,a.gn)([C.Command.Rest()],te.prototype,"patterns",void 0),(0,a.gn)([C.Command.String("-s,--strategy",{description:"The strategy to use when deduping dependencies"})],te.prototype,"strategy",void 0),(0,a.gn)([C.Command.Boolean("-c,--check",{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"})],te.prototype,"check",void 0),(0,a.gn)([C.Command.Boolean("--json",{description:"Format the output as an NDJSON stream"})],te.prototype,"json",void 0),(0,a.gn)([C.Command.Path("dedupe")],te.prototype,"execute",null);class re extends C.Command{async execute(){const{plugins:e}=await s.VK.find(this.context.cwd,this.context.plugins),t=[];for(const r of e){const{commands:e}=r[1];if(e){const A=C.Cli.from(e).definitions();t.push([r[0],A])}}const A=this.cli.definitions(),n=r(60306)["@yarnpkg/builder"].bundles.standard;for(const e of t){const t=e[1];for(const r of t)A.find(e=>{return t=e.path,A=r.path,t.split(" ").slice(1).join()===A.split(" ").slice(1).join();var t,A}).plugin={name:e[0],isDefault:n.includes(e[0])}}this.context.stdout.write(JSON.stringify({commands:A},null,2)+"\n")}}(0,a.gn)([C.Command.Path("--clipanion=definitions")],re.prototype,"execute",null);class Ae extends C.Command{async execute(){this.context.stdout.write(this.cli.usage(null))}}(0,a.gn)([C.Command.Path("help"),C.Command.Path("--help"),C.Command.Path("-h")],Ae.prototype,"execute",null);class ne extends C.Command{constructor(){super(...arguments),this.args=[]}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!d.tryParseIdent(this.leadingArgument)){const e=m.y1.resolve(this.context.cwd,m.cS.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:e})}return await this.cli.run(["run",this.leadingArgument,...this.args])}}(0,a.gn)([C.Command.String()],ne.prototype,"leadingArgument",void 0),(0,a.gn)([C.Command.Proxy()],ne.prototype,"args",void 0);var oe=r(59355);class ie extends C.Command{async execute(){this.context.stdout.write((oe.o||" |