"
diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm
index 868d33a332..44a9a88a6b 100644
--- a/code/modules/client/preferences_gear.dm
+++ b/code/modules/client/preferences_gear.dm
@@ -73,6 +73,7 @@ var/global/list/gear_datums_by_name = list()
/datum/gear/eyewear/sunglasses
display_name = "Sunglasses"
path = /obj/item/clothing/glasses/sunglasses
+ cost = 0
/datum/gear/eyewear/prescription_sunglasses
display_name = "Prescription sunglasses"
@@ -137,6 +138,7 @@ var/global/list/gear_datums_by_name = list()
/datum/gear/mask/gas
display_name = "Gas mask"
path = /obj/item/clothing/mask/gas
+ cost = 1
/datum/gear/mask/scarf_black
display_name = "Scarf, black"
@@ -279,6 +281,10 @@ var/global/list/gear_datums_by_name = list()
display_name = "USCM cap"
path = /obj/item/clothing/head/cmcap
+/datum/gear/headwear/uscm/cap/flap
+ display_name = "USCM flapcap"
+ path = /obj/item/clothing/head/cmcap/flap
+
/datum/gear/headwear/uscm/headband_brown
display_name = "USCM headband, brown"
path = /obj/item/clothing/head/headband/brown
@@ -821,6 +827,10 @@ var/global/list/gear_datums_by_name = list()
display_name = "Canteen"
path = /obj/item/reagent_container/food/drinks/flask/canteen
+/datum/gear/flask/canteen/empty
+ display_name = "Empty canteen"
+ path = /obj/item/reagent_container/food/drinks/flask/canteen/empty
+
/datum/gear/flask/leather
display_name = "Leather flask"
path = /obj/item/reagent_container/food/drinks/flask/detflask
@@ -966,6 +976,36 @@ var/global/list/gear_datums_by_name = list()
display_name = "Pack Of Lucky Strikes"
path = /obj/item/storage/fancy/cigarettes/lucky_strikes
+/datum/gear/smoking/pack_emeraldgreen
+ display_name = "Pack Of Emerald Greens"
+ path = /obj/item/storage/fancy/cigarettes/emeraldgreen
+ cost = 3
+
+/datum/gear/smoking/pack_wygold
+ display_name = "Pack Of Weyland Yutani Golds"
+ path = /obj/item/storage/fancy/cigarettes/wypacket
+ cost = 3
+
+/datum/gear/smoking/pack_koorlander
+ display_name = "Pack Of Koorlander Golds"
+ path = /obj/item/storage/fancy/cigarettes/kpack
+ cost = 3
+
+/datum/gear/smoking/pack_arcturian
+ display_name = "Pack Of Arcturian Aces"
+ path = /obj/item/storage/fancy/cigarettes/arcturian_ace
+ cost = 3
+
+/datum/gear/smoking/pack_ladyfingers
+ display_name = "Pack Of Lady Fingers"
+ path = /obj/item/storage/fancy/cigarettes/lady_finger
+ cost = 3
+
+/datum/gear/smoking/pack_exec
+ display_name = "Pack Of Executive Selects"
+ path = /obj/item/storage/fancy/cigarettes/blackpack
+ cost = 4
+
/datum/gear/smoking/weed_joint
display_name = "Joint of space weed"
path = /obj/item/clothing/mask/cigarette/weed
@@ -980,6 +1020,11 @@ var/global/list/gear_datums_by_name = list()
display_name = "Lighter, zippo"
path = /obj/item/tool/lighter/zippo
+/datum/gear/smoking/goldzippo
+ display_name = "Lighter, golden zippo"
+ path = /obj/item/tool/lighter/zippo/gold
+ cost = 4
+
/datum/gear/smoking/electronic_cigarette
display_name = "Electronic cigarette"
path = /obj/item/clothing/mask/electronic_cigarette
@@ -1044,7 +1089,7 @@ var/global/list/gear_datums_by_name = list()
/datum/gear/misc/patch_uscm
display_name = "USCM shoulder patch"
path = /obj/item/clothing/accessory/patch
- cost = 1
+ cost = 0
slot = WEAR_IN_ACCESSORY
allowed_origins = USCM_ORIGINS
@@ -1052,10 +1097,6 @@ var/global/list/gear_datums_by_name = list()
display_name = "Solar Devils shoulder patch"
path = /obj/item/clothing/accessory/patch/devils
-/datum/gear/misc/patch_uscm/falcon
- display_name = "Falling Falcons shoulder patch"
- path = /obj/item/clothing/accessory/patch/falcon
-
/datum/gear/misc/family_photo
display_name = "Family photo"
path = /obj/item/prop/helmetgarb/family_photo
@@ -1073,3 +1114,13 @@ var/global/list/gear_datums_by_name = list()
display_name = "Cut-throat razor"
path = /obj/item/weapon/straight_razor
cost = 3
+
+/datum/gear/misc/flak
+ display_name = "M67 flak jacket"
+ path = /obj/item/clothing/accessory/flak
+ cost = 3
+
+/datum/gear/misc/servicejacket
+ display_name = "Marine Service Jacket"
+ path = /obj/item/clothing/suit/storage/jacket/marine/service
+ cost = 3
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 1403b64bc4..4e6e166b2b 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -168,7 +168,7 @@
/proc/sanitize_keybindings(value)
var/list/base_bindings = sanitize_islist(value, list())
if(!length(base_bindings))
- base_bindings = deepCopyList(GLOB.hotkey_keybinding_list_by_key)
+ base_bindings = deep_copy_list(GLOB.hotkey_keybinding_list_by_key)
for(var/key in base_bindings)
base_bindings[key] = base_bindings[key] & GLOB.keybindings_by_name
if(!length(base_bindings[key]))
diff --git a/code/modules/client/tgui_macro.dm b/code/modules/client/tgui_macro.dm
index f245f1d657..de44b3b523 100644
--- a/code/modules/client/tgui_macro.dm
+++ b/code/modules/client/tgui_macro.dm
@@ -123,7 +123,7 @@ GLOBAL_LIST_EMPTY(ui_data_keybindings)
if(choice == "Cancel")
return TRUE
prefs.hotkeys = (choice == "Hotkey")
- prefs.key_bindings = (prefs.hotkeys) ? deepCopyList(GLOB.hotkey_keybinding_list_by_key) : deepCopyList(GLOB.classic_keybinding_list_by_key)
+ prefs.key_bindings = (prefs.hotkeys) ? deep_copy_list(GLOB.hotkey_keybinding_list_by_key) : deep_copy_list(GLOB.classic_keybinding_list_by_key)
INVOKE_ASYNC(owner, /client/proc/set_macros)
prefs.save_preferences()
return TRUE
diff --git a/code/modules/clothing/head/head.dm b/code/modules/clothing/head/head.dm
index 1c9f7ea929..f6a3297148 100644
--- a/code/modules/clothing/head/head.dm
+++ b/code/modules/clothing/head/head.dm
@@ -615,7 +615,7 @@
/obj/item/clothing/head/CMB
name = "\improper Colonial Marshal Bureau cap"
- desc = "A dark cap enscribed with the powerful letters of 'MARSHAL' representing justice, authority, and protection in the outer rim. The laws of the Earth stretch beyond the Sol."
+ desc = "A black cap boldly presenting the acronym 'CMB'. Made using durable fabric, it might stop a very low caliber round from penetrating it, or a stab from piercing it. That isn't to say you won't have a dent in your head."
icon = 'icons/obj/items/clothing/cm_hats.dmi'
item_icons = list(
WEAR_HEAD = 'icons/mob/humans/onmob/head_1.dmi'
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index a2366692f9..92d9830ba4 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -283,6 +283,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list(
/obj/item/prop/helmetgarb/cartridge = "cartridge",
/obj/item/prop/helmetgarb/prescription_bottle = "prescription_bottle",
/obj/item/prop/helmetgarb/raincover = "raincover",
+ /obj/item/prop/helmetgarb/camocover = "camocover",
/obj/item/prop/helmetgarb/rabbitsfoot = "rabbitsfoot",
/obj/item/prop/helmetgarb/rosary = "helmet_rosary", // This one was already in the game for some reason, but never had an object
/obj/item/prop/helmetgarb/lucky_feather = "lucky_feather",
@@ -294,6 +295,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list(
/obj/item/prop/helmetgarb/helmet_nvg/cosmetic = HELMET_GARB_RELAY_ICON_STATE,
/obj/item/prop/helmetgarb/helmet_nvg/marsoc = HELMET_GARB_RELAY_ICON_STATE,
/obj/item/prop/helmetgarb/helmet_gasmask = "helmet_gasmask",
+ /obj/item/prop/helmetgarb/helmet_gasmask/upp = "helmet_uppgasmask",
/obj/item/prop/helmetgarb/flair_initech = "flair_initech",
/obj/item/prop/helmetgarb/flair_io = "flair_io",
/obj/item/prop/helmetgarb/flair_peace ="flair_peace_smiley",
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 1b1ff8d606..a0a39f136e 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -1,7 +1,7 @@
/obj/item/clothing/mask/gas
name = "gas mask"
- desc = "A face-covering mask that can be connected to an air supply. Filters harmful gases from the air."
+ desc = "A civilian grade, face-covering mask that can be connected to an air supply. Filters harmful gases from the air."
icon_state = "gas_alt"
flags_inventory = COVERMOUTH | COVEREYES | ALLOWINTERNALS | BLOCKGASEFFECT | ALLOWREBREATH | ALLOWCPR
flags_inv_hide = HIDEEARS|HIDEFACE|HIDELOWHAIR
@@ -31,6 +31,18 @@
icon_state = "kutjevo_respirator"
item_state = "kutjevo_respirator"
+/obj/item/clothing/mask/gas/m5
+ name = "\improper M5 standalone gasmask"
+ desc = "The standard service gas mask of the USCM as part of a modernization program meant to replace the need for MOPP gear. This one is the alternative variant meant for Marines not in combat kit."
+ icon_state = "m5_gasmask"
+ item_state = "m5_gasmask"
+
+/obj/item/clothing/mask/gas/upp
+ name = "\improper PMK-63 gasmask"
+ desc = "The Union service mask issued to backline troops not prepared for combat."
+ icon_state = "upp_gasmask"
+ item_state = "upp_gasmask"
+
/obj/item/clothing/mask/gas/pve_mopp
name = "\improper M2 MOPP mask"
desc = "The M2 MOPP mask includes a full covering cowl that securely attaches to the MOPP suit. It is capable of protecting of a variety of radiological and biological threats."
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index c39e6a6208..18ffacf57b 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -52,19 +52,6 @@
siemens_coefficient = 0.9
flags_armor_protection = BODY_FLAG_HEAD|BODY_FLAG_FACE|BODY_FLAG_EYES
-/obj/item/clothing/mask/horsehead
- name = "horse head mask"
- desc = "A mask made of soft vinyl and latex, representing the head of a horse."
- icon_state = "horsehead"
- item_state = "horsehead"
- flags_inventory = COVERMOUTH|COVEREYES
- flags_inv_hide = HIDEFACE|HIDEALLHAIR|HIDEEYES|HIDEEARS
- flags_armor_protection = BODY_FLAG_HEAD|BODY_FLAG_FACE|BODY_FLAG_EYES
- w_class = SIZE_SMALL
- var/voicechange = 0
- siemens_coefficient = 0.9
-
-
/obj/item/clothing/mask/balaclava
name = "balaclava"
desc = "A basic single eye-hole balaclava, available in almost every sporting goods, outdoor supply, or military surplus store in existance, protects your face from the cold almost as well as it conceals it. This one is in a standard black color."
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index f9edccf774..6bfccf215d 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -192,7 +192,6 @@
armor_rad = CLOTHING_ARMOR_NONE
armor_internaldamage = CLOTHING_ARMOR_MEDIUM
flags_inventory = BLOCKSHARPOBJ
- flags_inv_hide = HIDEJUMPSUIT
siemens_coefficient = 0.5
time_to_unequip = 20
time_to_equip = 20
diff --git a/code/modules/clothing/suits/marine_armor.dm b/code/modules/clothing/suits/marine_armor.dm
index 93160e68ff..6c5701c1a3 100644
--- a/code/modules/clothing/suits/marine_armor.dm
+++ b/code/modules/clothing/suits/marine_armor.dm
@@ -408,7 +408,7 @@
/obj/item/clothing/suit/storage/marine/smartgunner/mob_can_equip(mob/equipping_mob, slot, disable_warning = FALSE)
. = ..()
- if(equipping_mob.back)
+ if(equipping_mob.back && !(equipping_mob.back.flags_item & SMARTGUNNER_BACKPACK_OVERRIDE))
to_chat(equipping_mob, SPAN_WARNING("You can't equip [src] while wearing a backpack."))
return FALSE
@@ -424,10 +424,9 @@
if(slot != WEAR_BACK)
return
-
- if(is_type_in_list(equipping_item, smartgun_back))
+ if(equipping_item.flags_item & SMARTGUNNER_BACKPACK_OVERRIDE || is_type_in_list(equipping_item, smartgun_back))
return
-
+
. = COMPONENT_HUMAN_CANCEL_ATTEMPT_EQUIP
if(equipping_item.flags_equip_slot == SLOT_BACK)
@@ -442,6 +441,10 @@
/obj/item/clothing/suit/storage/marine/smartgunner/standard
flags_atom = NO_SNOW_TYPE
+/obj/item/clothing/suit/storage/marine/smartgunner/black
+ flags_atom = NO_SNOW_TYPE
+ icon_state = "8fancy"
+
/obj/item/clothing/suit/storage/marine/smartgunner/upp
name = "\improper UH7-I heavy plated harness"
desc = "An experimental set of heavy armor with additional harnesses designed to support QYJ-72-I smartmachinegun. Heavy plates along with harnesses make wearing backpacks extremely uncomfortable and borderline impossible."
@@ -469,6 +472,13 @@
/obj/item/storage/backpack/general_belt,
/obj/item/device/motiondetector,
/obj/item/device/walkman,
+ /obj/item/storage/large_holster/machete,
+ /obj/item/storage/belt/gun/type47,
+ )
+
+ smartgun_back = list(
+ /obj/item/storage/large_holster/machete,
+ /obj/item/ammo_box,
)
@@ -567,8 +577,10 @@
/obj/item/clothing/suit/storage/marine/light/vest/dcc
name = "\improper M3-VL pattern flak vest"
- desc = "A combination of the standard non-combat M3-VL ballistics vest and M70 flak jacket, this piece of armor has been distributed to dropship crew to keep them safe from threats external and internal..."
+ desc = "Effectively a combination of the M3-VL ballistics vest and M70 flak jacket, this armor is used by primarily by flight personnel because of its combined flak and ballistic defense and high mobility. It is also typically worn by military police officers as a result of the blunt force protection offered by the aforementioned armor layering."
icon_state = "VL_FLAK"
+ armor_melee = CLOTHING_ARMOR_MEDIUMHIGH
+ armor_bomb = CLOTHING_ARMOR_MEDIUM
storage_slots = 2
/obj/item/clothing/suit/storage/marine/light/synvest
@@ -1530,7 +1542,7 @@
/obj/item/clothing/suit/storage/CMB
name = "\improper CMB Deputy jacket"
- desc = "A thick and stylish black leather jacket with a Marshal's Deputy badge pinned to it. The back is enscribed with the powerful letters of 'DEPUTY' representing justice, authority, and protection in the outer rim. The laws of the Earth stretch beyond the Sol."
+ desc = "A polyster blue bomber jacket enforced with light ballistic weaving. It has a Marshal's Deputy badge pinned to it. The back is enscribed with the word 'DEPUTY'."
icon_state = "CMB_jacket"
item_state = "CMB_jacket"
blood_overlay_type = "coat"
@@ -1581,7 +1593,7 @@
/obj/item/clothing/suit/storage/CMB/marshal
name = "\improper CMB Marshal jacket"
- desc = "A thick and stylish black leather jacket with a Marshal's badge pinned to it. The back is enscribed with the powerful letters of 'MARSHAL' representing justice, authority, and protection in the outer rim. The laws of the Earth stretch beyond the Sol."
+ desc = "A thick and stylish black leather bomber jacket with a Marshal's badge pinned to it. The back is enscribed with the word 'MARSHAL'."
icon_state = "CMB_jacket_marshal"
item_state = "CMB_jacket_marshal"
diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm
index 0d5fc31a25..7ac0ddc018 100644
--- a/code/modules/clothing/suits/storage.dm
+++ b/code/modules/clothing/suits/storage.dm
@@ -10,6 +10,10 @@
pockets.max_storage_space = 4
flags_atom |= USES_HEARING
+/obj/item/clothing/suit/storage/Destroy()
+ QDEL_NULL(pockets)
+ return ..()
+
/obj/item/clothing/suit/storage/get_pockets()
if(pockets)
return pockets
diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm
index 23080104a4..db82f31c0e 100644
--- a/code/modules/clothing/under/ties.dm
+++ b/code/modules/clothing/under/ties.dm
@@ -363,6 +363,13 @@
desc = "An armband, worn by the rookie nurses to display they are still not doctors. This one is dark red."
icon_state = "nurse"
+/obj/item/clothing/accessory/armband/mpsec
+ name = "military police armband"
+ desc = "An armband used by military police officers to denote their position."
+ icon_state = "armband_mp"
+ slot = ACCESSORY_SLOT_ARMBAND
+ jumpsuit_hide_states = (UNIFORM_SLEEVE_CUT|UNIFORM_JACKET_REMOVED)
+
//patches
/obj/item/clothing/accessory/patch
name = "USCM patch"
@@ -937,3 +944,27 @@
icon = 'icons/obj/items/clothing/ties.dmi'
icon_state = "owlf_vest"
item_state = "owlf_vest"
+
+/obj/item/clothing/accessory/flak
+ name = "M67 flak vest"
+ desc = "An older model of flak jacket worn by combat support personnel such as dropship crew, or occasionally by smartgunners. Much comfier than its M70 successor, and can be worn under most combat armor, however, the ballistic protection leaves much to be desired."
+ icon_state = "flak"
+ item_state = "flak"
+ w_class = SIZE_MEDIUM
+ var/tucked_in = FALSE
+
+/obj/item/clothing/accessory/flak/get_examine_text(mob/user)
+ . = ..()
+ . += SPAN_NOTICE("You can wear it differently by
using it in hand.")
+
+/obj/item/clothing/accessory/flak/attack_self(mob/user)
+ ..()
+
+ tucked_in = !tucked_in
+ if(tucked_in)
+ icon_state = "flakslim"
+ user.visible_message(SPAN_NOTICE("[user] tucks in [src]'s sleeves."), SPAN_NOTICE("You tuck in [src]'s sleeves."))
+ else
+ icon_state = initial(icon_state)
+ user.visible_message(SPAN_NOTICE("[user] decides to keep [src] nice and puffy."), SPAN_NOTICE("You decide to keep [src] nice and puffy."))
+ item_state = icon_state
diff --git a/code/modules/cm_aliens/Ovipositor.dm b/code/modules/cm_aliens/Ovipositor.dm
index 07d3466a27..b8983f37cc 100644
--- a/code/modules/cm_aliens/Ovipositor.dm
+++ b/code/modules/cm_aliens/Ovipositor.dm
@@ -14,11 +14,11 @@
. = ..()
begin_decay_time = world.timeofday + QUEEN_OVIPOSITOR_DECAY_TIME
- START_PROCESSING(SSeffects, src) // Process every second
+ START_PROCESSING(SSoldeffects, src) // Process every second
/obj/ovipositor/Destroy()
if(!decayed && !destroyed)
- STOP_PROCESSING(SSeffects, src)
+ STOP_PROCESSING(SSoldeffects, src)
return ..()
@@ -32,7 +32,7 @@
/obj/ovipositor/proc/do_decay()
decayed = TRUE
- STOP_PROCESSING(SSeffects, src)
+ STOP_PROCESSING(SSoldeffects, src)
icon_state = "ovipositor_molted"
flick("ovipositor_decay", src)
@@ -46,7 +46,7 @@
/obj/ovipositor/proc/explode()
destroyed = TRUE
- STOP_PROCESSING(SSeffects, src)
+ STOP_PROCESSING(SSoldeffects, src)
icon_state = "ovipositor_gibbed"
flick("ovipositor_explosion", src)
diff --git a/code/modules/cm_aliens/structures/special/egg_morpher.dm b/code/modules/cm_aliens/structures/special/egg_morpher.dm
index 1fd154eb35..e8040f81ba 100644
--- a/code/modules/cm_aliens/structures/special/egg_morpher.dm
+++ b/code/modules/cm_aliens/structures/special/egg_morpher.dm
@@ -14,14 +14,14 @@
var/huggers_to_grow_max = 12
var/huggers_reserved = 0
var/mob/captured_mob
- var/datum/shape/rectangle/range_bounds
+ var/datum/shape/range_bounds
appearance_flags = KEEP_TOGETHER
layer = FACEHUGGER_LAYER
/obj/effect/alien/resin/special/eggmorph/Initialize(mapload, hive_ref)
. = ..()
- range_bounds = RECT(x, y, EGGMORPG_RANGE, EGGMORPG_RANGE)
+ range_bounds = SQUARE(x, y, EGGMORPG_RANGE)
/obj/effect/alien/resin/special/eggmorph/Destroy()
if (stored_huggers && linked_hive)
@@ -155,7 +155,7 @@
/obj/effect/alien/resin/special/eggmorph/proc/check_facehugger_target()
if(!range_bounds)
- range_bounds = RECT(x, y, EGGMORPG_RANGE, EGGMORPG_RANGE)
+ range_bounds = SQUARE(x, y, EGGMORPG_RANGE)
var/list/targets = SSquadtree.players_in_range(range_bounds, z, QTREE_SCAN_MOBS | QTREE_EXCLUDE_OBSERVER)
if(isnull(targets) || !length(targets))
diff --git a/code/modules/cm_aliens/weeds.dm b/code/modules/cm_aliens/weeds.dm
index 736d4f9474..9d15211f21 100644
--- a/code/modules/cm_aliens/weeds.dm
+++ b/code/modules/cm_aliens/weeds.dm
@@ -511,9 +511,9 @@
overlay_node = TRUE
overlays += staticnode
-/obj/effect/alien/weeds/node/Initialize(mapload, obj/effect/alien/weeds/node/node, mob/living/carbon/xenomorph/xeno, datum/hive_status/hive)
- if (istype(hive))
- linked_hive = hive
+/obj/effect/alien/weeds/node/Initialize(mapload, hive, mob/living/carbon/xenomorph/xeno)
+ if (hive)
+ linked_hive = GLOB.hive_datum[hive]
else if (istype(xeno) && xeno.hive)
linked_hive = xeno.hive
else
diff --git a/code/modules/cm_marines/NonLethalRestraints.dm b/code/modules/cm_marines/NonLethalRestraints.dm
index a7f0277c8a..fb378e1ab5 100644
--- a/code/modules/cm_marines/NonLethalRestraints.dm
+++ b/code/modules/cm_marines/NonLethalRestraints.dm
@@ -31,7 +31,7 @@
to_chat(user, SPAN_WARNING("\The [src] is out of charge."))
add_fingerprint(user)
-/obj/item/weapon/stunprod/attack(mob/M, mob/user)
+/obj/item/weapon/stunprod/attack(mob/living/M, mob/user)
if(isrobot(M))
..()
return
@@ -43,7 +43,8 @@
return
if(status)
- M.apply_effect(6, WEAKEN)
+ M.KnockDown(6)
+ M.Stun(6)
charges -= 2
M.visible_message(SPAN_DANGER("[M] has been prodded with the [src] by [user]!"))
diff --git a/code/modules/cm_marines/dropship_equipment.dm b/code/modules/cm_marines/dropship_equipment.dm
index 955b009fbe..17d612b3ba 100644
--- a/code/modules/cm_marines/dropship_equipment.dm
+++ b/code/modules/cm_marines/dropship_equipment.dm
@@ -6,6 +6,8 @@
icon = 'icons/obj/structures/props/almayer_props.dmi'
climbable = TRUE
layer = ABOVE_OBJ_LAYER //so they always appear above attach points when installed
+ var/shorthand
+
var/list/equip_categories //on what kind of base this can be installed.
var/obj/effect/attach_point/ship_base //the ship base the equipment is currently installed on.
var/uses_ammo = FALSE //whether it uses ammo
@@ -19,10 +21,11 @@
var/skill_required = SKILL_PILOT_TRAINED
var/combat_equipment = TRUE
+
/obj/structure/dropship_equipment/Destroy()
QDEL_NULL(ammo_equipped)
if(linked_shuttle)
- linked_shuttle.equipments -= src
+ SEND_SIGNAL(linked_shuttle, COMSIG_DROPSHIP_REMOVE_EQUIPMENT, src)
linked_shuttle = null
if(ship_base)
ship_base.installed_equipment = null
@@ -33,6 +36,7 @@
linked_console = null
. = ..()
+
/obj/structure/dropship_equipment/attack_alien(mob/living/carbon/xenomorph/current_xenomorph)
if(unslashable)
return XENO_NO_DELAY_ACTION
@@ -122,7 +126,7 @@
ship_base.installed_equipment = null
ship_base = null
if(linked_shuttle)
- linked_shuttle.equipments -= src
+ SEND_SIGNAL(linked_shuttle, COMSIG_DROPSHIP_REMOVE_EQUIPMENT, src)
linked_shuttle = null
if(linked_console && linked_console.selected_equipment == src)
linked_console.selected_equipment = null
@@ -159,7 +163,8 @@
health = null
icon_state = "sentry_system"
is_interactable = TRUE
- point_cost = 500
+ point_cost = 200
+ shorthand = "Sentry"
var/deployment_cooldown
var/obj/structure/machinery/defenses/sentry/premade/dropship/deployed_turret
combat_equipment = FALSE
@@ -176,6 +181,28 @@
if(!deployed_turret)
. += "Its turret is missing."
+/obj/structure/dropship_equipment/sentry_holder/ui_data(mob/user)
+ var/obj/structure/machinery/defenses/defense = deployed_turret
+ . = list()
+ var/is_deployed = deployed_turret.loc != src
+ .["name"] = defense.name
+ .["area"] = get_area(defense)
+ .["active"] = defense.turned_on
+ .["nickname"] = defense.nickname
+ .["camera_available"] = defense.has_camera && is_deployed
+ .["selection_state"] = list()
+ .["kills"] = defense.kills
+ .["iff_status"] = defense.faction_group
+ .["health"] = defense.health
+ .["health_max"] = defense.health_max
+ .["deployed"] = is_deployed
+
+ if(istype(defense, /obj/structure/machinery/defenses/sentry))
+ var/obj/structure/machinery/defenses/sentry/sentrygun = defense
+ .["rounds"] = sentrygun.ammo.current_rounds
+ .["max_rounds"] = sentrygun.ammo.max_rounds
+ .["engaged"] = length(sentrygun.targets)
+
/obj/structure/dropship_equipment/sentry_holder/on_launch()
if(ship_base && ship_base.base_category == DROPSHIP_WEAPON) //only external sentires are automatically undeployed
undeploy_sentry()
@@ -261,8 +288,7 @@
deployed_turret.linked_cam.network = list(CAMERA_NET_ALAMO)
else if (linked_shuttle.id == DROPSHIP_NORMANDY)
deployed_turret.linked_cam.network = list(CAMERA_NET_NORMANDY)
- else if(linked_shuttle.id == DROPSHIP_MIDWAY)
- deployed_turret.linked_cam.network = list(CAMERA_NET_MIDWAY)
+
/obj/structure/dropship_equipment/sentry_holder/proc/undeploy_sentry()
if(!deployed_turret)
@@ -291,6 +317,7 @@
equip_categories = list(DROPSHIP_WEAPON, DROPSHIP_CREW_WEAPON)
icon_state = "mg_system"
point_cost = 50
+ shorthand = "MG"
var/deployment_cooldown
var/obj/structure/machinery/m56d_hmg/mg_turret/dropship/deployed_mg
combat_equipment = FALSE
@@ -301,6 +328,21 @@
deployed_mg = new(src)
deployed_mg.deployment_system = src
+/obj/structure/dropship_equipment/mg_holder/Destroy()
+ QDEL_NULL(deployed_mg)
+ . = ..()
+
+/obj/structure/dropship_equipment/mg_holder/ui_data(mob/user)
+ . = list()
+ var/is_deployed = deployed_mg.loc != src
+ .["name"] = name
+ .["selection_state"] = list()
+ .["health"] = health
+ .["health_max"] = initial(health)
+ .["rounds"] = deployed_mg.rounds
+ .["max_rounds"] = deployed_mg.rounds_max
+ .["deployed"] = is_deployed
+
/obj/structure/dropship_equipment/mg_holder/get_examine_text(mob/user)
. = ..()
if(!deployed_mg)
@@ -331,6 +373,9 @@
..()
+/obj/structure/dropship_equipment/mg_holder/equipment_interact(mob/user)
+ attack_hand(user)
+
/obj/structure/dropship_equipment/mg_holder/update_equipment()
if(ship_base)
setDir(ship_base.dir)
@@ -340,9 +385,10 @@
if(ship_base.base_category == DROPSHIP_WEAPON)
switch(dir)
if(NORTH)
- if( istype(get_step(src, WEST), /turf/open) )
+ var/step_contents = get_step(src, EAST).contents
+ if(locate(/obj/structure) in step_contents)
deployed_mg.pixel_x = 5
- else if ( istype(get_step(src, EAST), /turf/open) )
+ else
deployed_mg.pixel_x = -5
if(EAST)
deployed_mg.pixel_y = 9
@@ -360,7 +406,7 @@
deployed_mg.forceMove(src)
deployed_mg.setDir(dir)
else
- icon_state = "mg_system_destroyed"
+ icon_state = "sentry_system_destroyed"
/obj/structure/dropship_equipment/mg_holder/proc/deploy_mg(mob/user)
if(deployed_mg)
@@ -369,12 +415,11 @@
if(ship_base.base_category == DROPSHIP_WEAPON)
switch(dir)
if(NORTH)
- if( istype(get_step(src, WEST), /turf/open) )
+ var/step_contents = get_step(src, EAST).contents
+ if(locate(/obj/structure) in step_contents)
deployed_mg.forceMove(get_step(src, WEST))
- else if ( istype(get_step(src, EAST), /turf/open) )
- deployed_mg.forceMove(get_step(src, EAST))
else
- deployed_mg.forceMove(get_step(src, NORTH))
+ deployed_mg.forceMove(get_step(src, EAST))
if(EAST)
deployed_mg.forceMove(get_step(src, SOUTH))
if(WEST)
@@ -443,10 +488,9 @@
point_cost = 0
-#define LIGHTING_MAX_LUMINOSITY_SHIPLIGHTS 12
-
/obj/structure/dropship_equipment/electronics/spotlights
name = "\improper AN/LEN-15 Spotlight"
+ shorthand = "Spotlight"
icon_state = "spotlights"
desc = "A set of high-powered spotlights to illuminate large areas. Fits on electronics attach points of dropships. Moving this will require a powerloader."
is_interactable = TRUE
@@ -458,7 +502,7 @@
if(spotlights_cooldown > world.time)
to_chat(user, SPAN_WARNING("[src] is busy."))
return //prevents spamming deployment/undeployment
- if(luminosity != brightness)
+ if(!light_on)
set_light(brightness)
icon_state = "spotlights_on"
to_chat(user, SPAN_NOTICE("You turn on [src]."))
@@ -471,22 +515,22 @@
/obj/structure/dropship_equipment/electronics/spotlights/update_equipment()
..()
if(ship_base)
- if(luminosity != brightness)
+ if(!light_on)
icon_state = "spotlights_off"
else
icon_state = "spotlights_on"
else
icon_state = "spotlights"
- if(luminosity)
+ if(light_on)
set_light(0)
-/obj/structure/dropship_equipment/electronics/spotlights/on_launch()
- set_light(0)
-
-/obj/structure/dropship_equipment/electronics/spotlights/on_arrival()
- set_light(brightness)
-
-#undef LIGHTING_MAX_LUMINOSITY_SHIPLIGHTS
+/obj/structure/dropship_equipment/electronics/spotlights/ui_data(mob/user)
+ . = list()
+ var/is_deployed = light_on
+ .["name"] = name
+ .["health"] = health
+ .["health_max"] = initial(health)
+ .["deployed"] = is_deployed
@@ -497,6 +541,7 @@
/obj/structure/dropship_equipment/electronics/targeting_system
name = "\improper AN/AAQ-178 Weapon Targeting System"
+ shorthand = "Targeting"
icon_state = "targeting_system"
desc = "A targeting system for dropships. It improves firing accuracy on laser targets. Fits on electronics attach points. You need a powerloader to lift this."
point_cost = 800
@@ -509,7 +554,8 @@
/obj/structure/dropship_equipment/electronics/landing_zone_detector
name = "\improper AN/AVD-60 LZ detector"
- desc = "An electronic device linked to the dropship's camera system that lets you observe your landing zone."
+ shorthand = "LZ Detector"
+ desc = "An electronic device linked to the dropship's camera system that lets you observe your landing zone mid-flight."
icon_state = "lz_detector"
point_cost = 50
var/obj/structure/machinery/computer/cameras/dropship/linked_cam_console
@@ -639,7 +685,7 @@
msg_admin_niche("[key_name(user)] is direct-firing [SA] onto [selected_target] at ([target_turf.x],[target_turf.y],[target_turf.z]) [ADMIN_JMP(target_turf)]")
if(ammo_travelling_time)
- var/total_seconds = max(round(ammo_travelling_time/10),1)
+ var/total_seconds = max(floor(ammo_travelling_time/10),1)
for(var/i = 0 to total_seconds)
sleep(10)
if(!selected_target || !selected_target.loc)//if laser disappeared before we reached the target,
@@ -655,7 +701,7 @@
new /obj/effect/overlay/temp/blinking_laser (impact)
sleep(10)
SA.source_mob = user
- SA.detonate_on(impact)
+ SA.detonate_on(impact, src)
/obj/structure/dropship_equipment/weapon/proc/open_fire_firemission(obj/selected_target, mob/user = usr)
set waitfor = 0
@@ -681,7 +727,7 @@
var/turf/impact = pick(possible_turfs)
sleep(3)
SA.source_mob = user
- SA.detonate_on(impact)
+ SA.detonate_on(impact, src)
/obj/structure/dropship_equipment/weapon/heavygun
name = "\improper GAU-21 30mm cannon"
@@ -691,6 +737,7 @@
point_cost = 400
skill_required = SKILL_PILOT_TRAINED
fire_mission_only = FALSE
+ shorthand = "GAU"
/obj/structure/dropship_equipment/weapon/heavygun/update_icon()
if(ammo_equipped)
@@ -707,6 +754,7 @@
firing_sound = 'sound/effects/rocketpod_fire.ogg'
firing_delay = 5
point_cost = 600
+ shorthand = "MSL"
/obj/structure/dropship_equipment/weapon/rocket_pod/deplete_ammo()
ammo_equipped = null //nothing left to empty after firing
@@ -728,6 +776,7 @@
firing_sound = 'sound/effects/rocketpod_fire.ogg'
firing_delay = 10 //1 seconds
point_cost = 600
+ shorthand = "RKT"
/obj/structure/dropship_equipment/weapon/minirocket_pod/update_icon()
if(ammo_equipped && ammo_equipped.ammo_count)
@@ -751,6 +800,7 @@
point_cost = 500
skill_required = SKILL_PILOT_TRAINED
fire_mission_only = FALSE
+ shorthand = "LZR"
/obj/structure/dropship_equipment/weapon/laser_beam_gun/update_icon()
if(ammo_equipped && ammo_equipped.ammo_count)
@@ -768,7 +818,8 @@
firing_delay = 10 //1 seconds
bound_height = 32
equip_categories = list(DROPSHIP_CREW_WEAPON) //fits inside the central spot of the dropship
- point_cost = 400
+ point_cost = 200
+ shorthand = "LCH"
/obj/structure/dropship_equipment/weapon/launch_bay/update_equipment()
if(ship_base)
@@ -782,6 +833,7 @@
/obj/structure/dropship_equipment/medevac_system
name = "\improper RMU-4M Medevac System"
+ shorthand = "Medevac"
desc = "A winch system to lift injured marines on medical stretchers onto the dropship. Acquire lift target through the dropship equipment console."
equip_categories = list(DROPSHIP_CREW_WEAPON)
icon_state = "medevac_system"
@@ -807,24 +859,8 @@
linked_stretcher = null
icon_state = "medevac_system"
-
-/obj/structure/dropship_equipment/medevac_system/equipment_interact(mob/user)
- if(!linked_shuttle)
- return
-
- if(linked_shuttle.mode != SHUTTLE_CALL)
- to_chat(user, SPAN_WARNING("[src] can only be used while in flight."))
- return
-
- if(busy_winch)
- to_chat(user, SPAN_WARNING(" The winch is already in motion."))
- return
-
- if(world.time < medevac_cooldown)
- to_chat(user, SPAN_WARNING("[src] was just used, you need to wait a bit before using it again."))
- return
-
- var/list/possible_stretchers = list()
+/obj/structure/dropship_equipment/medevac_system/proc/get_targets()
+ . = list()
for(var/obj/structure/bed/medevac_stretcher/MS in activated_medevac_stretchers)
var/area/AR = get_area(MS)
var/evaccee_name
@@ -851,20 +887,33 @@
if (evaccee_triagecard_color && evaccee_triagecard_color == "none")
evaccee_triagecard_color = null
- possible_stretchers["[evaccee_name] [evaccee_triagecard_color ? "\[" + uppertext(evaccee_triagecard_color) + "\]" : ""] ([AR.name])"] = MS
+ var/key_name = strip_improper("[evaccee_name] [evaccee_triagecard_color ? "\[" + uppertext(evaccee_triagecard_color) + "\]" : ""] ([AR.name])")
+ .[key_name] = MS
- if(!possible_stretchers.len)
- to_chat(user, SPAN_WARNING("No active medevac stretcher detected."))
- return
+/obj/structure/dropship_equipment/medevac_system/proc/can_medevac(mob/user)
+ if(!linked_shuttle)
+ return FALSE
- var/stretcher_choice = tgui_input_list(usr, "Which emitting stretcher would you like to link with?", "Available stretchers", possible_stretchers)
- if(!stretcher_choice)
- return
+ if(linked_shuttle.mode != SHUTTLE_CALL)
+ to_chat(user, SPAN_WARNING("[src] can only be used while in flight."))
+ return FALSE
- var/obj/structure/bed/medevac_stretcher/selected_stretcher = possible_stretchers[stretcher_choice]
- if(!selected_stretcher)
- return
+ if(busy_winch)
+ to_chat(user, SPAN_WARNING(" The winch is already in motion."))
+ return FALSE
+ if(world.time < medevac_cooldown)
+ to_chat(user, SPAN_WARNING("[src] was just used, you need to wait a bit before using it again."))
+ return FALSE
+
+ var/list/possible_stretchers = get_targets()
+
+ if(!length(possible_stretchers))
+ to_chat(user, SPAN_WARNING("No active medevac stretcher detected."))
+ return FALSE
+ return TRUE
+
+/obj/structure/dropship_equipment/medevac_system/proc/position_dropship(mob/user, obj/structure/bed/medevac_stretcher/selected_stretcher)
if(!ship_base) //system was uninstalled midway
return
@@ -914,6 +963,31 @@
linked_stretcher.linked_medevac = src
linked_stretcher.visible_message(SPAN_NOTICE("[linked_stretcher] detects a dropship overhead."))
+/obj/structure/dropship_equipment/medevac_system/proc/automate_interact(mob/user, stretcher_choice)
+ if(!can_medevac(user))
+ return
+
+ var/list/possible_stretchers = get_targets()
+
+ var/obj/structure/bed/medevac_stretcher/selected_stretcher = possible_stretchers[stretcher_choice]
+ if(!selected_stretcher)
+ return
+ position_dropship(user, selected_stretcher)
+
+/obj/structure/dropship_equipment/medevac_system/equipment_interact(mob/user)
+ if(!can_medevac(user))
+ return
+
+ var/list/possible_stretchers = get_targets()
+
+ var/stretcher_choice = tgui_input_list(usr, "Which emitting stretcher would you like to link with?", "Available stretchers", possible_stretchers)
+ if(!stretcher_choice)
+ return
+
+ var/obj/structure/bed/medevac_stretcher/selected_stretcher = possible_stretchers[stretcher_choice]
+ if(!selected_stretcher)
+ return
+ position_dropship(user, selected_stretcher)
//on arrival we break any link
@@ -959,6 +1033,35 @@
activate_winch(user)
+/obj/structure/dropship_equipment/medevac_system/ui_data(mob/user)
+ var/list/stretchers = get_targets()
+
+ . = list()
+ for(var/stretcher_ref in stretchers)
+ var/obj/structure/bed/medevac_stretcher/stretcher = stretchers[stretcher_ref]
+
+ var/area/AR = get_area(stretcher)
+ var/list/target_data = list()
+ target_data["area"] = AR
+ target_data["ref"] = stretcher_ref
+
+ var/mob/living/carbon/human/occupant = stretcher.buckled_mob
+ if(occupant)
+ target_data["occupant"] = occupant.name
+ target_data["time_of_death"] = occupant.tod
+ target_data["damage"] = list(
+ "hp" = occupant.health,
+ "brute" = occupant.bruteloss,
+ "oxy" = occupant.oxyloss,
+ "tox" = occupant.toxloss,
+ "fire" = occupant.fireloss
+ )
+ if(ishuman(occupant))
+ target_data["damage"]["undefib"] = occupant.undefibbable
+ target_data["triage_card"] = occupant.holo_card_color
+
+ . += list(target_data)
+
/obj/structure/dropship_equipment/medevac_system/proc/activate_winch(mob/user)
set waitfor = 0
var/old_stretcher = linked_stretcher
@@ -1014,6 +1117,7 @@
/obj/structure/dropship_equipment/fulton_system
name = "\improper RMU-19 Fulton Recovery System"
+ shorthand = "Fulton"
desc = "A winch system to collect any fulton recovery balloons in high altitude. Make sure you turn it on!"
equip_categories = list(DROPSHIP_CREW_WEAPON)
icon_state = "fulton_system"
@@ -1030,7 +1134,28 @@
icon_state = "fulton_system"
-/obj/structure/dropship_equipment/fulton_system/equipment_interact(mob/user)
+/obj/structure/dropship_equipment/fulton_system/proc/automate_interact(mob/user, fulton_choice)
+ if(!can_fulton(user))
+ return
+
+ var/list/possible_fultons = get_targets()
+
+ if(!fulton_choice)
+ return
+ // Strip any \proper or \improper in order to match the entry in possible_fultons.
+ fulton_choice = strip_improper(fulton_choice)
+ var/obj/item/stack/fulton/fult = possible_fultons[fulton_choice]
+
+ if(!ship_base) //system was uninstalled midway
+ return
+
+ if(is_ground_level(fult.z)) //in case the fulton popped during our input()
+ return
+
+ if(!fult.attached_atom)
+ to_chat(user, SPAN_WARNING("This balloon stretcher is empty."))
+ return
+
if(!linked_shuttle)
return
@@ -1046,16 +1171,52 @@
to_chat(user, SPAN_WARNING("[src] was just used, you need to wait a bit before using it again."))
return
- var/list/possible_fultons = list()
+ to_chat(user, SPAN_NOTICE(" You move your dropship above the selected balloon's beacon."))
+
+ activate_winch(user, fult)
+
+
+/obj/structure/dropship_equipment/fulton_system/proc/can_fulton(mob/user)
+ if(!linked_shuttle)
+ return FALSE
+
+ if(linked_shuttle.mode != SHUTTLE_CALL)
+ to_chat(user, SPAN_WARNING("[src] can only be used while in flight."))
+ return FALSE
+
+ if(busy_winch)
+ to_chat(user, SPAN_WARNING(" The winch is already in motion."))
+ return FALSE
+
+ if(world.time < fulton_cooldown)
+ to_chat(user, SPAN_WARNING("[src] was just used, you need to wait a bit before using it again."))
+ return FALSE
+ return TRUE
+
+/obj/structure/dropship_equipment/fulton_system/ui_data(mob/user)
+ var/list/targets = get_targets()
+ . = list()
+ for(var/i in targets)
+ . += list(i)
+
+
+/obj/structure/dropship_equipment/fulton_system/proc/get_targets()
+ . = list()
for(var/obj/item/stack/fulton/F in deployed_fultons)
var/recovery_object
if(F.attached_atom)
recovery_object = F.attached_atom.name
else
recovery_object = "Empty"
- possible_fultons["[recovery_object]"] = F
+ .["[recovery_object]"] = F
+
+/obj/structure/dropship_equipment/fulton_system/equipment_interact(mob/user)
+ if(!can_fulton(user))
+ return
- if(!possible_fultons.len)
+ var/list/possible_fultons = get_targets()
+
+ if(!length(possible_fultons))
to_chat(user, SPAN_WARNING("No active balloons detected."))
return
@@ -1129,16 +1290,22 @@
fulton_cooldown = world.time + 50
// Rappel deployment system
-/obj/structure/dropship_equipment/rappel_system
- name = "\improper HPU-1 Rappel Deployment System"
+/obj/structure/dropship_equipment/paradrop_system
+ name = "\improper HPU-1 Paradrop Deployment System"
+ shorthand = "PDS"
equip_categories = list(DROPSHIP_CREW_WEAPON)
icon_state = "rappel_module_packaged"
point_cost = 50
combat_equipment = FALSE
-
+ var/system_cooldown
var/harness = /obj/item/rappel_harness
-/obj/structure/dropship_equipment/rappel_system/update_equipment()
+/obj/structure/dropship_equipment/paradrop_system/ui_data(mob/user)
+ . = list()
+ .["signal"] = "[linked_shuttle.paradrop_signal]"
+ .["locked"] = !!linked_shuttle.paradrop_signal
+
+/obj/structure/dropship_equipment/paradrop_system/update_equipment()
if(ship_base)
icon_state = "rappel_hatch_closed"
density = FALSE
@@ -1148,7 +1315,7 @@
/obj/effect/warning/rappel
color = "#17d17a"
-/obj/structure/dropship_equipment/rappel_system/attack_hand(mob/living/carbon/human/user)
+/obj/structure/dropship_equipment/paradrop_system/attack_hand(mob/living/carbon/human/user)
var/datum/cas_iff_group/cas_group = cas_groups[FACTION_MARINE]
var/list/targets = cas_group.cas_signals
@@ -1227,7 +1394,7 @@
icon_state = "rappel_hatch_closed"
qdel(warning_zone)
-/obj/structure/dropship_equipment/rappel_system/proc/can_use(mob/living/carbon/human/user)
+/obj/structure/dropship_equipment/paradrop_system/proc/can_use(mob/living/carbon/human/user)
if(linked_shuttle.mode != SHUTTLE_CALL)
to_chat(user, SPAN_WARNING("\The [src] can only be used while in flight."))
return FALSE
@@ -1273,4 +1440,4 @@
var/turf/impact = pick(possible_turfs)
sleep(3)
SA.source_mob = user
- SA.detonate_on(impact)
+ SA.detonate_on(impact, src)
diff --git a/code/modules/cm_marines/equipment/guncases.dm b/code/modules/cm_marines/equipment/guncases.dm
index 7184827fda..98af79c511 100644
--- a/code/modules/cm_marines/equipment/guncases.dm
+++ b/code/modules/cm_marines/equipment/guncases.dm
@@ -211,10 +211,12 @@
desc = "A gun case containing the M37A2 Pump Shotgun."
icon_state = "guncase_red"
storage_slots = 4
- can_hold = list(/obj/item/weapon/gun/shotgun/pump, /obj/item/ammo_magazine/shotgun/buckshot, /obj/item/ammo_magazine/shotgun/flechette, /obj/item/ammo_magazine/shotgun/slugs)
+ can_hold = list(/obj/item/weapon/gun/shotgun/pump, /obj/item/ammo_magazine/shotgun/buckshot, /obj/item/ammo_magazine/shotgun/flechette, /obj/item/ammo_magazine/shotgun/slugs, /obj/item/storage/pouch/shotgun)
/obj/item/storage/box/guncase/pumpshotgun/fill_preset_inventory()
new /obj/item/weapon/gun/shotgun/pump(src)
+ new /obj/item/storage/pouch/shotgun(src)
+ new /obj/item/storage/large_holster/m37(src)
for(var/i = 1 to 3)
var/random_pick = rand(1, 3)
switch(random_pick)
@@ -231,6 +233,8 @@
/obj/item/storage/box/guncase/pumpshotgun/special/fill_preset_inventory()
new /obj/item/weapon/gun/shotgun/pump/special(src)
new /obj/item/ammo_magazine/shotgun/buckshot/special(src)
+ new /obj/item/storage/pouch/shotgun(src)
+ new /obj/item/storage/large_holster/m37(src)
/obj/item/storage/box/guncase/mk45_automag
name = "\improper MK-45 Automagnum case"
@@ -370,9 +374,9 @@
/obj/item/storage/box/guncase/mod88/fill_preset_inventory()
new /obj/item/attachable/flashlight(src)
new /obj/item/weapon/gun/pistol/mod88(src)
- new /obj/item/ammo_magazine/pistol/mod88(src)
- new /obj/item/ammo_magazine/pistol/mod88(src)
- new /obj/item/ammo_magazine/pistol/mod88(src)
+ new /obj/item/ammo_magazine/pistol/mod88/normalpoint(src)
+ new /obj/item/ammo_magazine/pistol/mod88/normalpoint(src)
+ new /obj/item/ammo_magazine/pistol/mod88/normalpoint(src)
//M44 Combat Revolver
/obj/item/storage/box/guncase/m44
diff --git a/code/modules/cm_marines/overwatch.dm b/code/modules/cm_marines/overwatch.dm
index 243ecd9342..c29b4ad5b5 100644
--- a/code/modules/cm_marines/overwatch.dm
+++ b/code/modules/cm_marines/overwatch.dm
@@ -920,6 +920,8 @@
icon_state = "toc"
bound_width = 64
bound_height = 32
+ layer = ABOVE_TABLE_LAYER
+ density = TRUE
/obj/structure/supply_drop
name = "Supply Drop Pad"
diff --git a/code/modules/cm_marines/smartgun_mount.dm b/code/modules/cm_marines/smartgun_mount.dm
index 32983f455c..1fb9868ed0 100644
--- a/code/modules/cm_marines/smartgun_mount.dm
+++ b/code/modules/cm_marines/smartgun_mount.dm
@@ -471,7 +471,7 @@
GUN_FIREMODE_AUTOMATIC,
)
/// A multiplier for how slow this gun should fire in automatic as opposed to burst. 1 is normal, 1.2 is 20% slower, 0.8 is 20% faster, etc.
- var/autofire_slow_mult = 1
+ var/autofire_slow_mult = 0.7
/// If the gun is currently burst firing
VAR_PROTECTED/burst_firing = FALSE
/// If the gun should display its ammo count
diff --git a/code/modules/cm_phone/phone_base.dm b/code/modules/cm_phone/phone_base.dm
index d5f252846b..fb05b578a0 100644
--- a/code/modules/cm_phone/phone_base.dm
+++ b/code/modules/cm_phone/phone_base.dm
@@ -11,7 +11,7 @@
var/phone_icon
/// Whether or not the phone is receiving calls or not. Varies between on/off or forcibly on/off.
- var/do_not_disturb = PHONE_DO_NOT_DISTURB_OFF
+ var/do_not_disturb = PHONE_DND_OFF
var/list/networks_receive = list(FACTION_MARINE)
var/list/networks_transmit = list(FACTION_MARINE)
@@ -45,10 +45,10 @@
icon_state = PHONE_ON_BASE_UNIT_ICON_STATE
/obj/structure/phone_base/hidden
- do_not_disturb = PHONE_DO_NOT_DISTURB_FORCED
+ do_not_disturb = PHONE_DND_FORCED
/obj/structure/phone_base/no_dnd
- do_not_disturb = PHONE_DO_NOT_DISTURB_FORBIDDEN
+ do_not_disturb = PHONE_DND_FORBIDDEN
//rotary desk phones (need a touch tone handset at some point)
/obj/structure/phone_base/rotary
@@ -57,7 +57,7 @@
desc = "The finger plate is a little stiff."
/obj/structure/phone_base/rotary/no_dnd
- do_not_disturb = PHONE_DO_NOT_DISTURB_FORBIDDEN
+ do_not_disturb = PHONE_DND_FORBIDDEN
/obj/structure/phone_base/touchtone
name = "touch-tone telephone"
@@ -99,3 +99,7 @@
name = "rotary telephone"
icon_state = "rotary_phone"
desc = "The finger plate is a little stiff."
+
+/obj/structure/phone_base/toc
+ name = "telephone receiver"
+ icon = 'icons/obj/vehicles/interiors/movie.dmi'
diff --git a/code/modules/cm_tech/implements/railgun.dm b/code/modules/cm_tech/implements/railgun.dm
index ebff2ac57e..be11259026 100644
--- a/code/modules/cm_tech/implements/railgun.dm
+++ b/code/modules/cm_tech/implements/railgun.dm
@@ -6,7 +6,7 @@ GLOBAL_DATUM(railgun_eye_location, /datum/coords)
/obj/effect/landmark/railgun_computer
name = "Railgun computer landmark"
- desc = "A computer with an orange interface, it's idly blinking, awaiting a password."
+ desc = "A computer with an orange interface, it's idly blinking, awaiting a password. The higher your altitude, the faster your reload, and slower the shots hit."
/obj/effect/landmark/railgun_computer/Initialize(mapload, ...)
. = ..()
@@ -26,6 +26,7 @@ GLOBAL_DATUM(railgun_eye_location, /datum/coords)
/obj/structure/machinery/computer/railgun
name = "railgun computer"
+ desc = "A computer with an orange interface, fires the standard railgun shells. The higher your altitude, the faster your reload, and slower the shots hit."
icon_state = "terminal"
@@ -36,13 +37,15 @@ GLOBAL_DATUM(railgun_eye_location, /datum/coords)
var/max_ammo = 10
var/ammo = 10
- var/ammo_recharge_time = 30 SECONDS
+ var/ammo_recharge_time = 30 SECONDS //How long it takes to get a new shot to your ammo counter
+ var/ammo_delay = 10 SECONDS //How long it takes to hit the earth
- var/fire_cooldown = 1.5 SECONDS
+ var/fire_cooldown = 1.5 SECONDS //Cooldown between shots
var/next_fire = 0
var/power = 900
var/range = 2
+ var/warning_color = "#0000ff"
/// Computer and Railgun can only be used if this variable is cleared
var/locked = TRUE
@@ -102,13 +105,13 @@ GLOBAL_DATUM(railgun_eye_location, /datum/coords)
return FALSE
if(locked)
- to_chat(H, SPAN_WARNING("Railgun Safeties are on, unable to fire!"))
+ to_chat(H, SPAN_WARNING("Safeties are on, unable to fire!"))
return FALSE
if(istype(T, /turf/open/space)) // No firing into space
return FALSE
- if(protected_by_pylon(TURF_PROTECTION_OB, T))
+ if(protected_by_pylon(TURF_PROTECTION_MORTAR, T))
to_chat(H, SPAN_WARNING("[icon2html(src)] This area is too reinforced to fire into."))
return FALSE
@@ -149,12 +152,13 @@ GLOBAL_DATUM(railgun_eye_location, /datum/coords)
next_fire = world.time + fire_cooldown
- addtimer(CALLBACK(src, PROC_REF(recharge_ammo)), ammo_recharge_time, TIMER_UNIQUE)
+ addtimer(CALLBACK(src, PROC_REF(recharge_ammo)), ammo_recharge_time*2-GLOB.ship_alt, TIMER_UNIQUE)
ammo--
to_chat(H, SPAN_NOTICE("[icon2html(src)] Firing shell. [SPAN_BOLD("([ammo]/[max_ammo] shells left).")]"))
var/obj/effect/warning/railgun/warning_zone = new(T)
+ warning_zone.color = warning_color
var/image/I = image(warning_zone.icon, warning_zone.loc, warning_zone.icon_state, warning_zone.layer)
I.color = warning_zone.color
@@ -162,7 +166,7 @@ GLOBAL_DATUM(railgun_eye_location, /datum/coords)
H.client.images += I
playsound_client(H.client, 'sound/machines/railgun/railgun_shoot.ogg')
- addtimer(CALLBACK(src, PROC_REF(land_shot), T, H.client, warning_zone, I), 10 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(land_shot), T, H.client, warning_zone, I), ammo_delay*GLOB.ship_alt)
/obj/structure/machinery/computer/railgun/proc/land_shot(turf/T, client/firer, obj/effect/warning/droppod/warning_zone, image/to_remove)
if(warning_zone)
@@ -269,3 +273,56 @@ GLOBAL_DATUM(railgun_eye_location, /datum/coords)
return COMPONENT_TURF_ALLOW_MOVEMENT
+
+
+/obj/structure/machinery/computer/railgun/gatling
+ name = "orbital gatling computer"
+ desc = "The younger sister to the railgun, this one is way weaker, however, it fires significantly faster. The higher your altitude, the faster your reload, and slower the shots hit."
+ max_ammo = 100
+ ammo = 100
+ ammo_recharge_time = 2 SECONDS
+ fire_cooldown = 0.1 SECONDS
+ ammo_delay = 3 SECONDS
+ power = 50
+ range = 1
+ warning_color = "#00ff00"
+
+
+/obj/structure/machinery/computer/railgun/orbital
+ name = "orbital computer"
+ desc = "An Orbital cannon with a very long recharge time. The higher your altitude, the faster your reload, and slower the shots hit."
+ max_ammo = 1
+ ammo = 1
+ ammo_recharge_time = 5 SECONDS
+ fire_cooldown = 10 MINUTES //So you know how long it takes betweenS
+ ammo_delay = 30 SECONDS
+ power = 1500
+ range = 15
+ warning_color = "#ff0000"
+
+
+/obj/structure/machinery/computer/railgun/napalm
+ name = "orbital napalm computer"
+ desc = "An Orbital cannon with a very long recharge time. The higher your altitude, the faster your reload, and slower the shots hit."
+ max_ammo = 5
+ ammo = 5
+ ammo_recharge_time = 45 SECONDS
+ ammo_delay = 5 SECONDS
+ warning_color = "#ff9100"
+
+/obj/structure/machinery/computer/railgun/napalm/land_shot(turf/T, client/firer, obj/effect/warning/droppod/warning_zone, image/to_remove)
+ if(warning_zone)
+ qdel(warning_zone)
+
+ if(firer)
+ firer.images -= to_remove
+ playsound(T, 'sound/machines/railgun/railgun_impact.ogg', sound_range = 75)
+ INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(flame_radius), create_cause_data("railgun", firer.mob), 5, T, BURN_TIME_TIER_5 + 5, BURN_LEVEL_TIER_2, FLAMESHAPE_DEFAULT, FIRE_VARIANT_TYPE_B)
+
+/obj/structure/machinery/computer/railgun/toc
+ name = "railgun computer screen"
+ icon_state = "toc_railgun"
+
+/obj/structure/machinery/computer/railgun/gatling/toc
+ name = "gatling-gun computer screen"
+ icon_state = "toc_railcannon"
diff --git a/code/modules/cm_tech/techtree.dm b/code/modules/cm_tech/techtree.dm
index 6c39d8ab9c..a027789185 100644
--- a/code/modules/cm_tech/techtree.dm
+++ b/code/modules/cm_tech/techtree.dm
@@ -58,16 +58,24 @@
if(longest_tier < tier_length)
longest_tier = tier_length
- // Clear out the area
- for(var/t in block(locate(1, 1, zlevel.z_value), locate(longest_tier * 2 + 1, length(all_techs) * 3 + 1, zlevel.z_value)))
+ // Clear out and create the area
+ // (The `+ 2` on both of these is 1 for a buffer tile, and 1 for the outer `/turf/closed/void`.)
+ var/area_max_x = longest_tier * 2 + 2
+ var/area_max_y = length(all_techs) * 3 + 2
+ for(var/t in block(locate(1, 1, zlevel.z_value), locate(area_max_x, area_max_y, zlevel.z_value)))
var/turf/pos = t
for(var/A in pos)
qdel(A)
- pos.ChangeTurf(/turf/open/blank)
- pos.color = "#000000"
-
+ if(pos.x == area_max_x || pos.y == area_max_y)
+ // The turfs around the edge are closed.
+ pos.ChangeTurf(/turf/closed/void)
+ else
+ pos.ChangeTurf(/turf/open/blank)
+ pos.color = "#000000"
+ new /area/techtree(pos)
+ // Create the tech nodes
var/y_offset = 1
for(var/tier in all_techs)
var/tier_length = length(all_techs[tier])
diff --git a/code/modules/defenses/bell_tower.dm b/code/modules/defenses/bell_tower.dm
index 52207298c4..a9d6c08bc7 100644
--- a/code/modules/defenses/bell_tower.dm
+++ b/code/modules/defenses/bell_tower.dm
@@ -257,7 +257,7 @@
STOP_PROCESSING(SSobj, src)
return
- var/list/targets = SSquadtree.players_in_range(RECT(M.x, M.y, area_range, area_range), M.z, QTREE_SCAN_MOBS | QTREE_EXCLUDE_OBSERVER)
+ var/list/targets = SSquadtree.players_in_range(SQUARE(M.x, M.y, area_range), M.z, QTREE_SCAN_MOBS | QTREE_EXCLUDE_OBSERVER)
if(!targets)
return
diff --git a/code/modules/defenses/planted_flag.dm b/code/modules/defenses/planted_flag.dm
index fac725047f..f0f6b05565 100644
--- a/code/modules/defenses/planted_flag.dm
+++ b/code/modules/defenses/planted_flag.dm
@@ -7,7 +7,7 @@
desc = "A planted flag with the iconic USCM flag plastered all over it, you feel a burst of energy by its mere sight."
handheld_type = /obj/item/defenses/handheld/planted_flag
disassemble_time = 10
- var/datum/shape/rectangle/range_bounds
+ var/datum/shape/range_bounds
var/area_range = PLANTED_FLAG_RANGE
var/buff_intensity = PLANTED_FLAG_BUFF
health = 200
@@ -33,7 +33,7 @@
apply_area_effect()
start_processing()
- range_bounds = RECT(x, y, PLANTED_FLAG_RANGE, PLANTED_FLAG_RANGE)
+ range_bounds = SQUARE(x, y, PLANTED_FLAG_RANGE)
update_icon()
/obj/structure/machinery/defenses/planted_flag/Destroy()
@@ -70,9 +70,9 @@
/obj/structure/machinery/defenses/planted_flag/proc/apply_area_effect()
if(!range_bounds)
- range_bounds = RECT(x, y, area_range, area_range)
+ range_bounds = SQUARE(x, y, area_range)
- var/list/targets = SSquadtree.players_in_range(RECT(x, y, area_range, area_range), z, QTREE_SCAN_MOBS | QTREE_EXCLUDE_OBSERVER)
+ var/list/targets = SSquadtree.players_in_range(SQUARE(x, y, area_range), z, QTREE_SCAN_MOBS | QTREE_EXCLUDE_OBSERVER)
if(!targets)
return
@@ -146,7 +146,7 @@
if(!M.x && !M.y && !M.z)
return
- var/list/targets = SSquadtree.players_in_range(RECT(M.x, M.y, area_range, area_range), M.z, QTREE_SCAN_MOBS | QTREE_EXCLUDE_OBSERVER)
+ var/list/targets = SSquadtree.players_in_range(SQUARE(M.x, M.y, area_range), M.z, QTREE_SCAN_MOBS | QTREE_EXCLUDE_OBSERVER)
targets |= M
for(var/mob/living/carbon/human/H in targets)
diff --git a/code/modules/defenses/sentry_computer.dm b/code/modules/defenses/sentry_computer.dm
index 906473056e..7cb4f7bb84 100644
--- a/code/modules/defenses/sentry_computer.dm
+++ b/code/modules/defenses/sentry_computer.dm
@@ -48,41 +48,18 @@
// Stuff needed to render the map
/// asset name for the game map
- var/map_name
-
- /// camera screen which renders the world
- var/atom/movable/screen/map_view/cam_screen
-
- /// camera screen which shows a blank error
- var/atom/movable/screen/background/cam_background
-
- var/list/cam_plane_masters
+ var/camera_map_name
/obj/item/device/sentry_computer/Initialize(mapload)
. = ..()
if(cell_type)
cell = new cell_type()
cell.charge = cell.maxcharge
- // set up cameras
- map_name = "sentry_computer_[REF(src)]_map"
- cam_screen = new
- cam_screen.name = "screen"
- cam_screen.assigned_map = map_name
- cam_screen.del_on_map_removal = FALSE
- cam_screen.screen_loc = "[map_name]:1,1"
- cam_background = new
- cam_background.assigned_map = map_name
- cam_background.del_on_map_removal = FALSE
-
- cam_plane_masters = list()
- for(var/plane in subtypesof(/atom/movable/screen/plane_master) - /atom/movable/screen/plane_master/blackness)
- var/atom/movable/screen/plane_master/instance = new plane()
- instance.assigned_map = map_name
- instance.del_on_map_removal = FALSE
- if(instance.blend_mode_override)
- instance.blend_mode = instance.blend_mode_override
- instance.screen_loc = "[map_name]:CENTER"
- cam_plane_masters += instance
+
+ RegisterSignal(src, COMSIG_CAMERA_MAPNAME_ASSIGNED, PROC_REF(camera_mapname_update))
+
+ AddComponent(/datum/component/camera_manager)
+ SEND_SIGNAL(src, COMSIG_CAMERA_CLEAR)
faction_group = FACTION_LIST_MARINE
transceiver.forceMove(src)
@@ -94,16 +71,20 @@
/obj/item/device/sentry_computer/Destroy()
. = ..()
+ UnregisterSignal(src, COMSIG_CAMERA_MAPNAME_ASSIGNED)
QDEL_NULL(cell)
- QDEL_NULL(cam_background)
- QDEL_NULL(cam_screen)
QDEL_NULL(transceiver)
QDEL_NULL(voice)
last_camera_turf = null
current = null
registered_tools = null
+ for(var/obj/structure/machinery/defenses/sentry/sentrygun as anything in paired_sentry)
+ unpair_sentry(sentrygun)
paired_sentry = null
+/obj/item/device/sentry_computer/proc/camera_mapname_update(source, value)
+ camera_map_name = value
+
/obj/item/device/sentry_computer/Move(NewLoc, direct)
..()
if(table_setup || open || on)
@@ -232,7 +213,7 @@
for(var/key_id in tool.encryption_keys)
var/datum/weakref/ref = tool.encryption_keys[key_id]
var/obj/item/device/sentry_computer/key_object = ref.resolve()
- key_object.registered_tools -= id
+ key_object?.registered_tools -= id
tool.encryption_keys = list()
to_chat(user, SPAN_NOTICE("Existing encryption keys cleared."))
to_chat(usr, SPAN_NOTICE("You begin encryption key to \the [tool]."))
@@ -274,7 +255,7 @@
if (do_after(user, 1 SECONDS, INTERRUPT_NO_NEEDHAND, BUSY_ICON_GENERIC))
unpair_sentry(sentry)
to_chat(user, SPAN_NOTICE("[sentry] has been decrypted."))
- var/message = "[sentry] removed from from [src]"
+ var/message = "[sentry] removed from [src]"
INVOKE_ASYNC(src, PROC_REF(send_message), message)
/**
@@ -321,7 +302,7 @@
if(current == target)
current = null
- update_active_camera()
+ SEND_SIGNAL(src, COMSIG_CAMERA_CLEAR)
/obj/item/device/sentry_computer/ui_status(mob/user, datum/ui_state/state)
. = ..()
@@ -332,19 +313,16 @@
/obj/item/device/sentry_computer/ui_close(mob/user)
-
- // Unregister map objects
- user.client.clear_map(map_name)
+ SEND_SIGNAL(src, COMSIG_CAMERA_UNREGISTER_UI, user)
/obj/item/device/sentry_computer/ui_static_data(mob/user)
. = list()
.["sentry_static"] = list()
- .["mapRef"] = map_name
+ .["mapRef"] = camera_map_name
var/index = 1
- for(var/sentry in paired_sentry)
+ for(var/obj/structure/machinery/defenses/sentry/sentrygun as anything in paired_sentry)
var/list/sentry_holder = list()
- var/obj/structure/machinery/defenses/sentry/sentrygun = sentry
sentry_holder["selection_menu"] = list()
sentry_holder["index"] = index
sentry_holder["name"] = sentrygun.name
@@ -396,13 +374,8 @@
/obj/item/device/sentry_computer/tgui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
- update_active_camera()
if (!ui)
- // Register map objects
- user.client.register_map_obj(cam_background)
- user.client.register_map_obj(cam_screen)
- for(var/plane in cam_plane_masters)
- user.client.register_map_obj(plane)
+ SEND_SIGNAL(src, COMSIG_CAMERA_REGISTER_UI, user)
ui = new(user, src, "SentryGunUI", name)
ui.open()
@@ -426,7 +399,17 @@
if("set-camera")
current = sentry
playsound(src, get_sfx("terminal_button"), 25, FALSE)
- update_active_camera()
+ var/obj/structure/machinery/defenses/sentry/defense = sentry
+ if (defense.has_camera)
+ defense.set_watched_turfs()
+ var/list/turf/visible_turfs = defense.watching_turfs
+ var/list/bbox = get_bbox_of_atoms(visible_turfs)
+ var/center_x = (bbox[3] + bbox[1]) * 0.5
+ var/center_y = (bbox[4] + bbox[2]) * 0.5
+ var/size_x = bbox[3] - bbox[1] + 1
+ var/size_y = bbox[4] - bbox[2] + 1
+ SEND_SIGNAL(src, COMSIG_CAMERA_SET_AREA, center_x, center_y, defense.loc.z, size_x, size_y)
+
return TRUE
if("ping")
playsound(sentry, 'sound/machines/twobeep.ogg', 50, 1)
@@ -439,54 +422,8 @@
if("clear-camera")
current = null
playsound(src, get_sfx("terminal_button"), 25, FALSE)
- update_active_camera()
+ SEND_SIGNAL(src, COMSIG_CAMERA_CLEAR)
return TRUE
if("ui-interact")
playsound(src, get_sfx("terminal_button"), 25, FALSE)
return FALSE
-
-/**
- * Set the displayed camera to the static not-connected.
- */
-/obj/item/device/sentry_computer/proc/show_camera_static()
- cam_screen.vis_contents.Cut()
- last_camera_turf = null
- cam_background.icon_state = "scanline2"
- cam_background.fill_rect(1, 1, 15, 15)
-
-/**
- * Update camera settings and redraw camera on the current variable.
- */
-/obj/item/device/sentry_computer/proc/update_active_camera()
- // Show static if can't use the camera
- if(isnull(current) || !current.has_camera || current.placed != 1)
- show_camera_static()
- return
-
- // Is this camera located in or attached to a living thing, Vehicle or helmet? If so, assume the camera's loc is the living (or non) thing.
- var/cam_location = current
- if(isliving(current.loc) || isVehicle(current.loc))
- cam_location = current.loc
- else if(istype(current.loc, /obj/item/clothing/head/helmet/marine))
- var/obj/item/clothing/head/helmet/marine/helmet = current.loc
- cam_location = helmet.loc
- // If we're not forcing an update for some reason and the cameras are in the same location,
- // we don't need to update anything.
- // Most security cameras will end here as they're not moving.
- if(last_camera_turf == get_turf(cam_location))
- return
-
- // Cameras that get here are moving, and are likely attached to some moving atom such as cyborgs.
- last_camera_turf = get_turf(cam_location)
-
- current.set_watched_turfs()
- var/list/turf/visible_turfs = current.watching_turfs
-
- var/list/bbox = get_bbox_of_atoms(visible_turfs)
- var/size_x = bbox[3] - bbox[1] + 1
- var/size_y = bbox[4] - bbox[2] + 1
- cam_screen.icon = null
- cam_screen.icon_state = "clear"
- cam_screen.vis_contents = visible_turfs
- cam_background.icon_state = "clear"
- cam_background.fill_rect(1, 1, size_x, size_y)
diff --git a/code/modules/droppod/droppod_ui.dm b/code/modules/droppod/droppod_ui.dm
index b0c6683a4f..6493e9ec6c 100644
--- a/code/modules/droppod/droppod_ui.dm
+++ b/code/modules/droppod/droppod_ui.dm
@@ -42,6 +42,7 @@ GLOBAL_LIST_INIT(droppod_target_mode, list(
var/atom/movable/screen/map_view/cam_screen
var/atom/movable/screen/background/cam_background
var/map_name
+ var/list/cam_plane_masters
var/list/ordered_area = list()
var/list/launch_list = list()
@@ -132,17 +133,37 @@ GLOBAL_LIST_INIT(droppod_target_mode, list(
map_name = "admin_supplypod_bay_[REF(src)]_map"
// Initialize map objects
cam_screen = new
+ cam_screen.icon = null
cam_screen.name = "screen"
cam_screen.assigned_map = map_name
cam_screen.del_on_map_removal = TRUE
cam_screen.screen_loc = "[map_name]:1,1"
+ cam_screen.appearance_flags |= TILE_BOUND
cam_background = new
cam_background.assigned_map = map_name
cam_background.del_on_map_removal = TRUE
+ cam_background.appearance_flags |= TILE_BOUND
+
+ cam_plane_masters = list()
+ for(var/plane in subtypesof(/atom/movable/screen/plane_master) - /atom/movable/screen/plane_master/blackness)
+ var/atom/movable/screen/plane_master/instance = new plane()
+ add_plane(instance)
+
refresh_view()
holder.register_map_obj(cam_screen)
holder.register_map_obj(cam_background)
+ for(var/plane_id in cam_plane_masters)
+ holder.register_map_obj(cam_plane_masters[plane_id])
+
+/datum/admin_podlauncher/proc/add_plane(atom/movable/screen/plane_master/instance)
+ instance.assigned_map = map_name
+ instance.appearance_flags |= TILE_BOUND
+ instance.del_on_map_removal = FALSE
+ if(instance.blend_mode_override)
+ instance.blend_mode = instance.blend_mode_override
+ instance.screen_loc = "[map_name]:CENTER"
+ cam_plane_masters["[instance.plane]"] = instance
/datum/admin_podlauncher/proc/refresh_view()
switch(tab_index)
@@ -432,4 +453,5 @@ GLOBAL_LIST_INIT(droppod_target_mode, list(
user.client?.clear_map(map_name)
QDEL_NULL(cam_screen)
QDEL_NULL(cam_background)
+ QDEL_LIST_ASSOC_VAL(cam_plane_masters)
qdel(src)
diff --git a/code/modules/dropships/attach_points/attach_point.dm b/code/modules/dropships/attach_points/attach_point.dm
index 6724f5d18b..cee26f0b13 100644
--- a/code/modules/dropships/attach_points/attach_point.dm
+++ b/code/modules/dropships/attach_points/attach_point.dm
@@ -60,7 +60,7 @@
for(var/obj/docking_port/mobile/marine_dropship/shuttle in SSshuttle.mobile)
if(shuttle.id == ship_tag)
SE.linked_shuttle = shuttle
- shuttle.equipments += SE
+ SEND_SIGNAL(shuttle, COMSIG_DROPSHIP_ADD_EQUIPMENT, SE)
break
SE.update_equipment()
diff --git a/code/modules/dropships/attach_points/templates.dm b/code/modules/dropships/attach_points/templates.dm
index 1d0fc53d8a..d2b1f55d75 100644
--- a/code/modules/dropships/attach_points/templates.dm
+++ b/code/modules/dropships/attach_points/templates.dm
@@ -1,3 +1,4 @@
+// ALAMO
/obj/effect/attach_point/weapon/dropship1
ship_tag = DROPSHIP_ALAMO
@@ -39,6 +40,7 @@
transverse = 3
long = 0
+// NORMANDY
/obj/effect/attach_point/weapon/dropship2
ship_tag = DROPSHIP_NORMANDY
@@ -80,6 +82,7 @@
transverse = 3
long = 0
+// MIDWAY
/obj/effect/attach_point/weapon/midway
ship_tag = DROPSHIP_MIDWAY
@@ -121,6 +124,176 @@
transverse = 3
long = 0
+// CYCLONE
+/obj/effect/attach_point/weapon/cyclone
+ ship_tag = DROPSHIP_CYCLONE
+
+/obj/effect/attach_point/weapon/cyclone/left_wing
+ name = "port wing weapon attach point"
+ icon_state = "equip_base_l_wing"
+ attach_id = 1
+ dir = WEST
+ firing_arc_min = -3
+ firing_arc_max = 3
+ transverse = -3
+ long = 0
+
+/obj/effect/attach_point/weapon/cyclone/left_fore
+ name = "port fore weapon attach point"
+ attach_id = 2
+ dir = NORTH
+ firing_arc_min = -6
+ firing_arc_max = 0
+ transverse = 0
+ long = 0
+
+/obj/effect/attach_point/weapon/cyclone/right_fore
+ name = "starboard fore weapon attach point"
+ attach_id = 3
+ dir = NORTH
+ firing_arc_min = 0
+ firing_arc_max = 6
+ transverse = 0
+ long = 0
+
+/obj/effect/attach_point/weapon/cyclone/right_wing
+ name = "starboard wing weapon attach point"
+ icon_state = "equip_base_r_wing";
+ attach_id = 4
+ dir = EAST
+ firing_arc_min = -3
+ firing_arc_max = 3
+ transverse = 3
+ long = 0
+
+// TORNADO
+/obj/effect/attach_point/weapon/tornado
+ ship_tag = DROPSHIP_TORNADO
+
+/obj/effect/attach_point/weapon/tornado/left_wing
+ name = "port wing weapon attach point"
+ icon_state = "equip_base_l_wing"
+ attach_id = 1
+ dir = WEST
+ firing_arc_min = -3
+ firing_arc_max = 3
+ transverse = -3
+ long = 0
+
+/obj/effect/attach_point/weapon/tornado/left_fore
+ name = "port fore weapon attach point"
+ attach_id = 2
+ dir = NORTH
+ firing_arc_min = -6
+ firing_arc_max = 0
+ transverse = 0
+ long = 0
+
+/obj/effect/attach_point/weapon/tornado/right_fore
+ name = "starboard fore weapon attach point"
+ attach_id = 3
+ dir = NORTH
+ firing_arc_min = 0
+ firing_arc_max = 6
+ transverse = 0
+ long = 0
+
+/obj/effect/attach_point/weapon/tornado/right_wing
+ name = "starboard wing weapon attach point"
+ icon_state = "equip_base_r_wing";
+ attach_id = 4
+ dir = EAST
+ firing_arc_min = -3
+ firing_arc_max = 3
+ transverse = 3
+ long = 0
+
+// TYPHOON
+/obj/effect/attach_point/weapon/typhoon
+ ship_tag = DROPSHIP_TYPHOON
+
+/obj/effect/attach_point/weapon/typhoon/left_wing
+ name = "port wing weapon attach point"
+ icon_state = "equip_base_l_wing"
+ attach_id = 1
+ dir = WEST
+ firing_arc_min = -3
+ firing_arc_max = 3
+ transverse = -3
+ long = 0
+
+/obj/effect/attach_point/weapon/typhoon/left_fore
+ name = "port fore weapon attach point"
+ attach_id = 2
+ dir = NORTH
+ firing_arc_min = -6
+ firing_arc_max = 0
+ transverse = 0
+ long = 0
+
+/obj/effect/attach_point/weapon/typhoon/right_fore
+ name = "starboard fore weapon attach point"
+ attach_id = 3
+ dir = NORTH
+ firing_arc_min = 0
+ firing_arc_max = 6
+ transverse = 0
+ long = 0
+
+/obj/effect/attach_point/weapon/typhoon/right_wing
+ name = "starboard wing weapon attach point"
+ icon_state = "equip_base_r_wing";
+ attach_id = 4
+ dir = EAST
+ firing_arc_min = -3
+ firing_arc_max = 3
+ transverse = 3
+ long = 0
+
+// TORNADO
+/obj/effect/attach_point/weapon/tripoli
+ ship_tag = DROPSHIP_TRIPOLI
+
+/obj/effect/attach_point/weapon/tripoli/left_wing
+ name = "port wing weapon attach point"
+ icon_state = "equip_base_l_wing"
+ attach_id = 1
+ dir = WEST
+ firing_arc_min = -3
+ firing_arc_max = 3
+ transverse = -3
+ long = 0
+
+/obj/effect/attach_point/weapon/tripoli/left_fore
+ name = "port fore weapon attach point"
+ attach_id = 2
+ dir = NORTH
+ firing_arc_min = -6
+ firing_arc_max = 0
+ transverse = 0
+ long = 0
+
+/obj/effect/attach_point/weapon/tripoli/right_fore
+ name = "starboard fore weapon attach point"
+ attach_id = 3
+ dir = NORTH
+ firing_arc_min = 0
+ firing_arc_max = 6
+ transverse = 0
+ long = 0
+
+/obj/effect/attach_point/weapon/tripoli/right_wing
+ name = "starboard wing weapon attach point"
+ icon_state = "equip_base_r_wing";
+ attach_id = 4
+ dir = EAST
+ firing_arc_min = -3
+ firing_arc_max = 3
+ transverse = 3
+ long = 0
+
+//attach points
+
/obj/effect/attach_point/crew_weapon
name = "crew compartment attach point"
base_category = DROPSHIP_CREW_WEAPON
@@ -134,6 +307,18 @@
/obj/effect/attach_point/crew_weapon/midway
ship_tag = DROPSHIP_MIDWAY
+/obj/effect/attach_point/crew_weapon/cyclone
+ ship_tag = DROPSHIP_CYCLONE
+
+/obj/effect/attach_point/crew_weapon/tornado
+ ship_tag = DROPSHIP_TORNADO
+
+/obj/effect/attach_point/crew_weapon/typhoon
+ ship_tag = DROPSHIP_TYPHOON
+
+/obj/effect/attach_point/crew_weapon/tripoli
+ ship_tag = DROPSHIP_TRIPOLI
+
/obj/effect/attach_point/electronics
name = "electronic system attach point"
base_category = DROPSHIP_ELECTRONICS
@@ -149,6 +334,17 @@
/obj/effect/attach_point/electronics/midway
ship_tag = DROPSHIP_MIDWAY
+/obj/effect/attach_point/electronics/cyclone
+ ship_tag = DROPSHIP_CYCLONE
+
+/obj/effect/attach_point/electronics/tornado
+ ship_tag = DROPSHIP_TORNADO
+
+/obj/effect/attach_point/electronics/typhoon
+ ship_tag = DROPSHIP_TYPHOON
+
+/obj/effect/attach_point/electronics/tripoli
+ ship_tag = DROPSHIP_TRIPOLI
/obj/effect/attach_point/fuel
name = "engine system attach point"
icon = 'icons/obj/structures/props/almayer_props64.dmi'
@@ -164,6 +360,18 @@
/obj/effect/attach_point/fuel/midway
ship_tag = DROPSHIP_MIDWAY
+/obj/effect/attach_point/fuel/cyclone
+ ship_tag = DROPSHIP_CYCLONE
+
+/obj/effect/attach_point/fuel/tornado
+ ship_tag = DROPSHIP_TORNADO
+
+/obj/effect/attach_point/fuel/typhoon
+ ship_tag = DROPSHIP_TYPHOON
+
+/obj/effect/attach_point/fuel/tripoli
+ ship_tag = DROPSHIP_TRIPOLI
+
/obj/effect/attach_point/computer
base_category = DROPSHIP_COMPUTER
@@ -175,3 +383,15 @@
/obj/effect/attach_point/computer/midway
ship_tag = DROPSHIP_MIDWAY
+
+/obj/effect/attach_point/computer/cyclone
+ ship_tag = DROPSHIP_CYCLONE
+
+/obj/effect/attach_point/computer/tornado
+ ship_tag = DROPSHIP_TORNADO
+
+/obj/effect/attach_point/computer/typhoon
+ ship_tag = DROPSHIP_TYPHOON
+
+/obj/effect/attach_point/computer/tripoli
+ ship_tag = DROPSHIP_TYPHOON
diff --git a/code/modules/dropships/cas/fire_mission_record.dm b/code/modules/dropships/cas/fire_mission_record.dm
index 093a1509b2..2887ec92c2 100644
--- a/code/modules/dropships/cas/fire_mission_record.dm
+++ b/code/modules/dropships/cas/fire_mission_record.dm
@@ -5,6 +5,11 @@
/// List of transverse offsets for each firing step - null meaning not shooting
var/list/offsets
+/datum/cas_fire_mission_record/ui_data(mob/user)
+ . = list()
+ .["weapon"] = weapon.ship_base.attach_id
+ .["offsets"] = offsets
+
/// Get offset range allowed when firing weapon in this configuration
/datum/cas_fire_mission_record/proc/get_offsets()
if(!weapon?.ship_base)
diff --git a/code/modules/escape_menu/escape_menu.dm b/code/modules/escape_menu/escape_menu.dm
index c31234678b..b61bbd5b3f 100644
--- a/code/modules/escape_menu/escape_menu.dm
+++ b/code/modules/escape_menu/escape_menu.dm
@@ -49,7 +49,7 @@ GLOBAL_LIST_EMPTY(escape_menus)
show_page()
RegisterSignal(client, COMSIG_PARENT_QDELETING, PROC_REF(on_client_qdel))
- RegisterSignal(client, COMSIG_CLIENT_MOB_LOGIN, PROC_REF(on_client_mob_login))
+ RegisterSignal(client, COMSIG_CLIENT_MOB_LOGGED_IN, PROC_REF(on_client_mob_login))
if (!isnull(ckey))
GLOB.escape_menus[ckey] = src
diff --git a/code/modules/gear_presets/clf.dm b/code/modules/gear_presets/clf.dm
index 9afc89ab65..91a44328e4 100644
--- a/code/modules/gear_presets/clf.dm
+++ b/code/modules/gear_presets/clf.dm
@@ -529,10 +529,10 @@
list("GUNNER KITS (CHOOSE 1)", 0, null, null, null),
list("SVD Sniper Kit", 0, /obj/effect/essentials_set/kit/svd, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR),
list("Custom Built Shotgun Kit", 0, /obj/effect/essentials_set/kit/custom_shotgun, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR),
- list("M60 Machine Gun Kit", 0, /obj/effect/essentials_set/kit/m60, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR),
+ list("Mk70 Machine Gun Kit", 0, /obj/effect/essentials_set/kit/m60, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR),
list("SPECIAL AMMUNITION", 0, null, null, null),
- list("M60 Ammo Box (7.62x51mm)", 15, /obj/item/ammo_magazine/m60, null, VENDOR_ITEM_REGULAR),
+ list("Mk70 Ammo Box (7.62x51mm)", 15, /obj/item/ammo_magazine/m60, null, VENDOR_ITEM_REGULAR),
list("Shotgun Incendiary Shells (Handful)", 15, /obj/item/ammo_magazine/handful/shotgun/incendiary, null, VENDOR_ITEM_REGULAR),
list("SVD Magazine (7.62x54mmR)", 15, /obj/item/ammo_magazine/sniper/svd, null, VENDOR_ITEM_REGULAR),
diff --git a/code/modules/gear_presets/cmb.dm b/code/modules/gear_presets/cmb.dm
index 12174a5d51..0f5f67e071 100644
--- a/code/modules/gear_presets/cmb.dm
+++ b/code/modules/gear_presets/cmb.dm
@@ -6,24 +6,19 @@
idtype = /obj/item/card/id/deputy
languages = list(LANGUAGE_ENGLISH, LANGUAGE_JAPANESE)
var/human_versus_human = FALSE
- var/headset_type = /obj/item/device/radio/headset/distress/CMB
+ var/headset_type = /obj/item/device/radio/headset/distress/CMB/limited
/datum/equipment_preset/cmb/New()
. = ..()
access = get_access(ACCESS_LIST_UA)
-/datum/equipment_preset/cmb/load_name(mob/living/carbon/human/new_human)
+/datum/equipment_preset/cmb/load_name(mob/living/carbon/human/new_human, randomise)
new_human.gender = pick(80;MALE,20;FEMALE)
- var/datum/preferences/A = new()
+ var/datum/preferences/A = new
A.randomize_appearance(new_human)
- var/random_name
- random_name = capitalize(pick(new_human.gender == MALE ? first_names_male : first_names_female)) + " " + capitalize(pick(last_names))
- new_human.change_real_name(new_human, random_name)
- new_human.name = new_human.real_name
- new_human.age = rand(22,45)
-
- var/static/list/colors = list("BLACK" = list(15, 15, 25), "BROWN" = list(102, 51, 0), "AUBURN" = list(139, 62, 19))
- var/static/list/hair_colors = colors.Copy() + list("BLONDE" = list(197, 164, 30), "CARROT" = list(174, 69, 42))
+ var/random_name = capitalize(pick(new_human.gender == MALE ? first_names_male : first_names_female)) + " " + capitalize(pick(last_names))
+ var/static/list/colors = list("BLACK" = list(15, 15, 10), "BROWN" = list(48, 38, 18), "BROWN" = list(48, 38, 18),"BLUE" = list(29, 51, 65), "GREEN" = list(40, 61, 39), "STEEL" = list(46, 59, 54))
+ var/static/list/hair_colors = list("BLACK" = list(15, 15, 10), "BROWN" = list(48, 38, 18), "AUBURN" = list(77, 48, 36), "BLONDE" = list(95, 76, 44))
var/hair_color = pick(hair_colors)
new_human.r_hair = hair_colors[hair_color][1]
new_human.g_hair = hair_colors[hair_color][2]
@@ -36,15 +31,12 @@
new_human.g_eyes = colors[eye_color][2]
new_human.b_eyes = colors[eye_color][3]
if(new_human.gender == MALE)
- new_human.h_style = pick("Crewcut", "Shaved Head", "Buzzcut", "Undercut", "Side Undercut", "Pvt. Joker", "Marine Fade", "Low Fade", "Medium Fade", "High Fade", "No Fade", "Coffee House Cut", "Flat Top",)
- new_human.f_style = pick("5 O'clock Shadow", "Shaved", "Full Beard", "3 O'clock Moustache", "5 O'clock Shadow", "5 O'clock Moustache", "7 O'clock Shadow", "7 O'clock Moustache",)
+ new_human.h_style = pick("Undercut", "Partly Shaved", "Side Undercut", "Side Hang Undercut (Reverse)", "Undercut, Top", "Medium Fade", "High Fade", "Coffee House Cut")
+ new_human.f_style = pick("Shaved", "Shaved", "Shaved", "3 O'clock Shadow", "3 O'clock Moustache", "5 O'clock Shadow", "5 O'clock Moustache", "7 O'clock Shadow", "7 O'clock Moustache",)
else
- new_human.h_style = pick("Ponytail 1", "Ponytail 2", "Ponytail 3", "Ponytail 4", "Pvt. Redding", "Pvt. Clarison", "Cpl. Dietrich", "Pvt. Vasquez", "Marine Bun", "Marine Bun 2", "Marine Flat Top",)
+ new_human.h_style = pick("Side Undercut", "Side Hang Undercut (Reverse)", "Undercut, Top", "CIA", "Mulder", "Pvt. Redding", "Pixie Cut Left", "Pixie Cut Right", "Bun")
new_human.change_real_name(new_human, random_name)
- new_human.age = rand(20,45)
- new_human.r_hair = rand(15,35)
- new_human.g_hair = rand(15,35)
- new_human.b_hair = rand(25,45)
+ new_human.age = rand(20,35)
/datum/equipment_preset/cmb/load_id(mob/living/carbon/human/new_human, client/mob_client)
if(human_versus_human)
@@ -70,24 +62,17 @@
var/choice = rand(1,10)
new_human.equip_to_slot_or_del(new headset_type, WEAR_L_EAR)
new_human.equip_to_slot_or_del(new /obj/item/clothing/under/CM_uniform, WEAR_BODY)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/holobadge/cord, WEAR_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette, WEAR_FACE)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/CMB, WEAR_JACKET)
- new_human.equip_to_slot_or_del(new /obj/item/device/binoculars, WEAR_IN_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/weapon/telebaton, WEAR_IN_JACKET)
- new_human.equip_to_slot_or_del(new /obj/item/storage/belt/security/MP/CMB/full, WEAR_WAIST)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/clothing/head/CMB, WEAR_HEAD)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/veteran/pmc/knife, WEAR_FEET)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud, WEAR_EYES)
- new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/ert, WEAR_L_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/sec, WEAR_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/holdout, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/radio, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/flashlight, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/camera, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/taperecorder, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup, WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate, WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/black, WEAR_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/attachable/bayonet, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/box/m94, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/box/m94, WEAR_IN_BACK)
switch(choice)
if(1 to 6)
@@ -95,9 +80,9 @@
new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/revolver/cmb, WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/cmb/normalpoint, WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/cmb/normalpoint, WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/security/MP/CMB/full/revolver, WEAR_WAIST)
new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/pump/dual_tube/cmb, WEAR_J_STORE)
new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/large, WEAR_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/buckshot, WEAR_IN_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/buckshot, WEAR_IN_R_STORE)
@@ -105,15 +90,17 @@
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/buckshot, WEAR_IN_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun, WEAR_IN_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun, WEAR_IN_R_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/beanbag, WEAR_IN_R_STORE)
- if(7 to 8)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun, WEAR_IN_R_STORE)
+ if(7 to 9)
new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/holster, WEAR_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/highpower, WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/highpower, WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/highpower, WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/security/MP/CMB/full/highpower, WEAR_WAIST)
new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/pump/dual_tube/cmb, WEAR_J_STORE)
new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/large, WEAR_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/buckshot, WEAR_IN_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/buckshot, WEAR_IN_R_STORE)
@@ -121,20 +108,23 @@
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/buckshot, WEAR_IN_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun, WEAR_IN_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun, WEAR_IN_R_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/beanbag, WEAR_IN_R_STORE)
- if(9 to 10)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun, WEAR_IN_R_STORE)
+ if(10)
new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/holster, WEAR_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/revolver/cmb, WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/cmb/normalpoint, WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/cmb/normalpoint, WEAR_IN_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/mp5, WEAR_J_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/security/MP/CMB/full/revolver, WEAR_WAIST)
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1, WEAR_J_STORE)
new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector, WEAR_L_HAND)
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/magazine/large, WEAR_R_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp5, WEAR_IN_R_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp5, WEAR_IN_R_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp5, WEAR_IN_R_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp5, WEAR_IN_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1, WEAR_IN_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1, WEAR_IN_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1, WEAR_IN_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1, WEAR_IN_R_STORE)
//*****************************************************************************************************/
@@ -160,17 +150,13 @@
new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/revolver/cmb, WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/cmb/normalpoint, WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/cmb/normalpoint, WEAR_IN_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/holobadge/cord, WEAR_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar, WEAR_FACE)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/CMB/marshal, WEAR_JACKET)
- new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range, WEAR_IN_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/weapon/telebaton, WEAR_IN_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/pump/dual_tube/cmb/m3717, WEAR_J_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/storage/belt/security/MP/CMB/full, WEAR_WAIST)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/security/MP/CMB/full/revolver, WEAR_WAIST)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/clothing/head/CMB, WEAR_HEAD)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/veteran/pmc/knife, WEAR_FEET)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud, WEAR_EYES)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup, WEAR_FEET)
//pouches
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/ert, WEAR_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/large, WEAR_R_STORE)
@@ -182,15 +168,11 @@
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun, WEAR_IN_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/beanbag, WEAR_IN_R_STORE)
//backpack
- new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/sec, WEAR_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/holdout, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15/rubber, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/handheld_distress_beacon/cmb, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/radio, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/black, WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/flashlight, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/camera, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/taperecorder, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/attachable/bayonet, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/box/m94, WEAR_IN_BACK)
//*****************************************************************************************************/
/datum/equipment_preset/cmb/synth
@@ -315,8 +297,8 @@
new_human.equip_to_slot_or_del(new /obj/item/clothing/under/liaison_suit/corporate_formal, WEAR_BODY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/holster, WEAR_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/mod88, WEAR_IN_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/mod88, WEAR_IN_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/mod88, WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/mod88/normalpoint, WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/mod88/normalpoint, WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/health/ceramic_plate, WEAR_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat/white, WEAR_HEAD)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/hazardvest/yellow, WEAR_JACKET)
diff --git a/code/modules/gear_presets/upp.dm b/code/modules/gear_presets/upp.dm
index 6406cf5301..5488403e72 100644
--- a/code/modules/gear_presets/upp.dm
+++ b/code/modules/gear_presets/upp.dm
@@ -173,13 +173,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -196,13 +196,13 @@
list("Type 71 AP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/ap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Smoke Grenade", 5, /obj/item/explosive/grenade/smokebomb, null, VENDOR_ITEM_REGULAR),
@@ -306,13 +306,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -366,13 +366,13 @@
list("Type 71 AP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/ap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Smoke Grenade", 5, /obj/item/explosive/grenade/smokebomb, null, VENDOR_ITEM_REGULAR),
@@ -499,13 +499,13 @@
list("Type 71 AP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/ap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Plastic Explosive", 5, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
@@ -604,13 +604,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -626,13 +626,13 @@
list("QYJ-72 Box Magazine(7.62x54mmR)", 15, /obj/item/ammo_magazine/pkp , null, VENDOR_ITEM_RECOMMENDED),
list("ATTACHMENTS (NONE FIT QYJ-72)", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Plastic Explosive", 5, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
@@ -729,13 +729,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -751,13 +751,13 @@
list("QYJ-72 Box Magazine (7.62x54mmR)", 15, /obj/item/ammo_magazine/pkp , null, VENDOR_ITEM_RECOMMENDED),
list("ATTACHMENTS (NONE FIT QYJ-72)", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Plastic Explosive", 5, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
@@ -868,13 +868,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -919,13 +919,13 @@
list("Type 71 AP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/ap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Plastic Explosive", 5, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
@@ -1020,13 +1020,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas/pmc/upp, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -1071,13 +1071,13 @@
list("Type 71 AP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/ap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Plastic Explosive", 5, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
@@ -1183,13 +1183,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas/pmc/upp, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -1234,13 +1234,13 @@
list("Type 71 HEAP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/heap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Plastic Explosive", 5, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
@@ -1343,13 +1343,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas/pmc/upp, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -1394,13 +1394,13 @@
list("Type 71 HEAP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/heap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Plastic Explosive", 5, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
@@ -1504,13 +1504,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas/pmc/upp, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -1555,13 +1555,13 @@
list("Type 71 HEAP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/heap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Plastic Explosive", 5, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
@@ -1665,13 +1665,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas/pmc/upp, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -1716,13 +1716,13 @@
list("Type 71 HEAP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/heap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Plastic Explosive", 5, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
@@ -1826,13 +1826,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas/pmc/upp, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -1877,13 +1877,13 @@
list("Type 71 HEAP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/heap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Plastic Explosive", 5, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
@@ -1987,13 +1987,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas/pmc/upp, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -2038,13 +2038,13 @@
list("Type 71 HEAP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/heap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Plastic Explosive", 5, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
@@ -2148,13 +2148,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas/pmc/upp, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -2199,13 +2199,13 @@
list("Type 71 HEAP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/heap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Plastic Explosive", 5, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
@@ -2309,13 +2309,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas/pmc/upp, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -2360,13 +2360,13 @@
list("Type 71 HEAP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/heap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Plastic Explosive", 5, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
@@ -2470,13 +2470,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas/pmc/upp, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -2521,13 +2521,13 @@
list("Type 71 HEAP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/heap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Plastic Explosive", 5, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
@@ -2877,7 +2877,7 @@
list("Pistol Magazine Pouch", 0, /obj/item/storage/pouch/magazine/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Tactical Bandana", 0, /obj/item/clothing/mask/rebreather/scarf/tacticalmask/green, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR)
@@ -2981,13 +2981,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -3004,13 +3004,13 @@
list("Type 71 HEAP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/heap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Smoke Grenade", 5, /obj/item/explosive/grenade/smokebomb, null, VENDOR_ITEM_REGULAR),
@@ -3114,13 +3114,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -3174,13 +3174,13 @@
list("Type 71 HEAP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/heap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Smoke Grenade", 5, /obj/item/explosive/grenade/smokebomb, null, VENDOR_ITEM_REGULAR),
@@ -3276,13 +3276,13 @@
list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Angled Grip", 0, /obj/item/attachable/angledgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 0, /obj/item/attachable/angledgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 0, /obj/item/attachable/extended_barrel, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 0, /obj/item/attachable/reddot, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 0, /obj/item/attachable/reflex, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 0, /obj/item/attachable/reddot/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 0, /obj/item/attachable/reflex/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("Suppressor", 0, /obj/item/attachable/suppressor, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 0, /obj/item/attachable/verticalgrip, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 0, /obj/item/attachable/verticalgrip/upp, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
list("MASK (CHOOSE 1)", 0, null, null, null),
list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
@@ -3327,13 +3327,13 @@
list("Type 71 HEAP Magazine (5.45x39mm)", 10, /obj/item/ammo_magazine/rifle/type71/heap , null, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("EXPLOSIVES", 0, null, null, null),
list("Plastic Explosive", 5, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
@@ -3530,19 +3530,19 @@
list("Heat Absorbent Coif", 0, /obj/item/clothing/mask/rebreather/scarf, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
list("ATTACHMENTS", 0, null, null, null),
- list("Angled Grip", 10, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 10, /obj/item/attachable/angledgrip/upp, null, VENDOR_ITEM_REGULAR),
list("Extended Barrel", 10, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR),
list("Gyroscopic Stabilizer", 10, /obj/item/attachable/gyro, null, VENDOR_ITEM_REGULAR),
- list("Laser Sight", 10, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 10, /obj/item/attachable/lasersight/upp, null, VENDOR_ITEM_REGULAR),
list("Masterkey Shotgun", 10, /obj/item/attachable/attached_gun/shotgun, null, VENDOR_ITEM_REGULAR),
list("M37 Wooden Stock", 10, /obj/item/attachable/stock/shotgun, null, VENDOR_ITEM_REGULAR),
list("M39 Stock", 10, /obj/item/attachable/stock/smg, null, VENDOR_ITEM_REGULAR),
list("M41A Solid Stock", 10, /obj/item/attachable/stock/rifle, null, VENDOR_ITEM_REGULAR),
list("Recoil Compensator", 10, /obj/item/attachable/compensator, null, VENDOR_ITEM_REGULAR),
- list("Red-Dot Sight", 10, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR),
- list("Reflex Sight", 10, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR),
+ list("Red-Dot Sight", 10, /obj/item/attachable/reddot/upp, null, VENDOR_ITEM_REGULAR),
+ list("Reflex Sight", 10, /obj/item/attachable/reflex/upp, null, VENDOR_ITEM_REGULAR),
list("Suppressor", 10, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", 10, /obj/item/attachable/verticalgrip, null, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 10, /obj/item/attachable/verticalgrip/upp, null, VENDOR_ITEM_REGULAR),
list("UTILITIES", 0, null, null, null),
list("Fire Extinguisher (Portable)", 5, /obj/item/tool/extinguisher/mini, null, VENDOR_ITEM_REGULAR),
diff --git a/code/modules/gear_presets/uscm.dm b/code/modules/gear_presets/uscm.dm
index 5cc00b0f42..82ba128bcd 100644
--- a/code/modules/gear_presets/uscm.dm
+++ b/code/modules/gear_presets/uscm.dm
@@ -61,6 +61,38 @@
var/obj/item/device/radio/headset/almayer/marine/equipped_headset = new_human.wear_r_ear
equipped_headset.add_hud_tracker(new_human)
+/datum/equipment_preset/uscm/proc/spawn_marine_fluff_items(mob/living/carbon/human/new_human)
+ var/obj/item/helmet_accessory = pick(GLOB.allowed_helmet_items)
+ new_human.equip_to_slot_or_del(new helmet_accessory, WEAR_IN_HELMET)
+ if(prob(50))
+ var/obj/item/helmet_accessory_two = pick(GLOB.allowed_helmet_items)
+ new_human.equip_to_slot_or_del(new helmet_accessory_two, WEAR_IN_HELMET)
+ var/list/possible_masks = list(/obj/item/clothing/mask/gas) + subtypesof(/obj/item/clothing/mask/rebreather) + subtypesof(/obj/item/clothing/mask/tornscarf)
+ if(prob(50))
+ var/obj/item/clothing/mask/new_mask = pick(possible_masks)
+ new_human.equip_to_slot_or_del(new new_mask, WEAR_FACE)
+
+ var/list/possible_glasses = list(/obj/item/clothing/glasses/regular, /obj/item/clothing/glasses/regular/hipster, /obj/item/clothing/glasses/sunglasses, /obj/item/clothing/glasses/sunglasses/aviator, /obj/item/clothing/glasses/sunglasses/big) + subtypesof(/obj/item/clothing/glasses/mgoggles)
+ if(prob(50))
+ var/obj/item/clothing/mask/new_glasses = pick(possible_glasses)
+ new_human.equip_to_slot_or_del(new new_glasses, WEAR_EYES)
+
+/datum/equipment_preset/uscm/proc/spawn_marine_armor(mob/living/carbon/human/new_human)
+ if(prob(66))
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/medium, WEAR_JACKET)
+ else if(prob(50))
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/light, WEAR_JACKET)
+ else
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/heavy, WEAR_JACKET)
+
+/datum/equipment_preset/uscm/proc/spawn_marine_backpack(mob/living/carbon/human/new_human)
+ if(prob(75))
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel, WEAR_BACK)
+ else
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine, WEAR_BACK)
+
+/datum/equipment_preset/uscm/proc/spawn_marine_sidearm(mob/living/carbon/human/new_human)
+ return
//*****************************************************************************************************/
/datum/equipment_preset/uscm/pfc
@@ -83,22 +115,6 @@
new_human.equip_to_slot_or_del(new back_item(new_human), WEAR_BACK)
-/datum/equipment_preset/uscm/pfc/cryo
- name = "USCM Cryo Squad Rifleman"
- auto_squad_name = SQUAD_MARINE_CRYO
-
-/datum/equipment_preset/uscm/pfc/cryo/load_gear(mob/living/carbon/human/new_human)
- ..()
- new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo(new_human), WEAR_L_EAR)
-
-/datum/equipment_preset/uscm/pfc/cryo
- name = "USCM Cryo Squad Rifleman"
- auto_squad_name = SQUAD_MARINE_CRYO
-
-/datum/equipment_preset/uscm/pfc/cryo/load_gear(mob/living/carbon/human/new_human)
- ..()
- new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo(new_human), WEAR_L_EAR)
-
/datum/equipment_preset/uscm/pfc/lesser_rank
paygrade = "ME1"
@@ -158,13 +174,6 @@
new_human.equip_to_slot_or_del(new back_item(new_human), WEAR_BACK)
-/datum/equipment_preset/uscm/sg/cryo
- name = "USCM Cryo Squad Smartgunner"
- auto_squad_name = SQUAD_MARINE_CRYO
-
-/datum/equipment_preset/uscm/sg/cryo/load_gear(mob/living/carbon/human/new_human)
- ..()
- new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo(new_human), WEAR_L_EAR)
/datum/equipment_preset/uscm/sg/lesser_rank
paygrade = "ME3"
@@ -433,14 +442,6 @@
new_human.equip_to_slot_or_del(new back_item(new_human), WEAR_BACK)
-/datum/equipment_preset/uscm/medic/cryo
- name = "USCM Cryo Squad Hospital Corpsman"
- auto_squad_name = SQUAD_MARINE_CRYO
-
-/datum/equipment_preset/uscm/medic/cryo/load_gear(mob/living/carbon/human/new_human)
- ..()
- new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo/med(new_human), WEAR_L_EAR)
-
/datum/equipment_preset/uscm/medic/lesser_rank
paygrade = "ME3"
@@ -500,14 +501,6 @@
new_human.equip_to_slot_or_del(new back_item(new_human), WEAR_BACK)
-/datum/equipment_preset/uscm/tl/cryo
- name = "USCM Cryo Squad Sergeant"
- auto_squad_name = SQUAD_MARINE_CRYO
-
-/datum/equipment_preset/uscm/tl/cryo/load_gear(mob/living/carbon/human/new_human)
- ..()
- new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo/tl(new_human), WEAR_L_EAR)
-
/datum/equipment_preset/uscm/tl/upp
name = "UPP Squad Sergeant"
paygrade = "UE5"
@@ -591,14 +584,6 @@
new_human.equip_to_slot_or_del(new back_item(new_human), WEAR_BACK)
-/datum/equipment_preset/uscm/leader/cryo
- name = "USCM Cryo Platoon Sergeant"
- auto_squad_name = SQUAD_MARINE_CRYO
-
-/datum/equipment_preset/uscm/leader/cryo/load_gear(mob/living/carbon/human/new_human)
- ..()
- new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo/lead(new_human), WEAR_L_EAR)
-
/datum/equipment_preset/uscm/leader/lesser_rank
paygrade = "ME6"
@@ -680,10 +665,26 @@
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BACK)
-/datum/equipment_preset/uscm/private_equipped/cryo
- name = "USCM Cryo Squad Rifleman (Equipped)"
- auto_squad_name = SQUAD_MARINE_CRYO
+/datum/equipment_preset/uscm/private_equipped/random
+ name = "USCM Squad Rifleman (Equipped Random)"
+/datum/equipment_preset/uscm/private_equipped/random/load_gear(mob/living/carbon/human/new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine(new_human), WEAR_BODY)
+ spawn_marine_armor(new_human)
+ spawn_marine_backpack(new_human)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo(new_human), WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flare/full(new_human), WEAR_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE(new_human), WEAR_IN_BACK)
+
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1(new_human), WEAR_J_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine/m41amk1(new_human), WEAR_WAIST)
+ spawn_marine_fluff_items(new_human)
//*****************************************************************************************************/
@@ -723,9 +724,26 @@
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BACK)
-/datum/equipment_preset/uscm/leader_equipped/cryo
- name = "USCM Cryo Platoon Sergeant (Equipped)"
- auto_squad_name = SQUAD_MARINE_CRYO
+/datum/equipment_preset/uscm/leader_equipped/random
+ name = "USCM Platoon Sergeant (Equipped Random)"
+
+/datum/equipment_preset/uscm/leader_equipped/random/load_gear(mob/living/carbon/human/new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine(new_human), WEAR_BODY)
+ spawn_marine_armor(new_human)
+ spawn_marine_backpack(new_human)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/leader(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo/lead(new_human), WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flare/full(new_human), WEAR_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1(new_human), WEAR_J_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine/m41amk1(new_human), WEAR_WAIST)
+ spawn_marine_fluff_items(new_human)
//*****************************************************************************************************/
@@ -761,10 +779,58 @@
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo(new_human), WEAR_L_EAR)
-/datum/equipment_preset/uscm/smartgunner_equipped/cryo
- name = "USCM Cryo Squad Smartgunner (Equipped)"
- auto_squad_name = SQUAD_MARINE_CRYO
+/datum/equipment_preset/uscm/smartgunner_equipped/random
+ name = "USCM Squad Smartgunner (Equipped Random)"
+/datum/equipment_preset/uscm/smartgunner_equipped/random/spawn_marine_fluff_items(mob/living/carbon/human/new_human)
+ var/obj/item/helmet_accessory = pick(GLOB.allowed_helmet_items)
+ new_human.equip_to_slot_or_del(new helmet_accessory, WEAR_IN_HELMET)
+ if(prob(50))
+ var/obj/item/helmet_accessory_two = pick(GLOB.allowed_helmet_items)
+ new_human.equip_to_slot_or_del(new helmet_accessory_two, WEAR_IN_HELMET)
+ var/list/possible_masks = list(/obj/item/clothing/mask/gas) + subtypesof(/obj/item/clothing/mask/rebreather) + subtypesof(/obj/item/clothing/mask/tornscarf)
+ if(prob(50))
+ var/obj/item/clothing/mask/new_mask = pick(possible_masks)
+ new_human.equip_to_slot_or_del(new new_mask, WEAR_FACE)
+
+/datum/equipment_preset/uscm/smartgunner_equipped/random/spawn_marine_sidearm(mob/living/carbon/human/new_human)
+ var/sidearm = pick("m4a3", "mod88", "vp78", "m44")
+ switch(sidearm)
+ if("m4a3")
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/m4a3(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol(new_human), WEAR_IN_ACCESSORY)
+ if("mod88")
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/mod88(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/mod88(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/mod88(new_human), WEAR_IN_ACCESSORY)
+ if("vp78")
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp78(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp78(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp78(new_human), WEAR_IN_ACCESSORY)
+ if("m44")
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/revolver/m44(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver(new_human), WEAR_IN_ACCESSORY)
+
+/datum/equipment_preset/uscm/smartgunner_equipped/random/load_gear(mob/living/carbon/human/new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/holster(new_human), WEAR_ACCESSORY)
+ spawn_marine_sidearm(new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/smartgunner(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smartgun(new_human), WEAR_J_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flare/full(new_human), WEAR_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/general_belt(new_human), WEAR_WAIST)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smartgun(new_human), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smartgun(new_human), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smartgun(new_human), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m56_goggles/no_nightvision(new_human), WEAR_EYES)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE(new_human), WEAR_IN_JACKET)
+ spawn_marine_fluff_items(new_human)
//*****************************************************************************************************/
@@ -861,9 +927,46 @@
new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/surgical_line(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft(new_human), WEAR_IN_BACK)
-/datum/equipment_preset/uscm/medic_equipped/cryo
- name = "USCM Cryo Hospital Corpsman (Equipped)"
- auto_squad_name = SQUAD_MARINE_CRYO
+/datum/equipment_preset/uscm/medic_equipped/random
+ name = "USCM Squad Hospital Corpsman (Equipped Random)"
+
+/datum/equipment_preset/uscm/medic_equipped/random/spawn_marine_fluff_items(mob/living/carbon/human/new_human)
+ var/obj/item/helmet_accessory = pick(GLOB.allowed_helmet_items)
+ new_human.equip_to_slot_or_del(new helmet_accessory, WEAR_IN_HELMET)
+ if(prob(50))
+ var/obj/item/helmet_accessory_two = pick(GLOB.allowed_helmet_items)
+ new_human.equip_to_slot_or_del(new helmet_accessory_two, WEAR_IN_HELMET)
+
+ if(prob(50))
+ var/list/possible_masks = list(/obj/item/clothing/mask/gas) + subtypesof(/obj/item/clothing/mask/rebreather) + subtypesof(/obj/item/clothing/mask/tornscarf)
+ if(prob(25))
+ var/obj/item/clothing/mask/new_mask = pick(possible_masks)
+ new_human.equip_to_slot_or_del(new new_mask, WEAR_FACE)
+ else
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(new_human), WEAR_FACE)
+
+/datum/equipment_preset/uscm/medic_equipped/random/load_gear(mob/living/carbon/human/new_human)
+ spawn_marine_backpack(new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/medic(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/medic(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo/med(new_human), WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/medium(new_human), WEAR_JACKET)
+ spawn_marine_fluff_items(new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/full(new_human), WEAR_WAIST)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/medkit/full(new_human), WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flare/full(new_human), WEAR_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1(new_human), WEAR_J_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/surgical_line(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft(new_human), WEAR_IN_BACK)
//*****************************************************************************************************/
@@ -972,9 +1075,29 @@
new_human.back.pickup(new_human)
-/datum/equipment_preset/uscm/tl_equipped/cryo
- name = "USCM Cryo Squad Sergeant (Equipped)"
- auto_squad_name = SQUAD_MARINE_CRYO
+/datum/equipment_preset/uscm/tl_equipped/random
+ name = "USCM Squad Sergeant (Equipped Random)"
+
+/datum/equipment_preset/uscm/tl_equipped/random/load_gear(mob/living/carbon/human/new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/rto(new_human), WEAR_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine(new_human), WEAR_BODY)
+ spawn_marine_armor(new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/rto(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo(new_human), WEAR_L_EAR)
+
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flare/full(new_human), WEAR_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE(new_human), WEAR_IN_BACK)
+
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1(new_human), WEAR_J_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine/m41amk1(new_human), WEAR_WAIST)
+ spawn_marine_fluff_items(new_human)
+
+
//############ Marine Raiders #############
//Operator
diff --git a/code/modules/gear_presets/uscm_police.dm b/code/modules/gear_presets/uscm_police.dm
index 0ead4f713c..108aca26d9 100644
--- a/code/modules/gear_presets/uscm_police.dm
+++ b/code/modules/gear_presets/uscm_police.dm
@@ -1,14 +1,14 @@
/datum/equipment_preset/uscm_ship/uscm_police
name = "USCM (police roles)"
faction = FACTION_MARINE
- minimum_age = 27
+ minimum_age = 22
//*****************************************************************************************************/
/datum/equipment_preset/uscm_ship/uscm_police/mp
name = "USCM Military Police (MP)"
flags = EQUIPMENT_PRESET_START_OF_ROUND|EQUIPMENT_PRESET_MARINE
-
+ idtype = /obj/item/card/id/dogtag
access = list(
ACCESS_MARINE_BRIG,
ACCESS_MARINE_COMMAND,
@@ -34,29 +34,29 @@
minimap_icon = "mp"
utility_under = list(/obj/item/clothing/under/marine/mp)
- utility_hat = list(/obj/item/clothing/head/beret/marine/mp)
- utility_extra = list(/obj/item/clothing/head/cmcap, /obj/item/clothing/head/beret/cm, /obj/item/clothing/head/beret/cm/tan)
+ utility_hat = list(/obj/item/clothing/head/cmcap)
+ utility_extra = list(/obj/item/clothing/head/cmcap)
- service_over = list(/obj/item/clothing/suit/storage/jacket/marine/service/mp)
+ service_over = list(/obj/item/clothing/suit/storage/jacket/marine/service)
/datum/equipment_preset/uscm_ship/uscm_police/mp/load_gear(mob/living/carbon/human/new_human)
- var/back_item = /obj/item/storage/backpack/satchel/sec
+ var/back_item = /obj/item/storage/backpack/marine/satchel
if (new_human.client && new_human.client.prefs && (new_human.client.prefs.backbag == 1))
- back_item = /obj/item/storage/backpack/security
+ back_item = /obj/item/storage/backpack/marine/satchel
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/mmpo(new_human), WEAR_L_EAR)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/mp(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/armband/mpsec(new_human), WEAR_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/holster(new_human), WEAR_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/mod88(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/mod88/normalpoint(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/mod88/normalpoint(new_human), WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/storage/belt/security/MP/full(new_human), WEAR_WAIST)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/MP(new_human), WEAR_JACKET)
- if(new_human.disabilities & NEARSIGHTED)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud/prescription(new_human), WEAR_EYES)
- else
- new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(new_human), WEAR_EYES)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/marine/mp(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/light/vest/dcc(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/MP(new_human), WEAR_HEAD)
new_human.equip_to_slot_or_del(new back_item(new_human), WEAR_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/taperecorder(new_human), WEAR_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/medium(new_human), WEAR_R_STORE)
/datum/equipment_preset/uscm_ship/uscm_police/mp/load_rank(mob/living/carbon/human/human)
@@ -69,7 +69,7 @@
/datum/equipment_preset/uscm_ship/uscm_police/warden
name = "USCM Military Warden (MW)"
flags = EQUIPMENT_PRESET_START_OF_ROUND|EQUIPMENT_PRESET_MARINE
- idtype = /obj/item/card/id/silver
+ idtype = /obj/item/card/id/dogtag
access = list(
ACCESS_MARINE_BRIG,
@@ -97,30 +97,29 @@
minimap_icon = "warden"
utility_under = list(/obj/item/clothing/under/marine/warden)
- utility_hat = list(/obj/item/clothing/head/beret/marine/mp/warden)
- utility_extra = list(/obj/item/clothing/head/cmcap, /obj/item/clothing/head/beret/cm, /obj/item/clothing/head/beret/cm/tan)
+ utility_hat = list(/obj/item/clothing/head/cmcap)
- service_over = list(/obj/item/clothing/suit/storage/jacket/marine/service/warden)
+ service_over = list(/obj/item/clothing/suit/storage/jacket/marine/service)
/datum/equipment_preset/uscm_ship/uscm_police/warden/load_gear(mob/living/carbon/human/new_human)
- var/back_item = /obj/item/storage/backpack/satchel/sec
+ var/back_item = /obj/item/storage/backpack/marine/satchel
if (new_human.client && new_human.client.prefs && (new_human.client.prefs.backbag == 1))
- back_item = /obj/item/storage/backpack/security
+ back_item = /obj/item/storage/backpack/marine/satchel
- new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/cmpcom(new_human), WEAR_L_EAR)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/warden(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/mmpo(new_human), WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/armband/mpsec(new_human), WEAR_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/holster(new_human), WEAR_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/mod88(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/mod88/normalpoint(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/mod88/normalpoint(new_human), WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/storage/belt/security/MP/full(new_human), WEAR_WAIST)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/MP/warden(new_human), WEAR_JACKET)
- if(new_human.disabilities & NEARSIGHTED)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud/prescription(new_human), WEAR_EYES)
- else
- new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(new_human), WEAR_EYES)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/marine/mp/warden(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/light/vest/dcc(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/MP(new_human), WEAR_HEAD)
new_human.equip_to_slot_or_del(new back_item(new_human), WEAR_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/taperecorder(new_human), WEAR_L_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large(new_human), WEAR_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/medium(new_human), WEAR_R_STORE)
//*****************************************************************************************************/
@@ -165,25 +164,24 @@
service_over = list(/obj/item/clothing/suit/storage/jacket/marine/service/cmp)
/datum/equipment_preset/uscm_ship/uscm_police/cmp/load_gear(mob/living/carbon/human/new_human)
- var/back_item = /obj/item/storage/backpack/satchel/sec
+ var/back_item = /obj/item/storage/backpack/marine/satchel
if (new_human.client && new_human.client.prefs && (new_human.client.prefs.backbag == 1))
- back_item = /obj/item/storage/backpack/security
+ back_item = /obj/item/storage/backpack/marine/satchel
- new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/cmpcom(new_human), WEAR_L_EAR)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/officer/warrant(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/mmpo(new_human), WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/armband/mpsec(new_human), WEAR_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/holster(new_human), WEAR_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/mod88(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/mod88/normalpoint(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/mod88/normalpoint(new_human), WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/storage/belt/security/MP/full(new_human), WEAR_WAIST)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/MP/WO(new_human), WEAR_JACKET)
- if(new_human.disabilities & NEARSIGHTED)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud/prescription(new_human), WEAR_EYES)
- else
- new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(new_human), WEAR_EYES)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/marine/mp/cmp(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/light/vest/dcc(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/MP(new_human), WEAR_HEAD)
new_human.equip_to_slot_or_del(new back_item(new_human), WEAR_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/taperecorder(new_human), WEAR_L_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large(new_human), WEAR_R_STORE)
-
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/medium(new_human), WEAR_R_STORE)
//*****************************************************************************************************/
diff --git a/code/modules/gear_presets/uscm_ship.dm b/code/modules/gear_presets/uscm_ship.dm
index 5644e8c515..905fa8265b 100644
--- a/code/modules/gear_presets/uscm_ship.dm
+++ b/code/modules/gear_presets/uscm_ship.dm
@@ -5,6 +5,32 @@
minimum_age = 20
languages = list(LANGUAGE_ENGLISH)
+/datum/equipment_preset/uscm_ship/load_name(mob/living/carbon/human/new_human, randomise)
+ new_human.gender = pick(75;MALE,25;FEMALE)
+ var/datum/preferences/A = new
+ A.randomize_appearance(new_human)
+ var/random_name = capitalize(pick(new_human.gender == MALE ? first_names_male : first_names_female)) + " " + capitalize(pick(last_names))
+ var/static/list/colors = list("BLACK" = list(15, 15, 10), "BROWN" = list(48, 38, 18), "BROWN" = list(48, 38, 18),"BLUE" = list(29, 51, 65), "GREEN" = list(40, 61, 39), "STEEL" = list(46, 59, 54))
+ var/static/list/hair_colors = list("BLACK" = list(15, 15, 10), "BROWN" = list(48, 38, 18), "AUBURN" = list(77, 48, 36), "BLONDE" = list(95, 76, 44))
+ var/hair_color = pick(hair_colors)
+ new_human.r_hair = hair_colors[hair_color][1]
+ new_human.g_hair = hair_colors[hair_color][2]
+ new_human.b_hair = hair_colors[hair_color][3]
+ new_human.r_facial = hair_colors[hair_color][1]
+ new_human.g_facial = hair_colors[hair_color][2]
+ new_human.b_facial = hair_colors[hair_color][3]
+ var/eye_color = pick(colors)
+ new_human.r_eyes = colors[eye_color][1]
+ new_human.g_eyes = colors[eye_color][2]
+ new_human.b_eyes = colors[eye_color][3]
+ if(new_human.gender == MALE)
+ new_human.h_style = pick("Undercut", "Partly Shaved", "Side Undercut", "Side Hang Undercut (Reverse)", "Undercut, Top", "Medium Fade", "High Fade", "Coffee House Cut")
+ new_human.f_style = pick("Shaved", "Shaved", "Shaved", "Shaved", "Shaved", "Shaved", "3 O'clock Shadow", "3 O'clock Moustache", "5 O'clock Shadow", "5 O'clock Moustache", "7 O'clock Shadow", "7 O'clock Moustache",)
+ else
+ new_human.h_style = pick("Side Undercut", "Side Hang Undercut (Reverse)", "Undercut, Top", "CIA", "Mulder", "Pvt. Redding", "Pixie Cut Left", "Pixie Cut Right", "Bun")
+ new_human.change_real_name(new_human, random_name)
+ new_human.age = rand(20,35)
+
utility_under = list(/obj/item/clothing/under/marine/officer/command)
utility_hat = list(/obj/item/clothing/head/cmcap)
utility_gloves = list(/obj/item/clothing/gloves/marine)
diff --git a/code/modules/lighting/lighting_static/static_lighting_turf.dm b/code/modules/lighting/lighting_static/static_lighting_turf.dm
index 2fe918fa88..ec91e17e4f 100644
--- a/code/modules/lighting/lighting_static/static_lighting_turf.dm
+++ b/code/modules/lighting/lighting_static/static_lighting_turf.dm
@@ -31,7 +31,8 @@
return !(luminosity || dynamic_lumcount)
-/turf/proc/change_area(area/old_area, area/new_area)
+///Transfer the lighting of one area to another
+/turf/proc/transfer_area_lighting(area/old_area, area/new_area)
if(SSlighting.initialized)
if (new_area.static_lighting != old_area.static_lighting)
if (new_area.static_lighting)
@@ -44,6 +45,8 @@
if(new_area.lighting_effect)
overlays += new_area.lighting_effect
+
+
/turf/proc/static_generate_missing_corners()
if (!lighting_corner_NE)
lighting_corner_NE = new/datum/static_lighting_corner(src, NORTH|EAST)
diff --git a/code/modules/logging/global_logs.dm b/code/modules/logging/global_logs.dm
index ff384fe537..f8a3a99c87 100644
--- a/code/modules/logging/global_logs.dm
+++ b/code/modules/logging/global_logs.dm
@@ -28,6 +28,9 @@ GLOBAL_PROTECT(scheduler_stats)
GLOBAL_VAR(mutator_logs)
GLOBAL_PROTECT(mutator_logs)
+GLOBAL_VAR(mapping_log)
+GLOBAL_PROTECT(mapping_log)
+
GLOBAL_VAR(round_stats)
GLOBAL_PROTECT(round_stats)
diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm
index 35f7d30a97..50a343635d 100644
--- a/code/modules/mapping/map_template.dm
+++ b/code/modules/mapping/map_template.dm
@@ -7,6 +7,20 @@
var/datum/parsed_map/cached_map
var/keep_cached_map = FALSE
+ ///Default area associated with the map template
+ var/default_area
+
+ ///if true, turfs loaded from this template are placed on top of the turfs already there, defaults to TRUE
+ var/should_place_on_top = TRUE
+
+ ///if true, creates a list of all atoms created by this template loading, defaults to FALSE
+ var/returns_created_atoms = FALSE
+
+ ///the list of atoms created by this template being loaded, only populated if returns_created_atoms is TRUE
+ var/list/created_atoms = list()
+ //make sure this list is accounted for/cleared if you request it from ssatoms!
+
+
/datum/map_template/New(path = null, rename = null, cache = FALSE)
if(path)
mappath = path
@@ -25,71 +39,129 @@
cached_map = parsed
return bounds
-/datum/parsed_map/proc/initTemplateBounds()
- var/list/obj/structure/cable/cables = list()
- var/list/atom/atoms = list()
- var/list/area/areas = list()
+/datum/map_template/proc/initTemplateBounds(list/bounds)
+ if (!bounds) //something went wrong
+ stack_trace("[name] template failed to initialize correctly!")
+ return
- var/list/turfs = block( locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]),
- locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ]))
- for(var/L in turfs)
- var/turf/B = L
- atoms += B
- areas |= B.loc
- for(var/A in B)
- atoms += A
- if(istype(A, /obj/structure/cable))
- cables += A
- continue
+ var/list/atom/movable/movables = list()
+ var/list/obj/docking_port/stationary/ports = list()
+ var/list/area/areas = list()
+ var/list/turfs = block(
+ locate(
+ bounds[MAP_MINX],
+ bounds[MAP_MINY],
+ bounds[MAP_MINZ]
+ ),
+ locate(
+ bounds[MAP_MAXX],
+ bounds[MAP_MAXY],
+ bounds[MAP_MAXZ]
+ )
+ )
+ for(var/turf/current_turf as anything in turfs)
+ var/area/current_turfs_area = current_turf.loc
+ areas |= current_turfs_area
+ if(!SSatoms.initialized)
+ continue
+
+ for(var/movable_in_turf in current_turf)
+ if(istype(movable_in_turf, /obj/docking_port/mobile))
+ continue // mobile docking ports need to be initialized after their template has finished loading, to ensure that their bounds are setup
+ movables += movable_in_turf
+ if(istype(movable_in_turf, /obj/docking_port/stationary))
+ ports += movable_in_turf
+
+ // Not sure if there is some importance here to make sure the area is in z
+ // first or not. Its defined In Initialize yet its run first in templates
+ // BEFORE so... hummm
SSmapping.reg_in_areas_in_z(areas)
- SSatoms.InitializeAtoms(atoms)
- //SSmachines.setup_template_powernets(cables) // mapping TODO:
-
-/datum/map_template/proc/load_new_z()
- var/x = round((world.maxx - width)/2)
- var/y = round((world.maxy - height)/2)
+ if(!SSatoms.initialized)
+ return
- var/datum/space_level/level = SSmapping.add_new_zlevel(name, list(ZTRAIT_AWAY = TRUE))
- var/datum/parsed_map/parsed = load_map(file(mappath), x, y, level.z_value, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), placeOnTop=TRUE)
+ SSatoms.InitializeAtoms(areas + turfs + movables, returns_created_atoms ? created_atoms : null)
+
+ for(var/turf/unlit as anything in turfs)
+ var/area/loc_area = unlit.loc
+ if(!loc_area.static_lighting)
+ continue
+ unlit.static_lighting_build_overlay()
+
+/datum/map_template/proc/load_new_z(secret = FALSE)
+ var/x = round((world.maxx - width) * 0.5) + 1
+ var/y = round((world.maxy - height) * 0.5) + 1
+
+ var/datum/space_level/level = SSmapping.add_new_zlevel(name, list(), contain_turfs = FALSE)
+ var/datum/parsed_map/parsed = load_map(
+ file(mappath),
+ x,
+ y,
+ level.z_value,
+ no_changeturf = (SSatoms.initialized == INITIALIZATION_INSSATOMS),
+ place_on_top = should_place_on_top,
+ new_z = TRUE,
+ )
var/list/bounds = parsed.bounds
if(!bounds)
return FALSE
repopulate_sorted_areas()
-
//initialize things that are normally initialized after map load
- parsed.initTemplateBounds()
- log_game("Z-level [name] loaded at at [x],[y],[world.maxz]")
+ initTemplateBounds(bounds)
+ log_game("Z-level [name] loaded at [x],[y],[world.maxz]")
return level
-/datum/map_template/proc/load(turf/T, centered, delete)
+/datum/map_template/proc/load(turf/T, centered = FALSE, delete = FALSE)
if(centered)
T = locate(T.x - round(width/2) , T.y - round(height/2) , T.z)
if(!T)
return
- if(T.x + width > world.maxx)
+ if((T.x+width) - 1 > world.maxx)
return
- if(T.y + height > world.maxy)
+ if((T.y+height) - 1 > world.maxy)
return
// Accept cached maps, but don't save them automatically - we don't want
// ruins clogging up memory for the whole round.
var/datum/parsed_map/parsed = cached_map || new(file(mappath))
cached_map = keep_cached_map ? parsed : null
- if(!parsed.load(T.x, T.y, T.z, cropMap = TRUE, no_changeturf = (SSatoms.initialized == INITIALIZATION_INSSATOMS), placeOnTop = TRUE, delete = delete))
+
+ var/list/turf_blacklist = list()
+ update_blacklist(T, turf_blacklist)
+
+ UNSETEMPTY(turf_blacklist)
+ parsed.turf_blacklist = turf_blacklist
+ if(!parsed.load(
+ T.x,
+ T.y,
+ T.z,
+ crop_map = TRUE,
+ no_changeturf = (SSatoms.initialized == INITIALIZATION_INSSATOMS),
+ place_on_top = should_place_on_top,
+ delete = delete
+ ))
return
+
var/list/bounds = parsed.bounds
if(!bounds)
return
+ repopulate_sorted_areas()
+
//initialize things that are normally initialized after map load
- parsed.initTemplateBounds()
+ initTemplateBounds(bounds)
- log_game("[name] loaded at at [T.x],[T.y],[T.z]")
+ log_game("[name] loaded at [T.x],[T.y],[T.z]")
return bounds
+/datum/map_template/proc/post_load()
+ return
+
+/datum/map_template/proc/update_blacklist(turf/T, list/input_blacklist)
+ return
+
/datum/map_template/proc/get_affected_turfs(turf/T, centered = FALSE)
var/turf/placement = T
if(centered)
diff --git a/code/modules/mapping/preloader.dm b/code/modules/mapping/preloader.dm
index e8eee898a7..bd89d0e030 100644
--- a/code/modules/mapping/preloader.dm
+++ b/code/modules/mapping/preloader.dm
@@ -1,33 +1,42 @@
// global datum that will preload variables on atoms instanciation
GLOBAL_VAR_INIT(use_preloader, FALSE)
-GLOBAL_DATUM_INIT(_preloader, /datum/map_preloader, new)
+GLOBAL_LIST_INIT(_preloader_attributes, null)
+GLOBAL_LIST_INIT(_preloader_path, null)
/// Preloader datum
/datum/map_preloader
- parent_type = /datum
var/list/attributes
var/target_path
-/datum/map_preloader/proc/setup(list/the_attributes, path)
+/world/proc/preloader_setup(list/the_attributes, path)
if(the_attributes.len)
GLOB.use_preloader = TRUE
- attributes = the_attributes
- target_path = path
+ GLOB._preloader_attributes = the_attributes
+ GLOB._preloader_path = path
-/datum/map_preloader/proc/load(atom/what)
+/world/proc/preloader_load(atom/what)
GLOB.use_preloader = FALSE
+ var/list/attributes = GLOB._preloader_attributes
for(var/attribute in attributes)
var/value = attributes[attribute]
if(islist(value))
- value = deepCopyList(value)
+ value = deep_copy_list(value)
+ #ifdef TESTING
+ if(what.vars[attribute] == value)
+ var/message = "
[what.type] at [AREACOORD(what)] -
VAR: [attribute] = [isnull(value) ? "null" : (isnum(value) ? value : "\"[value]\"")]"
+ log_mapping("DIRTY VAR: [message]")
+ GLOB.dirty_vars += message
+ #endif
what.vars[attribute] = value
-/// Area passthrough: do not instanciate a new area, reuse the current one
+/// Template noop (no operation) is used to skip a turf or area when the template is loaded this allows for template transparency
+/// ex. if a ship has gaps in it's design, you would use template_noop to fill these in so that when the ship moves z-level, any
+/// tiles these gaps land on will not be deleted and replaced with the ships (empty) tiles
/area/template_noop
name = "Area Passthrough"
icon_state = "noop"
-/// Turf passthrough: do not instanciate a new turf, reuse the current one
+/// See above explanation
/turf/template_noop
name = "Turf Passthrough"
icon_state = "noop"
diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm
index 969dc6a795..424ab22ae4 100644
--- a/code/modules/mapping/reader.dm
+++ b/code/modules/mapping/reader.dm
@@ -1,7 +1,67 @@
///////////////////////////////////////////////////////////////
//SS13 Optimized Map loader
//////////////////////////////////////////////////////////////
-#define SPACE_KEY "space"
+// We support two different map formats
+// It is kinda possible to process them together, but if we split them up
+// I can make optimization decisions more easily
+/**
+ * DMM SPEC:
+ * DMM is split into two parts. First we have strings of text linked to lists of paths and their modifications (I will call this the cache)
+ * We call these strings "keys" and the things they point to members. Keys have a static length
+ *
+ * The second part is a list of locations matched to a string of keys. (I'll be calling this the grid)
+ * These are used to lookup the cache we built earlier.
+ * We store location lists as grid_sets. the lines represent different things depending on the spec
+ *
+ * In standard DMM (which you can treat as the base case, since it also covers weird modifications) each line
+ * represents an x file, and there's typically only one grid set per z level.
+ * The meme is you can look at a DMM formatted map and literally see what it should roughly look like
+ * This differs in TGM, and we can pull some performance from this
+ *
+ * Any restrictions here also apply to TGM
+ *
+ * /tg/ Restrictions:
+ * Paths have a specified order. First atoms in the order in which they should be loaded, then a single turf, then the area of the cell
+ * DMM technically supports turf stacking, but this is deprecated for all formats
+
+ */
+#define MAP_DMM "dmm"
+/**
+ * TGM SPEC:
+ * TGM is a derevation of DMM, with restrictions placed on it
+ * to make it easier to parse and to reduce merge conflicts/ease their resolution
+ *
+ * Requirements:
+ * Each "statement" in a key's details ends with a new line, and wrapped in (...)
+ * All paths end with either a comma or occasionally a {, then a new line
+ * Excepting the area, who is listed last and ends with a ) to mark the end of the key
+ *
+ * {} denotes a list of variable edits applied to the path that came before the first {
+ * the final } is followed by a comma, and then a new line
+ * Variable edits have the form \tname = value;\n
+ * Except the last edit, which has no final ;, and just ends in a newline
+ * No extra padding is permitted
+ * Many values are supported. See parse_constant()
+ * Strings must be wrapped in "...", files in '...', and lists in list(...)
+ * Files are kinda susy, and may not actually work. buyer beware
+ * Lists support assoc values as expected
+ * These constants can be further embedded into lists
+ *
+ * There can be no padding in front of, or behind a path
+ *
+ * Therefore:
+ * "key" = (
+ * /path,
+ * /other/path{
+ * var = list("name" = 'filepath');
+ * other_var = /path
+ * },
+ * /turf,
+ * /area)
+ *
+ */
+#define MAP_TGM "tgm"
+#define MAP_UNKNOWN "unknown"
/datum/grid_set
var/xcrd
@@ -11,9 +71,20 @@
/datum/parsed_map
var/original_path
+ var/map_format
+ /// The length of a key in this file. This is promised by the standard to be static
var/key_len = 0
+ /// The length of a line in this file. Not promised by dmm but standard dmm uses it, so we can trust it
+ var/line_len = 0
+ /// If we've expanded world.maxx
+ var/expanded_y = FALSE
+ /// If we've expanded world.maxy
+ var/expanded_x = FALSE
var/list/grid_models = list()
var/list/gridSets = list()
+ /// List of area types we've loaded AS A PART OF THIS MAP
+ /// We do this to allow non unique areas, so we'll only load one per map
+ var/list/area/loaded_areas = list()
var/list/modelCache
@@ -22,33 +93,97 @@
/// Offset bounds. Same as parsed_bounds until load().
var/list/bounds
+ ///any turf in this list is skipped inside of build_coordinate. Lazy assoc list
+ var/list/turf_blacklist
+
// raw strings used to represent regexes more accurately
// '' used to avoid confusing syntax highlighting
- var/static/regex/dmmRegex = new(@'"([a-zA-Z]+)" = \(((?:.|\n)*?)\)\n(?!\t)|\((\d+),(\d+),(\d+)\) = \{"([a-zA-Z\n]*)"\}', "g")
- var/static/regex/trimQuotesRegex = new(@'^[\s\n]+"?|"?[\s\n]+$|^"|"$', "g")
- var/static/regex/trimRegex = new(@'^[\s\n]+|[\s\n]+$', "g")
+ var/static/regex/dmm_regex = new(@'"([a-zA-Z]+)" = (?:\(\n|\()((?:.|\n)*?)\)\n(?!\t)|\((\d+),(\d+),(\d+)\) = \{"([a-zA-Z\n]*)"\}', "g")
+ /// Matches key formats in TMG (IE: newline after the \()
+ var/static/regex/matches_tgm = new(@'^"[A-z]*"[\s]*=[\s]*\([\s]*\n', "m")
+ /// Pulls out key value pairs for TGM
+ var/static/regex/var_edits_tgm = new(@'^\t([A-z]*) = (.*?);?$')
+ /// Pulls out model paths for DMM
+ var/static/regex/model_path = new(@'(\/[^\{]*?(?:\{.*?\})?)(?:,|$)', "g")
+
+ /// If we are currently loading this map
+ var/loading = FALSE
#ifdef TESTING
var/turfsSkipped = 0
#endif
-/// Shortcut function to parse a map and apply it to the world.
-///
-/// - `dmm_file`: A .dmm file to load (Required).
-/// - `x_offset`, `y_offset`, `z_offset`: Positions representign where to load the map (Optional).
-/// - `cropMap`: When true, the map will be cropped to fit the existing world dimensions (Optional).
-/// - `measureOnly`: When true, no changes will be made to the world (Optional).
-/// - `no_changeturf`: When true, [turf/AfterChange] won't be called on loaded turfs
-/// - `x_lower`, `x_upper`, `y_lower`, `y_upper`: Coordinates (relative to the map) to crop to (Optional).
-/// - `placeOnTop`: Whether to use [turf/PlaceOnTop] rather than [turf/ChangeTurf] (Optional).
-/proc/load_map(dmm_file as file, x_offset as num, y_offset as num, z_offset as num, cropMap as num, measureOnly as num, no_changeturf as num, x_lower = -INFINITY as num, x_upper = INFINITY as num, y_lower = -INFINITY as num, y_upper = INFINITY as num, placeOnTop = FALSE as num)
- var/datum/parsed_map/parsed = new(dmm_file, x_lower, x_upper, y_lower, y_upper, measureOnly)
- if(parsed.bounds && !measureOnly)
- parsed.load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop)
- return parsed
+/datum/parsed_map/proc/copy()
+ // Avoids duped work just in case
+ build_cache()
+ var/datum/parsed_map/newfriend = new()
+ newfriend.original_path = original_path
+ newfriend.map_format = map_format
+ newfriend.key_len = key_len
+ newfriend.line_len = line_len
+ newfriend.grid_models = grid_models.Copy()
+ newfriend.gridSets = gridSets.Copy()
+ newfriend.modelCache = modelCache.Copy()
+ newfriend.parsed_bounds = parsed_bounds.Copy()
+ // Copy parsed bounds to reset to initial values
+ newfriend.bounds = parsed_bounds.Copy()
+ newfriend.turf_blacklist = turf_blacklist?.Copy()
+ return newfriend
+
+//text trimming (both directions) helper macro
+#define TRIM_TEXT(text) (trim_reduced(text))
+
+/**
+ * Helper and recommened way to load a map file
+ * - dmm_file: The path to the map file
+ * - x_offset: The x offset to load the map at
+ * - y_offset: The y offset to load the map at
+ * - z_offset: The z offset to load the map at
+ * - crop_map: If true, the map will be cropped to the world bounds
+ * - measure_only: If true, the map will not be loaded, but the bounds will be calculated
+ * - no_changeturf: If true, the map will not call /turf/AfterChange
+ * - x_lower: The minimum x coordinate to load
+ * - x_upper: The maximum x coordinate to load
+ * - y_lower: The minimum y coordinate to load
+ * - y_upper: The maximum y coordinate to load
+ * - z_lower: The minimum z coordinate to load
+ * - z_upper: The maximum z coordinate to load
+ * - place_on_top: Whether to use /turf/proc/PlaceOnTop rather than /turf/proc/ChangeTurf
+ * - new_z: If true, a new z level will be created for the map
+ * - delete: CM/TGMC addition, if we need to manually clear turf contents before spawning stuff
+ */
+/proc/load_map(
+ dmm_file,
+ x_offset = 0,
+ y_offset = 0,
+ z_offset = 0,
+ crop_map = FALSE,
+ measure_only = FALSE,
+ no_changeturf = FALSE,
+ x_lower = -INFINITY,
+ x_upper = INFINITY,
+ y_lower = -INFINITY,
+ y_upper = INFINITY,
+ z_lower = -INFINITY,
+ z_upper = INFINITY,
+ place_on_top = FALSE,
+ new_z = FALSE,
+ delete = FALSE,
+)
+ if(!(dmm_file in GLOB.cached_maps))
+ GLOB.cached_maps[dmm_file] = new /datum/parsed_map(dmm_file)
+
+ var/datum/parsed_map/parsed_map = GLOB.cached_maps[dmm_file]
+ parsed_map = parsed_map.copy()
+ if(!measure_only && !isnull(parsed_map.bounds))
+ parsed_map.load(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z, delete)
+ return parsed_map
/// Parse a map, possibly cropping it.
-/datum/parsed_map/New(tfile, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper=INFINITY, measureOnly=FALSE)
+/datum/parsed_map/New(tfile, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper=INFINITY, z_lower = -INFINITY, z_upper=INFINITY, measureOnly=FALSE)
+ // This proc sleeps for like 6 seconds. why?
+ // Is it file accesses? if so, can those be done ahead of time, async to save on time here? I wonder.
+ // Love ya :)
if(isfile(tfile))
original_path = "[tfile]"
tfile = file2text(tfile)
@@ -56,16 +191,30 @@
// create a new datum without loading a map
return
- bounds = parsed_bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF)
- var/stored_index = 1
+ src.bounds = parsed_bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF)
+
+ if(findtext(tfile, matches_tgm))
+ map_format = MAP_TGM
+ else
+ map_format = MAP_DMM // Fallback
+
+ // lists are structs don't you know :)
+ var/list/bounds = src.bounds
+ var/list/grid_models = src.grid_models
+ var/key_len = src.key_len
+ var/line_len = src.line_len
+ var/stored_index = 1
+ var/list/regexOutput
//multiz lool
- while(dmmRegex.Find(tfile, stored_index))
- stored_index = dmmRegex.next
+ while(dmm_regex.Find(tfile, stored_index))
+ stored_index = dmm_regex.next
+ // Datum var lookup is expensive, this isn't
+ regexOutput = dmm_regex.group
// "aa" = (/type{vars=blah})
- if(dmmRegex.group[1]) // Model
- var/key = dmmRegex.group[1]
+ if(regexOutput[1]) // Model
+ var/key = regexOutput[1]
if(grid_models[key]) // Duplicate model keys are ignored in DMMs
continue
if(key_len != length(key))
@@ -74,328 +223,776 @@
else
CRASH("Inconsistent key length in DMM")
if(!measureOnly)
- grid_models[key] = dmmRegex.group[2]
+ grid_models[key] = regexOutput[2]
// (1,1,1) = {"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}
- else if(dmmRegex.group[3]) // Coords
+ else if(regexOutput[3]) // Coords
if(!key_len)
CRASH("Coords before model definition in DMM")
- var/curr_x = text2num(dmmRegex.group[3])
-
+ var/curr_x = text2num(regexOutput[3])
if(curr_x < x_lower || curr_x > x_upper)
continue
+ var/curr_y = text2num(regexOutput[4])
+ if(curr_y < y_lower || curr_y > y_upper)
+ continue
+
+ var/curr_z = text2num(regexOutput[5])
+ if(curr_z < z_lower || curr_z > z_upper)
+ continue
+
var/datum/grid_set/gridSet = new
gridSet.xcrd = curr_x
- //position of the currently processed square
- gridSet.ycrd = text2num(dmmRegex.group[4])
- gridSet.zcrd = text2num(dmmRegex.group[5])
+ gridSet.ycrd = curr_y
+ gridSet.zcrd = curr_z
- bounds[MAP_MINX] = min(bounds[MAP_MINX], clamp(gridSet.xcrd, x_lower, x_upper))
- bounds[MAP_MINZ] = min(bounds[MAP_MINZ], gridSet.zcrd)
- bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], gridSet.zcrd)
+ bounds[MAP_MINX] = min(bounds[MAP_MINX], curr_x)
+ bounds[MAP_MINZ] = min(bounds[MAP_MINZ], curr_y)
+ bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], curr_z)
- var/list/gridLines = splittext(dmmRegex.group[6], "\n")
+ var/list/gridLines = splittext(regexOutput[6], "\n")
gridSet.gridLines = gridLines
var/leadingBlanks = 0
- while(leadingBlanks < gridLines.len && gridLines[++leadingBlanks] == "")
+ while(leadingBlanks < length(gridLines) && gridLines[++leadingBlanks] == "")
if(leadingBlanks > 1)
gridLines.Cut(1, leadingBlanks) // Remove all leading blank lines.
- if(!gridLines.len) // Skip it if only blank lines exist.
+ if(!length(gridLines)) // Skip it if only blank lines exist.
continue
gridSets += gridSet
- if(gridLines.len && gridLines[gridLines.len] == "")
- gridLines.Cut(gridLines.len) // Remove only one blank line at the end.
+ if(gridLines[length(gridLines)] == "")
+ gridLines.Cut(length(gridLines)) // Remove only one blank line at the end.
+
+ bounds[MAP_MINY] = min(bounds[MAP_MINY], gridSet.ycrd)
+ gridSet.ycrd += length(gridLines) - 1 // Start at the top and work down
+ bounds[MAP_MAXY] = max(bounds[MAP_MAXY], gridSet.ycrd)
- bounds[MAP_MINY] = min(bounds[MAP_MINY], clamp(gridSet.ycrd, y_lower, y_upper))
- gridSet.ycrd += gridLines.len - 1 // Start at the top and work down
- bounds[MAP_MAXY] = max(bounds[MAP_MAXY], clamp(gridSet.ycrd, y_lower, y_upper))
+ if(!line_len)
+ line_len = length(gridLines[1])
- var/maxx = gridSet.xcrd
- if(gridLines.len) //Not an empty map
- maxx = max(maxx, gridSet.xcrd + length(gridLines[1]) / key_len - 1)
+ var/maxx = curr_x
+ if(length(gridLines)) //Not an empty map
+ maxx = max(maxx, curr_x + line_len / key_len - 1)
- bounds[MAP_MAXX] = clamp(max(bounds[MAP_MAXX], maxx), x_lower, x_upper)
+ bounds[MAP_MAXX] = max(bounds[MAP_MAXX], maxx)
CHECK_TICK
// Indicate failure to parse any coordinates by nulling bounds
if(bounds[1] == 1.#INF)
- bounds = null
- parsed_bounds = bounds
+ src.bounds = null
+ else
+ // Clamp all our mins and maxes down to the proscribed limits
+ bounds[MAP_MINX] = clamp(bounds[MAP_MINX], x_lower, x_upper)
+ bounds[MAP_MAXX] = clamp(bounds[MAP_MAXX], x_lower, x_upper)
+ bounds[MAP_MINY] = clamp(bounds[MAP_MINY], y_lower, y_upper)
+ bounds[MAP_MAXY] = clamp(bounds[MAP_MAXY], y_lower, y_upper)
+ bounds[MAP_MINZ] = clamp(bounds[MAP_MINZ], z_lower, z_upper)
+ bounds[MAP_MAXZ] = clamp(bounds[MAP_MAXZ], z_lower, z_upper)
+
+ parsed_bounds = src.bounds
+ src.key_len = key_len
+ src.line_len = line_len
+
+/// Iterates over all grid sets and returns ones with z values within the given bounds. Inclusive
+/datum/parsed_map/proc/filter_grid_sets_based_on_z_bounds(lower_z, upper_z)
+ var/list/filtered_sets = list()
+ for(var/datum/grid_set/grid_set as anything in gridSets)
+ if(grid_set.zcrd < lower_z)
+ continue
+ if(grid_set.zcrd > upper_z)
+ continue
+ filtered_sets += grid_set
+ return filtered_sets
-/// Load the parsed map into the world. See [/proc/load_map] for arguments.
-/datum/parsed_map/proc/load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, delete)
+/// Load the parsed map into the world. You probably want [/proc/load_map]. Keep the signature the same.
+/datum/parsed_map/proc/load(x_offset = 0, y_offset = 0, z_offset = 0, crop_map = FALSE, no_changeturf = FALSE, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper = INFINITY, z_lower = -INFINITY, z_upper = INFINITY, place_on_top = FALSE, new_z = FALSE, delete = FALSE)
//How I wish for RAII
Master.StartLoadingMap()
- . = _load_impl(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, delete)
+ . = _load_impl(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z, delete)
Master.StopLoadingMap()
+#define MAPLOADING_CHECK_TICK \
+ if(TICK_CHECK) { \
+ if(loading) { \
+ SSatoms.map_loader_stop(REF(src)); \
+ stoplag(); \
+ SSatoms.map_loader_begin(REF(src)); \
+ } else { \
+ stoplag(); \
+ } \
+ }
+
// Do not call except via load() above.
-/datum/parsed_map/proc/_load_impl(x_offset = 1, y_offset = 1, z_offset = world.maxz + 1, cropMap = FALSE, no_changeturf = FALSE, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper = INFINITY, placeOnTop = FALSE, delete = FALSE)
- var/list/areaCache = list()
+/datum/parsed_map/proc/_load_impl(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z, delete)
+ PRIVATE_PROC(TRUE)
+ // Tell ss atoms that we're doing maploading
+ // We'll have to account for this in the following tick_checks so it doesn't overflow
+ loading = TRUE
+ SSatoms.map_loader_begin(REF(src))
+
+ // Loading used to be done in this proc
+ // We make the assumption that if the inner procs runtime, we WANT to do cleanup on them, but we should stil tell our parents we failed
+ // Since well, we did
+ var/sucessful = FALSE
+ switch(map_format)
+ if(MAP_TGM)
+ sucessful = _tgm_load(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z, delete)
+ else
+ sucessful = _dmm_load(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z, delete)
+
+ // And we are done lads, call it off
+ SSatoms.map_loader_stop(REF(src))
+ loading = FALSE
+
+ // CM: Disabled due to not using contained_turfs and SSarea_contents
+// if(new_z)
+// for(var/z_index in bounds[MAP_MINZ] to bounds[MAP_MAXZ])
+// SSmapping.build_area_turfs(z_index)
+
+ if(!no_changeturf)
+ var/list/turfs = block(
+ locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]),
+ locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ]))
+ for(var/turf/T as anything in turfs)
+ //we do this after we load everything in. if we don't, we'll have weird atmos bugs regarding atmos adjacent turfs
+ T.AfterChange(CHANGETURF_IGNORE_AIR)
+
+ if(expanded_x || expanded_y)
+ SEND_GLOBAL_SIGNAL(COMSIG_GLOB_EXPANDED_WORLD_BOUNDS, expanded_x, expanded_y)
+
+ #ifdef TESTING
+ if(turfsSkipped)
+ testing("Skipped loading [turfsSkipped] default turfs")
+ #endif
+
+ return sucessful
+
+// Wanna clear something up about maps, talking in 255x255 here
+// In the tgm format, each gridset contains 255 lines, each line representing one tile, with 255 total gridsets
+// In the dmm format, each gridset contains 255 lines, each line representing one row of tiles, containing 255 * line length characters, with one gridset per z
+// You can think of dmm as storing maps in rows, whereas tgm stores them in columns
+/datum/parsed_map/proc/_tgm_load(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z, delete)
+ // setup
var/list/modelCache = build_cache(no_changeturf)
var/space_key = modelCache[SPACE_KEY]
var/list/bounds
src.bounds = bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF)
- for(var/I in gridSets)
- var/datum/grid_set/gset = I
- var/ycrd = gset.ycrd + y_offset - 1
- var/zcrd = gset.zcrd + z_offset - 1
- if(!cropMap && ycrd > world.maxy)
- world.maxy = ycrd // Expand Y here. X is expanded in the loop below
+ // Building y coordinate ranges
+ var/y_relative_to_absolute = y_offset - 1
+ var/x_relative_to_absolute = x_offset - 1
+
+ // Ok so like. something important
+ // We talk in "relative" coords here, so the coordinate system of the map datum
+ // This is so we can do offsets, but it is NOT the same as positions in game
+ // That's why there's some uses of - y_relative_to_absolute here, to turn absolute positions into relative ones
+ // TGM maps process in columns, so the starting y will always be the max size
+ // We know y starts at 1
+ var/datum/grid_set/first_column = gridSets[1]
+ var/relative_y = first_column.ycrd
+ var/highest_y = relative_y + y_relative_to_absolute
+
+ if(!crop_map && highest_y > world.maxy)
+ if(new_z)
+ // Need to avoid improperly loaded area/turf_contents
+ world.increase_max_y(highest_y, map_load_z_cutoff = z_offset - 1)
+ else
+ world.increase_max_y(highest_y)
+ expanded_y = TRUE
+
+ // Skip Y coords that are above the smallest of the three params
+ // So maxy and y_upper get to act as thresholds, and relative_y can play
+ var/y_skip_above = min(world.maxy - y_relative_to_absolute, y_upper, relative_y)
+ // How many lines to skip because they'd be above the y cuttoff line
+ var/y_starting_skip = relative_y - y_skip_above
+ highest_y -= y_starting_skip
+
+ // Y is the LOWEST it will ever be here, so we can easily set a threshold for how low to go
+ var/line_count = length(first_column.gridLines)
+ var/lowest_y = relative_y - (line_count - 1) // -1 because we decrement at the end of the loop, not the start
+ var/y_ending_skip = max(max(y_lower, 1 - y_relative_to_absolute) - lowest_y, 0)
+
+ // X setup
+ var/x_delta_with = x_upper
+ if(crop_map)
+ // Take our smaller crop threshold yes?
+ x_delta_with = min(x_delta_with, world.maxx)
+
+ // We're gonna skip all the entries above the upper x, or maxx if cropMap is set
+ // The last column is guarenteed to have the highest x value we;ll encounter
+ // Even if z scales, this still works
+ var/datum/grid_set/last_column = gridSets[length(gridSets)]
+ var/final_x = last_column.xcrd + x_relative_to_absolute
+
+ if(final_x > x_delta_with)
+ // If our relative x is greater then X upper, well then we've gotta limit our expansion
+ var/delta = max(final_x - x_delta_with, 0)
+ final_x -= delta
+ if(final_x > world.maxx && !crop_map)
+ if(new_z)
+ // Need to avoid improperly loaded area/turf_contents
+ world.increase_max_x(final_x, map_load_z_cutoff = z_offset - 1)
+ else
+ world.increase_max_x(final_x)
+ expanded_x = TRUE
+
+ var/lowest_x = max(x_lower, 1 - x_relative_to_absolute)
+
+ // Amount we offset the grid zcrd to get the true zcrd
+ var/grid_z_offset = z_offset - 1
+ var/z_upper_set = z_upper < INFINITY
+ var/z_lower_set = z_lower > -INFINITY
+
+ // We make the assumption that the last block of turfs will have the highest embedded z in it
+ // true max zcrd
+ var/map_bounds_z_max = last_column.zcrd
+ var/z_upper_parsed = map_bounds_z_max + z_offset - 1
+ if(z_upper_set)
+ z_upper_parsed -= map_bounds_z_max - z_upper
+ if(z_lower_set)
+ var/offset_amount = z_lower - 1
+ z_upper_parsed -= offset_amount
+ grid_z_offset -= offset_amount
+
+ var/list/target_grid_sets = gridSets
+ if(z_lower_set || z_upper_set) // bounds are set, filter out gridsets for z levels we don't want
+ target_grid_sets = filter_grid_sets_based_on_z_bounds(z_lower, z_upper)
+
+ var/z_threshold = world.maxz
+ if(z_upper_parsed > z_threshold && crop_map)
+ for(var/i in z_threshold + 1 to z_upper_parsed) //create a new z_level if needed
+ world.incrementMaxZ()
+ if(!no_changeturf)
+ WARNING("Z-level expansion occurred without no_changeturf set, this may cause problems when /turf/AfterChange is called")
+
+ for(var/datum/grid_set/gset as anything in target_grid_sets)
+ var/true_xcrd = gset.xcrd + x_relative_to_absolute
+
+ // any cutoff of x means we just shouldn't iterate this gridset
+ if(final_x < true_xcrd || lowest_x > gset.xcrd)
+ continue
+
+ var/zcrd = gset.zcrd + grid_z_offset
+ // If we're using changeturf, we disable it if we load into a z level we JUST created
+ var/no_afterchange = no_changeturf || zcrd > z_threshold
+
+ // We're gonna track the first and last pairs of coords we find
+ // Since x is always incremented in steps of 1, we only need to deal in y
+ // The first x is guarenteed to be the lowest, the first y the highest, and vis versa
+ // This is faster then doing mins and maxes inside the hot loop below
+ var/first_found = FALSE
+ var/first_y = 0
+ var/last_y = 0
+
+ var/ycrd = highest_y
+ // Everything following this line is VERY hot.
+ for(var/i in 1 + y_starting_skip to line_count - y_ending_skip)
+ if(gset.gridLines[i] == space_key && no_afterchange)
+ #ifdef TESTING
+ ++turfsSkipped
+ #endif
+ ycrd--
+ MAPLOADING_CHECK_TICK
+ continue
+
+ var/list/cache = modelCache[gset.gridLines[i]]
+ if(!cache)
+ SSatoms.map_loader_stop(REF(src))
+ CRASH("Undefined model key in DMM: [gset.gridLines[i]]")
+ build_coordinate(cache, locate(true_xcrd, ycrd, zcrd), no_afterchange, place_on_top, new_z, delete)
+
+ // only bother with bounds that actually exist
+ if(!first_found)
+ first_found = TRUE
+ first_y = ycrd
+ last_y = ycrd
+ ycrd--
+ MAPLOADING_CHECK_TICK
+
+ // The x coord never changes, so not tracking first x is safe
+ // If no ycrd is found, we assume this row is totally empty and just continue on
+ if(first_found)
+ bounds[MAP_MINX] = min(bounds[MAP_MINX], true_xcrd)
+ bounds[MAP_MINY] = min(bounds[MAP_MINY], last_y)
+ bounds[MAP_MINZ] = min(bounds[MAP_MINZ], zcrd)
+ bounds[MAP_MAXX] = max(bounds[MAP_MAXX], true_xcrd)
+ bounds[MAP_MAXY] = max(bounds[MAP_MAXY], first_y)
+ bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], zcrd)
+ return TRUE
+
+/// Stanrdard loading, not used in production
+/// Doesn't take advantage of any tgm optimizations, which makes it slower but also more general
+/// Use this if for some reason your map format is messy
+/datum/parsed_map/proc/_dmm_load(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z, delete)
+ // setup
+ var/list/modelCache = build_cache(no_changeturf)
+ var/space_key = modelCache[SPACE_KEY]
+ var/list/bounds
+ var/key_len = src.key_len
+ src.bounds = bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF)
+
+ var/y_relative_to_absolute = y_offset - 1
+ var/x_relative_to_absolute = x_offset - 1
+ var/line_len = src.line_len
+
+ // Amount we offset the grid zcrd to get the true zcrd
+ var/grid_z_offset = z_offset - 1
+ var/z_upper_set = z_upper < INFINITY
+ var/z_lower_set = z_lower > -INFINITY
+
+ // we now need to find the maximum z, fun!
+ var/map_bounds_z_max = 1
+ for(var/datum/grid_set/grid_set as anything in gridSets)
+ map_bounds_z_max = max(map_bounds_z_max, grid_set.zcrd)
+
+ var/z_upper_parsed = map_bounds_z_max + z_offset - 1
+ if(z_upper_set)
+ z_upper_parsed -= map_bounds_z_max - z_upper
+ if(z_lower_set)
+ var/offset_amount = z_lower - 1
+ z_upper_parsed -= offset_amount
+ grid_z_offset -= offset_amount
+
+ var/list/target_grid_sets = gridSets
+ if(z_lower_set || z_upper_set) // bounds are set, filter out gridsets for z levels we don't want
+ target_grid_sets = filter_grid_sets_based_on_z_bounds(z_lower, z_upper)
+
+ for(var/datum/grid_set/gset as anything in target_grid_sets)
+ var/relative_x = gset.xcrd
+ var/relative_y = gset.ycrd
+ var/true_xcrd = relative_x + x_relative_to_absolute
+ var/ycrd = relative_y + y_relative_to_absolute
+ var/zcrd = gset.zcrd + grid_z_offset
+ if(!crop_map && ycrd > world.maxy)
+ if(new_z)
+ // Need to avoid improperly loaded area/turf_contents
+ world.increase_max_y(ycrd, map_load_z_cutoff = z_offset - 1)
+ else
+ world.increase_max_y(ycrd)
+ expanded_y = TRUE
var/zexpansion = zcrd > world.maxz
+ var/no_afterchange = no_changeturf
if(zexpansion)
- if(cropMap)
+ if(crop_map)
continue
else
while (zcrd > world.maxz) //create a new z_level if needed
world.incrementMaxZ()
if(!no_changeturf)
WARNING("Z-level expansion occurred without no_changeturf set, this may cause problems when /turf/AfterChange is called")
-
- for(var/line in gset.gridLines)
- if((ycrd - y_offset + 1) < y_lower || (ycrd - y_offset + 1) > y_upper) //Reverse operation and check if it is out of bounds of cropping.
- --ycrd
- continue
- if(ycrd <= world.maxy && ycrd >= 1)
- var/xcrd = gset.xcrd + x_offset - 1
- for(var/tpos = 1 to length(line) - key_len + 1 step key_len)
- if((xcrd - x_offset + 1) < x_lower || (xcrd - x_offset + 1) > x_upper) //Same as above.
- ++xcrd
- continue //X cropping.
- if(xcrd > world.maxx)
- if(cropMap)
- break
- else
- world.maxx = xcrd
-
- if(xcrd >= 1)
- var/model_key = copytext(line, tpos, tpos + key_len)
- var/no_afterchange = no_changeturf || zexpansion
- if(!no_afterchange || (model_key != space_key))
- var/list/cache = modelCache[model_key]
- if(!cache)
- CRASH("Undefined model key in DMM: [model_key]")
- build_coordinate(areaCache, cache, locate(xcrd, ycrd, zcrd), no_afterchange, placeOnTop, delete)
-
- // only bother with bounds that actually exist
- bounds[MAP_MINX] = min(bounds[MAP_MINX], xcrd)
- bounds[MAP_MINY] = min(bounds[MAP_MINY], ycrd)
- bounds[MAP_MINZ] = min(bounds[MAP_MINZ], zcrd)
- bounds[MAP_MAXX] = max(bounds[MAP_MAXX], xcrd)
- bounds[MAP_MAXY] = max(bounds[MAP_MAXY], ycrd)
- bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], zcrd)
- #ifdef TESTING
- else
- ++turfsSkipped
- #endif
- CHECK_TICK
+ no_afterchange = TRUE
+ // Ok so like. something important
+ // We talk in "relative" coords here, so the coordinate system of the map datum
+ // This is so we can do offsets, but it is NOT the same as positions in game
+ // That's why there's some uses of - y_relative_to_absolute here, to turn absolute positions into relative ones
+
+ // Skip Y coords that are above the smallest of the three params
+ // So maxy and y_upper get to act as thresholds, and relative_y can play
+ var/y_skip_above = min(world.maxy - y_relative_to_absolute, y_upper, relative_y)
+ // How many lines to skip because they'd be above the y cuttoff line
+ var/y_starting_skip = relative_y - y_skip_above
+ ycrd += y_starting_skip
+
+ // Y is the LOWEST it will ever be here, so we can easily set a threshold for how low to go
+ var/line_count = length(gset.gridLines)
+ var/lowest_y = relative_y - (line_count - 1) // -1 because we decrement at the end of the loop, not the start
+ var/y_ending_skip = max(max(y_lower, 1 - y_relative_to_absolute) - lowest_y, 0)
+
+ // Now we're gonna precompute the x thresholds
+ // We skip all the entries below the lower x, or 1
+ var/starting_x_delta = max(max(x_lower, 1 - x_relative_to_absolute) - relative_x, 0)
+ // The x loop counts by key length, so we gotta multiply here
+ var/x_starting_skip = starting_x_delta * key_len
+ true_xcrd += starting_x_delta
+
+ // We're gonna skip all the entries above the upper x, or maxx if cropMap is set
+ var/x_target = line_len - key_len + 1
+ var/x_step_count = ROUND_UP(x_target / key_len)
+ var/final_x = relative_x + (x_step_count - 1)
+ var/x_delta_with = x_upper
+ if(crop_map)
+ // Take our smaller crop threshold yes?
+ x_delta_with = min(x_delta_with, world.maxx)
+ if(final_x > x_delta_with)
+ // If our relative x is greater then X upper, well then we've gotta limit our expansion
+ var/delta = max(final_x - x_delta_with, 0)
+ x_step_count -= delta
+ final_x -= delta
+ x_target = x_step_count * key_len
+ if(final_x > world.maxx && !crop_map)
+ if(new_z)
+ // Need to avoid improperly loaded area/turf_contents
+ world.increase_max_x(final_x, map_load_z_cutoff = z_offset - 1)
+ else
+ world.increase_max_x(final_x)
+ expanded_x = TRUE
+
+ // We're gonna track the first and last pairs of coords we find
+ // The first x is guarenteed to be the lowest, the first y the highest, and vis versa
+ // This is faster then doing mins and maxes inside the hot loop below
+ var/first_found = FALSE
+ var/first_x = 0
+ var/first_y = 0
+ var/last_x = 0
+ var/last_y = 0
+
+ // Everything following this line is VERY hot. How hot depends on the map format
+ // (Yes this does mean dmm is technically faster to parse. shut up)
+ for(var/i in 1 + y_starting_skip to line_count - y_ending_skip)
+ var/line = gset.gridLines[i]
+
+ var/xcrd = true_xcrd
+ for(var/tpos in 1 + x_starting_skip to x_target step key_len)
+ var/model_key = copytext(line, tpos, tpos + key_len)
+ if(model_key == space_key && no_afterchange)
+ #ifdef TESTING
+ ++turfsSkipped
+ #endif
+ MAPLOADING_CHECK_TICK
++xcrd
- --ycrd
-
- CHECK_TICK
+ continue
+ var/list/cache = modelCache[model_key]
+ if(!cache)
+ SSatoms.map_loader_stop(REF(src))
+ CRASH("Undefined model key in DMM: [model_key]")
+ build_coordinate(cache, locate(xcrd, ycrd, zcrd), no_afterchange, place_on_top, new_z, delete)
+
+ // only bother with bounds that actually exist
+ if(!first_found)
+ first_found = TRUE
+ first_x = xcrd
+ first_y = ycrd
+ last_x = xcrd
+ last_y = ycrd
+ MAPLOADING_CHECK_TICK
+ ++xcrd
+ ycrd--
+ MAPLOADING_CHECK_TICK
+ bounds[MAP_MINX] = min(bounds[MAP_MINX], first_x)
+ bounds[MAP_MINY] = min(bounds[MAP_MINY], last_y)
+ bounds[MAP_MINZ] = min(bounds[MAP_MINZ], zcrd)
+ bounds[MAP_MAXX] = max(bounds[MAP_MAXX], last_x)
+ bounds[MAP_MAXY] = max(bounds[MAP_MAXY], first_y)
+ bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], zcrd)
- //if(!no_changeturf)// mapping TODO:
- // for(var/t in block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ])))
- // var/turf/T = t
- // //we do this after we load everything in. if we don't; we'll have weird atmos bugs regarding atmos adjacent turfs
- // T.AfterChange(CHANGETURF_IGNORE_AIR)
+ return TRUE
- #ifdef TESTING
- if(turfsSkipped)
- testing("Skipped loading [turfsSkipped] default turfs")
- #endif
+GLOBAL_LIST_EMPTY(map_model_default)
- return TRUE
+/datum/parsed_map/proc/build_cache(no_changeturf, bad_paths)
+ if(map_format == MAP_TGM)
+ return tgm_build_cache(no_changeturf, bad_paths)
+ return dmm_build_cache(no_changeturf, bad_paths)
-/datum/parsed_map/proc/build_cache(no_changeturf, bad_paths=null)
+/datum/parsed_map/proc/tgm_build_cache(no_changeturf, bad_paths=null)
if(modelCache && !bad_paths)
return modelCache
. = modelCache = list()
var/list/grid_models = src.grid_models
+ var/set_space = FALSE
+ // Use where a list is needed, but where it will not be modified
+ // Used here to remove the cost of needing to make a new list for each fields entry when it's set manually later
+ var/static/list/default_list = GLOB.map_model_default // It's stupid, but it saves += list(list)
+ var/static/list/wrapped_default_list = list(default_list) // It's stupid, but it saves += list(list)
+ var/static/regex/var_edits = var_edits_tgm
+
+ var/path_to_init = ""
+ // Reference to the attributes list we're currently filling, if any
+ var/list/current_attributes
+ // If we are currently editing a path or not
+ var/editing = FALSE
for(var/model_key in grid_models)
- var/model = grid_models[model_key]
- var/list/members = list() //will contain all members (paths) in model (in our example : /turf/unsimulated/wall and /area/mine/explored)
- var/list/members_attributes = list() //will contain lists filled with corresponding variables, if any (in our example : list(icon_state = "rock") and list())
+ // We're going to split models by newline
+ // This guarentees that each entry will be of interest to us
+ // Then we'll process them step by step
+ // Hopefully this reduces the cost from read_list that we'd otherwise have
+ var/list/lines = splittext(grid_models[model_key], "\n")
+ // Builds list of path/edits for later
+ // Of note: we cannot preallocate them to save time in list expansion later
+ // But fortunately lists allocate at least 8 entries normally anyway, and
+ // We are unlikely to have more then that many members
+ //will contain all members (paths) in model (in our example : /turf/unsimulated/wall)
+ var/list/members = list()
+ //will contain lists filled with corresponding variables, if any (in our example : list(icon_state = "rock") and list())
+ var/list/members_attributes = list()
/////////////////////////////////////////////////////////
//Constructing members and corresponding variables lists
////////////////////////////////////////////////////////
+ // string representation of the path to init
+ for(var/line in lines)
+ // We do this here to avoid needing to check at each return statement
+ // No harm in it anyway
+ MAPLOADING_CHECK_TICK
+
+ switch(line[length(line)])
+ if(";") // Var edit, we'll apply it
+ // Var edits look like \tname = value;
+ // I'm gonna try capturing them with regex, since it ought to be the fastest here
+ // Should hand back key = value
+ var_edits.Find(line)
+ var/value = parse_constant(var_edits.group[2])
+ if(istext(value))
+ value = apply_text_macros(value)
+ current_attributes[var_edits.group[1]] = value
+ continue // Keep on keeping on brother
+ if("{") // Start of an edit, and so also the start of a path
+ editing = TRUE
+ current_attributes = list() // Init the list we'll be filling
+ members_attributes += list(current_attributes)
+ path_to_init = copytext(line, 1, -1)
+ if(",") // Either the end of a path, or the end of an edit
+ if(editing) // it was the end of a path
+ editing = FALSE
+ continue
+ members_attributes += wrapped_default_list // We know this is a path, and we also know it has no vv's. so we'll just set this to the default list
+ // Drop the last char mind
+ path_to_init = copytext(line, 1, -1)
+ if("}") // Gotta be the end of an area edit, let's check to be sure
+ if(editing) // it was the end of an area edit (shouldn't do those anyhow)
+ editing = FALSE
+ continue
+ stack_trace("ended a line on JUST a }, with no ongoing edit. What? Area shit?")
+ else // If we're editing, this is a var edit entry. the last one in a stack, cause god hates me. Otherwise, it's an area
+ if(editing) // I want inline I want inline I want inline
+ // Var edits look like \tname = value;
+ // I'm gonna try capturing them with regex, since it ought to be the fastest here
+ // Should hand back key = value
+ var_edits.Find(line)
+ var/value = parse_constant(var_edits.group[2])
+ if(istext(value))
+ value = apply_text_macros(value)
+ current_attributes[var_edits.group[1]] = value
+ continue // Keep on keeping on brother
- var/index = 1
- var/old_position = 1
- var/dpos
+ members_attributes += wrapped_default_list // We know this is a path, and we also know it has no vv's. so we'll just set this to the default list
+ path_to_init = line
- while(dpos != 0)
- //finding next member (e.g /turf/unsimulated/wall{icon_state = "rock"} or /area/mine/explored)
- dpos = find_next_delimiter_position(model, old_position, ",", "{", "}") //find next delimiter (comma here) that's not within {...}
- var/full_def = trim_text(copytext(model, old_position, dpos)) //full definition, e.g : /obj/foo/bar{variables=derp}
- var/variables_start = findtext(full_def, "{")
- var/path_text = trim_text(copytext(full_def, 1, variables_start))
+ // Alright, if we've gotten to this point, our string is a path
+ // Oh and we don't trim it, because we require no padding for these
+ // Saves like 1.5 deciseconds
+ var/atom_def = text2path(path_to_init) //path definition, e.g /obj/foo/bar
+
+ if(!ispath(atom_def, /atom)) // Skip the item if the path does not exist. Fix your crap, mappers!
+ if(bad_paths)
+ // Rare case, avoid the var to save time most of the time
+ LAZYOR(bad_paths[copytext(line, 1, -1)], model_key)
+ continue
+ // Index is already incremented either way, just gotta set the path and all
+ members += atom_def
+
+ //check and see if we can just skip this turf
+ //So you don't have to understand this horrid statement, we can do this if
+ // 1. the space_key isn't set yet
+ // 2. no_changeturf is set
+ // 3. there are exactly 2 members
+ // 4. with no attributes
+ // 5. and the members are world.turf and world.area
+ // Basically, if we find an entry like this: "XXX" = (/turf/default, /area/default)
+ // We can skip calling this proc every time we see XXX
+ if(!set_space \
+ && no_changeturf \
+ && members_attributes.len == 2 \
+ && members.len == 2 \
+ && members_attributes[1] == default_list \
+ && members_attributes[2] == default_list \
+ && members[2] == world.area \
+ && members[1] == world.turf
+ )
+ set_space = TRUE
+ .[SPACE_KEY] = model_key
+ continue
+
+ .[model_key] = list(members, members_attributes)
+ return .
+
+/// Builds key caches for general formats
+/// Slower then the proc above, tho it could still be optimized slightly. it's just not a priority
+/// Since we don't run DMM maps, ever.
+/datum/parsed_map/proc/dmm_build_cache(no_changeturf, bad_paths=null)
+ if(modelCache && !bad_paths)
+ return modelCache
+ . = modelCache = list()
+ var/list/grid_models = src.grid_models
+ var/set_space = FALSE
+ // Use where a list is needed, but where it will not be modified
+ // Used here to remove the cost of needing to make a new list for each fields entry when it's set manually later
+ var/static/list/default_list = list(GLOB.map_model_default)
+ for(var/model_key in grid_models)
+ //will contain all members (paths) in model (in our example : /turf/unsimulated/wall)
+ var/list/members = list()
+ //will contain lists filled with corresponding variables, if any (in our example : list(icon_state = "rock") and list())
+ var/list/members_attributes = list()
+
+ var/model = grid_models[model_key]
+ /////////////////////////////////////////////////////////
+ //Constructing members and corresponding variables lists
+ ////////////////////////////////////////////////////////
+
+ var/model_index = 1
+ while(model_path.Find(model, model_index))
+ var/variables_start = 0
+ var/member_string = model_path.group[1]
+ model_index = model_path.next
+ //findtext is a bit expensive, lets only do this if the last char of our string is a } (IE: we know we have vars)
+ //this saves about 25 miliseconds on my machine. Not a major optimization
+ if(member_string[length(member_string)] == "}")
+ variables_start = findtext(member_string, "{")
+
+ var/path_text = TRIM_TEXT(copytext(member_string, 1, variables_start))
var/atom_def = text2path(path_text) //path definition, e.g /obj/foo/bar
- if(dpos)
- old_position = dpos + length(model[dpos])
if(!ispath(atom_def, /atom)) // Skip the item if the path does not exist. Fix your crap, mappers!
if(bad_paths)
LAZYOR(bad_paths[path_text], model_key)
continue
- members.Add(atom_def)
+ members += atom_def
//transform the variables in text format into a list (e.g {var1="derp"; var2; var3=7} => list(var1="derp", var2, var3=7))
- var/list/fields = list()
-
+ // OF NOTE: this could be made faster by replacing readlist with a progressive regex
+ // I'm just too much of a bum to do it rn, especially since we mandate tgm format for any maps in repo
+ var/list/fields = default_list
if(variables_start)//if there's any variable
- full_def = copytext(full_def, variables_start + length(full_def[variables_start]), -length(copytext_char(full_def, -1))) //removing the last '}'
- fields = readlist(full_def, ";")
- if(fields.len)
- if(!trim(fields[fields.len]))
- --fields.len
- for(var/I in fields)
- var/value = fields[I]
- if(istext(value))
- fields[I] = apply_text_macros(value)
+ member_string = copytext(member_string, variables_start + length(member_string[variables_start]), -length(copytext_char(member_string, -1))) //removing the last '}'
+ fields = list(readlist(member_string, ";"))
+ for(var/I in fields)
+ var/value = fields[I]
+ if(istext(value))
+ fields[I] = apply_text_macros(value)
//then fill the members_attributes list with the corresponding variables
- members_attributes.len++
- members_attributes[index++] = fields
-
- CHECK_TICK
+ members_attributes += fields
+ MAPLOADING_CHECK_TICK
//check and see if we can just skip this turf
//So you don't have to understand this horrid statement, we can do this if
- // 1. no_changeturf is set
- // 2. the space_key isn't set yet
+ // 1. the space_key isn't set yet
+ // 2. no_changeturf is set
// 3. there are exactly 2 members
// 4. with no attributes
// 5. and the members are world.turf and world.area
// Basically, if we find an entry like this: "XXX" = (/turf/default, /area/default)
// We can skip calling this proc every time we see XXX
- if(no_changeturf \
- && !(.[SPACE_KEY]) \
+ if(!set_space \
+ && no_changeturf \
&& members.len == 2 \
&& members_attributes.len == 2 \
&& length(members_attributes[1]) == 0 \
&& length(members_attributes[2]) == 0 \
&& (world.area in members) \
&& (world.turf in members))
-
+ set_space = TRUE
.[SPACE_KEY] = model_key
continue
-
.[model_key] = list(members, members_attributes)
+ return .
-/datum/parsed_map/proc/build_coordinate(list/areaCache, list/model, turf/crds, no_changeturf as num, placeOnTop as num, delete)
+/datum/parsed_map/proc/build_coordinate(list/model, turf/crds, no_changeturf as num, placeOnTop as num, new_z, delete)
+ // If we don't have a turf, nothing we will do next will actually acomplish anything, so just go back
+ // Note, this would actually drop area vvs in the tile, but like, why tho
+ if(!crds)
+ return
var/index
var/list/members = model[1]
var/list/members_attributes = model[2]
+ // We use static lists here because it's cheaper then passing them around
+ var/static/list/default_list = GLOB.map_model_default
////////////////
//Instanciation
////////////////
+ if(turf_blacklist?[crds])
+ return
+
//The next part of the code assumes there's ALWAYS an /area AND a /turf on a given tile
//first instance the /area and remove it from the members list
index = members.len
+ var/area/old_area
if(members[index] != /area/template_noop)
- var/atype = members[index]
- GLOB._preloader.setup(members_attributes[index], atype)//preloader for assigning set variables on atom creation
- var/atom/instance = areaCache[atype]
- if(!instance)
- instance = GLOB.areas_by_type[atype]
- if(!instance)
- instance = new atype(null)
- areaCache[atype] = instance
- if(crds)
- instance.contents.Add(crds)
-
- if(GLOB.use_preloader && instance)
- GLOB._preloader.load(instance)
-
- //then instance the /turf and, if multiple tiles are presents, simulates the DMM underlays piling effect
-
- var/first_turf_index = 1
- while(!ispath(members[first_turf_index], /turf)) //find first /turf object in members
- first_turf_index++
-
- //turn off base new Initialization until the whole thing is loaded
- SSatoms.map_loader_begin()
- //instanciate the first /turf
- var/turf/T
- if(members[first_turf_index] != /turf/template_noop)
- T = instance_atom(members[first_turf_index], members_attributes[first_turf_index], crds,no_changeturf, placeOnTop, delete)
-
- if(T)
- //if others /turf are presents, simulates the underlays piling effect
- index = first_turf_index + 1
- while(index <= members.len - 1) // Last item is an /area
- var/underlay = T.appearance
- T = instance_atom(members[index], members_attributes[index], crds,no_changeturf, placeOnTop, delete)//instance new turf
- T.underlays += underlay
- index++
+ if(members_attributes[index] != default_list)
+ world.preloader_setup(members_attributes[index], members[index])//preloader for assigning set variables on atom creation
+ var/area/area_instance = loaded_areas[members[index]]
+ if(!area_instance)
+ var/area_type = members[index]
+ // If this parsed map doesn't have that area already, we check the global cache
+ area_instance = GLOB.areas_by_type[area_type]
+ // If the global list DOESN'T have this area it's either not a unique area, or it just hasn't been created yet
+ if (!area_instance)
+ area_instance = new area_type(null)
+ if(!area_instance)
+ CRASH("[area_type] failed to be new'd, what'd you do?")
+ loaded_areas[area_type] = area_instance
+
+ if(!new_z)
+ old_area = crds.loc
+// old_area.turfs_to_uncontain += crds
+// area_instance.contained_turfs.Add(crds)
+ area_instance.contents.Add(crds)
+
+ if(GLOB.use_preloader)
+ world.preloader_load(area_instance)
+
+ // Index right before /area is /turf
+ index--
+ var/atom/instance
+ //then instance the /turf
+ //NOTE: this used to place any turfs before the last "underneath" it using .appearance and underlays
+ //We don't actually use this, and all it did was cost cpu, so we don't do this anymore
+ if(members[index] != /turf/template_noop)
+ if(members_attributes[index] != default_list)
+ world.preloader_setup(members_attributes[index], members[index])
+
+ // CM/TGMC addition: delete map contents before inserting if delete truthy
+ if(delete)
+ for(var/atom/turf_atom as anything in crds.GetAllTurfStrictContents())
+ if(isobserver(turf_atom))
+ continue
+ qdel(turf_atom, force = TRUE)
+
+ // Note: we make the assertion that the last path WILL be a turf. if it isn't, this will fail.
+ if(placeOnTop)
+ instance = crds.load_on_top(members[index], CHANGETURF_DEFER_CHANGE | (no_changeturf ? CHANGETURF_SKIP : NONE))
+ else if(no_changeturf)
+ instance = create_atom(members[index], crds)//first preloader pass
+ else
+ instance = crds.ChangeTurf(members[index], null, CHANGETURF_DEFER_CHANGE)
+
+ if(GLOB.use_preloader && instance)//second preloader pass, for those atoms that don't ..() in New()
+ world.preloader_load(instance)
+ // If this isn't template work, we didn't change our turf and we changed area, then we've gotta handle area lighting transfer
+ else if(!no_changeturf && old_area)
+ // Don't do contain/uncontain stuff, this happens a few lines up when the area actally changes
+ crds.on_change_area(old_area, crds.loc)
+ MAPLOADING_CHECK_TICK
//finally instance all remainings objects/mobs
- for(index in 1 to first_turf_index-1)
- instance_atom(members[index], members_attributes[index], crds, no_changeturf, placeOnTop, delete)
- //Restore initialization to the previous value
- SSatoms.map_loader_stop()
+ for(var/atom_index in 1 to index-1)
+ if(members_attributes[atom_index] != default_list)
+ world.preloader_setup(members_attributes[atom_index], members[atom_index])
+
+ // We make the assertion that only /atom s will be in this portion of the code. if that isn't true, this will fail
+ instance = create_atom(members[atom_index], crds)//first preloader pass
+
+ if(GLOB.use_preloader && instance)//second preloader pass, for those atoms that don't ..() in New()
+ world.preloader_load(instance)
+ MAPLOADING_CHECK_TICK
////////////////
//Helpers procs
////////////////
-//Instance an atom at (x,y,z) and gives it the variables in attributes
-/datum/parsed_map/proc/instance_atom(path,list/attributes, turf/crds, no_changeturf, placeOnTop, delete)
- GLOB._preloader.setup(attributes, path)
-
- if(crds)
- if(ispath(path, /turf))
- if(delete)
- for(var/atom/A as anything in crds.GetAllTurfStrictContents())
- if(isobserver(A))
- continue
- qdel(A, force=TRUE)
-
- if(placeOnTop)
- . = crds.PlaceOnTop(null, path, CHANGETURF_DEFER_CHANGE | (no_changeturf ? CHANGETURF_SKIP : NONE))
- else if(!no_changeturf)
- . = crds.ChangeTurf(path, null, CHANGETURF_DEFER_CHANGE)
- else
- . = create_atom(path, crds)//first preloader pass
- else
- . = create_atom(path, crds)//first preloader pass
-
- if(GLOB.use_preloader && .)//second preloader pass, for those atoms that don't ..() in New()
- GLOB._preloader.load(.)
-
- //custom CHECK_TICK here because we don't want things created while we're sleeping to not initialize
- if(TICK_CHECK)
- SSatoms.map_loader_stop()
- stoplag()
- SSatoms.map_loader_begin()
-
/datum/parsed_map/proc/create_atom(path, crds)
set waitfor = FALSE
. = new path (crds)
-//text trimming (both directions) helper proc
-//optionally removes quotes before and after the text (for variable name)
-/datum/parsed_map/proc/trim_text(what as text,trim_quotes=0)
- if(trim_quotes)
- return trimQuotesRegex.Replace(what, "")
- else
- return trimRegex.Replace(what, "")
-
-
//find the position of the next delimiter,skipping whatever is comprised between opening_escape and closing_escape
//returns 0 if reached the last delimiter
/datum/parsed_map/proc/find_next_delimiter_position(text as text,initial_position as num, delimiter=",",opening_escape="\"",closing_escape="\"")
@@ -410,7 +1007,6 @@
return next_delimiter
-
//build a list from variables in text form (e.g {var1="derp"; var2; var3=7} => list(var1="derp", var2, var3=7))
//return the filled list
/datum/parsed_map/proc/readlist(text as text, delimiter=",")
@@ -418,28 +1014,29 @@
if (!text)
return
+ // If we're using a semi colon, we can do this as splittext rather then constant calls to find_next_delimiter_position
+ // This does make the code a bit harder to read, but saves a good bit of time so suck it up
var/position
var/old_position = 1
-
while(position != 0)
// find next delimiter that is not within "..."
position = find_next_delimiter_position(text,old_position,delimiter)
// check if this is a simple variable (as in list(var1, var2)) or an associative one (as in list(var1="foo",var2=7))
var/equal_position = findtext(text,"=",old_position, position)
-
- var/trim_left = trim_text(copytext(text,old_position,(equal_position ? equal_position : position)))
- var/left_constant = delimiter == ";" ? trim_left : parse_constant(trim_left)
+ var/trim_left = TRIM_TEXT(copytext(text,old_position,(equal_position ? equal_position : position)))
+ var/left_constant = parse_constant(trim_left)
if(position)
old_position = position + length(text[position])
+ if(!left_constant) // damn newlines man. Exists to provide behavior consistency with the above loop. not a major cost becuase this path is cold
+ continue
if(equal_position && !isnum(left_constant))
// Associative var, so do the association.
// Note that numbers cannot be keys - the RHS is dropped if so.
- var/trim_right = trim_text(copytext(text, equal_position + length(text[equal_position]), position))
+ var/trim_right = TRIM_TEXT(copytext(text, equal_position + length(text[equal_position]), position))
var/right_constant = parse_constant(trim_right)
.[left_constant] = right_constant
-
else // simple var
. += list(left_constant)
@@ -451,7 +1048,10 @@
// string
if(text[1] == "\"")
- return copytext(text, length(text[1]) + 1, findtext(text, "\"", length(text[1]) + 1))
+ // insert implied locate \" and length("\"") here
+ // It's a minimal timesave but it is a timesave
+ // Safe becuase we're guarenteed trimmed constants
+ return copytext(text, 2, -1)
// list
if(copytext(text, 1, 6) == "list(")//6 == length("list(") + 1
@@ -479,4 +1079,17 @@
/datum/parsed_map/Destroy()
..()
+ SSatoms.map_loader_stop(REF(src)) // Just in case, I don't want to double up here
+ if(turf_blacklist)
+ turf_blacklist.Cut()
+ parsed_bounds.Cut()
+ bounds.Cut()
+ grid_models.Cut()
+ gridSets.Cut()
return QDEL_HINT_HARDDEL_NOW
+
+#undef MAP_DMM
+#undef MAP_TGM
+#undef MAP_UNKNOWN
+#undef TRIM_TEXT
+#undef MAPLOADING_CHECK_TICK
diff --git a/code/modules/mapping/space_management/space_level.dm b/code/modules/mapping/space_management/space_level.dm
index 861258aa20..48303b5e39 100644
--- a/code/modules/mapping/space_management/space_level.dm
+++ b/code/modules/mapping/space_management/space_level.dm
@@ -4,13 +4,20 @@
var/list/traits
var/z_value = 1 //actual z placement
var/linkage = SELFLOOPING
- var/x_bounds
- var/y_bounds
+ /// Bounds at time of loading the map
+ var/bounds
/datum/space_level/New(new_z, new_name, list/new_traits = list())
z_value = new_z
name = new_name
traits = new_traits
+
+ if (islist(new_traits))
+ for (var/trait in new_traits)
+ SSmapping.z_trait_levels[trait] += list(new_z)
+ else // in case a single trait is passed in
+ SSmapping.z_trait_levels[new_traits] += list(new_z)
//set_linkage(new_traits[ZTRAIT_LINKAGE])
- x_bounds = world.maxx
- y_bounds = world.maxy
+
+ //Lazy Init value, will be hopefully changed by SSmapping
+ bounds = list(1, 1, z_value, world.maxx, world.maxy, z_value)
diff --git a/code/modules/mapping/space_management/space_reservation.dm b/code/modules/mapping/space_management/space_reservation.dm
index adaff04000..3c47ac3b5c 100644
--- a/code/modules/mapping/space_management/space_reservation.dm
+++ b/code/modules/mapping/space_management/space_reservation.dm
@@ -1,81 +1,240 @@
+/// Cordon area surrounding turf reservations
+/area/misc/cordon
+ name = "CORDON"
+ icon_state = "cordon"
+ static_lighting = FALSE
+ base_lighting_alpha = 255
+ requires_power = FALSE
+
+#define CORDON_TURF_TYPE /turf/closed/cordon
//Yes, they can only be rectangular.
//Yes, I'm sorry.
/datum/turf_reservation
+ /// All turfs that we've reserved
var/list/reserved_turfs = list()
+
+ /// Turfs around the reservation for cordoning
+ var/list/cordon_turfs = list()
+
+ /// Area of turfs next to the cordon to fill with pre_cordon_area's
+ var/list/pre_cordon_turfs = list()
+
+ /// The width of the reservation
var/width = 0
+
+ /// The height of the reservation
var/height = 0
- var/bottom_left_coords[3]
- var/top_right_coords[3]
- var/wipe_reservation_on_release = TRUE
+
+ /// The z stack size of the reservation. Note that reservations are ALWAYS reserved from the bottom up
+ var/z_size = 0
+
+ /// List of the bottom left turfs. Indexed by what their z index for this reservation is
+ var/list/bottom_left_turfs = list()
+
+ /// List of the top right turfs. Indexed by what their z index for this reservation is
+ var/list/top_right_turfs = list()
+
+ /// The turf type the reservation is initially made with
var/turf_type = /turf/open/space
+ ///Distance away from the cordon where we can put a "sort-cordon" and run some extra code (see make_repel). 0 makes nothing happen
+ var/pre_cordon_distance = 0
+
/datum/turf_reservation/transit
turf_type = /turf/open/space/transit
+ pre_cordon_distance = 7
/datum/turf_reservation/interior
turf_type = /turf/open/void/vehicle
/datum/turf_reservation/proc/Release()
- var/v = reserved_turfs.Copy()
- for(var/i in reserved_turfs)
- var/turf/T = i
- T.flags_atom |= UNUSED_RESERVATION_TURF
- reserved_turfs -= i
- SSmapping.used_turfs -= i
- SSmapping.reserve_turfs(v)
+ bottom_left_turfs.Cut()
+ top_right_turfs.Cut()
+
+ var/list/reserved_copy = reserved_turfs.Copy()
+ SSmapping.used_turfs -= reserved_turfs
+ reserved_turfs = list()
+
+ var/list/cordon_copy = cordon_turfs.Copy()
+ SSmapping.used_turfs -= cordon_turfs
+ cordon_turfs = list()
-/datum/turf_reservation/proc/Reserve(width, height, zlevel)
+ var/release_turfs = reserved_copy + cordon_copy
+
+ for(var/turf/reserved_turf as anything in release_turfs)
+ SEND_SIGNAL(reserved_turf, COMSIG_TURF_RESERVATION_RELEASED, src)
+
+ // Makes the linter happy, even tho we don't await this
+ INVOKE_ASYNC(SSmapping, TYPE_PROC_REF(/datum/controller/subsystem/mapping, reserve_turfs), release_turfs)
+
+/// Attempts to calaculate and store a list of turfs around the reservation for cordoning. Returns whether a valid cordon was calculated
+/datum/turf_reservation/proc/calculate_cordon_turfs(turf/bottom_left, turf/top_right)
+ if(bottom_left.x < 2 || bottom_left.y < 2 || top_right.x > (world.maxx - 2) || top_right.y > (world.maxy - 2))
+ return FALSE // no space for a cordon here
+
+ var/list/possible_turfs = CORNER_OUTLINE(bottom_left, width, height)
+ // if they're our cordon turfs, accept them
+ possible_turfs -= cordon_turfs
+ for(var/turf/cordon_turf as anything in possible_turfs)
+ if(!(cordon_turf.turf_flags & UNUSED_RESERVATION_TURF))
+ return FALSE
+ cordon_turfs |= possible_turfs
+
+ if(pre_cordon_distance)
+ var/turf/offset_turf = locate(bottom_left.x + pre_cordon_distance, bottom_left.y + pre_cordon_distance, bottom_left.z)
+ var/list/to_add = CORNER_OUTLINE(offset_turf, width - pre_cordon_distance * 2, height - pre_cordon_distance * 2) //we step-by-stop move inwards from the outer cordon
+ for(var/turf/turf_being_added as anything in to_add)
+ pre_cordon_turfs |= turf_being_added //add one by one so we can filter out duplicates
+
+ return TRUE
+
+/// Actually generates the cordon around the reservation, and marking the cordon turfs as reserved
+/datum/turf_reservation/proc/generate_cordon()
+ for(var/turf/cordon_turf as anything in cordon_turfs)
+ var/area/misc/cordon/cordon_area = GLOB.areas_by_type[/area/misc/cordon] || new
+ //var/area/old_area = cordon_turf.loc
+ //old_area.turfs_to_uncontain += cordon_turf
+ //cordon_area.contained_turfs += cordon_turf
+ cordon_area.contents += cordon_turf
+ // Its no longer unused, but its also not "used"
+ cordon_turf.turf_flags &= ~UNUSED_RESERVATION_TURF
+ cordon_turf.ChangeTurf(CORDON_TURF_TYPE, CORDON_TURF_TYPE)
+ SSmapping.unused_turfs["[cordon_turf.z]"] -= cordon_turf
+ // still gets linked to us though
+ SSmapping.used_turfs[cordon_turf] = src
+
+ //swap the area with the pre-cordoning area
+
+/// Internal proc which handles reserving the area for the reservation.
+/datum/turf_reservation/proc/_reserve_area(width, height, zlevel)
+ src.width = width
+ src.height = height
if(width > world.maxx || height > world.maxy || width < 1 || height < 1)
- log_debug("turf reservation had invalid dimensions")
return FALSE
var/list/avail = SSmapping.unused_turfs["[zlevel]"]
- var/turf/bottom_left
- var/turf/top_right
+ var/turf/BL
+ var/turf/TR
var/list/turf/final = list()
var/passing = FALSE
for(var/i in avail)
CHECK_TICK
- bottom_left = i
- if(!(bottom_left.flags_atom & UNUSED_RESERVATION_TURF))
+ BL = i
+ if(!(BL.turf_flags & UNUSED_RESERVATION_TURF))
continue
- if(bottom_left.x + width > world.maxx || bottom_left.y + height > world.maxy)
+ if(BL.x + width > world.maxx || BL.y + height > world.maxy)
continue
- top_right = locate(bottom_left.x + width - 1, bottom_left.y + height - 1, bottom_left.z)
- if(!(top_right.flags_atom & UNUSED_RESERVATION_TURF))
+ TR = locate(BL.x + width - 1, BL.y + height - 1, BL.z)
+ if(!(TR.turf_flags & UNUSED_RESERVATION_TURF))
continue
- final = block(bottom_left, top_right)
+ final = block(BL, TR)
if(!final)
continue
passing = TRUE
- for(var/turf/checking as anything in final)
- if(!(checking.flags_atom & UNUSED_RESERVATION_TURF))
+ for(var/I in final)
+ var/turf/checking = I
+ if(!(checking.turf_flags & UNUSED_RESERVATION_TURF))
passing = FALSE
break
+ if(passing) // found a potentially valid area, now try to calculate its cordon
+ passing = calculate_cordon_turfs(BL, TR)
if(!passing)
continue
break
- if(!passing || !istype(bottom_left) || !istype(top_right))
- log_debug("failed to pass reservation tests, [passing], [istype(bottom_left)], [istype(top_right)]")
+ if(!passing || !istype(BL) || !istype(TR))
return FALSE
- bottom_left_coords = list(bottom_left.x, bottom_left.y, bottom_left.z)
- top_right_coords = list(top_right.x, top_right.y, top_right.z)
- var/weakref = WEAKREF(src)
for(var/i in final)
var/turf/T = i
reserved_turfs |= T
SSmapping.unused_turfs["[T.z]"] -= T
- SSmapping.used_turfs[T] = weakref
- T = T.ChangeTurf(turf_type, turf_type)
- T.flags_atom &= ~UNUSED_RESERVATION_TURF
- src.width = width
- src.height = height
+ SSmapping.used_turfs[T] = src
+ T.turf_flags = (T.turf_flags | RESERVATION_TURF) & ~UNUSED_RESERVATION_TURF
+ T.ChangeTurf(turf_type, turf_type)
+
+ bottom_left_turfs += BL
+ top_right_turfs += TR
+ return TRUE
+
+/datum/turf_reservation/proc/reserve(width, height, z_size, z_reservation)
+ src.z_size = z_size
+ var/failed_reservation = FALSE
+ for(var/_ in 1 to z_size)
+ if(!_reserve_area(width, height, z_reservation))
+ failed_reservation = TRUE
+ break
+
+ if(failed_reservation)
+ Release()
+ return FALSE
+
+ generate_cordon()
return TRUE
+/// Calculates the effective bounds information for the given turf. Returns a list of the information, or null if not applicable.
+/datum/turf_reservation/proc/calculate_turf_bounds_information(turf/target)
+ for(var/z_idx in 1 to z_size)
+ var/turf/bottom_left = bottom_left_turfs[z_idx]
+ var/turf/top_right = top_right_turfs[z_idx]
+ var/bl_x = bottom_left.x
+ var/bl_y = bottom_left.y
+ var/tr_x = top_right.x
+ var/tr_y = top_right.y
+
+ if(target.x < bl_x)
+ continue
+
+ if(target.y < bl_y)
+ continue
+
+ if(target.x > tr_x)
+ continue
+
+ if(target.y > tr_y)
+ continue
+
+ var/list/return_information = list()
+ return_information["z_idx"] = z_idx
+ return_information["offset_x"] = target.x - bl_x
+ return_information["offset_y"] = target.y - bl_y
+ return return_information
+ return null
+
+/// Gets the turf below the given target. Returns null if there is no turf below the target
+/datum/turf_reservation/proc/get_turf_below(turf/target)
+ var/list/bounds_info = calculate_turf_bounds_information(target)
+ if(isnull(bounds_info))
+ return null
+
+ var/z_idx = bounds_info["z_idx"]
+ // check what z level, if its the max, then there is no turf below
+ if(z_idx == z_size)
+ return null
+
+ var/offset_x = bounds_info["offset_x"]
+ var/offset_y = bounds_info["offset_y"]
+ var/turf/bottom_left = bottom_left_turfs[z_idx + 1]
+ return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z)
+
+/// Gets the turf above the given target. Returns null if there is no turf above the target
+/datum/turf_reservation/proc/get_turf_above(turf/target)
+ var/list/bounds_info = calculate_turf_bounds_information(target)
+ if(isnull(bounds_info))
+ return null
+
+ var/z_idx = bounds_info["z_idx"]
+ // check what z level, if its the min, then there is no turf above
+ if(z_idx == 1)
+ return null
+
+ var/offset_x = bounds_info["offset_x"]
+ var/offset_y = bounds_info["offset_y"]
+ var/turf/bottom_left = bottom_left_turfs[z_idx - 1]
+ return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z)
+
/datum/turf_reservation/New()
LAZYADD(SSmapping.turf_reservations, src)
/datum/turf_reservation/Destroy()
- INVOKE_ASYNC(src, PROC_REF(Release))
+ Release()
LAZYREMOVE(SSmapping.turf_reservations, src)
return ..()
diff --git a/code/modules/mapping/space_management/zlevel_manager.dm b/code/modules/mapping/space_management/zlevel_manager.dm
index 9311719ea7..2b96065929 100644
--- a/code/modules/mapping/space_management/zlevel_manager.dm
+++ b/code/modules/mapping/space_management/zlevel_manager.dm
@@ -14,16 +14,22 @@
for (var/I in 1 to default_map_traits.len)
var/list/features = default_map_traits[I]
var/datum/space_level/S = new(I, features[DL_NAME], features[DL_TRAITS])
- z_list += S
+ manage_z_level(S, filled_with_space = FALSE)
+ //generate_z_level_linkages() // Default Zs don't use add_new_zlevel() so they don't automatically generate z-linkages.
-/datum/controller/subsystem/mapping/proc/add_new_zlevel(name, traits = list(), z_type = /datum/space_level)
+/datum/controller/subsystem/mapping/proc/add_new_zlevel(name, traits = list(), z_type = /datum/space_level, contain_turfs = TRUE)
+ UNTIL(!adding_new_zlevel)
+ adding_new_zlevel = TRUE
var/new_z = z_list.len + 1
if (world.maxz < new_z)
world.incrementMaxZ()
CHECK_TICK
// TODO: sleep here if the Z level needs to be cleared
var/datum/space_level/S = new z_type(new_z, name, traits)
- z_list += S
+ manage_z_level(S, filled_with_space = TRUE, contain_turfs = contain_turfs)
+ //generate_linkages_for_z_level(new_z)
+ //calculate_z_level_gravity(new_z)
+ adding_new_zlevel = FALSE
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_Z, S)
return S
diff --git a/code/modules/maptext_alerts/screen_alerts.dm b/code/modules/maptext_alerts/screen_alerts.dm
index 0b923f7dc7..b096d3b371 100644
--- a/code/modules/maptext_alerts/screen_alerts.dm
+++ b/code/modules/maptext_alerts/screen_alerts.dm
@@ -214,6 +214,9 @@
/// Alert owner
var/mob/owner
+ /// Boolean. If TRUE, the Click() proc will attempt to Click() on the master first if there is a master.
+ var/click_master = TRUE
+
/atom/movable/screen/alert/MouseEntered(location,control,params)
. = ..()
if(!QDELETED(src))
@@ -251,3 +254,65 @@
if(NOTIFY_XENO_TACMAP)
GLOB.xeno_tacmap_status.tgui_interact(ghost_user)
+/atom/movable/screen/alert/buckled
+ name = "Buckled"
+ desc = "You've been buckled to something. Click the alert to unbuckle unless you're handcuffed."
+ icon_state = ALERT_BUCKLED
+
+/atom/movable/screen/alert/restrained/handcuffed
+ name = "Handcuffed"
+ desc = "You're handcuffed and can't act. If anyone drags you, you won't be able to move. Click the alert to free yourself."
+ click_master = FALSE
+
+/atom/movable/screen/alert/restrained/legcuffed
+ name = "Legcuffed"
+ desc = "You're legcuffed, which slows you down considerably. Click the alert to free yourself."
+ click_master = FALSE
+
+/atom/movable/screen/alert/restrained/clicked()
+ . = ..()
+ if(!.)
+ return
+
+ var/mob/living/living_owner = owner
+
+ if(!living_owner.can_resist())
+ return
+
+// living_owner.changeNext_move(CLICK_CD_RESIST) // handled in resist proc
+ if((living_owner.mobility_flags & MOBILITY_MOVE) && (living_owner.last_special <= world.time))
+ return living_owner.resist_restraints()
+
+/atom/movable/screen/alert/buckled/clicked()
+ . = ..()
+ if(!.)
+ return
+
+ var/mob/living/living_owner = owner
+
+ if(!living_owner.can_resist())
+ return
+// living_owner.changeNext_move(CLICK_CD_RESIST) // handled in resist proc
+ if(living_owner.last_special <= world.time)
+ return living_owner.resist_buckle()
+
+/atom/movable/screen/alert/clicked(location, control, params)
+ if(!usr || !usr.client)
+ return FALSE
+ if(usr != owner)
+ return FALSE
+ var/list/modifiers = params2list(params)
+ if(LAZYACCESS(modifiers, SHIFT_CLICK)) // screen objects don't do the normal Click() stuff so we'll cheat
+ to_chat(usr, SPAN_BOLDNOTICE("[name] -
[desc]"))
+ return FALSE
+ if(master && click_master)
+ return usr.client.Click(master, location, control, params)
+
+ return TRUE
+
+/atom/movable/screen/alert/Destroy()
+ . = ..()
+ severity = 0
+ master = null
+ owner = null
+ screen_loc = ""
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 44a3592329..cf225caadc 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -32,6 +32,7 @@
plane = GHOST_PLANE
layer = ABOVE_FLY_LAYER
stat = DEAD
+ mob_flags = KNOWS_TECHNOLOGY
var/adminlarva = FALSE
var/ghostvision = TRUE
var/can_reenter_corpse
@@ -189,37 +190,38 @@
clean_observe_target()
/// When the observer target gets a screen, our observer gets a screen minus some game screens we don't want the observer to touch
-/mob/dead/observer/proc/observe_target_screen_add(observe_target_mob_client, add_to_screen)
+/mob/dead/observer/proc/observe_target_screen_add(observe_target_mob_client, screen_add)
SIGNAL_HANDLER
- if(!client)
- return
-
- if(istype(add_to_screen, /atom/movable/screen/action_button))
- return
+ var/static/list/excluded_types = typecacheof(list(
+ /atom/movable/screen/fullscreen,
+ /atom/movable/screen/click_catcher,
+ /atom/movable/screen/escape_menu,
+ /atom/movable/screen/buildmode,
+ /obj/effect/detector_blip,
+ ))
- if(istype(add_to_screen, /atom/movable/screen/fullscreen))
+ if(!client)
return
- if(istype(add_to_screen, /atom/movable/screen/click_catcher))
- return
+ // `screen_add` can sometimes be a list, so it's safest to just handle everything as one.
+ var/list/stuff_to_add = (islist(screen_add) ? screen_add : list(screen_add))
- if(istype(add_to_screen, /atom/movable/screen/escape_menu))
- return
-
- if(istype(add_to_screen, /obj/effect/detector_blip))
- return
+ for(var/item in stuff_to_add)
+ // Ignore anything that's in `excluded_types`.
+ if(is_type_in_typecache(item, excluded_types))
+ continue
- client.add_to_screen(add_to_screen)
+ client.add_to_screen(screen_add)
/// When the observer target loses a screen, our observer loses it as well
-/mob/dead/observer/proc/observe_target_screen_remove(observe_target_mob_client, remove_from_screen)
+/mob/dead/observer/proc/observe_target_screen_remove(observe_target_mob_client, screen_remove)
SIGNAL_HANDLER
if(!client)
return
- client.remove_from_screen(remove_from_screen)
+ client.remove_from_screen(screen_remove)
/// When the observe target ghosts our observer disconnect from their screen updates
/mob/dead/observer/proc/observe_target_ghosting(mob/observer_target_mob)
@@ -236,8 +238,9 @@
if(observe_target_client != new_client)
observe_target_client = new_client
- RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_ADD, PROC_REF(observe_target_screen_add))
- RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_REMOVE, PROC_REF(observe_target_screen_remove))
+ // Override the signal from any previous targets.
+ RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_ADD, PROC_REF(observe_target_screen_add), TRUE)
+ RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_REMOVE, PROC_REF(observe_target_screen_remove), TRUE)
/// When the observe target logs in our observer connect to the new client
/mob/dead/observer/proc/observe_target_login(mob/living/new_character)
@@ -246,8 +249,9 @@
if(observe_target_client != new_character.client)
observe_target_client = new_character.client
- RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_ADD, PROC_REF(observe_target_screen_add))
- RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_REMOVE, PROC_REF(observe_target_screen_remove))
+ // Override the signal from any previous targets.
+ RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_ADD, PROC_REF(observe_target_screen_add), TRUE)
+ RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_REMOVE, PROC_REF(observe_target_screen_remove), TRUE)
///makes the ghost see the target hud and sets the eye at the target.
/mob/dead/observer/proc/do_observe(atom/movable/target)
@@ -257,52 +261,28 @@
ManualFollow(target)
reset_perspective()
- if(!ishuman(target) || !client.prefs?.auto_observe)
+ if(!iscarbon(target) || !client.prefs?.auto_observe)
return
- var/mob/living/carbon/human/human_target = target
-
- client.eye = human_target
-
- if(!human_target.hud_used)
+ var/mob/living/carbon/carbon_target = target
+ if(!carbon_target.hud_used)
return
client.clear_screen()
- LAZYINITLIST(human_target.observers)
- human_target.observers |= src
- human_target.hud_used.show_hud(human_target.hud_used.hud_version, src)
-
- var/list/target_contents = human_target.get_contents()
+ client.eye = carbon_target
+ observe_target_mob = carbon_target
- //Handles any currently open storage containers the target is looking in when we observe
- for(var/obj/item/storage/checked_storage in target_contents)
- if(!(human_target in checked_storage.content_watchers))
- continue
-
- client.add_to_screen(checked_storage.closer)
- client.add_to_screen(checked_storage.contents)
-
- if(checked_storage.storage_slots)
- client.add_to_screen(checked_storage.boxes)
- else
- client.add_to_screen(checked_storage.storage_start)
- client.add_to_screen(checked_storage.storage_continue)
- client.add_to_screen(checked_storage.storage_end)
+ carbon_target.auto_observed(src)
- break
-
- observe_target_mob = human_target
+ RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(observer_move_react))
RegisterSignal(observe_target_mob, COMSIG_PARENT_QDELETING, PROC_REF(clean_observe_target))
RegisterSignal(observe_target_mob, COMSIG_MOB_GHOSTIZE, PROC_REF(observe_target_ghosting))
RegisterSignal(observe_target_mob, COMSIG_MOB_NEW_MIND, PROC_REF(observe_target_new_mind))
RegisterSignal(observe_target_mob, COMSIG_MOB_LOGIN, PROC_REF(observe_target_login))
- RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(observer_move_react))
-
- if(human_target.client)
- observe_target_client = human_target.client
+ if(observe_target_mob.client)
+ observe_target_client = observe_target_mob.client
RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_ADD, PROC_REF(observe_target_screen_add))
RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_REMOVE, PROC_REF(observe_target_screen_remove))
- return
/mob/dead/observer/reset_perspective(atom/A)
if(observe_target_mob)
@@ -620,7 +600,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return
mind.transfer_to(mind.original, TRUE)
- SStgui.on_transfer(src, mind.current)
qdel(src)
return TRUE
@@ -758,12 +737,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!tx || !ty || !tz)
return
following = null
- spawn(0)
- // To stop the ghost flickering.
- x = tx
- y = ty
- z = tz
- sleep(15)
+ forceMove(locate(tx, ty, tz))
/mob/dead/observer/verb/dead_teleport_mob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak
set category = "Ghost"
@@ -1034,6 +1008,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(src, SPAN_WARNING("The game hasn't started yet!"))
return
+ if(jobban_isbanned(src, "Freed Mob"))
+ to_chat(src, SPAN_WARNING("You are banned from being able to join as a freed mob."))
+ return
+
var/list/mobs_by_role = list() // the list the mobs are assigned to first, for sorting purposes
for(var/mob/freed_mob as anything in GLOB.freed_mob_list)
var/role_name = freed_mob.get_role_name()
@@ -1059,6 +1037,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!istype(freed_mob) || !(freed_mob in GLOB.freed_mob_list))
return
+ if(jobban_isbanned(src, "Freed Mob"))
+ to_chat(src, SPAN_WARNING("You are banned from being able to join as a freed mob."))
+ return
+
if(QDELETED(freed_mob) || freed_mob.client)
GLOB.freed_mob_list -= freed_mob
to_chat(src, SPAN_WARNING("Something went wrong."))
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index b63ce0174a..2a419eddf1 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -399,22 +399,28 @@
bodytemperature = max(bodytemperature, BODYTEMP_HEAT_DAMAGE_LIMIT+10)
recalculate_move_delay = TRUE
-
-/mob/living/carbon/show_inv(mob/living/carbon/user as mob)
- user.set_interaction(src)
- var/dat = {"
-
[name]
-
-
Head(Mask): [(wear_mask ? wear_mask : "Nothing")]
-
Left Hand: [(l_hand ? l_hand : "Nothing")]
-
Right Hand: [(r_hand ? r_hand : "Nothing")]
-
Back: [(back ? back : "Nothing")] [((istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/tank) && !( internal )) ? " Set Internal" : "")]
-
[(handcuffed ? "Handcuffed" : "Not Handcuffed")]
-
[(internal ? "Remove Internal" : "")]
-
Refresh
-
Close
-
"}
- show_browser(user, dat, name, "mob[name]")
+/**
+ * Called by [/mob/dead/observer/proc/do_observe] when a carbon mob is observed by a ghost with [/datum/preferences/var/auto_observe] enabled.
+ *
+ * Any HUD changes past this point are handled by [/mob/dead/observer/proc/observe_target_screen_add]
+ * and [/mob/dead/observer/proc/observe_target_screen_remove].
+ *
+ * Override on subtype mobs if they have any extra HUD elements/behaviour.
+ */
+/mob/living/carbon/proc/auto_observed(mob/dead/observer/observer)
+ SHOULD_CALL_PARENT(TRUE)
+
+ LAZYINITLIST(observers)
+ observers |= observer
+ hud_used.show_hud(hud_used.hud_version, observer)
+
+ // Add the player's action buttons (not the actions themselves) to the observer's screen.
+ for(var/datum/action/action as anything in actions)
+ // Skip any hidden ones (of course).
+ if(action.hidden || action.player_hidden)
+ continue
+
+ observer.client.add_to_screen(action.button)
//generates realistic-ish pulse output based on preset levels
/mob/living/carbon/proc/get_pulse(method) //method 0 is for hands, 1 is for machines, more accurate
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 837f193c4c..c394431c72 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -13,7 +13,7 @@
create_reagents(1000)
if(!real_name || !name)
change_real_name(src, "unknown")
-
+ AddElement(/datum/element/strippable, GLOB.strippable_human_items, TYPE_PROC_REF(/mob/living/carbon/human, should_strip))
. = ..()
prev_gender = gender // Debug for plural genders
@@ -270,48 +270,28 @@
return TRUE
return FALSE
+/**
+ * Handles any storage containers that the human is looking inside when auto-observed.
+ */
+/mob/living/carbon/human/auto_observed(mob/dead/observer/observer)
+ . = ..()
-
-/mob/living/carbon/human/show_inv(mob/living/user)
- if(ismaintdrone(user))
+ // If `src` doesn't have an inventory open.
+ if(!s_active)
return
- var/obj/item/clothing/under/suit = null
- if(istype(w_uniform, /obj/item/clothing/under))
- suit = w_uniform
-
- user.set_interaction(src)
- var/dat = {"
-
[name]
-
-
(Exo)Suit: [(wear_suit ? wear_suit : "Nothing")]
-
Suit Storage: [(s_store ? s_store : "Nothing")] [((istype(wear_mask, /obj/item/clothing/mask) && istype(s_store, /obj/item/tank) && !( internal )) ? " Set Internal" : "")]
-
Back: [(back ? back : "Nothing")] [((istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/tank) && !( internal )) ? " Set Internal" : "")]
-
Head(Mask): [(wear_mask ? wear_mask : "Nothing")]
-
Left Hand: [(l_hand ? l_hand : "Nothing")]
-
Right Hand: [(r_hand ? r_hand : "Nothing")]
-
Gloves: [(gloves ? gloves : "Nothing")]
-
Eyes: [(glasses ? glasses : "Nothing")]
-
Left Ear: [(wear_l_ear ? wear_l_ear : "Nothing")]
-
Right Ear: [(wear_r_ear ? wear_r_ear : "Nothing")]
-
Head: [(head ? head : "Nothing")]
-
Shoes: [(shoes ? shoes : "Nothing")]
-
Belt: [(belt ? belt : "Nothing")] [((istype(wear_mask, /obj/item/clothing/mask) && istype(belt, /obj/item/tank) && !internal) ? " Set Internal" : "")]
-
Uniform: [(w_uniform ? w_uniform : "Nothing")] [(suit) ? ((suit.has_sensor == UNIFORM_HAS_SENSORS) ? " Sensors" : "") : null]
-
ID: [(wear_id ? wear_id : "Nothing")]
-
Left Pocket: [(l_store ? l_store : "Nothing")]
-
Right Pocket: [(r_store ? r_store : "Nothing")]
-
- [handcuffed ? "
Handcuffed" : ""]
- [legcuffed ? "
Legcuffed" : ""]
- [suit && LAZYLEN(suit.accessories) ? "
Remove Accessory" : ""]
- [internal ? "
Remove Internal" : ""]
- [istype(wear_id, /obj/item/card/id/dogtag) ? "
Retrieve Info Tag" : ""]
-
Remove Splints
-
-
Refresh
-
Close
-
"}
- show_browser(user, dat, name, "mob[name]")
+
+ // Add the storage interface to `observer`'s screen.
+ observer.client.add_to_screen(s_active.closer)
+ observer.client.add_to_screen(s_active.contents)
+
+ // If the storage has a set number of item slots.
+ if(s_active.storage_slots)
+ observer.client.add_to_screen(s_active.boxes)
+ // If the storage instead has a maximum combined item 'weight'.
+ else
+ observer.client.add_to_screen(s_active.storage_start)
+ observer.client.add_to_screen(s_active.storage_continue)
+ observer.client.add_to_screen(s_active.storage_end)
// called when something steps onto a human
// this handles mulebots and vehicles
@@ -405,9 +385,6 @@
/mob/living/carbon/human/Topic(href, href_list)
- if(href_list["refresh"])
- if(interactee&&(in_range(src, usr)))
- show_inv(interactee)
if(href_list["mach_close"])
var/t1 = text("window=[]", href_list["mach_close"])
@@ -452,76 +429,6 @@
what = usr.get_active_hand()
usr.stripPanelEquip(what,src,slot)
- if(href_list["internal"])
-
- if(!usr.action_busy && !usr.is_mob_incapacitated() && Adjacent(usr))
- attack_log += text("\[[time_stamp()]\] Has had their internals toggled by [key_name(usr)]")
- usr.attack_log += text("\[[time_stamp()]\] Attempted to toggle [key_name(src)]'s' internals")
- if(internal)
- usr.visible_message(SPAN_DANGER("[usr] is trying to disable [src]'s internals"), null, null, 3)
- else
- usr.visible_message(SPAN_DANGER("[usr] is trying to enable [src]'s internals."), null, null, 3)
-
- if(do_after(usr, POCKET_STRIP_DELAY, INTERRUPT_ALL, BUSY_ICON_GENERIC, src, INTERRUPT_MOVED, BUSY_ICON_GENERIC))
- if(internal)
- internal.add_fingerprint(usr)
- internal = null
- visible_message("[src] is no longer running on internals.", null, null, 1)
- else
- if(istype(wear_mask, /obj/item/clothing/mask))
- if(istype(back, /obj/item/tank))
- internal = back
- else if(istype(s_store, /obj/item/tank))
- internal = s_store
- else if(istype(belt, /obj/item/tank))
- internal = belt
- if(internal)
- visible_message(SPAN_NOTICE("[src] is now running on internals."), null, null, 1)
- internal.add_fingerprint(usr)
-
- // Update strip window
- if(usr.interactee == src && Adjacent(usr))
- show_inv(usr)
-
-
- if(href_list["splints"])
- if(!usr.action_busy && !usr.is_mob_incapacitated() && Adjacent(usr))
- if(MODE_HAS_TOGGLEABLE_FLAG(MODE_NO_STRIPDRAG_ENEMY) && (stat == DEAD || health < HEALTH_THRESHOLD_CRIT) && !get_target_lock(usr.faction_group))
- to_chat(usr, SPAN_WARNING("You can't strip a crit or dead member of another faction!"))
- return
- attack_log += text("\[[time_stamp()]\] Has had their splints removed by [key_name(usr)]")
- usr.attack_log += text("\[[time_stamp()]\] Attempted to remove [key_name(src)]'s' splints ")
- remove_splints(usr)
-
- if(href_list["tie"])
- if(!usr.action_busy && !usr.is_mob_incapacitated() && Adjacent(usr))
- if(MODE_HAS_TOGGLEABLE_FLAG(MODE_NO_STRIPDRAG_ENEMY) && (stat == DEAD || health < HEALTH_THRESHOLD_CRIT) && !get_target_lock(usr.faction_group))
- to_chat(usr, SPAN_WARNING("You can't strip a crit or dead member of another faction!"))
- return
- if(w_uniform && istype(w_uniform, /obj/item/clothing))
- var/obj/item/clothing/under/U = w_uniform
- if(!LAZYLEN(U.accessories))
- return FALSE
- var/obj/item/clothing/accessory/A = LAZYACCESS(U.accessories, 1)
- if(LAZYLEN(U.accessories) > 1)
- A = tgui_input_list(usr, "Select an accessory to remove from [U]", "Remove accessory", U.accessories)
- if(!istype(A))
- return
- attack_log += text("\[[time_stamp()]\] Has had their accessory ([A]) removed by [key_name(usr)]")
- usr.attack_log += text("\[[time_stamp()]\] Attempted to remove [key_name(src)]'s' accessory ([A])")
- if(istype(A, /obj/item/clothing/accessory/holobadge) || istype(A, /obj/item/clothing/accessory/medal))
- visible_message(SPAN_DANGER("[usr] tears off \the [A] from [src]'s [U]!"), null, null, 5)
- if(U == w_uniform)
- U.remove_accessory(usr, A)
- else
- if(HAS_TRAIT(src, TRAIT_UNSTRIPPABLE) && !is_mob_incapacitated()) //Can't strip the unstrippable!
- to_chat(usr, SPAN_DANGER("[src] has an unbreakable grip on their equipment!"))
- return
- visible_message(SPAN_DANGER("[usr] is trying to take off \a [A] from [src]'s [U]!"), null, null, 5)
- if(do_after(usr, get_strip_delay(usr, src), INTERRUPT_ALL, BUSY_ICON_GENERIC, src, INTERRUPT_MOVED, BUSY_ICON_GENERIC))
- if(U == w_uniform)
- U.remove_accessory(usr, A)
-
if(href_list["sensor"])
if(!usr.action_busy && !usr.is_mob_incapacitated() && Adjacent(usr))
if(MODE_HAS_TOGGLEABLE_FLAG(MODE_NO_STRIPDRAG_ENEMY) && (stat == DEAD || health < HEALTH_THRESHOLD_CRIT) && !get_target_lock(usr.faction_group))
@@ -780,25 +687,7 @@
R.fields[text("com_[counter]")] = text("Made by [U.name] ([U.modtype] [U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]
[t1]")
if(href_list["medholocard"])
- if(!skillcheck(usr, SKILL_MEDICAL, SKILL_MEDICAL_MEDIC))
- to_chat(usr, SPAN_WARNING("You're not trained to use this."))
- return
- if(!has_species(src, "Human"))
- to_chat(usr, SPAN_WARNING("Triage holocards only works on humans."))
- return
- var/newcolor = tgui_input_list(usr, "Choose a triage holo card to add to the patient:", "Triage holo card", list("black", "red", "orange", "none"))
- if(!newcolor) return
- if(get_dist(usr, src) > 7)
- to_chat(usr, SPAN_WARNING("[src] is too far away."))
- return
- if(newcolor == "none")
- if(!holo_card_color) return
- holo_card_color = null
- to_chat(usr, SPAN_NOTICE("You remove the holo card on [src]."))
- else if(newcolor != holo_card_color)
- holo_card_color = newcolor
- to_chat(usr, SPAN_NOTICE("You add a [newcolor] holo card on [src]."))
- update_targeted()
+ change_holo_card(usr)
if(href_list["lookitem"])
var/obj/item/I = locate(href_list["lookitem"])
@@ -850,6 +739,39 @@
..()
return
+/mob/living/carbon/human/proc/change_holo_card(mob/user)
+ if(isobserver(user))
+ return
+ if(!skillcheck(user, SKILL_MEDICAL, SKILL_MEDICAL_MEDIC))
+ // Removing your own holocard when you are not trained
+ if(user == src && holo_card_color)
+ if(tgui_alert(user, "Are you sure you want to reset your own holocard?", "Resetting Holocard", list("Yes", "No")) != "Yes")
+ return
+ holo_card_color = null
+ to_chat(user, SPAN_NOTICE("You reset your holocard."))
+ hud_set_holocard()
+ return
+ to_chat(user, SPAN_WARNING("You're not trained to use this."))
+ return
+ if(!has_species(src, "Human"))
+ to_chat(user, SPAN_WARNING("Triage holocards only works on humans."))
+ return
+ var/newcolor = tgui_input_list(user, "Choose a triage holo card to add to the patient:", "Triage holo card", list("black", "red", "orange", "purple", "none"))
+ if(!newcolor)
+ return
+ if(get_dist(user, src) > 7)
+ to_chat(user, SPAN_WARNING("[src] is too far away."))
+ return
+ if(newcolor == "none")
+ if(!holo_card_color)
+ return
+ holo_card_color = null
+ to_chat(user, SPAN_NOTICE("You remove the holo card on [src]."))
+ else if(newcolor != holo_card_color)
+ holo_card_color = newcolor
+ to_chat(user, SPAN_NOTICE("You add a [newcolor] holo card on [src]."))
+ hud_set_holocard()
+
/mob/living/carbon/human/tgui_interact(mob/user, datum/tgui/ui) // I'M SORRY, SO FUCKING SORRY
. = ..()
ui = SStgui.try_update_ui(user, src, ui)
@@ -1055,9 +977,9 @@
for(var/datum/effects/bleeding/internal/internal_bleed in effects_list)
msg += "They have bloating and discoloration on their [internal_bleed.limb.display_name]\n"
- if(knocked_out && stat != DEAD)
+ if(stat == UNCONSCIOUS)
msg += "They seem to be unconscious\n"
- if(stat == DEAD)
+ else if(stat == DEAD)
if(src.check_tod() && is_revivable())
msg += "They're not breathing"
else
diff --git a/code/modules/mob/living/carbon/human/human_abilities.dm b/code/modules/mob/living/carbon/human/human_abilities.dm
index 75aa0de09a..2af2d738bc 100644
--- a/code/modules/mob/living/carbon/human/human_abilities.dm
+++ b/code/modules/mob/living/carbon/human/human_abilities.dm
@@ -124,7 +124,7 @@ CULT
/datum/action/human_action/activable/can_use_action()
var/mob/living/carbon/human/H = owner
- if(istype(H) && !H.is_mob_incapacitated() && !H.dazed)
+ if(istype(H) && !H.is_mob_incapacitated() && !HAS_TRAIT(H, TRAIT_DAZED))
return TRUE
// Called when the action is clicked on.
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 2bb113d677..fa35cb1fe9 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -161,7 +161,9 @@
disarm_chance += 5 * defender_skill_level
if(disarm_chance <= 25)
- apply_effect(2 + max((attacker_skill_level - defender_skill_level), 0), WEAKEN)
+ var/strength = 2 + max((attacker_skill_level - defender_skill_level), 0)
+ KnockDown(strength)
+ Stun(strength)
playsound(loc, 'sound/weapons/thudswoosh.ogg', 25, 1, 7)
var/shove_text = attacker_skill_level > 1 ? "tackled" : pick("pushed", "shoved")
visible_message(SPAN_DANGER("[attacking_mob] has [shove_text] [src]!"), null, null, 5)
@@ -187,12 +189,6 @@
/mob/living/carbon/human/help_shake_act(mob/living/carbon/M)
//Target is us
if(src == M)
- if(holo_card_color) //if we have a triage holocard printed on us, we remove it.
- holo_card_color = null
- update_targeted()
- visible_message(SPAN_NOTICE("[src] removes the holo card on [gender==MALE?"himself":"herself"]."), \
- SPAN_NOTICE("You remove the holo card on yourself."), null, 3)
- return
check_for_injuries()
return
@@ -205,15 +201,14 @@
if (w_uniform)
w_uniform.add_fingerprint(M)
-
- if(body_position == LYING_DOWN || sleeping)
+ if(HAS_TRAIT(src, TRAIT_FLOORED) || HAS_TRAIT(src, TRAIT_KNOCKEDOUT) || body_position == LYING_DOWN || sleeping)
if(client)
sleeping = max(0,src.sleeping-5)
if(!sleeping)
set_resting(FALSE)
M.visible_message(SPAN_NOTICE("[M] shakes [src] trying to wake [t_him] up!"), \
SPAN_NOTICE("You shake [src] trying to wake [t_him] up!"), null, 4)
- else if(stunned)
+ else if(HAS_TRAIT(src, TRAIT_INCAPACITATED))
M.visible_message(SPAN_NOTICE("[M] shakes [src], trying to shake [t_him] out of his stupor!"), \
SPAN_NOTICE("You shake [src], trying to shake [t_him] out of his stupor!"), null, 4)
else
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 5c685cc3ac..f7b72ee08d 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -287,7 +287,6 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t
apply_damage(burn, BURN, picked, sharp, edge)
UpdateDamageIcon()
updatehealth()
- speech_problem_flag = TRUE
//Heal MANY limbs, in random order
@@ -308,22 +307,22 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t
parts -= picked
updatehealth()
- speech_problem_flag = TRUE
+
if(update) UpdateDamageIcon()
// damage MANY limbs, in random order
-/mob/living/carbon/human/take_overall_damage(brute, burn, sharp = 0, edge = 0, used_weapon = null)
+/mob/living/carbon/human/take_overall_damage(brute, burn, used_weapon = null, limb_damage_chance = 80)
if(status_flags & GODMODE)
return //godmode
- var/list/obj/limb/parts = get_damageable_limbs(80)
+ var/list/obj/limb/parts = get_damageable_limbs(limb_damage_chance)
var/amount_of_parts = length(parts)
for(var/obj/limb/L as anything in parts)
- L.take_damage(brute / amount_of_parts, burn / amount_of_parts, sharp, edge, used_weapon)
+ L.take_damage(brute / amount_of_parts, burn / amount_of_parts, sharp = FALSE, edge = FALSE, used_weapon = used_weapon)
updatehealth()
UpdateDamageIcon()
-// damage MANY LIMBS, in random order
-/mob/living/carbon/human/proc/take_overall_armored_damage(damage, armour_type = ARMOR_MELEE, damage_type = BRUTE, limb_damage_chance = 80, penetration = 0, armour_break_pr_pen = 0, armour_break_flat = 0)
+// damage MANY LIMBS, in random order, but consider armor
+/mob/living/carbon/human/proc/take_overall_armored_damage(damage, armour_type = ARMOR_MELEE, damage_type = BRUTE, limb_damage_chance = 80, penetration = 0)
if(status_flags & GODMODE)
return //godmode
var/list/obj/limb/parts = get_damageable_limbs(limb_damage_chance)
@@ -331,6 +330,8 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t
var/armour_config = GLOB.marine_ranged
if(armour_type == ARMOR_MELEE)
armour_config = GLOB.marine_melee
+ if(armour_type == ARMOR_BOMB)
+ armour_config = GLOB.marine_explosive
for(var/obj/limb/L as anything in parts)
var/armor = getarmor(L, armour_type)
var/modified_damage = armor_damage_reduction(armour_config, damage, armor, penetration, 0, 0)
@@ -514,11 +515,3 @@ This function restores all limbs.
damage_to_deal *= 0.25 // Massively reduced effectiveness
stamina.apply_damage(damage_to_deal)
-
-/mob/living/carbon/human/knocked_out_start()
- ..()
- sound_environment_override = SOUND_ENVIRONMENT_PSYCHOTIC
-
-/mob/living/carbon/human/knocked_out_callback()
- . = ..()
- sound_environment_override = SOUND_ENVIRONMENT_NONE
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index a3424a1815..3beb8b97a9 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -67,8 +67,6 @@
var/voice
- var/speech_problem_flag = FALSE
-
var/special_voice = "" // For changing our voice. Used by a symptom.
var/last_dam = -1 //Used for determining if we need to process all limbs or just some or even none.
@@ -139,7 +137,7 @@
var/last_chew = 0
//taken from human.dm
- hud_possible = list(HEALTH_HUD,STATUS_HUD, STATUS_HUD_OOC, STATUS_HUD_XENO_INFECTION, STATUS_HUD_XENO_CULTIST, ID_HUD, WANTED_HUD, ORDER_HUD, XENO_HOSTILE_ACID, XENO_HOSTILE_SLOW, XENO_HOSTILE_TAG, XENO_HOSTILE_FREEZE, HUNTER_CLAN, HUNTER_HUD, FACTION_HUD)
+ hud_possible = list(HEALTH_HUD, STATUS_HUD, STATUS_HUD_OOC, STATUS_HUD_XENO_INFECTION, STATUS_HUD_XENO_CULTIST, ID_HUD, WANTED_HUD, ORDER_HUD, XENO_HOSTILE_ACID, XENO_HOSTILE_SLOW, XENO_HOSTILE_TAG, XENO_HOSTILE_FREEZE, HUNTER_CLAN, HUNTER_HUD, FACTION_HUD, HOLOCARD_HUD)
var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us.
var/allow_gun_usage = TRUE
var/melee_allowed = TRUE
diff --git a/code/modules/mob/living/carbon/human/human_stripping.dm b/code/modules/mob/living/carbon/human/human_stripping.dm
new file mode 100644
index 0000000000..fbf6fb5ce4
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/human_stripping.dm
@@ -0,0 +1,272 @@
+GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list(
+ /datum/strippable_item/mob_item_slot/head,
+ /datum/strippable_item/mob_item_slot/back,
+ /datum/strippable_item/mob_item_slot/mask,
+ /datum/strippable_item/mob_item_slot/eyes,
+ /datum/strippable_item/mob_item_slot/r_ear,
+ /datum/strippable_item/mob_item_slot/l_ear,
+ /datum/strippable_item/mob_item_slot/jumpsuit,
+ /datum/strippable_item/mob_item_slot/suit,
+ /datum/strippable_item/mob_item_slot/gloves,
+ /datum/strippable_item/mob_item_slot/feet,
+ /datum/strippable_item/mob_item_slot/suit_storage,
+ /datum/strippable_item/mob_item_slot/id,
+ /datum/strippable_item/mob_item_slot/belt,
+ /datum/strippable_item/mob_item_slot/pocket/left,
+ /datum/strippable_item/mob_item_slot/pocket/right,
+ /datum/strippable_item/mob_item_slot/hand/left,
+ /datum/strippable_item/mob_item_slot/hand/right,
+ /datum/strippable_item/mob_item_slot/cuffs/handcuffs,
+ /datum/strippable_item/mob_item_slot/cuffs/legcuffs,
+)))
+
+/mob/living/carbon/human/proc/should_strip(mob/user)
+ if (user.pulling == src && user.grab_level == GRAB_AGGRESSIVE && (user.a_intent & INTENT_GRAB))
+ return FALSE //to not interfere with fireman carry
+ return TRUE
+
+/datum/strippable_item/mob_item_slot/head
+ key = STRIPPABLE_ITEM_HEAD
+ item_slot = SLOT_HEAD
+
+/datum/strippable_item/mob_item_slot/back
+ key = STRIPPABLE_ITEM_BACK
+ item_slot = SLOT_BACK
+
+/datum/strippable_item/mob_item_slot/mask
+ key = STRIPPABLE_ITEM_MASK
+ item_slot = SLOT_FACE
+
+/datum/strippable_item/mob_item_slot/mask/get_alternate_action(atom/source, mob/user)
+ var/obj/item/clothing/mask = get_item(source)
+ if (!istype(mask))
+ return
+ if (!ishuman(source))
+ return
+ var/mob/living/carbon/human/sourcehuman = source
+ if (istype(sourcehuman.s_store, /obj/item/tank))
+ return "toggle_internals"
+ if (istype(sourcehuman.back, /obj/item/tank))
+ return "toggle_internals"
+ if (istype(sourcehuman.belt, /obj/item/tank))
+ return "toggle_internals"
+ return
+
+/datum/strippable_item/mob_item_slot/mask/alternate_action(atom/source, mob/user)
+ if(!ishuman(source))
+ return
+ var/mob/living/carbon/human/sourcehuman = source
+ if(user.action_busy || user.is_mob_incapacitated() || !source.Adjacent(user))
+ return
+ if(MODE_HAS_TOGGLEABLE_FLAG(MODE_NO_STRIPDRAG_ENEMY) && (sourcehuman.stat == DEAD || sourcehuman.health < HEALTH_THRESHOLD_CRIT) && !sourcehuman.get_target_lock(user.faction_group))
+ to_chat(user, SPAN_WARNING("You can't toggle internals of a crit or dead member of another faction!"))
+ return
+
+ sourcehuman.attack_log += text("\[[time_stamp()]\] Has had their internals toggled by [key_name(user)]")
+ user.attack_log += text("\[[time_stamp()]\] Attempted to toggle [key_name(src)]'s' internals")
+ if(sourcehuman.internal)
+ user.visible_message(SPAN_DANGER("[user] is trying to disable [sourcehuman]'s internals"), null, null, 3)
+ else
+ user.visible_message(SPAN_DANGER("[user] is trying to enable [sourcehuman]'s internals."), null, null, 3)
+
+ if(!do_after(user, POCKET_STRIP_DELAY, INTERRUPT_ALL, BUSY_ICON_GENERIC, sourcehuman, INTERRUPT_MOVED, BUSY_ICON_GENERIC))
+ return
+
+ if(sourcehuman.internal)
+ sourcehuman.internal.add_fingerprint(user)
+ sourcehuman.internal = null
+ sourcehuman.visible_message("[sourcehuman] is no longer running on internals.", max_distance = 1)
+ return
+
+ if(!istype(sourcehuman.wear_mask, /obj/item/clothing/mask))
+ return
+
+ if(istype(sourcehuman.back, /obj/item/tank))
+ sourcehuman.internal = sourcehuman.back
+ else if(istype(sourcehuman.s_store, /obj/item/tank))
+ sourcehuman.internal = sourcehuman.s_store
+ else if(istype(sourcehuman.belt, /obj/item/tank))
+ sourcehuman.internal = sourcehuman.belt
+
+ if(!sourcehuman.internal)
+ return
+
+ sourcehuman.visible_message(SPAN_NOTICE("[sourcehuman] is now running on internals."), max_distance = 1)
+ sourcehuman.internal.add_fingerprint(user)
+
+/datum/strippable_item/mob_item_slot/eyes
+ key = STRIPPABLE_ITEM_EYES
+ item_slot = SLOT_EYES
+
+/datum/strippable_item/mob_item_slot/r_ear
+ key = STRIPPABLE_ITEM_R_EAR
+ item_slot = SLOT_EAR
+
+/datum/strippable_item/mob_item_slot/l_ear
+ key = STRIPPABLE_ITEM_L_EAR
+ item_slot = SLOT_EAR
+
+/datum/strippable_item/mob_item_slot/jumpsuit
+ key = STRIPPABLE_ITEM_JUMPSUIT
+ item_slot = SLOT_ICLOTHING
+
+/datum/strippable_item/mob_item_slot/jumpsuit/get_alternate_action(atom/source, mob/user)
+ var/obj/item/clothing/under/uniform = get_item(source)
+ if (!istype(uniform))
+ return null
+ return uniform?.accessories ? "remove_accessory" : null
+
+/datum/strippable_item/mob_item_slot/jumpsuit/alternate_action(atom/source, mob/user)
+ if(!ishuman(source))
+ return
+ var/mob/living/carbon/human/sourcemob = source
+ if(user.action_busy || user.is_mob_incapacitated() || !source.Adjacent(user))
+ return
+ if(MODE_HAS_TOGGLEABLE_FLAG(MODE_NO_STRIPDRAG_ENEMY) && (sourcemob.stat == DEAD || sourcemob.health < HEALTH_THRESHOLD_CRIT) && !sourcemob.get_target_lock(user.faction_group))
+ to_chat(user, SPAN_WARNING("You can't strip a crit or dead member of another faction!"))
+ return
+ if(!sourcemob.w_uniform || !istype(sourcemob.w_uniform, /obj/item/clothing))
+ return
+
+ var/obj/item/clothing/under/uniform = sourcemob.w_uniform
+ if(!LAZYLEN(uniform.accessories))
+ return FALSE
+ var/obj/item/clothing/accessory/accessory = LAZYACCESS(uniform.accessories, 1)
+ if(LAZYLEN(uniform.accessories) > 1)
+ accessory = tgui_input_list(user, "Select an accessory to remove from [uniform]", "Remove accessory", uniform.accessories)
+ if(!istype(accessory))
+ return
+ sourcemob.attack_log += text("\[[time_stamp()]\] Has had their accessory ([accessory]) removed by [key_name(user)]")
+ user.attack_log += text("\[[time_stamp()]\] Attempted to remove [key_name(sourcemob)]'s' accessory ([accessory])")
+ if(istype(accessory, /obj/item/clothing/accessory/holobadge) || istype(accessory, /obj/item/clothing/accessory/medal))
+ sourcemob.visible_message(SPAN_DANGER("[user] tears off [accessory] from [sourcemob]'s [uniform]!"), null, null, 5)
+ if(uniform == sourcemob.w_uniform)
+ uniform.remove_accessory(user, accessory)
+ return
+
+ if(HAS_TRAIT(sourcemob, TRAIT_UNSTRIPPABLE) && !sourcemob.is_mob_incapacitated()) //Can't strip the unstrippable!
+ to_chat(user, SPAN_DANGER("[sourcemob] has an unbreakable grip on their equipment!"))
+ return
+ sourcemob.visible_message(SPAN_DANGER("[user] is trying to take off \a [accessory] from [source]'s [uniform]!"), null, null, 5)
+
+ if(!do_after(user, sourcemob.get_strip_delay(user, sourcemob), INTERRUPT_ALL, BUSY_ICON_GENERIC, sourcemob, INTERRUPT_MOVED, BUSY_ICON_GENERIC))
+ return
+
+ if(uniform != sourcemob.w_uniform)
+ return
+
+ uniform.remove_accessory(user, accessory)
+
+/datum/strippable_item/mob_item_slot/suit
+ key = STRIPPABLE_ITEM_SUIT
+ item_slot = SLOT_OCLOTHING
+
+/datum/strippable_item/mob_item_slot/suit/has_no_item_alt_action()
+ return TRUE
+
+/datum/strippable_item/mob_item_slot/suit/get_alternate_action(atom/source, mob/user)
+ if(!ishuman(source))
+ return
+ var/mob/living/carbon/human/sourcemob = source
+ for(var/bodypart in list("l_leg","r_leg","l_arm","r_arm","r_hand","l_hand","r_foot","l_foot","chest","head","groin"))
+ var/obj/limb/limb = sourcemob.get_limb(bodypart)
+ if(limb && (limb.status & LIMB_SPLINTED))
+ return "remove_splints"
+ return
+
+/datum/strippable_item/mob_item_slot/suit/alternate_action(atom/source, mob/user)
+ if(!ishuman(source))
+ return
+ var/mob/living/carbon/human/sourcemob = source
+ if(user.action_busy || user.is_mob_incapacitated() || !source.Adjacent(user))
+ return
+ if(MODE_HAS_TOGGLEABLE_FLAG(MODE_NO_STRIPDRAG_ENEMY) && (sourcemob.stat == DEAD || sourcemob.health < HEALTH_THRESHOLD_CRIT) && !sourcemob.get_target_lock(user.faction_group))
+ to_chat(user, SPAN_WARNING("You can't remove splints of a crit or dead member of another faction!"))
+ return
+ sourcemob.attack_log += text("\[[time_stamp()]\] Has had their splints removed by [key_name(user)]")
+ user.attack_log += text("\[[time_stamp()]\] Attempted to remove [key_name(sourcemob)]'s' splints ")
+ sourcemob.remove_splints(user)
+
+/datum/strippable_item/mob_item_slot/gloves
+ key = STRIPPABLE_ITEM_GLOVES
+ item_slot = SLOT_HANDS
+
+/datum/strippable_item/mob_item_slot/feet
+ key = STRIPPABLE_ITEM_FEET
+ item_slot = SLOT_FEET
+
+/datum/strippable_item/mob_item_slot/suit_storage
+ key = STRIPPABLE_ITEM_SUIT_STORAGE
+ item_slot = SLOT_SUIT_STORE
+
+/datum/strippable_item/mob_item_slot/id
+ key = STRIPPABLE_ITEM_ID
+ item_slot = SLOT_ID
+
+/datum/strippable_item/mob_item_slot/id/get_alternate_action(atom/source, mob/user)
+ var/obj/item/card/id/dogtag/tag = get_item(source)
+ if(!ishuman(source))
+ return
+ var/mob/living/carbon/human/sourcemob = source
+ if (!istype(tag))
+ return
+ if (!sourcemob.undefibbable && (!skillcheck(user, SKILL_POLICE, SKILL_POLICE_SKILLED) || sourcemob.stat != DEAD))
+ return
+ return tag.dogtag_taken ? null : "retrieve_tag"
+
+/datum/strippable_item/mob_item_slot/id/alternate_action(atom/source, mob/user)
+ if(!ishuman(source))
+ return
+ var/mob/living/carbon/human/sourcemob = source
+ if(user.action_busy || user.is_mob_incapacitated() || !source.Adjacent(user))
+ return
+ if(MODE_HAS_TOGGLEABLE_FLAG(MODE_NO_STRIPDRAG_ENEMY) && (sourcemob.stat == DEAD || sourcemob.health < HEALTH_THRESHOLD_CRIT) && !sourcemob.get_target_lock(user.faction_group))
+ to_chat(user, SPAN_WARNING("You can't strip a crit or dead member of another faction!"))
+ return
+ if(!istype(sourcemob.wear_id, /obj/item/card/id/dogtag))
+ return
+ if (!sourcemob.undefibbable && !skillcheck(user, SKILL_POLICE, SKILL_POLICE_SKILLED))
+ return
+ var/obj/item/card/id/dogtag/tag = sourcemob.wear_id
+ if(tag.dogtag_taken)
+ to_chat(user, SPAN_WARNING("Someone's already taken [sourcemob]'s information tag."))
+ return
+
+ if(sourcemob.stat != DEAD)
+ to_chat(user, SPAN_WARNING("You can't take a dogtag's information tag while its owner is alive."))
+ return
+
+ to_chat(user, SPAN_NOTICE("You take [sourcemob]'s information tag, leaving the ID tag"))
+ tag.dogtag_taken = TRUE
+ tag.icon_state = "dogtag_taken"
+ var/obj/item/dogtag/newtag = new(sourcemob.loc)
+ newtag.fallen_names = list(tag.registered_name)
+ newtag.fallen_assgns = list(tag.assignment)
+ newtag.fallen_blood_types = list(tag.blood_type)
+ user.put_in_hands(newtag)
+
+
+
+/datum/strippable_item/mob_item_slot/belt
+ key = STRIPPABLE_ITEM_BELT
+ item_slot = SLOT_WAIST
+
+/datum/strippable_item/mob_item_slot/pocket/left
+ key = STRIPPABLE_ITEM_LPOCKET
+ item_slot = SLOT_STORE
+
+/datum/strippable_item/mob_item_slot/pocket/right
+ key = STRIPPABLE_ITEM_RPOCKET
+ item_slot = SLOT_STORE
+
+/datum/strippable_item/mob_item_slot/hand/left
+ key = STRIPPABLE_ITEM_LHAND
+
+/datum/strippable_item/mob_item_slot/hand/right
+ key = STRIPPABLE_ITEM_RHAND
+
+/datum/strippable_item/mob_item_slot/cuffs/handcuffs
+ key = STRIPPABLE_ITEM_HANDCUFFS
+
+/datum/strippable_item/mob_item_slot/cuffs/legcuffs
+ key = STRIPPABLE_ITEM_LEGCUFFS
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 22deabce45..871a2cd376 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -504,68 +504,6 @@
/// Final result is overall delay * speed multiplier
return target_delay * user_speed
-/mob/living/carbon/human/stripPanelUnequip(obj/item/interact_item, mob/target_mob, slot_to_process)
- if(HAS_TRAIT(target_mob, TRAIT_UNSTRIPPABLE) && !target_mob.is_mob_incapacitated()) //Can't strip the unstrippable!
- to_chat(src, SPAN_DANGER("[target_mob] has an unbreakable grip on their equipment!"))
- return
- if(interact_item.flags_item & ITEM_ABSTRACT)
- return
- if(interact_item.flags_item & NODROP)
- to_chat(src, SPAN_WARNING("You can't remove \the [interact_item.name], it appears to be stuck!"))
- return
- if(interact_item.flags_inventory & CANTSTRIP)
- to_chat(src, SPAN_WARNING("You're having difficulty removing \the [interact_item.name]."))
- return
- target_mob.attack_log += "\[[time_stamp()]\] Has had their [interact_item.name] ([slot_to_process]) attempted to be removed by [key_name(src)]"
- attack_log += "\[[time_stamp()]\] Attempted to remove [key_name(target_mob)]'s [interact_item.name] ([slot_to_process])"
- log_interact(src, target_mob, "[key_name(src)] tried to remove [key_name(target_mob)]'s [interact_item.name] ([slot_to_process]).")
-
- src.visible_message(SPAN_DANGER("[src] tries to remove [target_mob]'s [interact_item.name]."), \
- SPAN_DANGER("You are trying to remove [target_mob]'s [interact_item.name]."), null, 5)
- interact_item.add_fingerprint(src)
- if(do_after(src, get_strip_delay(src, target_mob), INTERRUPT_ALL, BUSY_ICON_GENERIC, target_mob, INTERRUPT_MOVED, BUSY_ICON_GENERIC))
- if(interact_item && Adjacent(target_mob) && interact_item == target_mob.get_item_by_slot(slot_to_process))
- target_mob.drop_inv_item_on_ground(interact_item)
- log_interact(src, target_mob, "[key_name(src)] removed [key_name(target_mob)]'s [interact_item.name] ([slot_to_process]) successfully.")
-
- if(target_mob)
- if(interactee == target_mob && Adjacent(target_mob))
- target_mob.show_inv(src)
-
-
-/mob/living/carbon/human/stripPanelEquip(obj/item/interact_item, mob/target_mob, slot_to_process)
- if(HAS_TRAIT(target_mob, TRAIT_UNSTRIPPABLE) && !target_mob.is_mob_incapacitated())
- to_chat(src, SPAN_DANGER("[target_mob] is too strong to force [interact_item.name] onto them!"))
- return
- if(interact_item && !(interact_item.flags_item & ITEM_ABSTRACT))
- if(interact_item.flags_item & NODROP)
- to_chat(src, SPAN_WARNING("You can't put \the [interact_item.name] on [target_mob], it's stuck to your hand!"))
- return
- if(interact_item.flags_inventory & CANTSTRIP)
- to_chat(src, SPAN_WARNING("You're having difficulty putting \the [interact_item.name] on [target_mob]."))
- return
- if(interact_item.flags_item & WIELDED)
- interact_item.unwield(src)
- if(!interact_item.mob_can_equip(target_mob, slot_to_process, TRUE))
- to_chat(src, SPAN_WARNING("You can't put \the [interact_item.name] on [target_mob]!"))
- return
- visible_message(SPAN_NOTICE("[src] tries to put \the [interact_item.name] on [target_mob]."), null, null, 5)
- if(do_after(src, get_strip_delay(src, target_mob), INTERRUPT_ALL, BUSY_ICON_GENERIC, target_mob, INTERRUPT_MOVED, BUSY_ICON_GENERIC))
- if(interact_item == get_active_hand() && !target_mob.get_item_by_slot(slot_to_process) && Adjacent(target_mob))
- if(interact_item.flags_item & WIELDED) //to prevent re-wielding it during the do_after
- interact_item.unwield(src)
- if(interact_item.mob_can_equip(target_mob, slot_to_process, TRUE))//Placing an item on the mob
- drop_inv_item_on_ground(interact_item)
- if(interact_item && !QDELETED(interact_item)) //Might be self-deleted?
- target_mob.equip_to_slot_if_possible(interact_item, slot_to_process, 1, 0, 1, 1)
- if(ishuman(target_mob) && target_mob.stat == DEAD)
- var/mob/living/carbon/human/human_target = target_mob
- human_target.disable_lights() // take that powergamers -spookydonut
-
- if(target_mob)
- if(interactee == target_mob && Adjacent(target_mob))
- target_mob.show_inv(src)
-
/mob/living/carbon/human/drop_inv_item_on_ground(obj/item/I, nomoveupdate, force)
remember_dropped_object(I)
return ..()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index be1c7833c5..1a43138421 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -88,3 +88,10 @@
if(!client && !mind && species)
species.handle_npc(src)
+
+/mob/living/carbon/human/set_stat(new_stat)
+ . = ..()
+ // Temporarily force triggering HUD updates so they apply immediately rather than on Life tick.
+ // Remove this once effects have been ported to trait signals (blinded, dazed, etc)
+ if(stat != .)
+ handle_regular_hud_updates()
diff --git a/code/modules/mob/living/carbon/human/life/handle_disabilities.dm b/code/modules/mob/living/carbon/human/life/handle_disabilities.dm
index 77358ca45b..2d7498f531 100644
--- a/code/modules/mob/living/carbon/human/life/handle_disabilities.dm
+++ b/code/modules/mob/living/carbon/human/life/handle_disabilities.dm
@@ -1,42 +1,7 @@
//Refer to life.dm for caller
/mob/living/carbon/human/proc/handle_disabilities()
-
- if(disabilities & EPILEPSY)
- if(prob(1) && !HAS_TRAIT(src, TRAIT_KNOCKEDOUT))
- visible_message(SPAN_DANGER("\The [src] starts having a seizure!"), \
- SPAN_DANGER("You start having a seizure!"), null, 5)
- apply_effect(10, PARALYZE)
- make_jittery(1000)
- return
-
- if(disabilities & COUGHING)
- if(prob(5) && !HAS_TRAIT(src, TRAIT_KNOCKEDOUT))
- drop_held_item()
- INVOKE_ASYNC(src, PROC_REF(emote), "cough")
- return
-
- if(disabilities & TOURETTES)
- speech_problem_flag = TRUE
- if((prob(10) && !HAS_TRAIT(src, TRAIT_KNOCKEDOUT)))
- apply_effect(10, STUN)
- spawn()
- switch(rand(1, 3))
- if(1)
- emote("twitch")
- if(2 to 3)
- say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]")
- var/old_x = pixel_x
- var/old_y = pixel_y
- pixel_x += rand(-2, 2)
- pixel_y += rand(-1, 1)
- sleep(2)
- pixel_x = old_x
- pixel_y = old_y
- return
-
if(disabilities & NERVOUS)
- speech_problem_flag = TRUE
if(prob(10))
stuttering = max(10, stuttering)
return
diff --git a/code/modules/mob/living/carbon/human/life/handle_regular_hud_updates.dm b/code/modules/mob/living/carbon/human/life/handle_regular_hud_updates.dm
index 5d706518f5..b84c8e9d24 100644
--- a/code/modules/mob/living/carbon/human/life/handle_regular_hud_updates.dm
+++ b/code/modules/mob/living/carbon/human/life/handle_regular_hud_updates.dm
@@ -60,10 +60,6 @@
else
clear_fullscreen("blind")
- if(dazed)
- overlay_fullscreen("eye_blurry", /atom/movable/screen/fullscreen/impaired, 5)
- else
- clear_fullscreen("eye_blurry")
///Pain should override the SetEyeBlur(0) should the pain be painful enough to cause eyeblur in the first place. Also, peepers is essential to make sure eye damage isn't overriden.
var/datum/internal_organ/eyes/peepers = internal_organs_by_name["eyes"]
if((disabilities & NEARSIGHTED) && !HAS_TRAIT(src, TRAIT_NEARSIGHTED_EQUIPMENT) && pain.current_pain < 80 && peepers.organ_status == ORGAN_HEALTHY)
@@ -163,6 +159,12 @@
interactee.check_eye(src)
return TRUE
+/mob/living/carbon/human/on_dazed_trait_gain(datum/source)
+ . = ..()
+ overlay_fullscreen("eye_blurry", /atom/movable/screen/fullscreen/impaired, 5)
+/mob/living/carbon/human/on_dazed_trait_loss(datum/source)
+ . = ..()
+ clear_fullscreen("eye_blurry")
/mob/living/carbon/human/proc/check_status_effects()
var/status_effect_placement = 1
diff --git a/code/modules/mob/living/carbon/human/life/handle_regular_status_updates.dm b/code/modules/mob/living/carbon/human/life/handle_regular_status_updates.dm
index 41554f0567..5b37238d28 100644
--- a/code/modules/mob/living/carbon/human/life/handle_regular_status_updates.dm
+++ b/code/modules/mob/living/carbon/human/life/handle_regular_status_updates.dm
@@ -53,12 +53,11 @@
if(!already_in_crit)
new /datum/effects/crit/human(src)
- if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT))
+ if(IsKnockOut())
blinded = TRUE
if(regular_update && halloss > 0)
apply_damage(-3, HALLOSS)
else if(sleeping)
- speech_problem_flag = TRUE
if(regular_update)
handle_dreams()
apply_damage(-3, HALLOSS)
@@ -100,13 +99,14 @@
AdjustEarDeafness(-1)
- if(!ear_deaf && client && client.soundOutput)
- client.soundOutput.status_flags ^= EAR_DEAF_MUTE
- client.soundOutput.apply_status()
-
else if(ear_damage)
ear_damage = max(ear_damage - 0.05, 0)
+ // This should be done only on updates abvoe, or even better in the AdjsutEarDeafnes handlers
+ if(!ear_deaf && (client?.soundOutput?.status_flags & EAR_DEAF_MUTE))
+ client.soundOutput.status_flags ^= EAR_DEAF_MUTE
+ client.soundOutput.apply_status()
+
//Resting
if(resting)
dizziness = max(0, dizziness - 15)
@@ -121,7 +121,6 @@
handle_statuses()
if(paralyzed)
- speech_problem_flag = TRUE
apply_effect(1, WEAKEN)
silent = 1
blinded = TRUE
diff --git a/code/modules/mob/living/carbon/human/life/handle_stasis_bag.dm b/code/modules/mob/living/carbon/human/life/handle_stasis_bag.dm
index 16d9955395..43c757fabb 100644
--- a/code/modules/mob/living/carbon/human/life/handle_stasis_bag.dm
+++ b/code/modules/mob/living/carbon/human/life/handle_stasis_bag.dm
@@ -4,9 +4,9 @@
//Handle side effects from stasis
switch(in_stasis)
if(STASIS_IN_BAG)
- // I hate whoever wrote this and statuses with a passion
- knocked_down = knocked_down? --knocked_down : knocked_down + 10 //knocked_down set.
- if(knocked_down <= 0)
- knocked_down_callback()
+ // At least 6 seconds, but reduce by 2s every time - IN ADDITION to normal recovery
+ // Don't ask me why and feel free to change it
+ KnockDown(3)
+ AdjustKnockDown(-1)
if(STASIS_IN_CRYO_CELL)
if(sleeping < 10) sleeping += 10 //Puts the mob to sleep indefinitely.
diff --git a/code/modules/mob/living/carbon/human/life/life_helpers.dm b/code/modules/mob/living/carbon/human/life/life_helpers.dm
index 25f020a9f8..cab3ae21a7 100644
--- a/code/modules/mob/living/carbon/human/life/life_helpers.dm
+++ b/code/modules/mob/living/carbon/human/life/life_helpers.dm
@@ -187,93 +187,32 @@
if(G.lighting_alpha < lighting_alpha)
lighting_alpha = G.lighting_alpha
-/mob/living/carbon/human/handle_silent()
- if(..())
- speech_problem_flag = TRUE
- return silent
-
-/mob/living/carbon/human/handle_slurring()
- if(..())
- speech_problem_flag = TRUE
- return slurring
-
-/mob/living/carbon/human/handle_stunned()
- if(stunned)
- adjust_effect(-species.stun_reduction, STUN, EFFECT_FLAG_LIFE)
- speech_problem_flag = TRUE
- return stunned
-
-/mob/living/carbon/human/handle_dazed()
- if(dazed)
- var/skill_resistance = skills ? (skills.get_skill_level(SKILL_ENDURANCE)-1)*0.1 : 0
-
- var/final_reduction = skill_resistance + 1
- adjust_effect(-final_reduction, DAZE, EFFECT_FLAG_LIFE)
- if(dazed)
- speech_problem_flag = TRUE
- return dazed
-
-/mob/living/carbon/human/handle_knocked_down()
- if(knocked_down)
- var/species_resistance = species.knock_down_reduction
- var/skill_resistance = skills ? (skills.get_skill_level(SKILL_ENDURANCE)-1)*0.1 : 0
-
- var/final_reduction = species_resistance + skill_resistance
- adjust_effect(-final_reduction, WEAKEN, EFFECT_FLAG_LIFE)
- knocked_down_callback_check()
- return knocked_down
-
-/mob/living/carbon/human/handle_knocked_out()
- if(knocked_out)
- var/species_resistance = species.knock_out_reduction
- var/skill_resistance = skills ? (skills.get_skill_level(SKILL_ENDURANCE)-1)*0.1 : 0
-
- var/final_reduction = species_resistance + skill_resistance
- adjust_effect(-final_reduction, PARALYZE, EFFECT_FLAG_LIFE)
- knocked_out_callback_check()
- return knocked_out
-
-/mob/living/carbon/human/handle_stuttering()
- if(..())
- speech_problem_flag = TRUE
- return stuttering
-
#define HUMAN_TIMER_TO_EFFECT_CONVERSION (0.05) //(1/20) //once per 2 seconds, with effect equal to endurance, which is used later
-// This is here because sometimes our stun comes too early and tick is about to start, so we need to compensate
-// this is the best place to do it, tho name might be a bit misleading I guess
-/mob/living/carbon/human/stun_clock_adjustment()
- var/species_resistance = species.knock_down_reduction
- var/skill_resistance = skills ? (skills.get_skill_level(SKILL_ENDURANCE)-1)*0.1 : 0
-
- var/final_reduction = species_resistance + skill_resistance
- var/shift_left = (SShuman.next_fire - world.time) * HUMAN_TIMER_TO_EFFECT_CONVERSION * final_reduction
- if(stunned > shift_left)
- stunned += SShuman.wait * HUMAN_TIMER_TO_EFFECT_CONVERSION * final_reduction - shift_left
-
-/mob/living/carbon/human/knockdown_clock_adjustment()
- if(!species)
- return FALSE
-
- var/species_resistance = species.knock_down_reduction
- var/skill_resistance = skills ? (skills.get_skill_level(SKILL_ENDURANCE)-1)*0.1 : 0
-
- var/final_reduction = species_resistance + skill_resistance
- var/shift_left = (SShuman.next_fire - world.time) * HUMAN_TIMER_TO_EFFECT_CONVERSION * final_reduction
- if(knocked_down > shift_left)
- knocked_down += SShuman.wait * HUMAN_TIMER_TO_EFFECT_CONVERSION * final_reduction - shift_left
-
-/mob/living/carbon/human/knockout_clock_adjustment()
- if(!species)
- return FALSE
-
- var/species_resistance = species.knock_out_reduction
- var/skill_resistance = skills ? (skills.get_skill_level(SKILL_ENDURANCE)-1)*0.1 : 0
+/mob/living/carbon/human/GetStunDuration(amount)
+ . = ..()
+ var/skill_resistance = skills ? (skills.get_skill_level(SKILL_ENDURANCE)-1)*0.08 : 0
+ var/final_reduction = (1 - skill_resistance) / species.stun_reduction
+ return . * final_reduction
+
+/mob/living/carbon/human/GetKnockDownDuration(amount)
+ . = ..()
+ var/skill_resistance = skills ? (skills.get_skill_level(SKILL_ENDURANCE)-1)*0.08 : 0
+ var/final_reduction = (1 - skill_resistance) / species.knock_down_reduction
+ return . * final_reduction
+
+/mob/living/carbon/human/GetKnockOutDuration(amount)
+ . = ..()
+ var/skill_resistance = skills ? (skills.get_skill_level(SKILL_ENDURANCE)-1)*0.08 : 0
+ var/final_reduction = (1 - skill_resistance) / species.knock_out_reduction
+ return . * final_reduction
+
+/mob/living/carbon/human/GetDazeDuration(amount)
+ . = ..()
+ var/skill_resistance = skills ? (skills.get_skill_level(SKILL_ENDURANCE)-1)*0.08 : 0
+ var/final_reduction = (1 - skill_resistance)
+ return . * final_reduction
- var/final_reduction = species_resistance + skill_resistance
- var/shift_left = (SShuman.next_fire - world.time) * HUMAN_TIMER_TO_EFFECT_CONVERSION * final_reduction
- if(knocked_out > shift_left)
- knocked_out += SShuman.wait * HUMAN_TIMER_TO_EFFECT_CONVERSION * final_reduction - shift_left
/mob/living/carbon/human/proc/handle_revive()
SEND_SIGNAL(src, COMSIG_HUMAN_REVIVED)
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 28e45dcb2f..b41cd8207a 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -115,12 +115,9 @@
message = capitalize(trim(message))
message = process_chat_markup(message, list("~", "_"))
- if(speech_problem_flag)
- var/list/handle_r = handle_speech_problems(message)
- message = handle_r[1]
- verb = handle_r[2]
- speech_problem_flag = handle_r[3]
-
+ var/list/handle_r = handle_speech_problems(message)
+ message = handle_r[1]
+ verb = handle_r[2]
if(!message)
return
@@ -260,40 +257,25 @@ for it but just ignore it.
return verb
/mob/living/carbon/human/proc/handle_speech_problems(message)
- var/list/returns[3]
+ var/list/returns[2]
var/verb = "says"
- var/handled = FALSE
if(silent)
message = ""
- handled = TRUE
if(sdisabilities & DISABILITY_MUTE)
message = ""
- handled = TRUE
- if(wear_mask)
- if(istype(wear_mask, /obj/item/clothing/mask/horsehead))
- var/obj/item/clothing/mask/horsehead/hoers = wear_mask
- if(hoers.voicechange)
- message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
- verb = pick("whinnies","neighs", "says")
- handled = TRUE
-
var/braindam = getBrainLoss()
- if(slurring || stuttering || dazed || braindam >= 60)
+ if(slurring || stuttering || HAS_TRAIT(src, TRAIT_DAZED) || braindam >= 60)
msg_admin_niche("[key_name(src)] stuttered while saying: \"[message]\"") //Messages that get modified by the 4 reasons below have their original message logged too
if(slurring)
message = slur(message)
verb = pick("stammers","stutters")
- handled = TRUE
if(stuttering)
message = NewStutter(message)
verb = pick("stammers", "stutters")
- handled = TRUE
- if(dazed)
+ if(HAS_TRAIT(src, TRAIT_DAZED))
message = DazedText(message)
verb = pick("mumbles", "babbles")
- handled = TRUE
if(braindam >= 60)
- handled = TRUE
if(prob(braindam/4))
message = stutter(message, stuttering)
verb = pick("stammers", "stutters")
@@ -301,7 +283,6 @@ for it but just ignore it.
message = uppertext(message)
verb = pick("yells like an idiot","says rather loudly")
if(HAS_TRAIT(src, TRAIT_LISPING))
- handled = TRUE
var/old_message = message
message = lisp_replace(message)
if(old_message != message)
@@ -309,8 +290,6 @@ for it but just ignore it.
returns[1] = message
returns[2] = verb
- returns[3] = handled
-
return returns
/mob/living/carbon/human/hear_apollo()
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index da14b0f88f..ea398672bc 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -93,9 +93,12 @@
"eyes" = /datum/internal_organ/eyes
)
- var/knock_down_reduction = 1 //how much the knocked_down effect is reduced per Life call.
- var/stun_reduction = 1 //how much the stunned effect is reduced per Life call.
- var/knock_out_reduction = 1 //same thing
+ /// Factor of reduction of KnockDown duration.
+ var/knock_down_reduction = 1
+ /// Factor of reduction of Stun duration.
+ var/stun_reduction = 1
+ /// Factor of reduction of KnockOut duration.
+ var/knock_out_reduction = 1
/// If different from 1, a signal is registered on post_spawn().
var/weed_slowdown_mult = 1
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 2952aa7197..990f53e639 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -225,22 +225,6 @@ There are several things that need to be remembered:
overlays_standing[HAIR_LAYER] = hair_s
apply_overlay(HAIR_LAYER)
-//Call when target overlay should be added/removed
-/mob/living/carbon/human/update_targeted()
- remove_overlay(TARGETED_LAYER)
-
- var/image/holo_card_image
-
- if(holo_card_color)
- holo_card_image = image("icon" = 'icons/effects/Targeted.dmi', "icon_state" = "holo_card_[holo_card_color]")
-
- if(!holo_card_image)
- return
-
- holo_card_image.layer = -TARGETED_LAYER
- overlays_standing[TARGETED_LAYER] = holo_card_image
- apply_overlay(TARGETED_LAYER)
-
//Call when someone is gauzed or splinted, or when one of those items are removed
/mob/living/carbon/human/update_med_icon()
remove_overlay(MEDICAL_LAYER)
diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm
index 97bf25e089..e5673817b2 100644
--- a/code/modules/mob/living/carbon/inventory.dm
+++ b/code/modules/mob/living/carbon/inventory.dm
@@ -4,11 +4,18 @@
if(handcuffed)
drop_held_items()
stop_pulling()
+ throw_alert(ALERT_HANDCUFFED, /atom/movable/screen/alert/restrained/handcuffed, new_master = handcuffed)
+ else
+ clear_alert(ALERT_HANDCUFFED)
update_inv_handcuffed()
+
/mob/living/carbon/proc/legcuff_update()
if(legcuffed)
set_movement_intent(MOVE_INTENT_WALK)
+ throw_alert(ALERT_LEGCUFFED, /atom/movable/screen/alert/restrained/legcuffed, new_master = handcuffed)
+ else
+ clear_alert(ALERT_LEGCUFFED)
update_inv_legcuffed()
diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm
index 49bb644b40..d00b08f183 100644
--- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm
+++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm
@@ -261,10 +261,6 @@
move_delay = .
-
-/mob/living/carbon/xenomorph/show_inv(mob/user)
- return
-
/mob/living/carbon/xenomorph/proc/pounced_mob(mob/living/L)
// This should only be called back by a mob that has pounce, so no need to check
var/datum/action/xeno_action/activable/pounce/pounceAction = get_xeno_action_by_type(src, /datum/action/xeno_action/activable/pounce)
@@ -284,7 +280,8 @@
if(H.check_shields(15, "the pounce")) //Human shield block.
visible_message(SPAN_DANGER("[src] slams into [H]!"),
SPAN_XENODANGER("You slam into [H]!"), null, 5)
- apply_effect(1, WEAKEN)
+ KnockDown(1)
+ Stun(1)
throwing = FALSE //Reset throwing manually.
playsound(H, "bonk", 75, FALSE) //bonk
return
@@ -299,13 +296,15 @@
else if(prob(75)) //Body slam the fuck out of xenos jumping at your front.
visible_message(SPAN_DANGER("[H] body slams [src]!"),
SPAN_XENODANGER("[H] body slams you!"), null, 5)
- apply_effect(3, WEAKEN)
+ KnockDown(3)
+ Stun(3)
throwing = FALSE
return
if(issynth(H) && prob(80))
visible_message(SPAN_DANGER("[H] withstands being pounced and slams down [src]!"),
SPAN_XENODANGER("[H] throws you down after withstanding the pounce!"), null, 5)
- apply_effect(3.5, WEAKEN)
+ KnockDown(3.5)
+ Stun(3.5)
throwing = FALSE
return
@@ -313,7 +312,8 @@
visible_message(SPAN_DANGER("[src] [pounceAction.ability_name] onto [M]!"), SPAN_XENODANGER("You [pounceAction.ability_name] onto [M]!"), null, 5)
if (pounceAction.knockdown)
- M.apply_effect(pounceAction.knockdown_duration, WEAKEN)
+ M.KnockDown(pounceAction.knockdown_duration)
+ M.Stun(pounceAction.knockdown_duration) // To replicate legacy behavior. Otherwise M39 Armbrace users for example can still shoot
step_to(src, M)
if (pounceAction.freeze_self)
diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm
index 33ed75f36e..f27616508d 100644
--- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm
+++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm
@@ -253,13 +253,8 @@
var/pounce_distance = 0
// Life reduction variables.
- var/life_stun_reduction = -1.5
- var/life_knockdown_reduction = -1.5
- var/life_knockout_reduction = -1.5
- var/life_daze_reduction = -1.5
var/life_slow_reduction = -1.5
-
//////////////////////////////////////////////////////////////////
//
// Misc. State - poorly modularized
@@ -802,6 +797,11 @@
var/datum/mob_hud/MH = huds[MOB_HUD_XENO_INFECTION]
MH.add_hud_to(src, src)
+// Transfer any observing players over to the xeno's new body (`target`) on evolve/de-evolve.
+/mob/living/carbon/xenomorph/transfer_observers_to(atom/target)
+ for(var/mob/dead/observer/observer as anything in observers)
+ observer.clean_observe_target()
+ observer.do_observe(target)
/mob/living/carbon/xenomorph/check_improved_pointing()
//xeno leaders get a big arrow and less cooldown
@@ -1117,8 +1117,3 @@
SPAN_WARNING("You squeeze and scuttle underneath [current_structure]."), max_distance = 2)
forceMove(current_structure.loc)
return TRUE
-
-/mob/living/carbon/xenomorph/knocked_down_callback()
- . = ..()
- if(!resting) // !resting because we dont wanna prematurely update wounds if they're just trying to rest
- update_wounds()
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm
index a91f898e9b..ac9bc1912b 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm
@@ -424,10 +424,12 @@
/// remove hide and apply modified attack cooldown
/datum/action/xeno_action/onclick/xenohide/proc/post_attack()
var/mob/living/carbon/xenomorph/xeno = owner
+ UnregisterSignal(xeno, COMSIG_MOB_STATCHANGE)
if(xeno.layer == XENO_HIDING_LAYER)
xeno.layer = initial(xeno.layer)
button.icon_state = "template"
xeno.update_wounds()
+ xeno.update_layer()
apply_cooldown(4) //2 second cooldown after attacking
/datum/action/xeno_action/onclick/xenohide/give_to(mob/living/living_mob)
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm
index 958e0f7a2f..58c3e56738 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm
@@ -67,7 +67,7 @@
xeno.visible_message(SPAN_XENONOTICE("\The [xeno] regurgitates a pulsating node and plants it on the ground!"), \
SPAN_XENONOTICE("You regurgitate a pulsating node and plant it on the ground!"), null, 5)
- var/obj/effect/alien/weeds/node/new_node = new node_type(xeno.loc, src, xeno)
+ var/obj/effect/alien/weeds/node/new_node = new node_type(xeno.loc, xeno.hivenumber, xeno)
if(to_convert)
for(var/cur_weed in to_convert)
@@ -513,14 +513,21 @@
xeno.layer = XENO_HIDING_LAYER
to_chat(xeno, SPAN_NOTICE("You are now hiding."))
button.icon_state = "template_active"
+ RegisterSignal(xeno, COMSIG_MOB_STATCHANGE, PROC_REF(unhide_on_stat))
else
xeno.layer = initial(xeno.layer)
to_chat(xeno, SPAN_NOTICE("You have stopped hiding."))
button.icon_state = "template"
+ UnregisterSignal(xeno, COMSIG_MOB_STATCHANGE)
xeno.update_wounds()
apply_cooldown()
return ..()
+/datum/action/xeno_action/onclick/xenohide/proc/unhide_on_stat(mob/living/carbon/xenomorph/source, new_stat, old_stat)
+ SIGNAL_HANDLER
+ if(new_stat >= UNCONSCIOUS && old_stat <= UNCONSCIOUS)
+ post_attack()
+
/datum/action/xeno_action/onclick/place_trap/use_ability(atom/A)
var/mob/living/carbon/xenomorph/X = owner
if(!X.check_state())
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm
index c2862c7762..e876d97c4d 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm
@@ -347,7 +347,7 @@
// Negative stat effects
if (debilitate)
- carbon.dazed += daze_amount
+ carbon.AdjustDaze(daze_amount)
apply_cooldown()
return ..()
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_abilities.dm
index bd6e2bb8d0..107e6a1984 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_abilities.dm
@@ -24,7 +24,7 @@
// Configurables
var/fling_distance = 4
- var/stun_power = 0
+ var/stun_power = 0.5
var/weaken_power = 0.5
var/slowdown = 2
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_powers.dm
index e262e28b71..6c354fde7b 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_powers.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_powers.dm
@@ -94,9 +94,9 @@
woyer.visible_message(SPAN_XENOWARNING("\The [woyer] effortlessly flings [carbone] to the side!"), SPAN_XENOWARNING("You effortlessly fling [carbone] to the side!"))
playsound(carbone,'sound/weapons/alien_claw_block.ogg', 75, 1)
if(stun_power)
- carbone.apply_effect(get_xeno_stun_duration(carbone, stun_power), STUN)
+ carbone.Stun(get_xeno_stun_duration(carbone, stun_power))
if(weaken_power)
- carbone.apply_effect(weaken_power, WEAKEN)
+ carbone.KnockDown(get_xeno_stun_duration(carbone, weaken_power))
if(slowdown)
if(carbone.slowed < slowdown)
carbone.apply_effect(slowdown, SLOW)
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/xeno_action.dm b/code/modules/mob/living/carbon/xenomorph/abilities/xeno_action.dm
index 289e0f1bfa..59c9bf9d9e 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/xeno_action.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/xeno_action.dm
@@ -82,7 +82,7 @@
if(!owner)
return FALSE
var/mob/living/carbon/xenomorph/X = owner
- if(X && !X.is_mob_incapacitated() && !X.dazed && X.body_position == STANDING_UP && !X.buckled && X.plasma_stored >= plasma_cost)
+ if(X && !X.is_mob_incapacitated() && !HAS_TRAIT(X, TRAIT_DAZED) && X.body_position == STANDING_UP && !X.buckled && X.plasma_stored >= plasma_cost)
return TRUE
/datum/action/xeno_action/give_to(mob/living/living_mob)
diff --git a/code/modules/mob/living/carbon/xenomorph/ai/movement/drone.dm b/code/modules/mob/living/carbon/xenomorph/ai/movement/drone.dm
index 263f354c78..cc330966f2 100644
--- a/code/modules/mob/living/carbon/xenomorph/ai/movement/drone.dm
+++ b/code/modules/mob/living/carbon/xenomorph/ai/movement/drone.dm
@@ -10,6 +10,9 @@
//drones expand the hive
/datum/xeno_ai_movement/drone/ai_move_idle(delta_time)
+ if(!GLOB.ai_xeno_weeding)
+ return ..()
+
var/mob/living/carbon/xenomorph/idle_xeno = parent
if(idle_xeno.throwing)
diff --git a/code/modules/mob/living/carbon/xenomorph/ai/xeno_ai.dm b/code/modules/mob/living/carbon/xenomorph/ai/xeno_ai.dm
index cf951007be..6e5ca5f2c1 100644
--- a/code/modules/mob/living/carbon/xenomorph/ai/xeno_ai.dm
+++ b/code/modules/mob/living/carbon/xenomorph/ai/xeno_ai.dm
@@ -8,7 +8,6 @@
var/ai_move_delay = 0
var/path_update_period = (0.5 SECONDS)
- var/no_path_found = FALSE
var/ai_range = 16
var/max_travel_distance = 24
@@ -25,9 +24,6 @@
/// The actual cooldown declaration for forceful retargeting, reference forced_retarget_time for time in between checks
COOLDOWN_DECLARE(forced_retarget_cooldown)
- /// Amount of times no path found has occured
- var/no_path_found_amount = 0
-
/// The time interval between calculating new paths if we cannot find a path
var/no_path_found_period = (2.5 SECONDS)
@@ -162,22 +158,12 @@
/mob/living/carbon/xenomorph/proc/set_path(list/path)
current_path = path
if(!path)
- no_path_found = TRUE
+ COOLDOWN_START(src, no_path_found_cooldown, no_path_found_period)
/mob/living/carbon/xenomorph/proc/move_to_next_turf(turf/T, max_range = ai_range)
if(!T)
return FALSE
- if(no_path_found)
-
- if(no_path_found_amount > 0)
- COOLDOWN_START(src, no_path_found_cooldown, no_path_found_period)
- no_path_found = FALSE
- no_path_found_amount++
- return FALSE
-
- no_path_found_amount = 0
-
if((!current_path || (next_path_generation < world.time && current_target_turf != T)) && COOLDOWN_FINISHED(src, no_path_found_cooldown))
if(!XENO_CALCULATING_PATH(src) || current_target_turf != T)
SSxeno_pathfinding.calculate_path(src, T, max_range, src, CALLBACK(src, PROC_REF(set_path)), list(src, current_target))
diff --git a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm
index 1f37113ffc..acdf30b09e 100644
--- a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm
+++ b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm
@@ -204,12 +204,14 @@
if(M.attempt_tackle(src, tackle_mult, tackle_min_offset, tackle_max_offset))
playsound(loc, 'sound/weapons/alien_knockdown.ogg', 25, 1)
- apply_effect(rand(M.tacklestrength_min, M.tacklestrength_max), WEAKEN)
+ var/strength = rand(M.tacklestrength_min, M.tacklestrength_max)
+ Stun(strength)
+ KnockDown(strength) // Purely for knockdown visuals. All the heavy lifting is done by Stun
M.visible_message(SPAN_DANGER("[M] tackles down [src]!"), \
SPAN_DANGER("You tackle down [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT)
else
playsound(loc, 'sound/weapons/alien_claw_swipe.ogg', 25, 1)
- if (HAS_TRAIT(src, TRAIT_FLOORED))
+ if (body_position == LYING_DOWN)
M.visible_message(SPAN_DANGER("[M] tries to tackle [src], but they are already down!"), \
SPAN_DANGER("You try to tackle [src], but they are already down!"), null, 5, CHAT_TYPE_XENO_COMBAT)
else
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Sentinel.dm b/code/modules/mob/living/carbon/xenomorph/castes/Sentinel.dm
index 39426b1a9e..793bc733fc 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Sentinel.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Sentinel.dm
@@ -99,5 +99,6 @@
#undef NEURO_TOUCH_DELAY
/datum/behavior_delegate/sentinel_base/proc/paralyzing_slash(mob/living/carbon/human/human_target)
- human_target.apply_effect(2, WEAKEN)
+ human_target.KnockDown(2)
+ human_target.Stun(2)
to_chat(human_target, SPAN_XENOHIGHDANGER("You fall over, paralyzed by the toxin!"))
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Warrior.dm b/code/modules/mob/living/carbon/xenomorph/castes/Warrior.dm
index 7c8edace81..3018cc1acd 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Warrior.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Warrior.dm
@@ -95,7 +95,9 @@
if(should_neckgrab && L.mob_size < MOB_SIZE_BIG)
L.drop_held_items()
- L.apply_effect(get_xeno_stun_duration(L, 2), WEAKEN)
+ var/duration = get_xeno_stun_duration(L, 2)
+ L.KnockDown(duration)
+ L.Stun(duration)
L.pulledby = src
visible_message(SPAN_XENOWARNING("\The [src] grabs [L] by the throat!"), \
SPAN_XENOWARNING("You grab [L] by the throat!"))
diff --git a/code/modules/mob/living/carbon/xenomorph/damage_procs.dm b/code/modules/mob/living/carbon/xenomorph/damage_procs.dm
index b6ceb20434..e372b03e68 100644
--- a/code/modules/mob/living/carbon/xenomorph/damage_procs.dm
+++ b/code/modules/mob/living/carbon/xenomorph/damage_procs.dm
@@ -81,6 +81,7 @@
powerfactor_value = min(powerfactor_value,20)
if(powerfactor_value > 0 && small_explosives_stun)
KnockDown(powerfactor_value/5)
+ Stun(powerfactor_value/5) // Due to legacy knockdown being considered an impairement
if(mob_size < MOB_SIZE_BIG)
Slow(powerfactor_value)
Superslow(powerfactor_value/2)
diff --git a/code/modules/mob/living/carbon/xenomorph/life.dm b/code/modules/mob/living/carbon/xenomorph/life.dm
index 05123b4d71..b5ad08e97a 100644
--- a/code/modules/mob/living/carbon/xenomorph/life.dm
+++ b/code/modules/mob/living/carbon/xenomorph/life.dm
@@ -264,11 +264,6 @@
else if(client && !client.adminobs)
reset_view(null)
- if(dazed)
- overlay_fullscreen("dazed", /atom/movable/screen/fullscreen/impaired, 5)
- else
- clear_fullscreen("dazed")
-
if(!hud_used)
return TRUE
@@ -297,6 +292,13 @@
return TRUE
+/mob/living/carbon/xenomorph/on_dazed_trait_gain(datum/source)
+ . = ..()
+ overlay_fullscreen("dazed", /atom/movable/screen/fullscreen/impaired, 5)
+/mob/living/carbon/xenomorph/on_dazed_trait_loss(datum/source)
+ . = ..()
+ clear_fullscreen("dazed")
+
/*Heal 1/70th of your max health in brute per tick. 1 as a bonus, to help smaller pools.
Additionally, recovery pheromones mutiply this base healing, up to 2.5 times faster at level 5
Modified via m, to multiply the number of wounds healed.
@@ -519,28 +521,27 @@ Make sure their actual health updates immediately.*/
else if(world.time > next_grace_time && stat == CONSCIOUS)
var/grace_time = crit_grace_time > 0 ? crit_grace_time + (1 SECONDS * max(round(warding_aura - 1), 0)) : 0
if(grace_time)
- sound_environment_override = SOUND_ENVIRONMENT_PSYCHOTIC
addtimer(CALLBACK(src, PROC_REF(handle_crit)), grace_time)
else
handle_crit()
next_grace_time = world.time + grace_time
+ blinded = stat == UNCONSCIOUS // Xenos do not go blind from other sources - still, replace that by a status_effect or trait when able
if(!gibbing)
med_hud_set_health()
/mob/living/carbon/xenomorph/proc/handle_crit()
- if(stat == DEAD || gibbing)
- return
-
- sound_environment_override = SOUND_ENVIRONMENT_NONE
- set_stat(UNCONSCIOUS)
- blinded = TRUE
- see_in_dark = 5
- if(layer != initial(layer)) //Unhide
- layer = initial(layer)
- recalculate_move_delay = TRUE
+ if(stat <= CONSCIOUS && !gibbing)
+ set_stat(UNCONSCIOUS)
SEND_SIGNAL(src, COMSIG_XENO_HANDLE_CRIT)
+/mob/living/carbon/xenomorph/set_stat(new_stat)
+ . = ..()
+ // Temporarily force triggering HUD updates so they apply immediately rather than on Life tick.
+ // Remove this once effects have been ported to trait signals (blinded, dazed, etc)
+ if(stat != .)
+ handle_regular_hud_updates()
+
/mob/living/carbon/xenomorph/proc/handle_luminosity()
var/new_luminosity = 0
if(caste)
@@ -553,12 +554,18 @@ Make sure their actual health updates immediately.*/
else
set_light_on(FALSE)
-/mob/living/carbon/xenomorph/handle_stunned()
- if(stunned)
- adjust_effect(life_stun_reduction, STUN, EFFECT_FLAG_LIFE)
- stun_callback_check()
-
- return stunned
+/mob/living/carbon/xenomorph/GetStunDuration(amount)
+ amount *= 2 / 3
+ return ..()
+/mob/living/carbon/xenomorph/GetKnockDownDuration(amount)
+ amount *= 2 / 3
+ return ..()
+/mob/living/carbon/xenomorph/GetKnockOutDuration(amount)
+ amount *= 2 / 3
+ return ..()
+/mob/living/carbon/xenomorph/GetDazeDuration(amount)
+ amount *= 2 / 3
+ return ..()
/mob/living/carbon/xenomorph/proc/handle_interference()
if(interference)
@@ -569,11 +576,6 @@ Make sure their actual health updates immediately.*/
return interference
-/mob/living/carbon/xenomorph/handle_dazed()
- if(dazed)
- adjust_effect(life_daze_reduction, DAZE, EFFECT_FLAG_LIFE)
- return dazed
-
/mob/living/carbon/xenomorph/handle_slowed()
if(slowed)
adjust_effect(life_slow_reduction, SLOW, EFFECT_FLAG_LIFE)
@@ -584,16 +586,6 @@ Make sure their actual health updates immediately.*/
adjust_effect(life_slow_reduction, SUPERSLOW, EFFECT_FLAG_LIFE)
return superslowed
-/mob/living/carbon/xenomorph/handle_knocked_down()
- if(HAS_TRAIT(src, TRAIT_FLOORED))
- adjust_effect(life_knockdown_reduction, WEAKEN, EFFECT_FLAG_LIFE)
- knocked_down_callback_check()
-
-/mob/living/carbon/xenomorph/handle_knocked_out()
- if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT))
- adjust_effect(life_knockout_reduction, PARALYZE, EFFECT_FLAG_LIFE)
- knocked_out_callback_check()
-
//Returns TRUE if xeno is on weeds
//Returns TRUE if xeno is off weeds AND doesn't need weeds for healing AND is not on Almayer UNLESS Queen is also on Almayer (aka - no solo Lurker Almayer hero)
/mob/living/carbon/xenomorph/proc/check_weeds_for_healing()
@@ -608,24 +600,3 @@ Make sure their actual health updates immediately.*/
if(hive && hive.living_xeno_queen && !is_mainship_level(hive.living_xeno_queen.loc.z) && is_mainship_level(loc.z))
return FALSE //We are on the ship, but the Queen isn't
return TRUE //we have off-weed healing, and either we're on Almayer with the Queen, or we're on non-Almayer, or the Queen is dead, good enough!
-
-
-#define XENO_TIMER_TO_EFFECT_CONVERSION (0.075) // (1.5/20) //once per 2 seconds, with 1.5 effect per that once
-
-// This is here because sometimes our stun comes too early and tick is about to start, so we need to compensate
-// this is the best place to do it, tho name might be a bit misleading I guess
-/mob/living/carbon/xenomorph/stun_clock_adjustment()
- var/shift_left = (SSxeno.next_fire - world.time) * XENO_TIMER_TO_EFFECT_CONVERSION
- if(stunned > shift_left)
- stunned += SSxeno.wait * XENO_TIMER_TO_EFFECT_CONVERSION - shift_left
-
-/mob/living/carbon/xenomorph/knockdown_clock_adjustment()
- var/shift_left = (SSxeno.next_fire - world.time) * XENO_TIMER_TO_EFFECT_CONVERSION
- if(knocked_down > shift_left)
- knocked_down += SSxeno.wait * XENO_TIMER_TO_EFFECT_CONVERSION - shift_left
-
-/mob/living/carbon/xenomorph/knockout_clock_adjustment()
- var/shift_left = (SSxeno.next_fire - world.time) * XENO_TIMER_TO_EFFECT_CONVERSION
- if(knocked_out > shift_left)
- knocked_out += SSxeno.wait * XENO_TIMER_TO_EFFECT_CONVERSION - shift_left
-
diff --git a/code/modules/mob/living/carbon/xenomorph/say.dm b/code/modules/mob/living/carbon/xenomorph/say.dm
index d1832d10b6..47e560b809 100644
--- a/code/modules/mob/living/carbon/xenomorph/say.dm
+++ b/code/modules/mob/living/carbon/xenomorph/say.dm
@@ -16,7 +16,7 @@
if(stat == UNCONSCIOUS)
return //Unconscious? Nope.
- if(dazed > 0)
+ if(HAS_TRAIT(src, TRAIT_DAZED))
to_chat(src, SPAN_WARNING("You are too dazed to talk."))
return
diff --git a/code/modules/mob/living/carbon/xenomorph/update_icons.dm b/code/modules/mob/living/carbon/xenomorph/update_icons.dm
index 0fbe71192a..504cfa6685 100644
--- a/code/modules/mob/living/carbon/xenomorph/update_icons.dm
+++ b/code/modules/mob/living/carbon/xenomorph/update_icons.dm
@@ -99,19 +99,32 @@
. = ..()
if(. != new_value)
update_icons() // Snowflake handler for xeno resting icons
+ update_wounds()
/mob/living/carbon/xenomorph/on_floored_start()
. = ..()
update_icons()
+ update_wounds()
/mob/living/carbon/xenomorph/on_floored_end()
. = ..()
update_icons()
+ update_wounds()
/mob/living/carbon/xenomorph/on_incapacitated_trait_gain()
. = ..()
update_icons()
+ update_wounds()
/mob/living/carbon/xenomorph/on_incapacitated_trait_loss()
. = ..()
update_icons()
+ update_wounds()
+/mob/living/carbon/xenomorph/on_knockedout_trait_gain()
+ . = ..()
+ update_icons()
+ update_wounds()
+/mob/living/carbon/xenomorph/on_knockedout_trait_loss()
+ . = ..()
+ update_icons()
+ update_wounds()
/* ^^^^^^^^^^^^^^ End Icon updates */
diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm b/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm
index 177cd07433..40e20fc06f 100644
--- a/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm
+++ b/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm
@@ -76,21 +76,32 @@ At bare minimum, make sure the relevant checks from parent types gets copied in
/////////////////////////////
-// Poddoors/shutters //
+// PODDDOORS //
/////////////////////////////
/obj/structure/machinery/door/poddoor/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target)
. = ..()
if(!.)
- return
+ return INFINITY
+
+ if(unacidable)
+ return INFINITY
if(!(stat & NOPOWER))
- return
+ return INFINITY
+
+ return DOOR_PENALTY
- if(operating)
- return
+
+/////////////////////////////
+// SHUTTERS //
+/////////////////////////////
+/obj/structure/machinery/door/poddoor/shutters/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target)
+ . = ..()
+ if(!.)
+ return INFINITY
if(unacidable)
- return
+ return INFINITY
return DOOR_PENALTY
@@ -104,7 +115,7 @@ At bare minimum, make sure the relevant checks from parent types gets copied in
return
if(locked || welded || isElectrified())
- return INFINITY
+ return LOCKED_DOOR_PENALTY
if(isfacehugger(X))
return -1 // We LOVE going under doors!
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 9fade66e44..7c4eff0e2c 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -65,14 +65,13 @@
//#define EFFECT_FLAG_XENOMORPH
//#define EFFECT_FLAG_CHEMICAL
+/// Legacy wrapper for effects, DO NOT USE and migrate all code to USING THE STATUS PROCS DIRECTLY
/mob/proc/apply_effect()
return FALSE
+// Legacy wrapper for effects, DO NOT USE and migrate all code to USING THE BELOW PROCS DIRECTLY
/mob/living/apply_effect(effect = 0, effect_type = STUN, effect_flags = EFFECT_FLAG_DEFAULT)
- if(SEND_SIGNAL(src, COMSIG_LIVING_APPLY_EFFECT, effect, effect_type, effect_flags) & COMPONENT_CANCEL_EFFECT)
- return
-
if(!effect)
return FALSE
@@ -106,9 +105,6 @@
/mob/living/adjust_effect(effect = 0, effect_type = STUN, effect_flags = EFFECT_FLAG_DEFAULT)
- if(SEND_SIGNAL(src, COMSIG_LIVING_ADJUST_EFFECT, effect, effect_type, effect_flags) & COMPONENT_CANCEL_EFFECT)
- return
-
if(!effect)
return FALSE
@@ -142,9 +138,6 @@
/mob/living/set_effect(effect = 0, effect_type = STUN, effect_flags = EFFECT_FLAG_DEFAULT)
- if(SEND_SIGNAL(src, COMSIG_LIVING_SET_EFFECT, effect, effect_type, effect_flags) & COMPONENT_CANCEL_EFFECT)
- return
-
switch(effect_type)
if(STUN)
SetStun(effect)
diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm
index 696eaa3f01..825fa4dcc9 100644
--- a/code/modules/mob/living/init_signals.dm
+++ b/code/modules/mob/living/init_signals.dm
@@ -17,17 +17,24 @@
RegisterSignal(src, list(SIGNAL_ADDTRAIT(TRAIT_UNDENSE), SIGNAL_REMOVETRAIT(TRAIT_UNDENSE)), PROC_REF(undense_changed))
+ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_DAZED), PROC_REF(on_dazed_trait_gain))
+ RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_DAZED), PROC_REF(on_dazed_trait_loss))
+
/// Called when [TRAIT_KNOCKEDOUT] is added to the mob.
/mob/living/proc/on_knockedout_trait_gain(datum/source)
SIGNAL_HANDLER
if(stat < UNCONSCIOUS)
set_stat(UNCONSCIOUS)
+ sound_environment_override = SOUND_ENVIRONMENT_PSYCHOTIC
+ client?.soundOutput?.update_mob_environment_override()
/// Called when [TRAIT_KNOCKEDOUT] is removed from the mob.
/mob/living/proc/on_knockedout_trait_loss(datum/source)
SIGNAL_HANDLER
if(stat <= UNCONSCIOUS)
update_stat()
+ sound_environment_override = SOUND_ENVIRONMENT_NONE
+ client?.soundOutput?.update_mob_environment_override()
/// Called when [TRAIT_IMMOBILIZED] is added to the mob.
/mob/living/proc/on_immobilized_trait_gain(datum/source)
@@ -87,6 +94,14 @@
//update_appearance()
return
+/// Called when [TRAIT_DAZED] is added to the mob.
+/mob/living/proc/on_dazed_trait_gain(datum/source)
+ SIGNAL_HANDLER
+
+/// Called when [TRAIT_DAZED] is removed from the mob.
+/mob/living/proc/on_dazed_trait_loss(datum/source)
+ SIGNAL_HANDLER
+
/// Called when [TRAIT_UNDENSE] is gained or lost
/mob/living/proc/undense_changed(datum/source)
SIGNAL_HANDLER
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 6205c4f919..72fd380e58 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -24,6 +24,7 @@
/mob/living/Destroy()
GLOB.living_mob_list -= src
+ cleanup_status_effects()
pipes_shown = null
. = ..()
@@ -33,6 +34,17 @@
QDEL_NULL(pain)
QDEL_NULL(stamina)
QDEL_NULL(hallucinations)
+ status_effects = null
+
+/// Clear all running status effects assuming deletion
+/mob/living/proc/cleanup_status_effects()
+ PROTECTED_PROC(TRUE)
+ if(length(status_effects))
+ for(var/datum/status_effect/S as anything in status_effects)
+ if(S?.on_remove_on_mob_delete) //the status effect calls on_remove when its mob is deleted
+ qdel(S)
+ else
+ S?.be_replaced()
/mob/living/proc/initialize_pain()
pain = new /datum/pain(src)
@@ -495,6 +507,7 @@
// REMOVE_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT)
// remove_from_alive_mob_list()
// add_to_dead_mob_list()
+ update_layer() // Force update layers so that lying down works as intended upon death. This is redundant otherwise. Replace this by trait signals
/**
* Changes the inclination angle of a mob, used by humans and others to differentiate between standing up and prone positions.
@@ -577,12 +590,16 @@
drop_l_hand()
drop_r_hand()
add_temp_pass_flags(PASS_MOB_THRU)
+ update_layer()
+
+/// Updates the layer the mob is on based on its current status. This can result in redundant updates. Replace by trait signals eventually
+/mob/living/proc/update_layer()
//so mob lying always appear behind standing mobs, but dead ones appear behind living ones
if(pulledby && pulledby.grab_level == GRAB_CARRY)
layer = ABOVE_MOB_LAYER
- else if (stat == DEAD)
+ else if (body_position == LYING_DOWN && stat == DEAD)
layer = LYING_DEAD_MOB_LAYER // Dead mobs should layer under living ones
- else if(layer == initial(layer)) //to avoid things like hiding larvas.
+ else if(body_position == LYING_DOWN && layer == initial(layer)) //to avoid things like hiding larvas. //i have no idea what this means
layer = LYING_LIVING_MOB_LAYER
/// Called when mob changes from a standing position into a prone while lacking the ability to stand up at the moment.
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index ce4634a102..fb2bd2af0c 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -14,15 +14,14 @@
var/brainloss = 0 //'Retardation' damage caused by someone hitting you in the head with a bible or being infected with brainrot.
var/halloss = 0 //Hallucination damage. 'Fake' damage obtained through hallucinating or the holodeck. Sleeping should cause it to wear off.
- // please don't use these
- VAR_PROTECTED/knocked_out = 0
- VAR_PROTECTED/knocked_down = 0
- VAR_PROTECTED/stunned = 0
+ // please don't use these directly, use the procs
var/dazed = 0
var/slowed = 0 // X_SLOW_AMOUNT
var/superslowed = 0 // X_SUPERSLOW_AMOUNT
var/sleeping = 0
+ ///a list of all status effects the mob has
+ var/list/status_effects
/// Cooldown for manually toggling resting to avoid spamming
COOLDOWN_DECLARE(rest_cooldown)
diff --git a/code/modules/mob/living/living_health_procs.dm b/code/modules/mob/living/living_health_procs.dm
index 7801549528..5bebff5484 100644
--- a/code/modules/mob/living/living_health_procs.dm
+++ b/code/modules/mob/living/living_health_procs.dm
@@ -84,70 +84,102 @@
maxHealth = newMaxHealth
#undef MAX_DAMAGE_OF_TYPE
-
-/mob/living
- VAR_PROTECTED/stun_timer = TIMER_ID_NULL
-
-/mob/living/proc/stun_callback()
- REMOVE_TRAIT(src, TRAIT_INCAPACITATED, STUNNED_TRAIT)
- stunned = 0
- handle_regular_status_updates(FALSE)
- if(stun_timer != TIMER_ID_NULL)
- deltimer(stun_timer)
- stun_timer = TIMER_ID_NULL
-
-/mob/living/proc/stun_callback_check()
- if(stunned)
- ADD_TRAIT(src, TRAIT_INCAPACITATED, STUNNED_TRAIT)
- if(stunned && stunned < recovery_constant)
- stun_timer = addtimer(CALLBACK(src, PROC_REF(stun_callback)), (stunned/recovery_constant) * 2 SECONDS, TIMER_OVERRIDE|TIMER_UNIQUE|TIMER_STOPPABLE)
+/* STUN (Incapacitation) */
+/// Overridable handler to adjust the numerical value of status effects. Expand as needed
+/mob/living/proc/GetStunDuration(amount)
+ return amount * GLOBAL_STATUS_MULTIPLIER
+/mob/living/proc/IsStun() //If we're stunned
+ return has_status_effect(/datum/status_effect/incapacitating/stun)
+/mob/living/proc/AmountStun() //How much time remain in our stun - scaled by GLOBAL_STATUS_MULTIPLIER (normally in multiples of legacy 2 seconds)
+ var/datum/status_effect/incapacitating/stun/S = IsStun()
+ if(S)
+ return S.get_duration_left() / GLOBAL_STATUS_MULTIPLIER
+ return 0
+/mob/living/proc/Stun(amount)
+ if(!(status_flags & CANSTUN))
return
- if(!stunned) // Force reset since the timer wasn't called
- stun_callback()
+ amount = GetStunDuration(amount)
+ var/datum/status_effect/incapacitating/stun/S = IsStun()
+ if(S)
+ S.update_duration(amount, increment = TRUE)
+ else if(amount > 0)
+ S = apply_status_effect(/datum/status_effect/incapacitating/stun, amount)
+ return S
+/mob/living/proc/SetStun(amount, ignore_canstun = FALSE) //Sets remaining duration
+ if(!(status_flags & CANSTUN))
return
-
- if(stun_timer != TIMER_ID_NULL)
- deltimer(stun_timer)
- stun_timer = TIMER_ID_NULL
-
-// adjust stun if needed, do not call it in adjust stunned
-/mob/living/proc/stun_clock_adjustment()
- return
-
-/mob/living/proc/Stun(amount)
- if(status_flags & CANSTUN)
- stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun
- stun_clock_adjustment()
- stun_callback_check()
- return
-
-/mob/living/proc/SetStun(amount) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned"
- if(status_flags & CANSTUN)
- stunned = max(amount,0)
- stun_clock_adjustment()
- stun_callback_check()
- return
-
-/mob/living/proc/AdjustStun(amount)
- if(status_flags & CANSTUN)
- stunned = max(stunned + amount,0)
- stun_callback_check()
- return
+ amount = GetStunDuration(amount)
+ var/datum/status_effect/incapacitating/stun/S = IsStun()
+ if(amount <= 0)
+ if(S)
+ qdel(S)
+ else
+ if(S)
+ S.update_duration(amount)
+ else
+ S = apply_status_effect(/datum/status_effect/incapacitating/stun, amount)
+ return S
+/mob/living/proc/AdjustStun(amount, ignore_canstun = FALSE) //Adds to remaining duration
+ if(!(status_flags & CANSTUN))
+ return
+ amount = GetStunDuration(amount)
+ var/datum/status_effect/incapacitating/stun/S = IsStun()
+ if(S)
+ S.adjust_duration(amount)
+ else if(amount > 0)
+ S = apply_status_effect(/datum/status_effect/incapacitating/stun, amount)
+ return S
+
+/* DAZE (Light incapacitation) */
+/// Overridable handler to adjust the numerical value of status effects. Expand as needed
+/mob/living/proc/GetDazeDuration(amount)
+ return amount * GLOBAL_STATUS_MULTIPLIER
+
+/mob/living/proc/IsDaze() //If we're stunned
+ return has_status_effect(/datum/status_effect/incapacitating/dazed)
+
+/mob/living/proc/AmountDaze() //How many deciseconds remains
+ var/datum/status_effect/incapacitating/dazed/dazed = IsDaze()
+ if(dazed)
+ return dazed.get_duration_left() / GLOBAL_STATUS_MULTIPLIER
+ return 0
/mob/living/proc/Daze(amount)
- if(status_flags & CANDAZE)
- dazed = max(max(dazed,amount),0)
- return
-
-/mob/living/proc/SetDaze(amount)
- if(status_flags & CANDAZE)
- dazed = max(amount,0)
- return
-
-/mob/living/proc/AdjustDaze(amount)
- if(status_flags & CANDAZE)
- dazed = max(dazed + amount,0)
- return
+ if(!(status_flags & CANDAZE))
+ return
+ amount = GetDazeDuration(amount)
+ var/datum/status_effect/incapacitating/dazed/dazed = IsDaze()
+ if(dazed)
+ dazed.update_duration(amount, increment = TRUE)
+ else if(amount > 0)
+ dazed = apply_status_effect(/datum/status_effect/incapacitating/dazed, amount)
+ return dazed
+
+/mob/living/proc/SetDaze(amount, ignore_canstun = FALSE) //Sets remaining duration
+ if(!(status_flags & CANDAZE))
+ return
+ amount = GetDazeDuration(amount)
+ var/datum/status_effect/incapacitating/dazed/dazed = IsDaze()
+ if(amount <= 0)
+ if(dazed)
+ qdel(dazed)
+ else
+ if(dazed)
+ dazed.update_duration(amount)
+ else
+ dazed = apply_status_effect(/datum/status_effect/incapacitating/dazed, amount)
+ return dazed
+
+/mob/living/proc/AdjustDaze(amount, ignore_canstun = FALSE) //Adds to remaining duration
+ if(!(status_flags & CANDAZE))
+ return
+ amount = GetStunDuration(amount)
+ var/datum/status_effect/incapacitating/dazed/dazed = IsDaze()
+ if(dazed)
+ dazed.adjust_duration(amount)
+ else if(amount > 0)
+ dazed = apply_status_effect(/datum/status_effect/incapacitating/dazed, amount)
+ return dazed
/mob/living/proc/Slow(amount)
if(status_flags & CANSLOW)
@@ -177,103 +209,113 @@
SetSuperslow(superslowed + amount)
return
-/mob/living
- VAR_PRIVATE/knocked_down_timer
+/* KnockDown (Flooring) */
+/// Overridable handler to adjust the numerical value of status effects. Expand as needed
+/mob/living/proc/GetKnockDownDuration(amount)
+ return amount * GLOBAL_STATUS_MULTIPLIER
-/mob/living/proc/knocked_down_callback()
- remove_traits(list(TRAIT_FLOORED, TRAIT_INCAPACITATED), KNOCKEDDOWN_TRAIT)
- knocked_down = 0
- handle_regular_status_updates(FALSE)
- knocked_down_timer = null
+/mob/living/proc/IsKnockDown()
+ return has_status_effect(/datum/status_effect/incapacitating/knockdown)
-/mob/living/proc/knocked_down_callback_check()
- if(knocked_down)
- add_traits(list(TRAIT_FLOORED, TRAIT_INCAPACITATED), KNOCKEDDOWN_TRAIT)
+///How much time remains - scaled by GLOBAL_STATUS_MULTIPLIER (normally in multiples of legacy 2 seconds)
+/mob/living/proc/AmountKnockDown()
+ var/datum/status_effect/incapacitating/knockdown/S = IsKnockDown()
+ if(S)
+ return S.get_duration_left() / GLOBAL_STATUS_MULTIPLIER
+ return 0
- if(knocked_down && knocked_down < recovery_constant)
- knocked_down_timer = addtimer(CALLBACK(src, PROC_REF(knocked_down_callback)), (knocked_down/recovery_constant) * 2 SECONDS, TIMER_OVERRIDE|TIMER_UNIQUE|TIMER_STOPPABLE) // times whatever amount we have per tick
+/mob/living/proc/KnockDown(amount)
+ if(!(status_flags & CANKNOCKDOWN))
return
-
- if(!knocked_down) // Force reset since the timer wasn't called
- knocked_down_callback()
+ amount = GetKnockDownDuration(amount)
+ var/datum/status_effect/incapacitating/knockdown/S = IsKnockDown()
+ if(S)
+ S.update_duration(amount, increment = TRUE)
+ else if(amount > 0)
+ S = apply_status_effect(/datum/status_effect/incapacitating/knockdown, amount)
+ return S
+
+///Sets exact remaining KnockDown duration
+/mob/living/proc/SetKnockDown(amount, ignore_canstun = FALSE)
+ if(!(status_flags & CANKNOCKDOWN))
return
-
- if(knocked_down_timer)
- deltimer(knocked_down_timer)
- knocked_down_timer = null
-
-/mob/living
- VAR_PRIVATE/knocked_out_timer
-
-/mob/living/proc/knocked_out_start()
- return
-
-/mob/living/proc/knocked_out_callback()
- REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, KNOCKEDOUT_TRAIT)
- knocked_out = 0
- handle_regular_status_updates(FALSE)
- knocked_out_timer = null
-
-/mob/living/proc/knocked_out_callback_check()
- if(knocked_out)
- ADD_TRAIT(src, TRAIT_KNOCKEDOUT, KNOCKEDOUT_TRAIT)
- if(knocked_out && knocked_out < recovery_constant)
- knocked_out_timer = addtimer(CALLBACK(src, PROC_REF(knocked_out_callback)), (knocked_out/recovery_constant) * 2 SECONDS, TIMER_OVERRIDE|TIMER_UNIQUE|TIMER_STOPPABLE) // times whatever amount we have per tick
+ amount = GetKnockDownDuration(amount)
+ var/datum/status_effect/incapacitating/knockdown/S = IsKnockDown()
+ if(amount <= 0)
+ if(S)
+ qdel(S)
+ else
+ if(S)
+ S.update_duration(amount)
+ else
+ S = apply_status_effect(/datum/status_effect/incapacitating/knockdown, amount)
+ return S
+
+///Adds to remaining Knockdown duration
+/mob/living/proc/AdjustKnockDown(amount, ignore_canstun = FALSE)
+ if(!(status_flags & CANKNOCKDOWN))
return
- else if(!knocked_out)
- //It's been called, and we're probably inconscious, so fix that.
- knocked_out_callback()
-
- if(knocked_out_timer)
- deltimer(knocked_out_timer)
- knocked_out_timer = null
-
-// adjust knockdown if needed, do not call it in adjust knockdown
-/mob/living/proc/knockdown_clock_adjustment()
- return
-
-/mob/living/proc/KnockDown(amount, force)
- if((status_flags & CANKNOCKDOWN) || force)
- knocked_down = max(max(knocked_down,amount),0)
- knockdown_clock_adjustment()
- knocked_down_callback_check()
- return
-
-/mob/living/proc/SetKnockDown(amount)
- if(status_flags & CANKNOCKDOWN)
- knocked_down = max(amount,0)
- knockdown_clock_adjustment()
- knocked_down_callback_check()
- return
-
-/mob/living/proc/AdjustKnockDown(amount)
- if(status_flags & CANKNOCKDOWN)
- knocked_down = max(knocked_down + amount,0)
- knocked_down_callback_check()
- return
-
-/mob/living/proc/knockout_clock_adjustment()
- return
-
+ amount = GetKnockDownDuration(amount)
+ var/datum/status_effect/incapacitating/knockdown/S = IsKnockDown()
+ if(S)
+ S.adjust_duration(amount)
+ else if(amount > 0)
+ S = apply_status_effect(/datum/status_effect/incapacitating/knockdown, amount)
+ return S
+
+/* KnockOut (Unconscious) */
+/// Overridable handler to adjust the numerical value of status effects. Expand as needed
+/mob/living/proc/GetKnockOutDuration(amount)
+ return amount * GLOBAL_STATUS_MULTIPLIER
+
+/mob/living/proc/IsKnockOut()
+ return has_status_effect(/datum/status_effect/incapacitating/unconscious)
+
+/mob/living/proc/AmountKnockOut() //How much time remains - scaled by GLOBAL_STATUS_MULTIPLIER (normally in multiples of legacy 2 seconds)
+ var/datum/status_effect/incapacitating/unconscious/S = IsKnockOut()
+ if(S)
+ return S.get_duration_left() / GLOBAL_STATUS_MULTIPLIER
+ return 0
+
+/// Sets Knockout duration to at least the amount provided
/mob/living/proc/KnockOut(amount)
- if(status_flags & CANKNOCKOUT)
- knocked_out = max(max(knocked_out,amount),0)
- knockout_clock_adjustment()
- knocked_out_callback_check()
- return
-
-/mob/living/proc/SetKnockOut(amount)
- if(status_flags & CANKNOCKOUT)
- knocked_out = max(amount,0)
- knockout_clock_adjustment()
- knocked_out_callback_check()
- return
-
-/mob/living/proc/AdjustKnockOut(amount)
- if(status_flags & CANKNOCKOUT)
- knocked_out = max(knocked_out + amount,0)
- knocked_out_callback_check()
- return
+ if(!(status_flags & CANKNOCKOUT))
+ return
+ amount = GetKnockOutDuration(amount)
+ var/datum/status_effect/incapacitating/unconscious/S = IsKnockOut()
+ if(S)
+ S.update_duration(amount, increment = TRUE)
+ else if(amount > 0)
+ S = apply_status_effect(/datum/status_effect/incapacitating/unconscious, amount)
+ return S
+
+/// Sets exact remaining Knockout duration
+/mob/living/proc/SetKnockOut(amount, ignore_canstun = FALSE)
+ if(!(status_flags & CANKNOCKOUT))
+ return
+ amount = GetKnockOutDuration(amount)
+ var/datum/status_effect/incapacitating/unconscious/S = IsKnockOut()
+ if(amount <= 0)
+ if(S)
+ qdel(S)
+ else
+ if(S)
+ S.update_duration(amount)
+ else
+ S = apply_status_effect(/datum/status_effect/incapacitating/unconscious, amount)
+ return S
+
+/// Adds to remaining Knockout duration
+/mob/living/proc/AdjustKnockOut(amount, ignore_canstun = FALSE)
+ if(!(status_flags & CANKNOCKOUT))
+ return
+ amount = GetKnockOutDuration(amount)
+ var/datum/status_effect/incapacitating/unconscious/S = IsKnockOut()
+ if(S)
+ S.adjust_duration(amount)
+ else if(amount > 0)
+ S = apply_status_effect(/datum/status_effect/incapacitating/unconscious, amount)
+ return S
/mob/living/proc/Sleeping(amount)
sleeping = max(max(sleeping,amount),0)
@@ -375,11 +417,16 @@
/mob/living/proc/on_deafness_gain()
to_chat(src, SPAN_WARNING("You notice you can't hear anything... you're deaf!"))
+ // We should apply deafness here instead of in handle_regular_status_updates
SEND_SIGNAL(src, COMSIG_MOB_DEAFENED)
/mob/living/proc/on_deafness_loss()
to_chat(src, SPAN_WARNING("You start hearing things again!"))
SEND_SIGNAL(src, COMSIG_MOB_REGAINED_HEARING)
+ // Consider moving this to a signal on soundOutput. This is a fallback as handle_regular_status_updates SHOULD do the job.
+ if(!ear_deaf && (client?.soundOutput?.status_flags & EAR_DEAF_MUTE))
+ client.soundOutput.status_flags ^= EAR_DEAF_MUTE
+ client.soundOutput.apply_status()
// heal ONE limb, organ gets randomly selected from damaged ones.
/mob/living/proc/heal_limb_damage(brute, burn)
@@ -401,7 +448,7 @@
src.updatehealth()
// damage MANY limbs, in random order
-/mob/living/proc/take_overall_damage(brute, burn, used_weapon = null)
+/mob/living/proc/take_overall_damage(brute, burn, used_weapon = null, limb_damage_chance = 80)
if(status_flags & GODMODE) return 0 //godmode
apply_damage(brute, BRUTE)
apply_damage(burn, BURN)
@@ -419,8 +466,6 @@
/mob/living/proc/rejuvenate()
heal_all_damage()
- SEND_SIGNAL(src, COMSIG_LIVING_REJUVENATED)
-
// shut down ongoing problems
status_flags &= ~PERMANENTLY_DEAD
nutrition = NUTRITION_NORMAL
@@ -461,6 +506,8 @@
set_stat(CONSCIOUS)
regenerate_all_icons()
+ SEND_SIGNAL(src, COMSIG_LIVING_REJUVENATED)
+
/mob/living/proc/heal_all_damage()
// shut down various types of badness
@@ -506,11 +553,3 @@
return
face_dir(direction)
return ..()
-
-// Transition handlers. do NOT use this. I mean seriously don't. It's broken. Players love their broken behaviors.
-/mob/living/proc/GetStunValueNotADurationDoNotUse()
- return stunned
-/mob/living/proc/GetKnockDownValueNotADurationDoNotUse()
- return knocked_down
-/mob/living/proc/GetKnockOutValueNotADurationDoNotUse()
- return knocked_out
diff --git a/code/modules/mob/living/living_healthscan.dm b/code/modules/mob/living/living_healthscan.dm
index f3355157a4..d21f31fe00 100644
--- a/code/modules/mob/living/living_healthscan.dm
+++ b/code/modules/mob/living/living_healthscan.dm
@@ -79,6 +79,12 @@ GLOBAL_LIST_INIT(known_implants, subtypesof(/obj/item/implant))
// Fake death will make the scanner think they died of oxygen damage, thus it returns enough damage to kill minus already recieved damage.
return round(POSITIVE(200 - total_mob_damage))
+/datum/health_scan/proc/get_holo_card_color(mob/living/target_mob)
+ if(!ishuman(target_mob))
+ return
+ var/mob/living/carbon/human/human_mob = target_mob
+ return human_mob.holo_card_color
+
/datum/health_scan/proc/get_health_value(mob/living/target_mob)
if(!(target_mob.status_flags & FAKEDEATH))
return target_mob.health
@@ -97,7 +103,7 @@ GLOBAL_LIST_INIT(known_implants, subtypesof(/obj/item/implant))
"clone" = round(target_mob.getCloneLoss()),
"blood_type" = target_mob.blood_type,
"blood_amount" = target_mob.blood_volume,
-
+ "holocard" = get_holo_card_color(target_mob),
"hugged" = (locate(/obj/item/alien_embryo) in target_mob),
)
@@ -450,6 +456,17 @@ GLOBAL_LIST_INIT(known_implants, subtypesof(/obj/item/implant))
return data
+/datum/health_scan/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+ if(.)
+ return
+ switch(action)
+ if("change_holo_card")
+ if(ishuman(target_mob))
+ var/mob/living/carbon/human/target_human = target_mob
+ target_human.change_holo_card(ui.user)
+ return TRUE
+
/// legacy proc for to_chat messages on health analysers
/mob/living/proc/health_scan(mob/living/carbon/human/user, ignore_delay = FALSE, show_limb_damage = TRUE, show_browser = TRUE, alien = FALSE, do_checks = TRUE) // ahem. FUCK WHOEVER CODED THIS SHIT AS NUMBERS AND NOT DEFINES.
if(do_checks)
diff --git a/code/modules/mob/living/living_verbs.dm b/code/modules/mob/living/living_verbs.dm
index 45f5a25fce..9dfb5ff721 100644
--- a/code/modules/mob/living/living_verbs.dm
+++ b/code/modules/mob/living/living_verbs.dm
@@ -1,3 +1,10 @@
+/mob/living/can_resist()
+ if(next_move > world.time)
+ return FALSE
+ if(HAS_TRAIT(src, TRAIT_INCAPACITATED))
+ return FALSE
+ return TRUE
+
/mob/living/verb/resist()
set name = "Resist"
set category = "IC"
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index 5b190143f5..7b0ee6869e 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -34,9 +34,6 @@
// Gain Power
apply_damage(-1, OXY)
- // Handle EMP-stun
- handle_stunned()
-
//stage = 1
//if (isRemoteControlling(src)) // Are we not sure what we are?
var/blind = 0
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_damage.dm b/code/modules/mob/living/silicon/robot/drone/drone_damage.dm
index a0245d8c8c..b27ebdd3c4 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_damage.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_damage.dm
@@ -1,5 +1,5 @@
//Redefining some robot procs, since drones can't be repaired and really shouldn't take component damage.
-/mob/living/silicon/robot/drone/take_overall_damage(brute = 0, burn = 0, sharp = 0, used_weapon = null)
+/mob/living/silicon/robot/drone/take_overall_damage(brute = 0, burn = 0, sharp = 0, used_weapon = null, limb_damage_chance = 80)
bruteloss += brute
fireloss += burn
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index b4a6e59e52..ac031e74e1 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -22,7 +22,7 @@
/mob/living/silicon/robot/proc/clamp_values()
// set_effect(min(stunned, 30), STUN)
- set_effect(min(knocked_out, 30), PARALYZE)
+// set_effect(min(knocked_out, 30), PARALYZE)
// set_effect(min(knocked_down, 20), WEAKEN)
sleeping = 0
apply_damage(0, BRUTE)
diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm
index 78b6b78445..fc40944505 100644
--- a/code/modules/mob/living/silicon/robot/robot_damage.dm
+++ b/code/modules/mob/living/silicon/robot/robot_damage.dm
@@ -108,7 +108,7 @@
parts -= picked
-/mob/living/silicon/robot/take_overall_damage(brute = 0, burn = 0, sharp = 0, used_weapon = null)
+/mob/living/silicon/robot/take_overall_damage(brute = 0, burn = 0, sharp = 0, used_weapon = null, limb_damage_chance = 80)
if(status_flags & GODMODE) return //godmode
var/list/datum/robot_component/parts = get_damageable_components()
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index f1452d95c2..78c96bbbb7 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -110,19 +110,6 @@
/*
* Inventory
*/
-/mob/living/simple_animal/parrot/show_inv(mob/user as mob)
- user.set_interaction(src)
- if(user.stat) return
-
- var/dat = "Inventory of [name]
"
- if(ears)
- dat += "
Headset: [ears] (Remove)"
- else
- dat += "
Headset: Nothing"
-
- user << browse(dat, text("window=mob[];size=325x500", name))
- onclose(user, "mob[real_name]")
- return
/mob/living/simple_animal/parrot/Topic(href, href_list)
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 023ab46bb2..86c19586f6 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -100,10 +100,6 @@
if(health > maxHealth)
health = maxHealth
- handle_stunned()
- handle_knocked_down(TRUE)
- handle_knocked_out(TRUE)
-
//Movement
if(!client && !stop_automated_movement && wander && !anchored)
if(isturf(src.loc) && !resting && !buckled && (mobility_flags & MOBILITY_MOVE)) //This is so it only moves if it's not inside a closet, gentics machine, etc.
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index 775e69dc0b..38157a0673 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -18,6 +18,8 @@
update_Login_details()
+ SEND_SIGNAL(src, COMSIG_MOB_LOGIN)
+
client.images = null
client.screen = null //remove hud items just in case
if(!hud_used)
@@ -58,6 +60,6 @@
client.init_verbs()
- SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MOB_LOGIN, src)
- SEND_SIGNAL(client, COMSIG_CLIENT_MOB_LOGIN, src)
- SEND_SIGNAL(src, COMSIG_MOB_LOGIN)
+ SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MOB_LOGGED_IN, src)
+ SEND_SIGNAL(client, COMSIG_CLIENT_MOB_LOGGED_IN, src)
+ SEND_SIGNAL(src, COMSIG_MOB_LOGGED_IN)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 3df4c8b83f..13c47719a7 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -102,6 +102,8 @@
I = image('icons/mob/hud/sec_hud.dmi', src, "")
if(HUNTER_CLAN,HUNTER_HUD)
I = image('icons/mob/hud/hud_yautja.dmi', src, "")
+ if(HOLOCARD_HUD)
+ I = image('icons/mob/hud/marine_hud.dmi', src, "")
I.appearance_flags |= NO_CLIENT_COLOR|KEEP_APART|RESET_COLOR
hud_list[hud] = I
@@ -370,25 +372,6 @@
SIGNAL_HANDLER
reset_view(null)
-/mob/proc/show_inv(mob/user)
- user.set_interaction(src)
- var/dat = {"
-
[name]
-
-
Head(Mask): [(wear_mask ? wear_mask : "Nothing")]
-
Left Hand: [(l_hand ? l_hand : "Nothing")]
-
Right Hand: [(r_hand ? r_hand : "Nothing")]
-
Back: [(back ? back : "Nothing")] [((istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/tank) && !( internal )) ? text(" Set Internal", src) : "")]
-
[(internal ? text("Remove Internal") : "")]
-
Empty Pockets
-
Refresh
-
Close
-
"}
- show_browser(user, dat, name, "mob[name]")
- return
-
-
-
/mob/proc/point_to_atom(atom/A, turf/T)
//Squad Leaders and above have reduced cooldown and get a bigger arrow
if(check_improved_pointing())
@@ -446,21 +429,6 @@
update_flavor_text()
return
-
-/mob/MouseDrop(mob/M)
- ..()
- if(M != usr) return
- if(usr == src) return
- if(!Adjacent(usr)) return
- if(!ishuman(M) && !ismonkey(M)) return
- if(!ishuman(src) && !ismonkey(src)) return
- if(M.is_mob_incapacitated())
- return
- if(M.pulling == src && (M.a_intent & INTENT_GRAB) && M.grab_level == GRAB_AGGRESSIVE)
- return
-
- show_inv(M)
-
/mob/proc/swap_hand()
hand = !hand
@@ -861,28 +829,18 @@ note dizziness decrements automatically in the mob's Life() proc.
selection.forceMove(get_turf(src))
return TRUE
+///Can this mob resist (default FALSE)
+/mob/proc/can_resist()
+ return FALSE
+
/mob/living/proc/handle_statuses()
- handle_stunned()
- handle_knocked_down()
- handle_knocked_out()
handle_stuttering()
handle_silent()
handle_drugged()
handle_slurring()
- handle_dazed()
handle_slowed()
handle_superslowed()
-/mob/living/proc/handle_stunned()
- if(stunned)
- adjust_effect(-1, STUN)
- return stunned
-
-/mob/living/proc/handle_dazed()
- if(dazed)
- adjust_effect(-1, DAZE)
- return dazed
-
/mob/living/proc/handle_slowed()
if(slowed)
adjust_effect(-1, SLOW)
@@ -893,19 +851,6 @@ note dizziness decrements automatically in the mob's Life() proc.
adjust_effect(-1, SUPERSLOW)
return superslowed
-
-/mob/living/proc/handle_knocked_down(bypass_client_check = FALSE)
- if(knocked_down && (bypass_client_check || client))
- knocked_down = max(knocked_down-1,0)
- knocked_down_callback_check()
- return knocked_down
-
-/mob/living/proc/handle_knocked_out(bypass_client_check = FALSE)
- if(knocked_out && (bypass_client_check || client))
- knocked_out = max(knocked_out-1,0)
- knocked_out_callback_check()
- return knocked_out
-
/mob/living/proc/handle_stuttering()
if(stuttering)
stuttering = max(stuttering-1, 0)
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index f0e5bc48a8..e2f40506b2 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -28,7 +28,8 @@
I'll make some notes on where certain variable defines should probably go.
Changing this around would probably require a good look-over the pre-existing code.
*/
- var/list/observers //The list of people observing this mob.
+ /// The list of people observing this mob.
+ var/list/mob/dead/observer/observers
var/zone_selected = "chest"
var/use_me = 1 //Allows all mobs to use the me verb by default, will have to manually specify they cannot
@@ -433,4 +434,3 @@
return
src.regenerate_icons()
-
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 08412dab48..2664c14a8a 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -249,7 +249,7 @@ var/global/list/limb_types_by_name = list(
message = replace_X.Replace(message, "CKTH")
return message
-#define PIXELS_PER_STRENGTH_VAL 24
+#define PIXELS_PER_STRENGTH_VAL 28
/proc/shake_camera(mob/M, steps = 1, strength = 1, time_per_step = 1)
if(!M?.client || (M.shakecamera > world.time))
@@ -260,10 +260,10 @@ var/global/list/limb_types_by_name = list(
var/old_X = M.client.pixel_x
var/old_y = M.client.pixel_y
- animate(M.client, pixel_x = old_X + rand(-(strength), strength), pixel_y = old_y + rand(-(strength), strength), easing = JUMP_EASING, time = time_per_step, flags = ANIMATION_PARALLEL)
+ animate(M.client, pixel_x = old_X + rand(-(strength), strength), pixel_y = old_y + rand(-(strength), strength), easing = CUBIC_EASING | EASE_IN, time = time_per_step, flags = ANIMATION_PARALLEL)
var/i = 1
while(i < steps)
- animate(pixel_x = old_X + rand(-(strength), strength), pixel_y = old_y + rand(-(strength), strength), easing = JUMP_EASING, time = time_per_step)
+ animate(pixel_x = old_X + rand(-(strength), strength), pixel_y = old_y + rand(-(strength), strength), easing = CUBIC_EASING | EASE_IN, time = time_per_step)
i++
animate(pixel_x = old_X, pixel_y = old_y,time = Clamp(Floor(strength/PIXELS_PER_STRENGTH_VAL),2,4))//ease it back
@@ -313,9 +313,8 @@ var/global/list/limb_types_by_name = list(
/// Returns if the mob is incapacitated and unable to perform general actions
/mob/proc/is_mob_incapacitated(ignore_restrained)
- // note that stat includes knockout via unconscious
- // TODO: re-re-re-figure out if we need TRAIT_FLOORED here or using TRAIT_INCAPACITATED only is acceptable deviance from legacy behavior
return (stat || (!ignore_restrained && is_mob_restrained()) || (status_flags & FAKEDEATH) || HAS_TRAIT(src, TRAIT_INCAPACITATED))
+
/mob/proc/get_eye_protection()
return EYE_PROTECTION_NONE
@@ -585,7 +584,7 @@ var/global/list/limb_types_by_name = list(
alert_overlay.layer = FLOAT_LAYER
alert_overlay.plane = FLOAT_PLANE
-
+ alert_overlay.underlays.Cut()
screen_alert.overlays += alert_overlay
/mob/proc/reset_lighting_alpha()
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 980e786aa7..f1a4ed58fd 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -180,10 +180,12 @@
mob.next_move_slowdown = 0
mob.cur_speed = Clamp(10/(move_delay + 0.5), MIN_SPEED, MAX_SPEED)
- //We are now going to move
- moving = TRUE
- mob.move_intentionally = TRUE
+ next_movement = world.time + MINIMAL_MOVEMENT_INTERVAL // We pre-set this now for the crawling case. If crawling do_after fails, next_movement would be set after the attempt end instead of now.
+
+ //Try to crawl first
if(living_mob && living_mob.body_position == LYING_DOWN)
+ if(mob.crawling)
+ return // Already doing it.
//check for them not being a limbless blob (only humans have limbs)
if(ishuman(mob))
var/mob/living/carbon/human/human = mob
@@ -192,19 +194,17 @@
if(!(human.get_limb(zone)))
extremities.Remove(zone)
if(extremities.len < 4)
- next_movement = world.time + MINIMAL_MOVEMENT_INTERVAL
- mob.move_intentionally = FALSE
- moving = FALSE
return
//now crawl
mob.crawling = TRUE
if(!do_after(mob, 1 SECONDS, INTERRUPT_MOVED|INTERRUPT_UNCONSCIOUS|INTERRUPT_STUNNED|INTERRUPT_RESIST|INTERRUPT_CHANGED_LYING, NO_BUSY_ICON))
mob.crawling = FALSE
- next_movement = world.time + MINIMAL_MOVEMENT_INTERVAL
- mob.move_intentionally = FALSE
- moving = FALSE
return
+ if(!mob.crawling)
+ return // Crawling interrupted by a "real" move. Do nothing. In theory INTERRUPT_MOVED|INTERRUPT_CHANGED_LYING catches this in do_after.
mob.crawling = FALSE
+ mob.move_intentionally = TRUE
+ moving = TRUE
if(mob.confused)
mob.Move(get_step(mob, pick(cardinal)))
else
diff --git a/code/modules/nightmare/nmtasks/mapload.dm b/code/modules/nightmare/nmtasks/mapload.dm
index 1ace7cd2fb..d53b566319 100644
--- a/code/modules/nightmare/nmtasks/mapload.dm
+++ b/code/modules/nightmare/nmtasks/mapload.dm
@@ -53,7 +53,7 @@
if(!target_turf?.z)
log_debug("Nightmare Mapload: Could not find landmark: [landmark]")
return
- var/result = parsed.load(target_turf.x, target_turf.y, target_turf.z, cropMap = TRUE, no_changeturf = FALSE, placeOnTop = FALSE, delete = replace)
+ var/result = parsed.load(target_turf.x, target_turf.y, target_turf.z, crop_map = TRUE, no_changeturf = FALSE, place_on_top = FALSE, delete = replace)
if(!result || !parsed.bounds)
log_debug("Nightmare Mapload: Map insertion failed unexpectedly for file: [filepath]")
return
@@ -66,22 +66,23 @@
log_debug("Nightmare Mapload: Loaded map file but could not initialize: '[filepath]' at ([target_turf.x], [target_turf.y], [target_turf.z])")
return TRUE
-/// Initialize atoms/areas in bounds
+/// Initialize atoms/areas in bounds - basically a Nightmare version of [/datum/map_template/initTemplateBounds]
/datum/nmtask/mapload/proc/initialize_boundary_contents()
var/list/bounds = parsed.bounds
if(length(bounds) < 6)
return
- var/list/TT = block( locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]),
+ var/list/turf_block = block( locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]),
locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ]))
var/list/area/arealist = list()
var/list/atom/atomlist = list()
- for(var/turf/T as anything in TT)
- atomlist |= T
- if(T.loc) arealist |= T.loc
- for(var/A in T)
- atomlist |= A
- SSmapping.reg_in_areas_in_z(arealist)
- SSatoms.InitializeAtoms(atomlist)
- // We still defer lighting, area sorting, etc
+ for(var/turf/turf as anything in turf_block)
+ atomlist += turf
+ if(turf.loc)
+ arealist |= turf.loc
+ for(var/atom/movable/movable as anything in turf)
+ atomlist += movable // Much like initTemplateBounds() this only recurses content once. Never been an issue so far, but keep it in mind.
+ SSmapping.reg_in_areas_in_z(arealist) // Legacy. Not sure this is needed as it should already be carried out through area Initialize.
+ SSatoms.InitializeAtoms(atomlist + arealist)
+ // We still defer lighting, area sorting, etc, to be done all in one go!
SEND_SIGNAL(src, COMSIG_NIGHTMARE_TAINTED_BOUNDS, bounds)
return TRUE
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index b210dbac29..e0d0998c82 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -210,6 +210,7 @@ GLOBAL_LIST_INIT(apc_wire_descriptions, list(
"chargingStatus" = charging,
"totalLoad" = display_power(lastused_total),
"coverLocked" = coverlocked,
+ "siliconUser" = FALSE,
"powerChannels" = list(
list(
diff --git a/code/modules/projectiles/ammo_boxes/magazine_boxes.dm b/code/modules/projectiles/ammo_boxes/magazine_boxes.dm
index 320693db36..4f09acbf11 100644
--- a/code/modules/projectiles/ammo_boxes/magazine_boxes.dm
+++ b/code/modules/projectiles/ammo_boxes/magazine_boxes.dm
@@ -354,12 +354,12 @@
//-----------------------88M4 Pistol Mag Box-----------------------
/obj/item/ammo_box/magazine/mod88
- name = "\improper magazine box (88 Mod 4 AP x 16)"
+ name = "\improper magazine box (88 Mod 4 x 16)"
icon_state = "base_mod88"
flags_equip_slot = SLOT_BACK
- overlay_ammo_type = "_ap"
+ overlay_ammo_type = "_reg"
overlay_gun_type = "_mod88"
- overlay_content = "_ap"
+ overlay_content = "_reg"
num_of_magazines = 16
magazine_type = /obj/item/ammo_magazine/pistol/mod88
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 6ab143b8d8..7dc0a56943 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -492,7 +492,7 @@ As sniper rifles have both and weapon mods can change them as well. ..() deals w
unwield(user)
pull_time = world.time + wield_delay
- if(user.dazed)
+ if(HAS_TRAIT(user, TRAIT_DAZED))
pull_time += 3
guaranteed_delay_time = world.time + WEAPON_GUARANTEED_DELAY
@@ -608,14 +608,13 @@ As sniper rifles have both and weapon mods can change them as well. ..() deals w
gun_recoil = recoil_buildup
var/penetration = 0
- var/armor_punch = 0
var/accuracy = 0
var/min_accuracy = 0
var/max_range = 0
+ var/effective_range = 0
var/scatter = 0
var/list/damage_armor_profile_xeno = list()
var/list/damage_armor_profile_marine = list()
- var/list/damage_armor_profile_armorbreak = list()
var/list/damage_armor_profile_headers = list()
var/datum/ammo/in_ammo
@@ -638,35 +637,26 @@ As sniper rifles have both and weapon mods can change them as well. ..() deals w
falloff = in_ammo.damage_falloff * damage_falloff_mult
penetration = in_ammo.penetration
- armor_punch = in_ammo.damage_armor_punch
accuracy = in_ammo.accurate_range
min_accuracy = in_ammo.accurate_range_min
max_range = in_ammo.max_range
+ effective_range = in_ammo.effective_range_max
scatter = in_ammo.scatter
for(var/i = 0; i<=CODEX_ARMOR_MAX; i+=CODEX_ARMOR_STEP)
damage_armor_profile_headers.Add(i)
- damage_armor_profile_marine.Add(round(armor_damage_reduction(GLOB.marine_ranged_stats, damage, i, penetration)))
- damage_armor_profile_xeno.Add(round(armor_damage_reduction(GLOB.xeno_ranged_stats, damage, i, penetration)))
- if(!GLOB.xeno_general.armor_ignore_integrity)
- if(i != 0)
- damage_armor_profile_armorbreak.Add("[round(armor_break_calculation(GLOB.xeno_ranged_stats, damage, i, penetration, in_ammo.pen_armor_punch, armor_punch)/i)]%")
- else
- damage_armor_profile_armorbreak.Add("N/A")
+ damage_armor_profile_marine.Add(floor(armor_damage_reduction(GLOB.marine_ranged_stats, damage, i, penetration)))
+ damage_armor_profile_xeno.Add(floor(armor_damage_reduction(GLOB.xeno_ranged_stats, damage, i, penetration)))
var/rpm = max(fire_delay, 1)
var/burst_rpm = max((fire_delay * 1.5 + (burst_amount - 1) * burst_delay)/max(burst_amount, 1), 0.0001)
// weapon info
- data["icon"] = SSassets.transport.get_asset_url("no_name.png")
-
- if(SSassets.cache["[base_gun_icon].png"])
- data["icon"] = SSassets.transport.get_asset_url("[base_gun_icon].png")
-
+ data["icon"] = base_gun_icon
data["name"] = name
data["desc"] = desc
data["two_handed_only"] = (flags_gun_features & GUN_WIELDED_FIRING_ONLY)
@@ -688,19 +678,18 @@ As sniper rifles have both and weapon mods can change them as well. ..() deals w
data["damage"] = damage
data["falloff"] = falloff
data["total_projectile_amount"] = bonus_projectile_amount+1
- data["armor_punch"] = armor_punch
data["penetration"] = penetration
data["accuracy"] = accuracy * accuracy_mult
data["unwielded_accuracy"] = accuracy * accuracy_mult_unwielded
data["min_accuracy"] = min_accuracy
data["max_range"] = max_range
+ data["effective_range"] = effective_range
// damage table data
data["damage_armor_profile_headers"] = damage_armor_profile_headers
data["damage_armor_profile_marine"] = damage_armor_profile_marine
data["damage_armor_profile_xeno"] = damage_armor_profile_xeno
- data["damage_armor_profile_armorbreak"] = damage_armor_profile_armorbreak
return data
@@ -715,10 +704,10 @@ As sniper rifles have both and weapon mods can change them as well. ..() deals w
data["damage_max"] = 100
data["accuracy_max"] = 32
data["range_max"] = 32
+ data["effective_range_max"] = EFFECTIVE_RANGE_MAX_TIER_4
data["falloff_max"] = DAMAGE_FALLOFF_TIER_1
data["penetration_max"] = ARMOR_PENETRATION_TIER_10
data["punch_max"] = 5
- data["glob_armourbreak"] = GLOB.xeno_general.armor_ignore_integrity
data["automatic"] = (GUN_FIREMODE_AUTOMATIC in gun_firemode_list)
data["auto_only"] = ((length(gun_firemode_list) == 1) && (GUN_FIREMODE_AUTOMATIC in gun_firemode_list))
@@ -726,8 +715,8 @@ As sniper rifles have both and weapon mods can change them as well. ..() deals w
/obj/item/weapon/gun/ui_assets(mob/user)
. = ..() || list()
- . += get_asset_datum(/datum/asset/simple/firemodes)
- //. += get_asset_datum(/datum/asset/spritesheet/gun_lineart)
+ . += get_asset_datum(/datum/asset/spritesheet/gun_lineart_modes)
+ . += get_asset_datum(/datum/asset/spritesheet/gun_lineart)
// END TGUI \\
@@ -758,7 +747,7 @@ As sniper rifles have both and weapon mods can change them as well. ..() deals w
slowdown = initial(slowdown) + aim_slowdown
place_offhand(user, initial(name))
wield_time = world.time + wield_delay
- if(user.dazed)
+ if(HAS_TRAIT(user, TRAIT_DAZED))
wield_time += 5
guaranteed_delay_time = world.time + WEAPON_GUARANTEED_DELAY
//slower or faster wield delay depending on skill.
diff --git a/code/modules/projectiles/gun_attachables.dm b/code/modules/projectiles/gun_attachables.dm
index 0b14f1db09..6f972bdeb8 100644
--- a/code/modules/projectiles/gun_attachables.dm
+++ b/code/modules/projectiles/gun_attachables.dm
@@ -250,7 +250,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/suppressor
name = "suppressor"
- desc = "A small tube with exhaust ports to expel noise and gas.\n Does not completely silence a weapon, but does make it much quieter and a little more accurate and stable at the cost of slightly reduced damage."
+ desc = "Small muzzle device that reduces flash and noise with special internal geometry.\n Reduces noise of the shot, increases accuracy and stability, but penalizes damage marginally."
icon = 'icons/obj/items/weapons/guns/attachments/barrel.dmi'
icon_state = "suppressor"
slot = "muzzle"
@@ -278,7 +278,7 @@ Defined in conflicts.dm of the #defines folder.
icon = 'icons/obj/items/weapons/guns/attachments/barrel.dmi'
icon_state = "bayonet"
item_state = "combat_knife"
- desc = "The standard-issue bayonet of the Colonial Marines. You can slide this knife into your boots, or attach it to the end of a rifle."
+ desc = "USCMC standard issue combat knife. Can be put into boot holster or affixed to the bayonet lug of a rifle. Can also be used to extract shrapnel..."
sharp = IS_SHARP_ITEM_ACCURATE
force = MELEE_FORCE_NORMAL
throwforce = MELEE_FORCE_NORMAL
@@ -375,7 +375,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/extended_barrel
name = "extended barrel"
- desc = "The lengthened barrel speeds up and stabilizes the bullet, increasing velocity and accuracy."
+ desc = "Longer barrel reduces unburnt powder, improving muzzle velocity and accuracy."
slot = "muzzle"
icon = 'icons/obj/items/weapons/guns/attachments/barrel.dmi'
icon_state = "ebarrel"
@@ -452,7 +452,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/f90_dmr_barrel
name = "f90 barrel"
- desc = "This isn't supposed to be seperated from the gun, how'd this happen?"
+ desc = "This isn't supposed to be separated from the gun, how'd this happen?"
icon_state = "aug_dmr_barrel_a"
attach_icon = "aug_dmr_barrel_a"
slot = "muzzle"
@@ -463,7 +463,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/f90_shotgun_barrel
name = "f90 barrel"
- desc = "This isn't supposed to be seperated from the gun, how'd this happen?"
+ desc = "This isn't supposed to be separated from the gun, how'd this happen?"
icon_state = "aug_mkey_barrel_a"
attach_icon = "aug_mkey_barrel_a"
slot = "muzzle"
@@ -474,7 +474,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/l56a2_smartgun
name = "l56a2 barrel"
- desc = "This isn't supposed to be seperated from the gun, how'd this happen?"
+ desc = "This isn't supposed to be separated from the gun, how'd this happen?"
icon_state = "magsg_barrel_a"
attach_icon = "magsg_barrel_a"
slot = "muzzle"
@@ -613,8 +613,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/reddot
name = "S5 red-dot sight"
- desc = "An ARMAT S5 red-dot sight. A zero-magnification optic that offers faster, and more accurate target acquisition."
- desc_lore = "An all-weather collimator sight, designated as the AN/PVQ-64 Dot Sight. Equipped with a sunshade to increase clarity in bright conditions and resist weathering. Compact and efficient, a marvel of military design, until you realize that this is actually just an off-the-shelf design that got a military designation slapped on."
+ desc = "An ARMAT S5 red-dot, type designated as the AN/PVQ-62 Dot Sight. Zero-magnification optic equipped with a sunshade, for better clarity under bright conditions and weather resistance. Unobtrusive and compact, increases wielded accuracy."
icon = 'icons/obj/items/weapons/guns/attachments/rail.dmi'
icon_state = "reddot"
attach_icon = "reddot_a"
@@ -626,10 +625,13 @@ Defined in conflicts.dm of the #defines folder.
accuracy_unwielded_mod = HIT_ACCURACY_MULT_TIER_1
movement_onehanded_acc_penalty_mod = MOVEMENT_ACCURACY_PENALTY_MULT_TIER_5
+/obj/item/attachable/reddot/upp
+ name = "EKP-9-M Red Dot Sight"
+ desc = "Cutting edge UPP sight with automated reticle correction for a fixed zero point. Increases accuracy significantly."
+
/obj/item/attachable/reflex
name = "S6 reflex sight"
- desc = "An ARMAT S6 reflex sight. A zero-magnification alternative to iron sights with a more open optic window when compared to the S5 red-dot. Helps to reduce scatter during automated fire."
- desc_lore = "A simple folding reflex sight designated as the AN/PVG-72 Reflex Sight, compatible with most rail systems. Bulky and built to last, it can link with military HUDs for limited point-of-aim calculations."
+ desc = "An ARMAT S6 reflex sight, type designated as the AN/PVG-72 Reflex. Zero-magnification alternative to irons, decreases scatter during burst fire. Can link with mil-HUDs for a limited CCIP."
icon = 'icons/obj/items/weapons/guns/attachments/rail.dmi'
icon_state = "reflex"
attach_icon = "reflex_a"
@@ -643,10 +645,13 @@ Defined in conflicts.dm of the #defines folder.
burst_scatter_mod = -1
movement_onehanded_acc_penalty_mod = MOVEMENT_ACCURACY_PENALTY_MULT_TIER_5
+/obj/item/attachable/reflex/upp
+ name = "PK-12 Reflex Sight"
+ desc = "Reflector type gunsight compatible with most standard issue UPP firearms. Durable but the power supply is notoriously unreliable. Reduces scatter significantly and boosts accuracy slightly."
/obj/item/attachable/flashlight
name = "rail flashlight"
- desc = "A flashlight, for rails, on guns. Can be toggled on and off. A better light source than standard M3 pattern armor lights."
+ desc = "Railmounted flashlight. Pretty generic. Surprisingly high intensity, as it's a better light source than the suit lamps of most armor systems."
icon = 'icons/obj/items/weapons/guns/attachments/rail.dmi'
icon_state = "flashlight"
attach_icon = "flashlight_a"
@@ -806,6 +811,10 @@ Defined in conflicts.dm of the #defines folder.
to_chat(user, SPAN_NOTICE("Hold on there cowboy, that grip is bolted on. You are unable to modify it."))
return
+/obj/item/attachable/flashlight/grip/upp
+ name = "RK-5A Flashlight Grip"
+ desc = "Folding grip with an integrated flashlight. Reduces recoil and scatter marginally, boosts accuracy slightly. \nStatistically udentical to the underbarrel flashlight grip."
+
/obj/item/attachable/flashlight/laser_light_combo //Unique attachment for the VP78 based on the fact it has a Laser-Light Module in AVP2010
name = "VP78 Laser-Light Module"
desc = "A Laser-Light module for the VP78 Service Pistol which is currently undergoing limited field testing as part of the USCMs next generation pistol program. All VP78 pistols come equipped with the module."
@@ -899,8 +908,7 @@ Defined in conflicts.dm of the #defines folder.
icon = 'icons/obj/items/weapons/guns/attachments/rail.dmi'
icon_state = "sniperscope"
attach_icon = "sniperscope_a"
- desc = "An ARMAT S8 telescopic eye piece. Fixed at 4x zoom. Press the 'use rail attachment' HUD icon or use the verb of the same name to zoom."
- desc_lore = "An intermediate-power Armat scope designated as the AN/PVQ-31 4x Optic. Fairly basic, but both durable and functional... enough. 780 meters is about as far as one can push the 10x24mm cartridge, really."
+ desc = "An ARMAT S8 scope, type designation AN/PVQ-31. Fixed 4x zoom, reduces fire rate and increases wield time but increases accuracy while scoped."
slot = "rail"
aim_speed_mod = SLOWDOWN_ADS_SCOPE //Extra slowdown when wielded
wield_delay_mod = WIELD_DELAY_FAST
@@ -989,6 +997,10 @@ Defined in conflicts.dm of the #defines folder.
#define ZOOM_LEVEL_2X 0
#define ZOOM_LEVEL_4X 1
+/obj/item/attachable/scope/upp
+ name = "PO-M 4x Optic"
+ desc = "Old fashioned 4x scope. Sturdy, but a little unergonomic. UPP tradition. Reduces RoF and increases wield time. Major accuracy bonus when scoped."
+
/obj/item/attachable/scope/variable_zoom
name = "S10 variable zoom telescopic scope"
desc = "An ARMAT S10 telescopic eye piece. Can be switched between 2x zoom, which allows the user to move while scoped in, and 4x zoom. Press the 'use rail attachment' HUD icon or use the verb of the same name to zoom."
@@ -1071,8 +1083,7 @@ Defined in conflicts.dm of the #defines folder.
name = "S4 2x telescopic mini-scope"
icon_state = "miniscope"
attach_icon = "miniscope_a"
- desc = "An ARMAT S4 telescoping eye piece. Fixed at a modest 2x zoom. Press the 'use rail attachment' HUD icon or use the verb of the same name to zoom."
- desc_lore = "A light-duty optic, designated as the AN/PVQ-45 2x Optic. Suited towards short to medium-range engagements. Users are advised to zero it often, as the first mass-production batch had a tendency to drift in one direction or another with sustained use."
+ desc = "An ARMAT S4 scope, type designation AN/PVQ-45. 2x magnification optic, increases accuracy while scoped, decreases RoF and increased wield speed. \nZero often, first production batch suffered from drifting under heavy use and some of them might be in circulation still."
slot = "rail"
zoom_offset = 6
zoom_viewsize = 7
@@ -1095,6 +1106,10 @@ Defined in conflicts.dm of the #defines folder.
G.slowdown -= dynamic_aim_slowdown
..()
+/obj/item/attachable/scope/mini/upp
+ name = "1P93 2x Optic"
+ desc = "Mild update of a 2159 UPP design. Holds zero in all conditions, antiglint grid prevents glare, but the reticle is unfortunately cluttered and busy. Reduces RoF and increases wield time, boosts accuracy while scoped."
+
/obj/item/attachable/scope/mini/flaregun
wield_delay_mod = 0
dynamic_aim_slowdown = SLOWDOWN_ADS_MINISCOPE_DYNAMIC
@@ -1116,11 +1131,11 @@ Defined in conflicts.dm of the #defines folder.
name = "2x hunting mini-scope"
icon_state = "huntingscope"
attach_icon = "huntingscope"
- desc = "This civilian-grade scope is a common sight on hunting rifles due to its cheap price and great optics. Fixed at a modest 2x zoom. Press the 'use rail attachment' HUD icon or use the verb of the same name to zoom."
+ desc = "Generic fixed-magnification 2x optic. Common just about everywhere in civil hands, and sometimes used by law enforcement too."
/obj/item/attachable/scope/mini/nsg23
name = "W-Y S4 2x advanced telescopic mini-scope"
- desc = "An ARMAT S4 telescoping eye piece, custom-tuned by W-Y scientists to be as ergonomic as possible."
+ desc = "An ARMAT S4 telescoping eye piece, revised by W-Y scientists to be much more ergonomic."
icon_state = "miniscope_nsg23"
attach_icon = "miniscope_nsg23_a"
zoom_offset = 7
@@ -1128,7 +1143,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/scope/mini/xm88
name = "XS-9 targeting relay"
- desc = "An ARMAT XS-9 optical interface. Unlike a traditional scope, this rail-mounted device features no telescoping lens. Instead, the firearm's onboard targeting system relays data directly to the optic for the system operator to reference in realtime."
+ desc = "An ARMAT XS-9 optical interface, type designation XAN/PVG-90. Computer controlled 2x magnification with electronic fire control system, interfacing with the rifle's sensors to provide near perfect shooting accuracy... In theory."
icon_state = "boomslang-scope"
zoom_offset = 7
dynamic_aim_slowdown = SLOWDOWN_ADS_NONE
@@ -1142,8 +1157,7 @@ Defined in conflicts.dm of the #defines folder.
name = "B8 Smart-Scope"
icon_state = "iffbarrel"
attach_icon = "iffbarrel_a"
- desc = "An experimental B8 Smart-Scope. Based on the technologies used in the Smart Gun by ARMAT, this sight has integrated IFF systems. It can only attach to the M4RA Battle Rifle and M44 Combat Revolver."
- desc_lore = "An experimental fire-control optic capable of linking into compatible IFF systems on certain weapons, designated the XAN/PVG-110 Smart Scope. Currently programmed for usage with the M4RA battle rifle and M44 Combat Revolver, due to their relatively lower rates of fire. Experimental technology developed by Armat, who have assured that all previously reported issues with false-negative IFF recognitions have been solved. Make sure to check the sight after every op, just in case."
+ desc = "An experimental B8 Smart-Scope, type designation XAN/PVG-110. Limited automated IFF trigger interlock system allows for use with the M44 Combat Revolver and M4RA Battle Rifle. Reduces damage due to the momentary trigger delay."
slot = "rail"
zoom_offset = 6
zoom_viewsize = 7
@@ -1786,7 +1800,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/stock/xm88
name = "\improper XM88 padded stock"
- desc = "A specially made compound polymer stock reinforced with aluminum rods and thick rubber padding to shield the user from recoil. Fitted specifically for the XM88 Heavy Rifle."
+ desc = "A polymer framed alloy reinforced stock for the XM88 antimateriel rifle. Helps manage recoil."
icon_state = "boomslang-stock"
wield_delay_mod = WIELD_DELAY_NORMAL
hud_offset_mod = 6
@@ -1942,8 +1956,8 @@ Defined in conflicts.dm of the #defines folder.
aim_speed_mod = CONFIG_GET(number/slowdown_med)
/obj/item/attachable/stock/rifle/collapsible
- name = "\improper M41A folding stock"
- desc = "The standard back end of any gun starting with \"M41\". Compatible with the M41A series, this stock reduces recoil and improves accuracy, but at a reduction to handling and agility. Also enhances the thwacking of things with the stock-end of the rifle."
+ name = "\improper M41A extendable stock"
+ desc = "The M41A's standard polymer extendable stock. When extended, it improves scatter, accuracy, and recoil, but slightly hinders agility."
slot = "stock"
melee_mod = 5
size_mod = 1
@@ -2185,7 +2199,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/m4ra_barrel
name = "M4RA barrel"
- desc = "This isn't supposed to be seperated from the gun, how'd this happen?"
+ desc = "This isn't supposed to be separated from the gun, how'd this happen?"
icon_state = "m4ra_barrel"
attach_icon = "m4ra_barrel"
slot = "special"
@@ -2211,7 +2225,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/m4ra_barrel_custom
name = "custom M4RA barrel"
- desc = "This isn't supposed to be seperated from the gun, how'd this happen?"
+ desc = "This isn't supposed to be separated from the gun, how'd this happen?"
icon_state = "m4ra_custom_barrel"
attach_icon = "m4ra_custom_barrel"
slot = "special"
@@ -2242,7 +2256,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/upp_rpg_breech
name = "HJRA-12 Breech"
- desc = "This isn't supposed to be seperated from the gun, how'd this happen?"
+ desc = "This isn't supposed to be separated from the gun, how'd this happen?"
icon = 'icons/obj/items/weapons/guns/attachments/stock.dmi'
icon_state = "hjra_breech"
attach_icon = "hjra_breech"
@@ -2254,7 +2268,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/pkpbarrel
name = "QYJ-72 Barrel"
- desc = "This isn't supposed to be seperated from the gun, how'd this happen?"
+ desc = "This isn't supposed to be separated from the gun, how'd this happen?"
icon = 'icons/obj/items/weapons/guns/attachments/barrel.dmi'
icon_state = "uppmg_barrel"
attach_icon = "uppmg_barrel"
@@ -2266,7 +2280,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/stock/pkpstock
name = "QYJ-72 Stock"
- desc = "This isn't supposed to be seperated from the gun, how'd this happen?"
+ desc = "This isn't supposed to be separated from the gun, how'd this happen?"
icon = 'icons/obj/items/weapons/guns/attachments/stock.dmi'
icon_state = "uppmg_stock"
attach_icon = "uppmg_stock"
@@ -2278,7 +2292,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/type88_barrel
name = "Type-88 Barrel"
- desc = "This isn't supposed to be seperated from the gun, how'd this happen?"
+ desc = "This isn't supposed to be separated from the gun, how'd this happen?"
icon = 'icons/obj/items/weapons/guns/attachments/barrel.dmi'
icon_state = "type88_barrel"
attach_icon = "type88_barrel"
@@ -2290,7 +2304,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/type73suppressor
name = "Type 73 Integrated Suppressor"
- desc = "This isn't supposed to be seperated from the gun, how'd this happen?"
+ desc = "This isn't supposed to be separated from the gun, how'd this happen?"
icon = 'icons/obj/items/weapons/guns/attachments/barrel.dmi'
icon_state = "type73_suppressor"
attach_icon = "type73_suppressor"
@@ -2302,7 +2316,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/stock/type71
name = "Type 71 Stock"
- desc = "This isn't supposed to be seperated from the gun, how'd this happen?"
+ desc = "This isn't supposed to be separated from the gun, how'd this happen?"
icon = 'icons/obj/items/weapons/guns/attachments/stock.dmi'
icon_state = "type71_stock"
attach_icon = "type71_stock"
@@ -2431,7 +2445,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/stock/smg/collapsible/brace/apply_on_weapon(obj/item/weapon/gun/G)
if(stock_activated)
- G.flags_item |= NODROP
+ G.flags_item |= NODROP|FORCEDROP_CONDITIONAL
accuracy_mod = -HIT_ACCURACY_MULT_TIER_3
scatter_mod = SCATTER_AMOUNT_TIER_8
recoil_mod = RECOIL_AMOUNT_TIER_2 //Hurts pretty bad if it's wielded.
@@ -2442,7 +2456,7 @@ Defined in conflicts.dm of the #defines folder.
icon_state = "smg_brace_on"
attach_icon = "smg_brace_a_on"
else
- G.flags_item &= ~NODROP
+ G.flags_item &= ~(NODROP|FORCEDROP_CONDITIONAL)
accuracy_mod = 0
scatter_mod = 0
recoil_mod = 0
@@ -2813,8 +2827,8 @@ Defined in conflicts.dm of the #defines folder.
//For the Mk1
/obj/item/attachable/attached_gun/grenade/mk1
- name = "\improper MK1 underslung grenade launcher"
- desc = "An older version of the classic underslung grenade launcher. Can store five grenades, and fire them farther, but fires them slower."
+ name = "\improper PN 30mm underslung grenade launcher"
+ desc = "Standard pump action underslung grenade launcher. Fits the M41A, four round tube, chambers one."
icon_state = "grenade-mk1"
attach_icon = "grenade-mk1_a"
current_rounds = 0
@@ -3003,7 +3017,7 @@ Defined in conflicts.dm of the #defines folder.
name = "\improper U7 underbarrel shotgun"
icon_state = "masterkey"
attach_icon = "masterkey_a"
- desc = "An ARMAT U7 tactical shotgun. Attaches to the underbarrel of most weapons. Only capable of loading up to five buckshot shells. Specialized for breaching into buildings."
+ desc = "An ARMAT U7 tactical shotgun. Attaches to the underbarrel of most weapons. Only capable of loading up to five buckshot shells. Specialized for breaching into buildings, shorter barrel reduces actual damage."
w_class = SIZE_MEDIUM
max_rounds = 5
current_rounds = 5
@@ -3050,7 +3064,7 @@ Defined in conflicts.dm of the #defines folder.
name = "HME-12 underbarrel extinguisher"
icon_state = "extinguisher"
attach_icon = "extinguisher_a"
- desc = "A Taiho-Technologies HME-12 underbarrel extinguisher. Attaches to the underbarrel of most weapons. Point at flame before applying pressure."
+ desc = "A Taiho-Technologies HME-12 underbarrel extinguisher, a miniaturization of a complex used by firefighters. Attaches to the underbarrel of most weapons, point at fire to remove fire."
w_class = SIZE_MEDIUM
slot = "under"
flags_attach_features = ATTACH_REMOVABLE|ATTACH_ACTIVATION|ATTACH_WEAPON|ATTACH_MELEE
@@ -3190,6 +3204,10 @@ Defined in conflicts.dm of the #defines folder.
accuracy_unwielded_mod = -HIT_ACCURACY_MULT_TIER_3
scatter_unwielded_mod = SCATTER_AMOUNT_TIER_10
+/obj/item/attachable/verticalgrip/upp
+ name = "RK-5 Vertical Grip"
+ desc = "Sturdy grip positioned at optimal place offers enhanced stability in rapid fire. Increases weapon size, penalizes one handed fire, improves scatter and accuracy while wielded."
+
/obj/item/attachable/angledgrip
name = "angled grip"
desc = "An angled foregrip that improves weapon ergonomics resulting in faster wielding time. \nHowever, it also increases weapon size."
@@ -3201,6 +3219,10 @@ Defined in conflicts.dm of the #defines folder.
slot = "under"
pixel_shift_x = 20
+/obj/item/attachable/angledgrip/upp
+ name = "RK-9 Angled Grip"
+ desc = "Ergonomic grip decreases time for shouldering the weapon. Increases weapon size, accelerates wield speed."
+
/obj/item/attachable/gyro
name = "gyroscopic stabilizer"
desc = "A set of weights and balances to stabilize the weapon when fired with one hand. Slightly decreases firing speed."
@@ -3228,8 +3250,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/lasersight
name = "laser sight"
- desc = "A laser sight that attaches to the underside of most weapons. Increases accuracy and decreases scatter, especially while one-handed."
- desc_lore = "A standard visible-band laser module designated as the AN/PEQ-42 Laser Sight. Can be mounted onto any firearm that has a lower rail large enough to accommodate it."
+ desc = "Standard issue visible-band underbarrel laser module, type designation AN/PEQ-42. Increases accuracy and decreases scatter, especially while one-handed. Also improves handling on the move."
icon = 'icons/obj/items/weapons/guns/attachments/under.dmi'
icon_state = "lasersight"
attach_icon = "lasersight_a"
@@ -3245,6 +3266,14 @@ Defined in conflicts.dm of the #defines folder.
scatter_unwielded_mod = -SCATTER_AMOUNT_TIER_9
accuracy_unwielded_mod = HIT_ACCURACY_MULT_TIER_1
+/obj/item/attachable/lasersight/upp
+ name = "Zvezda Laser Module"
+ desc = "Visible band 512nm green laser, compatible with NVG and IR. Bears striking resemblance to an old Weyland Yutani offering... Decreases scatter, especially onehanded, slightly boosts accuracy. "
+ icon = 'icons/obj/items/weapons/guns/attachments/under.dmi'
+ icon_state = "lasersight_upp"
+ attach_icon = "lasersight_upp_a"
+ pixel_shift_x = 15
+ pixel_shift_y = 18
/obj/item/attachable/bipod
name = "bipod"
diff --git a/code/modules/projectiles/guns/misc.dm b/code/modules/projectiles/guns/misc.dm
index 098dafb5fd..c65d422344 100644
--- a/code/modules/projectiles/guns/misc.dm
+++ b/code/modules/projectiles/guns/misc.dm
@@ -63,8 +63,8 @@
//M60
/obj/item/weapon/gun/m60
- name = "\improper M60 General Purpose Machine Gun"
- desc = "The M60. The Pig. The Action Hero's wet dream. \nAlt-click it to open the feed cover and allow for reloading."
+ name = "\improper H-G Mk70 Machine Gun"
+ desc = "Part of the Henjin-Garcia repro line, the Mk70 found surprising niche in Frontier colony home defense against aggressive, largescale xenofauna. \nAlt-click to open the feed tray cover for handling reloads."
icon = 'icons/obj/items/weapons/guns/guns_by_faction/colony.dmi'
icon_state = "m60"
item_state = "m60"
diff --git a/code/modules/projectiles/guns/pistols.dm b/code/modules/projectiles/guns/pistols.dm
index 7dff109572..9eed4553f1 100644
--- a/code/modules/projectiles/guns/pistols.dm
+++ b/code/modules/projectiles/guns/pistols.dm
@@ -236,7 +236,6 @@
icon = 'icons/obj/items/weapons/guns/guns_by_faction/colony.dmi'
icon_state = "c_deagle"
item_state = "c_deagle"
- base_gun_icon = "c_deagle"
current_mag = /obj/item/ammo_magazine/pistol/heavy/super/highimpact
black_market_value = 100
@@ -257,7 +256,6 @@
desc = "A Desert Eagle anodized in gold and adorned with rosewood grips. The living definition of ostentatious, it's flashy, unwieldy, tremendously heavy, and kicks like a mule. But as a symbol of power, there's nothing like it."
icon_state = "g_deagle"
item_state = "g_deagle"
- base_gun_icon = "g_deagle"
//-------------------------------------------------------
//NP92 pistol
@@ -588,13 +586,13 @@
name = "\improper 88 Mod 4 combat pistol"
desc = "Standard issue USCM firearm. Also found in the hands of Weyland-Yutani PMC teams. Fires 9mm armor shredding rounds and is capable of 3-round burst."
icon = 'icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi'
- icon_state = "88m4"
- item_state = "88m4"
+ icon_state = "_88m4" // to comply with css standards
+ item_state = "_88m4"
fire_sound = "88m4"
firesound_volume = 20
reload_sound = 'sound/weapons/gun_88m4_reload.ogg'
unload_sound = 'sound/weapons/gun_88m4_unload.ogg'
- current_mag = /obj/item/ammo_magazine/pistol/mod88
+ current_mag = /obj/item/ammo_magazine/pistol/mod88/normalpoint
force = 8
flags_gun_features = GUN_AUTO_EJECTOR|GUN_CAN_POINTBLANK|GUN_ONE_HAND_WIELDED|GUN_AMMO_COUNTER
attachable_allowed = list(
@@ -626,7 +624,7 @@
scatter = SCATTER_AMOUNT_TIER_7
burst_scatter_mult = SCATTER_AMOUNT_TIER_7
scatter_unwielded = SCATTER_AMOUNT_TIER_7
- damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_4
+ damage_mult = BASE_BULLET_DAMAGE_MULT
/obj/item/weapon/gun/pistol/mod88/training
diff --git a/code/modules/projectiles/guns/rifles.dm b/code/modules/projectiles/guns/rifles.dm
index 48918ef2ee..e0f481a7e4 100644
--- a/code/modules/projectiles/guns/rifles.dm
+++ b/code/modules/projectiles/guns/rifles.dm
@@ -1302,17 +1302,24 @@
/obj/item/attachable/flashlight, // Rail
/obj/item/attachable/magnetic_harness,
/obj/item/attachable/scope,
+ /obj/item/attachable/scope/upp,
/obj/item/attachable/scope/mini,
+ /obj/item/attachable/scope/mini/upp,
/obj/item/attachable/reddot,
+ /obj/item/attachable/reddot/upp,
/obj/item/attachable/reflex,
+ /obj/item/attachable/reflex/upp,
/obj/item/attachable/suppressor, // Muzzle
/obj/item/attachable/bayonet,
/obj/item/attachable/bayonet/upp,
/obj/item/attachable/extended_barrel,
/obj/item/attachable/heavy_barrel,
/obj/item/attachable/verticalgrip, // Underbarrel
+ /obj/item/attachable/verticalgrip/upp,
/obj/item/attachable/flashlight/grip,
+ /obj/item/attachable/flashlight/grip/upp,
/obj/item/attachable/lasersight,
+ /obj/item/attachable/lasersight/upp,
/obj/item/attachable/burstfire_assembly,
/obj/item/attachable/attached_gun/flamer,
/obj/item/attachable/attached_gun/flamer/advanced,
@@ -1355,7 +1362,7 @@
random_spawn_chance = 100
random_rail_chance = 70
random_spawn_rail = list(
- /obj/item/attachable/reflex,
+ /obj/item/attachable/reflex/upp,
/obj/item/attachable/flashlight,
)
random_muzzle_chance = 100
@@ -1364,14 +1371,14 @@
)
random_under_chance = 40
random_spawn_under = list(
- /obj/item/attachable/verticalgrip,
+ /obj/item/attachable/verticalgrip/upp,
)
/obj/item/weapon/gun/rifle/type71/dual
random_spawn_chance = 100
random_rail_chance = 70
random_spawn_rail = list(
- /obj/item/attachable/reflex,
+ /obj/item/attachable/reflex/upp,
/obj/item/attachable/flashlight,
)
random_muzzle_chance = 100
@@ -1380,8 +1387,8 @@
)
random_under_chance = 40
random_spawn_under = list(
- /obj/item/attachable/lasersight,
- /obj/item/attachable/verticalgrip,
+ /obj/item/attachable/lasersight/upp,
+ /obj/item/attachable/verticalgrip/upp,
)
/obj/item/weapon/gun/rifle/type71/sapper
@@ -1389,7 +1396,7 @@
random_spawn_chance = 100
random_rail_chance = 80
random_spawn_rail = list(
- /obj/item/attachable/reflex,
+ /obj/item/attachable/reflex/upp,
/obj/item/attachable/flashlight,
/obj/item/attachable/magnetic_harness,
)
@@ -1410,9 +1417,12 @@
/obj/item/attachable/flashlight, // Rail
/obj/item/attachable/magnetic_harness,
/obj/item/attachable/scope,
+ /obj/item/attachable/scope/upp,
/obj/item/attachable/scope/mini,
- /obj/item/attachable/reddot,
+ /obj/item/attachable/scope/mini/upp,
+ /obj/item/attachable/reddot/upp,
/obj/item/attachable/reflex,
+ /obj/item/attachable/reflex/upp,
/obj/item/attachable/suppressor, // Muzzle
/obj/item/attachable/bayonet,
/obj/item/attachable/bayonet/upp,
@@ -1431,10 +1441,10 @@
random_spawn_chance = 100
random_rail_chance = 100
random_spawn_rail = list(
- /obj/item/attachable/reflex,
+ /obj/item/attachable/reflex/upp,
/obj/item/attachable/flashlight,
/obj/item/attachable/magnetic_harness,
- /obj/item/attachable/scope/mini,
+ /obj/item/attachable/scope/mini/upp,
)
random_muzzle_chance = 100
random_spawn_muzzle = list(
@@ -1454,15 +1464,20 @@
/obj/item/attachable/flashlight, // Rail
/obj/item/attachable/magnetic_harness,
/obj/item/attachable/scope,
+ /obj/item/attachable/scope/upp,
/obj/item/attachable/scope/mini,
+ /obj/item/attachable/scope/mini/upp,
/obj/item/attachable/reddot,
+ /obj/item/attachable/reddot/upp,
/obj/item/attachable/reflex,
+ /obj/item/attachable/reflex/upp,
/obj/item/attachable/suppressor, // Muzzle
/obj/item/attachable/bayonet,
/obj/item/attachable/bayonet/upp,
/obj/item/attachable/extended_barrel,
/obj/item/attachable/heavy_barrel,
/obj/item/attachable/verticalgrip, // Underbarrel
+ /obj/item/attachable/verticalgrip/upp,
/obj/item/attachable/burstfire_assembly,
)
@@ -1485,7 +1500,7 @@
random_spawn_chance = 100
random_rail_chance = 70
random_spawn_rail = list(
- /obj/item/attachable/reflex,
+ /obj/item/attachable/reflex/upp,
/obj/item/attachable/flashlight,
)
random_muzzle_chance = 100
@@ -1494,7 +1509,7 @@
)
random_under_chance = 40
random_spawn_under = list(
- /obj/item/attachable/verticalgrip,
+ /obj/item/attachable/verticalgrip/upp,
)
/obj/item/weapon/gun/rifle/type71/carbine/commando
@@ -1509,6 +1524,7 @@
current_mag = /obj/item/ammo_magazine/rifle/type71/ap
attachable_allowed = list(
/obj/item/attachable/verticalgrip,
+ /obj/item/attachable/verticalgrip/upp,
)
random_spawn_chance = 0
random_spawn_rail = list()
diff --git a/code/modules/projectiles/guns/shotguns.dm b/code/modules/projectiles/guns/shotguns.dm
index 9ea6624dc6..a705861f98 100644
--- a/code/modules/projectiles/guns/shotguns.dm
+++ b/code/modules/projectiles/guns/shotguns.dm
@@ -374,14 +374,18 @@ can cause issues with ammo types getting mixed up during the burst.
current_mag = /obj/item/ammo_magazine/internal/shotgun/type23
attachable_allowed = list(
/obj/item/attachable/reddot, // Rail
+ /obj/item/attachable/reddot/upp,
/obj/item/attachable/reflex,
+ /obj/item/attachable/reflex/upp,
/obj/item/attachable/flashlight,
/obj/item/attachable/magnetic_harness,
/obj/item/attachable/bayonet, // Muzzle
/obj/item/attachable/heavy_barrel,
/obj/item/attachable/bayonet/upp,
/obj/item/attachable/verticalgrip, // Underbarrel
+ /obj/item/attachable/verticalgrip/upp,
/obj/item/attachable/flashlight/grip,
+ /obj/item/attachable/flashlight/grip/upp,
/obj/item/attachable/attached_gun/flamer,
/obj/item/attachable/attached_gun/flamer/advanced,
/obj/item/attachable/attached_gun/extinguisher,
@@ -421,7 +425,7 @@ can cause issues with ammo types getting mixed up during the burst.
)
random_under_chance = 40
random_spawn_under = list(
- /obj/item/attachable/verticalgrip,
+ /obj/item/attachable/verticalgrip/upp,
)
/obj/item/weapon/gun/shotgun/type23/breacher/slug
@@ -444,7 +448,7 @@ can cause issues with ammo types getting mixed up during the burst.
random_under_chance = 100
random_spawn_under = list(
/obj/item/attachable/flashlight/grip,
- /obj/item/attachable/verticalgrip,
+ /obj/item/attachable/verticalgrip/upp,
)
/obj/item/weapon/gun/shotgun/type23/dragon
@@ -470,10 +474,13 @@ can cause issues with ammo types getting mixed up during the burst.
current_mag = /obj/item/ammo_magazine/internal/shotgun/type23/beanbag
attachable_allowed = list(
/obj/item/attachable/reddot, //Rail
+ /obj/item/attachable/reddot/upp,
/obj/item/attachable/reflex,
+ /obj/item/attachable/reflex/upp,
/obj/item/attachable/flashlight,
/obj/item/attachable/magnetic_harness,
/obj/item/attachable/verticalgrip, //Underbarrel
+ /obj/item/attachable/verticalgrip/upp,
/obj/item/attachable/stock/type23, //Stock
)
flags_gun_features = GUN_CAN_POINTBLANK|GUN_AMMO_COUNTER|GUN_INTERNAL_MAG
diff --git a/code/modules/projectiles/guns/specialist/sniper.dm b/code/modules/projectiles/guns/specialist/sniper.dm
index e5728c5307..bc0ac3340e 100644
--- a/code/modules/projectiles/guns/specialist/sniper.dm
+++ b/code/modules/projectiles/guns/specialist/sniper.dm
@@ -453,7 +453,8 @@
if(PMC_sniper.body_position == STANDING_UP && !istype(PMC_sniper.wear_suit,/obj/item/clothing/suit/storage/marine/smartgunner/veteran/pmc) && !istype(PMC_sniper.wear_suit,/obj/item/clothing/suit/storage/marine/veteran))
PMC_sniper.visible_message(SPAN_WARNING("[PMC_sniper] is blown backwards from the recoil of the [src.name]!"),SPAN_HIGHDANGER("You are knocked prone by the blowback!"))
step(PMC_sniper,turn(PMC_sniper.dir,180))
- PMC_sniper.apply_effect(5, WEAKEN)
+ PMC_sniper.KnockDown(5)
+ PMC_sniper.Stun(5)
//Type 88 //Based on the actual Dragunov DMR rifle.
@@ -473,6 +474,7 @@
/obj/item/attachable/bayonet/upp,
//Under,
/obj/item/attachable/verticalgrip,
+ /obj/item/attachable/verticalgrip/upp,
/obj/item/attachable/bipod,
//Integrated,
/obj/item/attachable/type88_barrel,
diff --git a/code/modules/projectiles/magazines/misc.dm b/code/modules/projectiles/magazines/misc.dm
index 87568c9532..9e832a2a05 100644
--- a/code/modules/projectiles/magazines/misc.dm
+++ b/code/modules/projectiles/magazines/misc.dm
@@ -19,8 +19,8 @@
//M60
/obj/item/ammo_magazine/m60
- name = "M60 ammo box (7.62x51mm)"
- desc = "A blast from the past chambered in 7.62X51mm NATO."
+ name = "Mk70 belt box (7.62x51mm)"
+ desc = "Limited production run by Henjin-Garcia of old Earth weapons. A 100rnd belt box for their Mk70 reproduction of the M60 GPMG."
caliber = "7.62x51mm"
icon = 'icons/obj/items/weapons/guns/ammo_by_faction/colony.dmi'
icon_state = "m60" //PLACEHOLDER
diff --git a/code/modules/projectiles/magazines/pistols.dm b/code/modules/projectiles/magazines/pistols.dm
index 11e6fe9dbf..3ae221fd42 100644
--- a/code/modules/projectiles/magazines/pistols.dm
+++ b/code/modules/projectiles/magazines/pistols.dm
@@ -74,13 +74,13 @@
ammo_band_color = AMMO_BAND_COLOR_AP
/obj/item/ammo_magazine/pistol/mod88/normalpoint // Unused
- name = "\improper 88M4 FMJ magazine (9mm)"
+ name = "\improper 88M4 magazine (9mm)"
default_ammo = /datum/ammo/bullet/pistol
caliber = "9mm"
ammo_band_color = null
/obj/item/ammo_magazine/pistol/mod88/normalpoint/extended // Unused
- name = "\improper 88M4 FMJ extended magazine (9mm)"
+ name = "\improper 88M4 extended magazine (9mm)"
icon_state = "88m4_mag_ex"
default_ammo = /datum/ammo/bullet/pistol
caliber = "9mm"
diff --git a/code/modules/projectiles/magazines/shotguns.dm b/code/modules/projectiles/magazines/shotguns.dm
index 9e2574eabb..3c26685a55 100644
--- a/code/modules/projectiles/magazines/shotguns.dm
+++ b/code/modules/projectiles/magazines/shotguns.dm
@@ -82,6 +82,7 @@ var/list/shotgun_boxes_12g = list(
/obj/item/ammo_magazine/shotgun/buckshot/special
name = "box of buckshot shells, USCM special type"
desc = "A box filled with buckshot spread shotgun shells, USCM special type. 12 Gauge."
+ icon_state = "special"
default_ammo = /datum/ammo/bullet/shotgun/buckshot/special
//-------------------------------------------------------
@@ -205,6 +206,7 @@ var/list/shotgun_handfuls_12g = list(
/obj/item/ammo_magazine/handful/shotgun/buckshot/special
name = "handful of shotgun buckshot shells, USCM special type (12g)"
+ icon_state = "special_buck_5"
default_ammo = /datum/ammo/bullet/shotgun/buckshot/special
/obj/item/ammo_magazine/handful/shotgun/buckshot/incendiary
diff --git a/code/modules/reagents/chemistry_machinery/acid_harness.dm b/code/modules/reagents/chemistry_machinery/acid_harness.dm
index 52a1a5f13b..b349b3224d 100644
--- a/code/modules/reagents/chemistry_machinery/acid_harness.dm
+++ b/code/modules/reagents/chemistry_machinery/acid_harness.dm
@@ -446,7 +446,7 @@
if(inject_conditions & ACID_SCAN_CONDITION_CONCUSSION && (HAS_TRAIT(src, TRAIT_KNOCKEDOUT) || HAS_TRAIT(src, TRAIT_FLOORED)))
condition_scan |= ACID_SCAN_CONDITION_CONCUSSION
- if(inject_conditions & ACID_SCAN_CONDITION_INTOXICATION && (user.dazed || user.slowed || user.confused || user.drowsyness || user.dizziness || user.druggy))
+ if(inject_conditions & ACID_SCAN_CONDITION_INTOXICATION && (HAS_TRAIT(src, TRAIT_DAZED) || user.slowed || user.confused || user.drowsyness || user.dizziness || user.druggy))
condition_scan |= ACID_SCAN_CONDITION_INTOXICATION
//Compare
diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm
index 8bf7eadc5d..a8a11fc299 100644
--- a/code/modules/reagents/chemistry_properties/prop_positive.dm
+++ b/code/modules/reagents/chemistry_properties/prop_positive.dm
@@ -647,7 +647,7 @@
return
H.chem_effect_flags |= CHEM_EFFECT_RESIST_NEURO
to_chat(M, SPAN_NOTICE("Your skull feels incredibly thick."))
- M.dazed = 0
+ M.SetDaze(0)
/datum/chem_property/positive/neuroshielding/process_overdose(mob/living/M, potency = 1, delta_time)
if(!ishuman(M))
diff --git a/code/modules/reagents/chemistry_reactions/food_drink.dm b/code/modules/reagents/chemistry_reactions/food_drink.dm
index 7e3fdac324..63c79ea577 100644
--- a/code/modules/reagents/chemistry_reactions/food_drink.dm
+++ b/code/modules/reagents/chemistry_reactions/food_drink.dm
@@ -186,6 +186,66 @@
required_reagents = list("hot_ramen" = 6, "hotsauce" = 1)
result_amount = 6
+/datum/chemical_reaction/banana //WHO DIDN'T MAKE ALL THE JUICES SUBTYPES OF A PARENT ONE AAAAAA
+ name = "Banana Juice"
+ id = "banana"
+ result = "banana"
+ required_reagents = list("dehydrated_juice" = 1, "water" = 5)
+ result_amount = 5
+
+/datum/chemical_reaction/orangejuice
+ name = "Orange Juice"
+ id = "orangejuice"
+ result = "orangejuice"
+ required_reagents = list("dehydrated_orange_juice" = 1, "water" = 5)
+ result_amount = 5
+
+/datum/chemical_reaction/applejuice
+ name = "Apple Juice"
+ id = "applejuice"
+ result = "applejuice"
+ required_reagents = list("dehydrated_apple_juice" = 1, "water" = 5)
+ result_amount = 5
+
+/datum/chemical_reaction/watermelonjuice
+ name = "Watermelon Juice"
+ id = "watermelonjuice"
+ result = "watermelonjuice"
+ required_reagents = list("dehydrated_watermelon_juice" = 1, "water" = 5)
+ result_amount = 5
+
+/datum/chemical_reaction/grapejuice
+ name = "Grape Juice"
+ id = "grapejuice"
+ result = "grapejuice"
+ required_reagents = list("dehydrated_grape_juice" = 1, "water" = 5)
+ result_amount = 5
+
+/datum/chemical_reaction/pineapplejuice
+ name = "Pineapple Juice"
+ id = "pineapplejuice"
+ result = "pineapplejuice"
+ required_reagents = list("dehydrated_pineapple_juice" = 1, "water" = 5)
+ result_amount = 5
+
+/datum/chemical_reaction/egg
+ name = "Rehydrated Egg Product"
+ id = "egg"
+ result = "egg"
+ required_reagents = list("dehydrated_egg_powder" = 1, "water" = 5)
+ result_amount = 1
+
+/datum/chemical_reaction/egg/on_reaction(datum/reagents/holder, created_volume)
+ var/location = get_turf(holder.my_atom)
+ new /obj/item/reagent_container/food/snacks/egg/dried(location)
+
+/datum/chemical_reaction/milk
+ name = "Rehydrated Milk"
+ id = "milk"
+ result = "milk"
+ required_reagents = list("dehydrated_milk_powder" = 1, "water" = 5)
+ result_amount = 5
+
//*****************************************************************************************************/
//******************************************Cocktails**************************************************/
diff --git a/code/modules/reagents/chemistry_reagents/drink.dm b/code/modules/reagents/chemistry_reagents/drink.dm
index 66ce084455..e06f898be4 100644
--- a/code/modules/reagents/chemistry_reagents/drink.dm
+++ b/code/modules/reagents/chemistry_reagents/drink.dm
@@ -151,6 +151,17 @@
description = "Made in the modern day with proper pomegranate substitute. Who uses real fruit, anyways?"
color = "#FF004F" // rgb: 255, 0, 79
+/datum/reagent/drink/pineapplejuice
+ name = "Pineapple Juice"
+ id = "pineapplejuice"
+ description = "Refreshingly citric, with a pleasant flavor."
+ color = "#FFC000" // rgb: 255, 192, 0
+
+/datum/reagent/drink/applejuice
+ name = "Apple Juice"
+ id = "applejuice"
+ description = "The pleasantly sweet taste of apples, now in liquid form."
+ color = "#f59a40" // rgb: 245, 154, 64
//MILK//
@@ -555,8 +566,7 @@
/datum/reagent/neurotoxin/on_mob_life(mob/living/carbon/M)
. = ..()
if(!.) return
- if(!HAS_TRAIT(src, TRAIT_FLOORED))
- M.apply_effect(5, WEAKEN)
+ M.KnockDown(5)
if(!data) data = 1
data++
M.dizziness +=6
diff --git a/code/modules/reagents/chemistry_reagents/food.dm b/code/modules/reagents/chemistry_reagents/food.dm
index 0ec3a22502..8e167908b2 100644
--- a/code/modules/reagents/chemistry_reagents/food.dm
+++ b/code/modules/reagents/chemistry_reagents/food.dm
@@ -307,3 +307,83 @@
color = "#FFFF00"
chemclass = CHEM_CLASS_RARE
flags = REAGENT_NO_GENERATION
+
+/datum/reagent/dehydrated_juice
+ name = "Mystery Juice Powder"
+ id = "dehydrated_juice"
+ description = "Powderized fruit-juice ready to be mixed with water. Smells of artificial bananas."
+ reagent_state = SOLID
+ color = "#863333" // rgb: 175, 175, 0
+ chemclass = CHEM_CLASS_COMMON
+ properties = list(PROPERTY_NUTRITIOUS = 2)
+ flags = REAGENT_NO_GENERATION
+
+/datum/reagent/dehydrated_orange_juice
+ name = "Orange Juice Powder"
+ id = "dehydrated_orange_juice"
+ description = "Powderized orange-juice ready to be mixed with water. Smells of, surprise surprise, oranges."
+ reagent_state = SOLID
+ color = "#E78108" // rgb: 231, 129, 8
+ chemclass = CHEM_CLASS_COMMON
+ properties = list(PROPERTY_NUTRITIOUS = 2)
+ flags = REAGENT_NO_GENERATION
+
+/datum/reagent/dehydrated_apple_juice
+ name = "Apple Juice Powder"
+ id = "dehydrated_apple_juice"
+ description = "Powderized apple-juice ready to be mixed with water. Smells of, surprise surprise, apples."
+ reagent_state = SOLID
+ color = "#365E30" // rgb: 54, 94, 48
+ chemclass = CHEM_CLASS_COMMON
+ properties = list(PROPERTY_NUTRITIOUS = 2)
+ flags = REAGENT_NO_GENERATION
+
+/datum/reagent/dehydrated_watermelon_juice
+ name = "Watermelon Juice Powder"
+ id = "dehydrated_watermelon_juice"
+ description = "Powderized watermelon-juice ready to be mixed with water. Smells of, surprise surprise, watermelons."
+ reagent_state = SOLID
+ color = "#863333" // rgb: 134, 51, 51
+ chemclass = CHEM_CLASS_COMMON
+ properties = list(PROPERTY_NUTRITIOUS = 2)
+ flags = REAGENT_NO_GENERATION
+
+/datum/reagent/dehydrated_grape_juice
+ name = "Grape Juice Powder"
+ id = "dehydrated_grape_juice"
+ description = "Powderized grape-juice ready to be mixed with water. Smells of, surprise surprise, grapes."
+ reagent_state = SOLID
+ color = "#863333" // rgb: 134, 51, 51
+ chemclass = CHEM_CLASS_COMMON
+ properties = list(PROPERTY_NUTRITIOUS = 2)
+ flags = REAGENT_NO_GENERATION
+
+/datum/reagent/dehydrated_pineapple_juice
+ name = "Pineapple Juice Powder"
+ id = "dehydrated_pineapple_juice"
+ description = "Powderized pineapple-juice ready to be mixed with water. Smells of, surprise surprise, pineapples."
+ reagent_state = SOLID
+ color = "#FFC000" // rgb: 255, 192, 0
+ chemclass = CHEM_CLASS_COMMON
+ properties = list(PROPERTY_NUTRITIOUS = 2)
+ flags = REAGENT_NO_GENERATION
+
+/datum/reagent/dehydrated_egg_powder
+ name = "Powdered Egg"
+ id = "dehydrated_egg_powder"
+ description = "Powderized egg-whites and egg-yolk ready to be mixed with water."
+ reagent_state = SOLID
+ color = "#FFFFFF" // rgb: 255,255,255
+ chemclass = CHEM_CLASS_COMMON
+ properties = list(PROPERTY_NUTRITIOUS = 2)
+ flags = REAGENT_NO_GENERATION
+
+/datum/reagent/dehydrated_milk_powder
+ name = "Dehydrated Milk Powder"
+ id = "dehydrated_milk_powder"
+ description = "Dehydrated milk-product powder waiting to be mixed with water."
+ reagent_state = SOLID
+ color = "#DFDFDF" // rgb: 223, 223, 223
+ chemclass = CHEM_CLASS_COMMON
+ properties = list(PROPERTY_NUTRITIOUS = 2)
+ flags = REAGENT_NO_GENERATION
diff --git a/code/modules/reagents/chemistry_reagents/toxin.dm b/code/modules/reagents/chemistry_reagents/toxin.dm
index d9be565a85..445918ef28 100644
--- a/code/modules/reagents/chemistry_reagents/toxin.dm
+++ b/code/modules/reagents/chemistry_reagents/toxin.dm
@@ -115,7 +115,8 @@
M.status_flags |= FAKEDEATH
ADD_TRAIT(M, TRAIT_IMMOBILIZED, FAKEDEATH_TRAIT)
M.apply_damage(0.5*REM, OXY)
- M.apply_effect(2, WEAKEN)
+ M.KnockDown(2)
+ M.Stun(2)
M.silent = max(M.silent, 10)
/datum/reagent/toxin/zombiepowder/on_delete()
diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm
index 3d0c8fca14..549ddb3bfa 100644
--- a/code/modules/shuttle/computer.dm
+++ b/code/modules/shuttle/computer.dm
@@ -81,8 +81,8 @@
to_chat(usr, SPAN_NOTICE("Unable to comply."))
return TRUE
-/obj/structure/machinery/computer/shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
- if(port && (shuttleId == initial(shuttleId) || override))
+/obj/structure/machinery/computer/shuttle/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock)
+ if(port && (shuttleId == initial(shuttleId)))
shuttleId = port.id
/obj/structure/machinery/computer/shuttle/ert
diff --git a/code/modules/shuttle/computers/dropship_computer.dm b/code/modules/shuttle/computers/dropship_computer.dm
index 3f688c5721..0024958c8e 100644
--- a/code/modules/shuttle/computers/dropship_computer.dm
+++ b/code/modules/shuttle/computers/dropship_computer.dm
@@ -379,7 +379,7 @@
update_equipment(is_optimised, FALSE)
var/list/local_data = ui_data(user)
var/found = FALSE
- playsound(loc, get_sfx("terminal_button"), KEYBOARD_SOUND_VOLUME, 1)
+ playsound(loc, get_sfx("terminal_button"), 5, 1)
for(var/destination in local_data["destinations"])
if(destination["id"] == dock_id)
found = TRUE
@@ -502,9 +502,14 @@
needs_power = TRUE
/obj/structure/machinery/computer/shuttle/dropship/flight/toc
- name = "midway control screen"
+ name = "dropship control screen"
desc = "A screen on the TOC computer for controlling the dropship linked to it."
icon = 'icons/obj/structures/machinery/computer.dmi'
icon_state = "toc_shuttle"
shuttleId = DROPSHIP_MIDWAY
is_remote = TRUE
+
+/obj/structure/machinery/computer/shuttle/dropship/flight/small
+ icon = 'icons/obj/structures/machinery/computer.dmi'
+ icon_state = "cameras_old"
+
diff --git a/code/modules/shuttle/docking.dm b/code/modules/shuttle/docking.dm
index a21ec330d4..63e220dead 100644
--- a/code/modules/shuttle/docking.dm
+++ b/code/modules/shuttle/docking.dm
@@ -1,7 +1,5 @@
/// This is the main proc. It instantly moves our mobile port to stationary port `new_dock`.
/obj/docking_port/mobile/proc/initiate_docking(obj/docking_port/stationary/new_dock, movement_direction, force=FALSE)
- // Crashing this ship with NO SURVIVORS
-
if(new_dock.get_docked() == src)
remove_ripples()
return DOCKING_SUCCESS
diff --git a/code/modules/shuttle/dropship.dm b/code/modules/shuttle/dropship.dm
index cbca500f8f..bf38f9fa3b 100644
--- a/code/modules/shuttle/dropship.dm
+++ b/code/modules/shuttle/dropship.dm
@@ -215,3 +215,47 @@
/obj/structure/shuttle/part/dropship2/transparent/right_outer_bottom_wing
icon_state = "6"
+/obj/structure/shuttle/part/midway
+ name = "\improper Midway"
+ icon = 'icons/turf/dropship4.dmi'
+ icon_state = "1"
+ opacity = TRUE
+
+/obj/structure/shuttle/part/midway/transparent
+ opacity = FALSE
+
+/obj/structure/shuttle/part/cyclone
+ name = "\improper Cyclone"
+ icon = 'icons/turf/dropship2.dmi'
+ icon_state = "1"
+ opacity = TRUE
+
+/obj/structure/shuttle/part/cyclone/transparent
+ opacity = FALSE
+
+/obj/structure/shuttle/part/tornado
+ name = "\improper Tornado"
+ icon = 'icons/turf/dropship3.dmi'
+ icon_state = "1"
+ opacity = TRUE
+
+/obj/structure/shuttle/part/tornado/transparent
+ opacity = FALSE
+
+/obj/structure/shuttle/part/typhoon
+ name = "\improper Typhoon"
+ icon = 'icons/turf/dropship3.dmi'
+ icon_state = "1"
+ opacity = TRUE
+
+/obj/structure/shuttle/part/typhoon/transparent
+ opacity = FALSE
+
+/obj/structure/shuttle/part/tripoli
+ name = "\improper Tripoli"
+ icon = 'icons/turf/dropship.dmi'
+ icon_state = "1"
+ opacity = TRUE
+
+/obj/structure/shuttle/part/tripoli/transparent
+ opacity = FALSE
diff --git a/code/modules/shuttle/helpers.dm b/code/modules/shuttle/helpers.dm
index cb4082c761..9c8d817ec2 100644
--- a/code/modules/shuttle/helpers.dm
+++ b/code/modules/shuttle/helpers.dm
@@ -130,14 +130,13 @@
lockdown_door(air)
/datum/door_controller/single/proc/bump_at_turf(turf/door_turf)
- for(var/mob/blocking_mob in door_turf)
- if(isliving(blocking_mob))
- to_chat(blocking_mob, SPAN_HIGHDANGER("You get thrown back as the [label] doors slam shut!"))
- blocking_mob.apply_effect(4, WEAKEN)
- for(var/turf/target_turf in orange(1, door_turf)) // Forcemove to a non shuttle turf
- if(!istype(target_turf, /turf/open/shuttle) && !istype(target_turf, /turf/closed/shuttle))
- blocking_mob.forceMove(target_turf)
- break
+ for(var/mob/living/blocking_mob in door_turf)
+ to_chat(blocking_mob, SPAN_HIGHDANGER("You get thrown back as the [label] doors slam shut!"))
+ blocking_mob.KnockDown(4)
+ for(var/turf/target_turf in orange(1, door_turf)) // Forcemove to a non shuttle turf
+ if(!istype(target_turf, /turf/open/shuttle) && !istype(target_turf, /turf/closed/shuttle))
+ blocking_mob.forceMove(target_turf)
+ break
/datum/door_controller/proc/lockdown_door(obj/structure/machinery/door/target)
if(istype(target, /obj/structure/machinery/door/airlock))
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 85fc38bf5f..ad00a0b68f 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -19,6 +19,8 @@
* port can be used in these places, or the docking port is compatible, etc.
*/
var/id
+ ///The original template shuttle_id for this shuttle (so without a suffix identifier)
+ var/template_id
///Possible destinations
var/port_destinations
///this should point -away- from the dockingport door, ie towards the ship
@@ -380,10 +382,82 @@
var/shuttle_flags = NONE
+#define WORLDMAXX_CUTOFF (world.maxx + 1)
+#define WORLDMAXY_CUTOFF (world.maxx + 1)
+/**
+ * Calculated and populates the information used for docking and some internal vars.
+ * This can also be used to calculate from shuttle_areas so that you can expand/shrink shuttles!
+ *
+ * Arguments:
+ * * loading_from - The template that the shuttle was loaded from, if not given we iterate shuttle_areas to calculate information instead
+ */
+/obj/docking_port/mobile/proc/calculate_docking_port_information(datum/map_template/shuttle/loading_from)
+ var/port_x_offset = loading_from?.port_x_offset
+ var/port_y_offset = loading_from?.port_y_offset
+ var/width = loading_from?.width
+ var/height = loading_from?.height
+ if(!loading_from)
+ if(!length(shuttle_areas))
+ CRASH("Attempted to calculate a docking port's information without a template before it was assigned any areas!")
+ // no template given, use shuttle_areas to calculate width and height
+ var/min_x = -1
+ var/min_y = -1
+ var/max_x = WORLDMAXX_CUTOFF
+ var/max_y = WORLDMAXY_CUTOFF
+ for(var/area/area as anything in shuttle_areas)
+ for(var/turf/turf in area)
+ min_x = max(turf.x, min_x)
+ max_x = min(turf.x, max_x)
+ min_y = max(turf.y, min_y)
+ max_y = min(turf.y, max_y)
+ CHECK_TICK
+
+ if(min_x == -1 || max_x == WORLDMAXX_CUTOFF)
+ CRASH("Failed to locate shuttle boundaries when iterating through shuttle areas, somehow.")
+ if(min_y == -1 || max_y == WORLDMAXY_CUTOFF)
+ CRASH("Failed to locate shuttle boundaries when iterating through shuttle areas, somehow.")
+
+ width = (max_x - min_x) + 1
+ height = (max_y - min_y) + 1
+ port_x_offset = min_x - x
+ port_y_offset = min_y - y
+
+ if(dir in list(EAST, WEST))
+ src.width = height
+ src.height = width
+ else
+ src.width = width
+ src.height = height
+
+ switch(dir)
+ if(NORTH)
+ dwidth = port_x_offset - 1
+ dheight = port_y_offset - 1
+ if(EAST)
+ dwidth = height - port_y_offset
+ dheight = port_x_offset - 1
+ if(SOUTH)
+ dwidth = width - port_x_offset
+ dheight = height - port_y_offset
+ if(WEST)
+ dwidth = port_y_offset - 1
+ dheight = width - port_x_offset
+#undef WORLDMAXX_CUTOFF
+#undef WORLDMAXY_CUTOFF
+
/obj/docking_port/mobile/register()
. = ..()
SSshuttle.mobile += src
+/**
+ * Actions to be taken after shuttle is loaded and has been moved to its final location
+ *
+ * Arguments:
+ * * replace - TRUE if this shuttle is replacing an existing one. FALSE by default.
+ */
+/obj/docking_port/mobile/proc/postregister(replace = FALSE)
+ return
+
/obj/docking_port/mobile/Destroy(force)
if(force)
QDEL_NULL(alarm_sound_loop)
@@ -442,6 +516,10 @@
// Called after the shuttle is loaded from template
/obj/docking_port/mobile/proc/linkup(datum/map_template/shuttle/template, obj/docking_port/stationary/dock)
+
+ // ================== CM Change ==================
+ // This is gone in /tg/ backend but kept for historical reasons
+ // Suspect this is supposed to be handled in register
var/list/static/shuttle_id = list()
var/idnum = ++shuttle_id[id]
if(idnum > 1)
@@ -449,12 +527,13 @@
id = "[id][idnum]"
if(name == initial(name))
name = "[name] [idnum]"
- for(var/place in shuttle_areas)
- var/area/area = place
- area.connect_to_shuttle(src, dock, idnum, FALSE)
- for(var/each in place)
- var/atom/atom = each
- atom.connect_to_shuttle(src, dock, idnum, FALSE)
+ template_id = template.shuttle_id // Value without the idnum
+ // ================ END CM Change ================
+
+ for(var/area/place as anything in shuttle_areas)
+ place.connect_to_shuttle(TRUE, src, dock)
+ for(var/atom/individual_atoms in place)
+ individual_atoms.connect_to_shuttle(TRUE, src, dock)
//this is a hook for custom behaviour. Maybe at some point we could add checks to see if engines are intact
@@ -1004,3 +1083,15 @@
to_chat(user, SPAN_WARNING("Shuttle already in transit."))
return FALSE
return TRUE
+
+/obj/docking_port/mobile/proc/get_transit_path_type()
+ . = /turf/open/space/transit
+ switch(preferred_direction)
+ if(NORTH)
+ return /turf/open/space/transit/north
+ if(SOUTH)
+ return /turf/open/space/transit/south
+ if(EAST)
+ return /turf/open/space/transit/east
+ if(WEST)
+ return /turf/open/space/transit/west
diff --git a/code/modules/shuttle/shuttles/dropship.dm b/code/modules/shuttle/shuttles/dropship.dm
index bd9beefb61..23bb364e85 100644
--- a/code/modules/shuttle/shuttles/dropship.dm
+++ b/code/modules/shuttle/shuttles/dropship.dm
@@ -29,6 +29,8 @@
var/automated_lz_id
var/automated_delay
var/automated_timer
+ var/datum/cas_signal/paradrop_signal
+
/obj/docking_port/mobile/marine_dropship/Initialize(mapload)
. = ..()
@@ -42,19 +44,29 @@
door_control.add_door(air, "port")
if("aft_door")
door_control.add_door(air, "aft")
- var/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/hatch = air
- if(istype(hatch))
- hatch.linked_dropship = src
+
+ RegisterSignal(src, COMSIG_DROPSHIP_ADD_EQUIPMENT, PROC_REF(add_equipment))
+ RegisterSignal(src, COMSIG_DROPSHIP_REMOVE_EQUIPMENT, PROC_REF(remove_equipment))
/obj/docking_port/mobile/marine_dropship/Destroy(force)
. = ..()
qdel(door_control)
+ UnregisterSignal(src, COMSIG_DROPSHIP_ADD_EQUIPMENT)
+ UnregisterSignal(src, COMSIG_DROPSHIP_REMOVE_EQUIPMENT)
/obj/docking_port/mobile/marine_dropship/proc/send_for_flyby()
in_flyby = TRUE
var/obj/docking_port/stationary/dockedAt = get_docked()
SSshuttle.moveShuttle(src.id, dockedAt.id, TRUE)
+/obj/docking_port/mobile/marine_dropship/proc/add_equipment(obj/docking_port/mobile/marine_dropship/dropship, obj/structure/dropship_equipment/equipment)
+ SIGNAL_HANDLER
+ equipments += equipment
+
+/obj/docking_port/mobile/marine_dropship/proc/remove_equipment(obj/docking_port/mobile/marine_dropship/dropship, obj/structure/dropship_equipment/equipment)
+ SIGNAL_HANDLER
+ equipments -= equipment
+
/obj/docking_port/mobile/marine_dropship/proc/get_door_data()
return door_control.get_data()
@@ -118,6 +130,9 @@
dwidth = 4
dheight = 8
+/obj/docking_port/mobile/marine_dropship/midway/get_transit_path_type()
+ return /turf/open/space/transit/dropship/midway
+
/obj/docking_port/mobile/marine_dropship/upp
name = "Akademia Nauk"
id = DROPSHIP_UPP
@@ -127,6 +142,9 @@
dwidth = 4
dheight = 8
+/obj/docking_port/mobile/marine_dropship/upp/get_transit_path_type()
+ return /turf/open/space/transit/dropship/upp
+
/obj/docking_port/mobile/marine_dropship/cyclone
name = "Cyclone"
id = DROPSHIP_CYCLONE
@@ -136,13 +154,60 @@
dwidth = 4
dheight = 8
+/obj/docking_port/mobile/marine_dropship/cyclone/get_transit_path_type()
+ return /turf/open/space/transit/dropship/cyclone
+
+/obj/docking_port/mobile/marine_dropship/tornado
+ name = "HLD-Tornado"
+ id = DROPSHIP_TORNADO
+ width = 11
+ height = 18
+
+ dwidth = 5
+ dheight = 9
+
+/obj/docking_port/mobile/marine_dropship/tornado/get_transit_path_type()
+ return /turf/open/space/transit/dropship/tornado
+
+/obj/docking_port/mobile/marine_dropship/typhoon
+ name = "CMD-Typhoon"
+ id = DROPSHIP_TYPHOON
+ width = 11
+ height = 18
+
+ dwidth = 5
+ dheight = 9
+
+/obj/docking_port/mobile/marine_dropship/typhoon/get_transit_path_type()
+ return /turf/open/space/transit/dropship/typhoon
+
+/obj/docking_port/mobile/marine_dropship/tripoli
+ name = "Tripoli"
+ id = DROPSHIP_TRIPOLI
+ width = 9
+ height = 18
+
+ dwidth = 4
+ dheight = 8
+
+/obj/docking_port/mobile/marine_dropship/tripoli/get_transit_path_type()
+ return /turf/open/space/transit/dropship/tripoli
+
/obj/docking_port/mobile/marine_dropship/alamo
name = "Alamo"
id = DROPSHIP_ALAMO
+ preferred_direction = SOUTH // If you are changing this, please update the dir of the path below as well
+
+/obj/docking_port/mobile/marine_dropship/alamo/get_transit_path_type()
+ return /turf/open/space/transit/dropship/alamo
/obj/docking_port/mobile/marine_dropship/normandy
name = "Normandy"
id = DROPSHIP_NORMANDY
+ preferred_direction = SOUTH // If you are changing this, please update the dir of the path below as well
+
+/obj/docking_port/mobile/marine_dropship/normandy/get_transit_path_type()
+ return /turf/open/space/transit/dropship/normandy
/obj/docking_port/mobile/marine_dropship/check()
. = ..()
@@ -342,3 +407,15 @@
/datum/map_template/shuttle/cyclone
name = "Cyclone"
shuttle_id = DROPSHIP_CYCLONE
+
+/datum/map_template/shuttle/typhoon
+ name = "CMD-Typhoon"
+ shuttle_id = DROPSHIP_TYPHOON
+
+/datum/map_template/shuttle/tornado
+ name = "HLD-Tornado"
+ shuttle_id = DROPSHIP_TORNADO
+
+/datum/map_template/shuttle/tripoli
+ name = "Tripoli"
+ shuttle_id = DROPSHIP_TRIPOLI
diff --git a/code/modules/shuttle/shuttles/ert.dm b/code/modules/shuttle/shuttles/ert.dm
index 1760caf3d8..b619645c50 100644
--- a/code/modules/shuttle/shuttles/ert.dm
+++ b/code/modules/shuttle/shuttles/ert.dm
@@ -61,14 +61,13 @@
INVOKE_ASYNC(src, PROC_REF(lockdown_door_launch), door)
/obj/docking_port/mobile/emergency_response/proc/lockdown_door_launch(obj/structure/machinery/door/airlock/air)
- for(var/mob/blocking_mob in air.loc) // Bump all mobs outta the way for outside airlocks of shuttles
- if(isliving(blocking_mob))
- to_chat(blocking_mob, SPAN_HIGHDANGER("You get thrown back as the dropship doors slam shut!"))
- blocking_mob.apply_effect(4, WEAKEN)
- for(var/turf/target_turf in orange(1, air)) // Forcemove to a non shuttle turf
- if(!istype(target_turf, /turf/open/shuttle) && !istype(target_turf, /turf/closed/shuttle))
- blocking_mob.forceMove(target_turf)
- break
+ for(var/mob/living/blocking_mob in air.loc) // Bump all mobs outta the way for outside airlocks of shuttles
+ to_chat(blocking_mob, SPAN_HIGHDANGER("You get thrown back as the dropship doors slam shut!"))
+ blocking_mob.KnockDown(4)
+ for(var/turf/target_turf in orange(1, air)) // Forcemove to a non shuttle turf
+ if(!istype(target_turf, /turf/open/shuttle) && !istype(target_turf, /turf/closed/shuttle))
+ blocking_mob.forceMove(target_turf)
+ break
lockdown_door(air)
/obj/docking_port/mobile/emergency_response/proc/lockdown_door(obj/structure/machinery/door/airlock/air)
diff --git a/code/modules/shuttle/shuttles/trijent_elevator.dm b/code/modules/shuttle/shuttles/trijent_elevator.dm
index 89d0800017..4e0e7fbced 100644
--- a/code/modules/shuttle/shuttles/trijent_elevator.dm
+++ b/code/modules/shuttle/shuttles/trijent_elevator.dm
@@ -27,6 +27,8 @@
door_control.label = "elevator"
for(var/area/shuttle_area in shuttle_areas)
for(var/obj/structure/machinery/door/door in shuttle_area)
+ if(istype(door, /obj/structure/machinery/door/poddoor/filler_object)) //poddoor filler was sneaking in
+ continue
door_control.add_door(door, door.id)
/obj/docking_port/mobile/trijent_elevator/Destroy(force, ...)
@@ -37,12 +39,6 @@
. = ..()
door_control.control_doors("force-lock-launch", "all", force=TRUE)
-/obj/docking_port/mobile/trijent_elevator/linkup(datum/map_template/shuttle/template, obj/docking_port/stationary/dock)
- ..()
- var/datum/map_template/shuttle/trijent_elevator/elev = template
- elevator_network = elev.elevator_network
- log_debug("Adding network [elev.elevator_network] to [id]")
-
/obj/docking_port/stationary/trijent_elevator
dir=NORTH
width=7
diff --git a/code/modules/shuttles/marine_ferry.dm b/code/modules/shuttles/marine_ferry.dm
index 79988bbb8d..5a5a49ebaa 100644
--- a/code/modules/shuttles/marine_ferry.dm
+++ b/code/modules/shuttles/marine_ferry.dm
@@ -606,14 +606,13 @@
/datum/shuttle/ferry/marine/force_close_launch(obj/structure/machinery/door/AL)
if(!iselevator)
- for(var/mob/M in AL.loc) // Bump all mobs outta the way for outside airlocks of shuttles
- if(isliving(M))
- to_chat(M, SPAN_HIGHDANGER("You get thrown back as the dropship doors slam shut!"))
- M.apply_effect(4, WEAKEN)
- for(var/turf/T in orange(1, AL)) // Forcemove to a non shuttle turf
- if(!istype(T, /turf/open/shuttle) && !istype(T, /turf/closed/shuttle))
- M.forceMove(T)
- break
+ for(var/mob/living/M in AL.loc) // Bump all mobs outta the way for outside airlocks of shuttles
+ to_chat(M, SPAN_HIGHDANGER("You get thrown back as the dropship doors slam shut!"))
+ M.KnockDown(4)
+ for(var/turf/T in orange(1, AL)) // Forcemove to a non shuttle turf
+ if(!istype(T, /turf/open/shuttle) && !istype(T, /turf/closed/shuttle))
+ M.forceMove(T)
+ break
return ..() // Sleeps
/datum/shuttle/ferry/marine/open_doors(list/L)
diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm
index a5911d18b3..af7019a08c 100644
--- a/code/modules/shuttles/shuttle.dm
+++ b/code/modules/shuttles/shuttle.dm
@@ -29,8 +29,6 @@
var/iselevator = 0 //Used to remove some shuttle related procs and texts to make it compatible with elevators
var/almayerelevator = 0 //elevators on the almayer without limitations
- var/list/last_passangers = list() //list of living creatures that were our last passengers
-
var/require_link = FALSE
var/linked = FALSE
var/ambience_muffle = MUFFLE_HIGH
@@ -202,9 +200,7 @@
origin.move_contents_to(destination, direction=direction)
- last_passangers.Cut()
- for(var/mob/M in destination)
- last_passangers += M
+ for(var/mob/living/M in destination)
if(M.client)
spawn(0)
if(M.buckled && !iselevator)
@@ -215,7 +211,8 @@
shake_camera(M, iselevator? 2 : 10, 1)
if(istype(M, /mob/living/carbon) && !iselevator)
if(!M.buckled)
- M.apply_effect(3, WEAKEN)
+ M.Stun(3)
+ M.KnockDown(3)
for(var/turf/T in origin) // WOW so hacky - who cares. Abby
if(iselevator)
diff --git a/code/modules/tgs/README.md b/code/modules/tgs/README.md
index 6319028d81..35ca73d7e9 100644
--- a/code/modules/tgs/README.md
+++ b/code/modules/tgs/README.md
@@ -1,6 +1,6 @@
# DMAPI Internals
-This folder should be placed on it's own inside a codebase that wishes to use the TGS DMAPI. Warranty void if modified.
+This folder should be placed on its own inside a codebase that wishes to use the TGS DMAPI. Warranty void if modified.
- [includes.dm](./includes.dm) is the file that should be included by DM code, it handles including the rest.
- The [core](./core) folder includes all code not directly part of any API version.
diff --git a/code/modules/tgs/core/README.md b/code/modules/tgs/core/README.md
index b82d8f49e2..965e21b549 100644
--- a/code/modules/tgs/core/README.md
+++ b/code/modules/tgs/core/README.md
@@ -3,7 +3,7 @@
This folder contains all DMAPI code not directly involved in an API.
- [_definitions.dm](./definitions.dm) contains defines needed across DMAPI internals.
+- [byond_world_export.dm](./byond_world_export.dm) contains the default `/datum/tgs_http_handler` implementation which uses `world.Export()`.
- [core.dm](./core.dm) contains the implementations of the `/world/proc/TgsXXX()` procs. Many map directly to the `/datum/tgs_api` functions. It also contains the /datum selection and setup code.
- [datum.dm](./datum.dm) contains the `/datum/tgs_api` declarations that all APIs must implement.
- [tgs_version.dm](./tgs_version.dm) contains the `/datum/tgs_version` definition
--
diff --git a/code/modules/tgs/core/byond_world_export.dm b/code/modules/tgs/core/byond_world_export.dm
new file mode 100644
index 0000000000..6ef8d841b8
--- /dev/null
+++ b/code/modules/tgs/core/byond_world_export.dm
@@ -0,0 +1,22 @@
+/datum/tgs_http_handler/byond_world_export
+
+/datum/tgs_http_handler/byond_world_export/PerformGet(url)
+ // This is an infinite sleep until we get a response
+ var/export_response = world.Export(url)
+ TGS_DEBUG_LOG("byond_world_export: Export complete")
+
+ if(!export_response)
+ TGS_ERROR_LOG("byond_world_export: Failed request: [url]")
+ return new /datum/tgs_http_result(null, FALSE)
+
+ var/content = export_response["CONTENT"]
+ if(!content)
+ TGS_ERROR_LOG("byond_world_export: Failed request, missing content!")
+ return new /datum/tgs_http_result(null, FALSE)
+
+ var/response_json = TGS_FILE2TEXT_NATIVE(content)
+ if(!response_json)
+ TGS_ERROR_LOG("byond_world_export: Failed request, failed to load content!")
+ return new /datum/tgs_http_result(null, FALSE)
+
+ return new /datum/tgs_http_result(response_json, TRUE)
diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm
index 15622228e9..63cb5a2c35 100644
--- a/code/modules/tgs/core/core.dm
+++ b/code/modules/tgs/core/core.dm
@@ -1,4 +1,4 @@
-/world/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE)
+/world/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE, datum/tgs_http_handler/http_handler = null)
var/current_api = TGS_READ_GLOBAL(tgs)
if(current_api)
TGS_ERROR_LOG("API datum already set (\ref[current_api] ([current_api]))! Was TgsNew() called more than once?")
@@ -55,7 +55,10 @@
TGS_ERROR_LOG("Invalid parameter for event_handler: [event_handler]")
event_handler = null
- var/datum/tgs_api/new_api = new api_datum(event_handler, version)
+ if(!http_handler)
+ http_handler = new /datum/tgs_http_handler/byond_world_export
+
+ var/datum/tgs_api/new_api = new api_datum(event_handler, version, http_handler)
TGS_WRITE_GLOBAL(tgs, new_api)
diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm
index f734fd0527..3ca53e9bf7 100644
--- a/code/modules/tgs/core/datum.dm
+++ b/code/modules/tgs/core/datum.dm
@@ -6,7 +6,7 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null)
var/list/warned_deprecated_command_runs
-/datum/tgs_api/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version)
+/datum/tgs_api/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version, datum/tgs_http_handler/http_handler)
..()
src.event_handler = event_handler
src.version = version
diff --git a/code/modules/tgs/includes.dm b/code/modules/tgs/includes.dm
index 23b714f9d0..f5118ed55a 100644
--- a/code/modules/tgs/includes.dm
+++ b/code/modules/tgs/includes.dm
@@ -1,4 +1,5 @@
#include "core\_definitions.dm"
+#include "core\byond_world_export.dm"
#include "core\core.dm"
#include "core\datum.dm"
#include "core\tgs_version.dm"
diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm
index 95b8edd3ee..3e328fc7c2 100644
--- a/code/modules/tgs/v5/api.dm
+++ b/code/modules/tgs/v5/api.dm
@@ -31,9 +31,12 @@
var/detached = FALSE
-/datum/tgs_api/v5/New()
+ var/datum/tgs_http_handler/http_handler
+
+/datum/tgs_api/v5/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version, datum/tgs_http_handler/http_handler)
. = ..()
interop_version = version
+ src.http_handler = http_handler
TGS_DEBUG_LOG("V5 API created: [json_encode(args)]")
/datum/tgs_api/v5/ApiVersion()
@@ -50,7 +53,9 @@
version = null // we want this to be the TGS version, not the interop version
// sleep once to prevent an issue where world.Export on the first tick can hang indefinitely
+ TGS_DEBUG_LOG("Starting Export bug prevention sleep tick. time:[world.time] sleep_offline:[world.sleep_offline]")
sleep(world.tick_lag)
+ TGS_DEBUG_LOG("Export bug prevention sleep complete")
var/list/bridge_response = Bridge(DMAPI5_BRIDGE_COMMAND_STARTUP, list(DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL = minimum_required_security_level, DMAPI5_BRIDGE_PARAMETER_VERSION = api_version.raw_parameter, DMAPI5_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands(), DMAPI5_PARAMETER_TOPIC_PORT = GetTopicPort()))
if(!istype(bridge_response))
diff --git a/code/modules/tgs/v5/bridge.dm b/code/modules/tgs/v5/bridge.dm
index 0c5e701a32..62201fcc9e 100644
--- a/code/modules/tgs/v5/bridge.dm
+++ b/code/modules/tgs/v5/bridge.dm
@@ -78,27 +78,24 @@
WaitForReattach(FALSE)
TGS_DEBUG_LOG("Bridge request start")
- // This is an infinite sleep until we get a response
- var/export_response = world.Export(bridge_request)
+ var/datum/tgs_http_result/result = http_handler.PerformGet(bridge_request)
TGS_DEBUG_LOG("Bridge request complete")
- if(!export_response)
- TGS_ERROR_LOG("Failed bridge request: [bridge_request]")
+ if(isnull(result))
+ TGS_ERROR_LOG("Failed bridge request, handler returned null!")
return
- var/content = export_response["CONTENT"]
- if(!content)
- TGS_ERROR_LOG("Failed bridge request, missing content!")
+ if(!istype(result) || result.type != /datum/tgs_http_result)
+ TGS_ERROR_LOG("Failed bridge request, handler returned non-[/datum/tgs_http_result]!")
return
- var/response_json = TGS_FILE2TEXT_NATIVE(content)
- if(!response_json)
- TGS_ERROR_LOG("Failed bridge request, failed to load content!")
+ if(!result.success)
+ TGS_DEBUG_LOG("Failed bridge request, HTTP request failed!")
return
- var/list/bridge_response = json_decode(response_json)
+ var/list/bridge_response = json_decode(result.response_text)
if(!bridge_response)
- TGS_ERROR_LOG("Failed bridge request, bad json: [response_json]")
+ TGS_ERROR_LOG("Failed bridge request, bad json: [result.response_text]")
return
var/error = bridge_response[DMAPI5_RESPONSE_ERROR_MESSAGE]
diff --git a/code/modules/tgui/tgui-say/modal.dm b/code/modules/tgui/tgui-say/modal.dm
index f1e87e001c..a57b907499 100644
--- a/code/modules/tgui/tgui-say/modal.dm
+++ b/code/modules/tgui/tgui-say/modal.dm
@@ -10,9 +10,7 @@
* string - A JSON encoded message to open the modal.
*/
/client/proc/tgui_say_create_open_command(channel)
- var/message = TGUI_CREATE_MESSAGE("open", list(
- channel = channel,
- ))
+ var/message = TGUI_CREATE_OPEN_MESSAGE(channel)
return "\".output tgui_say.browser:update [message]\""
/**
@@ -36,6 +34,7 @@
/datum/tgui_say/New(client/client, id)
src.client = client
window = new(client, id)
+ winset(client, "tgui_say", "size=1,1;is-visible=0;")
window.subscribe(src, PROC_REF(on_message))
window.is_browser = TRUE
@@ -62,12 +61,15 @@
*/
/datum/tgui_say/proc/load()
window_open = FALSE
- winshow(client, "tgui_say", FALSE)
+
+ winset(client, "tgui_say", "pos=700,500;size=380,30;is-visible=0;")
+
window.send_message("props", list(
lightMode = client.prefs?.tgui_say_light_mode,
maxLength = max_length,
- roles = client.admin_holder?.get_tgui_say_roles()
+ extraChannels = client.admin_holder?.get_tgui_say_extra_channels()
))
+
stop_thinking()
return TRUE
@@ -110,10 +112,10 @@
close()
return TRUE
if (type == "thinking")
- if(payload["mode"] == TRUE)
+ if(payload["visible"] == TRUE)
start_thinking()
return TRUE
- if(payload["mode"] == FALSE)
+ if(payload["visible"] == FALSE)
stop_thinking()
return TRUE
return FALSE
diff --git a/code/modules/tgui/tgui-say/typing.dm b/code/modules/tgui/tgui-say/typing.dm
index 3334ff4a34..e2d8e5fa2a 100644
--- a/code/modules/tgui/tgui-say/typing.dm
+++ b/code/modules/tgui/tgui-say/typing.dm
@@ -22,6 +22,7 @@
remove_all_indicators()
return ..()
+/// Whether or not to show a typing indicator when speaking. Defaults to on.
/client/verb/typing_indicator()
set name = "Show/Hide Typing Indicator"
set category = "Preferences.Chat"
diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm
index c01452a5b4..96c96a45a7 100644
--- a/code/modules/tgui/tgui.dm
+++ b/code/modules/tgui/tgui.dm
@@ -11,7 +11,7 @@
var/mob/user
/// The object which owns the UI.
var/datum/src_object
- /// The title of te UI.
+ /// The title of the UI.
var/title
/// The window_id for browse() and onclose().
var/datum/tgui_window/window
diff --git a/code/modules/tgui/tgui_alert.dm b/code/modules/tgui/tgui_alert.dm
index ce606c7425..a3fa3c519f 100644
--- a/code/modules/tgui/tgui_alert.dm
+++ b/code/modules/tgui/tgui_alert.dm
@@ -8,8 +8,10 @@
* * 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.
+ * * ui_state - The TGUI UI state that will be returned in ui_state(). Default: always_state
*/
-/proc/tgui_alert(mob/user, message, title, list/buttons, timeout = 60 SECONDS)
+/proc/tgui_alert(mob/user, message = "", title, list/buttons = list("Ok"), timeout = 60 SECONDS, autofocus = TRUE, ui_state = GLOB.always_state)
if (!user)
user = usr
if (!istype(user))
@@ -17,8 +19,12 @@
var/client/client = user
user = client.mob
else
- return
- var/datum/tgui_modal/alert = new(user, message, title, buttons, timeout)
+ return null
+
+ if(isnull(user.client))
+ return null
+
+ var/datum/tgui_modal/alert = new(user, message, title, buttons, timeout, autofocus, ui_state)
alert.tgui_interact(user)
alert.wait()
if (alert)
@@ -36,8 +42,10 @@
* * 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. Set to zero for no timeout.
+ * * autofocus - The bool that controls if this alert should grab window focus.
+ * * ui_state - The TGUI UI state that will be returned in ui_state(). Default: always_state
*/
-/proc/tgui_alert_async(mob/user, message, title, list/buttons, datum/callback/callback, timeout = 60 SECONDS)
+/proc/tgui_alert_async(mob/user, message = "", title, list/buttons = list("Ok"), datum/callback/callback, timeout = 60 SECONDS, autofocus = TRUE, ui_state = GLOB.always_state)
if (!user)
user = usr
if (!istype(user))
@@ -45,8 +53,12 @@
var/client/client = user
user = client.mob
else
- return
- var/datum/tgui_modal/async/alert = new(user, message, title, buttons, callback, timeout)
+ return null
+
+ if(isnull(user.client))
+ return null
+
+ var/datum/tgui_modal/async/alert = new(user, message, title, buttons, callback, timeout, autofocus, ui_state)
alert.tgui_interact(user)
/**
@@ -68,13 +80,19 @@
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
+ /// The TGUI UI state that will be returned in ui_state(). Default: always_state
+ var/datum/ui_state/state
-/datum/tgui_modal/New(mob/user, message, title, list/buttons, timeout)
- src.title = title
- src.message = message
+/datum/tgui_modal/New(mob/user, message, title, list/buttons, timeout, autofocus, ui_state)
+ src.autofocus = autofocus
src.buttons = buttons.Copy()
+ src.message = message
+ src.title = title
+ src.state = ui_state
if (timeout)
src.timeout = timeout
start_time = world.time
@@ -82,15 +100,16 @@
/datum/tgui_modal/Destroy(force, ...)
SStgui.close_uis(src)
- buttons = null
- . = ..()
+ state = null
+ buttons = null // TG QDEL_NULLs this
+ return ..()
/**
* Waits for a user's response to the tgui_modal's prompt before returning. Returns early if
* the window was closed by the user.
*/
/datum/tgui_modal/proc/wait()
- while (!choice && !closed)
+ while (!choice && !closed && !QDELETED(src))
stoplag(0.2 SECONDS)
/datum/tgui_modal/tgui_interact(mob/user, datum/tgui/ui)
@@ -104,30 +123,44 @@
closed = TRUE
/datum/tgui_modal/ui_state(mob/user)
- return GLOB.always_state
+ return state
+
+/datum/tgui_modal/ui_static_data(mob/user)
+ var/list/data = list()
+ data["autofocus"] = autofocus
+ data["buttons"] = buttons
+ data["message"] = message
+ data["large_buttons"] = FALSE // Pref?
+ data["swapped_buttons"] = FALSE // Pref?
+ data["title"] = title
+ return data
/datum/tgui_modal/ui_data(mob/user)
- . = list(
- "title" = title,
- "message" = message,
- "buttons" = buttons
- )
-
+ var/list/data = list()
if(timeout)
- .["timeout"] = clamp((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS), 0, 1)
+ data["timeout"] = CLAMP01((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS))
+ return data
-/datum/tgui_modal/ui_act(action, list/params)
+/datum/tgui_modal/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if (.)
return
switch(action)
if("choose")
if (!(params["choice"] in buttons))
- return
- choice = params["choice"]
+ CRASH("[ui.user] entered a non-existent button choice: [params["choice"]]")
+ set_choice(params["choice"])
+ closed = TRUE
+ SStgui.close_uis(src)
+ return TRUE
+ if("cancel")
+ closed = TRUE
SStgui.close_uis(src)
return TRUE
+/datum/tgui_modal/proc/set_choice(choice)
+ src.choice = choice
+
/**
* # async tgui_modal
*
@@ -137,8 +170,8 @@
/// The callback to be invoked by the tgui_modal upon having a choice made.
var/datum/callback/callback
-/datum/tgui_modal/async/New(mob/user, message, title, list/buttons, callback, timeout)
- ..(user, title, message, buttons, timeout)
+/datum/tgui_modal/async/New(mob/user, message, title, list/buttons, callback, timeout, autofocus, ui_state)
+ ..(user, title, message, buttons, timeout, autofocus, ui_state)
src.callback = callback
/datum/tgui_modal/async/Destroy(force, ...)
@@ -149,12 +182,10 @@
. = ..()
qdel(src)
-/datum/tgui_modal/async/ui_act(action, list/params)
+/datum/tgui_modal/async/set_choice(choice)
. = ..()
- if (!. || choice == null)
- return
- callback.InvokeAsync(choice)
- qdel(src)
+ if(!isnull(src.choice))
+ callback?.InvokeAsync(src.choice)
/datum/tgui_modal/async/wait()
return
diff --git a/code/modules/tgui/tgui_input_list.dm b/code/modules/tgui/tgui_input_list.dm
index 8088ba5ffb..ae15cbf621 100644
--- a/code/modules/tgui/tgui_input_list.dm
+++ b/code/modules/tgui/tgui_input_list.dm
@@ -1,3 +1,21 @@
+/* Copyright 2020 bobbahbrown (https://github.com/bobbahbrown), watermelon914 (https://github.com/watermelon914)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
/**
* Creates a TGUI input list window and returns the user's response.
*
@@ -5,15 +23,18 @@
* 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.
+ * * title - The title of the list input, 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 list input will close and qdel itself. Set to zero for no timeout.
+ * * theme - The ui theme to use for the TGUI window.
* * default - If an option is already preselected on the UI. Current values, etc.
- * * timeout - The timeout of the input box, after which the menu will close and qdel itself. Set to zero for no timeout.
+ * * ui_state - The TGUI UI state that will be returned in ui_state(). Default: always_state
*/
-/proc/tgui_input_list(mob/user, message, title = "Select", list/items, timeout = 0, theme = null, ui_state = GLOB.always_state)
+/proc/tgui_input_list(mob/user, message, title = "Select", list/buttons, timeout = 0, theme = null, default, ui_state = GLOB.always_state)
if (!user)
user = usr
- if(!length(items))
+ if(!length(buttons))
+ stack_trace("tgui_input_list called with no buttons!")
return null
if (!istype(user))
if (istype(user, /client))
@@ -25,7 +46,7 @@
if(isnull(user.client))
return null
- var/datum/tgui_list_input/input = new(user, message, title, items, timeout, theme, ui_state)
+ var/datum/tgui_list_input/input = new(user, message, title, buttons, timeout, theme, default, ui_state)
if(input.invalid)
qdel(input)
return
@@ -35,6 +56,42 @@
. = 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 list input, 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 list_input will close and qdel itself. Set to zero for no timeout.
+ * * theme - The ui theme to use for the TGUI window.
+ * * default - If an option is already preselected on the UI. Current values, etc.
+ * * ui_state - The TGUI UI state that will be returned in ui_state(). Default: always_state
+ */
+/proc/tgui_input_list_async(mob/user, message, title = "Select", list/buttons, datum/callback/callback, timeout = 60 SECONDS, theme = null, default, ui_state = GLOB.always_state)
+ if (!user)
+ user = usr
+ if(!length(buttons))
+ return null
+ if (!istype(user))
+ if (istype(user, /client))
+ var/client/client = user
+ user = client.mob
+ else
+ return null
+
+ if(isnull(user.client))
+ return null
+
+ var/datum/tgui_list_input/async/input = new(user, message, title, buttons, callback, timeout, theme, default, ui_state)
+ if(input.invalid)
+ qdel(input)
+ return
+ input.tgui_interact(user)
+
/**
* # tgui_list_input
*
@@ -46,10 +103,10 @@
var/title
/// The textual body of the TGUI window
var/message
- /// The list of items (responses) provided on the TGUI window
- var/list/items
+ /// The list of buttons (responses) provided on the TGUI window. These will automatically all be strings
+ var/list/buttons
/// Buttons (strings specifically) mapped to the actual value (e.g. a mob or a verb)
- var/list/items_map
+ var/list/buttons_map
/// The button that the user has pressed, null if no selection has been made
var/choice
/// The default button to be selected
@@ -62,42 +119,43 @@
var/closed
/// The TGUI UI state that will be returned in ui_state(). Default: always_state
var/datum/ui_state/state
+ /// String field for the theme to use
+ var/ui_theme
/// Whether the tgui list input is invalid or not (i.e. due to all list entries being null)
var/invalid = FALSE
- /// The theme that this UI should display
- var/theme
-/datum/tgui_list_input/New(mob/user, message, title, list/items, timeout, theme, ui_state)
+/datum/tgui_list_input/New(mob/user, message, title, list/buttons, timeout, theme = null, default, ui_state)
src.title = title
src.message = message
- src.items = list()
- src.items_map = list()
+ src.buttons = list()
+ src.buttons_map = list()
src.default = default
src.state = ui_state
- src.theme = theme
+ src.ui_theme = theme
var/list/repeat_items = list()
// Gets rid of illegal characters
var/static/regex/whitelistedWords = regex(@{"([^\u0020-\u8000]+)"})
- for(var/i in items)
+
+ for(var/i in buttons)
if(!i)
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_items)
- src.items += string_key
- src.items_map[string_key] = i
+ src.buttons += string_key
+ src.buttons_map[string_key] = i
- if(length(src.items) == 0)
+ if(length(src.buttons) == 0)
invalid = TRUE
if (timeout)
src.timeout = timeout
start_time = world.time
QDEL_IN(src, timeout)
-/datum/tgui_list_input/Destroy(force)
+/datum/tgui_list_input/Destroy(force, ...)
SStgui.close_uis(src)
state = null
- QDEL_NULL(items)
+ buttons = null // TG QDEL_NULLs this
return ..()
/**
@@ -106,12 +164,12 @@
*/
/datum/tgui_list_input/proc/wait()
while (!choice && !closed)
- stoplag(1)
+ stoplag(0.2 SECONDS)
/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, "ListInputModal")
+ ui = new(user, src, "ListInputWindow")
ui.open()
/datum/tgui_list_input/ui_close(mob/user)
@@ -123,11 +181,13 @@
/datum/tgui_list_input/ui_static_data(mob/user)
var/list/data = list()
- data["init_value"] = default || items[1]
- data["items"] = items
+ data["init_value"] = default || buttons[1]
+ data["items"] = buttons
+ data["large_buttons"] = FALSE // Pref?
data["message"] = message
+ data["swapped_buttons"] = FALSE // Pref?
data["title"] = title
- data["theme"] = theme
+ data["theme"] = ui_theme
return data
/datum/tgui_list_input/ui_data(mob/user)
@@ -136,15 +196,15 @@
data["timeout"] = clamp((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS), 0, 1)
return data
-/datum/tgui_list_input/ui_act(action, list/params)
+/datum/tgui_list_input/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if (.)
return
switch(action)
if("submit")
- if (!(params["entry"] in items))
+ if (!(params["entry"] in buttons))
return
- set_choice(items_map[params["entry"]])
+ set_choice(buttons_map[params["entry"]])
closed = TRUE
SStgui.close_uis(src)
return TRUE
@@ -155,3 +215,32 @@
/datum/tgui_list_input/proc/set_choice(choice)
src.choice = choice
+
+/**
+ * # async tgui_list_input
+ *
+ * An asynchronous version of tgui_list_input to be used with callbacks instead of waiting on user responses.
+ */
+/datum/tgui_list_input/async
+ /// The callback to be invoked by the tgui_modal upon having a choice made.
+ var/datum/callback/callback
+
+/datum/tgui_list_input/async/New(mob/user, message, title, list/buttons, callback, timeout, theme = null, default, ui_state)
+ ..(user, title, message, buttons, timeout, theme, default)
+ src.callback = callback
+
+/datum/tgui_list_input/async/Destroy(force, ...)
+ QDEL_NULL(callback)
+ . = ..()
+
+/datum/tgui_list_input/async/ui_close(mob/user)
+ . = ..()
+ qdel(src)
+
+/datum/tgui_list_input/async/set_choice(choice)
+ . = ..()
+ if(!isnull(src.choice))
+ callback?.InvokeAsync(src.choice)
+
+/datum/tgui_list_input/async/wait()
+ return
diff --git a/code/modules/tgui/tgui_number_input.dm b/code/modules/tgui/tgui_number_input.dm
index aa189b1d20..56956cb936 100644
--- a/code/modules/tgui/tgui_number_input.dm
+++ b/code/modules/tgui/tgui_number_input.dm
@@ -13,8 +13,10 @@
* * 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.
+ * * integer_only - whether the inputted number is rounded down into an integer.
+ * * ui_state - The TGUI UI state that will be returned in ui_state(). Default: always_state
*/
-/proc/tgui_input_number(mob/user, message, title = "Number Input", default = 0, max_value = 10000, min_value = 0, timeout = 0, integer_only = TRUE)
+/proc/tgui_input_number(mob/user, message, title = "Number Input", default = 0, max_value = 10000, min_value = 0, timeout = 0, integer_only = TRUE, ui_state = GLOB.always_state)
if (!user)
user = usr
if (!istype(user))
@@ -22,8 +24,12 @@
var/client/client = user
user = client.mob
else
- return
- var/datum/tgui_input_number/number_input = new(user, message, title, default, max_value, min_value, timeout, integer_only)
+ return null
+
+ if (isnull(user.client))
+ return null
+
+ var/datum/tgui_input_number/number_input = new(user, message, title, default, max_value, min_value, timeout, integer_only, ui_state)
number_input.tgui_interact(user)
number_input.wait()
if (number_input)
@@ -31,8 +37,9 @@
qdel(number_input)
///A clone of tgui_input_number that defaults to accepting negative inputs too.
-/proc/tgui_input_real_number(mob/user, message, title = "Number Input", default = 0, max_value = SHORT_REAL_LIMIT, min_value = -SHORT_REAL_LIMIT, timeout = 0, integer_only = FALSE)
- return tgui_input_number(user, message, title, default, max_value, min_value, timeout, integer_only)
+/proc/tgui_input_real_number(mob/user, message, title = "Number Input", default = 0, max_value = SHORT_REAL_LIMIT, min_value = -SHORT_REAL_LIMIT, timeout = 0, integer_only = FALSE, ui_state = GLOB.always_state)
+ return tgui_input_number(user, message, title, default, max_value, min_value, timeout, integer_only, ui_state)
+
/**
* Creates an asynchronous TGUI number input window with an associated callback.
*
@@ -47,8 +54,10 @@
* * min_value - Specifies a minimum value. Often 0.
* * callback - The callback to be invoked when a choice is made.
* * timeout - The timeout of the number input, after which the modal will close and qdel itself. Set to zero for no timeout.
+ * * integer_only - whether the inputted number is rounded down into an integer.
+ * * ui_state - The TGUI UI state that will be returned in ui_state(). Default: always_state
*/
-/proc/tgui_input_number_async(mob/user, message, title = "Number Input", default = 0, max_value = 10000, min_value = 0, datum/callback/callback, timeout = 60 SECONDS)
+/proc/tgui_input_number_async(mob/user, message, title = "Number Input", default = 0, max_value = 10000, min_value = 0, datum/callback/callback, timeout = 60 SECONDS, integer_only = TRUE, ui_state = GLOB.always_state)
if (!user)
user = usr
if (!istype(user))
@@ -57,7 +66,7 @@
user = client.mob
else
return
- var/datum/tgui_input_number/async/number_input = new(user, message, title, default, max_value, min_value, callback, timeout)
+ var/datum/tgui_input_number/async/number_input = new(user, message, title, default, max_value, min_value, callback, timeout, integer_only, ui_state)
number_input.tgui_interact(user)
/**
@@ -79,23 +88,25 @@
var/message
/// The minimum value that can be entered.
var/min_value
+ /// If the final value will be rounded
+ var/integer_only
/// 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
- /// If the final value will be rounded
- var/integer_only
+ /// The TGUI UI state that will be returned in ui_state(). Default: always_state
+ var/datum/ui_state/state
-
-/datum/tgui_input_number/New(mob/user, message, title, default, max_value, min_value, timeout, integer_only)
+/datum/tgui_input_number/New(mob/user, message, title, default, max_value, min_value, timeout, integer_only, ui_state)
src.default = default
src.max_value = max_value
src.message = message
src.min_value = min_value
src.title = title
src.integer_only = integer_only
+ src.state = ui_state
if (timeout)
src.timeout = timeout
start_time = world.time
@@ -113,7 +124,8 @@
/datum/tgui_input_number/Destroy(force, ...)
SStgui.close_uis(src)
- . = ..()
+ state = null
+ return ..()
/**
* Waits for a user's response to the tgui_input_number's prompt before returning. Returns early if
@@ -135,38 +147,43 @@
closed = TRUE
/datum/tgui_input_number/ui_state(mob/user)
- return GLOB.always_state
+ return state
/datum/tgui_input_number/ui_static_data(mob/user)
- . = list(
- "init_value" = default, // Default is a reserved keyword
- "max_value" = max_value,
- "message" = message,
- "min_value" = min_value,
- "preferences" = list(),
- "title" = title,
- )
+ var/list/data = list()
+ data["init_value"] = default // Default is a reserved keyword
+ data["large_buttons"] = FALSE // Pref?
+ data["max_value"] = max_value
+ data["message"] = message
+ data["min_value"] = min_value
+ data["swapped_buttons"] = FALSE // Pref?
+ data["title"] = title
+ data["round_value"] = integer_only
+ return data
/datum/tgui_input_number/ui_data(mob/user)
- . = list()
+ 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_input_number/ui_act(action, list/params)
+/datum/tgui_input_number/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if (.)
return
switch(action)
if("submit")
- if(!isnum(params["entry"]))
- CRASH("A non number was input into tgui input number by [usr]")
var/choice = params["entry"]
+ if(!isnum(choice))
+ CRASH("A non number was input into tgui input number by [ui.user]")
+ if(choice != choice) //isnan
+ CRASH("A NaN was input into tgui input number by [ui.user]")
if(integer_only)
- choice = round(params["entry"])
+ choice = round(choice)
if(choice > max_value)
- CRASH("A number greater than the max value was input into tgui input number by [usr]")
+ CRASH("A number greater than the max value was input into tgui input number by [ui.user]")
if(choice < min_value)
- CRASH("A number less than the min value was input into tgui input number by [usr]")
+ CRASH("A number less than the min value was input into tgui input number by [ui.user]")
set_entry(choice)
closed = TRUE
SStgui.close_uis(src)
@@ -177,7 +194,7 @@
return TRUE
/datum/tgui_input_number/proc/set_entry(entry)
- src.entry = entry
+ src.entry = entry
/**
* # async tgui_input_number
@@ -188,8 +205,8 @@
/// The callback to be invoked by the tgui_input_number upon having a choice made.
var/datum/callback/callback
-/datum/tgui_input_number/async/New(mob/user, message, title, default, max_value, min_value, callback, timeout)
- ..(user, message, title, default, max_value, min_value, timeout)
+/datum/tgui_input_number/async/New(mob/user, message, title, default, max_value, min_value, callback, timeout, integer_only, ui_state)
+ ..(user, message, title, default, max_value, min_value, timeout, integer_only, ui_state)
src.callback = callback
/datum/tgui_input_number/async/Destroy(force, ...)
diff --git a/code/modules/tgui/tgui_window.dm b/code/modules/tgui/tgui_window.dm
index 21f4a8ba94..987a2aca92 100644
--- a/code/modules/tgui/tgui_window.dm
+++ b/code/modules/tgui/tgui_window.dm
@@ -26,6 +26,18 @@
var/initial_inline_css
var/mouse_event_macro_set = FALSE
+ /**
+ * Static list used to map in macros that will then emit execute events to the tgui window
+ * A small disclaimer though I'm no tech wiz: I don't think it's possible to map in right or middle
+ * clicks in the current state, as they're keywords rather than modifiers.
+ */
+ var/static/list/byondToTguiEventMap = list(
+ "MouseDown" = "byond/mousedown",
+ "MouseUp" = "byond/mouseup",
+ "Ctrl" = "byond/ctrldown",
+ "Ctrl+UP" = "byond/ctrlup",
+ )
+
/**
* public
*
@@ -382,11 +394,6 @@
if(mouse_event_macro_set)
return
- var/list/byondToTguiEventMap = list(
- "MouseDown" = "byond/mousedown",
- "MouseUp" = "byond/mouseup"
- )
-
for(var/mouseMacro in byondToTguiEventMap)
var/command_template = ".output CONTROL PAYLOAD"
var/event_message = TGUI_CREATE_MESSAGE(byondToTguiEventMap[mouseMacro], null)
@@ -404,14 +411,9 @@
winset(client, "[mouseMacro]Window[id]Macro", params)
mouse_event_macro_set = TRUE
-
/datum/tgui_window/proc/remove_mouse_macro()
if(!mouse_event_macro_set)
stack_trace("Unsetting mouse macro on tgui window that has none")
- var/list/byondToTguiEventMap = list(
- "MouseDown" = "byond/mousedown",
- "MouseUp" = "byond/mouseup"
- )
for(var/mouseMacro in byondToTguiEventMap)
winset(client, null, "[mouseMacro]Window[id]Macro.parent=null")
mouse_event_macro_set = FALSE
diff --git a/code/modules/tgui_input/checkboxes.dm b/code/modules/tgui_input/checkboxes.dm
new file mode 100644
index 0000000000..fa90ee51d7
--- /dev/null
+++ b/code/modules/tgui_input/checkboxes.dm
@@ -0,0 +1,211 @@
+/**
+ * ### tgui_input_checkbox
+ * Opens a window with a list of checkboxes and returns a list of selected choices.
+ *
+ * * Arguments:
+ * * user - The mob to display the window to
+ * * message - The message inside the window
+ * * title - The title of the window
+ * * list/items - The list of items to display
+ * * min_checked - The minimum number of checkboxes that must be checked (defaults to 1)
+ * * max_checked - The maximum number of checkboxes that can be checked (optional)
+ * * timeout - The timeout for the input (optional)
+ * * theme - The ui theme to use for the TGUI window (optional).
+ * * ui_state - The TGUI UI state that will be returned in ui_state(). Default: always_state
+ */
+/proc/tgui_input_checkboxes(mob/user, message, title = "Select", list/items, min_checked = 1, max_checked = 50, timeout = 0, theme = null, ui_state = GLOB.always_state)
+ if (!user)
+ user = usr
+ if(!length(items))
+ return null
+ if (!istype(user))
+ if (istype(user, /client))
+ var/client/client = user
+ user = client.mob
+ else
+ return null
+
+ if(isnull(user.client))
+ return null
+
+ var/datum/tgui_checkbox_input/input = new(user, message, title, items, min_checked, max_checked, timeout, theme, ui_state)
+ input.tgui_interact(user)
+ input.wait()
+ if (input)
+ . = input.choices
+ qdel(input)
+
+/**
+ * ### tgui_input_checkbox
+ * Opens a window with a list of checkboxes and returns a list of selected choices.
+ *
+ * * Arguments:
+ * * user - The mob to display the window to
+ * * message - The message inside the window
+ * * title - The title of the window
+ * * list/items - The list of items to display
+ * * min_checked - The minimum number of checkboxes that must be checked (defaults to 1)
+ * * max_checked - The maximum number of checkboxes that can be checked (optional)
+ * * callback - The callback to be invoked when a choice is made.
+ * * timeout - The timeout for the input (optional)
+ * * theme - The ui theme to use for the TGUI window (optional).
+ * * ui_state - The TGUI UI state that will be returned in ui_state(). Default: always_state
+ */
+/proc/tgui_input_checkboxes_async(mob/user, message, title = "Select", list/items, min_checked = 1, max_checked = 50, datum/callback/callback, timeout = 0, theme = null, ui_state = GLOB.always_state)
+ if (!user)
+ user = usr
+ if(!length(items))
+ return null
+ if (!istype(user))
+ if (istype(user, /client))
+ var/client/client = user
+ user = client.mob
+ else
+ return null
+
+ if(isnull(user.client))
+ return null
+
+ var/datum/tgui_checkbox_input/async/input = new(user, message, title, items, min_checked, max_checked, callback, timeout, theme, ui_state)
+ input.tgui_interact(user)
+
+/// Window for tgui_input_checkboxes
+/datum/tgui_checkbox_input
+ /// Title of the window
+ var/title
+ /// Message to display
+ var/message
+ /// List of items to display
+ var/list/items
+ /// List of selected items
+ var/list/choices
+ /// Time when the input was created
+ var/start_time
+ /// Timeout for the input
+ var/timeout
+ /// Whether the input was closed
+ var/closed
+ /// Minimum number of checkboxes that must be checked
+ var/min_checked
+ /// Maximum number of checkboxes that can be checked
+ var/max_checked
+ /// The TGUI UI state that will be returned in ui_state(). Default: always_state
+ var/datum/ui_state/state
+ /// String field for the theme to use
+ var/ui_theme
+
+/datum/tgui_checkbox_input/New(mob/user, message, title, list/items, min_checked, max_checked, timeout, theme = null, ui_state)
+ src.title = title
+ src.message = message
+ src.items = items.Copy()
+ src.min_checked = min_checked
+ src.max_checked = max_checked
+ src.state = ui_state
+ src.ui_theme = theme
+
+ if (timeout)
+ src.timeout = timeout
+ start_time = world.time
+ QDEL_IN(src, timeout)
+
+/datum/tgui_checkbox_input/Destroy(force)
+ SStgui.close_uis(src)
+ state = null
+ items = null // TG QDEL_NULLs this
+ return ..()
+
+/**
+ * Waits for a user's response to the tgui_checkbox_input's prompt before returning. Returns early if
+ * the window was closed by the user.
+ */
+/datum/tgui_checkbox_input/proc/wait()
+ while (!closed && !QDELETED(src))
+ stoplag(0.2 SECONDS)
+
+/datum/tgui_checkbox_input/tgui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "CheckboxInput")
+ ui.open()
+
+/datum/tgui_checkbox_input/ui_close(mob/user)
+ . = ..()
+ closed = TRUE
+
+/datum/tgui_checkbox_input/ui_state(mob/user)
+ return state
+
+/datum/tgui_checkbox_input/ui_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_checkbox_input/ui_static_data(mob/user)
+ var/list/data = list()
+
+ data["items"] = items
+ data["min_checked"] = min_checked
+ data["max_checked"] = max_checked
+ data["large_buttons"] = TRUE // Pref?
+ data["message"] = message
+ data["swapped_buttons"] = FALSE // Pref?
+ data["title"] = title
+ data["theme"] = ui_theme
+
+ return data
+
+/datum/tgui_checkbox_input/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+ if (.)
+ return
+
+ switch(action)
+ if("submit")
+ var/list/selections = params["entry"]
+ if(length(selections) >= min_checked && length(selections) <= max_checked)
+ set_choices(selections)
+ closed = TRUE
+ SStgui.close_uis(src)
+ return TRUE
+
+ if("cancel")
+ closed = TRUE
+ SStgui.close_uis(src)
+ return TRUE
+
+ return FALSE
+
+/datum/tgui_checkbox_input/proc/set_choices(list/selections)
+ src.choices = selections.Copy()
+
+/**
+ * # async tgui_checkbox_input
+ *
+ * An asynchronous version of tgui_checkbox_input to be used with callbacks instead of waiting on user responses.
+ */
+/datum/tgui_checkbox_input/async
+ /// The callback to be invoked by the tgui_modal upon having a choice made.
+ var/datum/callback/callback
+
+/datum/tgui_checkbox_input/async/New(mob/user, message, title, list/items, min_checked, max_checked, callback, timeout, theme = null, ui_state)
+ ..(user, message, title, items, min_checked, max_checked, callback, timeout, theme, ui_state)
+ src.callback = callback
+
+/datum/tgui_checkbox_input/async/Destroy(force, ...)
+ QDEL_NULL(callback)
+ . = ..()
+
+/datum/tgui_checkbox_input/async/ui_close(mob/user)
+ . = ..()
+ qdel(src)
+
+/datum/tgui_checkbox_input/async/set_choices(list/selections)
+ . = ..()
+ if(length(choices))
+ callback?.InvokeAsync(choices)
+
+/datum/tgui_checkbox_input/async/wait()
+ return
diff --git a/code/modules/tgui_input/text.dm b/code/modules/tgui_input/text.dm
index 2a9b7f6dff..15c50554bb 100644
--- a/code/modules/tgui_input/text.dm
+++ b/code/modules/tgui_input/text.dm
@@ -14,8 +14,10 @@
* * 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.
+ * * trim - Whether or not to trim leading and trailing whitespace from your input. Defaults to TRUE
+ * * ui_state - The TGUI UI state that will be returned in ui_state(). Default: always_state
*/
-/proc/tgui_input_text(mob/user, message = "", title = "Text Input", default, max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = TRUE, timeout = 0)
+/proc/tgui_input_text(mob/user, message = "", title = "Text Input", default, max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = TRUE, timeout = 0, trim = TRUE, ui_state = GLOB.always_state)
if (!user)
user = usr
if (!istype(user))
@@ -23,7 +25,11 @@
var/client/client = user
user = client.mob
else
- return
+ return null
+
+ if(isnull(user.client))
+ return null
+
// Client does NOT have tgui_input on: Returns regular input
/*
if(!user.client.prefs.read_preference(/datum/preference/toggle/tgui_input))
@@ -39,7 +45,7 @@
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)
+ var/datum/tgui_input_text/text_input = new(user, message, title, default, max_length, multiline, encode, timeout, trim, ui_state)
text_input.tgui_interact(user)
text_input.wait()
if (text_input)
@@ -73,14 +79,20 @@
var/timeout
/// The title of the TGUI window
var/title
+ /// The TGUI UI state that will be returned in ui_state(). Default: always_state
+ var/datum/ui_state/state
+ /// Whether to trim leading and trailing spaces
+ var/trim
-/datum/tgui_input_text/New(mob/user, message, title, default, max_length, multiline, encode, timeout)
+/datum/tgui_input_text/New(mob/user, message, title, default, max_length, multiline, encode, timeout, trim, ui_state)
src.default = default
src.encode = encode
src.max_length = max_length
src.message = message
src.multiline = multiline
src.title = title
+ src.state = ui_state
+ src.trim = trim
if (timeout)
src.timeout = timeout
start_time = world.time
@@ -88,6 +100,7 @@
/datum/tgui_input_text/Destroy(force, ...)
SStgui.close_uis(src)
+ state = null
return ..()
/**
@@ -109,7 +122,7 @@
closed = TRUE
/datum/tgui_input_text/ui_state(mob/user)
- return GLOB.always_state
+ return state
/datum/tgui_input_text/ui_static_data(mob/user)
var/list/data = list()
@@ -141,7 +154,7 @@
CRASH("[usr] typed a text string longer than the max length")
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"])
+ set_entry(params["entry"], trim)
closed = TRUE
SStgui.close_uis(src)
return TRUE
@@ -156,7 +169,10 @@
* This can sometimes result in a string that is longer than the max length.
* If the string is longer than the max length, it will be clipped.
*/
-/datum/tgui_input_text/proc/set_entry(entry)
+/datum/tgui_input_text/proc/set_entry(entry, trim)
if(!isnull(entry))
var/converted_entry = encode ? html_encode(entry) : entry
- src.entry = trim(converted_entry, max_length)
+ if(trim)
+ src.entry = trim(converted_entry)
+ else
+ src.entry = converted_entry
diff --git a/code/modules/unit_tests/spritesheets.dm b/code/modules/unit_tests/spritesheets.dm
index c7c16c6535..142d3f9588 100644
--- a/code/modules/unit_tests/spritesheets.dm
+++ b/code/modules/unit_tests/spritesheets.dm
@@ -2,6 +2,7 @@
/datum/unit_test/spritesheets
/datum/unit_test/spritesheets/Run()
+ var/regex/valid_css_class = new(@"^([\l_][\w\-]|[\l_\-][\l_])")
for(var/datum/asset/spritesheet/sheet as anything in subtypesof(/datum/asset/spritesheet))
if(!initial(sheet.name)) //Ignore abstract types
continue
@@ -9,3 +10,6 @@
for(var/sprite_name in sheet.sprites)
if(!sprite_name)
TEST_FAIL("Spritesheet [sheet.type] has a nameless icon state.")
+ if(!valid_css_class.Find(sprite_name))
+ // https://www.w3.org/TR/CSS2/syndata.html#value-def-identifier
+ TEST_FAIL("Spritesheet [sheet.type] has a icon state that doesn't comply with css standards: '[sprite_name]'.")
diff --git a/code/modules/vehicles/hardpoints/primary/arc_frontal.dm b/code/modules/vehicles/hardpoints/primary/arc_frontal.dm
index 68dd21aafa..a9f720412d 100644
--- a/code/modules/vehicles/hardpoints/primary/arc_frontal.dm
+++ b/code/modules/vehicles/hardpoints/primary/arc_frontal.dm
@@ -13,8 +13,6 @@
health = 2000
firing_arc = 120
- origins = list(0, -2)
-
allowed_seat = VEHICLE_DRIVER
ammo = new /obj/item/ammo_magazine/hardpoint/m56_cupola/frontal_cannon
diff --git a/code/modules/vehicles/interior/interactable/seats.dm b/code/modules/vehicles/interior/interactable/seats.dm
index 06217d4cc0..be98a91cf7 100644
--- a/code/modules/vehicles/interior/interactable/seats.dm
+++ b/code/modules/vehicles/interior/interactable/seats.dm
@@ -479,3 +479,53 @@
REMOVE_TRAIT(M, TRAIT_UNDENSE, BUCKLED_TRAIT)
handle_rotation()
+
+/obj/structure/bed/chair/vehicle/dropship_cockpit
+ name = "cockpit seat"
+ desc = "A sturdy metal chair with a brace that lowers over your body. Holds you in place during high altitude drops."
+ icon_state = "vehicle_seat"
+ can_rotate = FALSE
+
+/obj/structure/bed/chair/vehicle/dropship_cockpit/afterbuckle(mob/M)
+ if(buckled_mob)
+ if(buckled_mob != M)
+ return
+ icon_state = initial(icon_state) + "_buckled"
+ overlays += chairbar
+
+ if(buckle_offset_x != 0)
+ mob_old_x = M.pixel_x
+ M.pixel_x = buckle_offset_x
+ if(buckle_offset_y != 0)
+ mob_old_y = M.pixel_y
+ M.pixel_y = buckle_offset_y
+
+ ADD_TRAIT(buckled_mob, TRAIT_UNDENSE, BUCKLED_TRAIT)
+ else
+ icon_state = initial(icon_state)
+ overlays -= chairbar
+
+ if(buckle_offset_x != 0)
+ M.pixel_x = mob_old_x
+ mob_old_x = 0
+ if(buckle_offset_y != 0)
+ M.pixel_y = mob_old_y
+ mob_old_y = 0
+
+ REMOVE_TRAIT(M, TRAIT_UNDENSE, BUCKLED_TRAIT)
+
+ handle_rotation()
+
+/obj/structure/bed/chair/vehicle/dropship_cockpit/pilot
+ name = "pilot seat"
+
+/obj/structure/bed/chair/vehicle/dropship_cockpit/pilot/handle_rotation()
+ if(dir == NORTH)
+ layer = ABOVE_MOB_LAYER
+ else
+ layer = BELOW_MOB_LAYER
+ if(buckled_mob)
+ buckled_mob.setDir(dir)
+
+/obj/structure/bed/chair/vehicle/dropship_cockpit/copilot
+ name = "co-pilot seat"
diff --git a/code/modules/vehicles/interior/interactable/vendors.dm b/code/modules/vehicles/interior/interactable/vendors.dm
index f5aef4f430..aa2411f89f 100644
--- a/code/modules/vehicles/interior/interactable/vendors.dm
+++ b/code/modules/vehicles/interior/interactable/vendors.dm
@@ -215,9 +215,9 @@
list("M39 HV Magazine (10x20mm)", round(scale * 6), /obj/item/ammo_magazine/smg/m39, VENDOR_ITEM_REGULAR),
list("M44 Speed Loader (.44)", round(scale * 4), /obj/item/ammo_magazine/revolver, VENDOR_ITEM_REGULAR),
list("M4A3 Magazine (9mm)", round(scale * 10), /obj/item/ammo_magazine/pistol, VENDOR_ITEM_REGULAR),
+ list("88 Mod 4 Magazine (9mm)", round(scale * 8), /obj/item/ammo_magazine/pistol/mod88/normalpoint, VENDOR_ITEM_REGULAR),
list("ARMOR-PIERCING AMMUNITION", -1, null, null),
- list("88 Mod 4 AP Magazine (9mm)", round(scale * 8), /obj/item/ammo_magazine/pistol/mod88, VENDOR_ITEM_REGULAR),
list("M4RA AP Magazine (10x24mm)", 0, /obj/item/ammo_magazine/rifle/m4ra/ap, VENDOR_ITEM_REGULAR),
list("M39 AP Magazine (10x20mm)", 0, /obj/item/ammo_magazine/smg/m39/ap, VENDOR_ITEM_REGULAR),
list("M41A MK2 AP Magazine (10x24mm)", 0, /obj/item/ammo_magazine/rifle/ap, VENDOR_ITEM_REGULAR),
diff --git a/code/modules/vehicles/interior/interior.dm b/code/modules/vehicles/interior/interior.dm
index f2afcd5ae5..8fb65602c9 100644
--- a/code/modules/vehicles/interior/interior.dm
+++ b/code/modules/vehicles/interior/interior.dm
@@ -304,21 +304,13 @@
// Returns min and max turfs for the interior
/datum/interior/proc/get_bound_turfs()
- var/turf/min = TURF_FROM_COORDS_LIST(reservation.bottom_left_coords)
- if(!min)
- return null
-
- var/turf/max = TURF_FROM_COORDS_LIST(reservation.top_right_coords)
- if(!max)
- return null
-
- return list(min, max)
+ return list(reservation.bottom_left_turfs[1], reservation.top_right_turfs[1])
/datum/interior/proc/get_middle_coords()
- var/turf/min = reservation.bottom_left_coords
- var/turf/max = reservation.top_right_coords
+ var/turf/min = reservation.bottom_left_turfs[1]
+ var/turf/max = reservation.top_right_turfs[1]
+ return list(Floor(min.x + (max.x - min.x)/2), Floor(min.y + (max.y - min.y)/2), min.z)
- return list(Floor(min[1] + (max[1] - min[1])/2), Floor(min[2] + (max[2] - min[2])/2), min[3])
/datum/interior/proc/get_middle_turf()
var/list/turf/bounds = get_bound_turfs()
diff --git a/code/modules/vehicles/multitile/multitile_movement.dm b/code/modules/vehicles/multitile/multitile_movement.dm
index b5f3081447..b95a7bd057 100644
--- a/code/modules/vehicles/multitile/multitile_movement.dm
+++ b/code/modules/vehicles/multitile/multitile_movement.dm
@@ -159,7 +159,7 @@
// Crashed with something that stopped us
if(!can_move)
- move_momentum = Floor(move_momentum/2)
+ move_momentum = trunc(move_momentum/2)
update_next_move()
interior_crash_effect()
@@ -251,10 +251,10 @@
return
// Not enough momentum for anything serious
- if(abs(move_momentum) <= 1)
+ if(abs(move_momentum) < 1)
return
- var/fling_distance = Ceiling(move_momentum/move_max_momentum) * 2
+ var/fling_distance = Ceiling(abs(move_momentum)/move_max_momentum) * 2
var/turf/target = interior.get_middle_turf()
for (var/x in 0 to fling_distance-1)
@@ -272,7 +272,7 @@
if(isliving(A))
var/mob/living/M = A
- shake_camera(M, 2, Ceiling(move_momentum/move_max_momentum) * 1)
+ shake_camera(M, 2, Ceiling(abs(move_momentum)/move_max_momentum) * 1)
if(!M.buckled)
M.apply_effect(1, STUN)
M.apply_effect(2, WEAKEN)
diff --git a/code/modules/vehicles/van/van.dm b/code/modules/vehicles/van/van.dm
index 0b99d682c0..3dcc603445 100644
--- a/code/modules/vehicles/van/van.dm
+++ b/code/modules/vehicles/van/van.dm
@@ -82,7 +82,7 @@
icon_state = null
- RegisterSignal(SSdcs, COMSIG_GLOB_MOB_LOGIN, PROC_REF(add_default_image))
+ RegisterSignal(SSdcs, COMSIG_GLOB_MOB_LOGGED_IN, PROC_REF(add_default_image))
for(var/I in GLOB.player_list)
add_default_image(SSdcs, I)
@@ -124,7 +124,7 @@
mobs_under += L
RegisterSignal(L, COMSIG_PARENT_QDELETING, PROC_REF(remove_under_van))
- RegisterSignal(L, COMSIG_MOB_LOGIN, PROC_REF(add_client))
+ RegisterSignal(L, COMSIG_MOB_LOGGED_IN, PROC_REF(add_client))
RegisterSignal(L, COMSIG_MOVABLE_MOVED, PROC_REF(check_under_van))
if(L.client)
@@ -140,7 +140,7 @@
UnregisterSignal(L, list(
COMSIG_PARENT_QDELETING,
- COMSIG_MOB_LOGIN,
+ COMSIG_MOB_LOGGED_IN,
COMSIG_MOVABLE_MOVED,
))
diff --git a/colonialmarines.dme b/colonialmarines.dme
index d75338ecfe..cadce2ac68 100644
--- a/colonialmarines.dme
+++ b/colonialmarines.dme
@@ -32,6 +32,7 @@
#include "code\__DEFINES\_tick.dm"
#include "code\__DEFINES\access.dm"
#include "code\__DEFINES\admin.dm"
+#include "code\__DEFINES\alerts.dm"
#include "code\__DEFINES\ARES.dm"
#include "code\__DEFINES\assert.dm"
#include "code\__DEFINES\atmospherics.dm"
@@ -99,6 +100,8 @@
#include "code\__DEFINES\speech_channels.dm"
#include "code\__DEFINES\stamina.dm"
#include "code\__DEFINES\stats.dm"
+#include "code\__DEFINES\status_effects.dm"
+#include "code\__DEFINES\strippable.dm"
#include "code\__DEFINES\STUI.dm"
#include "code\__DEFINES\subsystems.dm"
#include "code\__DEFINES\surgery.dm"
@@ -109,6 +112,7 @@
#include "code\__DEFINES\tgui.dm"
#include "code\__DEFINES\traits.dm"
#include "code\__DEFINES\turf_flags.dm"
+#include "code\__DEFINES\turfs.dm"
#include "code\__DEFINES\unit_tests.dm"
#include "code\__DEFINES\urls.dm"
#include "code\__DEFINES\vehicle.dm"
@@ -133,6 +137,7 @@
#include "code\__DEFINES\dcs\signals\atom\signals_obj.dm"
#include "code\__DEFINES\dcs\signals\atom\signals_projectile.dm"
#include "code\__DEFINES\dcs\signals\atom\signals_turf.dm"
+#include "code\__DEFINES\dcs\signals\atom\mob\signals_mind.dm"
#include "code\__DEFINES\dcs\signals\atom\mob\signals_mob.dm"
#include "code\__DEFINES\dcs\signals\atom\mob\living\signals_human.dm"
#include "code\__DEFINES\dcs\signals\atom\mob\living\signals_living.dm"
@@ -170,6 +175,7 @@
#include "code\__HELPERS\sanitize_values.dm"
#include "code\__HELPERS\shell.dm"
#include "code\__HELPERS\status_effects.dm"
+#include "code\__HELPERS\string_lists.dm"
#include "code\__HELPERS\text.dm"
#include "code\__HELPERS\traits.dm"
#include "code\__HELPERS\type2type.dm"
@@ -302,10 +308,12 @@
#include "code\controllers\subsystem\init\lobby_art.dm"
#include "code\controllers\subsystem\processing\defprocess.dm"
#include "code\controllers\subsystem\processing\effects.dm"
+#include "code\controllers\subsystem\processing\fasteffects.dm"
#include "code\controllers\subsystem\processing\fastobj.dm"
#include "code\controllers\subsystem\processing\hive_status.dm"
#include "code\controllers\subsystem\processing\obj_tab_items.dm"
#include "code\controllers\subsystem\processing\objects.dm"
+#include "code\controllers\subsystem\processing\oldeffects.dm"
#include "code\controllers\subsystem\processing\processing.dm"
#include "code\controllers\subsystem\processing\shield_pillar.dm"
#include "code\controllers\subsystem\processing\slowobj.dm"
@@ -474,6 +482,7 @@
#include "code\datums\elements\light_blocking.dm"
#include "code\datums\elements\mouth_drop_item.dm"
#include "code\datums\elements\poor_eyesight_correction.dm"
+#include "code\datums\elements\strippable.dm"
#include "code\datums\elements\suturing.dm"
#include "code\datums\elements\yautja_tracked_item.dm"
#include "code\datums\elements\bullet_trait\damage_boost.dm"
@@ -639,6 +648,12 @@
#include "code\datums\statistics\random_facts\kills_fact.dm"
#include "code\datums\statistics\random_facts\random_fact.dm"
#include "code\datums\statistics\random_facts\revives_fact.dm"
+#include "code\datums\status_effects\_status_effect.dm"
+#include "code\datums\status_effects\_status_effect_helpers.dm"
+#include "code\datums\status_effects\grouped_effect.dm"
+#include "code\datums\status_effects\limited_effect.dm"
+#include "code\datums\status_effects\stacking_effect.dm"
+#include "code\datums\status_effects\debuffs\debuffs.dm"
#include "code\datums\supply_packs\_supply_packs.dm"
#include "code\datums\supply_packs\ammo.dm"
#include "code\datums\supply_packs\attachments.dm"
@@ -662,6 +677,7 @@
#include "code\datums\weather\weather_map_holder.dm"
#include "code\datums\weather\weather_events\big_red.dm"
#include "code\datums\weather\weather_events\faction_clash.dm"
+#include "code\datums\weather\weather_events\long.dm"
#include "code\datums\weather\weather_events\lv522_chances_claim.dm"
#include "code\datums\weather\weather_events\lv624.dm"
#include "code\datums\weather\weather_events\new_varadero.dm"
@@ -720,6 +736,7 @@
#include "code\game\area\techtree.dm"
#include "code\game\area\varadero.dm"
#include "code\game\area\WhiskeyOutpost.dm"
+#include "code\game\camera_manager\camera_manager.dm"
#include "code\game\cas_manager\datums\cas_fire_envelope.dm"
#include "code\game\cas_manager\datums\cas_fire_mission.dm"
#include "code\game\cas_manager\datums\cas_iff_group.dm"
@@ -1388,9 +1405,13 @@
#include "code\modules\admin\ToRban.dm"
#include "code\modules\admin\game_master\game_master.dm"
#include "code\modules\admin\game_master\game_master_submenu.dm"
+#include "code\modules\admin\game_master\resin_panel.dm"
#include "code\modules\admin\game_master\sound_panel.dm"
+#include "code\modules\admin\game_master\extra_buttons\fire_support_menu.dm"
+#include "code\modules\admin\game_master\extra_buttons\marine_announce.dm"
#include "code\modules\admin\game_master\extra_buttons\rappel_menu.dm"
#include "code\modules\admin\game_master\extra_buttons\rename_platoon.dm"
+#include "code\modules\admin\game_master\extra_buttons\toggle_ai_xeno_weeding.dm"
#include "code\modules\admin\game_master\extra_buttons\toggle_join_xeno.dm"
#include "code\modules\admin\game_master\extra_buttons\toggle_vehicle_blockers.dm"
#include "code\modules\admin\game_master\game_master_submenu\ambush.dm"
@@ -1893,6 +1914,7 @@
#include "code\modules\mob\living\carbon\human\human_dummy.dm"
#include "code\modules\mob\living\carbon\human\human_helpers.dm"
#include "code\modules\mob\living\carbon\human\human_movement.dm"
+#include "code\modules\mob\living\carbon\human\human_stripping.dm"
#include "code\modules\mob\living\carbon\human\inventory.dm"
#include "code\modules\mob\living\carbon\human\life.dm"
#include "code\modules\mob\living\carbon\human\login.dm"
@@ -2377,6 +2399,7 @@
#include "code\modules\tgui\tgui-say\modal.dm"
#include "code\modules\tgui\tgui-say\speech.dm"
#include "code\modules\tgui\tgui-say\typing.dm"
+#include "code\modules\tgui_input\checkboxes.dm"
#include "code\modules\tgui_input\text.dm"
#include "code\modules\tgui_panel\audio.dm"
#include "code\modules\tgui_panel\external.dm"
diff --git a/dependencies.sh b/dependencies.sh
index 01d0ca5c97..7540707df5 100644
--- a/dependencies.sh
+++ b/dependencies.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
#Project dependencies file
#Final authority on what's required to fully build the project
@@ -11,11 +11,11 @@ export BYOND_MINOR=1627
export RUST_G_VERSION=2.1.0
#node version
-export NODE_VERSION=14
-export NODE_VERSION_PRECISE=14.16.1
+export NODE_VERSION=20
+export NODE_VERSION_LTS=20.12.0
# SpacemanDMM git tag
export SPACEMAN_DMM_VERSION=suite-1.8
# Python version for mapmerge and other tools
-export PYTHON_VERSION=3.7.9
+export PYTHON_VERSION=3.9.0
diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml
new file mode 100644
index 0000000000..f7d36bac1a
--- /dev/null
+++ b/html/changelogs/archive/2024-07.yml
@@ -0,0 +1,19 @@
+2024-07-19:
+ Meatstuff882:
+ - rscadd: Added an icon for special buckshot.
+2024-07-22:
+ Doubleumc:
+ - admin: Radio Clarity slider now shows an example message
+ - qol: ARC turret shots start from the center of the ARC
+2024-07-24:
+ Doubleumc:
+ - bugfix: sounds & motion detectors should be more reliable
+ - rscdel: Removed automatic end of round vote and reboot
+2024-07-25:
+ Doubleumc:
+ - code_imp: Made the Tech Tree subsystem initialise faster.
+ Zonespace27:
+ - admin: Added freed mob bans to the jobban panel.
+2024-07-31:
+ Doubleumc:
+ - admin: round start delayed by default
diff --git a/html/changelogs/archive/2024-08.yml b/html/changelogs/archive/2024-08.yml
new file mode 100644
index 0000000000..fdc818cd13
--- /dev/null
+++ b/html/changelogs/archive/2024-08.yml
@@ -0,0 +1,117 @@
+2024-08-01:
+ Doubleumc:
+ - ui: reduced size of Discord button
+2024-08-06:
+ Doubleumc:
+ - rscadd: Added Buckled, Handcuffed and Legcuffed screen alerts
+ - balance: Due to backend change, all KO/KD/Stuns may behave differently timing
+ wise. This is of course subject to adjustments.
+ - balance: Knockdowns are not inherently incapacitating anymore and many sources
+ of it have been updated to also stun to make up for it.
+ - bugfix: KO/KD/Stuns do not artificially and randomly ''stack'' due to incorrect
+ timer offset calculation anymore.
+ - bugfix: Stuns now correctly apply Stun reduction values instead of Knockdown reductions.
+ - bugfix: Crawling can now be interrupted by a normal move, if you are fit enough
+ to do so.
+ - bugfix: Dazed screen effect now applies immediately
+ - bugfix: Stuttering now starts properly when dazed
+ - rscdel: Removed an old, goofy and unused decade old horse mask
+ - rscadd: maintenance stations stun when exiting like closets
+ - bugfix: converts flash, flashbang to TG effect system, fixing issue(s)
+ - refactor: complete overhaul of just about every TGUI interface
+ - rscadd: added parachutes
+ - rscadd: added holocards to the squad hud
+ - rscadd: falling out a dropship throws you to the surface
+ Merrgear:
+ - rscadd: 'added more cigarette options in the loadout, along with a golden zippo
+
+ :cl:'
+2024-08-10:
+ Doubleumc:
+ - qol: Adds the ability to hide your action buttons
+ - bugfix: Fixed 'hidden' action buttons being shown to observing players.
+ - qol: Made any observers transfer over when a Xenomorph evolves/de-evolves.
+ - rscadd: Added 'observe' functionality to Xenomorphs, allowing observers to view
+ the target's UI.
+ - rscadd: Made observing a player also show their action buttons.
+ - spellcheck: Made observers see the marine version of CAS warnings, rather than
+ the xeno one.
+ - qol: Made open TGUI windows transfer over when a xeno player evolves.
+ - bugfix: Fixed observing a monkey/farwa/stok/etc. locking the camera onto it.
+ - bugfix: Observer minimap should no longer occasionally show wrong / no map.
+ - code_imp: environmental reverb applies more reliably and only to positional sounds
+ - bugfix: Notifications should no longer emit light.
+ - bugfix: Sprite-click shots onto Xenos are no longer affected by limb-targeting
+ penalty, because it was an accuracy debuff when there is no inherent benefit
+ to targeting Xeno limbs.
+ - rscadd: Locking down dropship's doors closes them before locking.
+ - bugfix: Fix handling of sentry_computer deletion
+ - refactor: Refactored the overlay_lighting component to better handle objects deleting
+ - bugfix: Fix putting lights in bags somereason keeping the light on
+ - refactor: sentry laptop now uses camera manager component
+ - bugfix: less lag from xenos pathfinding unreachable targets
+ - rscadd: Added GM button to toggle AI xeno weeding
+ Kitsunemitsu:
+ - rscadd: Added 3 more railgun types
+ - balance: Railgun now changes it's stats based off the altitude
+ sunofang:
+ - rscadd: Due to budget increases, Close Air Support now has ammo.
+ - admin: Added a fire support menu for GM's to use.
+2024-08-11:
+ private-tristan:
+ - balance: M56D has been buffed with more damage, accuracy, and firerate.
+2024-08-18:
+ BonniePandora:
+ - rscadd: Adds a Golden-Arrow specific sub-set of the smartgunners sidearm belt
+ - rscadd: Adds the above to the corresponding lockers, both on the standard & FORECON
+ smartgunner ones
+ Doubleumc:
+ - rscadd: Added 1 hour squad role timelocks for PltSgt, PltCo
+ - admin: '"Start Round" can start a delayed round'
+ nauticall:
+ - rscadd: Added a quick "Command Announcement" button for Game Masters, available
+ in the GM tab.
+ sunofang:
+ - admin: Spawn menu no longer populates by default, and doesnt cause you to lag.
+ xDanilcusx:
+ - bugfix: AI can track through electrified/locked/welded doors
+ - code_imp: AI now doesn't swipe on poddoors and shutters, opening them instead
+2024-08-19:
+ Doubleumc:
+ - bugfix: fixed WeaponStats TGUI
+2024-08-20:
+ Doubleumc:
+ - bugfix: Fixed the 88 Mod 4 pistol's holster sprite.
+ - admin: bitfields for MODE_NO_XENO_EVOLVE, MODE_HARDCORE_PERMA, and MODE_NO_JOIN_AS_XENO
+ now work
+2024-08-21:
+ DexterDude:
+ - rscadd: Added something
+2024-08-22:
+ BonniePandora:
+ - maptweak: Expanded the galley of the Golden Arrow.
+2024-08-24:
+ BonniePandora:
+ - rscadd: Added various condiment packets of powedered juices, milk & egg to the
+ code
+ - rscadd: Added corresponding reactions for the new powdered substances where needed
+ - rscadd: Sprites for the condiment packets, some taken from Bay, others edited
+ by me from Bay sprites
+ - qol: MRE's now contain a juice packet alongside their typical contents
+ - maptweak: Replaces the magic freezer and it's perishable contents with a locker
+ full of the non-perishable replacements
+ DexterDude:
+ - rscadd: Added something
+ private-tristan:
+ - rscadd: ports TG strip menu
+2024-08-26:
+ sunofang:
+ - admin: Added infinite weather options.
+2024-08-27:
+ Max-023:
+ - rscadd: Helmet cover item, added to the squad prep vendor
+ - imageadd: Helmet cover sprites
+ Meatstuff882:
+ - rscadd: 'The utility vendor now has knives in it.
+
+ :cl:'
diff --git a/html/create_object.html b/html/create_object.html
index a4c3085a9a..0625ab9e5c 100644
--- a/html/create_object.html
+++ b/html/create_object.html
@@ -37,7 +37,6 @@
var objects = object_paths == null ? new Array() : object_paths.split(";");
document.spawner.filter.focus();
- populateList(objects);
function populateList(from_list) {
object_list.options.length = 0;
diff --git a/icons/effects/Targeted.dmi b/icons/effects/Targeted.dmi
index fce948574a..24b82a90fe 100644
Binary files a/icons/effects/Targeted.dmi and b/icons/effects/Targeted.dmi differ
diff --git a/icons/mob/hud/marine_hud.dmi b/icons/mob/hud/marine_hud.dmi
index 56ba8ec8d9..377216d2a7 100644
Binary files a/icons/mob/hud/marine_hud.dmi and b/icons/mob/hud/marine_hud.dmi differ
diff --git a/icons/mob/humans/onmob/back.dmi b/icons/mob/humans/onmob/back.dmi
index 39abfe5ce6..24840d6348 100644
Binary files a/icons/mob/humans/onmob/back.dmi and b/icons/mob/humans/onmob/back.dmi differ
diff --git a/icons/mob/humans/onmob/eyes.dmi b/icons/mob/humans/onmob/eyes.dmi
index c4d743f61e..9a4fd3bd64 100644
Binary files a/icons/mob/humans/onmob/eyes.dmi and b/icons/mob/humans/onmob/eyes.dmi differ
diff --git a/icons/mob/humans/onmob/hands.dmi b/icons/mob/humans/onmob/hands.dmi
index a79b61c98d..f174ffd1b6 100644
Binary files a/icons/mob/humans/onmob/hands.dmi and b/icons/mob/humans/onmob/hands.dmi differ
diff --git a/icons/mob/humans/onmob/head_0.dmi b/icons/mob/humans/onmob/head_0.dmi
index b4475e9a8a..8d64d73ef1 100644
Binary files a/icons/mob/humans/onmob/head_0.dmi and b/icons/mob/humans/onmob/head_0.dmi differ
diff --git a/icons/mob/humans/onmob/head_1.dmi b/icons/mob/humans/onmob/head_1.dmi
index fcd8917c9c..169aa524d2 100644
Binary files a/icons/mob/humans/onmob/head_1.dmi and b/icons/mob/humans/onmob/head_1.dmi differ
diff --git a/icons/mob/humans/onmob/helmet_garb.dmi b/icons/mob/humans/onmob/helmet_garb.dmi
index 6bf64e7eff..062400725a 100644
Binary files a/icons/mob/humans/onmob/helmet_garb.dmi and b/icons/mob/humans/onmob/helmet_garb.dmi differ
diff --git a/icons/mob/humans/onmob/items_lefthand_0.dmi b/icons/mob/humans/onmob/items_lefthand_0.dmi
index f23bd09cd7..a293dfded9 100644
Binary files a/icons/mob/humans/onmob/items_lefthand_0.dmi and b/icons/mob/humans/onmob/items_lefthand_0.dmi differ
diff --git a/icons/mob/humans/onmob/items_lefthand_1.dmi b/icons/mob/humans/onmob/items_lefthand_1.dmi
index 92ae62c7bc..a872ddcc8a 100644
Binary files a/icons/mob/humans/onmob/items_lefthand_1.dmi and b/icons/mob/humans/onmob/items_lefthand_1.dmi differ
diff --git a/icons/mob/humans/onmob/items_righthand_0.dmi b/icons/mob/humans/onmob/items_righthand_0.dmi
index 702c069bdc..a5f3abc035 100644
Binary files a/icons/mob/humans/onmob/items_righthand_0.dmi and b/icons/mob/humans/onmob/items_righthand_0.dmi differ
diff --git a/icons/mob/humans/onmob/items_righthand_1.dmi b/icons/mob/humans/onmob/items_righthand_1.dmi
index 78e7ab199a..c0b150a2d7 100644
Binary files a/icons/mob/humans/onmob/items_righthand_1.dmi and b/icons/mob/humans/onmob/items_righthand_1.dmi differ
diff --git a/icons/mob/humans/onmob/mask.dmi b/icons/mob/humans/onmob/mask.dmi
index 0c4ac97807..82a5885c87 100644
Binary files a/icons/mob/humans/onmob/mask.dmi and b/icons/mob/humans/onmob/mask.dmi differ
diff --git a/icons/mob/humans/onmob/suit_0.dmi b/icons/mob/humans/onmob/suit_0.dmi
index feedb7327b..6e58aa61b8 100644
Binary files a/icons/mob/humans/onmob/suit_0.dmi and b/icons/mob/humans/onmob/suit_0.dmi differ
diff --git a/icons/mob/humans/onmob/suit_1.dmi b/icons/mob/humans/onmob/suit_1.dmi
index 8a9424ff15..a316ccf8c4 100644
Binary files a/icons/mob/humans/onmob/suit_1.dmi and b/icons/mob/humans/onmob/suit_1.dmi differ
diff --git a/icons/mob/humans/onmob/ties.dmi b/icons/mob/humans/onmob/ties.dmi
index f277dc02a7..408cf1492a 100644
Binary files a/icons/mob/humans/onmob/ties.dmi and b/icons/mob/humans/onmob/ties.dmi differ
diff --git a/icons/mob/humans/onmob/uniform_0.dmi b/icons/mob/humans/onmob/uniform_0.dmi
index 39e3223891..8656f89278 100644
Binary files a/icons/mob/humans/onmob/uniform_0.dmi and b/icons/mob/humans/onmob/uniform_0.dmi differ
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index af61a47aa8..21cc40876f 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/obj/items/clothing/backpacks.dmi b/icons/obj/items/clothing/backpacks.dmi
index 9ebed71a12..9ce264022d 100644
Binary files a/icons/obj/items/clothing/backpacks.dmi and b/icons/obj/items/clothing/backpacks.dmi differ
diff --git a/icons/obj/items/clothing/belts.dmi b/icons/obj/items/clothing/belts.dmi
index 18e011f048..4e9a85cc90 100644
Binary files a/icons/obj/items/clothing/belts.dmi and b/icons/obj/items/clothing/belts.dmi differ
diff --git a/icons/obj/items/clothing/cm_suits.dmi b/icons/obj/items/clothing/cm_suits.dmi
index bc012f71ca..2b3b3a091c 100644
Binary files a/icons/obj/items/clothing/cm_suits.dmi and b/icons/obj/items/clothing/cm_suits.dmi differ
diff --git a/icons/obj/items/clothing/masks.dmi b/icons/obj/items/clothing/masks.dmi
index 037ee8aba1..f2a3b4ee6d 100644
Binary files a/icons/obj/items/clothing/masks.dmi and b/icons/obj/items/clothing/masks.dmi differ
diff --git a/icons/obj/items/clothing/suits.dmi b/icons/obj/items/clothing/suits.dmi
index a73de66d58..ffe4c53546 100644
Binary files a/icons/obj/items/clothing/suits.dmi and b/icons/obj/items/clothing/suits.dmi differ
diff --git a/icons/obj/items/clothing/ties.dmi b/icons/obj/items/clothing/ties.dmi
index 17118d8760..e509f8f2fa 100644
Binary files a/icons/obj/items/clothing/ties.dmi and b/icons/obj/items/clothing/ties.dmi differ
diff --git a/icons/obj/items/clothing/ties_overlay.dmi b/icons/obj/items/clothing/ties_overlay.dmi
index 599c89484b..66279502f7 100644
Binary files a/icons/obj/items/clothing/ties_overlay.dmi and b/icons/obj/items/clothing/ties_overlay.dmi differ
diff --git a/icons/obj/items/food.dmi b/icons/obj/items/food.dmi
index 3c2e963e38..5872b7e852 100644
Binary files a/icons/obj/items/food.dmi and b/icons/obj/items/food.dmi differ
diff --git a/icons/obj/items/helmet_garb.dmi b/icons/obj/items/helmet_garb.dmi
index bbebf822c9..5403ae28b7 100644
Binary files a/icons/obj/items/helmet_garb.dmi and b/icons/obj/items/helmet_garb.dmi differ
diff --git a/icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi b/icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi
index d883a24e71..0d50208cc8 100644
Binary files a/icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi and b/icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi differ
diff --git a/icons/obj/items/weapons/guns/attachments/under.dmi b/icons/obj/items/weapons/guns/attachments/under.dmi
index a3691b8cc5..8947ecd174 100644
Binary files a/icons/obj/items/weapons/guns/attachments/under.dmi and b/icons/obj/items/weapons/guns/attachments/under.dmi differ
diff --git a/icons/obj/items/weapons/guns/guns_by_faction/colony.dmi b/icons/obj/items/weapons/guns/guns_by_faction/colony.dmi
index 17e7e6f221..04c1fd5468 100644
Binary files a/icons/obj/items/weapons/guns/guns_by_faction/colony.dmi and b/icons/obj/items/weapons/guns/guns_by_faction/colony.dmi differ
diff --git a/icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi b/icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi
index c5946b587a..e57c625158 100644
Binary files a/icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi and b/icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi differ
diff --git a/icons/obj/items/weapons/guns/handful.dmi b/icons/obj/items/weapons/guns/handful.dmi
index bbea110531..1d46db248d 100644
Binary files a/icons/obj/items/weapons/guns/handful.dmi and b/icons/obj/items/weapons/guns/handful.dmi differ
diff --git a/icons/obj/items/weapons/guns/lineart.dmi b/icons/obj/items/weapons/guns/lineart.dmi
index 35241cf3a3..6920290c7e 100644
Binary files a/icons/obj/items/weapons/guns/lineart.dmi and b/icons/obj/items/weapons/guns/lineart.dmi differ
diff --git a/icons/obj/items/weapons/guns/lineart_modes.dmi b/icons/obj/items/weapons/guns/lineart_modes.dmi
new file mode 100644
index 0000000000..787fdd34f2
Binary files /dev/null and b/icons/obj/items/weapons/guns/lineart_modes.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index b62860559b..3a7c0226cd 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/structures/doors/dropship4_cargo.dmi b/icons/obj/structures/doors/dropship4_cargo.dmi
new file mode 100644
index 0000000000..ccb76504d9
Binary files /dev/null and b/icons/obj/structures/doors/dropship4_cargo.dmi differ
diff --git a/icons/obj/structures/doors/dropship4_pilot.dmi b/icons/obj/structures/doors/dropship4_pilot.dmi
new file mode 100644
index 0000000000..1bdb60471d
Binary files /dev/null and b/icons/obj/structures/doors/dropship4_pilot.dmi differ
diff --git a/icons/obj/structures/doors/dropship4_side.dmi b/icons/obj/structures/doors/dropship4_side.dmi
new file mode 100644
index 0000000000..7d0d5e5245
Binary files /dev/null and b/icons/obj/structures/doors/dropship4_side.dmi differ
diff --git a/icons/obj/structures/doors/dropship4_side2.dmi b/icons/obj/structures/doors/dropship4_side2.dmi
new file mode 100644
index 0000000000..f2d96e59af
Binary files /dev/null and b/icons/obj/structures/doors/dropship4_side2.dmi differ
diff --git a/icons/obj/structures/machinery/computer.dmi b/icons/obj/structures/machinery/computer.dmi
index 4224992af2..9e3a24f9cc 100644
Binary files a/icons/obj/structures/machinery/computer.dmi and b/icons/obj/structures/machinery/computer.dmi differ
diff --git a/icons/obj/structures/machinery/shuttle-parts.dmi b/icons/obj/structures/machinery/shuttle-parts.dmi
index 7db27387e7..6b6323a7b6 100644
Binary files a/icons/obj/structures/machinery/shuttle-parts.dmi and b/icons/obj/structures/machinery/shuttle-parts.dmi differ
diff --git a/icons/turf/dropship.dmi b/icons/turf/dropship.dmi
index 7e0bfb67b0..ba08ecf600 100644
Binary files a/icons/turf/dropship.dmi and b/icons/turf/dropship.dmi differ
diff --git a/icons/turf/dropship2.dmi b/icons/turf/dropship2.dmi
index 754c20d9ea..787d72e04f 100644
Binary files a/icons/turf/dropship2.dmi and b/icons/turf/dropship2.dmi differ
diff --git a/icons/turf/dropship3.dmi b/icons/turf/dropship3.dmi
index a813e18808..bd13e33fbb 100644
Binary files a/icons/turf/dropship3.dmi and b/icons/turf/dropship3.dmi differ
diff --git a/icons/turf/dropship4.dmi b/icons/turf/dropship4.dmi
new file mode 100644
index 0000000000..db0f58dcee
Binary files /dev/null and b/icons/turf/dropship4.dmi differ
diff --git a/icons/ui_icons/inventory/back.png b/icons/ui_icons/inventory/back.png
new file mode 100644
index 0000000000..736b9d64bf
Binary files /dev/null and b/icons/ui_icons/inventory/back.png differ
diff --git a/icons/ui_icons/inventory/belt.png b/icons/ui_icons/inventory/belt.png
new file mode 100644
index 0000000000..1be89d450a
Binary files /dev/null and b/icons/ui_icons/inventory/belt.png differ
diff --git a/icons/ui_icons/inventory/collar.png b/icons/ui_icons/inventory/collar.png
new file mode 100644
index 0000000000..71803b1b6c
Binary files /dev/null and b/icons/ui_icons/inventory/collar.png differ
diff --git a/icons/ui_icons/inventory/ears.png b/icons/ui_icons/inventory/ears.png
new file mode 100644
index 0000000000..e9a8f3c23c
Binary files /dev/null and b/icons/ui_icons/inventory/ears.png differ
diff --git a/icons/ui_icons/inventory/glasses.png b/icons/ui_icons/inventory/glasses.png
new file mode 100644
index 0000000000..6e6f1ad098
Binary files /dev/null and b/icons/ui_icons/inventory/glasses.png differ
diff --git a/icons/ui_icons/inventory/gloves.png b/icons/ui_icons/inventory/gloves.png
new file mode 100644
index 0000000000..2c8a16cbdb
Binary files /dev/null and b/icons/ui_icons/inventory/gloves.png differ
diff --git a/icons/ui_icons/inventory/hand_l.png b/icons/ui_icons/inventory/hand_l.png
new file mode 100644
index 0000000000..b09228d65f
Binary files /dev/null and b/icons/ui_icons/inventory/hand_l.png differ
diff --git a/icons/ui_icons/inventory/hand_r.png b/icons/ui_icons/inventory/hand_r.png
new file mode 100644
index 0000000000..0e05a487e0
Binary files /dev/null and b/icons/ui_icons/inventory/hand_r.png differ
diff --git a/icons/ui_icons/inventory/head.png b/icons/ui_icons/inventory/head.png
new file mode 100644
index 0000000000..11e2d2254c
Binary files /dev/null and b/icons/ui_icons/inventory/head.png differ
diff --git a/icons/ui_icons/inventory/id.png b/icons/ui_icons/inventory/id.png
new file mode 100644
index 0000000000..4469591d36
Binary files /dev/null and b/icons/ui_icons/inventory/id.png differ
diff --git a/icons/ui_icons/inventory/mask.png b/icons/ui_icons/inventory/mask.png
new file mode 100644
index 0000000000..82e5108937
Binary files /dev/null and b/icons/ui_icons/inventory/mask.png differ
diff --git a/icons/ui_icons/inventory/neck.png b/icons/ui_icons/inventory/neck.png
new file mode 100644
index 0000000000..78ad3ce3b1
Binary files /dev/null and b/icons/ui_icons/inventory/neck.png differ
diff --git a/icons/ui_icons/inventory/pocket.png b/icons/ui_icons/inventory/pocket.png
new file mode 100644
index 0000000000..f42399dca0
Binary files /dev/null and b/icons/ui_icons/inventory/pocket.png differ
diff --git a/icons/ui_icons/inventory/shoes.png b/icons/ui_icons/inventory/shoes.png
new file mode 100644
index 0000000000..d20f7ef4d1
Binary files /dev/null and b/icons/ui_icons/inventory/shoes.png differ
diff --git a/icons/ui_icons/inventory/suit.png b/icons/ui_icons/inventory/suit.png
new file mode 100644
index 0000000000..e9c48e8069
Binary files /dev/null and b/icons/ui_icons/inventory/suit.png differ
diff --git a/icons/ui_icons/inventory/suit_storage.png b/icons/ui_icons/inventory/suit_storage.png
new file mode 100644
index 0000000000..9722eb1029
Binary files /dev/null and b/icons/ui_icons/inventory/suit_storage.png differ
diff --git a/icons/ui_icons/inventory/uniform.png b/icons/ui_icons/inventory/uniform.png
new file mode 100644
index 0000000000..292b3324b5
Binary files /dev/null and b/icons/ui_icons/inventory/uniform.png differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 79ec957f08..ea5f18a91a 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -287,16 +287,12 @@ window "infowindow"
elem "discord"
type = BUTTON
pos = 420,5
- size = 210x45
+ size = 100x20
anchor1 = 66,0
- anchor2 = 97,0
+ anchor2 = 81,0
background-color = #7289da
- font-size = 20px
- font-family = "Arial"
- text-align = center
- font-weight = bold
saved-params = "is-checked"
- text = "discord.gg/PVE-CMSS13"
+ text = "Discord"
command = "discord"
window "outputwindow"
diff --git a/maps/corsat.json b/maps/corsat.json
index e819264405..24e8afccbe 100644
--- a/maps/corsat.json
+++ b/maps/corsat.json
@@ -42,7 +42,7 @@
"xeno_hive_charlie": 0,
"xeno_hive_delta": 0
},
- "camouflage": "snow",
+ "camouflage": "jungle",
"gamemodes": [
"Distress Signal",
"Hunter Games",
diff --git a/maps/derelict_almayer.json b/maps/derelict_almayer.json
index 0d0fc08da4..46108fc4ea 100644
--- a/maps/derelict_almayer.json
+++ b/maps/derelict_almayer.json
@@ -7,7 +7,7 @@
"announce_text": "An automated distress signal has been received from the \"USS Almayer\". A response team from the ###SHIPNAME### will be dispatched shortly to investigate.",
"traits": [{ "Ground": true }],
"nightmare_path": "maps/Nightmare/maps/derelict_almayer/",
- "camouflage": "classic",
+ "camouflage": "jungle",
"gamemodes": [
"Distress Signal",
"Hunter Games",
diff --git a/maps/fiorina_sciannex.json b/maps/fiorina_sciannex.json
index dfc7365541..f278861370 100644
--- a/maps/fiorina_sciannex.json
+++ b/maps/fiorina_sciannex.json
@@ -33,7 +33,7 @@
"xeno_hive_bravo": 0,
"xeno_hive_charlie": 0
},
- "camouflage": "classic",
+ "camouflage": "jungle",
"gamemodes": [
"Distress Signal",
"Hunter Games",
diff --git a/maps/lv522_chances_claim.json b/maps/lv522_chances_claim.json
index ac7dfa5f1d..4e050d2aa9 100644
--- a/maps/lv522_chances_claim.json
+++ b/maps/lv522_chances_claim.json
@@ -37,7 +37,7 @@
"xeno_hive_charlie": 0,
"xeno_hive_delta": 0
},
- "camouflage": "classic",
+ "camouflage": "jungle",
"gamemodes": [
"Distress Signal",
"Hunter Games",
diff --git a/maps/map_files/CORSAT/Corsat.dmm b/maps/map_files/CORSAT/Corsat.dmm
index 60af0805d2..a87db5ef1e 100644
--- a/maps/map_files/CORSAT/Corsat.dmm
+++ b/maps/map_files/CORSAT/Corsat.dmm
@@ -179,7 +179,6 @@
"aaF" = (
/obj/structure/machinery/door/airlock/almayer/security/glass/colony{
dir = 1;
- locked = 0;
name = "CORSAT Armory";
req_access_txt = "101"
},
@@ -374,10 +373,10 @@
/obj/structure/surface/rack,
/obj/item/weapon/gun/pistol/mod88,
/obj/item/weapon/gun/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
/turf/open/floor/corsat{
dir = 9;
icon_state = "red"
@@ -1008,10 +1007,10 @@
/obj/structure/surface/rack,
/obj/item/weapon/gun/pistol/mod88,
/obj/item/weapon/gun/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
/turf/open/floor/corsat{
dir = 1;
icon_state = "red"
@@ -2354,7 +2353,6 @@
/obj/structure/machinery/door/airlock/almayer/maint/colony{
damage_cap = 4000;
dir = 1;
- locked = 0;
name = "\improper Emergency Access";
req_access_txt = "100";
req_one_access = null
@@ -5915,7 +5913,6 @@
"arv" = (
/obj/structure/machinery/door/airlock/almayer/maint/colony{
damage_cap = 4000;
- locked = 0;
name = "\improper Emergency Access";
req_access_txt = "100";
req_one_access = null
@@ -9027,8 +9024,8 @@
/obj/item/storage/belt/security/MP/full,
/obj/item/clothing/accessory/storage/holster/armpit,
/obj/item/weapon/gun/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
/obj/item/storage/pouch/general/medium,
/obj/item/storage/pouch/pistol,
/turf/open/floor/corsat{
@@ -11314,12 +11311,12 @@
/obj/item/weapon/gun/pistol/mod88,
/obj/item/weapon/gun/pistol/mod88,
/obj/structure/surface/rack,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
/turf/open/floor/corsat{
dir = 9;
icon_state = "red"
@@ -13785,8 +13782,8 @@
/obj/item/storage/belt/security/MP/full,
/obj/item/clothing/accessory/storage/holster/armpit,
/obj/item/weapon/gun/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
/obj/item/storage/pouch/general/medium,
/obj/item/storage/pouch/pistol,
/turf/open/floor/corsat{
@@ -19094,8 +19091,8 @@
/obj/item/storage/belt/security/MP/full,
/obj/item/clothing/accessory/storage/holster/armpit,
/obj/item/weapon/gun/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
/obj/item/storage/pouch/general/medium,
/obj/item/storage/pouch/pistol,
/turf/open/floor/corsat{
@@ -19115,8 +19112,8 @@
/obj/item/storage/belt/security/MP/full,
/obj/item/clothing/accessory/storage/holster/armpit,
/obj/item/weapon/gun/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
/obj/item/storage/pouch/general/medium,
/obj/item/storage/pouch/pistol,
/turf/open/floor/corsat{
@@ -21865,8 +21862,7 @@
/area/corsat/gamma/engineering)
"bij" = (
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0
+ name = "Floodlight"
},
/turf/open/auto_turf/snow/layer3,
/area/corsat/gamma/biodome)
@@ -28912,8 +28908,8 @@
/obj/item/storage/belt/security/MP/full,
/obj/item/clothing/accessory/storage/holster/armpit,
/obj/item/weapon/gun/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
/obj/item/storage/pouch/general/medium,
/obj/item/storage/pouch/pistol,
/obj/structure/closet/secure_closet/security,
@@ -28949,8 +28945,8 @@
/obj/item/storage/belt/security/MP/full,
/obj/item/clothing/accessory/storage/holster/armpit,
/obj/item/weapon/gun/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
/obj/item/storage/pouch/general/medium,
/obj/item/storage/pouch/pistol,
/obj/structure/closet/secure_closet/security,
@@ -29004,7 +29000,6 @@
/area/corsat/omega/checkpoint)
"bDv" = (
/obj/structure/machinery/door/airlock/almayer/security/glass/colony{
- locked = 0;
name = "Security Armory";
req_access_txt = "101"
},
@@ -30454,8 +30449,7 @@
/area/corsat/gamma/airlock/control)
"bJE" = (
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0
+ name = "Floodlight"
},
/turf/open/mars,
/area/corsat/sigma/biodome)
@@ -34240,8 +34234,7 @@
/area/corsat/sigma/airlock/control)
"bVD" = (
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0
+ name = "Floodlight"
},
/turf/open/floor{
dir = 1;
@@ -35490,7 +35483,6 @@
/obj/structure/machinery/door/airlock/almayer/research/glass/colony{
dir = 1;
name = "Weapons Development";
- req_access = null;
req_one_access_txt = "103"
},
/obj/structure/pipes/standard/simple/hidden/green,
@@ -35817,8 +35809,7 @@
/area/corsat/omega/control)
"caS" = (
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0
+ name = "Floodlight"
},
/turf/open/floor/plating,
/area/corsat/sigma/biodome/testgrounds)
@@ -37885,8 +37876,7 @@
/area/corsat/omega/hallways)
"dFb" = (
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0
+ name = "Floodlight"
},
/turf/open/auto_turf/snow/layer0,
/area/corsat/gamma/biodome)
@@ -43629,8 +43619,8 @@
/obj/item/storage/belt/security/MP/full,
/obj/item/clothing/accessory/storage/holster/armpit,
/obj/item/weapon/gun/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
/obj/item/storage/pouch/general/medium,
/obj/item/storage/pouch/pistol,
/turf/open/floor/corsat{
@@ -48492,7 +48482,6 @@
/obj/structure/machinery/door/airlock/almayer/research/glass/colony{
dir = 1;
name = "Teleportation Lab";
- req_access = null;
req_one_access_txt = "103"
},
/obj/structure/pipes/standard/simple/hidden/green,
@@ -49119,8 +49108,7 @@
/area/corsat/omega/airlocknorth/id)
"lUY" = (
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0
+ name = "Floodlight"
},
/obj/structure/pipes/standard/simple/hidden/green,
/turf/open/auto_turf/snow/layer3,
@@ -51006,7 +50994,6 @@
/obj/structure/machinery/door/airlock/almayer/research/glass/colony{
dir = 1;
name = "Teleportation Chamber";
- req_access = null;
req_one_access_txt = "101;103"
},
/turf/open/floor/corsat{
@@ -58931,8 +58918,8 @@
/obj/item/storage/belt/security/MP/full,
/obj/item/clothing/accessory/storage/holster/armpit,
/obj/item/weapon/gun/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
/obj/item/storage/pouch/general/medium,
/obj/item/storage/pouch/pistol,
/turf/open/floor/corsat{
@@ -61765,7 +61752,6 @@
"vqF" = (
/obj/structure/machinery/door/airlock/almayer/maint/colony{
damage_cap = 4000;
- locked = 0;
name = "\improper Emergency Access";
req_access_txt = "100";
req_one_access = null
diff --git a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm
index a196e2f20c..a92e396785 100644
--- a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm
+++ b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm
@@ -10,10 +10,11 @@
},
/area/lv522/indoors/c_block/mining)
"aaF" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "15"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "20"
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"aaI" = (
/obj/item/stack/sheet/metal,
/turf/open/floor/prison{
@@ -264,6 +265,12 @@
},
/turf/closed/wall/mineral/bone_resin,
/area/lv522/oob)
+"afT" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "32"
+ },
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"afX" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/asphalt/cement{
@@ -2464,10 +2471,10 @@
/turf/open/floor/prison,
/area/lv522/indoors/b_block/bridge)
"bpZ" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "18"
+/turf/closed/shuttle/typhoon{
+ icon_state = "64"
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"bqo" = (
/obj/item/prop/colony/usedbandage{
dir = 5
@@ -3443,11 +3450,11 @@
},
/area/lv522/indoors/a_block/fitness/glass)
"bQq" = (
-/obj/structure/cargo_container/wy/mid{
- layer = 5
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "17"
},
-/turf/open/auto_turf/sand_white/layer0,
-/area/lv522/outdoors/w_rockies)
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"bQC" = (
/obj/structure/bed/chair{
dir = 1
@@ -4084,6 +4091,12 @@
},
/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/indoors/b_block/bar)
+"cet" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"cex" = (
/turf/open/auto_turf/shale/layer2,
/area/lv522/landing_zone_2)
@@ -5362,10 +5375,17 @@
},
/area/lv522/oob)
"cJc" = (
-/obj/item/prop/colony/used_flare,
-/obj/structure/cargo_container/wy/right,
-/turf/open/floor/plating,
-/area/lv522/outdoors/colony_streets/north_east_street)
+/obj/structure/stairs/perspective{
+ icon_state = "p_stair_full";
+ can_block_movement = 0
+ },
+/obj/structure/platform{
+ dir = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/lv522/landing_zone_forecon/UD6_Tornado)
"cJg" = (
/obj/effect/decal/cleanable/blood/xeno,
/turf/open/asphalt/cement{
@@ -6212,6 +6232,15 @@
/obj/structure/machinery/photocopier,
/turf/open/floor/plating,
/area/lv522/indoors/c_block/cargo)
+"dae" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "29"
+ },
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "29"
+ },
+/turf/open/auto_turf/shale/layer1,
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"dah" = (
/obj/structure/filingcabinet{
density = 0;
@@ -6724,16 +6753,10 @@
/turf/open/floor/plating,
/area/lv522/atmos/east_reactor)
"dic" = (
-/obj/structure/platform_decoration{
- dir = 4
- },
-/obj/structure/bed/chair/dropship/passenger{
- dir = 4
+/turf/closed/shuttle/typhoon{
+ icon_state = "104"
},
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
- },
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"dio" = (
/obj/structure/pipes/standard/simple/hidden/green{
dir = 4
@@ -6896,13 +6919,10 @@
},
/area/lv522/atmos/east_reactor/south)
"dlC" = (
-/obj/structure/prop/invuln/fire{
- pixel_x = 8;
- pixel_y = 10
- },
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "22"
},
+/turf/open/auto_turf/sand_white/layer0,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"dlI" = (
/obj/structure/machinery/door_control/brbutton{
@@ -7175,11 +7195,8 @@
},
/area/lv522/atmos/east_reactor/south)
"dqn" = (
-/obj/structure/stairs/perspective{
- icon_state = "p_stair_full"
- },
-/obj/structure/platform{
- dir = 8
+/obj/structure/platform_decoration{
+ dir = 4
},
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
@@ -7994,8 +8011,9 @@
/turf/open/floor/carpet,
/area/lv522/indoors/c_block/garage)
"dIr" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "22"
+/obj/effect/attach_point/crew_weapon/tornado,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"dIt" = (
@@ -8665,7 +8683,7 @@
/area/lv522/indoors/c_block/cargo)
"dWv" = (
/turf/closed/shuttle/dropship2/tornado{
- icon_state = "6"
+ icon_state = "24"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"dWD" = (
@@ -8707,10 +8725,17 @@
},
/area/lv522/atmos/east_reactor)
"dWY" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "32"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "40";
+ density = 0;
+ layer = 4.2
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "65"
+ },
+/obj/effect/attach_point/weapon/tornado/right_wing,
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"dXa" = (
/obj/structure/cargo_container/arious/leftmid,
/turf/open/auto_turf/shale/layer2,
@@ -8971,9 +8996,10 @@
},
/area/lv522/atmos/way_in_command_centre)
"ecP" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "25"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "15"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"ecU" = (
/obj/effect/landmark/structure_spawner/setup/distress/xeno_wall,
@@ -9354,6 +9380,11 @@
icon_state = "squares"
},
/area/lv522/atmos/east_reactor)
+"ejQ" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "76"
+ },
+/area/lv522/landing_zone_forecon/UD6_Tornado)
"ekf" = (
/obj/structure/curtain/medical,
/turf/open/floor/strata{
@@ -10962,8 +10993,8 @@
},
/area/lv522/oob)
"eRI" = (
-/obj/structure/barricade/deployable{
- dir = 8
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "34"
},
/turf/open/floor/plating,
/area/lv522/outdoors/colony_streets/north_east_street)
@@ -11011,6 +11042,11 @@
icon_state = "platebot"
},
/area/lv522/indoors/c_block/cargo)
+"eSG" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "36"
+ },
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"eSM" = (
/obj/effect/spawner/gibspawner/xeno,
/turf/open/asphalt/cement{
@@ -11057,11 +11093,10 @@
/turf/open/floor/plating,
/area/lv522/landing_zone_1/tunnel)
"eTw" = (
-/obj/structure/stairs/perspective{
- icon_state = "p_stair_full"
- },
-/obj/structure/platform{
- dir = 8
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "40";
+ density = 0;
+ layer = 4.2
},
/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -11120,9 +11155,10 @@
},
/area/lv522/indoors/lone_buildings/outdoor_bot)
"eUS" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "33"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "27"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"eUX" = (
/obj/effect/landmark/survivor_spawner,
@@ -11447,11 +11483,18 @@
},
/area/lv522/outdoors/colony_streets/south_east_street)
"fbY" = (
-/obj/structure/stairs/perspective{
- icon_state = "p_stair_full"
+/obj/effect/decal/warning_stripes{
+ icon_state = "S";
+ pixel_y = 2
},
-/turf/open/floor/plating,
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = -1
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin14"
+ },
+/area/lv522/outdoors/colony_streets/north_east_street)
"fcd" = (
/obj/vehicle/train/cargo/trolley,
/turf/open/floor/prison{
@@ -12492,9 +12535,10 @@
},
/area/lv522/atmos/reactor_garage)
"fzC" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "28"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "22"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"fzE" = (
/turf/open/floor/plating/plating_catwalk/prison,
@@ -12675,7 +12719,7 @@
},
/area/lv522/indoors/lone_buildings/storage_blocks)
"fDg" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/typhoon{
icon_state = "30"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -13031,10 +13075,9 @@
},
/area/lv522/atmos/cargo_intake)
"fLa" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "47"
- },
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/obj/structure/shuttle/part/tornado/transparent,
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"fLc" = (
/obj/structure/bed/bedroll{
dir = 4
@@ -13467,11 +13510,11 @@
/turf/open/auto_turf/shale/layer1,
/area/lv522/outdoors/nw_rockies)
"fTm" = (
-/obj/structure/stairs/perspective{
- icon_state = "p_stair_full"
+/obj/structure/platform_decoration{
+ dir = 8
},
/turf/open/shuttle/dropship{
- icon_state = "rasputin3"
+ icon_state = "rasputin15"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"fTs" = (
@@ -13628,7 +13671,7 @@
/area/lv522/indoors/b_block/bar)
"fXn" = (
/turf/closed/shuttle/dropship2/tornado{
- icon_state = "19"
+ icon_state = "31"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"fXs" = (
@@ -13726,6 +13769,18 @@
},
/turf/open/gm/river,
/area/lv522/landing_zone_1/tunnel)
+"fYN" = (
+/obj/item/clothing/mask/facehugger{
+ desc = "It has some sort of a tube at the end of its tail. What the hell is this thing?";
+ icon_state = "facehugger_impregnated";
+ layer = 3;
+ name = "????";
+ stat = 2
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/lv522/landing_zone_forecon/UD6_Tornado)
"fYP" = (
/obj/effect/landmark/structure_spawner/setup/distress/xeno_door,
/turf/open/floor/corsat{
@@ -14818,9 +14873,10 @@
},
/area/lv522/indoors/a_block/dorms)
"guR" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "26"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"guZ" = (
/obj/structure/machinery/power/apc/weak{
@@ -15915,10 +15971,8 @@
/turf/open/floor/prison,
/area/lv522/indoors/c_block/cargo)
"gOZ" = (
-/obj/structure/platform_decoration{
- dir = 8
- },
/obj/effect/decal/cleanable/blood,
+/obj/structure/cargo_container/lockmart/right,
/turf/open/floor/plating,
/area/lv522/outdoors/colony_streets/north_east_street)
"gPp" = (
@@ -16106,8 +16160,9 @@
},
/area/lv522/atmos/north_command_centre)
"gTM" = (
-/obj/structure/girder,
-/turf/open/floor/plating,
+/turf/closed/shuttle/typhoon/transparent{
+ icon_state = "89a"
+ },
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"gTX" = (
/obj/structure/machinery/photocopier,
@@ -17708,6 +17763,11 @@
icon_state = "blue"
},
/area/lv522/indoors/a_block/hallway)
+"hvf" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "30"
+ },
+/area/lv522/landing_zone_forecon/UD6_Tornado)
"hvh" = (
/obj/structure/platform,
/turf/open/gm/river,
@@ -19355,9 +19415,10 @@
},
/area/lv522/atmos/reactor_garage)
"ibE" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "23"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "21"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"ibS" = (
/obj/effect/decal/cleanable/blood/drip,
@@ -21993,6 +22054,12 @@
icon_state = "marked"
},
/area/lv522/indoors/a_block/bridges)
+"jcA" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "4"
+ },
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"jcH" = (
/obj/effect/spawner/gibspawner/human,
/obj/item/clothing/suit/storage/marine/smartgunner,
@@ -22222,6 +22289,12 @@
icon_state = "blue_plate"
},
/area/lv522/indoors/a_block/admin)
+"jgW" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "22"
+ },
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"jhe" = (
/obj/effect/decal/warning_stripes{
icon_state = "W"
@@ -23747,11 +23820,16 @@
/turf/open/auto_turf/shale/layer1,
/area/lv522/outdoors/colony_streets/central_streets)
"jHa" = (
-/obj/structure/cargo_container/wy/right{
- layer = 5
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "40";
+ density = 0;
+ layer = 4.2
},
-/turf/open/auto_turf/sand_white/layer0,
-/area/lv522/outdoors/w_rockies)
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "65"
+ },
+/turf/open/auto_turf/shale/layer1,
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"jHb" = (
/turf/open/gm/river,
/area/lv522/oob)
@@ -26138,7 +26216,7 @@
/area/lv522/indoors/a_block/admin)
"kzk" = (
/turf/closed/shuttle/dropship2/tornado{
- icon_state = "17"
+ icon_state = "47"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"kzl" = (
@@ -26887,11 +26965,10 @@
},
/area/lv522/indoors/a_block/dorm_north)
"kNR" = (
-/obj/structure/closet/crate/explosives,
-/obj/item/storage/box/explosive_mines,
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "100"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"kOa" = (
/obj/structure/pipes/standard/simple/hidden/green{
@@ -27971,13 +28048,8 @@
},
/area/lv522/atmos/cargo_intake)
"lgw" = (
-/obj/structure/machinery/door/poddoor/shutters/almayer{
- dir = 4;
- id = "UD6 East";
- indestructible = 1
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin3"
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "64"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"lgR" = (
@@ -29531,6 +29603,11 @@
},
/turf/open/auto_turf/shale/layer1,
/area/lv522/outdoors/nw_rockies)
+"lMI" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "62"
+ },
+/area/lv522/landing_zone_forecon/UD6_Tornado)
"lML" = (
/obj/effect/decal/cleanable/generic,
/turf/open/floor/prison{
@@ -29935,11 +30012,11 @@
/turf/closed/wall/strata_outpost,
/area/lv522/indoors/a_block/kitchen/glass)
"lVs" = (
-/obj/structure/platform_decoration{
- dir = 4
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "102"
},
/turf/open/floor/plating,
-/area/lv522/outdoors/colony_streets/north_east_street)
+/area/lv522/landing_zone_forecon/UD6_Tornado)
"lVA" = (
/obj/structure/surface/table/almayer,
/obj/item/reagent_container/food/drinks/cans/souto{
@@ -31512,6 +31589,18 @@
icon_state = "w-y2"
},
/area/lv522/atmos/way_in_command_centre)
+"mCl" = (
+/obj/structure/stairs/perspective{
+ icon_state = "p_stair_full";
+ can_block_movement = 0
+ },
+/obj/structure/platform{
+ dir = 4
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/lv522/landing_zone_forecon/UD6_Tornado)
"mCm" = (
/obj/structure/pipes/standard/simple/hidden/green{
dir = 4
@@ -32752,11 +32841,14 @@
/turf/open/floor/prison,
/area/lv522/indoors/a_block/dorms)
"mZM" = (
-/obj/structure/cargo_container/wy/left{
- layer = 5
+/obj/structure/stairs/perspective{
+ icon_state = "p_stair_full";
+ can_block_movement = 0
},
-/turf/open/auto_turf/sand_white/layer0,
-/area/lv522/outdoors/w_rockies)
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/lv522/landing_zone_forecon/UD6_Tornado)
"mZN" = (
/obj/effect/landmark/structure_spawner/setup/distress/xeno_door,
/obj/structure/pipes/standard/simple/hidden/green{
@@ -32949,8 +33041,8 @@
/turf/open/floor/prison,
/area/lv522/indoors/c_block/mining)
"nbO" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "77"
+/turf/closed/shuttle/typhoon/transparent{
+ icon_state = "86a"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"nbT" = (
@@ -33149,8 +33241,8 @@
},
/area/lv522/indoors/a_block/bridges/garden_bridge)
"nfq" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "36"
+/turf/closed/shuttle/typhoon{
+ icon_state = "103"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"nfP" = (
@@ -34884,6 +34976,12 @@
icon_state = "floor_plate"
},
/area/lv522/indoors/a_block/dorms)
+"nOm" = (
+/obj/item/clothing/suit/storage/labcoat/officer,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"nOB" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/wood,
@@ -34967,8 +35065,11 @@
},
/area/lv522/indoors/a_block/admin)
"nPN" = (
-/turf/closed/shuttle/dropship2/tornado,
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "28"
+ },
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"nPV" = (
/obj/structure/bed/chair/comfy,
/turf/open/floor/prison,
@@ -35050,9 +35151,10 @@
},
/area/lv522/indoors/a_block/security/glass)
"nQY" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "53"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "35"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"nRp" = (
/obj/structure/pipes/vents/pump,
@@ -35168,8 +35270,9 @@
/turf/open/floor/prison,
/area/lv522/indoors/a_block/admin)
"nSN" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "27"
+/obj/effect/attach_point/crew_weapon/tornado,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"nTa" = (
@@ -35587,6 +35690,12 @@
icon_state = "floor_plate"
},
/area/lv522/atmos/cargo_intake)
+"nZN" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "39"
+ },
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"oaa" = (
/turf/open/asphalt/cement{
icon_state = "cement14"
@@ -35660,10 +35769,11 @@
},
/area/lv522/indoors/a_block/fitness)
"obe" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "40"
+/obj/vehicle/powerloader{
+ dir = 4
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"obt" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/machinery/telecomms/bus/preset_one,
@@ -36871,15 +36981,13 @@
},
/area/lv522/indoors/a_block/dorms)
"oyR" = (
-/obj/structure/surface/table/almayer,
-/obj/item/storage/surgical_tray/empty,
-/obj/structure/machinery/light/double{
- dir = 4;
- pixel_y = -5
+/obj/structure/bed/portable_surgery{
+ pixel_y = 5
},
-/turf/open/floor/strata{
+/obj/structure/curtain/medical,
+/turf/open/floor/plating{
dir = 8;
- icon_state = "white_cyan2"
+ icon_state = "platingdmg3"
},
/area/lv522/outdoors/w_rockies)
"oyY" = (
@@ -38709,8 +38817,12 @@
},
/area/lv522/indoors/c_block/cargo)
"pkB" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "9"
+/obj/structure/machinery/light/double{
+ dir = 4;
+ pixel_y = -5
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"pkE" = (
@@ -38858,9 +38970,10 @@
/turf/open/auto_turf/sand_white/layer0,
/area/lv522/outdoors/colony_streets/north_east_street)
"pps" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "100"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"ppy" = (
/obj/structure/surface/table/almayer{
@@ -38878,9 +38991,10 @@
/turf/open/auto_turf/sand_white/layer0,
/area/lv522/outdoors/colony_streets/south_east_street)
"ppF" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "101"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"ppK" = (
/obj/structure/surface/table/almayer,
@@ -38944,9 +39058,10 @@
/turf/open/auto_turf/sand_white/layer0,
/area/lv522/outdoors/colony_streets/north_street)
"pqZ" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "102"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"prs" = (
/obj/effect/decal/cleanable/blood/xeno{
@@ -38957,9 +39072,9 @@
/area/lv522/outdoors/colony_streets/north_street)
"prD" = (
/turf/closed/shuttle/dropship2/tornado{
- icon_state = "5"
+ icon_state = "104"
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/area/lv522/outdoors/colony_streets/north_east_street)
"prM" = (
/obj/structure/cargo_container/horizontal/blue/top,
/turf/open/floor/prison,
@@ -39274,9 +39389,10 @@
},
/area/lv522/indoors/a_block/dorms)
"pxY" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "95"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "95a"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"pyc" = (
/obj/effect/decal/cleanable/blood/drip,
@@ -39295,8 +39411,8 @@
},
/area/lv522/atmos/cargo_intake)
"pys" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "97"
+/turf/closed/shuttle/typhoon/transparent{
+ icon_state = "97a"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"pyA" = (
@@ -39307,13 +39423,11 @@
},
/area/lv522/indoors/a_block/hallway)
"pyO" = (
-/obj/structure/prop/invuln/fire{
- pixel_x = -8;
- pixel_y = 10
- },
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "99"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "99a";
+ layer = 2.97
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"pza" = (
/obj/item/stack/sheet/wood{
@@ -39380,9 +39494,10 @@
},
/area/lv522/indoors/a_block/hallway)
"pAd" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "24"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "9"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"pAj" = (
/turf/open/asphalt/cement{
@@ -39449,12 +39564,12 @@
/turf/open/floor/carpet,
/area/lv522/indoors/c_block/casino)
"pBQ" = (
-/obj/structure/stairs/perspective{
- icon_state = "p_stair_full"
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin3"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "41";
+ density = 0;
+ layer = 4.2
},
+/turf/open/auto_turf/sand_white/layer0,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"pBT" = (
/turf/open/floor/prison{
@@ -39827,8 +39942,8 @@
},
/area/lv522/indoors/a_block/bridges/dorms_fitness)
"pIu" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "86"
+/turf/closed/shuttle/typhoon/transparent{
+ icon_state = "86b"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"pIx" = (
@@ -39838,24 +39953,18 @@
},
/area/lv522/indoors/c_block/mining)
"pIO" = (
-/obj/structure/machinery/computer/cameras{
- desc = "The flight controls for a UD6 Dropship. these controls look pretty banged up, and there's some blood covering the screen..";
- name = "\improper 'Typhoon' flight controls";
- network = null;
- pixel_y = 21
- },
-/obj/structure/bed/chair/dropship/pilot{
- dir = 1
- },
-/obj/structure/machinery/light/double{
+/obj/structure/bed/chair/vehicle/dropship_cockpit/pilot{
dir = 1;
- layer = 2.9;
- pixel_y = 9
+ pixel_x = 6;
+ layer = 3.1
},
-/obj/item/prop/almayer/flight_recorder{
- layer = 2.9;
- pixel_x = -9;
- pixel_y = 4
+/obj/structure/prop{
+ desc = "A flight computer that can be used for autopilot or long-range flights.";
+ icon = 'icons/obj/structures/machinery/computer.dmi';
+ icon_state = "camerasb_old";
+ name = "dropship navigation computer";
+ pixel_x = 5;
+ pixel_y = 8
},
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
@@ -40352,14 +40461,20 @@
/turf/open/floor/prison,
/area/lv522/indoors/c_block/garage)
"pRK" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "75"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "40";
+ density = 0;
+ layer = 4.2
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"pRM" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "81"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "41";
+ density = 0;
+ layer = 4.2
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"pRR" = (
/obj/effect/spawner/gibspawner/xeno,
@@ -40500,8 +40615,11 @@
/turf/open/floor/carpet,
/area/lv522/indoors/c_block/casino)
"pUc" = (
-/turf/open/floor/plating,
-/area/lv522/outdoors/w_rockies)
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "38"
+ },
+/turf/open/auto_turf/shale/layer1,
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"pUd" = (
/obj/structure/machinery/light,
/obj/effect/decal/cleanable/dirt,
@@ -40778,10 +40896,11 @@
},
/area/lv522/indoors/lone_buildings/storage_blocks)
"pZb" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "33"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "21"
},
-/area/lv522/landing_zone_forecon/UD6_Typhoon)
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"pZi" = (
/obj/structure/prop/invuln/ice_prefab,
/turf/open/asphalt/cement{
@@ -41281,10 +41400,8 @@
/turf/open/floor/prison,
/area/lv522/indoors/a_block/dorm_north)
"qjs" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "71"
- },
-/area/lv522/landing_zone_forecon/UD6_Typhoon)
+/turf/open/auto_turf/shale/layer1,
+/area/lv522/oob)
"qjt" = (
/obj/structure/pipes/standard/simple/hidden/green{
dir = 4
@@ -41295,19 +41412,11 @@
},
/area/lv522/indoors/a_block/dorms)
"qjy" = (
-/obj/structure/machinery/door/poddoor/shutters/almayer{
- dir = 4;
- id = "UD6 East";
- indestructible = 1
- },
-/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds2{
- dir = 1;
- name = "\improper Tornado crew hatch"
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin3"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "32"
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/turf/open/auto_turf/shale/layer1,
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qjC" = (
/obj/item/stack/rods,
/turf/open/floor/prison,
@@ -41330,16 +41439,13 @@
/turf/open/auto_turf/shale/layer1,
/area/lv522/outdoors/colony_streets/south_east_street)
"qjX" = (
-/obj/item/clothing/mask/facehugger{
- desc = "It has some sort of a tube at the end of its tail. What the hell is this thing?";
- icon_state = "facehugger_impregnated";
- layer = 3;
- name = "????";
- stat = 2
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "32"
},
-/turf/open/shuttle/dropship{
- icon_state = "rasputin3"
+/obj/effect/attach_point/fuel/tornado{
+ layer = 3.1
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"qkw" = (
/obj/structure/prop/invuln/remote_console_pod,
@@ -41460,12 +41566,8 @@
},
/area/lv522/indoors/b_block/bar)
"qmM" = (
-/obj/structure/prop/invuln/fire{
- pixel_x = -8;
- pixel_y = 10
- },
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "72"
+/turf/closed/shuttle/typhoon{
+ icon_state = "75"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qnb" = (
@@ -41479,27 +41581,8 @@
/turf/open/auto_turf/sand_white/layer0,
/area/lv522/outdoors/colony_streets/north_east_street)
"qnk" = (
-/obj/structure/surface/table/almayer,
-/obj/structure/machinery/computer/overwatch/almayer/broken{
- dir = 8;
- pixel_x = -12;
- pixel_y = 1
- },
-/obj/item/storage/backpack/marine/satchel/rto/small{
- pixel_x = 7;
- pixel_y = 19
- },
-/obj/structure/machinery/door_control{
- id = "UD6 East";
- name = "Cargo Shutter Control";
- pixel_y = -4
- },
-/obj/item/clothing/head/headset{
- pixel_x = 4
- },
-/turf/open/floor/strata{
- dir = 8;
- icon_state = "white_cyan2"
+/turf/closed/shuttle/typhoon{
+ icon_state = "77"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qnn" = (
@@ -41562,12 +41645,8 @@
},
/area/lv522/indoors/a_block/hallway)
"qnV" = (
-/obj/structure/bed/chair/dropship/passenger{
- dir = 8
- },
-/obj/effect/decal/cleanable/blood/splatter,
-/turf/open/shuttle/dropship{
- icon_state = "rasputin6"
+/turf/closed/shuttle/typhoon{
+ icon_state = "82"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qnY" = (
@@ -41600,10 +41679,11 @@
},
/area/lv522/atmos/sewer)
"qpg" = (
-/turf/open/shuttle/dropship{
- icon_state = "floor8"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "16"
},
-/area/lv522/landing_zone_forecon/UD6_Typhoon)
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"qpq" = (
/obj/structure/surface/table/almayer,
/obj/structure/machinery/prop/almayer/computer/PC{
@@ -41744,11 +41824,10 @@
},
/area/lv522/indoors/c_block/garage)
"qqS" = (
-/obj/structure/bed/chair/dropship/passenger{
- dir = 4
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin7"
+/obj/structure/girder/reinforced,
+/turf/open/floor/plating{
+ dir = 8;
+ icon_state = "platingdmg3"
},
/area/lv522/outdoors/w_rockies)
"qqW" = (
@@ -41777,12 +41856,10 @@
},
/area/lv522/indoors/c_block/mining)
"qrj" = (
-/obj/structure/machinery/optable,
-/turf/open/floor/strata{
- dir = 8;
- icon_state = "white_cyan2"
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "103"
},
-/area/lv522/outdoors/w_rockies)
+/area/lv522/outdoors/colony_streets/north_east_street)
"qro" = (
/obj/effect/landmark/structure_spawner/setup/distress/xeno_door,
/turf/open/floor/corsat{
@@ -41817,8 +41894,10 @@
/turf/open/floor/plating,
/area/lv522/indoors/c_block/cargo)
"qst" = (
-/obj/structure/girder/displaced,
-/turf/open/floor/plating,
+/turf/open/floor/plating{
+ dir = 8;
+ icon_state = "platingdmg3"
+ },
/area/lv522/outdoors/w_rockies)
"qsC" = (
/obj/structure/surface/table/almayer,
@@ -41873,10 +41952,11 @@
/turf/open/gm/river,
/area/lv522/atmos/sewer)
"qtc" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "74"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "29"
},
-/area/lv522/landing_zone_forecon/UD6_Typhoon)
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"qtg" = (
/obj/structure/platform_decoration{
dir = 8
@@ -42195,19 +42275,25 @@
},
/turf/open/floor/wood,
/area/lv522/indoors/a_block/fitness/glass)
-"qzp" = (
-/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds2{
- dir = 1;
- name = "\improper Typhoon crew hatch"
+"qze" = (
+/obj/item/ammo_magazine/rifle/heap{
+ current_rounds = 0
},
+/obj/effect/decal/cleanable/blood,
/turf/open/shuttle/dropship{
icon_state = "rasputin3"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
+"qzp" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "62"
+ },
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qzw" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "26"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "16"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"qzy" = (
/obj/structure/largecrate/random/barrel{
@@ -42352,8 +42438,21 @@
/turf/open/floor/prison,
/area/lv522/indoors/a_block/dorms)
"qBH" = (
-/obj/structure/cargo_container/wy/left,
-/turf/open/floor/plating,
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = -1
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "S";
+ pixel_y = 2
+ },
+/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ds2{
+ id = "aft_door";
+ name = "\improper Tornado cargo door"
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin14"
+ },
/area/lv522/outdoors/colony_streets/north_east_street)
"qBQ" = (
/obj/structure/prop/invuln/ice_prefab/standalone/trim{
@@ -42570,9 +42669,10 @@
},
/area/lv522/indoors/a_block/dorms)
"qFs" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "66"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "71"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qFE" = (
/turf/open/asphalt/cement{
@@ -42620,8 +42720,8 @@
/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/indoors/a_block/bridges)
"qGQ" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "67"
+/turf/closed/shuttle/typhoon{
+ icon_state = "72"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qHa" = (
@@ -42631,10 +42731,13 @@
},
/area/lv522/indoors/a_block/dorms)
"qHg" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "2"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "40";
+ density = 0;
+ layer = 4.2
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/turf/open/auto_turf/sand_white/layer0,
+/area/lv522/outdoors/w_rockies)
"qHj" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/generic,
@@ -42661,22 +42764,22 @@
/turf/open/floor/prison,
/area/lv522/indoors/c_block/mining)
"qHA" = (
-/obj/structure/machinery/prop/almayer/CICmap,
-/obj/item/reagent_container/food/drinks/coffee{
- pixel_x = -4;
- pixel_y = 2
+/obj/structure/machinery/computer/overwatch/toc{
+ pixel_y = 14
},
-/obj/structure/machinery/light/double{
- dir = 8;
- pixel_y = -5
+/obj/structure/surface/table/reinforced/toc/west{
+ pixel_y = -7
},
-/obj/item/ammo_magazine/rifle/m4ra{
- pixel_x = 5;
- pixel_y = 6
+/obj/structure/machinery/prop/almayer/CICmap/arc{
+ pixel_y = 9;
+ pixel_x = -9
},
-/turf/open/floor/strata{
- dir = 8;
- icon_state = "white_cyan2"
+/obj/structure/machinery/computer/railgun/toc{
+ pixel_y = 14;
+ pixel_x = 7
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qHD" = (
@@ -42726,7 +42829,12 @@
},
/area/lv522/indoors/c_block/cargo)
"qJl" = (
-/obj/effect/decal/cleanable/blood/splatter,
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 4
+ },
+/obj/structure/barricade/handrail{
+ dir = 1
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
@@ -42755,11 +42863,11 @@
},
/area/lv522/indoors/b_block/bridge)
"qJw" = (
-/obj/item/clothing/suit/storage/RO{
- name = "\improper UA jacket"
+/obj/structure/bed/chair/dropship/passenger/folded{
+ dir = 4
},
/turf/open/shuttle/dropship{
- icon_state = "rasputin3"
+ icon_state = "rasputin7"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qJy" = (
@@ -42866,8 +42974,8 @@
},
/area/lv522/indoors/a_block/dorms)
"qLz" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "69"
+/turf/closed/shuttle/typhoon{
+ icon_state = "73"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qLJ" = (
@@ -42909,17 +43017,10 @@
/turf/open/auto_turf/shale/layer1,
/area/lv522/outdoors/colony_streets/north_east_street)
"qME" = (
-/obj/structure/prop/invuln/fire{
- pixel_x = -7;
- pixel_y = 24
- },
-/obj/structure/prop/invuln/fire{
- pixel_x = -8;
- pixel_y = 10
- },
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "70"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "74"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qMJ" = (
/obj/structure/platform{
@@ -43050,13 +43151,10 @@
},
/area/lv522/indoors/lone_buildings/engineering)
"qOi" = (
-/obj/structure/prop/invuln/fire{
- pixel_x = -8;
- pixel_y = 10
- },
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/tornado/transparent{
icon_state = "26"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qOn" = (
/obj/structure/window/reinforced{
@@ -43340,9 +43438,10 @@
/turf/open/auto_turf/sand_white/layer0,
/area/lv522/outdoors/colony_streets/north_east_street)
"qSP" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "61"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "66"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qSS" = (
/obj/structure/prop/ice_colony/dense/planter_box{
@@ -43369,8 +43468,8 @@
},
/area/lv522/indoors/c_block/mining)
"qTh" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "62"
+/turf/closed/shuttle/typhoon{
+ icon_state = "67"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qTr" = (
@@ -43445,45 +43544,28 @@
/turf/open/auto_turf/sand_white/layer0,
/area/lv522/outdoors/colony_streets/south_east_street)
"qTO" = (
-/obj/structure/largecrate/supply/ammo/m41a/half{
- pixel_x = 5
+/obj/structure/machinery/light/double{
+ dir = 8;
+ pixel_y = -5
},
-/obj/item/storage/box/guncase/m41a{
- pixel_x = 2;
- pixel_y = 6
+/obj/structure/bed/chair/vehicle/toc{
+ dir = 1;
+ pixel_y = 19;
+ pixel_x = 16
},
-/obj/item/ammo_box/rounds/empty{
- layer = 3.1;
- pixel_y = -15
+/obj/effect/decal/cleanable/dirt,
+/obj/item/storage/backpack/marine/satchel/rto{
+ pixel_y = 12;
+ pixel_x = -6
},
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qUf" = (
-/obj/item/ammo_magazine/rifle/m4ra/ext{
- current_rounds = 0
- },
-/obj/item/ammo_magazine/rifle/m4ra/ext{
- current_rounds = 0
- },
-/obj/item/ammo_magazine/rifle/m4ra/ext{
- current_rounds = 0
- },
-/obj/item/ammo_magazine/rifle/m4ra/ext{
- current_rounds = 0
- },
-/obj/structure/closet/crate/ammo,
-/obj/structure/barricade/handrail{
- dir = 8
- },
-/obj/structure/barricade/handrail{
- dir = 4
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
- },
-/area/lv522/landing_zone_forecon/UD6_Typhoon)
+/obj/structure/cargo_container/lockmart/left,
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"qUh" = (
/obj/structure/pipes/standard/simple/hidden/green{
dir = 9
@@ -43512,15 +43594,17 @@
},
/area/lv522/atmos/reactor_garage)
"qUD" = (
-/obj/structure/machinery/cm_vending/sorted/medical/wall_med/limited{
- pixel_x = 30
+/obj/structure/machinery/light/double{
+ dir = 4;
+ pixel_y = -5
},
-/obj/effect/decal/cleanable/blood/splatter,
-/obj/item/ammo_box/rounds/smg{
- layer = 3;
- pixel_x = 1;
- pixel_y = 4
+/obj/structure/surface/table/almayer,
+/obj/item/storage/surgical_tray/empty,
+/obj/item/reagent_container/hypospray/autoinjector/oxycodone{
+ pixel_y = 9;
+ pixel_x = -3
},
+/obj/effect/decal/cleanable/dirt,
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
@@ -43556,8 +43640,8 @@
},
/area/lv522/indoors/a_block/dorms)
"qVl" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "64"
+/turf/closed/shuttle/typhoon{
+ icon_state = "69"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qVN" = (
@@ -43618,9 +43702,10 @@
},
/area/lv522/indoors/a_block/dorms)
"qWZ" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "65"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "70"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qXs" = (
/obj/structure/closet/firecloset/full,
@@ -44193,9 +44278,10 @@
},
/area/lv522/outdoors/colony_streets/east_central_street)
"rfi" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "100"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "95a"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"rfk" = (
/obj/effect/decal/cleanable/dirt,
@@ -44237,7 +44323,8 @@
/area/lv522/indoors/c_block/cargo)
"rgA" = (
/turf/closed/shuttle/dropship2/tornado{
- icon_state = "101"
+ icon_state = "97a";
+ opacity = 0
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"rgG" = (
@@ -44303,9 +44390,10 @@
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"rii" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "102"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "99a"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"ris" = (
/obj/structure/surface/table/reinforced/prison,
@@ -44320,10 +44408,9 @@
},
/area/lv522/indoors/a_block/medical/glass)
"riE" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "68"
- },
-/area/lv522/landing_zone_forecon/UD6_Typhoon)
+/obj/item/stack/sheet/metal/med_small_stack,
+/turf/open/auto_turf/sand_white/layer0,
+/area/lv522/outdoors/w_rockies)
"riJ" = (
/obj/structure/surface/table/reinforced/prison,
/obj/item/paper_bin{
@@ -44404,8 +44491,11 @@
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"rkR" = (
-/obj/structure/barricade/deployable{
- dir = 4
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 8
+ },
+/obj/structure/barricade/handrail{
+ dir = 1
},
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
@@ -44930,12 +45020,16 @@
/turf/open/floor/prison,
/area/lv522/indoors/a_block/dorms)
"ruj" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "59"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "28"
},
-/area/lv522/landing_zone_forecon/UD6_Typhoon)
+/obj/effect/attach_point/fuel/tornado{
+ layer = 3.1
+ },
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"rus" = (
-/obj/effect/decal/cleanable/blood/splatter,
+/obj/effect/attach_point/crew_weapon/typhoon,
/turf/open/shuttle/dropship{
icon_state = "rasputin3"
},
@@ -45242,7 +45336,8 @@
/area/lv522/indoors/c_block/garage)
"rAc" = (
/turf/closed/shuttle/dropship2/tornado{
- icon_state = "95"
+ icon_state = "86b";
+ opacity = 0
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"rAf" = (
@@ -45258,13 +45353,16 @@
},
/area/lv522/indoors/a_block/dorms)
"rAt" = (
-/obj/structure/stairs/perspective{
- icon_state = "p_stair_full"
+/obj/structure/machinery/light/double{
+ dir = 8;
+ pixel_y = -5
},
-/obj/structure/platform{
+/obj/structure/bed/chair/dropship/passenger{
dir = 4
},
-/turf/open/floor/plating,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
/area/lv522/landing_zone_forecon/UD6_Tornado)
"rAu" = (
/obj/structure/platform_decoration,
@@ -45316,13 +45414,27 @@
/turf/open/floor/corsat,
/area/lv522/atmos/cargo_intake)
"rBU" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "41"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "39"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"rBZ" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "97"
+/obj/structure/bed/chair/vehicle{
+ dir = 1;
+ pixel_x = 6;
+ layer = 4.1
+ },
+/obj/structure/prop{
+ desc = "A flight computer that can be used for autopilot or long-range flights.";
+ icon = 'icons/obj/structures/machinery/computer.dmi';
+ icon_state = "camerasb_old";
+ name = "dropship navigation computer";
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"rCa" = (
@@ -45334,7 +45446,8 @@
/area/lv522/indoors/lone_buildings/engineering)
"rCi" = (
/turf/closed/shuttle/dropship2/tornado{
- icon_state = "99"
+ icon_state = "89b";
+ opacity = 0
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"rCp" = (
@@ -45382,14 +45495,11 @@
},
/area/lv522/landing_zone_2/ceiling)
"rCI" = (
-/obj/structure/prop/invuln/fire{
- pixel_x = -6;
- pixel_y = 32
- },
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "17"
+/obj/structure/shuttle/part/tornado{
+ icon_state = "6"
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"rCQ" = (
/obj/structure/pipes/standard/simple/hidden/green{
dir = 4
@@ -45399,19 +45509,17 @@
},
/area/lv522/outdoors/colony_streets/south_east_street)
"rDb" = (
-/obj/item/device/m56d_post,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/landmark/wo_supplies/storage/m56d,
/turf/open/shuttle/dropship{
icon_state = "rasputin3"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"rDu" = (
-/obj/structure/machinery/door_control{
- id = "UD6";
- name = "Cargo Shutter Control"
- },
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "53"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "27"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"rDz" = (
/obj/structure/bed/chair/dropship/passenger{
@@ -45480,8 +45588,8 @@
},
/area/lv522/outdoors/colony_streets/east_central_street)
"rFp" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "51"
+/turf/closed/shuttle/typhoon{
+ icon_state = "37"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"rFw" = (
@@ -45495,9 +45603,10 @@
/turf/open/floor/plating,
/area/lv522/landing_zone_2)
"rGg" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "40"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "38"
},
+/turf/open/auto_turf/sand_white/layer0,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"rGi" = (
/obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node,
@@ -45993,10 +46102,13 @@
},
/area/lv522/indoors/a_block/medical)
"rOO" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "4"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "40";
+ density = 0;
+ layer = 4.2
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"rOP" = (
/obj/structure/pipes/standard/simple/hidden/green{
dir = 4
@@ -46683,9 +46795,13 @@
},
/area/lv522/indoors/c_block/mining)
"sbG" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "28"
},
+/obj/effect/attach_point/fuel/typhoon{
+ layer = 3.1
+ },
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"sbJ" = (
/obj/structure/closet/wardrobe/medic_white,
@@ -46711,43 +46827,45 @@
},
/area/lv522/indoors/a_block/kitchen/damage)
"sci" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "29"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"sct" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "40"
+/obj/structure/closet/crate/explosives,
+/obj/effect/landmark/wo_supplies/storage/mines,
+/obj/effect/landmark/wo_supplies/storage/mines,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"scv" = (
-/obj/structure/bed/chair/dropship/passenger{
- dir = 4
- },
/obj/structure/machinery/light/double{
dir = 8;
pixel_y = -5
},
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 4
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"scw" = (
-/obj/item/ammo_magazine/rifle/heap{
- current_rounds = 0
- },
+/obj/effect/decal/cleanable/blood/oil/streak,
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"scy" = (
-/obj/structure/bed/chair/dropship/passenger{
- dir = 8
- },
/obj/structure/machinery/light/double{
dir = 4;
pixel_y = -5
},
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 8
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
@@ -46768,7 +46886,7 @@
/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/indoors/a_block/bridges/op_centre)
"sdE" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/typhoon{
icon_state = "31"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -46793,17 +46911,10 @@
},
/area/lv522/atmos/east_reactor/south)
"sec" = (
-/obj/structure/prop/invuln/fire{
- pixel_x = -7;
- pixel_y = 17
- },
-/obj/structure/prop/invuln/fire{
- pixel_x = -8;
- pixel_y = 10
- },
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "33"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"sek" = (
/obj/structure/machinery/light{
@@ -46893,13 +47004,10 @@
/turf/open/auto_turf/sand_white/layer0,
/area/lv522/landing_zone_2)
"sfZ" = (
-/obj/structure/prop/invuln/fire{
- pixel_x = 10;
- pixel_y = 32
- },
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "16"
},
+/turf/open/auto_turf/sand_white/layer0,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"sgm" = (
/obj/item/stack/sheet/wood,
@@ -46954,7 +47062,8 @@
/area/lv522/indoors/a_block/fitness/glass)
"shq" = (
/turf/closed/shuttle/dropship2/tornado{
- icon_state = "86"
+ icon_state = "86a";
+ opacity = 0
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"shD" = (
@@ -47099,9 +47208,7 @@
/turf/open/floor/prison,
/area/lv522/outdoors/colony_streets/windbreaker/observation)
"sjS" = (
-/obj/structure/closet/crate/green,
-/obj/item/device/sentry_computer,
-/obj/item/defenses/handheld/sentry,
+/obj/structure/bed/chair/dropship/passenger/folded,
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
@@ -47148,10 +47255,11 @@
},
/area/lv522/atmos/reactor_garage)
"skE" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "63"
+/obj/structure/shuttle/part/tornado{
+ icon_state = "5"
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"skQ" = (
/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{
dir = 1;
@@ -47207,24 +47315,24 @@
/turf/open/auto_turf/shale/layer1,
/area/lv522/outdoors/colony_streets/north_west_street)
"slK" = (
-/obj/structure/machinery/computer/cameras{
- desc = "The flight controls for a UD6 Dropship. these controls look pretty banged up, and there's some blood covering the screen..";
- name = "\improper 'Tornado' flight controls";
- network = null;
- pixel_y = 21
- },
-/obj/structure/bed/chair/dropship/pilot{
- dir = 1
+/obj/structure/stairs/perspective{
+ dir = 1;
+ icon_state = "p_stair_full";
+ pixel_y = 22
},
-/obj/structure/machinery/light/double{
+/obj/structure/bed/chair/vehicle/dropship_cockpit/copilot{
dir = 1;
- layer = 2.9;
- pixel_y = 9
+ layer = 5;
+ pixel_x = 8
},
-/obj/item/prop/almayer/flight_recorder{
- layer = 2.9;
- pixel_x = -9;
- pixel_y = 4
+/obj/structure/prop{
+ desc = "A computer to manage equipment, weapons and simulations installed on the dropship.";
+ icon = 'icons/obj/structures/machinery/computer.dmi';
+ icon_state = "camerasb_old";
+ name = "\improper 'Tornado' weapons controls";
+ pixel_x = 8;
+ pixel_y = 8;
+ layer = 4.14
},
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
@@ -47621,7 +47729,8 @@
/area/lv522/indoors/a_block/medical)
"ssU" = (
/turf/closed/shuttle/dropship2/tornado{
- icon_state = "89"
+ icon_state = "89a";
+ opacity = 0
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"std" = (
@@ -47753,9 +47862,10 @@
},
/area/lv522/indoors/c_block/cargo)
"swr" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "45"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "29"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"swt" = (
/obj/structure/prop/invuln/ice_prefab{
@@ -48184,9 +48294,10 @@
},
/area/lv522/indoors/b_block/hydro)
"sFG" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/tornado/transparent{
icon_state = "22"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"sFL" = (
/obj/structure/prop/invuln/ice_prefab{
@@ -48195,12 +48306,16 @@
/turf/open/auto_turf/sand_white/layer0,
/area/lv522/outdoors/colony_streets/north_west_street)
"sFS" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "23"
+ },
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "23"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"sGc" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/typhoon{
icon_state = "24"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -48252,13 +48367,14 @@
/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/landing_zone_2/ceiling)
"sGT" = (
+/obj/effect/decal/cleanable/dirt,
/obj/structure/barricade/deployable,
-/obj/effect/decal/cleanable/blood/splatter,
/turf/open/shuttle/dropship{
icon_state = "rasputin4"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"sGY" = (
+/obj/effect/decal/cleanable/dirt,
/obj/structure/barricade/deployable,
/turf/open/shuttle/dropship{
icon_state = "floor8"
@@ -48340,15 +48456,41 @@
/turf/open/floor/prison,
/area/lv522/landing_zone_2)
"sIx" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/typhoon{
icon_state = "25"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
+"sIz" = (
+/obj/structure/closet/crate/ammo,
+/obj/item/ammo_magazine/rifle/m4ra/ext{
+ current_rounds = 0
+ },
+/obj/item/ammo_magazine/rifle/m4ra/ext{
+ current_rounds = 0
+ },
+/obj/item/ammo_magazine/rifle/m4ra/ext{
+ current_rounds = 0
+ },
+/obj/item/ammo_magazine/rifle/m4ra/ext{
+ current_rounds = 0
+ },
+/obj/item/ammo_magazine/rifle/m4ra/ext{
+ current_rounds = 0
+ },
+/obj/item/ammo_magazine/rifle/m4ra/ext{
+ current_rounds = 0
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"sIA" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "76"
+/obj/item/prop/colony/used_flare,
+/obj/structure/barricade/deployable{
+ dir = 1
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"sIE" = (
/obj/structure/machinery/light{
dir = 1
@@ -48361,9 +48503,10 @@
},
/area/lv522/landing_zone_1/ceiling)
"sIK" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/tornado/transparent{
icon_state = "27"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"sIN" = (
/obj/effect/decal/warning_stripes{
@@ -49403,9 +49546,10 @@
/turf/open/auto_turf/sand_white/layer0,
/area/lv522/landing_zone_1)
"tbl" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "16"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"tby" = (
/obj/structure/bed/chair/comfy{
@@ -49468,9 +49612,10 @@
},
/area/lv522/outdoors/colony_streets/north_east_street)
"tcz" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "17"
},
+/turf/open/auto_turf/sand_white/layer0,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"tcE" = (
/obj/structure/prop/ice_colony/dense/planter_box{
@@ -49533,12 +49678,13 @@
},
/area/lv522/indoors/a_block/bridges/corpo)
"tdE" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "46"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "9"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"tdH" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/typhoon{
icon_state = "47"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -49557,11 +49703,15 @@
/area/lv522/atmos/sewer)
"tdS" = (
/obj/structure/stairs/perspective{
- icon_state = "p_stair_full"
+ icon_state = "p_stair_full";
+ can_block_movement = 0
},
/obj/structure/platform{
dir = 8
},
+/obj/structure/platform{
+ dir = 4
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
@@ -49631,11 +49781,15 @@
/area/lv522/atmos/east_reactor/south)
"teL" = (
/obj/structure/stairs/perspective{
- icon_state = "p_stair_full"
+ icon_state = "p_stair_full";
+ can_block_movement = 0
},
/obj/structure/platform{
dir = 4
},
+/obj/structure/platform{
+ dir = 8
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
@@ -49684,7 +49838,7 @@
/turf/open/auto_turf/sand_white/layer0,
/area/lv522/outdoors/n_rockies)
"tfV" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/typhoon{
icon_state = "48"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -49713,9 +49867,10 @@
},
/area/lv522/landing_zone_1)
"tgM" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
- icon_state = "49"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "15"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"thb" = (
/obj/structure/surface/table/almayer,
@@ -49748,9 +49903,10 @@
},
/area/lv522/indoors/a_block/dorms/glass)
"the" = (
-/turf/closed/shuttle/dropship2/tornado{
+/obj/structure/shuttle/part/tornado/transparent{
icon_state = "71"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"thi" = (
/obj/effect/decal/cleanable/blood/xeno,
@@ -50576,7 +50732,7 @@
/area/lv522/indoors/a_block/admin)
"twB" = (
/turf/closed/shuttle/dropship2/tornado{
- icon_state = "48"
+ icon_state = "19"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"twQ" = (
@@ -50702,17 +50858,9 @@
},
/area/lv522/indoors/c_block/mining)
"tzm" = (
-/obj/structure/bed/chair/dropship/passenger{
- dir = 8
- },
-/obj/structure/machinery/light/double{
- dir = 4;
- pixel_y = -5
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
- },
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/obj/structure/cargo_container/lockmart/mid,
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"tzz" = (
/obj/structure/largecrate/random/secure,
/obj/structure/largecrate/random/mini{
@@ -50724,10 +50872,8 @@
/obj/structure/platform_decoration{
dir = 4
},
-/obj/structure/closet/crate/ammo,
-/obj/item/ammo_magazine/rifle/lmg/holo_target,
-/obj/item/weapon/gun/rifle/lmg{
- current_mag = null
+/obj/structure/platform_decoration{
+ dir = 8
},
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
@@ -50737,6 +50883,12 @@
/obj/structure/platform_decoration{
dir = 8
},
+/obj/structure/platform_decoration{
+ dir = 4
+ },
+/obj/item/ammo_magazine/rifle/heap{
+ current_rounds = 0
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
@@ -50812,6 +50964,10 @@
/turf/open/auto_turf/sand_white/layer0,
/area/lv522/outdoors/colony_streets/central_streets)
"tBM" = (
+/obj/structure/closet/crate/ammo/alt,
+/obj/item/defenses/handheld/sentry,
+/obj/item/defenses/handheld/sentry,
+/obj/item/device/sentry_computer,
/turf/open/shuttle/dropship{
icon_state = "rasputin6"
},
@@ -51208,6 +51364,10 @@
/turf/open/floor/prison,
/area/lv522/indoors/c_block/garage)
"tIF" = (
+/obj/structure/machinery/light/double{
+ dir = 4;
+ pixel_y = -5
+ },
/obj/structure/bed/chair/dropship/passenger{
dir = 8
},
@@ -51724,9 +51884,13 @@
},
/area/lv522/indoors/a_block/bridges)
"tRu" = (
-/obj/structure/cargo_container/wy/mid,
-/turf/open/floor/plating,
-/area/lv522/outdoors/colony_streets/north_east_street)
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "40";
+ density = 0;
+ layer = 4.2
+ },
+/turf/open/auto_turf/sand_white/layer0,
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"tRI" = (
/obj/structure/surface/table/almayer,
/obj/structure/machinery/computer/cameras/wooden_tv{
@@ -51784,6 +51948,11 @@
dir = 8;
pixel_y = -5
},
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/crate/ammo,
+/obj/item/weapon/gun/rifle/lmg{
+ current_mag = null
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
@@ -52277,9 +52446,10 @@
},
/area/lv522/indoors/a_block/fitness)
"ucD" = (
-/turf/closed/shuttle/dropship2/tornado{
+/obj/structure/shuttle/part/tornado/transparent{
icon_state = "74"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"ucM" = (
/obj/structure/pipes/standard/manifold/fourway/hidden/green,
@@ -52816,10 +52986,17 @@
/turf/open/floor/prison,
/area/lv522/indoors/a_block/security/glass)
"ulh" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "3"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "41";
+ layer = 4.2;
+ density = 0
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "61"
+ },
+/obj/effect/attach_point/weapon/tornado/left_wing,
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"ulL" = (
/turf/open/floor/prison{
dir = 8;
@@ -53097,9 +53274,10 @@
/turf/open/asphalt/cement,
/area/lv522/outdoors/n_rockies)
"uru" = (
-/turf/closed/shuttle/dropship2/tornado{
+/obj/structure/shuttle/part/tornado/transparent{
icon_state = "66"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"urv" = (
/obj/structure/surface/table/reinforced/prison,
@@ -53626,17 +53804,13 @@
/turf/open/floor/prison,
/area/lv522/outdoors/colony_streets/north_street)
"uDM" = (
-/obj/structure/machinery/light/double{
- dir = 8;
- pixel_y = -5
- },
-/obj/structure/bed/chair/dropship/passenger{
- dir = 4
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "41";
+ layer = 4.2;
+ density = 0
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"uDP" = (
/obj/structure/bed/chair/comfy{
dir = 8
@@ -53670,40 +53844,42 @@
},
/area/lv522/atmos/cargo_intake)
"uEr" = (
-/obj/structure/stairs/perspective{
- icon_state = "p_stair_full"
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = -1
},
-/obj/structure/machinery/door/poddoor/shutters/almayer/open{
- id = "UD6";
- name = "\improper Shutters"
+/obj/effect/decal/warning_stripes{
+ icon_state = "S";
+ pixel_y = 2
},
-/obj/structure/platform{
- dir = 8
+/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ds2{
+ id = "aft_door";
+ name = "\improper Typhoon cargo door"
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin14"
},
-/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"uEt" = (
-/obj/structure/stairs/perspective{
- icon_state = "p_stair_full"
+/obj/structure/platform{
+ dir = 1
},
-/obj/structure/machinery/door/poddoor/shutters/almayer/open{
- id = "UD6";
- name = "\improper Shutters"
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
},
-/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"uEz" = (
-/obj/structure/stairs/perspective{
- icon_state = "p_stair_full"
+/obj/effect/decal/warning_stripes{
+ icon_state = "S";
+ pixel_y = 2
},
-/obj/structure/machinery/door/poddoor/shutters/almayer/open{
- id = "UD6";
- name = "\improper Shutters"
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = -1
},
-/obj/structure/platform{
- dir = 4
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin14"
},
-/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"uEC" = (
/turf/open/floor/prison{
@@ -53749,13 +53925,10 @@
/turf/open/floor/plating,
/area/lv522/landing_zone_1/tunnel)
"uEX" = (
-/obj/structure/prop/invuln/fire{
- pixel_x = -6;
- pixel_y = 32
- },
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "17"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"uFe" = (
/obj/structure/bed/sofa/vert/white/bot,
@@ -54567,7 +54740,7 @@
/area/lv522/indoors/a_block/corpo)
"uSB" = (
/turf/closed/shuttle/dropship2/tornado{
- icon_state = "31"
+ icon_state = "25"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"uSI" = (
@@ -54932,15 +55105,10 @@
/turf/open/auto_turf/shale/layer1,
/area/lv522/outdoors/colony_streets/central_streets)
"vbk" = (
-/obj/structure/stairs/perspective{
- icon_state = "p_stair_full"
- },
-/obj/structure/platform{
- dir = 4
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "38"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"vbm" = (
/obj/structure/pipes/standard/simple/hidden/green{
@@ -55029,7 +55197,8 @@
/turf/open/auto_turf/shale/layer2,
/area/lv522/outdoors/colony_streets/north_east_street)
"vcu" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon,
+/obj/structure/shuttle/part/typhoon/transparent,
+/turf/open/auto_turf/sand_white/layer0,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"vcF" = (
/obj/structure/stairs/perspective{
@@ -55180,9 +55349,10 @@
/turf/open/floor/wood,
/area/lv522/indoors/c_block/casino)
"vfl" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "2"
},
+/turf/open/auto_turf/sand_white/layer0,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"vfC" = (
/obj/item/storage/backpack/marine/satchel{
@@ -55223,9 +55393,10 @@
},
/area/lv522/indoors/c_block/garage)
"vga" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "3"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"vgb" = (
/obj/structure/platform,
@@ -55267,15 +55438,12 @@
},
/area/lv522/indoors/a_block/bridges/corpo_fitness)
"vgM" = (
-/obj/structure/platform_decoration{
- dir = 4
+/obj/structure/closet/crate/ammo,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
},
-/turf/open/auto_turf/shale/layer1,
-/area/lv522/outdoors/w_rockies)
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"vhd" = (
-/obj/structure/platform_decoration{
- dir = 8
- },
/obj/effect/decal/cleanable/blood,
/turf/open/auto_turf/shale/layer1,
/area/lv522/outdoors/w_rockies)
@@ -55301,19 +55469,22 @@
},
/area/lv522/atmos/east_reactor/south)
"vhC" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "4"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"vhJ" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "5"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"vhO" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "6"
},
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"vil" = (
/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{
@@ -55424,17 +55595,11 @@
/turf/open/floor/prison,
/area/lv522/indoors/c_block/mining)
"vjs" = (
-/obj/structure/machinery/light/double{
- dir = 4;
- pixel_y = -5
- },
-/obj/structure/bed/chair/dropship/passenger{
- dir = 8
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "28"
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/turf/open/auto_turf/shale/layer1,
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"vju" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/prison{
@@ -55511,6 +55676,12 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/indoors/a_block/admin)
+"vky" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "39"
+ },
+/turf/open/auto_turf/sand_white/layer0,
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"vkC" = (
/obj/effect/decal/cleanable/cobweb,
/turf/open/floor/prison{
@@ -55792,9 +55963,10 @@
},
/area/lv522/indoors/a_block/corpo)
"vpU" = (
-/turf/closed/shuttle/dropship2/tornado{
+/obj/structure/shuttle/part/tornado/transparent{
icon_state = "70"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"vqe" = (
/obj/structure/machinery/light{
@@ -56079,9 +56251,8 @@
},
/area/lv522/landing_zone_1/ceiling)
"vuF" = (
-/obj/vehicle/powerloader,
-/turf/open/shuttle/dropship{
- icon_state = "rasputin3"
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "48"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"vuH" = (
@@ -56109,6 +56280,9 @@
name = "????";
stat = 2
},
+/obj/structure/barricade/deployable{
+ dir = 1
+ },
/turf/open/floor/prison{
icon_state = "floor_plate"
},
@@ -56901,13 +57075,29 @@
},
/area/lv522/indoors/a_block/dorms)
"vJo" = (
-/obj/structure/barricade/deployable{
- dir = 1
+/obj/structure/stairs/perspective{
+ dir = 1;
+ icon_state = "p_stair_full";
+ pixel_y = 22
},
-/turf/open/floor/prison{
- icon_state = "floor_plate"
+/obj/structure/bed/chair/vehicle/dropship_cockpit/copilot{
+ dir = 1;
+ pixel_x = 8;
+ layer = 5
},
-/area/lv522/outdoors/colony_streets/north_east_street)
+/obj/structure/prop{
+ desc = "A computer to manage equipment, weapons and simulations installed on the dropship.";
+ icon = 'icons/obj/structures/machinery/computer.dmi';
+ icon_state = "camerasb_old";
+ name = "\improper 'Typhoon' weapons controls";
+ pixel_x = 8;
+ pixel_y = 8;
+ layer = 4.14
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"vJr" = (
/obj/structure/machinery/landinglight/ds2/delaythree,
/turf/open/floor/plating,
@@ -58680,9 +58870,12 @@
/turf/closed/wall/shiva/prefabricated/reinforced,
/area/lv522/outdoors/colony_streets/north_west_street)
"wqt" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "16"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "41";
+ layer = 4.2;
+ density = 0
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"wqA" = (
/obj/structure/bed/chair{
@@ -59101,15 +59294,17 @@
},
/area/lv522/indoors/a_block/bridges)
"wyM" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "61"
+/obj/effect/decal/cleanable/blood,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"wzg" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "62"
+/obj/effect/decal/cleanable/dirt,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"wzt" = (
/obj/item/storage/backpack/marine/satchel{
desc = "It's the heavy-duty black polymer kind. Time to take out the trash!";
@@ -59156,9 +59351,10 @@
},
/area/lv522/outdoors/colony_streets/east_central_street)
"wAf" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "68"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "26"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"wAB" = (
/obj/structure/surface/table/almayer,
@@ -59195,9 +59391,6 @@
},
/area/lv522/indoors/a_block/executive)
"wBr" = (
-/obj/structure/machinery/cm_vending/sorted/medical/wall_med/limited{
- pixel_x = 30
- },
/obj/structure/bed/chair/dropship/passenger{
dir = 8
},
@@ -59234,10 +59427,16 @@
},
/area/lv522/atmos/reactor_garage)
"wCr" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "64"
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "41";
+ density = 0;
+ layer = 4.2
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "61"
+ },
+/turf/open/auto_turf/sand_white/layer0,
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"wCt" = (
/obj/structure/machinery/light{
dir = 4
@@ -59909,10 +60108,11 @@
},
/area/lv522/indoors/a_block/fitness)
"wRL" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "30"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "33"
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"wRQ" = (
/obj/structure/surface/table/almayer,
/obj/structure/phone_base/colony_net/rotary{
@@ -60163,10 +60363,29 @@
/turf/open/floor/prison,
/area/lv522/indoors/a_block/bridges/dorms_fitness)
"wXe" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "65"
+/obj/structure/surface/table/reinforced/toc/east{
+ pixel_y = -7
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/obj/structure/machinery/computer/railgun/gatling/toc{
+ pixel_y = 13;
+ pixel_x = -7
+ },
+/obj/structure/phone_base/toc{
+ pixel_y = 13;
+ pixel_x = 11;
+ phone_id = "Typhoon Overwatch";
+ phone_category = "Overwatch";
+ name = "Typhoon overwatch telephone receiver"
+ },
+/obj/item/reagent_container/food/drinks/coffeecup{
+ pixel_y = -5;
+ pixel_x = 10
+ },
+/obj/item/clothing/head/headset,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin6"
+ },
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"wXq" = (
/obj/structure/surface/table/almayer,
/obj/item/reagent_container/food/snacks/grown/deathberries{
@@ -60468,6 +60687,12 @@
},
/turf/open/floor/prison,
/area/lv522/indoors/c_block/mining)
+"xcR" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "101"
+ },
+/turf/open/floor/plating,
+/area/lv522/landing_zone_forecon/UD6_Tornado)
"xcU" = (
/turf/open/floor/corsat{
icon_state = "plate"
@@ -60740,9 +60965,13 @@
},
/area/lv522/indoors/lone_buildings/storage_blocks)
"xic" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/obj/structure/shuttle/part/typhoon/transparent{
icon_state = "32"
},
+/obj/effect/attach_point/fuel/typhoon{
+ layer = 3.1
+ },
+/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"xig" = (
/obj/structure/closet/crate,
@@ -60812,6 +61041,12 @@
"xjF" = (
/turf/closed/wall/strata_outpost,
/area/lv522/indoors/a_block/executive)
+"xjK" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/shuttle/dropship{
+ icon_state = "floor8"
+ },
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"xjO" = (
/obj/structure/window/framed/strata/reinforced,
/turf/open/floor/corsat{
@@ -60856,17 +61091,11 @@
},
/area/lv522/indoors/a_block/security)
"xkk" = (
-/obj/structure/bed/chair/dropship/passenger{
- dir = 4
- },
-/obj/structure/machinery/light/double{
- dir = 8;
- pixel_y = -5
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+/obj/structure/shuttle/part/tornado{
+ icon_state = "2"
},
-/area/lv522/landing_zone_forecon/UD6_Tornado)
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"xkv" = (
/obj/effect/decal/cleanable/blood/drip,
/obj/structure/pipes/standard/simple/hidden/green{
@@ -61141,6 +61370,12 @@
"xqp" = (
/turf/open/auto_turf/shale/layer2,
/area/lv522/landing_zone_1)
+"xqQ" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "3"
+ },
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"xqV" = (
/obj/structure/cargo_container/kelland/right,
/turf/open/floor/prison{
@@ -61184,9 +61419,10 @@
/turf/open/floor/prison,
/area/lv522/indoors/a_block/dorms/glass)
"xsc" = (
-/turf/closed/shuttle/dropship2/tornado{
- icon_state = "29"
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "23"
},
+/turf/open/floor/plating,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"xsd" = (
/obj/structure/pipes/standard/simple/hidden/green{
@@ -62040,16 +62276,7 @@
},
/area/lv522/indoors/lone_buildings/engineering)
"xKc" = (
-/obj/structure/barricade/handrail{
- dir = 8
- },
-/obj/structure/barricade/handrail{
- dir = 4
- },
-/obj/structure/closet/crate/ammo,
-/obj/item/ammo_magazine/m56d,
-/obj/item/ammo_magazine/m56d,
-/obj/item/device/m56d_gun,
+/obj/effect/attach_point/crew_weapon/typhoon,
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
@@ -62204,11 +62431,9 @@
},
/area/lv522/atmos/east_reactor/south)
"xNu" = (
-/obj/structure/platform_decoration{
- dir = 8
- },
-/obj/structure/bed/chair/dropship/passenger{
- dir = 8
+/obj/structure/machinery/light/double{
+ dir = 8;
+ pixel_y = -5
},
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
@@ -62502,17 +62727,8 @@
},
/area/lv522/outdoors/colony_streets/north_street)
"xRM" = (
-/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds2{
- dir = 1;
- name = "\improper Tornado crew hatch"
- },
-/obj/structure/machinery/door/poddoor/shutters/almayer{
- dir = 4;
- id = "UD6 East";
- indestructible = 1
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin3"
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "18"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"xRQ" = (
@@ -62901,6 +63117,12 @@
"xYD" = (
/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/atmos/east_reactor/south)
+"xZf" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "27"
+ },
+/turf/open/floor/plating,
+/area/lv522/outdoors/colony_streets/north_east_street)
"xZw" = (
/turf/open/floor/corsat{
icon_state = "squares"
@@ -63438,6 +63660,12 @@
"yiM" = (
/turf/open/auto_turf/sand_white/layer0,
/area/lv522/outdoors/colony_streets/central_streets)
+"yiW" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "23"
+ },
+/turf/open/auto_turf/sand_white/layer0,
+/area/lv522/landing_zone_forecon/UD6_Typhoon)
"yiZ" = (
/obj/structure/prop/vehicles/crawler{
dir = 8;
@@ -65342,7 +65570,7 @@ sRA
sRA
sRA
sRA
-sRA
+uiK
sRA
sRA
sRA
@@ -65563,14 +65791,14 @@ sRA
sRA
sRA
sRA
+uiK
sRA
sRA
sRA
sRA
-sRA
-sRA
-sRA
-sRA
+uiK
+uiK
+uiK
sRA
sRA
sRA
@@ -65787,21 +66015,21 @@ rWS
sRA
sRA
sRA
+uiK
+uiK
sRA
sRA
sRA
-sRA
-sRA
-sRA
-sRA
+uiK
+qHg
rGg
sbG
dlC
-tbl
-sRA
-sRA
-sRA
-sRA
+sfZ
+uiK
+uiK
+uiK
+uiK
sRA
sRA
sRA
@@ -66012,21 +66240,21 @@ cpy
cpy
kBT
uiK
-mZM
sRA
sRA
-rWS
-qjs
-qFs
-qSP
sRA
sRA
-rBU
+sRA
+qFs
+qSP
+qSP
+wCr
+vky
sci
-sFS
+yiW
tcz
-rGg
-sbG
+tRu
+vjs
sFG
sfZ
vcu
@@ -66239,25 +66467,25 @@ cpy
cpy
vZY
pXH
-bQq
sRA
-rWS
+sRA
+sRA
pRK
qmM
qGQ
qTh
-rjP
+qTh
qzp
-nfq
+eSG
fDg
sGc
tdE
-rBU
-sci
+pBQ
+dae
sFS
tcz
vfl
-uiK
+sRA
rWS
rWS
sRA
@@ -66466,20 +66694,20 @@ cpy
cpy
kLQ
sRA
-jHa
sRA
-obe
+sRA
+sRA
pRM
qnk
qHA
qTO
-rhB
+vgM
qJl
rCp
scv
rCp
tdH
-nfq
+eSG
fDg
sGc
nfq
@@ -66698,10 +66926,10 @@ pxY
pIu
nbO
qnV
-rjP
-rjP
+wXe
+wyM
rig
-rjP
+wyM
rDb
rjP
sGT
@@ -66710,7 +66938,7 @@ tzA
tSJ
scw
uEr
-vgM
+uiK
uiK
uiK
sRA
@@ -66923,22 +67151,22 @@ cpy
ppF
pys
pIO
+vJo
pTH
-qpg
-qJl
-qUf
-riE
-ruj
-rDu
+xjK
+rhB
+rhB
+rhB
+rhB
xKc
sGY
-pBQ
-rjP
-rus
-rjP
+rhB
uEt
-kor
-sRA
+rus
+wzg
+uEz
+riE
+uiK
sRA
sRA
sRA
@@ -67149,23 +67377,23 @@ cpy
cpy
pqZ
pyO
-qst
+qqS
gTM
qqS
qJw
+nOm
+wyM
rjP
rjP
-rus
-rjP
-rig
+qze
sHg
teL
tzF
tSU
-rhB
+cet
uEz
vhd
-sRA
+uiK
sRA
sRA
rYp
@@ -67374,14 +67602,14 @@ vtc
vtc
vtc
cpy
-cpy
-rWS
-rWS
-pUc
-qrj
+qjs
+sRA
+sRA
+sRA
+qst
oyR
qUD
-rkR
+sIz
rkR
rDz
scy
@@ -67390,7 +67618,7 @@ tfV
rFp
sdE
sIx
-rFp
+dic
vhC
uiK
uiK
@@ -67601,21 +67829,21 @@ vtc
vtc
vtc
cpy
-cpy
-rWS
+qjs
+sRA
+sRA
sRA
-pUc
qst
qLz
qVl
-rjP
-qzp
+qVl
+bpZ
rFp
sdE
sIx
tgM
-rGg
-xic
+pRK
+qjy
qOi
tbl
vhJ
@@ -67828,21 +68056,21 @@ jXT
jXT
noL
cpy
-cpy
-cpy
+qjs
+qjs
+sRA
sRA
sRA
-qtc
qME
qWZ
-sRA
-sRA
-rGg
+qWZ
+jHa
+pUc
xic
guR
-tbl
-rBU
-pZb
+sfZ
+pBQ
+sec
sIK
uEX
vhO
@@ -68055,23 +68283,23 @@ vtc
vtc
lMH
vtc
-wms
-cpy
-sRA
-sRA
sRA
+qjs
sRA
sRA
sRA
sRA
+uiK
+uiK
+pBQ
rBU
sec
-sIK
+rDu
tcz
-cpy
-cpy
-cpy
-rWS
+uiK
+uiK
+sRA
+sRA
sRA
sRA
sRA
@@ -102353,7 +102581,7 @@ lAn
lAn
lAn
lAn
-vJo
+lAn
vuY
lAn
lAn
@@ -102580,21 +102808,21 @@ qUL
qUL
qUL
qUL
-nSF
qUL
+nSF
qUL
+rOO
eRI
-eRI
-sct
-fzC
-dIr
-wqt
-iRl
+ruj
+jgW
+aaF
qUL
qUL
qUL
-aDs
qUL
+qUL
+aDs
+xfu
krH
aSR
ltf
@@ -102803,24 +103031,24 @@ krH
xIv
qUL
qUL
-qUL
+nSF
qUL
qUL
qUL
the
uru
-wyM
-qUL
-qUL
+uru
+ulh
+nQY
swr
xsc
ibE
-kzk
-sct
-fzC
-dIr
-wqt
+eTw
nPN
+fzC
+aaF
+fLa
+qUL
qUL
lAn
krH
@@ -103029,25 +103257,25 @@ pFH
krH
xIv
qUL
-qUL
+xfu
nSF
qUL
-qUL
+rOO
sCp
toY
uwQ
-wzg
-lgw
+uwQ
+lMI
xRM
-bpZ
-wRL
+hvf
+dWv
pAd
-pkB
-swr
+wqt
+qtc
xsc
-ibE
-kzk
-qHg
+pZb
+xkk
+obe
qUL
lAn
krH
@@ -103257,24 +103485,24 @@ krH
xIv
qUL
qUL
-nSF
qUL
-sct
-sIA
+qUL
+wqt
+ejQ
tth
-uDM
+rAt
tth
-uXj
-uXj
tth
-xkk
tth
-fLa
-bpZ
-wRL
-pAd
-bpZ
-ulh
+rAt
+tth
+kzk
+xRM
+hvf
+dWv
+qrj
+xqQ
+qUL
qUL
pVb
krH
@@ -103483,7 +103711,7 @@ pFH
krH
xIv
qUL
-qUL
+kNR
rfi
rAc
shq
@@ -103492,17 +103720,17 @@ tBM
uKQ
uKQ
uKQ
-uKQ
-qjX
+fYN
uKQ
hFm
+cJc
dqn
-dic
-uDM
-tth
-eTw
-lVs
+xNu
+uXj
qBH
+qUL
+qUf
+qUL
lAn
krH
nTp
@@ -103710,26 +103938,26 @@ pFH
krH
xIv
qUL
-qUL
+xcR
rgA
rBZ
slK
sYh
tCR
+nSN
sjS
-wAf
-skE
-skE
-nQY
-kNR
+sjS
+sjS
+nSN
tCR
-fTm
+mZM
uKQ
+dIr
uKQ
-vuF
fbY
qUL
-tRu
+tzm
+qUL
lAn
krH
nTp
@@ -103937,7 +104165,7 @@ pFH
krH
xIv
qUL
-qUL
+lVs
rii
rCi
ssU
@@ -103947,16 +104175,16 @@ uKQ
uKQ
uKQ
uKQ
-uKQ
-uKQ
+sct
iSu
-vbk
-xNu
-vjs
-tIF
-rAt
+mCl
+fTm
+pkB
+uXj
+fbY
+qUL
gOZ
-cJc
+iRl
lAn
krH
nTp
@@ -104167,22 +104395,22 @@ qUL
qUL
qUL
pTW
-swr
-sIA
-tIF
-vjs
+eTw
+ejQ
wBr
-uXj
-uXj
tIF
-tzm
+wBr
+wBr
+wBr
tIF
+wBr
+vuF
twB
fXn
uSB
-ecP
-fXn
-rOO
+prD
+jcA
+qUL
qUL
lAn
krH
@@ -104394,22 +104622,22 @@ qUL
qUL
qUL
qUL
-qUL
+uDM
tcu
tSo
vjv
-wCr
+vjv
lgw
-qjy
+twB
fXn
uSB
ecP
-aaF
-sct
-dWY
-qzw
-wqt
-prD
+eTw
+afT
+wAf
+qpg
+skE
+qUL
qUL
lAn
krH
@@ -104620,23 +104848,23 @@ xIv
qUL
qUL
qUL
+sIA
qUL
-nSF
qUL
ucD
vpU
-wXe
-qUL
-qUL
-sct
+vpU
dWY
+vbk
+qjX
+wAf
qzw
wqt
-swr
+wRL
eUS
-nSN
+bQq
rCI
-dWv
+qUL
qUL
lAn
krH
@@ -104847,23 +105075,23 @@ iNs
qUL
qUL
qUL
-qUL
nSF
qUL
xfu
-qUL
dBd
-iRl
qUL
-swr
-eUS
-nSN
-kzk
-iRl
+qUL
+uDM
+nZN
+wRL
+xZf
+bQq
+qUL
pTW
qUL
qUL
qUL
+iRl
qUL
krH
aSR
@@ -105079,7 +105307,7 @@ lAn
lAn
nVX
nVX
-lAn
+pVb
lAn
lAn
lAn
diff --git a/maps/map_files/New_Varadero/New_Varadero.dmm b/maps/map_files/New_Varadero/New_Varadero.dmm
index a376e1173d..be2e218d2f 100644
--- a/maps/map_files/New_Varadero/New_Varadero.dmm
+++ b/maps/map_files/New_Varadero/New_Varadero.dmm
@@ -1838,9 +1838,7 @@
/area/varadero/interior/hall_N)
"bhU" = (
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0;
- wrenchable = 1
+ name = "Floodlight"
},
/obj/structure/platform_decoration/kutjevo{
dir = 8
@@ -10520,9 +10518,7 @@
/area/varadero/interior/security)
"gRU" = (
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0;
- wrenchable = 1
+ name = "Floodlight"
},
/turf/open/auto_turf/sand_white/layer1,
/area/varadero/interior_protected/caves/digsite)
@@ -13553,9 +13549,7 @@
/area/varadero/interior/administration)
"iWX" = (
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0;
- wrenchable = 1
+ name = "Floodlight"
},
/turf/open/auto_turf/sand_white/layer1,
/area/varadero/exterior/eastbeach)
@@ -19007,9 +19001,7 @@
/area/varadero/interior/cargo)
"mtp" = (
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0;
- wrenchable = 1
+ name = "Floodlight"
},
/turf/open/floor/plating/icefloor{
icon_state = "asteroidplating"
@@ -19121,9 +19113,7 @@
/area/varadero/interior/hall_SE)
"mvO" = (
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0;
- wrenchable = 1
+ name = "Floodlight"
},
/turf/open/floor/shiva{
dir = 1;
@@ -19646,9 +19636,7 @@
dir = 1
},
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0;
- wrenchable = 1
+ name = "Floodlight"
},
/turf/open/floor/shiva{
dir = 1;
@@ -28691,30 +28679,15 @@
/area/varadero/interior/maintenance/security)
"syb" = (
/obj/structure/surface/rack,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88{
- pixel_x = -6;
- pixel_y = 5
- },
-/obj/item/ammo_magazine/pistol/mod88{
- pixel_x = -6;
- pixel_y = 5
- },
-/obj/item/ammo_magazine/pistol/mod88{
- pixel_x = -6;
- pixel_y = 5
- },
-/obj/item/ammo_magazine/pistol/mod88{
- pixel_x = -6;
- pixel_y = 5
- },
-/obj/item/ammo_magazine/pistol/mod88{
- pixel_x = -6;
- pixel_y = 5
- },
-/obj/item/ammo_magazine/pistol/mod88,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
/obj/structure/machinery/light{
dir = 4
},
diff --git a/maps/map_files/New_Varadero_Fixed/New_Varadero_Repaired.dmm b/maps/map_files/New_Varadero_Fixed/New_Varadero_Repaired.dmm
index 5c12a0b028..1413a053bc 100644
--- a/maps/map_files/New_Varadero_Fixed/New_Varadero_Repaired.dmm
+++ b/maps/map_files/New_Varadero_Fixed/New_Varadero_Repaired.dmm
@@ -1723,9 +1723,7 @@
/area/varadero/interior/hall_N)
"bhU" = (
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0;
- wrenchable = 1
+ name = "Floodlight"
},
/obj/structure/platform_decoration/kutjevo{
dir = 8
@@ -9885,9 +9883,7 @@
/area/varadero/interior/security)
"gRU" = (
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0;
- wrenchable = 1
+ name = "Floodlight"
},
/turf/open/auto_turf/sand_white/layer1,
/area/varadero/interior_protected/caves/digsite)
@@ -12618,9 +12614,7 @@
/area/varadero/interior/administration)
"iWX" = (
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0;
- wrenchable = 1
+ name = "Floodlight"
},
/turf/open/auto_turf/sand_white/layer1,
/area/varadero/exterior/eastbeach)
@@ -17806,9 +17800,7 @@
/area/varadero/interior/cargo)
"mtp" = (
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0;
- wrenchable = 1
+ name = "Floodlight"
},
/turf/open/floor/plating/icefloor{
icon_state = "asteroidplating"
@@ -17888,9 +17880,7 @@
/area/varadero/interior/hall_SE)
"mvO" = (
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0;
- wrenchable = 1
+ name = "Floodlight"
},
/turf/open/floor/shiva{
dir = 1;
@@ -18376,9 +18366,7 @@
dir = 1
},
/obj/structure/machinery/floodlight{
- name = "Floodlight";
- unacidable = 0;
- wrenchable = 1
+ name = "Floodlight"
},
/turf/open/floor/shiva{
dir = 1;
@@ -26906,30 +26894,15 @@
/area/varadero/interior/maintenance/security)
"syb" = (
/obj/structure/surface/rack,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88,
-/obj/item/ammo_magazine/pistol/mod88{
- pixel_x = -6;
- pixel_y = 5
- },
-/obj/item/ammo_magazine/pistol/mod88{
- pixel_x = -6;
- pixel_y = 5
- },
-/obj/item/ammo_magazine/pistol/mod88{
- pixel_x = -6;
- pixel_y = 5
- },
-/obj/item/ammo_magazine/pistol/mod88{
- pixel_x = -6;
- pixel_y = 5
- },
-/obj/item/ammo_magazine/pistol/mod88{
- pixel_x = -6;
- pixel_y = 5
- },
-/obj/item/ammo_magazine/pistol/mod88,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
/obj/structure/machinery/light{
dir = 4
},
diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm
index ed95fd0516..128256587e 100644
--- a/maps/map_files/USS_Almayer/USS_Almayer.dmm
+++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm
@@ -37056,7 +37056,7 @@
/turf/open/floor/almayer,
/area/almayer/hull/upper_hull/u_f_p)
"gpi" = (
-/obj/structure/dropship_equipment/rappel_system,
+/obj/structure/dropship_equipment/paradrop_system,
/turf/open/floor/almayer{
icon_state = "test_floor4"
},
@@ -68522,11 +68522,11 @@
req_one_access_txt = "3;22;2;19;7"
},
/obj/structure/surface/rack,
-/obj/item/rappel_harness{
+/obj/item/parachute{
pixel_y = 8
},
-/obj/item/rappel_harness,
-/obj/item/rappel_harness{
+/obj/item/parachute,
+/obj/item/parachute{
pixel_y = -6
},
/obj/structure/sign/safety/bulkhead_door{
diff --git a/maps/map_files/derelict_almayer/derelict_almayer.dmm b/maps/map_files/derelict_almayer/derelict_almayer.dmm
index 9833ecb4d9..aeab7ffa35 100644
--- a/maps/map_files/derelict_almayer/derelict_almayer.dmm
+++ b/maps/map_files/derelict_almayer/derelict_almayer.dmm
@@ -4377,7 +4377,7 @@
},
/area/almayer/shipboard/brig/cic_hallway)
"brY" = (
-/obj/structure/dropship_equipment/rappel_system,
+/obj/structure/dropship_equipment/paradrop_system,
/turf/open/floor/almayer{
icon_state = "test_floor4"
},
@@ -49654,11 +49654,11 @@
req_one_access_txt = "3;22;2;19;7"
},
/obj/structure/surface/rack,
-/obj/item/rappel_harness{
+/obj/item/parachute{
pixel_y = 8
},
-/obj/item/rappel_harness,
-/obj/item/rappel_harness{
+/obj/item/parachute,
+/obj/item/parachute{
pixel_y = -6
},
/obj/structure/sign/safety/bulkhead_door{
diff --git a/maps/map_files/golden_arrow/golden_arrow.dmm b/maps/map_files/golden_arrow/golden_arrow.dmm
index 37c6f5290e..18f231aad2 100644
--- a/maps/map_files/golden_arrow/golden_arrow.dmm
+++ b/maps/map_files/golden_arrow/golden_arrow.dmm
@@ -1285,6 +1285,19 @@
},
/turf/open/floor/almayer,
/area/golden_arrow/hangar)
+"eM" = (
+/obj/structure/surface/table/almayer,
+/obj/item/tool/kitchen/rollingpin{
+ pixel_y = 4;
+ pixel_x = -6
+ },
+/obj/item/tool/kitchen/knife{
+ pixel_x = 9
+ },
+/turf/open/floor/almayer{
+ icon_state = "dark_sterile"
+ },
+/area/golden_arrow/cryo_cells)
"eN" = (
/obj/structure/machinery/gear{
id = "supply_elevator_gear"
@@ -3644,11 +3657,27 @@
},
/area/golden_arrow/hangar)
"nD" = (
+/obj/structure/surface/rack{
+ pixel_y = 14;
+ pixel_x = 4
+ },
/obj/structure/reagent_dispensers/water_cooler/stacks{
density = 0;
pixel_x = -10;
pixel_y = 6
},
+/obj/item/reagent_container/food/condiment/peppermill{
+ pixel_y = 26;
+ pixel_x = 1
+ },
+/obj/item/reagent_container/food/condiment/saltshaker{
+ pixel_y = 26;
+ pixel_x = -3
+ },
+/obj/item/storage/box/drinkingglasses{
+ pixel_x = 10;
+ pixel_y = 28
+ },
/turf/open/floor/almayer{
icon_state = "dark_sterile"
},
@@ -6992,23 +7021,22 @@
},
/area/golden_arrow/cryo_cells)
"AV" = (
-/obj/structure/surface/table/almayer,
-/obj/item/tool/kitchen/tray{
- pixel_x = -5;
- pixel_y = 6
- },
-/obj/item/trash/plate{
- pixel_x = -5;
- pixel_y = 5
- },
-/obj/item/trash/plate{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/trash/plate{
- pixel_x = -4;
- pixel_y = 9
- },
+/obj/item/reagent_container/food/condiment/sugar,
+/obj/item/reagent_container/food/condiment/enzyme,
+/obj/item/reagent_container/food/snacks/flour,
+/obj/item/reagent_container/food/snacks/flour,
+/obj/item/reagent_container/food/snacks/flour,
+/obj/item/reagent_container/food/snacks/flour,
+/obj/structure/closet{
+ desc = "It's a fancy storage unit for long-life foodstuffs.";
+ name = "long-life foodstuff storage"
+ },
+/obj/item/storage/box/powderedmilk,
+/obj/item/reagent_container/food/condiment/juice/egg,
+/obj/item/reagent_container/food/snacks/flour,
+/obj/item/reagent_container/food/snacks/flour,
+/obj/item/reagent_container/food/snacks/flour,
+/obj/item/reagent_container/food/snacks/flour,
/turf/open/floor/almayer{
icon_state = "dark_sterile"
},
@@ -7535,9 +7563,6 @@
/turf/open/floor/plating,
/area/golden_arrow/hangar)
"Dn" = (
-/obj/structure/surface/rack{
- pixel_y = 19
- },
/obj/effect/decal/cleanable/dirt,
/obj/item/stack/medical/ointment{
pixel_x = 2;
@@ -8018,17 +8043,29 @@
/area/golden_arrow/prep_hallway)
"Fl" = (
/obj/structure/surface/table/almayer,
+/obj/item/tool/kitchen/tray{
+ pixel_x = -3;
+ pixel_y = 3
+ },
/obj/item/reagent_container/food/condiment/hotsauce/tabasco{
- pixel_x = 7;
- pixel_y = 14
+ pixel_x = 12;
+ pixel_y = 18
},
-/obj/item/paper_bin{
- pixel_x = -7;
+/obj/item/trash/plate{
+ pixel_x = -5;
+ pixel_y = 3
+ },
+/obj/item/trash/plate{
+ pixel_x = -3;
pixel_y = 5
},
/obj/item/reagent_container/food/condiment/hotsauce/tabasco{
- pixel_x = 6;
- pixel_y = 6
+ pixel_y = 18;
+ pixel_x = 2
+ },
+/obj/item/trash/plate{
+ pixel_x = -4;
+ pixel_y = 7
},
/turf/open/floor/almayer{
icon_state = "dark_sterile"
@@ -21955,12 +21992,12 @@ EG
EG
EG
Wh
-Nz
+nD
HF
rQ
HF
Fl
-og
+AV
og
CM
Bf
@@ -22111,8 +22148,8 @@ fl
HF
rQ
HF
-AV
-og
+HF
+HF
og
Va
TB
@@ -22263,8 +22300,8 @@ zG
aA
vN
nW
-nD
-og
+Nz
+eM
og
Dq
Ms
@@ -22417,7 +22454,7 @@ Ir
Ir
Ir
Ir
-Vi
+og
og
Hv
Iz
diff --git a/maps/map_files/rover/rover.dmm b/maps/map_files/rover/rover.dmm
index 439969153d..e672e1b887 100644
--- a/maps/map_files/rover/rover.dmm
+++ b/maps/map_files/rover/rover.dmm
@@ -4668,7 +4668,7 @@
/turf/open/floor/plating/plating_catwalk,
/area/golden_arrow/prep_hallway)
"Ty" = (
-/obj/structure/dropship_equipment/rappel_system,
+/obj/structure/dropship_equipment/paradrop_system,
/turf/open/floor/almayer{
icon_state = "cargo"
},
diff --git a/maps/override_ground.json b/maps/override_ground.json
index 94d3c70757..8cfc8e1ca0 100644
--- a/maps/override_ground.json
+++ b/maps/override_ground.json
@@ -1,15 +1,9 @@
{
"override_map": true,
- "map_name": "Unknown",
- "survivor_types": [
- "/datum/equipment_preset/survivor/civilian",
- "/datum/equipment_preset/survivor/goon"
- ],
+ "map_name": "Area of Operation",
"map_item_type": "/obj/item/map/big_red_map",
- "announce_text": "We've lost contact with a Weyland-Yutani's research facility. The ###SHIPNAME### has been dispatched to assist.",
- "monkey_types": [
- "neaera"
- ],
+ "announce_text": "Now in orbit above Area of Operation.",
+ "camouflage": "jungle",
"traits": [{ "Ground": true }],
"gamemodes": [
"Distress Signal",
diff --git a/maps/prison_station_fop.json b/maps/prison_station_fop.json
index b29f7255c2..907129fedb 100644
--- a/maps/prison_station_fop.json
+++ b/maps/prison_station_fop.json
@@ -32,7 +32,7 @@
"xeno_hive_bravo": 0,
"xeno_hive_charlie": 0
},
- "camouflage": "classic",
+ "camouflage": "jungle",
"gamemodes": [
"Distress Signal",
"Hunter Games",
diff --git a/maps/shuttles/dropship_alamo.dmm b/maps/shuttles/dropship_alamo.dmm
index e135221e7f..03abb88ee2 100644
--- a/maps/shuttles/dropship_alamo.dmm
+++ b/maps/shuttles/dropship_alamo.dmm
@@ -43,6 +43,14 @@
icon_state = "rasputin15"
},
/area/shuttle/drop1/sulaco)
+"cv" = (
+/obj/effect/attach_point/crew_weapon/dropship1{
+ attach_id = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/drop1/sulaco)
"cC" = (
/obj/structure/shuttle/part/dropship1/nose_front_right,
/turf/template_noop,
@@ -84,7 +92,7 @@
/area/shuttle/drop1/sulaco)
"if" = (
/obj/structure/shuttle/part/dropship1/left_outer_wing_connector,
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/drop1/sulaco)
"ig" = (
/turf/closed/shuttle/dropship1{
@@ -161,7 +169,8 @@
/area/shuttle/drop1/sulaco)
"os" = (
/obj/effect/attach_point/fuel/dropship1{
- pixel_x = -32
+ pixel_x = -32;
+ attach_id = 11
},
/turf/closed/shuttle/dropship1/transparent{
icon_state = "33"
@@ -209,7 +218,7 @@
/area/shuttle/drop1/sulaco)
"rl" = (
/obj/structure/shuttle/part/dropship1/lower_right_wall,
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/drop1/sulaco)
"rr" = (
/turf/closed/shuttle/dropship1/transparent{
@@ -222,7 +231,7 @@
/area/shuttle/drop1/sulaco)
"sA" = (
/obj/structure/shuttle/part/dropship1/lower_left_wall,
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/drop1/sulaco)
"tR" = (
/obj/item/device/radio/intercom/alamo{
@@ -249,7 +258,9 @@
/turf/template_noop,
/area/shuttle/drop1/sulaco)
"wr" = (
-/obj/effect/attach_point/crew_weapon/dropship1,
+/obj/effect/attach_point/crew_weapon/dropship1{
+ attach_id = 9
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
@@ -277,7 +288,7 @@
/area/shuttle/drop1/sulaco)
"xM" = (
/obj/structure/shuttle/part/dropship1/bottom_right_wall,
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/drop1/sulaco)
"yQ" = (
/turf/closed/shuttle/dropship1/transparent{
@@ -286,7 +297,7 @@
/area/shuttle/drop1/sulaco)
"yU" = (
/obj/structure/shuttle/part/dropship1/bottom_left_wall,
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/drop1/sulaco)
"zw" = (
/obj/structure/shuttle/part/dropship1/transparent/upper_left_wing,
@@ -312,6 +323,14 @@
icon_state = "38"
},
/area/shuttle/drop1/sulaco)
+"Bq" = (
+/obj/effect/attach_point/crew_weapon/dropship1{
+ attach_id = 7
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/drop1/sulaco)
"BB" = (
/turf/closed/shuttle/dropship1{
icon_state = "63"
@@ -346,14 +365,16 @@
/area/shuttle/drop1/sulaco)
"Da" = (
/obj/effect/attach_point/electronics/dropship1{
- dir = 1
+ dir = 1;
+ attach_id = 5
},
/obj/structure/shuttle/part/dropship1/transparent/inner_left_weapons,
/turf/template_noop,
/area/shuttle/drop1/sulaco)
"De" = (
/obj/effect/attach_point/electronics/dropship1{
- dir = 1
+ dir = 1;
+ attach_id = 6
},
/obj/structure/shuttle/part/dropship1/transparent/inner_right_weapons,
/turf/template_noop,
@@ -370,7 +391,7 @@
/area/shuttle/drop1/sulaco)
"EN" = (
/obj/structure/shuttle/part/dropship1/transparent/engine_left_exhaust,
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/drop1/sulaco)
"FA" = (
/obj/structure/shuttle/part/dropship1/transparent/engine_left_cap,
@@ -420,7 +441,7 @@
/area/shuttle/drop1/sulaco)
"Jm" = (
/obj/structure/shuttle/part/dropship1/transparent/engine_right_exhaust,
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/drop1/sulaco)
"JP" = (
/turf/closed/shuttle/dropship1{
@@ -446,7 +467,7 @@
/area/shuttle/drop1/sulaco)
"Me" = (
/obj/structure/shuttle/part/dropship1/left_inner_wing_connector,
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/drop1/sulaco)
"MP" = (
/turf/closed/shuttle/dropship1{
@@ -527,7 +548,7 @@
/area/shuttle/drop1/sulaco)
"Ta" = (
/obj/structure/shuttle/part/dropship1/right_inner_wing_connector,
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/drop1/sulaco)
"Te" = (
/obj/structure/shuttle/part/dropship1/transparent/right_inner_bottom_wing,
@@ -576,7 +597,9 @@
/turf/template_noop,
/area/shuttle/drop1/sulaco)
"Ua" = (
-/obj/effect/attach_point/fuel/dropship1,
+/obj/effect/attach_point/fuel/dropship1{
+ attach_id = 10
+ },
/turf/closed/shuttle/dropship1/transparent{
icon_state = "28"
},
@@ -603,7 +626,7 @@
/area/shuttle/drop1/sulaco)
"Wg" = (
/obj/structure/shuttle/part/dropship1/right_outer_wing_connector,
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/drop1/sulaco)
"WQ" = (
/turf/closed/shuttle/dropship1{
@@ -773,9 +796,9 @@ BB
OK
OU
il
-wr
+Bq
il
-wr
+cv
il
wr
il
diff --git a/maps/shuttles/dropship_cyclone.dmm b/maps/shuttles/dropship_cyclone.dmm
index 4bf150c179..2a5ac47a67 100644
--- a/maps/shuttles/dropship_cyclone.dmm
+++ b/maps/shuttles/dropship_cyclone.dmm
@@ -1,30 +1,34 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"ag" = (
-/turf/closed/shuttle/cyclone{
- icon_state = "92";
- name = "\improper Cyclon"
+/turf/closed/shuttle/cyclone/transparent{
+ icon_state = "86b"
},
/area/shuttle/cyclone)
"aP" = (
-/obj/structure/shuttle/part/dropship2/left_outer_wing_connector{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "3"
},
/turf/template_noop,
/area/shuttle/cyclone)
"bw" = (
-/turf/closed/shuttle/cyclone/transparent{
- icon_state = "98"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "90"
},
+/obj/effect/attach_point/weapon/cyclone/right_fore,
+/turf/template_noop,
/area/shuttle/cyclone)
"cj" = (
-/obj/structure/shuttle/part/dropship2/nose_front_left{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "95a"
},
/turf/template_noop,
/area/shuttle/cyclone)
"cm" = (
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 8
+ },
/turf/open/shuttle/dropship{
- icon_state = "rasputin14"
+ icon_state = "rasputin15"
},
/area/shuttle/cyclone)
"cy" = (
@@ -36,15 +40,6 @@
icon_state = "rasputin3"
},
/area/shuttle/cyclone)
-"cJ" = (
-/obj/structure/shuttle/part/dropship2/transparent/outer_left_weapons{
- name = "\improper Cyclone"
- },
-/obj/effect/attach_point/weapon/midway/right_fore{
- ship_tag = "dropship_cyclone"
- },
-/turf/template_noop,
-/area/shuttle/cyclone)
"cR" = (
/turf/closed/shuttle/cyclone/transparent{
icon_state = "39"
@@ -56,26 +51,23 @@
},
/area/shuttle/cyclone)
"eu" = (
-/obj/structure/machinery/light{
- dir = 8;
- pixel_x = -14
- },
/obj/structure/bed/chair/dropship/passenger{
dir = 4
},
+/obj/structure/machinery/light/double{
+ dir = 8
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
/area/shuttle/cyclone)
"eT" = (
-/obj/structure/shuttle/part/dropship2/transparent/left_outer_bottom_wing{
- name = "\improper Cyclone"
- },
+/obj/structure/shuttle/part/cyclone/transparent,
/turf/template_noop,
/area/shuttle/cyclone)
"fo" = (
-/obj/structure/shuttle/part/dropship2/transparent/engine_left_cap{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "40"
},
/turf/template_noop,
/area/shuttle/cyclone)
@@ -85,83 +77,88 @@
},
/area/shuttle/cyclone)
"fy" = (
-/obj/docking_port/mobile/marine_dropship/cyclone,
-/obj/effect/attach_point/crew_weapon/midway{
- ship_tag = "dropship_cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "91"
+ },
+/obj/effect/attach_point/electronics/cyclone,
+/turf/template_noop,
+/area/shuttle/cyclone)
+"fV" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "S";
+ pixel_y = 2
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = -1
},
/turf/open/shuttle/dropship{
icon_state = "rasputin14"
},
/area/shuttle/cyclone)
"gn" = (
-/obj/structure/machinery/camera/autoname/almayer/dropship_two{
- pixel_x = 8;
- pixel_y = -16;
- network = list("Golden Arrow","Cyclone")
- },
+/obj/docking_port/mobile/marine_dropship/cyclone,
/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+ icon_state = "floor8"
},
/area/shuttle/cyclone)
"ha" = (
+/obj/effect/attach_point/fuel/cyclone,
/turf/closed/shuttle/cyclone/transparent{
icon_state = "32"
},
/area/shuttle/cyclone)
"hd" = (
-/obj/effect/attach_point/fuel/dropship2{
- pixel_x = -32;
- ship_tag = "dropship_cyclone"
- },
/turf/closed/shuttle/cyclone/transparent{
icon_state = "33"
},
/area/shuttle/cyclone)
"hu" = (
-/obj/structure/shuttle/part/dropship2/transparent/right_outer_bottom_wing{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "6"
},
/turf/template_noop,
/area/shuttle/cyclone)
"hS" = (
-/obj/structure/shuttle/part/dropship2/transparent/engine_right_cap{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "41"
},
/turf/template_noop,
/area/shuttle/cyclone)
"hV" = (
-/obj/structure/shuttle/part/dropship2/transparent/engine_right_exhaust{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "21"
},
/turf/template_noop,
/area/shuttle/cyclone)
"ia" = (
-/obj/structure/bed/chair/dropship/pilot{
- dir = 1
+/obj/structure/stairs/perspective{
+ dir = 1;
+ icon_state = "p_stair_full";
+ pixel_y = 22
+ },
+/obj/structure/machinery/computer/dropship_weapons/cyclone/small{
+ pixel_y = 8;
+ pixel_x = 8
+ },
+/obj/structure/bed/chair/vehicle/dropship_cockpit/copilot{
+ dir = 1;
+ pixel_x = 8;
+ layer = 5
},
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
/area/shuttle/cyclone)
"iO" = (
-/obj/structure/shuttle/part/dropship2/right_inner_wing_connector{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "8"
},
/turf/template_noop,
/area/shuttle/cyclone)
-"jr" = (
-/obj/effect/attach_point/crew_weapon/midway{
- ship_tag = "dropship_cyclone";
- dir = 8
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
- },
-/area/shuttle/cyclone)
"lc" = (
-/obj/structure/machinery/light{
- dir = 4;
- pixel_x = 14
+/obj/structure/machinery/light/double{
+ dir = 4
},
/turf/open/shuttle/dropship{
icon_state = "rasputin3"
@@ -176,6 +173,10 @@
/obj/structure/bed/chair/dropship/passenger{
dir = 8
},
+/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
+ pixel_y = 26;
+ pixel_x = -10
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
@@ -186,8 +187,8 @@
},
/area/shuttle/cyclone)
"mO" = (
-/obj/structure/shuttle/part/dropship2/transparent/upper_left_wing{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "71"
},
/turf/template_noop,
/area/shuttle/cyclone)
@@ -208,14 +209,13 @@
},
/area/shuttle/cyclone)
"oX" = (
-/obj/structure/machinery/camera/autoname/golden_arrow/midway{
- dir = 8;
- pixel_x = 23;
- network = list("Golden Arrow","Cyclone")
- },
/obj/structure/bed/chair/dropship/passenger{
dir = 8
},
+/obj/structure/machinery/camera/autoname/golden_arrow/cyclone{
+ dir = 8;
+ pixel_x = 23
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
@@ -226,21 +226,23 @@
},
/area/shuttle/cyclone)
"pj" = (
-/turf/closed/shuttle/cyclone/transparent{
- icon_state = "96";
- name = "\improper Cyclon"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "9"
+ },
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "41"
},
+/turf/template_noop,
/area/shuttle/cyclone)
"pz" = (
-/obj/structure/shuttle/part/dropship2/transparent/middle_left_wing{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "66"
},
/turf/template_noop,
/area/shuttle/cyclone)
"qj" = (
-/obj/structure/machinery/light{
- dir = 8;
- pixel_x = -14
+/obj/structure/machinery/light/double{
+ dir = 8
},
/turf/open/shuttle/dropship{
icon_state = "rasputin3"
@@ -261,18 +263,9 @@
icon_state = "48"
},
/area/shuttle/cyclone)
-"rk" = (
-/obj/effect/attach_point/crew_weapon/midway{
- ship_tag = "dropship_cyclone";
- dir = 4
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
- },
-/area/shuttle/cyclone)
"ro" = (
-/obj/structure/shuttle/part/dropship2/nose_front_right{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "99a"
},
/turf/template_noop,
/area/shuttle/cyclone)
@@ -311,7 +304,7 @@
/area/shuttle/cyclone)
"vt" = (
/turf/closed/shuttle/cyclone/transparent{
- icon_state = "86"
+ icon_state = "86a"
},
/area/shuttle/cyclone)
"vH" = (
@@ -320,8 +313,8 @@
},
/area/shuttle/cyclone)
"vT" = (
-/obj/structure/shuttle/part/dropship2/transparent/right_inner_bottom_wing{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "5"
},
/turf/template_noop,
/area/shuttle/cyclone)
@@ -334,14 +327,15 @@
},
/area/shuttle/cyclone)
"xY" = (
-/obj/structure/shuttle/part/dropship2/lower_left_wall{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "85"
},
+/obj/effect/attach_point/weapon/cyclone/left_fore,
/turf/template_noop,
/area/shuttle/cyclone)
"yA" = (
-/obj/structure/shuttle/part/dropship2/transparent/nose_center{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "101"
},
/turf/template_noop,
/area/shuttle/cyclone)
@@ -370,35 +364,36 @@
},
/area/shuttle/cyclone)
"zL" = (
-/obj/structure/shuttle/part/dropship2/transparent/nose_top_right{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "102"
},
/turf/template_noop,
/area/shuttle/cyclone)
"Ak" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = -1
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "S";
+ pixel_y = 2
+ },
/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ds2{
id = "aft_door";
name = "\improper Cyclone cargo door"
},
/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+ icon_state = "rasputin14"
},
/area/shuttle/cyclone)
-"At" = (
+"Ax" = (
/obj/structure/shuttle/part/dropship2/lower_right_wall{
name = "\improper Cyclone"
},
-/turf/template_noop,
-/area/shuttle/cyclone)
-"Ax" = (
-/obj/structure/blocker/invisible_wall,
-/obj/structure/machinery/computer/cameras/dropship/two{
- name = "\improper 'Cyclone' camera controls";
- network = list("Cyclone","Laser Targets")
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "40"
},
+/turf/template_noop,
/area/shuttle/cyclone)
"AP" = (
/turf/closed/shuttle/cyclone{
@@ -407,81 +402,76 @@
/area/shuttle/cyclone)
"Bt" = (
/turf/closed/shuttle/cyclone/transparent{
- icon_state = "89"
+ icon_state = "89a"
},
/area/shuttle/cyclone)
"BU" = (
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 4
+ },
/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
- pixel_x = 30
+ pixel_y = 26;
+ pixel_x = 10
+ },
+/obj/structure/extinguisher_cabinet/lifeboat{
+ pixel_y = 27;
+ pixel_x = -2
},
/turf/open/shuttle/dropship{
- icon_state = "rasputin3"
+ icon_state = "rasputin15"
},
/area/shuttle/cyclone)
"Cb" = (
-/obj/structure/shuttle/part/dropship2/transparent/upper_right_wing{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "74"
},
/turf/template_noop,
/area/shuttle/cyclone)
"Cf" = (
-/obj/structure/shuttle/part/dropship2/left_inner_wing_connector{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "7"
},
/turf/template_noop,
/area/shuttle/cyclone)
"Da" = (
-/obj/structure/shuttle/part/dropship2/transparent/engine_left_exhaust{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "20"
},
/turf/template_noop,
/area/shuttle/cyclone)
"Df" = (
-/obj/structure/shuttle/part/dropship2/right_outer_wing_connector{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "4"
},
/turf/template_noop,
/area/shuttle/cyclone)
"Dl" = (
-/obj/structure/machinery/camera/autoname/golden_arrow/midway{
+/obj/structure/machinery/camera/autoname/golden_arrow/cyclone{
dir = 4;
- pixel_x = -23;
- network = list("Golden Arrow","Cyclone")
+ pixel_x = -23
},
/turf/open/shuttle/dropship{
icon_state = "rasputin3"
},
/area/shuttle/cyclone)
-"Ey" = (
-/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds2/cyclone{
- dir = 1;
- id = "starboard_door"
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
- },
-/area/shuttle/cyclone)
"EP" = (
/turf/closed/shuttle/cyclone{
icon_state = "75"
},
/area/shuttle/cyclone)
"Fz" = (
-/obj/effect/attach_point/fuel/dropship2{
- ship_tag = "dropship_cyclone"
- },
+/obj/effect/attach_point/fuel/cyclone,
/turf/closed/shuttle/cyclone/transparent{
icon_state = "28"
},
/area/shuttle/cyclone)
"FD" = (
-/obj/structure/machinery/light{
- dir = 4;
- pixel_x = 14
- },
/obj/structure/bed/chair/dropship/passenger{
dir = 8
},
+/obj/structure/machinery/light/double{
+ dir = 4
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
@@ -514,40 +504,28 @@
},
/area/shuttle/cyclone)
"IP" = (
-/obj/effect/attach_point/weapon/dropship2/left_wing,
-/obj/structure/shuttle/part/dropship2/transparent/lower_left_wing{
- name = "\improper Cyclone"
- },
-/obj/effect/attach_point/weapon/midway/left_wing{
- ship_tag = "dropship_cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "61"
},
+/obj/effect/attach_point/weapon/cyclone/left_wing,
/turf/template_noop,
/area/shuttle/cyclone)
"IZ" = (
-/obj/structure/shuttle/part/dropship2/transparent/middle_right_wing{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "70"
},
/turf/template_noop,
/area/shuttle/cyclone)
-"JZ" = (
-/obj/structure/machinery/door_control{
- id = "dropship_midway";
- name = "Dropship Lockdown";
- normaldoorcontrol = 3;
- pixel_y = -19;
- req_one_access_txt = "3;22"
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin14"
- },
-/area/shuttle/cyclone)
"Kv" = (
/turf/closed/shuttle/cyclone{
icon_state = "81"
},
/area/shuttle/cyclone)
"KQ" = (
-/obj/structure/bed/chair/dropship/passenger,
+/obj/structure/bed/chair/dropship/passenger/folded{
+ pixel_y = 8;
+ buckling_y = 8
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
@@ -557,32 +535,12 @@
icon_state = "rasputin8"
},
/area/shuttle/cyclone)
-"MD" = (
-/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
- pixel_x = -30
- },
-/obj/structure/bed/chair/dropship/passenger{
- dir = 4
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
- },
-/area/shuttle/cyclone)
"MU" = (
-/obj/structure/machinery/computer/dropship_weapons/dropship2{
- name = "\improper 'Cyclone' weapons controls"
- },
-/obj/structure/phone_base/rotary{
- name = "Cyclone Telephone";
- phone_category = "Dropship";
- phone_id = "Cyclone";
- pixel_x = 11;
- pixel_y = 16
- },
-/obj/structure/blocker/invisible_wall,
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "84"
},
+/obj/effect/attach_point/electronics/cyclone,
+/turf/template_noop,
/area/shuttle/cyclone)
"Ob" = (
/turf/open/shuttle/dropship{
@@ -590,34 +548,38 @@
},
/area/shuttle/cyclone)
"Pg" = (
-/obj/structure/blocker/invisible_wall,
-/obj/structure/machinery/computer/shuttle/dropship/flight,
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+/obj/structure/machinery/computer/shuttle/dropship/flight/small{
+ pixel_y = 16;
+ pixel_x = 6
},
-/area/shuttle/cyclone)
-"QA" = (
-/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds2/cyclone{
- dir = 2;
- id = "port_door"
+/obj/structure/phone_base{
+ dir = 4;
+ pixel_x = -19;
+ pixel_y = 12;
+ layer = 3.1;
+ phone_category = "Dropship";
+ name = "Cyclone telephone receiver";
+ phone_id = "Cyclone"
+ },
+/obj/structure/bed/chair/vehicle/dropship_cockpit/pilot{
+ dir = 1;
+ pixel_x = 6;
+ pixel_y = 8
},
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
/area/shuttle/cyclone)
"QN" = (
-/obj/effect/attach_point/weapon/dropship2/right_wing,
-/obj/structure/shuttle/part/dropship2/transparent/lower_right_wing{
- name = "\improper Cyclone"
- },
-/obj/effect/attach_point/weapon/midway/right_wing{
- ship_tag = "dropship_cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "65"
},
+/obj/effect/attach_point/weapon/cyclone/right_wing,
/turf/template_noop,
/area/shuttle/cyclone)
"RR" = (
-/obj/structure/shuttle/part/dropship2/transparent/nose_top_left{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "100"
},
/turf/template_noop,
/area/shuttle/cyclone)
@@ -663,12 +625,12 @@
/area/shuttle/cyclone)
"XU" = (
/turf/closed/shuttle/cyclone/transparent{
- icon_state = "97"
+ icon_state = "97a"
},
/area/shuttle/cyclone)
"XY" = (
-/turf/closed/shuttle/cyclone{
- icon_state = "94"
+/turf/closed/shuttle/cyclone/transparent{
+ icon_state = "89b"
},
/area/shuttle/cyclone)
"YL" = (
@@ -676,17 +638,9 @@
icon_state = "36"
},
/area/shuttle/cyclone)
-"Zd" = (
-/obj/structure/shuttle/part/dropship2/transparent/outer_right_weapons,
-/obj/effect/attach_point/weapon/midway/left_fore{
- ship_tag = "dropship_cyclone";
- name = "\improper Cyclone"
- },
-/turf/template_noop,
-/area/shuttle/cyclone)
"ZG" = (
-/obj/structure/shuttle/part/dropship2/transparent/left_outer_inner_wing{
- name = "\improper Cyclone"
+/obj/structure/shuttle/part/cyclone/transparent{
+ icon_state = "2"
},
/turf/template_noop,
/area/shuttle/cyclone)
@@ -706,8 +660,6 @@ mO
pz
IP
wk
-wk
-wk
fo
vH
Fz
@@ -720,15 +672,13 @@ eT
wk
wk
wk
-cJ
+MU
EP
uH
mI
pb
-Ty
-QA
-xY
-hS
+dN
+pj
wA
rB
od
@@ -737,18 +687,16 @@ wk
ZG
"}
(3,1,1) = {"
-RR
-cj
-ag
-vt
+wk
+wk
+wk
+xY
Sl
+BU
sR
-MD
eu
-jr
-JZ
+sR
qs
-dN
YL
fr
tU
@@ -757,18 +705,16 @@ Cf
aP
"}
(4,1,1) = {"
-yA
-pj
-Ax
-gn
+RR
+cj
+ag
+vt
ZU
nj
Sk
Sk
Vu
-cm
cy
-nj
Sk
Dl
qj
@@ -785,50 +731,44 @@ Iz
FV
KQ
KQ
-FV
-fy
+gn
nH
-FV
-Ty
Ty
Ty
Ty
+fV
wk
wk
"}
(6,1,1) = {"
-yA
-bw
-MU
-Ty
+zL
+ro
+XY
+Bt
zz
Ob
Sk
Sk
KU
-cm
yP
-Ob
-BU
+Sk
Sk
lc
-Ty
+fV
wk
wk
"}
(7,1,1) = {"
-zL
-ro
-XY
-Bt
+wk
+wk
+wk
+bw
Kv
ml
oX
FD
-rk
-JZ
+cm
qX
-GE
sA
zG
qN
@@ -840,15 +780,13 @@ Df
wk
wk
wk
-Zd
+fy
AP
sa
Hg
Uo
-Ty
-Ey
-At
-fo
+GE
+Ax
zH
ha
Wr
@@ -866,8 +804,6 @@ Cb
IZ
QN
wk
-wk
-wk
hS
cR
hd
diff --git a/maps/shuttles/dropship_midway.dmm b/maps/shuttles/dropship_midway.dmm
index f9f194dc43..a1e0627e88 100644
--- a/maps/shuttles/dropship_midway.dmm
+++ b/maps/shuttles/dropship_midway.dmm
@@ -5,8 +5,8 @@
},
/area/shuttle/midway)
"bm" = (
-/obj/structure/shuttle/part/dropship1/transparent/engine_right_exhaust{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "21"
},
/turf/template_noop,
/area/shuttle/midway)
@@ -16,22 +16,21 @@
},
/area/shuttle/midway)
"dr" = (
-/obj/structure/machinery/door_control{
- id = "dropship_midway";
- name = "Dropship Lockdown";
- normaldoorcontrol = 3;
- pixel_y = -19;
- req_one_access_txt = "3;22"
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 4
+ },
+/obj/structure/machinery/light/double{
+ dir = 8
},
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
/area/shuttle/midway)
"dB" = (
-/obj/structure/shuttle/part/dropship1/left_inner_wing_connector{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "7"
},
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/midway)
"dD" = (
/turf/closed/shuttle/midway/transparent{
@@ -40,32 +39,27 @@
/area/shuttle/midway)
"dE" = (
/turf/closed/shuttle/midway{
- icon_state = "42"
+ icon_state = "36"
},
/area/shuttle/midway)
"eu" = (
-/obj/structure/shuttle/part/dropship1/transparent/left_outer_bottom_wing{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "2"
},
/turf/template_noop,
/area/shuttle/midway)
"go" = (
-/obj/structure/phone_base/rotary{
- name = "Midway Telephone";
- phone_category = "Dropship";
- phone_id = "Midway";
- pixel_x = 11;
- pixel_y = 16
- },
-/obj/structure/blocker/invisible_wall,
-/obj/structure/machinery/computer/dropship_weapons/midway,
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "102"
},
+/turf/template_noop,
/area/shuttle/midway)
"gw" = (
-/obj/structure/shuttle/part/dropship2/transparent/engine_right_cap{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "46"
+ },
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "41"
},
/turf/template_noop,
/area/shuttle/midway)
@@ -75,18 +69,17 @@
},
/area/shuttle/midway)
"hL" = (
-/obj/structure/machinery/light{
- dir = 8;
- pixel_x = -14
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin2"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "95a"
},
+/turf/template_noop,
/area/shuttle/midway)
"hO" = (
-/turf/closed/shuttle/midway/transparent{
- icon_state = "86"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "65"
},
+/obj/effect/attach_point/weapon/midway/right_wing,
+/turf/template_noop,
/area/shuttle/midway)
"if" = (
/turf/closed/shuttle/midway/transparent{
@@ -94,14 +87,13 @@
},
/area/shuttle/midway)
"im" = (
-/obj/structure/shuttle/part/dropship1/transparent/nose_top_left{
- name = "\improper Midway"
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin4"
},
-/turf/template_noop,
/area/shuttle/midway)
"iv" = (
-/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
- pixel_x = -30
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 8
},
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
@@ -117,10 +109,16 @@
},
/area/shuttle/midway)
"jy" = (
-/obj/effect/attach_point/crew_weapon/midway,
-/obj/structure/machinery/light{
- dir = 8;
- pixel_x = -14
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 4
+ },
+/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
+ pixel_y = 26;
+ pixel_x = 10
+ },
+/obj/structure/extinguisher_cabinet/lifeboat{
+ pixel_y = 27;
+ pixel_x = -2
},
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
@@ -135,12 +133,9 @@
/obj/structure/platform{
dir = 1
},
-/obj/effect/decal/warning_stripes{
- icon_state = "N";
- pixel_y = 1
- },
+/obj/structure/blocker/forcefield/multitile_vehicles,
/turf/open/shuttle/dropship{
- icon_state = "floor8"
+ icon_state = "rasputin15"
},
/area/shuttle/midway)
"ls" = (
@@ -154,20 +149,18 @@
},
/area/shuttle/midway)
"mh" = (
-/obj/structure/shuttle/part/dropship1/right_inner_wing_connector{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "8"
},
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/midway)
"mE" = (
-/obj/structure/shuttle/part/dropship1/transparent/left_inner_bottom_wing{
- name = "\improper Midway"
- },
+/obj/structure/shuttle/part/midway/transparent,
/turf/template_noop,
/area/shuttle/midway)
"mG" = (
-/obj/structure/shuttle/part/dropship1/transparent/upper_left_wing{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "41"
},
/turf/template_noop,
/area/shuttle/midway)
@@ -175,39 +168,26 @@
/obj/structure/platform_decoration{
dir = 4
},
-/obj/effect/decal/warning_stripes{
- icon_state = "N";
- pixel_y = 1
+/obj/structure/platform_decoration{
+ dir = 8
},
/turf/open/shuttle/dropship{
- icon_state = "rasputin7"
+ icon_state = "rasputin3"
},
/area/shuttle/midway)
"mR" = (
-/obj/structure/shuttle/part/dropship1/nose_front_left{
- name = "\improper Midway"
+/obj/structure/bed/chair/dropship/passenger/folded{
+ pixel_y = 8;
+ buckling_y = 8
},
-/turf/template_noop,
-/area/shuttle/midway)
-"nH" = (
-/obj/structure/shuttle/part/dropship1/transparent/nose_center{
- name = "\improper Midway"
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
},
-/turf/template_noop,
/area/shuttle/midway)
"od" = (
-/obj/structure/shuttle/part/dropship1/transparent/middle_left_wing{
- name = "\improper Midway"
+/turf/closed/shuttle/midway/transparent{
+ icon_state = "89b"
},
-/turf/template_noop,
-/area/shuttle/midway)
-"ok" = (
-/obj/structure/shuttle/part/dropship1/transparent/nose_center{
- name = "\improper Midway";
- icon_state = "105"
- },
-/obj/effect/attach_point/electronics/midway,
-/turf/template_noop,
/area/shuttle/midway)
"ro" = (
/turf/closed/shuttle/midway/transparent{
@@ -224,12 +204,6 @@
icon_state = "103"
},
/area/shuttle/midway)
-"rF" = (
-/obj/structure/shuttle/part/dropship1/lower_right_wall{
- name = "\improper Midway"
- },
-/turf/template_noop,
-/area/shuttle/midway)
"rR" = (
/turf/closed/shuttle/midway/transparent{
icon_state = "32"
@@ -241,62 +215,45 @@
},
/area/shuttle/midway)
"tf" = (
-/obj/structure/bed/chair/dropship/pilot{
- dir = 1
+/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
+ pixel_y = 26;
+ pixel_x = -10
},
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+/turf/closed/shuttle/midway/transparent{
+ icon_state = "97a"
},
/area/shuttle/midway)
"ti" = (
-/obj/structure/extinguisher_cabinet/lifeboat{
- pixel_x = 12
- },
/turf/closed/shuttle/midway/transparent{
- icon_state = "78"
- },
-/area/shuttle/midway)
-"tG" = (
-/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
- pixel_x = 30
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin3"
+ icon_state = "86b"
},
/area/shuttle/midway)
"tP" = (
-/obj/structure/shuttle/part/dropship1/transparent/right_outer_bottom_wing{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "6"
},
/turf/template_noop,
/area/shuttle/midway)
"ul" = (
-/obj/structure/shuttle/part/dropship2/transparent/engine_left_cap{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "40"
},
/turf/template_noop,
/area/shuttle/midway)
"ux" = (
-/obj/structure/bed/chair/vehicle{
- pixel_x = -8
- },
-/obj/structure/bed/chair/vehicle{
- pixel_x = 8
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin14"
+/turf/closed/shuttle/midway/transparent{
+ icon_state = "89a"
},
/area/shuttle/midway)
"vJ" = (
-/turf/closed/shuttle/midway{
- icon_state = "92"
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin8"
},
/area/shuttle/midway)
"vN" = (
-/obj/structure/shuttle/part/dropship1/transparent/middle_right_wing{
- name = "\improper Midway"
+/turf/closed/shuttle/midway/transparent{
+ icon_state = "86a"
},
-/turf/template_noop,
/area/shuttle/midway)
"wB" = (
/turf/closed/shuttle/midway{
@@ -309,10 +266,12 @@
},
/area/shuttle/midway)
"xy" = (
-/obj/effect/attach_point/crew_weapon/midway,
-/obj/structure/machinery/light{
- dir = 4;
- pixel_x = 14
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 8
+ },
+/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
+ pixel_y = 26;
+ pixel_x = -10
},
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
@@ -329,15 +288,17 @@
},
/area/shuttle/midway)
"yN" = (
-/obj/structure/shuttle/part/dropship1/right_outer_wing_connector{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "4"
},
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/midway)
"yO" = (
-/turf/closed/shuttle/midway{
- icon_state = "94"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "61"
},
+/obj/effect/attach_point/weapon/midway/left_wing,
+/turf/template_noop,
/area/shuttle/midway)
"zm" = (
/turf/closed/shuttle/midway/transparent{
@@ -345,9 +306,11 @@
},
/area/shuttle/midway)
"Aw" = (
-/turf/closed/shuttle/midway/transparent{
- icon_state = "97"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "91"
},
+/obj/effect/attach_point/electronics/midway,
+/turf/template_noop,
/area/shuttle/midway)
"Bn" = (
/turf/closed/shuttle/midway{
@@ -365,36 +328,32 @@
},
/area/shuttle/midway)
"BU" = (
-/obj/structure/shuttle/part/dropship1/transparent/engine_left_exhaust{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "20"
},
/turf/template_noop,
/area/shuttle/midway)
"Cc" = (
-/obj/structure/machinery/camera/autoname/golden_arrow/midway{
- dir = 8;
- pixel_x = 23
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 4
},
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
/area/shuttle/midway)
"Cm" = (
-/obj/effect/attach_point/fuel/midway,
+/obj/effect/attach_point/fuel/midway{
+ attach_id = 10
+ },
/turf/closed/shuttle/midway/transparent{
icon_state = "28"
},
/area/shuttle/midway)
"Cr" = (
-/obj/structure/prop/ice_colony/hula_girl{
- pixel_x = -10;
- pixel_y = 16
- },
-/obj/structure/blocker/invisible_wall,
-/obj/structure/machinery/computer/cameras/dropship/midway,
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "100"
},
+/turf/template_noop,
/area/shuttle/midway)
"Db" = (
/turf/closed/shuttle/midway/transparent{
@@ -402,7 +361,10 @@
},
/area/shuttle/midway)
"Dg" = (
-/turf/open/shuttle/dropship,
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "70"
+ },
+/turf/template_noop,
/area/shuttle/midway)
"Ds" = (
/obj/structure/stairs/perspective,
@@ -410,13 +372,24 @@
dir = 4;
layer = 2.7
},
+/obj/structure/platform{
+ dir = 8
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin3"
},
/area/shuttle/midway)
"DH" = (
-/turf/closed/shuttle/midway/transparent{
- icon_state = "89"
+/obj/effect/decal/warning_stripes{
+ icon_state = "S";
+ pixel_y = 2
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = -1
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin14"
},
/area/shuttle/midway)
"Ed" = (
@@ -425,30 +398,39 @@
},
/area/shuttle/midway)
"EN" = (
-/obj/structure/shuttle/part/dropship1/nose_front_right{
- name = "\improper Midway"
+/obj/structure/bed/chair/vehicle/dropship_cockpit/pilot{
+ dir = 1;
+ pixel_x = 6;
+ pixel_y = 8
+ },
+/obj/structure/machinery/computer/shuttle/dropship/flight/small{
+ pixel_y = 16;
+ pixel_x = 6
+ },
+/obj/structure/phone_base{
+ dir = 4;
+ pixel_x = -19;
+ pixel_y = 12;
+ layer = 3.1;
+ phone_category = "Dropship";
+ name = "Midway telephone receiver";
+ phone_id = "Midway"
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
},
-/turf/template_noop,
/area/shuttle/midway)
"Fu" = (
-/obj/structure/shuttle/part/dropship1/transparent/lower_right_wing{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "74"
},
-/obj/effect/attach_point/weapon/midway/right_wing,
/turf/template_noop,
/area/shuttle/midway)
"Gf" = (
-/obj/structure/machinery/camera/autoname/golden_arrow/midway{
- pixel_x = -6;
- pixel_y = -16
- },
-/obj/structure/machinery/light{
- dir = 4;
- pixel_x = 14
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin2"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "99a"
},
+/turf/template_noop,
/area/shuttle/midway)
"Gh" = (
/turf/open/shuttle/dropship{
@@ -456,11 +438,23 @@
},
/area/shuttle/midway)
"Go" = (
-/obj/structure/shuttle/part/dropship1/transparent/outer_left_weapons{
- name = "\improper Midway"
+/obj/structure/stairs/perspective{
+ dir = 1;
+ icon_state = "p_stair_full";
+ pixel_y = 22
+ },
+/obj/structure/machinery/computer/dropship_weapons/midway/small{
+ pixel_y = 8;
+ pixel_x = 8
+ },
+/obj/structure/bed/chair/vehicle/dropship_cockpit/copilot{
+ dir = 1;
+ pixel_x = 8;
+ layer = 5
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
},
-/obj/effect/attach_point/weapon/midway/left_fore,
-/turf/template_noop,
/area/shuttle/midway)
"Hj" = (
/turf/closed/shuttle/midway{
@@ -468,22 +462,31 @@
},
/area/shuttle/midway)
"Hz" = (
-/obj/structure/shuttle/part/dropship1/left_outer_wing_connector{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "3"
},
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/midway)
"HY" = (
-/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ds1{
- id = "aft_door";
- name = "\improper Midway cargo door"
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = -1
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "S";
+ pixel_y = 2
+ },
+/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ds4{
+ id = "aft_door"
},
/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+ icon_state = "rasputin14"
},
/area/shuttle/midway)
"Id" = (
-/obj/effect/attach_point/crew_weapon/midway,
+/obj/effect/attach_point/crew_weapon/midway{
+ attach_id = 7
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
@@ -498,20 +501,10 @@
icon_state = "72"
},
/area/shuttle/midway)
-"Kp" = (
-/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds1/midway{
- dir = 1;
- id = "starboard_door"
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
- },
-/area/shuttle/midway)
"Ks" = (
-/obj/structure/shuttle/part/dropship1/transparent/lower_left_wing{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "71"
},
-/obj/effect/attach_point/weapon/midway/left_wing,
/turf/template_noop,
/area/shuttle/midway)
"Kv" = (
@@ -519,29 +512,39 @@
dir = 4;
pixel_x = 14
},
+/obj/structure/machinery/light/double{
+ dir = 4
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin3"
},
/area/shuttle/midway)
"Kw" = (
/turf/template_noop,
-/area/space)
+/area/template_noop)
"Lr" = (
/turf/closed/shuttle/midway{
icon_state = "48"
},
/area/shuttle/midway)
"LY" = (
-/obj/structure/blocker/invisible_wall,
-/obj/structure/machinery/computer/shuttle/dropship/flight,
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "101"
},
+/turf/template_noop,
/area/shuttle/midway)
"LZ" = (
-/obj/structure/shuttle/part/dropship1/transparent/upper_right_wing{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "84"
},
+/obj/effect/attach_point/electronics/midway,
+/turf/template_noop,
+/area/shuttle/midway)
+"Mw" = (
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "85"
+ },
+/obj/effect/attach_point/weapon/midway/left_fore,
/turf/template_noop,
/area/shuttle/midway)
"Mz" = (
@@ -550,6 +553,9 @@
dir = 8;
layer = 2.7
},
+/obj/structure/platform{
+ dir = 4
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin3"
},
@@ -559,88 +565,69 @@
icon_state = "rasputin15"
},
/area/shuttle/midway)
-"OB" = (
-/turf/closed/shuttle/midway/transparent{
- icon_state = "96"
- },
-/area/shuttle/midway)
"Pc" = (
/turf/closed/shuttle/midway/transparent{
- icon_state = "98"
+ icon_state = "78"
},
/area/shuttle/midway)
"PP" = (
-/obj/structure/machinery/door/airlock/hatch/cockpit,
/obj/structure/blocker/forcefield/multitile_vehicles,
+/obj/structure/machinery/door/airlock/hatch/cockpit/four,
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
/area/shuttle/midway)
"Qk" = (
-/obj/docking_port/mobile/marine_dropship/midway,
-/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "15"
},
-/area/shuttle/midway)
-"QI" = (
-/obj/structure/shuttle/part/dropship1/lower_left_wall{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "40"
},
/turf/template_noop,
/area/shuttle/midway)
"QK" = (
-/obj/structure/machinery/light{
- dir = 8;
- pixel_x = -14
+/obj/structure/machinery/light/double{
+ dir = 8
},
/turf/open/shuttle/dropship{
icon_state = "rasputin3"
},
/area/shuttle/midway)
"Rm" = (
-/obj/structure/platform_decoration{
- dir = 8
- },
-/obj/effect/decal/warning_stripes{
- icon_state = "N";
- pixel_y = 1
- },
-/turf/open/shuttle/dropship{
- icon_state = "rasputin6"
- },
-/area/shuttle/midway)
-"SS" = (
-/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds1/midway{
- dir = 2;
- id = "port_door"
+/obj/effect/attach_point/crew_weapon/midway{
+ attach_id = 7
},
+/obj/docking_port/mobile/marine_dropship/midway,
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
/area/shuttle/midway)
"SZ" = (
-/obj/structure/shuttle/part/dropship1/transparent/right_inner_bottom_wing{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "5"
},
/turf/template_noop,
/area/shuttle/midway)
"Tl" = (
-/obj/structure/shuttle/part/dropship1/transparent/nose_top_right{
- name = "\improper Midway"
- },
-/turf/template_noop,
-/area/shuttle/midway)
-"UI" = (
-/obj/structure/bed/chair/vehicle{
- pixel_x = -8
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 8
},
-/obj/structure/bed/chair/vehicle{
- pixel_x = 8
+/obj/structure/machinery/light/double{
+ dir = 4;
+ pixel_y = -5
},
/turf/open/shuttle/dropship{
icon_state = "rasputin15"
},
/area/shuttle/midway)
+"UI" = (
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "90"
+ },
+/obj/effect/attach_point/weapon/midway/right_fore,
+/turf/template_noop,
+/area/shuttle/midway)
"Vu" = (
/turf/closed/shuttle/midway{
icon_state = "67"
@@ -652,21 +639,14 @@
},
/area/shuttle/midway)
"WN" = (
-/obj/structure/bed/chair/vehicle{
- dir = 1;
- pixel_x = -8
- },
-/obj/structure/bed/chair/vehicle{
- dir = 1;
- pixel_x = 8
- },
/turf/open/shuttle/dropship{
- icon_state = "rasputin15"
+ icon_state = "floor8"
},
/area/shuttle/midway)
"XH" = (
/obj/effect/attach_point/fuel/midway{
- pixel_x = -32
+ pixel_x = -32;
+ attach_id = 11
},
/turf/closed/shuttle/midway/transparent{
icon_state = "33"
@@ -678,10 +658,9 @@
},
/area/shuttle/midway)
"Zr" = (
-/obj/structure/shuttle/part/dropship1/transparent/outer_right_weapons{
- name = "\improper Midway"
+/obj/structure/shuttle/part/midway/transparent{
+ icon_state = "66"
},
-/obj/effect/attach_point/weapon/midway/right_fore,
/turf/template_noop,
/area/shuttle/midway)
"Zu" = (
@@ -701,11 +680,9 @@ Kw
Kw
Kw
Kw
-mG
-od
Ks
-Kw
-Kw
+Zr
+yO
Kw
ul
af
@@ -719,14 +696,12 @@ mE
Kw
Kw
Kw
-Go
+LZ
Hj
Jq
Vu
xp
-ME
-SS
-QI
+dE
gw
ls
Zu
@@ -736,19 +711,17 @@ Kw
eu
"}
(3,1,1) = {"
-im
-mR
-vJ
-hO
+Kw
+Kw
+Kw
+Mw
Yr
-UI
-iv
jy
-ME
+Cc
dr
+Cc
BI
dE
-dE
Bn
hl
rr
@@ -756,18 +729,16 @@ dB
Hz
"}
(4,1,1) = {"
-ok
-OB
Cr
hL
ti
-ux
+vN
+Pc
bs
jW
-jW
-jW
+im
Ds
-Rm
+mL
jW
je
QK
@@ -776,59 +747,53 @@ Kw
Kw
"}
(5,1,1) = {"
-nH
-Aw
LY
tf
+EN
+Go
PP
-jW
-Dg
WN
-ME
-Qk
-Id
+mR
+WN
+Rm
kC
ME
+Id
ME
-ME
-ME
+DH
Kw
Kw
"}
(6,1,1) = {"
-ok
-Pc
go
Gf
-ro
+od
ux
+ro
Gh
jW
-jW
-jW
+vJ
Mz
mL
-tG
+jW
jW
Kv
-ME
+DH
Kw
Kw
"}
(7,1,1) = {"
-Tl
-EN
-yO
-DH
-rq
+Kw
+Kw
+Kw
UI
-Cc
+rq
xy
-ME
-dr
+iv
+Tl
+iv
Lr
yB
-yB
sl
Ed
lC
@@ -839,15 +804,13 @@ yN
Kw
Kw
Kw
-Zr
+Aw
wB
VU
ym
Ji
-ME
-Kp
-rF
-ul
+yB
+Qk
BS
rR
Db
@@ -861,13 +824,11 @@ Kw
Kw
Kw
Kw
-LZ
-vN
Fu
+Dg
+hO
Kw
-Kw
-Kw
-gw
+mG
ZZ
XH
if
diff --git a/maps/shuttles/dropship_normandy.dmm b/maps/shuttles/dropship_normandy.dmm
index 6e2fcfc0c8..755d6c6273 100644
--- a/maps/shuttles/dropship_normandy.dmm
+++ b/maps/shuttles/dropship_normandy.dmm
@@ -37,14 +37,17 @@
/turf/template_noop,
/area/shuttle/drop2/sulaco)
"do" = (
-/obj/effect/attach_point/crew_weapon/dropship2,
+/obj/effect/attach_point/crew_weapon/dropship2{
+ attach_id = 9
+ },
/turf/open/shuttle/dropship{
icon_state = "rasputin3"
},
/area/shuttle/drop2/sulaco)
"es" = (
/obj/effect/attach_point/fuel/dropship2{
- pixel_x = -32
+ pixel_x = -32;
+ attach_id = 11
},
/turf/closed/shuttle/dropship2/transparent{
icon_state = "33"
@@ -77,7 +80,7 @@
/area/shuttle/drop2/sulaco)
"fQ" = (
/obj/structure/shuttle/part/dropship2/left_inner_wing_connector,
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/drop2/sulaco)
"gD" = (
/turf/closed/shuttle/dropship2/transparent{
@@ -116,7 +119,7 @@
/area/shuttle/drop2/sulaco)
"iI" = (
/obj/structure/shuttle/part/dropship2/right_inner_wing_connector,
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/drop2/sulaco)
"jc" = (
/obj/item/device/radio/intercom/normandy{
@@ -197,7 +200,7 @@
/area/shuttle/drop2/sulaco)
"nS" = (
/obj/structure/shuttle/part/dropship2/lower_left_wall,
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/drop2/sulaco)
"oc" = (
/obj/structure/shuttle/part/dropship2/transparent/nose_top_right,
@@ -254,7 +257,9 @@
},
/area/shuttle/drop2/sulaco)
"vw" = (
-/obj/effect/attach_point/fuel/dropship2,
+/obj/effect/attach_point/fuel/dropship2{
+ attach_id = 10
+ },
/turf/closed/shuttle/dropship2/transparent{
icon_state = "28"
},
@@ -266,7 +271,8 @@
/area/shuttle/drop2/sulaco)
"xd" = (
/obj/effect/attach_point/electronics/dropship2{
- dir = 1
+ dir = 1;
+ attach_id = 6
},
/obj/structure/shuttle/part/dropship2/transparent/inner_right_weapons,
/turf/template_noop,
@@ -468,6 +474,14 @@
/obj/structure/shuttle/part/dropship2/transparent/nose_center,
/turf/template_noop,
/area/shuttle/drop2/sulaco)
+"Mj" = (
+/obj/effect/attach_point/crew_weapon/dropship2{
+ attach_id = 7
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/shuttle/drop2/sulaco)
"Mx" = (
/obj/structure/shuttle/part/dropship2/transparent/nose_top_left,
/turf/template_noop,
@@ -501,7 +515,7 @@
/area/shuttle/drop2/sulaco)
"NM" = (
/obj/structure/shuttle/part/dropship2/left_outer_wing_connector,
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/drop2/sulaco)
"Ov" = (
/obj/structure/shuttle/part/dropship2/transparent/right_inner_bottom_wing,
@@ -565,7 +579,7 @@
/area/shuttle/drop2/sulaco)
"QK" = (
/obj/structure/shuttle/part/dropship2/lower_right_wall,
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/drop2/sulaco)
"Rr" = (
/turf/template_noop,
@@ -585,7 +599,7 @@
/area/shuttle/drop2/sulaco)
"RJ" = (
/obj/structure/shuttle/part/dropship2/right_outer_wing_connector,
-/turf/open/space/basic,
+/turf/template_noop,
/area/shuttle/drop2/sulaco)
"SB" = (
/obj/structure/shuttle/part/dropship2/nose_front_left,
@@ -671,6 +685,14 @@
/obj/structure/shuttle/part/dropship2/transparent/engine_left_exhaust,
/turf/template_noop,
/area/shuttle/drop2/sulaco)
+"Zn" = (
+/obj/effect/attach_point/crew_weapon/dropship2{
+ attach_id = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/shuttle/drop2/sulaco)
"ZK" = (
/turf/closed/shuttle/dropship2{
icon_state = "63"
@@ -806,9 +828,9 @@ Bb
Iv
rc
vd
-do
+Mj
vd
-do
+Zn
vd
do
PJ
diff --git a/maps/shuttles/dropship_tornado.dmm b/maps/shuttles/dropship_tornado.dmm
new file mode 100644
index 0000000000..240420ff0d
--- /dev/null
+++ b/maps/shuttles/dropship_tornado.dmm
@@ -0,0 +1,906 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ag" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "17"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"av" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "75"
+ },
+/area/shuttle/tornado)
+"aw" = (
+/obj/structure/shuttle/part/tornado{
+ icon_state = "5"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"aG" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "71"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"bf" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "3"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"bm" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "64"
+ },
+/area/shuttle/tornado)
+"bp" = (
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 8
+ },
+/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
+ pixel_y = 26;
+ pixel_x = -10
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"bL" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "66"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"ck" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "35"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"cX" = (
+/obj/structure/stairs/perspective{
+ icon_state = "p_stair_full";
+ can_block_movement = 0
+ },
+/obj/structure/platform{
+ dir = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"db" = (
+/obj/structure/bed/chair/dropship/passenger/folded{
+ pixel_y = 8;
+ buckling_y = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"dm" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "38"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"dW" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "25"
+ },
+/area/shuttle/tornado)
+"eg" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "27"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"eq" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "4"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"et" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "20"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"eU" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "23"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"fj" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = -1
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "S";
+ pixel_y = 2
+ },
+/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ds2{
+ id = "aft_door";
+ name = "\improper Tornado cargo door"
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin14"
+ },
+/area/shuttle/tornado)
+"fr" = (
+/obj/structure/stairs/perspective{
+ dir = 1;
+ icon_state = "p_stair_full";
+ pixel_y = 22
+ },
+/obj/structure/bed/chair/vehicle/dropship_cockpit/copilot{
+ dir = 1;
+ layer = 5;
+ pixel_x = 8
+ },
+/obj/structure/machinery/computer/dropship_weapons/tornado/small{
+ pixel_y = 8;
+ pixel_x = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"gJ" = (
+/obj/structure/shuttle/part/tornado{
+ icon_state = "2"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"hd" = (
+/obj/structure/shuttle/part/tornado/transparent,
+/turf/template_noop,
+/area/shuttle/tornado)
+"hn" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "33"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"hB" = (
+/obj/structure/platform_decoration{
+ dir = 4
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"hE" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "101"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"jP" = (
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin7"
+ },
+/area/shuttle/tornado)
+"kI" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "40";
+ density = 0;
+ layer = 4.2
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"lb" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "77"
+ },
+/area/shuttle/tornado)
+"lM" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "15"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"mb" = (
+/obj/effect/attach_point/crew_weapon/tornado,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"mt" = (
+/obj/docking_port/mobile/marine_dropship/tornado,
+/obj/structure/bed/chair/dropship/passenger/folded{
+ pixel_y = 8;
+ buckling_y = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"ni" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "89a";
+ opacity = 0
+ },
+/area/shuttle/tornado)
+"oB" = (
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 4
+ },
+/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
+ pixel_y = 26;
+ pixel_x = 10
+ },
+/obj/structure/extinguisher_cabinet/lifeboat{
+ pixel_y = 27;
+ pixel_x = -2
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"pv" = (
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin4"
+ },
+/area/shuttle/tornado)
+"qF" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "34"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"rp" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "89b";
+ opacity = 0
+ },
+/area/shuttle/tornado)
+"sx" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "100"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"sM" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "62"
+ },
+/area/shuttle/tornado)
+"uk" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "47"
+ },
+/area/shuttle/tornado)
+"uG" = (
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"uL" = (
+/obj/structure/phone_base{
+ dir = 4;
+ pixel_x = -19;
+ pixel_y = 12;
+ layer = 3.1;
+ phone_category = "Dropship";
+ name = "Tornado telephone receiver";
+ phone_id = "Tornado"
+ },
+/obj/structure/machinery/computer/shuttle/dropship/flight/small{
+ pixel_y = 16;
+ pixel_x = 6
+ },
+/obj/structure/bed/chair/vehicle/dropship_cockpit/pilot{
+ dir = 1;
+ pixel_x = 6;
+ pixel_y = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"vk" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "74"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"vz" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "95a"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"vU" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "16"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"vZ" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "21"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"xj" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "S";
+ pixel_y = 2
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = -1
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin14"
+ },
+/area/shuttle/tornado)
+"xr" = (
+/obj/structure/machinery/light/double{
+ dir = 8;
+ pixel_y = -5
+ },
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 4
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"xW" = (
+/obj/structure/stairs/perspective{
+ icon_state = "p_stair_full";
+ can_block_movement = 0
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/shuttle/tornado)
+"yQ" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "76"
+ },
+/area/shuttle/tornado)
+"yZ" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "72"
+ },
+/area/shuttle/tornado)
+"zp" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "26"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"zQ" = (
+/obj/effect/attach_point/crew_weapon/tornado,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/shuttle/tornado)
+"Bf" = (
+/obj/structure/shuttle/part/tornado{
+ icon_state = "6"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Bx" = (
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin8"
+ },
+/area/shuttle/tornado)
+"BK" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "41";
+ layer = 4.2;
+ density = 0
+ },
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "61"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"DX" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "28"
+ },
+/obj/effect/attach_point/fuel/tornado{
+ layer = 3.1
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"EQ" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "103"
+ },
+/area/shuttle/tornado)
+"Fv" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "48"
+ },
+/area/shuttle/tornado)
+"FD" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "24"
+ },
+/area/shuttle/tornado)
+"FW" = (
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 4
+ },
+/obj/structure/machinery/camera/autoname/golden_arrow/tornado{
+ dir = 4;
+ pixel_x = -24
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"Gl" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "31"
+ },
+/area/shuttle/tornado)
+"HH" = (
+/obj/structure/stairs/perspective{
+ icon_state = "p_stair_full";
+ can_block_movement = 0
+ },
+/obj/structure/platform{
+ dir = 4
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"HN" = (
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 4
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"IN" = (
+/obj/structure/machinery/light/double{
+ dir = 8;
+ pixel_y = -5
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"IZ" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "32"
+ },
+/obj/effect/attach_point/fuel/tornado{
+ layer = 3.1
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Jt" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "9"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"KB" = (
+/obj/structure/machinery/light/double{
+ dir = 4;
+ pixel_y = -5
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"Mq" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "86b";
+ opacity = 0
+ },
+/area/shuttle/tornado)
+"Nd" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "41";
+ layer = 4.2;
+ density = 0
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"NY" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "69"
+ },
+/area/shuttle/tornado)
+"Om" = (
+/turf/template_noop,
+/area/space)
+"Pb" = (
+/obj/structure/platform_decoration{
+ dir = 8
+ },
+/obj/structure/machinery/camera/autoname/golden_arrow/tornado{
+ dir = 8;
+ pixel_x = 24
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"Pi" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "102"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Py" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "28"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Qe" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "32"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Qf" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "70"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Qv" = (
+/obj/structure/machinery/camera/autoname/golden_arrow/tornado{
+ pixel_y = 32
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin6"
+ },
+/area/shuttle/tornado)
+"QR" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "40";
+ density = 0;
+ layer = 4.2
+ },
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "65"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Rk" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "99a"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Sa" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "86a";
+ opacity = 0
+ },
+/area/shuttle/tornado)
+"SX" = (
+/obj/structure/machinery/door/airlock/hatch/cockpit/two,
+/obj/structure/blocker/forcefield/multitile_vehicles,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"Tz" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "73"
+ },
+/area/shuttle/tornado)
+"TF" = (
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"TM" = (
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/shuttle/tornado)
+"TN" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "22"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"UF" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "104"
+ },
+/area/shuttle/tornado)
+"Vb" = (
+/obj/structure/machinery/light/double{
+ dir = 4;
+ pixel_y = -5
+ },
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"Vj" = (
+/turf/open/shuttle/dropship{
+ icon_state = "floor8"
+ },
+/area/shuttle/tornado)
+"Ws" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "97a";
+ opacity = 0
+ },
+/area/shuttle/tornado)
+"Wt" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "18"
+ },
+/area/shuttle/tornado)
+"Wv" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "29"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Xc" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "39"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"XL" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "83"
+ },
+/area/shuttle/tornado)
+"Yg" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "30"
+ },
+/area/shuttle/tornado)
+"Ym" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "19"
+ },
+/area/shuttle/tornado)
+"Zi" = (
+/turf/closed/shuttle/dropship2/tornado{
+ icon_state = "67"
+ },
+/area/shuttle/tornado)
+
+(1,1,1) = {"
+Om
+Om
+Om
+Om
+Om
+Om
+Om
+Om
+kI
+qF
+DX
+TN
+et
+Om
+Om
+Om
+Om
+Om
+"}
+(2,1,1) = {"
+Om
+Om
+Om
+Om
+Om
+aG
+bL
+bL
+BK
+ck
+Wv
+eU
+vZ
+kI
+Py
+TN
+et
+hd
+"}
+(3,1,1) = {"
+Om
+Om
+Om
+kI
+av
+yZ
+Zi
+Zi
+sM
+Wt
+Yg
+FD
+Jt
+Nd
+Wv
+eU
+vZ
+gJ
+"}
+(4,1,1) = {"
+Om
+Om
+Om
+Nd
+yQ
+oB
+xr
+HN
+FW
+HN
+xr
+HN
+uk
+Wt
+Yg
+FD
+EQ
+bf
+"}
+(5,1,1) = {"
+sx
+vz
+Mq
+Sa
+lb
+Qv
+TM
+TM
+TM
+TM
+TM
+pv
+cX
+hB
+IN
+TF
+fj
+Om
+"}
+(6,1,1) = {"
+hE
+Ws
+uL
+fr
+SX
+Vj
+mb
+db
+mt
+db
+mb
+Vj
+xW
+TM
+zQ
+TM
+xj
+Om
+"}
+(7,1,1) = {"
+Pi
+Rk
+rp
+ni
+lb
+jP
+TM
+TM
+TM
+TM
+TM
+Bx
+HH
+Pb
+KB
+TF
+xj
+Om
+"}
+(8,1,1) = {"
+Om
+Om
+Om
+kI
+yQ
+bp
+Vb
+uG
+uG
+uG
+Vb
+uG
+Fv
+Ym
+Gl
+dW
+UF
+eq
+"}
+(9,1,1) = {"
+Om
+Om
+Om
+Nd
+XL
+Tz
+NY
+NY
+bm
+Ym
+Gl
+dW
+lM
+kI
+Qe
+zp
+vU
+aw
+"}
+(10,1,1) = {"
+Om
+Om
+Om
+Om
+Om
+vk
+Qf
+Qf
+QR
+dm
+IZ
+zp
+vU
+Nd
+hn
+eg
+ag
+Bf
+"}
+(11,1,1) = {"
+Om
+Om
+Om
+Om
+Om
+Om
+Om
+Om
+Nd
+Xc
+hn
+eg
+ag
+Om
+Om
+Om
+Om
+Om
+"}
diff --git a/maps/shuttles/dropship_tripoli.dmm b/maps/shuttles/dropship_tripoli.dmm
new file mode 100644
index 0000000000..9caea2f03a
--- /dev/null
+++ b/maps/shuttles/dropship_tripoli.dmm
@@ -0,0 +1,850 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aP" = (
+/obj/structure/phone_base{
+ dir = 4;
+ pixel_x = -19;
+ pixel_y = 12;
+ layer = 3.1;
+ phone_category = "Dropship";
+ name = "Tripoli telephone receiver";
+ phone_id = "Tripoli"
+ },
+/obj/structure/bed/chair/vehicle/dropship_cockpit/pilot{
+ dir = 1;
+ pixel_x = 6;
+ pixel_y = 8
+ },
+/obj/structure/machinery/computer/shuttle/dropship/flight/small{
+ pixel_y = 16;
+ pixel_x = 6
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tripoli)
+"bN" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "22"
+ },
+/area/shuttle/tripoli)
+"ca" = (
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin7"
+ },
+/area/shuttle/tripoli)
+"cD" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "69"
+ },
+/area/shuttle/tripoli)
+"cE" = (
+/obj/structure/stairs/perspective,
+/obj/structure/platform{
+ dir = 4;
+ layer = 2.7
+ },
+/obj/structure/platform{
+ dir = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/shuttle/tripoli)
+"dN" = (
+/turf/closed/shuttle/tripoli/transparent{
+ icon_state = "97a"
+ },
+/area/shuttle/tripoli)
+"ed" = (
+/turf/template_noop,
+/area/space)
+"eD" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "30"
+ },
+/area/shuttle/tripoli)
+"eN" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "73"
+ },
+/area/shuttle/tripoli)
+"fk" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "61"
+ },
+/obj/effect/attach_point/weapon/tripoli/left_wing,
+/turf/template_noop,
+/area/shuttle/tripoli)
+"fq" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "5"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"fZ" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "71"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"hx" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "29"
+ },
+/area/shuttle/tripoli)
+"hS" = (
+/turf/closed/shuttle/tripoli/transparent{
+ icon_state = "89b"
+ },
+/area/shuttle/tripoli)
+"ih" = (
+/obj/structure/shuttle/part/tripoli/transparent{
+ icon_state = "95a"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"iU" = (
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin8"
+ },
+/area/shuttle/tripoli)
+"jC" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "S";
+ pixel_y = 2
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = -1
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin14"
+ },
+/area/shuttle/tripoli)
+"jR" = (
+/obj/structure/machinery/light/double{
+ dir = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/shuttle/tripoli)
+"kS" = (
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/shuttle/tripoli)
+"lj" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "85"
+ },
+/obj/effect/attach_point/weapon/tripoli/left_fore,
+/turf/template_noop,
+/area/shuttle/tripoli)
+"lv" = (
+/turf/closed/shuttle/tripoli/transparent{
+ icon_state = "86a"
+ },
+/area/shuttle/tripoli)
+"ma" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "83"
+ },
+/area/shuttle/tripoli)
+"mm" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "17"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"mr" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "26"
+ },
+/area/shuttle/tripoli)
+"nD" = (
+/obj/structure/shuttle/part/tripoli,
+/turf/template_noop,
+/area/shuttle/tripoli)
+"oF" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "7"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"oU" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "75"
+ },
+/area/shuttle/tripoli)
+"pj" = (
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 4
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tripoli)
+"pm" = (
+/obj/structure/platform_decoration{
+ dir = 4
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = 1
+ },
+/obj/structure/platform_decoration{
+ dir = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/shuttle/tripoli)
+"pw" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "34"
+ },
+/area/shuttle/tripoli)
+"qf" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "21"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"qo" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "74"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"qH" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "104"
+ },
+/area/shuttle/tripoli)
+"qW" = (
+/obj/effect/attach_point/fuel/tripoli,
+/turf/closed/shuttle/tripoli{
+ icon_state = "28"
+ },
+/area/shuttle/tripoli)
+"ri" = (
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin4"
+ },
+/area/shuttle/tripoli)
+"sb" = (
+/obj/structure/shuttle/part/dropship2/transparent/engine_left_cap{
+ name = "\improper Tripoli"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"sc" = (
+/obj/structure/machinery/light/double{
+ dir = 8
+ },
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 4
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tripoli)
+"sD" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "42"
+ },
+/area/shuttle/tripoli)
+"tD" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "24"
+ },
+/area/shuttle/tripoli)
+"vi" = (
+/obj/structure/blocker/forcefield/multitile_vehicles,
+/obj/structure/machinery/door/airlock/hatch/cockpit,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tripoli)
+"vl" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = -1
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "S";
+ pixel_y = 2
+ },
+/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ds1{
+ name = "\improper Tripoli cargo door"
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin14"
+ },
+/area/shuttle/tripoli)
+"vC" = (
+/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
+ pixel_y = 26;
+ pixel_x = 10
+ },
+/obj/structure/extinguisher_cabinet/lifeboat{
+ pixel_y = 27;
+ pixel_x = -2
+ },
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 4
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tripoli)
+"vJ" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "84"
+ },
+/obj/effect/attach_point/electronics/tripoli,
+/turf/template_noop,
+/area/shuttle/tripoli)
+"wi" = (
+/obj/effect/attach_point/crew_weapon/midway,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tripoli)
+"wy" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "65"
+ },
+/obj/effect/attach_point/weapon/tripoli/right_wing,
+/turf/template_noop,
+/area/shuttle/tripoli)
+"wL" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "100"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"wN" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "46"
+ },
+/obj/structure/shuttle/part/dropship2/transparent/engine_right_cap{
+ name = "\improper Tripoli"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"xx" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "6"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"yB" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "4"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"yF" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "101"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"zt" = (
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin6"
+ },
+/area/shuttle/tripoli)
+"zC" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "72"
+ },
+/area/shuttle/tripoli)
+"zS" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "16"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"zX" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "91"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"zZ" = (
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tripoli)
+"Ac" = (
+/turf/closed/shuttle/tripoli/transparent{
+ icon_state = "86b"
+ },
+/area/shuttle/tripoli)
+"AC" = (
+/obj/structure/stairs/perspective,
+/obj/structure/platform{
+ dir = 8;
+ layer = 2.7
+ },
+/obj/structure/platform{
+ dir = 4
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/shuttle/tripoli)
+"Cb" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "8"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"Cf" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "3"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"CR" = (
+/obj/effect/attach_point/fuel/tripoli,
+/turf/closed/shuttle/tripoli{
+ icon_state = "32"
+ },
+/area/shuttle/tripoli)
+"DG" = (
+/turf/closed/shuttle/tripoli/transparent{
+ icon_state = "78"
+ },
+/area/shuttle/tripoli)
+"DW" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "35"
+ },
+/area/shuttle/tripoli)
+"Ev" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "23"
+ },
+/area/shuttle/tripoli)
+"Ew" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "67"
+ },
+/area/shuttle/tripoli)
+"EG" = (
+/obj/structure/machinery/camera/autoname/golden_arrow/tripoli,
+/obj/structure/extinguisher_cabinet/lifeboat,
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 8
+ },
+/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
+ pixel_y = 26;
+ pixel_x = -10
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tripoli)
+"EM" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "103"
+ },
+/area/shuttle/tripoli)
+"Fm" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "70"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"Fq" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "102"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"Go" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "2"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"Gt" = (
+/turf/closed/shuttle/tripoli/transparent{
+ icon_state = "80"
+ },
+/area/shuttle/tripoli)
+"JC" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "31"
+ },
+/area/shuttle/tripoli)
+"JO" = (
+/obj/structure/machinery/light/double{
+ dir = 4
+ },
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tripoli)
+"Kg" = (
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tripoli)
+"Kk" = (
+/obj/structure/stairs/perspective{
+ dir = 1;
+ icon_state = "p_stair_full";
+ pixel_y = 22
+ },
+/obj/structure/machinery/computer/dropship_weapons/tripoli/small{
+ pixel_y = 8;
+ pixel_x = 8
+ },
+/obj/structure/bed/chair/vehicle/dropship_cockpit/copilot{
+ dir = 1;
+ pixel_x = 8;
+ layer = 5
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tripoli)
+"KU" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "20"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"KZ" = (
+/obj/structure/bed/chair/dropship/passenger/folded{
+ pixel_y = 8;
+ buckling_y = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tripoli)
+"Ly" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "25"
+ },
+/area/shuttle/tripoli)
+"MS" = (
+/obj/structure/machinery/camera/autoname/golden_arrow/tripoli{
+ dir = 4
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/shuttle/tripoli)
+"NV" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "38"
+ },
+/area/shuttle/tripoli)
+"Oa" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "62"
+ },
+/area/shuttle/tripoli)
+"OF" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "39"
+ },
+/area/shuttle/tripoli)
+"OI" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "49"
+ },
+/obj/structure/shuttle/part/dropship2/transparent/engine_left_cap{
+ name = "\improper Tripoli"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"OM" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "90"
+ },
+/obj/effect/attach_point/weapon/tripoli/right_fore,
+/turf/template_noop,
+/area/shuttle/tripoli)
+"QS" = (
+/obj/structure/platform_decoration{
+ dir = 8
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = 1
+ },
+/obj/structure/platform_decoration{
+ dir = 4
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/shuttle/tripoli)
+"RD" = (
+/turf/closed/shuttle/tripoli/transparent{
+ icon_state = "89a"
+ },
+/area/shuttle/tripoli)
+"RK" = (
+/obj/effect/attach_point/crew_weapon/tripoli,
+/obj/docking_port/mobile/marine_dropship/tripoli,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tripoli)
+"Sr" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "47"
+ },
+/area/shuttle/tripoli)
+"SW" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "48"
+ },
+/area/shuttle/tripoli)
+"Ur" = (
+/obj/structure/shuttle/part/tripoli{
+ icon_state = "66"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"Us" = (
+/obj/structure/shuttle/part/dropship2/transparent/engine_right_cap{
+ name = "\improper Tripoli"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"UI" = (
+/turf/open/shuttle/dropship{
+ icon_state = "floor8"
+ },
+/area/shuttle/tripoli)
+"VP" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "33"
+ },
+/area/shuttle/tripoli)
+"VR" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "64"
+ },
+/area/shuttle/tripoli)
+"WS" = (
+/obj/structure/shuttle/part/tripoli/transparent{
+ icon_state = "99a"
+ },
+/turf/template_noop,
+/area/shuttle/tripoli)
+"XI" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "27"
+ },
+/area/shuttle/tripoli)
+"Ze" = (
+/obj/structure/platform{
+ dir = 1
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = 1
+ },
+/obj/structure/blocker/forcefield/multitile_vehicles,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tripoli)
+"Zf" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "43"
+ },
+/area/shuttle/tripoli)
+"ZT" = (
+/obj/structure/machinery/light/double{
+ dir = 4
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/shuttle/tripoli)
+"ZW" = (
+/turf/closed/shuttle/tripoli{
+ icon_state = "77"
+ },
+/area/shuttle/tripoli)
+
+(1,1,1) = {"
+ed
+ed
+ed
+ed
+ed
+fZ
+Ur
+fk
+ed
+sb
+pw
+qW
+bN
+zS
+ed
+nD
+"}
+(2,1,1) = {"
+ed
+ed
+ed
+vJ
+oU
+zC
+Ew
+Oa
+sD
+wN
+DW
+hx
+Ev
+mm
+ed
+Go
+"}
+(3,1,1) = {"
+ed
+ed
+ed
+lj
+ZW
+vC
+sc
+pj
+pj
+Sr
+sD
+eD
+tD
+EM
+oF
+Cf
+"}
+(4,1,1) = {"
+wL
+ih
+Ac
+lv
+DG
+zt
+kS
+ri
+cE
+QS
+jR
+MS
+kS
+vl
+ed
+ed
+"}
+(5,1,1) = {"
+yF
+dN
+aP
+Kk
+vi
+UI
+KZ
+UI
+RK
+Ze
+zZ
+wi
+zZ
+jC
+ed
+ed
+"}
+(6,1,1) = {"
+Fq
+WS
+hS
+RD
+Gt
+ca
+kS
+iU
+AC
+pm
+ZT
+kS
+kS
+jC
+ed
+ed
+"}
+(7,1,1) = {"
+ed
+ed
+ed
+OM
+ZW
+EG
+JO
+Kg
+Kg
+SW
+Zf
+JC
+Ly
+qH
+Cb
+yB
+"}
+(8,1,1) = {"
+ed
+ed
+ed
+zX
+ma
+eN
+cD
+VR
+Zf
+OI
+NV
+CR
+mr
+KU
+ed
+fq
+"}
+(9,1,1) = {"
+ed
+ed
+ed
+ed
+ed
+qo
+Fm
+wy
+ed
+Us
+OF
+VP
+XI
+qf
+ed
+xx
+"}
diff --git a/maps/shuttles/dropship_typhoon.dmm b/maps/shuttles/dropship_typhoon.dmm
new file mode 100644
index 0000000000..331bb09506
--- /dev/null
+++ b/maps/shuttles/dropship_typhoon.dmm
@@ -0,0 +1,1000 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aX" = (
+/turf/template_noop,
+/area/space)
+"bs" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "26"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"cg" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "66"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"cH" = (
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"dV" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "75"
+ },
+/area/shuttle/tornado)
+"et" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "77"
+ },
+/area/shuttle/tornado)
+"fJ" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "99a";
+ layer = 2.97
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"gw" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "27"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"gx" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "47"
+ },
+/area/shuttle/tornado)
+"gJ" = (
+/obj/structure/machinery/camera/autoname/golden_arrow/typhoon{
+ dir = 8;
+ pixel_x = 24
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"gN" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "24"
+ },
+/area/shuttle/tornado)
+"gY" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "67"
+ },
+/area/shuttle/tornado)
+"ix" = (
+/obj/structure/machinery/cm_vending/sorted/medical/wall_med/limited{
+ pixel_y = 25
+ },
+/obj/structure/bed/chair/dropship/passenger/folded{
+ dir = 4;
+ buckling_y = 3;
+ pixel_y = 3
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin7"
+ },
+/area/shuttle/tornado)
+"iz" = (
+/turf/open/shuttle/dropship{
+ icon_state = "floor8"
+ },
+/area/shuttle/tornado)
+"iH" = (
+/obj/structure/bed/chair/dropship/passenger/folded{
+ pixel_y = 8;
+ buckling_y = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"ji" = (
+/obj/structure/platform_decoration{
+ dir = 8
+ },
+/obj/structure/platform_decoration{
+ dir = 4
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"jt" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "102"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"kY" = (
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 8
+ },
+/obj/structure/barricade/handrail{
+ dir = 1
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"lm" = (
+/obj/structure/machinery/light/double{
+ dir = 4;
+ pixel_y = -5
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"lA" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "73"
+ },
+/area/shuttle/tornado)
+"lM" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "48"
+ },
+/area/shuttle/tornado)
+"nM" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "64"
+ },
+/area/shuttle/tornado)
+"of" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "25"
+ },
+/area/shuttle/tornado)
+"oo" = (
+/obj/structure/stairs/perspective{
+ icon_state = "p_stair_full";
+ can_block_movement = 0
+ },
+/obj/structure/platform{
+ dir = 4
+ },
+/obj/structure/platform{
+ dir = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"oH" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "95a"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"qa" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "101"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"rb" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "104"
+ },
+/area/shuttle/tornado)
+"rN" = (
+/obj/structure/bed/portable_surgery{
+ pixel_y = 5
+ },
+/obj/structure/machinery/iv_drip{
+ pixel_y = 26;
+ layer = 2.9
+ },
+/obj/structure/curtain/medical,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"rO" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "72"
+ },
+/area/shuttle/tornado)
+"sC" = (
+/obj/effect/attach_point/crew_weapon/typhoon,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/shuttle/tornado)
+"uS" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "3"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"vO" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "41";
+ density = 0;
+ layer = 4.2
+ },
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "61"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"wd" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "36"
+ },
+/area/shuttle/tornado)
+"wI" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "16"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"wN" = (
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin8"
+ },
+/area/shuttle/tornado)
+"wP" = (
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"xq" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "69"
+ },
+/area/shuttle/tornado)
+"yk" = (
+/turf/closed/shuttle/typhoon/transparent{
+ icon_state = "89a"
+ },
+/area/shuttle/tornado)
+"yE" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "41";
+ density = 0;
+ layer = 4.2
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"zS" = (
+/turf/closed/shuttle/typhoon/transparent{
+ icon_state = "89b"
+ },
+/area/shuttle/tornado)
+"Au" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "5"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Bf" = (
+/obj/structure/platform_decoration{
+ dir = 4
+ },
+/obj/structure/platform_decoration{
+ dir = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"Bz" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "23"
+ },
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "23"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"BO" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "15"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"BP" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "17"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Cl" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "6"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"CE" = (
+/turf/closed/shuttle/typhoon/transparent{
+ icon_state = "86b"
+ },
+/area/shuttle/tornado)
+"Dl" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "83"
+ },
+/area/shuttle/tornado)
+"Dv" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "32"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Eh" = (
+/obj/effect/attach_point/crew_weapon/typhoon,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"Fm" = (
+/turf/closed/shuttle/typhoon/transparent{
+ icon_state = "86a"
+ },
+/area/shuttle/tornado)
+"FC" = (
+/obj/structure/machinery/light/double{
+ dir = 4;
+ pixel_y = -5
+ },
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"FO" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "100"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Gv" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "70"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Ih" = (
+/obj/structure/platform{
+ dir = 1
+ },
+/obj/structure/blocker/forcefield/multitile_vehicles,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/shuttle/tornado)
+"Iw" = (
+/obj/structure/machinery/light/double{
+ dir = 8;
+ pixel_y = -5
+ },
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 4
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"IT" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "40";
+ density = 0;
+ layer = 4.2
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"IU" = (
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 4
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"IX" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "26"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"IZ" = (
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin4"
+ },
+/area/shuttle/tornado)
+"Jb" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "33"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"JT" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "23"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Kp" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = -1
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "S";
+ pixel_y = 2
+ },
+/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ds2{
+ id = "aft_door";
+ name = "\improper Typhoon cargo door"
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin14"
+ },
+/area/shuttle/tornado)
+"Kw" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "28"
+ },
+/obj/effect/attach_point/fuel/typhoon{
+ layer = 3.1
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"KX" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "22"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"KY" = (
+/obj/structure/machinery/light/double{
+ dir = 8;
+ pixel_y = -5
+ },
+/obj/structure/bed/chair/vehicle/toc{
+ dir = 1;
+ pixel_y = 19;
+ pixel_x = 16
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"Lj" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "4"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"MB" = (
+/turf/closed/shuttle/typhoon/transparent{
+ icon_state = "97a"
+ },
+/area/shuttle/tornado)
+"NB" = (
+/obj/structure/machinery/light/double{
+ dir = 8;
+ pixel_y = -5
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"Oh" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "103"
+ },
+/area/shuttle/tornado)
+"Oq" = (
+/obj/structure/machinery/camera/autoname/golden_arrow/typhoon{
+ dir = 4;
+ pixel_x = -24
+ },
+/obj/structure/bed/chair/dropship/passenger{
+ dir = 4
+ },
+/obj/structure/barricade/handrail{
+ dir = 1
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"Or" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "82"
+ },
+/area/shuttle/tornado)
+"Ou" = (
+/obj/structure/stairs/perspective{
+ dir = 1;
+ icon_state = "p_stair_full";
+ pixel_y = 22
+ },
+/obj/structure/bed/chair/vehicle/dropship_cockpit/copilot{
+ dir = 1;
+ pixel_x = 8;
+ layer = 5
+ },
+/obj/structure/machinery/computer/dropship_weapons/typhoon/small{
+ pixel_x = 8;
+ pixel_y = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"OQ" = (
+/obj/structure/stairs/perspective{
+ icon_state = "p_stair_full";
+ can_block_movement = 0
+ },
+/obj/structure/platform{
+ dir = 8
+ },
+/obj/structure/platform{
+ dir = 4
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"OV" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "28"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Pq" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "S";
+ pixel_y = 2
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = -1
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin14"
+ },
+/area/shuttle/tornado)
+"Qi" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "38"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Qs" = (
+/obj/structure/machinery/door/airlock/hatch/cockpit/two,
+/obj/structure/blocker/forcefield/multitile_vehicles,
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"QF" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "62"
+ },
+/area/shuttle/tornado)
+"Rb" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "29"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Rw" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "31"
+ },
+/area/shuttle/tornado)
+"RB" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "39"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"RH" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "27"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Sc" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "74"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Tc" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "29"
+ },
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "29"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Ts" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "2"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"TF" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "40";
+ density = 0;
+ layer = 4.2
+ },
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "65"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Uk" = (
+/obj/structure/shuttle/part/typhoon/transparent,
+/turf/template_noop,
+/area/shuttle/tornado)
+"Ut" = (
+/obj/structure/machinery/camera/autoname/golden_arrow/typhoon{
+ pixel_y = 32
+ },
+/obj/structure/surface/table/reinforced/toc/east{
+ pixel_y = -7
+ },
+/obj/structure/machinery/computer/railgun/gatling/toc{
+ pixel_y = 13;
+ pixel_x = -7
+ },
+/obj/structure/phone_base/toc{
+ pixel_y = 13;
+ pixel_x = 11;
+ phone_id = "Typhoon Overwatch";
+ phone_category = "Overwatch";
+ name = "Typhoon overwatch telephone receiver"
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin6"
+ },
+/area/shuttle/tornado)
+"VM" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "9"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"VV" = (
+/obj/structure/shuttle/part/tornado/transparent{
+ icon_state = "22"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Wk" = (
+/obj/docking_port/mobile/marine_dropship/typhoon,
+/obj/structure/bed/chair/dropship/passenger/folded{
+ pixel_y = 8;
+ buckling_y = 8
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"Xv" = (
+/obj/structure/phone_base{
+ dir = 4;
+ pixel_x = -19;
+ pixel_y = 12;
+ layer = 3.1;
+ phone_category = "Dropship";
+ name = "Typhoon telephone receiver";
+ phone_id = "Typhoon"
+ },
+/obj/structure/bed/chair/vehicle/dropship_cockpit/pilot{
+ dir = 1;
+ pixel_x = 6;
+ pixel_y = 8
+ },
+/obj/structure/machinery/computer/shuttle/dropship/flight/small{
+ pixel_y = 16;
+ pixel_x = 6
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"Xw" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "32"
+ },
+/obj/effect/attach_point/fuel/typhoon{
+ layer = 3.1
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"XO" = (
+/obj/structure/machinery/light/double{
+ dir = 4;
+ pixel_y = -5
+ },
+/obj/structure/surface/table/almayer,
+/obj/item/storage/surgical_tray/empty,
+/obj/item/reagent_container/hypospray/autoinjector/oxycodone{
+ pixel_y = 9;
+ pixel_x = -3
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"Ym" = (
+/obj/structure/machinery/computer/overwatch/toc{
+ pixel_y = 14
+ },
+/obj/structure/surface/table/reinforced/toc/west{
+ pixel_y = -7
+ },
+/obj/structure/machinery/prop/almayer/CICmap/arc{
+ pixel_y = 9;
+ pixel_x = -9
+ },
+/obj/structure/machinery/computer/railgun/toc{
+ pixel_y = 14;
+ pixel_x = 7
+ },
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin15"
+ },
+/area/shuttle/tornado)
+"YW" = (
+/obj/structure/shuttle/part/typhoon/transparent{
+ icon_state = "71"
+ },
+/turf/template_noop,
+/area/shuttle/tornado)
+"Zk" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "30"
+ },
+/area/shuttle/tornado)
+"ZD" = (
+/turf/open/shuttle/dropship{
+ icon_state = "rasputin3"
+ },
+/area/shuttle/tornado)
+"ZR" = (
+/turf/closed/shuttle/typhoon{
+ icon_state = "37"
+ },
+/area/shuttle/tornado)
+
+(1,1,1) = {"
+aX
+aX
+aX
+aX
+aX
+aX
+aX
+aX
+IT
+Qi
+Kw
+KX
+wI
+aX
+aX
+aX
+aX
+aX
+"}
+(2,1,1) = {"
+aX
+aX
+aX
+aX
+aX
+YW
+cg
+cg
+vO
+RB
+Rb
+JT
+BP
+IT
+OV
+VV
+wI
+Uk
+"}
+(3,1,1) = {"
+aX
+aX
+aX
+IT
+dV
+rO
+gY
+gY
+QF
+wd
+Zk
+gN
+VM
+yE
+Tc
+Bz
+BP
+Ts
+"}
+(4,1,1) = {"
+aX
+aX
+aX
+yE
+et
+Ym
+KY
+Oq
+IU
+Iw
+IU
+Eh
+gx
+wd
+Zk
+gN
+Oh
+uS
+"}
+(5,1,1) = {"
+FO
+oH
+CE
+Fm
+Or
+Ut
+ZD
+ZD
+ZD
+ZD
+IZ
+OQ
+Bf
+cH
+NB
+cH
+Kp
+aX
+"}
+(6,1,1) = {"
+qa
+MB
+Xv
+Ou
+Qs
+iz
+cH
+cH
+Wk
+iH
+iz
+cH
+Ih
+ZD
+sC
+ZD
+Pq
+aX
+"}
+(7,1,1) = {"
+jt
+fJ
+zS
+yk
+et
+ix
+ZD
+ZD
+ZD
+ZD
+wN
+oo
+ji
+gJ
+lm
+cH
+Pq
+aX
+"}
+(8,1,1) = {"
+aX
+aX
+aX
+IT
+et
+rN
+XO
+kY
+wP
+FC
+wP
+Eh
+lM
+ZR
+Rw
+of
+rb
+Lj
+"}
+(9,1,1) = {"
+aX
+aX
+aX
+yE
+Dl
+lA
+xq
+xq
+nM
+ZR
+Rw
+of
+BO
+IT
+Dv
+bs
+wI
+Au
+"}
+(10,1,1) = {"
+aX
+aX
+aX
+aX
+aX
+Sc
+Gv
+Gv
+TF
+Qi
+Xw
+IX
+wI
+yE
+Jb
+gw
+BP
+Cl
+"}
+(11,1,1) = {"
+aX
+aX
+aX
+aX
+aX
+aX
+aX
+aX
+yE
+RB
+Jb
+RH
+BP
+aX
+aX
+aX
+aX
+aX
+"}
diff --git a/maps/shuttles/dropship_upp.dmm b/maps/shuttles/dropship_upp.dmm
index 4067aad0fd..536deb63c5 100644
--- a/maps/shuttles/dropship_upp.dmm
+++ b/maps/shuttles/dropship_upp.dmm
@@ -275,7 +275,10 @@
},
/area/shuttle/ds_upp)
"xZ" = (
-/obj/effect/attach_point/crew_weapon/midway,
+/obj/effect/attach_point/crew_weapon/midway{
+ attach_id = 7;
+ ship_tag = "dropship_upp"
+ },
/turf/open/floor/strata{
dir = 4;
icon_state = "floor3"
@@ -402,10 +405,10 @@
ship_tag = "dropship_upp"
},
/turf/template_noop,
-/area/space)
+/area/template_noop)
"Jy" = (
/turf/template_noop,
-/area/space)
+/area/template_noop)
"JD" = (
/obj/effect/decal/strata_decals/catwalk/prison,
/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
@@ -440,6 +443,16 @@
icon_state = "uppwall"
},
/area/shuttle/ds_upp)
+"OB" = (
+/obj/effect/attach_point/crew_weapon/midway{
+ attach_id = 9;
+ ship_tag = "dropship_upp"
+ },
+/turf/open/floor/strata{
+ dir = 4;
+ icon_state = "floor3"
+ },
+/area/shuttle/ds_upp)
"PQ" = (
/obj/effect/attach_point/weapon/midway/right_wing{
ship_tag = "dropship_upp"
@@ -512,7 +525,8 @@
/obj/structure/machinery/computer/dropship_weapons/midway{
name = "\improper 'Akademia Nauk' weapons controls";
shuttle_tag = "dropship_upp";
- faction = "UPP"
+ faction = "UPP";
+ req_one_access = list(235,240)
},
/obj/structure/blocker/invisible_wall,
/turf/open/floor/strata{
@@ -531,12 +545,22 @@
ship_tag = "dropship_upp"
},
/turf/template_noop,
-/area/space)
+/area/template_noop)
"Xo" = (
/turf/closed/shuttle/ert{
icon_state = "T151"
},
/area/shuttle/ds_upp)
+"XO" = (
+/obj/effect/attach_point/crew_weapon/midway{
+ attach_id = 8;
+ ship_tag = "dropship_upp"
+ },
+/turf/open/floor/strata{
+ dir = 4;
+ icon_state = "floor3"
+ },
+/area/shuttle/ds_upp)
"Zm" = (
/turf/closed/shuttle/ert{
icon_state = "upp8"
@@ -600,7 +624,7 @@ xE
xE
AK
he
-xZ
+XO
nA
HV
ex
@@ -680,7 +704,7 @@ Sx
Sx
AK
he
-xZ
+OB
nA
HV
yy
diff --git a/maps/shuttles/ert_shuttle_big.dmm b/maps/shuttles/ert_shuttle_big.dmm
index f3983899e2..96fb88a3ea 100644
--- a/maps/shuttles/ert_shuttle_big.dmm
+++ b/maps/shuttles/ert_shuttle_big.dmm
@@ -25,12 +25,8 @@
/obj/item/weapon/gun/pistol/mod88{
pixel_y = 4
},
-/obj/item/ammo_magazine/pistol/mod88{
- pixel_x = 5
- },
-/obj/item/ammo_magazine/pistol/mod88{
- pixel_x = 5
- },
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
+/obj/item/ammo_magazine/pistol/mod88/normalpoint,
/turf/open/floor/almayer{
icon_state = "plate"
},
diff --git a/nano/images/weapons/88m4.png b/nano/images/weapons/88m4.png
deleted file mode 100644
index 77faa65720..0000000000
Binary files a/nano/images/weapons/88m4.png and /dev/null differ
diff --git a/nano/images/weapons/aamateba.png b/nano/images/weapons/aamateba.png
deleted file mode 100644
index 30a5c1c72c..0000000000
Binary files a/nano/images/weapons/aamateba.png and /dev/null differ
diff --git a/nano/images/weapons/amateba.png b/nano/images/weapons/amateba.png
deleted file mode 100644
index 6d411d2ad7..0000000000
Binary files a/nano/images/weapons/amateba.png and /dev/null differ
diff --git a/nano/images/weapons/auto.png b/nano/images/weapons/auto.png
deleted file mode 100644
index 7efc6ff1c8..0000000000
Binary files a/nano/images/weapons/auto.png and /dev/null differ
diff --git a/nano/images/weapons/auto9.png b/nano/images/weapons/auto9.png
deleted file mode 100644
index 8fbc101f2f..0000000000
Binary files a/nano/images/weapons/auto9.png and /dev/null differ
diff --git a/nano/images/weapons/b92fs.png b/nano/images/weapons/b92fs.png
deleted file mode 100644
index 2788124dfb..0000000000
Binary files a/nano/images/weapons/b92fs.png and /dev/null differ
diff --git a/nano/images/weapons/burst.png b/nano/images/weapons/burst.png
deleted file mode 100644
index 669bd676eb..0000000000
Binary files a/nano/images/weapons/burst.png and /dev/null differ
diff --git a/nano/images/weapons/c70.png b/nano/images/weapons/c70.png
deleted file mode 100644
index b7e2ed731b..0000000000
Binary files a/nano/images/weapons/c70.png and /dev/null differ
diff --git a/nano/images/weapons/c_deagle.png b/nano/images/weapons/c_deagle.png
deleted file mode 100644
index c2a5c991ac..0000000000
Binary files a/nano/images/weapons/c_deagle.png and /dev/null differ
diff --git a/nano/images/weapons/cmateba.png b/nano/images/weapons/cmateba.png
deleted file mode 100644
index f949d4b547..0000000000
Binary files a/nano/images/weapons/cmateba.png and /dev/null differ
diff --git a/nano/images/weapons/cshotgun.png b/nano/images/weapons/cshotgun.png
deleted file mode 100644
index 9820f58546..0000000000
Binary files a/nano/images/weapons/cshotgun.png and /dev/null differ
diff --git a/nano/images/weapons/dartgun.png b/nano/images/weapons/dartgun.png
deleted file mode 100644
index 218dc742dc..0000000000
Binary files a/nano/images/weapons/dartgun.png and /dev/null differ
diff --git a/nano/images/weapons/deagle.png b/nano/images/weapons/deagle.png
deleted file mode 100644
index 059a730d7e..0000000000
Binary files a/nano/images/weapons/deagle.png and /dev/null differ
diff --git a/nano/images/weapons/disabled_automatic.png b/nano/images/weapons/disabled_automatic.png
deleted file mode 100644
index 94da079d80..0000000000
Binary files a/nano/images/weapons/disabled_automatic.png and /dev/null differ
diff --git a/nano/images/weapons/disabled_burst.png b/nano/images/weapons/disabled_burst.png
deleted file mode 100644
index 71b88bcaf9..0000000000
Binary files a/nano/images/weapons/disabled_burst.png and /dev/null differ
diff --git a/nano/images/weapons/disabled_single.png b/nano/images/weapons/disabled_single.png
deleted file mode 100644
index bf2cef4b15..0000000000
Binary files a/nano/images/weapons/disabled_single.png and /dev/null differ
diff --git a/nano/images/weapons/dshotgun.png b/nano/images/weapons/dshotgun.png
deleted file mode 100644
index cd79598281..0000000000
Binary files a/nano/images/weapons/dshotgun.png and /dev/null differ
diff --git a/nano/images/weapons/fp9000.png b/nano/images/weapons/fp9000.png
deleted file mode 100644
index b9f971eb07..0000000000
Binary files a/nano/images/weapons/fp9000.png and /dev/null differ
diff --git a/nano/images/weapons/fp9000_pmc.png b/nano/images/weapons/fp9000_pmc.png
deleted file mode 100644
index b9f971eb07..0000000000
Binary files a/nano/images/weapons/fp9000_pmc.png and /dev/null differ
diff --git a/nano/images/weapons/g_deagle.png b/nano/images/weapons/g_deagle.png
deleted file mode 100644
index c2a5c991ac..0000000000
Binary files a/nano/images/weapons/g_deagle.png and /dev/null differ
diff --git a/nano/images/weapons/hg3712.png b/nano/images/weapons/hg3712.png
deleted file mode 100644
index f7f32190c4..0000000000
Binary files a/nano/images/weapons/hg3712.png and /dev/null differ
diff --git a/nano/images/weapons/highpower.png b/nano/images/weapons/highpower.png
deleted file mode 100644
index a7d25c4480..0000000000
Binary files a/nano/images/weapons/highpower.png and /dev/null differ
diff --git a/nano/images/weapons/holdout.png b/nano/images/weapons/holdout.png
deleted file mode 100644
index 1d6f26fad2..0000000000
Binary files a/nano/images/weapons/holdout.png and /dev/null differ
diff --git a/nano/images/weapons/hunting.png b/nano/images/weapons/hunting.png
deleted file mode 100644
index 5d9613117f..0000000000
Binary files a/nano/images/weapons/hunting.png and /dev/null differ
diff --git a/nano/images/weapons/kt42.png b/nano/images/weapons/kt42.png
deleted file mode 100644
index ecf0ee41a9..0000000000
Binary files a/nano/images/weapons/kt42.png and /dev/null differ
diff --git a/nano/images/weapons/l42mk1.png b/nano/images/weapons/l42mk1.png
deleted file mode 100644
index b5efcc14d3..0000000000
Binary files a/nano/images/weapons/l42mk1.png and /dev/null differ
diff --git a/nano/images/weapons/m16.png b/nano/images/weapons/m16.png
deleted file mode 100644
index 2287f73196..0000000000
Binary files a/nano/images/weapons/m16.png and /dev/null differ
diff --git a/nano/images/weapons/m240.png b/nano/images/weapons/m240.png
deleted file mode 100644
index 72eb477c9e..0000000000
Binary files a/nano/images/weapons/m240.png and /dev/null differ
diff --git a/nano/images/weapons/m240t.png b/nano/images/weapons/m240t.png
deleted file mode 100644
index 619551d690..0000000000
Binary files a/nano/images/weapons/m240t.png and /dev/null differ
diff --git a/nano/images/weapons/m37-17.png b/nano/images/weapons/m37-17.png
deleted file mode 100644
index 7d53cbd761..0000000000
Binary files a/nano/images/weapons/m37-17.png and /dev/null differ
diff --git a/nano/images/weapons/m37.png b/nano/images/weapons/m37.png
deleted file mode 100644
index f888adaeb6..0000000000
Binary files a/nano/images/weapons/m37.png and /dev/null differ
diff --git a/nano/images/weapons/m39.png b/nano/images/weapons/m39.png
deleted file mode 100644
index f6fbb0a489..0000000000
Binary files a/nano/images/weapons/m39.png and /dev/null differ
diff --git a/nano/images/weapons/m41a.png b/nano/images/weapons/m41a.png
deleted file mode 100644
index 9476e0d1f4..0000000000
Binary files a/nano/images/weapons/m41a.png and /dev/null differ
diff --git a/nano/images/weapons/m41a2.png b/nano/images/weapons/m41a2.png
deleted file mode 100644
index 4179cb37f5..0000000000
Binary files a/nano/images/weapons/m41a2.png and /dev/null differ
diff --git a/nano/images/weapons/m41ae2.png b/nano/images/weapons/m41ae2.png
deleted file mode 100644
index 4a5232fd66..0000000000
Binary files a/nano/images/weapons/m41ae2.png and /dev/null differ
diff --git a/nano/images/weapons/m41amk1.png b/nano/images/weapons/m41amk1.png
deleted file mode 100644
index 3f44c62b0f..0000000000
Binary files a/nano/images/weapons/m41amk1.png and /dev/null differ
diff --git a/nano/images/weapons/m41b.png b/nano/images/weapons/m41b.png
deleted file mode 100644
index 1d63443f25..0000000000
Binary files a/nano/images/weapons/m41b.png and /dev/null differ
diff --git a/nano/images/weapons/m42a.png b/nano/images/weapons/m42a.png
deleted file mode 100644
index f0d07328c1..0000000000
Binary files a/nano/images/weapons/m42a.png and /dev/null differ
diff --git a/nano/images/weapons/m42c.png b/nano/images/weapons/m42c.png
deleted file mode 100644
index 47d53b86ce..0000000000
Binary files a/nano/images/weapons/m42c.png and /dev/null differ
diff --git a/nano/images/weapons/m44r.png b/nano/images/weapons/m44r.png
deleted file mode 100644
index d7deb2589e..0000000000
Binary files a/nano/images/weapons/m44r.png and /dev/null differ
diff --git a/nano/images/weapons/m44rc.png b/nano/images/weapons/m44rc.png
deleted file mode 100644
index 1c20973a0a..0000000000
Binary files a/nano/images/weapons/m44rc.png and /dev/null differ
diff --git a/nano/images/weapons/m46c.png b/nano/images/weapons/m46c.png
deleted file mode 100644
index d404a6d88f..0000000000
Binary files a/nano/images/weapons/m46c.png and /dev/null differ
diff --git a/nano/images/weapons/m4a3.png b/nano/images/weapons/m4a3.png
deleted file mode 100644
index 9169c71c51..0000000000
Binary files a/nano/images/weapons/m4a3.png and /dev/null differ
diff --git a/nano/images/weapons/m4a345.png b/nano/images/weapons/m4a345.png
deleted file mode 100644
index 1ba0015846..0000000000
Binary files a/nano/images/weapons/m4a345.png and /dev/null differ
diff --git a/nano/images/weapons/m4a3c.png b/nano/images/weapons/m4a3c.png
deleted file mode 100644
index 95731a6c71..0000000000
Binary files a/nano/images/weapons/m4a3c.png and /dev/null differ
diff --git a/nano/images/weapons/m5.png b/nano/images/weapons/m5.png
deleted file mode 100644
index 7d502fdaaf..0000000000
Binary files a/nano/images/weapons/m5.png and /dev/null differ
diff --git a/nano/images/weapons/m56.png b/nano/images/weapons/m56.png
deleted file mode 100644
index baf9b9bd9c..0000000000
Binary files a/nano/images/weapons/m56.png and /dev/null differ
diff --git a/nano/images/weapons/m57a4.png b/nano/images/weapons/m57a4.png
deleted file mode 100644
index 6c2cbcbdbe..0000000000
Binary files a/nano/images/weapons/m57a4.png and /dev/null differ
diff --git a/nano/images/weapons/m60.png b/nano/images/weapons/m60.png
deleted file mode 100644
index 08baffaa74..0000000000
Binary files a/nano/images/weapons/m60.png and /dev/null differ
diff --git a/nano/images/weapons/m79.png b/nano/images/weapons/m79.png
deleted file mode 100644
index 365280f242..0000000000
Binary files a/nano/images/weapons/m79.png and /dev/null differ
diff --git a/nano/images/weapons/m81.png b/nano/images/weapons/m81.png
deleted file mode 100644
index 7b1a6a195b..0000000000
Binary files a/nano/images/weapons/m81.png and /dev/null differ
diff --git a/nano/images/weapons/m82f.png b/nano/images/weapons/m82f.png
deleted file mode 100644
index f6d5e24ec8..0000000000
Binary files a/nano/images/weapons/m82f.png and /dev/null differ
diff --git a/nano/images/weapons/m92.png b/nano/images/weapons/m92.png
deleted file mode 100644
index ce64c3df36..0000000000
Binary files a/nano/images/weapons/m92.png and /dev/null differ
diff --git a/nano/images/weapons/m93b2.png b/nano/images/weapons/m93b2.png
deleted file mode 100644
index 987f56643a..0000000000
Binary files a/nano/images/weapons/m93b2.png and /dev/null differ
diff --git a/nano/images/weapons/mac15.png b/nano/images/weapons/mac15.png
deleted file mode 100644
index 179c8b7a61..0000000000
Binary files a/nano/images/weapons/mac15.png and /dev/null differ
diff --git a/nano/images/weapons/mar30.png b/nano/images/weapons/mar30.png
deleted file mode 100644
index 3a5c19f336..0000000000
Binary files a/nano/images/weapons/mar30.png and /dev/null differ
diff --git a/nano/images/weapons/mar40.png b/nano/images/weapons/mar40.png
deleted file mode 100644
index 043d6529ef..0000000000
Binary files a/nano/images/weapons/mar40.png and /dev/null differ
diff --git a/nano/images/weapons/mateba.png b/nano/images/weapons/mateba.png
deleted file mode 100644
index 49ec3f897a..0000000000
Binary files a/nano/images/weapons/mateba.png and /dev/null differ
diff --git a/nano/images/weapons/mk221.png b/nano/images/weapons/mk221.png
deleted file mode 100644
index a15773fb26..0000000000
Binary files a/nano/images/weapons/mk221.png and /dev/null differ
diff --git a/nano/images/weapons/mou.png b/nano/images/weapons/mou.png
deleted file mode 100644
index a471e16f6e..0000000000
Binary files a/nano/images/weapons/mou.png and /dev/null differ
diff --git a/nano/images/weapons/mp5.png b/nano/images/weapons/mp5.png
deleted file mode 100644
index e36fccdca4..0000000000
Binary files a/nano/images/weapons/mp5.png and /dev/null differ
diff --git a/nano/images/weapons/mp7.png b/nano/images/weapons/mp7.png
deleted file mode 100644
index 9494c8003d..0000000000
Binary files a/nano/images/weapons/mp7.png and /dev/null differ
diff --git a/nano/images/weapons/no_name.png b/nano/images/weapons/no_name.png
deleted file mode 100644
index 8babb2fda5..0000000000
Binary files a/nano/images/weapons/no_name.png and /dev/null differ
diff --git a/nano/images/weapons/ny762.png b/nano/images/weapons/ny762.png
deleted file mode 100644
index bdd5fe500e..0000000000
Binary files a/nano/images/weapons/ny762.png and /dev/null differ
diff --git a/nano/images/weapons/painless.png b/nano/images/weapons/painless.png
deleted file mode 100644
index f493c662eb..0000000000
Binary files a/nano/images/weapons/painless.png and /dev/null differ
diff --git a/nano/images/weapons/pk9.png b/nano/images/weapons/pk9.png
deleted file mode 100644
index 7c66494637..0000000000
Binary files a/nano/images/weapons/pk9.png and /dev/null differ
diff --git a/nano/images/weapons/pk9r.png b/nano/images/weapons/pk9r.png
deleted file mode 100644
index be9adcd507..0000000000
Binary files a/nano/images/weapons/pk9r.png and /dev/null differ
diff --git a/nano/images/weapons/pk9u.png b/nano/images/weapons/pk9u.png
deleted file mode 100644
index 519f574f6e..0000000000
Binary files a/nano/images/weapons/pk9u.png and /dev/null differ
diff --git a/nano/images/weapons/ppsh17b.png b/nano/images/weapons/ppsh17b.png
deleted file mode 100644
index 4ea9e0214f..0000000000
Binary files a/nano/images/weapons/ppsh17b.png and /dev/null differ
diff --git a/nano/images/weapons/single.png b/nano/images/weapons/single.png
deleted file mode 100644
index 2f784868ca..0000000000
Binary files a/nano/images/weapons/single.png and /dev/null differ
diff --git a/nano/images/weapons/skorpion.png b/nano/images/weapons/skorpion.png
deleted file mode 100644
index 342fc75e3e..0000000000
Binary files a/nano/images/weapons/skorpion.png and /dev/null differ
diff --git a/nano/images/weapons/skorpion_u.png b/nano/images/weapons/skorpion_u.png
deleted file mode 100644
index 72128e1f46..0000000000
Binary files a/nano/images/weapons/skorpion_u.png and /dev/null differ
diff --git a/nano/images/weapons/smartpistol.png b/nano/images/weapons/smartpistol.png
deleted file mode 100644
index e688ac9260..0000000000
Binary files a/nano/images/weapons/smartpistol.png and /dev/null differ
diff --git a/nano/images/weapons/spearhead.png b/nano/images/weapons/spearhead.png
deleted file mode 100644
index 7b740dbdc5..0000000000
Binary files a/nano/images/weapons/spearhead.png and /dev/null differ
diff --git a/nano/images/weapons/sshotgun.png b/nano/images/weapons/sshotgun.png
deleted file mode 100644
index f052433653..0000000000
Binary files a/nano/images/weapons/sshotgun.png and /dev/null differ
diff --git a/nano/images/weapons/supremo.png b/nano/images/weapons/supremo.png
deleted file mode 100644
index 83f6a6fb4b..0000000000
Binary files a/nano/images/weapons/supremo.png and /dev/null differ
diff --git a/nano/images/weapons/svd003.png b/nano/images/weapons/svd003.png
deleted file mode 100644
index 6395b8d3b6..0000000000
Binary files a/nano/images/weapons/svd003.png and /dev/null differ
diff --git a/nano/images/weapons/sw357.png b/nano/images/weapons/sw357.png
deleted file mode 100644
index a89ea9cb2f..0000000000
Binary files a/nano/images/weapons/sw357.png and /dev/null differ
diff --git a/nano/images/weapons/sw358.png b/nano/images/weapons/sw358.png
deleted file mode 100644
index c24e72bfce..0000000000
Binary files a/nano/images/weapons/sw358.png and /dev/null differ
diff --git a/nano/images/weapons/syringegun.png b/nano/images/weapons/syringegun.png
deleted file mode 100644
index bf18bf425d..0000000000
Binary files a/nano/images/weapons/syringegun.png and /dev/null differ
diff --git a/nano/images/weapons/taser.png b/nano/images/weapons/taser.png
deleted file mode 100644
index 6337a89966..0000000000
Binary files a/nano/images/weapons/taser.png and /dev/null differ
diff --git a/nano/images/weapons/type71.png b/nano/images/weapons/type71.png
deleted file mode 100644
index 700ff164d6..0000000000
Binary files a/nano/images/weapons/type71.png and /dev/null differ
diff --git a/nano/images/weapons/type71c.png b/nano/images/weapons/type71c.png
deleted file mode 100644
index 273ac0bcbe..0000000000
Binary files a/nano/images/weapons/type71c.png and /dev/null differ
diff --git a/nano/images/weapons/type73.png b/nano/images/weapons/type73.png
deleted file mode 100644
index 63294f7cc9..0000000000
Binary files a/nano/images/weapons/type73.png and /dev/null differ
diff --git a/nano/images/weapons/vp78.png b/nano/images/weapons/vp78.png
deleted file mode 100644
index 2383b4e3ad..0000000000
Binary files a/nano/images/weapons/vp78.png and /dev/null differ
diff --git a/nano/images/weapons/xm42b.png b/nano/images/weapons/xm42b.png
deleted file mode 100644
index 645c552314..0000000000
Binary files a/nano/images/weapons/xm42b.png and /dev/null differ
diff --git a/nano/templates/dropship_weapons_console.tmpl b/nano/templates/dropship_weapons_console.tmpl
deleted file mode 100644
index fabfdee246..0000000000
--- a/nano/templates/dropship_weapons_console.tmpl
+++ /dev/null
@@ -1,245 +0,0 @@
-
-{{if data.screen_mode == 0}}
-
-
Equipment installed:
-
- {{for data.equipment_data}}
- {{if value.is_interactable}}
-
- {{:helper.link(value.name, null, {'equip_interact' : value.eqp_tag}, null , null)}}
-
- {{else}}
-
- {{:value.name}}
-
- {{/if}}
- {{empty}}
- No equipment installed.
- {{/for}}
-
-
- {{if data.has_firemission}}
-
-
Fire Missions:
-
- {{for data.firemission_data}}
-
-
- {{:value.name}}
-
-
-
-
- {{if !value.can_interact}}
-
- *!SELECT*
-
- {{/if}}
- {{if !value.can_edit}}
-
- *!EDIT*
-
- {{/if}}
-
- {{if value.can_interact}}
-
- {{if value.selected}}
- {{:helper.link("[UNSELECT]", null, {'mission_tag' : value.mission_tag}, null , null)}}
- {{else}}
- {{:helper.link("[SELECT]", null, {'mission_tag' : value.mission_tag}, null , null)}}
- {{/if}}
-
- {{/if}}
-
- {{if value.can_edit}}
-
- {{:helper.link("[EDIT]", null, {'mission_tag_edit' : value.mission_tag}, null , null)}}
-
- {{/if}}
-
-
- {{:helper.link("[DELETE]", null, {'mission_tag_delete' : value.mission_tag}, null , null)}}
-
-
-
- {{empty}}
- No Fire Missions Detected
- {{/for}}
-
- {{:helper.link("Create New Fire Mission", null, {'create_mission' : 1}, null , null)}}
-
-
-
-
-
-
Fire Mission Control:
- {{if data.can_firemission}}
-
- {{:helper.link("Switch to Fire Mission", null, {'switch_to_firemission' : 1}, null , null)}}
-
-
- {{else}}
-
- Have to be in Transit, have to select a Fire Mission and Fire Mission has to be without errors.
-
- {{/if}}
-
-
-
Fire Mission Simulator:
- {{if data.shuttle_state != "in_transit"}}
-
- {{:helper.link("Switch To Simulation", null, {'switch_to_simulation' : 1}, null , null)}}
-
-
- {{else}}
-
- Have to be Stationary, have to select a Fire Mission and Fire Mission has to be without errors.
-
- {{/if}}
-
- {{/if}}
-{{else data.screen_mode == 1}}
- Weapon Selected: {{:data.selected_eqp}}
- {{if data.selected_eqp_ammo_name}}
-
- Ammo loaded: {{:data.selected_eqp_ammo_name}}
-
-
- {{if data.selected_eqp_ammo_amt > data.selected_eqp_max_ammo_amt*0.5}}
- Ammo count: {{:data.selected_eqp_ammo_amt}} / {{:data.selected_eqp_max_ammo_amt}}
- {{else data.selected_eqp_ammo_amt > 0}}
- Ammo count: {{:data.selected_eqp_ammo_amt}} / {{:data.selected_eqp_max_ammo_amt}}
- {{else}}
- Ammo count: {{:data.selected_eqp_ammo_amt}} / {{:data.selected_eqp_max_ammo_amt}}
- {{/if}}
-
- {{else}}
-
- No ammo loaded
-
- {{/if}}
-
-
- Available Targets
-
- {{:helper.link('Deselect Weapon', null, {'deselect' : '1'}, null , null)}}
-
-
-
-
- {{for data.targets_data}}
- {{:helper.link(value.target_name, null, {'open_fire' : value.target_tag}, (data.shuttle_state == "in_transit") ? null : 'disabled' , 'fixedLeftLongText')}} {{:helper.link('View', 'search', {'cas_camera' : value.target_tag}, (data.shuttle_state == "in_transit") ? null : 'disabled' , 'fixedLeft')}}
- {{empty}}
- No laser target detected.
- {{/for}}
-
-
-
-
-{{else data.screen_mode == 2}}
- Fire Mission Editing: {{:data.editing_firemission}}
- {{if data.current_mission_error}}
-
- ERROR DETECTED: {{:data.current_mission_error}}
-
- {{else}}
-
- No errors detected
-
- {{/if}}
-
-
- Mission Tile Coverage: {{:data.editing_firemission_length}}
-
-
-
-
- Name |
- Ammo |
- Gimbal |
- {{for data.firemission_edit_timeslices}}
-
- {{:value}}
- |
- {{/for}}
-
- {{for data.firemission_edit_data :fm_value:fm_id}}
-
- {{:fm_value.name}} |
-
- {{if fm_value.ammo==null}}
- 0/0
- {{else}}
- {{if fm_value.ammo.used > fm_value.ammo.count}}
- {{:fm_value.ammo.count?fm_value.ammo.count:0}}/{{:fm_value.ammo.max?fm_value.ammo.max:0}}
- {{else fm_value.ammo.used * 2 > fm_value.ammo.count}}
- {{:fm_value.ammo.count?fm_value.ammo.count:0}}/{{:fm_value.ammo.max?fm_value.ammo.max:0}}
- {{else}}
- {{:fm_value.ammo.count?fm_value.ammo.count:0}}/{{:fm_value.ammo.max?fm_value.ammo.max:0}}
- {{/if}}
- {{/if}}
- |
-
- {{if(fm_value.gimbal)}}
- {{:fm_value.gimbal.min}} to {{:fm_value.gimbal.max}}
- {{else}}
- Not installed
- {{/if}}
- |
- {{for fm_value.offsets :offset_value:offset_id}}
-
- {{:helper.link(offset_value == null ? '-' : offset_value, null, {'fm_weapon_id' : fm_id, 'fm_offset_id' : offset_id, 'fm_offset_previous': offset_value}, null , null)}}
- |
- {{/for}}
-
- {{/for}}
-
-
-
- {{:helper.link("BACK", null, {'leave_firemission_editing' : 1}, null , null)}}
-
-
-{{else data.screen_mode == 3 && data.has_firemission}}
- Fire Mission Selected: {{:data.firemission_name}}
-
-
- Fire Mission Status: {{:data.firemission_message}}
-
-
-
-
Fire Mission Options:
-
-
- Target: |
- {{:data.firemission_selected_laser}} |
-
-
- Direction: |
- {{:helper.link(data.firemission_direction, null, {'change_direction' : 1}, (data.shuttle_state == "in_transit" && data.firemission_step < 2) ? null : 'disabled' , null)}} |
-
-
- Offset: |
- {{:helper.link(data.firemission_offset, null, {'change_offset' : 1}, (data.shuttle_state == "in_transit" && data.firemission_step < 2) ? null : 'disabled' , null)}} |
-
-
-
-
-
-
Fire Mission Actions:
-
- {{:helper.link('BACK', null, {'leave_firemission_execution' : '1'}, null , 'fixedLeft')}}
- {{:helper.link('Activate Camera', null, {'firemission_camera' : 1}, (data.shuttle_state == "in_transit" && data.firemission_selected_laser) ? null : 'disabled' , 'fixedLeft')}}
- {{:helper.link('Execute Fire Mission', null, {'execute_firemission' : 1}, (data.shuttle_state == "in_transit" && data.firemission_step == 0) ? null : 'disabled' , "linkDanger fixedLeftWide")}}
-
-
-
- Available Targets:
-
- {{for data.targets_data}}
- {{:helper.link(value.target_name, null, {'select_laser_firemission' : value.target_tag}, (data.shuttle_state == "in_transit") ? null : 'disabled' , 'fixedLeftLongText')}}
- {{empty}}
- No CAS signal detected.
- {{/for}}
-
-
-{{/if}}
diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity
new file mode 100644
index 0000000000..6b671344d4
--- /dev/null
+++ b/node_modules/.yarn-integrity
@@ -0,0 +1,10 @@
+{
+ "systemParams": "win32-x64-93",
+ "modulesFolders": [],
+ "flags": [],
+ "linkedModules": [],
+ "topLevelPatterns": [],
+ "lockfileEntries": {},
+ "files": [],
+ "artifacts": {}
+}
\ No newline at end of file
diff --git a/strings/metatips.txt b/strings/metatips.txt
index 17ffd607a7..e0ede9c626 100644
--- a/strings/metatips.txt
+++ b/strings/metatips.txt
@@ -12,6 +12,7 @@ As a mentor, you can become the imaginary friend of a new player to teach them!
You shouldn't ignore what your allies are up to. Sometimes they can be organizing a flank on the radio, sometimes they can be walking up behind you with a buck-loaded shotgun. Either way, it pays to be alert to what they're doing, as much to as what the enemies are.
The Wiki (https://cm-ss13.com/wiki) is a very useful repository of information about the game, such as weapons, equipment, xenomorph castes and their strains. It may not be fully up to date much of the time, but the basics are usually accurate.
As an observer, you may see how much remaining hijack time is left in the status panel.
+As an observer, you can quickly follow someone by ctrl-clicking on their sprite.
You can always AdminHelp with the F1 key to question a member of staff regarding rules or game bugs.
As ghost you are given extra tools for spectating the round: you can jump and follow specific players, get notifications about CAS and OB strikes, can see all health bars, and such.
You can press ESC key to bring up the game pause menu. It allows you change settings, AdminHelp and MentorHelp, and even access the Web Maps of game by clicking at top right.
diff --git a/tgui/.eslintignore b/tgui/.eslintignore
index a59187b933..d3c0ac79cd 100644
--- a/tgui/.eslintignore
+++ b/tgui/.eslintignore
@@ -3,4 +3,14 @@
/**/*.bundle.*
/**/*.chunk.*
/**/*.hot-update.*
-/packages/inferno/**
+**.lock
+**.log
+**.json
+**.svg
+**.scss
+**.md
+**.css
+**.txt
+**.woff2
+**.eot
+**.ttf
diff --git a/tgui/.eslintrc-sonar.yml b/tgui/.eslintrc-sonar.yml
index 3cdd49f889..ebc57f72c0 100644
--- a/tgui/.eslintrc-sonar.yml
+++ b/tgui/.eslintrc-sonar.yml
@@ -1,26 +1 @@
-rules:
- # radar/cognitive-complexity: error
- radar/max-switch-cases: error
- radar/no-all-duplicated-branches: error
- radar/no-collapsible-if: error
- radar/no-collection-size-mischeck: error
- radar/no-duplicate-string: error
- radar/no-duplicated-branches: error
- radar/no-element-overwrite: error
- radar/no-extra-arguments: error
- radar/no-identical-conditions: error
- radar/no-identical-expressions: error
- radar/no-identical-functions: error
- radar/no-inverted-boolean-check: error
- radar/no-one-iteration-loop: error
- radar/no-redundant-boolean: error
- radar/no-redundant-jump: error
- radar/no-same-line-conditional: error
- radar/no-small-switch: error
- radar/no-unused-collection: error
- radar/no-use-of-empty-return-value: error
- radar/no-useless-catch: error
- radar/prefer-immediate-return: error
- radar/prefer-object-literal: error
- radar/prefer-single-boolean-return: error
- radar/prefer-while: error
+extends: 'plugin:sonarjs/recommended'
diff --git a/tgui/.eslintrc.yml b/tgui/.eslintrc.yml
index fc7385b68b..4ff25c1f7f 100644
--- a/tgui/.eslintrc.yml
+++ b/tgui/.eslintrc.yml
@@ -11,12 +11,13 @@ env:
browser: true
node: true
plugins:
- - radar
+ - sonarjs
- react
- unused-imports
+ - simple-import-sort
settings:
react:
- version: '16.10'
+ version: '18.2'
rules:
## Possible Errors
## ----------------------------------------
@@ -308,13 +309,16 @@ rules:
## Enforce or disallow capitalization of the first letter of a comment
# capitalized-comments: error
## Require or disallow trailing commas
- comma-dangle: [error, {
- arrays: always-multiline,
- objects: always-multiline,
- imports: always-multiline,
- exports: always-multiline,
- functions: only-multiline, ## Optional on functions
- }]
+ comma-dangle: [
+ error,
+ {
+ arrays: always-multiline,
+ objects: always-multiline,
+ imports: always-multiline,
+ exports: always-multiline,
+ functions: only-multiline, ## Optional on functions
+ },
+ ]
## Enforce consistent spacing before and after commas
comma-spacing: [error, { before: false, after: true }]
## Enforce consistent comma style
@@ -761,3 +765,6 @@ rules:
## 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
+ ## https://github.com/lydell/eslint-plugin-simple-import-sort/
+ simple-import-sort/imports: error
+ simple-import-sort/exports: error
diff --git a/tgui/.prettierignore b/tgui/.prettierignore
index 79e703c954..a91324ebe6 100644
--- a/tgui/.prettierignore
+++ b/tgui/.prettierignore
@@ -6,6 +6,7 @@
/yarn.lock
/.pnp.*
+.swcrc
/docs
/public
/packages/tgui-polyfill
diff --git a/tgui/.prettierrc.yml b/tgui/.prettierrc.yml
index 1eebe6098b..0176969226 100644
--- a/tgui/.prettierrc.yml
+++ b/tgui/.prettierrc.yml
@@ -1,15 +1 @@
-arrowParens: always
-breakLongMethodChains: true
-endOfLine: lf
-importFormatting: oneline
-jsxBracketSameLine: true
-jsxSingleQuote: false
-offsetTernaryExpressions: true
-printWidth: 80
-proseWrap: preserve
-quoteProps: preserve
-semi: true
singleQuote: true
-tabWidth: 2
-trailingComma: es5
-useTabs: false
diff --git a/tgui/.swcrc b/tgui/.swcrc
new file mode 100644
index 0000000000..c0402a41f0
--- /dev/null
+++ b/tgui/.swcrc
@@ -0,0 +1,15 @@
+{
+ "$schema": "https://json.schemastore.org/swcrc",
+ "jsc": {
+ "loose": true,
+ "parser": {
+ "syntax": "typescript",
+ "tsx": true
+ },
+ "transform": {
+ "react": {
+ "runtime": "automatic"
+ }
+ }
+ }
+}
diff --git a/tgui/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs b/tgui/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
deleted file mode 100644
index 527659ff97..0000000000
--- a/tgui/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
+++ /dev/null
@@ -1,363 +0,0 @@
-/* eslint-disable */
-//prettier-ignore
-module.exports = {
-name: "@yarnpkg/plugin-interactive-tools",
-factory: function (require) {
-var plugin=(()=>{var PR=Object.create,J1=Object.defineProperty,MR=Object.defineProperties,FR=Object.getOwnPropertyDescriptor,LR=Object.getOwnPropertyDescriptors,RR=Object.getOwnPropertyNames,hh=Object.getOwnPropertySymbols,NR=Object.getPrototypeOf,Z4=Object.prototype.hasOwnProperty,aD=Object.prototype.propertyIsEnumerable;var dD=(i,u,f)=>u in i?J1(i,u,{enumerable:!0,configurable:!0,writable:!0,value:f}):i[u]=f,dt=(i,u)=>{for(var f in u||(u={}))Z4.call(u,f)&&dD(i,f,u[f]);if(hh)for(var f of hh(u))aD.call(u,f)&&dD(i,f,u[f]);return i},zn=(i,u)=>MR(i,LR(u)),BR=i=>J1(i,"__esModule",{value:!0});var Si=(i,u)=>{var f={};for(var c in i)Z4.call(i,c)&&u.indexOf(c)<0&&(f[c]=i[c]);if(i!=null&&hh)for(var c of hh(i))u.indexOf(c)<0&&aD.call(i,c)&&(f[c]=i[c]);return f};var Me=(i,u)=>()=>(u||i((u={exports:{}}).exports,u),u.exports),jR=(i,u)=>{for(var f in u)J1(i,f,{get:u[f],enumerable:!0})},UR=(i,u,f)=>{if(u&&typeof u=="object"||typeof u=="function")for(let c of RR(u))!Z4.call(i,c)&&c!=="default"&&J1(i,c,{get:()=>u[c],enumerable:!(f=FR(u,c))||f.enumerable});return i},Er=i=>UR(BR(J1(i!=null?PR(NR(i)):{},"default",i&&i.__esModule&&"default"in i?{get:()=>i.default,enumerable:!0}:{value:i,enumerable:!0})),i);var ey=Me((YH,pD)=>{"use strict";var hD=Object.getOwnPropertySymbols,qR=Object.prototype.hasOwnProperty,zR=Object.prototype.propertyIsEnumerable;function WR(i){if(i==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(i)}function HR(){try{if(!Object.assign)return!1;var i=new String("abc");if(i[5]="de",Object.getOwnPropertyNames(i)[0]==="5")return!1;for(var u={},f=0;f<10;f++)u["_"+String.fromCharCode(f)]=f;var c=Object.getOwnPropertyNames(u).map(function(t){return u[t]});if(c.join("")!=="0123456789")return!1;var g={};return"abcdefghijklmnopqrst".split("").forEach(function(t){g[t]=t}),Object.keys(Object.assign({},g)).join("")==="abcdefghijklmnopqrst"}catch(t){return!1}}pD.exports=HR()?Object.assign:function(i,u){for(var f,c=WR(i),g,t=1;t{"use strict";var ty=ey(),as=typeof Symbol=="function"&&Symbol.for,Q1=as?Symbol.for("react.element"):60103,bR=as?Symbol.for("react.portal"):60106,GR=as?Symbol.for("react.fragment"):60107,VR=as?Symbol.for("react.strict_mode"):60108,YR=as?Symbol.for("react.profiler"):60114,$R=as?Symbol.for("react.provider"):60109,KR=as?Symbol.for("react.context"):60110,XR=as?Symbol.for("react.forward_ref"):60112,JR=as?Symbol.for("react.suspense"):60113,QR=as?Symbol.for("react.memo"):60115,ZR=as?Symbol.for("react.lazy"):60116,mD=typeof Symbol=="function"&&Symbol.iterator;function Z1(i){for(var u="https://reactjs.org/docs/error-decoder.html?invariant="+i,f=1;fmh.length&&mh.push(i)}function uy(i,u,f,c){var g=typeof i;(g==="undefined"||g==="boolean")&&(i=null);var t=!1;if(i===null)t=!0;else switch(g){case"string":case"number":t=!0;break;case"object":switch(i.$$typeof){case Q1:case bR:t=!0}}if(t)return f(c,i,u===""?"."+sy(i,0):u),1;if(t=0,u=u===""?".":u+":",Array.isArray(i))for(var C=0;C{"use strict";kD.exports=xD()});var AD=Me((ga,e2)=>{(function(){var i,u="4.17.21",f=200,c="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",g="Expected a function",t="Invalid `variable` option passed into `_.template`",C="__lodash_hash_undefined__",A=500,x="__lodash_placeholder__",D=1,L=2,N=4,j=1,$=2,h=1,re=2,ce=4,Q=8,oe=16,Se=32,me=64,De=128,J=256,Te=512,Oe=30,Le="...",ot=800,ct=16,Ue=1,be=2,At=3,Ot=1/0,Nt=9007199254740991,Je=17976931348623157e292,V=0/0,ne=4294967295,ge=ne-1,Z=ne>>>1,Ae=[["ary",De],["bind",h],["bindKey",re],["curry",Q],["curryRight",oe],["flip",Te],["partial",Se],["partialRight",me],["rearg",J]],at="[object Arguments]",it="[object Array]",Ft="[object AsyncFunction]",jt="[object Boolean]",hn="[object Date]",Un="[object DOMException]",Jt="[object Error]",Yt="[object Function]",cr="[object GeneratorFunction]",w="[object Map]",pt="[object Number]",Mn="[object Null]",Bn="[object Object]",Xn="[object Promise]",vr="[object Proxy]",gr="[object RegExp]",r0="[object Set]",Ci="[object String]",yo="[object Symbol]",Ds="[object Undefined]",Mu="[object WeakMap]",Gf="[object WeakSet]",iu="[object ArrayBuffer]",ou="[object DataView]",ol="[object Float32Array]",ul="[object Float64Array]",Es="[object Int8Array]",Uo="[object Int16Array]",sl="[object Int32Array]",Ss="[object Uint8Array]",Cs="[object Uint8ClampedArray]",Ti="[object Uint16Array]",Fu="[object Uint32Array]",ll=/\b__p \+= '';/g,fl=/\b(__p \+=) '' \+/g,cl=/(__e\(.*?\)|\b__t\)) \+\n'';/g,al=/&(?:amp|lt|gt|quot|#39);/g,Ui=/[&<>"']/g,Mr=RegExp(al.source),Ac=RegExp(Ui.source),of=/<%-([\s\S]+?)%>/g,Ts=/<%([\s\S]+?)%>/g,xs=/<%=([\s\S]+?)%>/g,dl=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,qi=/^\w*$/,qo=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,kr=/[\\^$.*+?()[\]{}|]/g,Fr=RegExp(kr.source),si=/^\s+/,H0=/\s/,b0=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Bt=/\{\n\/\* \[wrapped with (.+)\] \*/,Lu=/,? & /,c0=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Ru=/[()=,{}\[\]\/\s]/,ks=/\\(\\)?/g,As=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,uu=/\w*$/,wo=/^[-+]0x[0-9a-f]+$/i,zo=/^0b[01]+$/i,Os=/^\[object .+?Constructor\]$/,Is=/^0o[0-7]+$/i,uf=/^(?:0|[1-9]\d*)$/,_n=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Nu=/($^)/,Wo=/['\n\r\u2028\u2029\\]/g,su="\\ud800-\\udfff",Ps="\\u0300-\\u036f",pl="\\ufe20-\\ufe2f",Vf="\\u20d0-\\u20ff",hl=Ps+pl+Vf,Bu="\\u2700-\\u27bf",ju="a-z\\xdf-\\xf6\\xf8-\\xff",sf="\\xac\\xb1\\xd7\\xf7",ro="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",Ms="\\u2000-\\u206f",ml=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Uu="A-Z\\xc0-\\xd6\\xd8-\\xde",G0="\\ufe0e\\ufe0f",Fs=sf+ro+Ms+ml,tt="['\u2019]",zi="["+su+"]",lu="["+Fs+"]",Ho="["+hl+"]",O0="\\d+",vl="["+Bu+"]",gl="["+ju+"]",fu="[^"+su+Fs+O0+Bu+ju+Uu+"]",_l="\\ud83c[\\udffb-\\udfff]",Sn="(?:"+Ho+"|"+_l+")",gt="[^"+su+"]",en="(?:\\ud83c[\\udde6-\\uddff]){2}",I0="[\\ud800-\\udbff][\\udc00-\\udfff]",li="["+Uu+"]",qu="\\u200d",Wi="(?:"+gl+"|"+fu+")",zu="(?:"+li+"|"+fu+")",Wu="(?:"+tt+"(?:d|ll|m|re|s|t|ve))?",Ls="(?:"+tt+"(?:D|LL|M|RE|S|T|VE))?",fi=Sn+"?",e0="["+G0+"]?",io="(?:"+qu+"(?:"+[gt,en,I0].join("|")+")"+e0+fi+")*",D0="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",Do="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",i0=e0+fi+io,Rs="(?:"+[vl,en,I0].join("|")+")"+i0,a0="(?:"+[gt+Ho+"?",Ho,en,I0,zi].join("|")+")",Hu=RegExp(tt,"g"),V0=RegExp(Ho,"g"),bu=RegExp(_l+"(?="+_l+")|"+a0+i0,"g"),Ns=RegExp([li+"?"+gl+"+"+Wu+"(?="+[lu,li,"$"].join("|")+")",zu+"+"+Ls+"(?="+[lu,li+Wi,"$"].join("|")+")",li+"?"+Wi+"+"+Wu,li+"+"+Ls,Do,D0,O0,Rs].join("|"),"g"),bo=RegExp("["+qu+su+hl+G0+"]"),P0=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,ln=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],lf=-1,nr={};nr[ol]=nr[ul]=nr[Es]=nr[Uo]=nr[sl]=nr[Ss]=nr[Cs]=nr[Ti]=nr[Fu]=!0,nr[at]=nr[it]=nr[iu]=nr[jt]=nr[ou]=nr[hn]=nr[Jt]=nr[Yt]=nr[w]=nr[pt]=nr[Bn]=nr[gr]=nr[r0]=nr[Ci]=nr[Mu]=!1;var rr={};rr[at]=rr[it]=rr[iu]=rr[ou]=rr[jt]=rr[hn]=rr[ol]=rr[ul]=rr[Es]=rr[Uo]=rr[sl]=rr[w]=rr[pt]=rr[Bn]=rr[gr]=rr[r0]=rr[Ci]=rr[yo]=rr[Ss]=rr[Cs]=rr[Ti]=rr[Fu]=!0,rr[Jt]=rr[Yt]=rr[Mu]=!1;var Go={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},Gu={"&":"&","<":"<",">":">",'"':""","'":"'"},yl={"&":"&","<":"<",">":">",""":'"',"'":"'"},cu={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Bs=parseFloat,Vu=parseInt,M0=typeof global=="object"&&global&&global.Object===Object&&global,au=typeof self=="object"&&self&&self.Object===Object&&self,Lr=M0||au||Function("return this")(),F=typeof ga=="object"&&ga&&!ga.nodeType&&ga,R=F&&typeof e2=="object"&&e2&&!e2.nodeType&&e2,U=R&&R.exports===F,H=U&&M0.process,fe=function(){try{var ae=R&&R.require&&R.require("util").types;return ae||H&&H.binding&&H.binding("util")}catch(Be){}}(),ue=fe&&fe.isArrayBuffer,de=fe&&fe.isDate,W=fe&&fe.isMap,ve=fe&&fe.isRegExp,Fe=fe&&fe.isSet,Ge=fe&&fe.isTypedArray;function K(ae,Be,Ie){switch(Ie.length){case 0:return ae.call(Be);case 1:return ae.call(Be,Ie[0]);case 2:return ae.call(Be,Ie[0],Ie[1]);case 3:return ae.call(Be,Ie[0],Ie[1],Ie[2])}return ae.apply(Be,Ie)}function xe(ae,Be,Ie,ht){for(var mt=-1,wn=ae==null?0:ae.length;++mt-1}function wt(ae,Be,Ie){for(var ht=-1,mt=ae==null?0:ae.length;++ht-1;);return Ie}function js(ae,Be){for(var Ie=ae.length;Ie--&&Qe(Be,ae[Ie],0)>-1;);return Ie}function Dl(ae,Be){for(var Ie=ae.length,ht=0;Ie--;)ae[Ie]===Be&&++ht;return ht}var du=Cn(Go),Yu=Cn(Gu);function Us(ae){return"\\"+cu[ae]}function oo(ae,Be){return ae==null?i:ae[Be]}function Hi(ae){return bo.test(ae)}function qs(ae){return P0.test(ae)}function F0(ae){for(var Be,Ie=[];!(Be=ae.next()).done;)Ie.push(Be.value);return Ie}function Gr(ae){var Be=-1,Ie=Array(ae.size);return ae.forEach(function(ht,mt){Ie[++Be]=[mt,ht]}),Ie}function ir(ae,Be){return function(Ie){return ae(Be(Ie))}}function L0(ae,Be){for(var Ie=-1,ht=ae.length,mt=0,wn=[];++Ie-1}function Ju(a,p){var E=this.__data__,I=hf(E,a);return I<0?(++this.size,E.push([a,p])):E[I][1]=p,this}Z0.prototype.clear=df,Z0.prototype.delete=Ba,Z0.prototype.get=Oc,Z0.prototype.has=mu,Z0.prototype.set=Ju;function ei(a){var p=-1,E=a==null?0:a.length;for(this.clear();++p=p?a:p)),a}function vi(a,p,E,I,B,G){var te,se=p&D,Ee=p&L,$e=p&N;if(E&&(te=B?E(a,I,B,G):E(a)),te!==i)return te;if(!Jr(a))return a;var Ke=On(a);if(Ke){if(te=f1(a),!se)return Xr(a,te)}else{var nt=U0(a),Ct=nt==Yt||nt==cr;if(Eu(a))return Od(a,se);if(nt==Bn||nt==at||Ct&&!B){if(te=Ee||Ct?{}:zd(a),!se)return Ee?Zu(a,Wa(te,a)):j0(a,mf(te,a))}else{if(!rr[nt])return B?a:{};te=Wd(a,nt,se)}}G||(G=new co);var Gt=G.get(a);if(Gt)return Gt;G.set(a,te),kp(a)?a.forEach(function(dn){te.add(vi(dn,p,E,dn,a,G))}):Tp(a)&&a.forEach(function(dn,Yn){te.set(Yn,vi(dn,p,E,Yn,a,G))});var an=$e?Ee?Dn:r1:Ee?Yi:q0,qn=Ke?i:an(a);return je(qn||a,function(dn,Yn){qn&&(Yn=dn,dn=a[Yn]),xl(te,Yn,vi(dn,p,E,Yn,a,G))}),te}function Xf(a){var p=q0(a);return function(E){return Rc(E,a,p)}}function Rc(a,p,E){var I=E.length;if(a==null)return!I;for(a=$t(a);I--;){var B=E[I],G=p[B],te=a[B];if(te===i&&!(B in a)||!G(te))return!1}return!0}function Jf(a,p,E){if(typeof a!="function")throw new Yr(g);return wf(function(){a.apply(i,E)},p)}function ao(a,p,E,I){var B=-1,G=xt,te=!0,se=a.length,Ee=[],$e=p.length;if(!se)return Ee;E&&(p=lt(p,qr(E))),I?(G=wt,te=!1):p.length>=f&&(G=So,te=!1,p=new vu(p));e:for(;++BB?0:B+E),I=I===i||I>B?B:jn(I),I<0&&(I+=B),I=E>I?0:Ip(I);E0&&E(se)?p>1?k0(se,p-1,E,I,B):Rt(B,se):I||(B[B.length]=se)}return B}var v=ec(),m=ec(!0);function S(a,p){return a&&v(a,p,q0)}function O(a,p){return a&&m(a,p,q0)}function M(a,p){return st(p,function(E){return rs(a[E])})}function b(a,p){p=Gs(p,a);for(var E=0,I=p.length;a!=null&&Ep}function ut(a,p){return a!=null&&or.call(a,p)}function In(a,p){return a!=null&&p in $t(a)}function A0(a,p,E){return a>=kn(p,E)&&a=120&&Ke.length>=120)?new vu(te&&Ke):i}Ke=a[0];var nt=-1,Ct=se[0];e:for(;++nt-1;)se!==a&&C0.call(se,Ee,1),C0.call(a,Ee,1);return a}function jc(a,p){for(var E=a?p.length:0,I=E-1;E--;){var B=p[E];if(E==I||B!==G){var G=B;es(B)?C0.call(a,B,1):$a(a,B)}}return a}function Ga(a,p){return a+hu(Ai()*(p-a+1))}function Lm(a,p,E,I){for(var B=-1,G=wr(B0((p-a)/(E||1)),0),te=Ie(G);G--;)te[I?G:++B]=a,a+=E;return te}function Va(a,p){var E="";if(!a||p<1||p>Nt)return E;do p%2&&(E+=a),p=hu(p/2),p&&(a+=a);while(p);return E}function Wn(a,p){return m1(Gd(a,p,$i),a+"")}function wd(a){return Fc(Ef(a))}function Dd(a,p){var E=Ef(a);return Yc(E,mi(p,0,E.length))}function Ol(a,p,E,I){if(!Jr(a))return a;p=Gs(p,a);for(var B=-1,G=p.length,te=G-1,se=a;se!=null&&++BB?0:B+p),E=E>B?B:E,E<0&&(E+=B),B=p>E?0:E-p>>>0,p>>>=0;for(var G=Ie(B);++I>>1,te=a[G];te!==null&&!mo(te)&&(E?te<=p:te=f){var $e=p?null:bm(a);if($e)return Y0($e);te=!1,B=So,Ee=new vu}else Ee=p?[]:se;e:for(;++I=I?a:Oo(a,p,E)}var Ad=pu||function(a){return Lr.clearTimeout(a)};function Od(a,p){if(p)return a.slice();var E=a.length,I=Nr?Nr(E):new a.constructor(E);return a.copy(I),I}function Qa(a){var p=new a.constructor(a.byteLength);return new R0(p).set(new R0(a)),p}function jm(a,p){var E=p?Qa(a.buffer):a.buffer;return new a.constructor(E,a.byteOffset,a.byteLength)}function Um(a){var p=new a.constructor(a.source,uu.exec(a));return p.lastIndex=a.lastIndex,p}function qm(a){return Wr?$t(Wr.call(a)):{}}function Id(a,p){var E=p?Qa(a.buffer):a.buffer;return new a.constructor(E,a.byteOffset,a.length)}function Pd(a,p){if(a!==p){var E=a!==i,I=a===null,B=a===a,G=mo(a),te=p!==i,se=p===null,Ee=p===p,$e=mo(p);if(!se&&!$e&&!G&&a>p||G&&te&&Ee&&!se&&!$e||I&&te&&Ee||!E&&Ee||!B)return 1;if(!I&&!G&&!$e&&a=se)return Ee;var $e=E[I];return Ee*($e=="desc"?-1:1)}}return a.index-p.index}function gf(a,p,E,I){for(var B=-1,G=a.length,te=E.length,se=-1,Ee=p.length,$e=wr(G-te,0),Ke=Ie(Ee+$e),nt=!I;++se1?E[B-1]:i,te=B>2?E[2]:i;for(G=a.length>3&&typeof G=="function"?(B--,G):i,te&&Ii(E[0],E[1],te)&&(G=B<3?i:G,B=1),p=$t(p);++I-1?B[G?p[te]:te]:i}}function Rd(a){return yu(function(p){var E=p.length,I=E,B=Qn.prototype.thru;for(a&&p.reverse();I--;){var G=p[I];if(typeof G!="function")throw new Yr(g);if(B&&!te&&Gc(G)=="wrapper")var te=new Qn([],!0)}for(I=te?I:E;++I1&&er.reverse(),Ke&&Eese))return!1;var $e=G.get(a),Ke=G.get(p);if($e&&Ke)return $e==p&&Ke==a;var nt=-1,Ct=!0,Gt=E&$?new vu:i;for(G.set(a,p),G.set(p,a);++nt1?"& ":"")+p[I],p=p.join(E>2?", ":" "),a.replace(b0,`{
-/* [wrapped with `+p+`] */
-`)}function Xm(a){return On(a)||Ll(a)||!!(di&&a&&a[di])}function es(a,p){var E=typeof a;return p=p==null?Nt:p,!!p&&(E=="number"||E!="symbol"&&uf.test(a))&&a>-1&&a%1==0&&a0){if(++p>=ot)return arguments[0]}else p=0;return a.apply(i,arguments)}}function Yc(a,p){var E=-1,I=a.length,B=I-1;for(p=p===i?I:p;++E
1?a[p-1]:i;return E=typeof E=="function"?(a.pop(),E):i,sp(a,E)});function fp(a){var p=z(a);return p.__chain__=!0,p}function cp(a,p){return p(a),a}function Kc(a,p){return p(a)}var Wv=yu(function(a){var p=a.length,E=p?a[0]:0,I=this.__wrapped__,B=function(G){return Hs(G,a)};return p>1||this.__actions__.length||!(I instanceof nn)||!es(E)?this.thru(B):(I=I.slice(E,+E+(p?1:0)),I.__actions__.push({func:Kc,args:[B],thisArg:i}),new Qn(I,this.__chain__).thru(function(G){return p&&!G.length&&G.push(i),G}))});function Hv(){return fp(this)}function bv(){return new Qn(this.value(),this.__chain__)}function Gv(){this.__values__===i&&(this.__values__=Op(this.value()));var a=this.__index__>=this.__values__.length,p=a?i:this.__values__[this.__index__++];return{done:a,value:p}}function Vv(){return this}function Yv(a){for(var p,E=this;E instanceof Or;){var I=Jd(E);I.__index__=0,I.__values__=i,p?B.__wrapped__=I:p=I;var B=I;E=E.__wrapped__}return B.__wrapped__=a,p}function Ml(){var a=this.__wrapped__;if(a instanceof nn){var p=a;return this.__actions__.length&&(p=new nn(this)),p=p.reverse(),p.__actions__.push({func:Kc,args:[g1],thisArg:i}),new Qn(p,this.__chain__)}return this.thru(g1)}function Fl(){return xd(this.__wrapped__,this.__actions__)}var Xc=_f(function(a,p,E){or.call(a,E)?++a[E]:ti(a,E,1)});function $v(a,p,E){var I=On(a)?rt:Nc;return E&&Ii(a,p,E)&&(p=i),I(a,cn(p,3))}function Kv(a,p){var E=On(a)?st:Qf;return E(a,cn(p,3))}var Xv=Ld(Qd),D1=Ld($c);function Jv(a,p){return k0(Jc(a,p),1)}function Qv(a,p){return k0(Jc(a,p),Ot)}function ap(a,p,E){return E=E===i?1:jn(E),k0(Jc(a,p),E)}function dp(a,p){var E=On(a)?je:$o;return E(a,cn(p,3))}function pp(a,p){var E=On(a)?Xe:kl;return E(a,cn(p,3))}var Zv=_f(function(a,p,E){or.call(a,E)?a[E].push(p):ti(a,E,[p])});function eg(a,p,E,I){a=Vi(a)?a:Ef(a),E=E&&!I?jn(E):0;var B=a.length;return E<0&&(E=wr(B+E,0)),ia(a)?E<=B&&a.indexOf(p,E)>-1:!!B&&Qe(a,p,E)>-1}var tg=Wn(function(a,p,E){var I=-1,B=typeof p=="function",G=Vi(a)?Ie(a.length):[];return $o(a,function(te){G[++I]=B?K(p,te,E):po(te,p,E)}),G}),hp=_f(function(a,p,E){ti(a,E,p)});function Jc(a,p){var E=On(a)?lt:vd;return E(a,cn(p,3))}function ng(a,p,E,I){return a==null?[]:(On(p)||(p=p==null?[]:[p]),E=I?i:E,On(E)||(E=E==null?[]:[E]),Oi(a,p,E))}var rg=_f(function(a,p,E){a[E?0:1].push(p)},function(){return[[],[]]});function mp(a,p,E){var I=On(a)?yn:bn,B=arguments.length<3;return I(a,cn(p,4),E,B,$o)}function ig(a,p,E){var I=On(a)?sn:bn,B=arguments.length<3;return I(a,cn(p,4),E,B,kl)}function og(a,p){var E=On(a)?st:Qf;return E(a,Zc(cn(p,3)))}function ug(a){var p=On(a)?Fc:wd;return p(a)}function sg(a,p,E){(E?Ii(a,p,E):p===i)?p=1:p=jn(p);var I=On(a)?Lc:Dd;return I(a,p)}function lg(a){var p=On(a)?Kf:Ao;return p(a)}function E1(a){if(a==null)return 0;if(Vi(a))return ia(a)?Rr(a):a.length;var p=U0(a);return p==w||p==r0?a.size:Zf(a).length}function fg(a,p,E){var I=On(a)?ar:Nm;return E&&Ii(a,p,E)&&(p=i),I(a,cn(p,3))}var cg=Wn(function(a,p){if(a==null)return[];var E=p.length;return E>1&&Ii(a,p[0],p[1])?p=[]:E>2&&Ii(p[0],p[1],p[2])&&(p=[p[0]]),Oi(a,k0(p,1),[])}),rc=Sl||function(){return Lr.Date.now()};function ag(a,p){if(typeof p!="function")throw new Yr(g);return a=jn(a),function(){if(--a<1)return p.apply(this,arguments)}}function vp(a,p,E){return p=E?i:p,p=a&&p==null?a.length:p,Lt(a,De,i,i,i,i,p)}function gp(a,p){var E;if(typeof p!="function")throw new Yr(g);return a=jn(a),function(){return--a>0&&(E=p.apply(this,arguments)),a<=1&&(p=i),E}}var S1=Wn(function(a,p,E){var I=h;if(E.length){var B=L0(E,An(S1));I|=Se}return Lt(a,I,p,E,B)}),_p=Wn(function(a,p,E){var I=h|re;if(E.length){var B=L0(E,An(_p));I|=Se}return Lt(p,I,a,E,B)});function C1(a,p,E){p=E?i:p;var I=Lt(a,Q,i,i,i,i,i,p);return I.placeholder=C1.placeholder,I}function yp(a,p,E){p=E?i:p;var I=Lt(a,oe,i,i,i,i,i,p);return I.placeholder=yp.placeholder,I}function wp(a,p,E){var I,B,G,te,se,Ee,$e=0,Ke=!1,nt=!1,Ct=!0;if(typeof a!="function")throw new Yr(g);p=Fo(p)||0,Jr(E)&&(Ke=!!E.leading,nt="maxWait"in E,G=nt?wr(Fo(E.maxWait)||0,p):G,Ct="trailing"in E?!!E.trailing:Ct);function Gt(f0){var Jo=I,Su=B;return I=B=i,$e=f0,te=a.apply(Su,Jo),te}function an(f0){return $e=f0,se=wf(Yn,p),Ke?Gt(f0):te}function qn(f0){var Jo=f0-Ee,Su=f0-$e,Zp=p-Jo;return nt?kn(Zp,G-Su):Zp}function dn(f0){var Jo=f0-Ee,Su=f0-$e;return Ee===i||Jo>=p||Jo<0||nt&&Su>=G}function Yn(){var f0=rc();if(dn(f0))return er(f0);se=wf(Yn,qn(f0))}function er(f0){return se=i,Ct&&I?Gt(f0):(I=B=i,te)}function vo(){se!==i&&Ad(se),$e=0,I=Ee=B=se=i}function Pi(){return se===i?te:er(rc())}function Mi(){var f0=rc(),Jo=dn(f0);if(I=arguments,B=this,Ee=f0,Jo){if(se===i)return an(Ee);if(nt)return Ad(se),se=wf(Yn,p),Gt(Ee)}return se===i&&(se=wf(Yn,p)),te}return Mi.cancel=vo,Mi.flush=Pi,Mi}var dg=Wn(function(a,p){return Jf(a,1,p)}),Dp=Wn(function(a,p,E){return Jf(a,Fo(p)||0,E)});function pg(a){return Lt(a,Te)}function Qc(a,p){if(typeof a!="function"||p!=null&&typeof p!="function")throw new Yr(g);var E=function(){var I=arguments,B=p?p.apply(this,I):I[0],G=E.cache;if(G.has(B))return G.get(B);var te=a.apply(this,I);return E.cache=G.set(B,te)||G,te};return E.cache=new(Qc.Cache||ei),E}Qc.Cache=ei;function Zc(a){if(typeof a!="function")throw new Yr(g);return function(){var p=arguments;switch(p.length){case 0:return!a.call(this);case 1:return!a.call(this,p[0]);case 2:return!a.call(this,p[0],p[1]);case 3:return!a.call(this,p[0],p[1],p[2])}return!a.apply(this,p)}}function ea(a){return gp(2,a)}var hg=Bm(function(a,p){p=p.length==1&&On(p[0])?lt(p[0],qr(cn())):lt(k0(p,1),qr(cn()));var E=p.length;return Wn(function(I){for(var B=-1,G=kn(I.length,E);++B=p}),Ll=_i(function(){return arguments}())?_i:function(a){return n0(a)&&or.call(a,"callee")&&!N0.call(a,"callee")},On=Ie.isArray,x1=ue?qr(ue):Re;function Vi(a){return a!=null&&na(a.length)&&!rs(a)}function l0(a){return n0(a)&&Vi(a)}function kg(a){return a===!0||a===!1||n0(a)&&Ye(a)==jt}var Eu=pi||W1,Ag=de?qr(de):Ce;function Og(a){return n0(a)&&a.nodeType===1&&!ic(a)}function Cp(a){if(a==null)return!0;if(Vi(a)&&(On(a)||typeof a=="string"||typeof a.splice=="function"||Eu(a)||Df(a)||Ll(a)))return!a.length;var p=U0(a);if(p==w||p==r0)return!a.size;if(nc(a))return!Zf(a).length;for(var E in a)if(or.call(a,E))return!1;return!0}function Ig(a,p){return ze(a,p)}function Pg(a,p,E){E=typeof E=="function"?E:i;var I=E?E(a,p):i;return I===i?ze(a,p,i,E):!!I}function k1(a){if(!n0(a))return!1;var p=Ye(a);return p==Jt||p==Un||typeof a.message=="string"&&typeof a.name=="string"&&!ic(a)}function Mg(a){return typeof a=="number"&&Br(a)}function rs(a){if(!Jr(a))return!1;var p=Ye(a);return p==Yt||p==cr||p==Ft||p==vr}function A1(a){return typeof a=="number"&&a==jn(a)}function na(a){return typeof a=="number"&&a>-1&&a%1==0&&a<=Nt}function Jr(a){var p=typeof a;return a!=null&&(p=="object"||p=="function")}function n0(a){return a!=null&&typeof a=="object"}var Tp=W?qr(W):on;function Fg(a,p){return a===p||sr(a,p,Nn(p))}function Lg(a,p,E){return E=typeof E=="function"?E:i,sr(a,p,Nn(p),E)}function Rg(a){return xp(a)&&a!=+a}function Ng(a){if(Zm(a))throw new mt(c);return mn(a)}function Bg(a){return a===null}function O1(a){return a==null}function xp(a){return typeof a=="number"||n0(a)&&Ye(a)==pt}function ic(a){if(!n0(a)||Ye(a)!=Bn)return!1;var p=uo(a);if(p===null)return!0;var E=or.call(p,"constructor")&&p.constructor;return typeof E=="function"&&E instanceof E&&bi.call(E)==af}var ra=ve?qr(ve):pr;function jg(a){return A1(a)&&a>=-Nt&&a<=Nt}var kp=Fe?qr(Fe):Hr;function ia(a){return typeof a=="string"||!On(a)&&n0(a)&&Ye(a)==Ci}function mo(a){return typeof a=="symbol"||n0(a)&&Ye(a)==yo}var Df=Ge?qr(Ge):Vn;function Ap(a){return a===i}function Ug(a){return n0(a)&&U0(a)==Mu}function qg(a){return n0(a)&&Ye(a)==Gf}var zg=bc(Ha),Wg=bc(function(a,p){return a<=p});function Op(a){if(!a)return[];if(Vi(a))return ia(a)?Jn(a):Xr(a);if(u0&&a[u0])return F0(a[u0]());var p=U0(a),E=p==w?Gr:p==r0?Y0:Ef;return E(a)}function is(a){if(!a)return a===0?a:0;if(a=Fo(a),a===Ot||a===-Ot){var p=a<0?-1:1;return p*Je}return a===a?a:0}function jn(a){var p=is(a),E=p%1;return p===p?E?p-E:p:0}function Ip(a){return a?mi(jn(a),0,ne):0}function Fo(a){if(typeof a=="number")return a;if(mo(a))return V;if(Jr(a)){var p=typeof a.valueOf=="function"?a.valueOf():a;a=Jr(p)?p+"":p}if(typeof a!="string")return a===0?a:+a;a=E0(a);var E=zo.test(a);return E||Is.test(a)?Vu(a.slice(2),E?2:8):wo.test(a)?V:+a}function oa(a){return yi(a,Yi(a))}function Hg(a){return a?mi(jn(a),-Nt,Nt):a===0?a:0}function yr(a){return a==null?"":ho(a)}var Pp=Io(function(a,p){if(nc(p)||Vi(p)){yi(p,q0(p),a);return}for(var E in p)or.call(p,E)&&xl(a,E,p[E])}),Mp=Io(function(a,p){yi(p,Yi(p),a)}),ua=Io(function(a,p,E,I){yi(p,Yi(p),a,I)}),bg=Io(function(a,p,E,I){yi(p,q0(p),a,I)}),Gg=yu(Hs);function Vg(a,p){var E=dr(a);return p==null?E:mf(E,p)}var Fp=Wn(function(a,p){a=$t(a);var E=-1,I=p.length,B=I>2?p[2]:i;for(B&&Ii(p[0],p[1],B)&&(I=1);++E1),G}),yi(a,Dn(a),E),I&&(E=vi(E,D|L|N,Gm));for(var B=p.length;B--;)$a(E,p[B]);return E});function l_(a,p){return Bp(a,Zc(cn(p)))}var f_=yu(function(a,p){return a==null?{}:Fm(a,p)});function Bp(a,p){if(a==null)return{};var E=lt(Dn(a),function(I){return[I]});return p=cn(p),yd(a,E,function(I,B){return p(I,B[0])})}function c_(a,p,E){p=Gs(p,a);var I=-1,B=p.length;for(B||(B=1,a=i);++Ip){var I=a;a=p,p=I}if(E||a%1||p%1){var B=Ai();return kn(a+B*(p-a+Bs("1e-"+((B+"").length-1))),p)}return Ga(a,p)}var __=yf(function(a,p,E){return p=p.toLowerCase(),a+(E?Wp(p):p)});function Wp(a){return L1(yr(a).toLowerCase())}function Hp(a){return a=yr(a),a&&a.replace(_n,du).replace(V0,"")}function y_(a,p,E){a=yr(a),p=ho(p);var I=a.length;E=E===i?I:mi(jn(E),0,I);var B=E;return E-=p.length,E>=0&&a.slice(E,B)==p}function M1(a){return a=yr(a),a&&Ac.test(a)?a.replace(Ui,Yu):a}function w_(a){return a=yr(a),a&&Fr.test(a)?a.replace(kr,"\\$&"):a}var D_=yf(function(a,p,E){return a+(E?"-":"")+p.toLowerCase()}),bp=yf(function(a,p,E){return a+(E?" ":"")+p.toLowerCase()}),E_=Fd("toLowerCase");function S_(a,p,E){a=yr(a),p=jn(p);var I=p?Rr(a):0;if(!p||I>=p)return a;var B=(p-I)/2;return Hc(hu(B),E)+a+Hc(B0(B),E)}function C_(a,p,E){a=yr(a),p=jn(p);var I=p?Rr(a):0;return p&&I>>0,E?(a=yr(a),a&&(typeof p=="string"||p!=null&&!ra(p))&&(p=ho(p),!p&&Hi(a))?Vs(Jn(a),0,E):a.split(p,E)):[]}var I_=yf(function(a,p,E){return a+(E?" ":"")+L1(p)});function P_(a,p,E){return a=yr(a),E=E==null?0:mi(jn(E),0,a.length),p=ho(p),a.slice(E,E+p.length)==p}function M_(a,p,E){var I=z.templateSettings;E&&Ii(a,p,E)&&(p=i),a=yr(a),p=ua({},p,I,n1);var B=ua({},p.imports,I.imports,n1),G=q0(B),te=Eo(B,G),se,Ee,$e=0,Ke=p.interpolate||Nu,nt="__p += '",Ct=X0((p.escape||Nu).source+"|"+Ke.source+"|"+(Ke===xs?As:Nu).source+"|"+(p.evaluate||Nu).source+"|$","g"),Gt="//# sourceURL="+(or.call(p,"sourceURL")?(p.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++lf+"]")+`
-`;a.replace(Ct,function(dn,Yn,er,vo,Pi,Mi){return er||(er=vo),nt+=a.slice($e,Mi).replace(Wo,Us),Yn&&(se=!0,nt+=`' +
-__e(`+Yn+`) +
-'`),Pi&&(Ee=!0,nt+=`';
-`+Pi+`;
-__p += '`),er&&(nt+=`' +
-((__t = (`+er+`)) == null ? '' : __t) +
-'`),$e=Mi+dn.length,dn}),nt+=`';
-`;var an=or.call(p,"variable")&&p.variable;if(!an)nt=`with (obj) {
-`+nt+`
-}
-`;else if(Ru.test(an))throw new mt(t);nt=(Ee?nt.replace(ll,""):nt).replace(fl,"$1").replace(cl,"$1;"),nt="function("+(an||"obj")+`) {
-`+(an?"":`obj || (obj = {});
-`)+"var __t, __p = ''"+(se?", __e = _.escape":"")+(Ee?`, __j = Array.prototype.join;
-function print() { __p += __j.call(arguments, '') }
-`:`;
-`)+nt+`return __p
-}`;var qn=$p(function(){return wn(G,Gt+"return "+nt).apply(i,te)});if(qn.source=nt,k1(qn))throw qn;return qn}function F_(a){return yr(a).toLowerCase()}function L_(a){return yr(a).toUpperCase()}function R_(a,p,E){if(a=yr(a),a&&(E||p===i))return E0(a);if(!a||!(p=ho(p)))return a;var I=Jn(a),B=Jn(p),G=wl(I,B),te=js(I,B)+1;return Vs(I,G,te).join("")}function F1(a,p,E){if(a=yr(a),a&&(E||p===i))return a.slice(0,ai(a)+1);if(!a||!(p=ho(p)))return a;var I=Jn(a),B=js(I,Jn(p))+1;return Vs(I,0,B).join("")}function N_(a,p,E){if(a=yr(a),a&&(E||p===i))return a.replace(si,"");if(!a||!(p=ho(p)))return a;var I=Jn(a),B=wl(I,Jn(p));return Vs(I,B).join("")}function B_(a,p){var E=Oe,I=Le;if(Jr(p)){var B="separator"in p?p.separator:B;E="length"in p?jn(p.length):E,I="omission"in p?ho(p.omission):I}a=yr(a);var G=a.length;if(Hi(a)){var te=Jn(a);G=te.length}if(E>=G)return a;var se=E-Rr(I);if(se<1)return I;var Ee=te?Vs(te,0,se).join(""):a.slice(0,se);if(B===i)return Ee+I;if(te&&(se+=Ee.length-se),ra(B)){if(a.slice(se).search(B)){var $e,Ke=Ee;for(B.global||(B=X0(B.source,yr(uu.exec(B))+"g")),B.lastIndex=0;$e=B.exec(Ke);)var nt=$e.index;Ee=Ee.slice(0,nt===i?se:nt)}}else if(a.indexOf(ho(B),se)!=se){var Ct=Ee.lastIndexOf(B);Ct>-1&&(Ee=Ee.slice(0,Ct))}return Ee+I}function Vp(a){return a=yr(a),a&&Mr.test(a)?a.replace(al,o0):a}var j_=yf(function(a,p,E){return a+(E?" ":"")+p.toUpperCase()}),L1=Fd("toUpperCase");function Yp(a,p,E){return a=yr(a),p=E?i:p,p===i?qs(a)?cf(a):d0(a):a.match(p)||[]}var $p=Wn(function(a,p){try{return K(a,i,p)}catch(E){return k1(E)?E:new mt(E)}}),U_=yu(function(a,p){return je(p,function(E){E=Xo(E),ti(a,E,S1(a[E],a))}),a});function Kp(a){var p=a==null?0:a.length,E=cn();return a=p?lt(a,function(I){if(typeof I[1]!="function")throw new Yr(g);return[E(I[0]),I[1]]}):[],Wn(function(I){for(var B=-1;++B
Nt)return[];var E=ne,I=kn(a,ne);p=cn(p),a-=ne;for(var B=ci(I,p);++E0||p<0)?new nn(E):(a<0?E=E.takeRight(-a):a&&(E=E.drop(a)),p!==i&&(p=jn(p),E=p<0?E.dropRight(-p):E.take(p-a)),E)},nn.prototype.takeRightWhile=function(a){return this.reverse().takeWhile(a).reverse()},nn.prototype.toArray=function(){return this.take(ne)},S(nn.prototype,function(a,p){var E=/^(?:filter|find|map|reject)|While$/.test(p),I=/^(?:head|last)$/.test(p),B=z[I?"take"+(p=="last"?"Right":""):p],G=I||/^find/.test(p);!B||(z.prototype[p]=function(){var te=this.__wrapped__,se=I?[1]:arguments,Ee=te instanceof nn,$e=se[0],Ke=Ee||On(te),nt=function(Yn){var er=B.apply(z,Rt([Yn],se));return I&&Ct?er[0]:er};Ke&&E&&typeof $e=="function"&&$e.length!=1&&(Ee=Ke=!1);var Ct=this.__chain__,Gt=!!this.__actions__.length,an=G&&!Ct,qn=Ee&&!Gt;if(!G&&Ke){te=qn?te:new nn(this);var dn=a.apply(te,se);return dn.__actions__.push({func:Kc,args:[nt],thisArg:i}),new Qn(dn,Ct)}return an&&qn?a.apply(this,se):(dn=this.thru(nt),an?I?dn.value()[0]:dn.value():dn)})}),je(["pop","push","shift","sort","splice","unshift"],function(a){var p=$r[a],E=/^(?:push|sort|unshift)$/.test(a)?"tap":"thru",I=/^(?:pop|shift)$/.test(a);z.prototype[a]=function(){var B=arguments;if(I&&!this.__chain__){var G=this.value();return p.apply(On(G)?G:[],B)}return this[E](function(te){return p.apply(On(te)?te:[],B)})}}),S(nn.prototype,function(a,p){var E=z[p];if(E){var I=E.name+"";or.call(bt,I)||(bt[I]=[]),bt[I].push({name:p,func:E})}}),bt[zc(i,re).name]=[{name:"wrapper",func:i}],nn.prototype.clone=s0,nn.prototype.reverse=t0,nn.prototype.value=g0,z.prototype.at=Wv,z.prototype.chain=Hv,z.prototype.commit=bv,z.prototype.next=Gv,z.prototype.plant=Yv,z.prototype.reverse=Ml,z.prototype.toJSON=z.prototype.valueOf=z.prototype.value=Fl,z.prototype.first=z.prototype.head,u0&&(z.prototype[u0]=Vv),z},K0=$0();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Lr._=K0,define(function(){return K0})):R?((R.exports=K0)._=K0,F._=K0):Lr._=K0}).call(ga)});var ay=Me((XH,cy)=>{"use strict";var fr=cy.exports;cy.exports.default=fr;var Pr="[",t2="]",ya="\x07",vh=";",OD=process.env.TERM_PROGRAM==="Apple_Terminal";fr.cursorTo=(i,u)=>{if(typeof i!="number")throw new TypeError("The `x` argument is required");return typeof u!="number"?Pr+(i+1)+"G":Pr+(u+1)+";"+(i+1)+"H"};fr.cursorMove=(i,u)=>{if(typeof i!="number")throw new TypeError("The `x` argument is required");let f="";return i<0?f+=Pr+-i+"D":i>0&&(f+=Pr+i+"C"),u<0?f+=Pr+-u+"A":u>0&&(f+=Pr+u+"B"),f};fr.cursorUp=(i=1)=>Pr+i+"A";fr.cursorDown=(i=1)=>Pr+i+"B";fr.cursorForward=(i=1)=>Pr+i+"C";fr.cursorBackward=(i=1)=>Pr+i+"D";fr.cursorLeft=Pr+"G";fr.cursorSavePosition=OD?"7":Pr+"s";fr.cursorRestorePosition=OD?"8":Pr+"u";fr.cursorGetPosition=Pr+"6n";fr.cursorNextLine=Pr+"E";fr.cursorPrevLine=Pr+"F";fr.cursorHide=Pr+"?25l";fr.cursorShow=Pr+"?25h";fr.eraseLines=i=>{let u="";for(let f=0;f[t2,"8",vh,vh,u,ya,i,t2,"8",vh,vh,ya].join("");fr.image=(i,u={})=>{let f=`${t2}1337;File=inline=1`;return u.width&&(f+=`;width=${u.width}`),u.height&&(f+=`;height=${u.height}`),u.preserveAspectRatio===!1&&(f+=";preserveAspectRatio=0"),f+":"+i.toString("base64")+ya};fr.iTerm={setCwd:(i=process.cwd())=>`${t2}50;CurrentDir=${i}${ya}`,annotation:(i,u={})=>{let f=`${t2}1337;`,c=typeof u.x!="undefined",g=typeof u.y!="undefined";if((c||g)&&!(c&&g&&typeof u.length!="undefined"))throw new Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");return i=i.replace(/\|/g,""),f+=u.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",u.length>0?f+=(c?[i,u.length,u.x,u.y]:[u.length,i]).join("|"):f+=i,f+ya}}});var PD=Me((JH,dy)=>{"use strict";var ID=(i,u)=>{for(let f of Reflect.ownKeys(u))Object.defineProperty(i,f,Object.getOwnPropertyDescriptor(u,f));return i};dy.exports=ID;dy.exports.default=ID});var FD=Me((QH,gh)=>{"use strict";var oN=PD(),_h=new WeakMap,MD=(i,u={})=>{if(typeof i!="function")throw new TypeError("Expected a function");let f,c=!1,g=0,t=i.displayName||i.name||"",C=function(...A){if(_h.set(C,++g),c){if(u.throw===!0)throw new Error(`Function \`${t}\` can only be called once`);return f}return c=!0,f=i.apply(this,A),i=null,f};return oN(C,i),_h.set(C,g),C};gh.exports=MD;gh.exports.default=MD;gh.exports.callCount=i=>{if(!_h.has(i))throw new Error(`The given function \`${i.name}\` is not wrapped by the \`onetime\` package`);return _h.get(i)}});var LD=Me((ZH,yh)=>{yh.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];process.platform!=="win32"&&yh.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");process.platform==="linux"&&yh.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")});var vy=Me((eb,n2)=>{var uN=require("assert"),r2=LD(),sN=/^win/i.test(process.platform),wh=require("events");typeof wh!="function"&&(wh=wh.EventEmitter);var Bi;process.__signal_exit_emitter__?Bi=process.__signal_exit_emitter__:(Bi=process.__signal_exit_emitter__=new wh,Bi.count=0,Bi.emitted={});Bi.infinite||(Bi.setMaxListeners(Infinity),Bi.infinite=!0);n2.exports=function(i,u){uN.equal(typeof i,"function","a callback must be provided for exit handler"),i2===!1&&RD();var f="exit";u&&u.alwaysLast&&(f="afterexit");var c=function(){Bi.removeListener(f,i),Bi.listeners("exit").length===0&&Bi.listeners("afterexit").length===0&&py()};return Bi.on(f,i),c};n2.exports.unload=py;function py(){!i2||(i2=!1,r2.forEach(function(i){try{process.removeListener(i,hy[i])}catch(u){}}),process.emit=my,process.reallyExit=ND,Bi.count-=1)}function wa(i,u,f){Bi.emitted[i]||(Bi.emitted[i]=!0,Bi.emit(i,u,f))}var hy={};r2.forEach(function(i){hy[i]=function(){var f=process.listeners(i);f.length===Bi.count&&(py(),wa("exit",null,i),wa("afterexit",null,i),sN&&i==="SIGHUP"&&(i="SIGINT"),process.kill(process.pid,i))}});n2.exports.signals=function(){return r2};n2.exports.load=RD;var i2=!1;function RD(){i2||(i2=!0,Bi.count+=1,r2=r2.filter(function(i){try{return process.on(i,hy[i]),!0}catch(u){return!1}}),process.emit=fN,process.reallyExit=lN)}var ND=process.reallyExit;function lN(i){process.exitCode=i||0,wa("exit",process.exitCode,null),wa("afterexit",process.exitCode,null),ND.call(process,process.exitCode)}var my=process.emit;function fN(i,u){if(i==="exit"){u!==void 0&&(process.exitCode=u);var f=my.apply(this,arguments);return wa("exit",process.exitCode,null),wa("afterexit",process.exitCode,null),f}else return my.apply(this,arguments)}});var jD=Me((tb,BD)=>{"use strict";var cN=FD(),aN=vy();BD.exports=cN(()=>{aN(()=>{process.stderr.write("[?25h")},{alwaysLast:!0})})});var gy=Me(Da=>{"use strict";var dN=jD(),Dh=!1;Da.show=(i=process.stderr)=>{!i.isTTY||(Dh=!1,i.write("[?25h"))};Da.hide=(i=process.stderr)=>{!i.isTTY||(dN(),Dh=!0,i.write("[?25l"))};Da.toggle=(i,u)=>{i!==void 0&&(Dh=i),Dh?Da.show(u):Da.hide(u)}});var WD=Me(o2=>{"use strict";var UD=o2&&o2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(o2,"__esModule",{value:!0});var qD=UD(ay()),zD=UD(gy()),pN=(i,{showCursor:u=!1}={})=>{let f=0,c="",g=!1,t=C=>{!u&&!g&&(zD.default.hide(),g=!0);let A=C+`
-`;A!==c&&(c=A,i.write(qD.default.eraseLines(f)+A),f=A.split(`
-`).length)};return t.clear=()=>{i.write(qD.default.eraseLines(f)),c="",f=0},t.done=()=>{c="",f=0,u||(zD.default.show(),g=!1)},t};o2.default={create:pN}});var bD=Me((ib,HD)=>{HD.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY_BUILD_BASE",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}}]});var YD=Me(ru=>{"use strict";var GD=bD(),nl=process.env;Object.defineProperty(ru,"_vendors",{value:GD.map(function(i){return i.constant})});ru.name=null;ru.isPR=null;GD.forEach(function(i){var u=Array.isArray(i.env)?i.env:[i.env],f=u.every(function(c){return VD(c)});if(ru[i.constant]=f,f)switch(ru.name=i.name,typeof i.pr){case"string":ru.isPR=!!nl[i.pr];break;case"object":"env"in i.pr?ru.isPR=i.pr.env in nl&&nl[i.pr.env]!==i.pr.ne:"any"in i.pr?ru.isPR=i.pr.any.some(function(c){return!!nl[c]}):ru.isPR=VD(i.pr);break;default:ru.isPR=null}});ru.isCI=!!(nl.CI||nl.CONTINUOUS_INTEGRATION||nl.BUILD_NUMBER||nl.RUN_ID||ru.name);function VD(i){return typeof i=="string"?!!nl[i]:Object.keys(i).every(function(u){return nl[u]===i[u]})}});var KD=Me((ub,$D)=>{"use strict";$D.exports=YD().isCI});var JD=Me((sb,XD)=>{"use strict";var hN=i=>{let u=new Set;do for(let f of Reflect.ownKeys(i))u.add([i,f]);while((i=Reflect.getPrototypeOf(i))&&i!==Object.prototype);return u};XD.exports=(i,{include:u,exclude:f}={})=>{let c=g=>{let t=C=>typeof C=="string"?g===C:C.test(g);return u?u.some(t):f?!f.some(t):!0};for(let[g,t]of hN(i.constructor.prototype)){if(t==="constructor"||!c(t))continue;let C=Reflect.getOwnPropertyDescriptor(g,t);C&&typeof C.value=="function"&&(i[t]=i[t].bind(i))}return i}});var iE=Me(Sr=>{"use strict";Object.defineProperty(Sr,"__esModule",{value:!0});var Ea,u2,Eh,Sh,_y;typeof window=="undefined"||typeof MessageChannel!="function"?(Sa=null,yy=null,wy=function(){if(Sa!==null)try{var i=Sr.unstable_now();Sa(!0,i),Sa=null}catch(u){throw setTimeout(wy,0),u}},QD=Date.now(),Sr.unstable_now=function(){return Date.now()-QD},Ea=function(i){Sa!==null?setTimeout(Ea,0,i):(Sa=i,setTimeout(wy,0))},u2=function(i,u){yy=setTimeout(i,u)},Eh=function(){clearTimeout(yy)},Sh=function(){return!1},_y=Sr.unstable_forceFrameRate=function(){}):(Ch=window.performance,Dy=window.Date,ZD=window.setTimeout,eE=window.clearTimeout,typeof console!="undefined"&&(tE=window.cancelAnimationFrame,typeof window.requestAnimationFrame!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),typeof tE!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")),typeof Ch=="object"&&typeof Ch.now=="function"?Sr.unstable_now=function(){return Ch.now()}:(nE=Dy.now(),Sr.unstable_now=function(){return Dy.now()-nE}),s2=!1,l2=null,Th=-1,Ey=5,Sy=0,Sh=function(){return Sr.unstable_now()>=Sy},_y=function(){},Sr.unstable_forceFrameRate=function(i){0>i||125kh(C,f))x!==void 0&&0>kh(x,C)?(i[c]=x,i[A]=f,c=A):(i[c]=C,i[t]=f,c=t);else if(x!==void 0&&0>kh(x,f))i[c]=x,i[A]=f,c=A;else break e}}return u}return null}function kh(i,u){var f=i.sortIndex-u.sortIndex;return f!==0?f:i.id-u.id}var ds=[],Nf=[],mN=1,_o=null,to=3,Oh=!1,pc=!1,f2=!1;function Ih(i){for(var u=Iu(Nf);u!==null;){if(u.callback===null)Ah(Nf);else if(u.startTime<=i)Ah(Nf),u.sortIndex=u.expirationTime,Ty(ds,u);else break;u=Iu(Nf)}}function xy(i){if(f2=!1,Ih(i),!pc)if(Iu(ds)!==null)pc=!0,Ea(ky);else{var u=Iu(Nf);u!==null&&u2(xy,u.startTime-i)}}function ky(i,u){pc=!1,f2&&(f2=!1,Eh()),Oh=!0;var f=to;try{for(Ih(u),_o=Iu(ds);_o!==null&&(!(_o.expirationTime>u)||i&&!Sh());){var c=_o.callback;if(c!==null){_o.callback=null,to=_o.priorityLevel;var g=c(_o.expirationTime<=u);u=Sr.unstable_now(),typeof g=="function"?_o.callback=g:_o===Iu(ds)&&Ah(ds),Ih(u)}else Ah(ds);_o=Iu(ds)}if(_o!==null)var t=!0;else{var C=Iu(Nf);C!==null&&u2(xy,C.startTime-u),t=!1}return t}finally{_o=null,to=f,Oh=!1}}function rE(i){switch(i){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1e4;default:return 5e3}}var vN=_y;Sr.unstable_ImmediatePriority=1;Sr.unstable_UserBlockingPriority=2;Sr.unstable_NormalPriority=3;Sr.unstable_IdlePriority=5;Sr.unstable_LowPriority=4;Sr.unstable_runWithPriority=function(i,u){switch(i){case 1:case 2:case 3:case 4:case 5:break;default:i=3}var f=to;to=i;try{return u()}finally{to=f}};Sr.unstable_next=function(i){switch(to){case 1:case 2:case 3:var u=3;break;default:u=to}var f=to;to=u;try{return i()}finally{to=f}};Sr.unstable_scheduleCallback=function(i,u,f){var c=Sr.unstable_now();if(typeof f=="object"&&f!==null){var g=f.delay;g=typeof g=="number"&&0c?(i.sortIndex=g,Ty(Nf,i),Iu(ds)===null&&i===Iu(Nf)&&(f2?Eh():f2=!0,u2(xy,g-c))):(i.sortIndex=f,Ty(ds,i),pc||Oh||(pc=!0,Ea(ky))),i};Sr.unstable_cancelCallback=function(i){i.callback=null};Sr.unstable_wrapCallback=function(i){var u=to;return function(){var f=to;to=u;try{return i.apply(this,arguments)}finally{to=f}}};Sr.unstable_getCurrentPriorityLevel=function(){return to};Sr.unstable_shouldYield=function(){var i=Sr.unstable_now();Ih(i);var u=Iu(ds);return u!==_o&&_o!==null&&u!==null&&u.callback!==null&&u.startTime<=i&&u.expirationTime<_o.expirationTime||Sh()};Sr.unstable_requestPaint=vN;Sr.unstable_continueExecution=function(){pc||Oh||(pc=!0,Ea(ky))};Sr.unstable_pauseExecution=function(){};Sr.unstable_getFirstCallbackNode=function(){return Iu(ds)};Sr.unstable_Profiling=null});var Ay=Me((fb,oE)=>{"use strict";oE.exports=iE()});var uE=Me((cb,c2)=>{c2.exports=function i(u){"use strict";var f=ey(),c=lr(),g=Ay();function t(v){for(var m="https://reactjs.org/docs/error-decoder.html?invariant="+v,S=1;Sqo||(v.current=qi[qo],qi[qo]=null,qo--)}function Fr(v,m){qo++,qi[qo]=v.current,v.current=m}var si={},H0={current:si},b0={current:!1},Bt=si;function Lu(v,m){var S=v.type.contextTypes;if(!S)return si;var O=v.stateNode;if(O&&O.__reactInternalMemoizedUnmaskedChildContext===m)return O.__reactInternalMemoizedMaskedChildContext;var M={},b;for(b in S)M[b]=m[b];return O&&(v=v.stateNode,v.__reactInternalMemoizedUnmaskedChildContext=m,v.__reactInternalMemoizedMaskedChildContext=M),M}function c0(v){return v=v.childContextTypes,v!=null}function Ru(v){kr(b0,v),kr(H0,v)}function ks(v){kr(b0,v),kr(H0,v)}function As(v,m,S){if(H0.current!==si)throw Error(t(168));Fr(H0,m,v),Fr(b0,S,v)}function uu(v,m,S){var O=v.stateNode;if(v=m.childContextTypes,typeof O.getChildContext!="function")return S;O=O.getChildContext();for(var M in O)if(!(M in v))throw Error(t(108,Oe(m)||"Unknown",M));return f({},S,{},O)}function wo(v){var m=v.stateNode;return m=m&&m.__reactInternalMemoizedMergedChildContext||si,Bt=H0.current,Fr(H0,m,v),Fr(b0,b0.current,v),!0}function zo(v,m,S){var O=v.stateNode;if(!O)throw Error(t(169));S?(m=uu(v,m,Bt),O.__reactInternalMemoizedMergedChildContext=m,kr(b0,v),kr(H0,v),Fr(H0,m,v)):kr(b0,v),Fr(b0,S,v)}var Os=g.unstable_runWithPriority,Is=g.unstable_scheduleCallback,uf=g.unstable_cancelCallback,_n=g.unstable_shouldYield,Nu=g.unstable_requestPaint,Wo=g.unstable_now,su=g.unstable_getCurrentPriorityLevel,Ps=g.unstable_ImmediatePriority,pl=g.unstable_UserBlockingPriority,Vf=g.unstable_NormalPriority,hl=g.unstable_LowPriority,Bu=g.unstable_IdlePriority,ju={},sf=Nu!==void 0?Nu:function(){},ro=null,Ms=null,ml=!1,Uu=Wo(),G0=1e4>Uu?Wo:function(){return Wo()-Uu};function Fs(){switch(su()){case Ps:return 99;case pl:return 98;case Vf:return 97;case hl:return 96;case Bu:return 95;default:throw Error(t(332))}}function tt(v){switch(v){case 99:return Ps;case 98:return pl;case 97:return Vf;case 96:return hl;case 95:return Bu;default:throw Error(t(332))}}function zi(v,m){return v=tt(v),Os(v,m)}function lu(v,m,S){return v=tt(v),Is(v,m,S)}function Ho(v){return ro===null?(ro=[v],Ms=Is(Ps,vl)):ro.push(v),ju}function O0(){if(Ms!==null){var v=Ms;Ms=null,uf(v)}vl()}function vl(){if(!ml&&ro!==null){ml=!0;var v=0;try{var m=ro;zi(99,function(){for(;v=m&&(ai=!0),v.firstContext=null)}function D0(v,m){if(zu!==v&&m!==!1&&m!==0)if((typeof m!="number"||m===1073741823)&&(zu=v,m=1073741823),m={context:v,observedBits:m,next:null},Wi===null){if(qu===null)throw Error(t(308));Wi=m,qu.dependencies={expirationTime:0,firstContext:m,responders:null}}else Wi=Wi.next=m;return Jt?v._currentValue:v._currentValue2}var Do=!1;function i0(v){return{baseState:v,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Rs(v){return{baseState:v.baseState,firstUpdate:v.firstUpdate,lastUpdate:v.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function a0(v,m){return{expirationTime:v,suspenseConfig:m,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function Hu(v,m){v.lastUpdate===null?v.firstUpdate=v.lastUpdate=m:(v.lastUpdate.next=m,v.lastUpdate=m)}function V0(v,m){var S=v.alternate;if(S===null){var O=v.updateQueue,M=null;O===null&&(O=v.updateQueue=i0(v.memoizedState))}else O=v.updateQueue,M=S.updateQueue,O===null?M===null?(O=v.updateQueue=i0(v.memoizedState),M=S.updateQueue=i0(S.memoizedState)):O=v.updateQueue=Rs(M):M===null&&(M=S.updateQueue=Rs(O));M===null||O===M?Hu(O,m):O.lastUpdate===null||M.lastUpdate===null?(Hu(O,m),Hu(M,m)):(Hu(O,m),M.lastUpdate=m)}function bu(v,m){var S=v.updateQueue;S=S===null?v.updateQueue=i0(v.memoizedState):Ns(v,S),S.lastCapturedUpdate===null?S.firstCapturedUpdate=S.lastCapturedUpdate=m:(S.lastCapturedUpdate.next=m,S.lastCapturedUpdate=m)}function Ns(v,m){var S=v.alternate;return S!==null&&m===S.updateQueue&&(m=v.updateQueue=Rs(m)),m}function bo(v,m,S,O,M,b){switch(S.tag){case 1:return v=S.payload,typeof v=="function"?v.call(b,O,M):v;case 3:v.effectTag=v.effectTag&-4097|64;case 0:if(v=S.payload,M=typeof v=="function"?v.call(b,O,M):v,M==null)break;return f({},O,M);case 2:Do=!0}return O}function P0(v,m,S,O,M){Do=!1,m=Ns(v,m);for(var b=m.baseState,ee=null,Ye=0,Ze=m.firstUpdate,ut=b;Ze!==null;){var In=Ze.expirationTime;Inpr?(Hr=mn,mn=null):Hr=mn.sibling;var Vn=jr(Re,mn,ze[pr],Et);if(Vn===null){mn===null&&(mn=Hr);break}v&&mn&&Vn.alternate===null&&m(Re,mn),Ce=b(Vn,Ce,pr),sr===null?on=Vn:sr.sibling=Vn,sr=Vn,mn=Hr}if(pr===ze.length)return S(Re,mn),on;if(mn===null){for(;prpr?(Hr=mn,mn=null):Hr=mn.sibling;var ni=jr(Re,mn,Vn.value,Et);if(ni===null){mn===null&&(mn=Hr);break}v&&mn&&ni.alternate===null&&m(Re,mn),Ce=b(ni,Ce,pr),sr===null?on=ni:sr.sibling=ni,sr=ni,mn=Hr}if(Vn.done)return S(Re,mn),on;if(mn===null){for(;!Vn.done;pr++,Vn=ze.next())Vn=A0(Re,Vn.value,Et),Vn!==null&&(Ce=b(Vn,Ce,pr),sr===null?on=Vn:sr.sibling=Vn,sr=Vn);return on}for(mn=O(Re,mn);!Vn.done;pr++,Vn=ze.next())Vn=gi(mn,Re,pr,Vn.value,Et),Vn!==null&&(v&&Vn.alternate!==null&&mn.delete(Vn.key===null?pr:Vn.key),Ce=b(Vn,Ce,pr),sr===null?on=Vn:sr.sibling=Vn,sr=Vn);return v&&mn.forEach(function(Zf){return m(Re,Zf)}),on}return function(Re,Ce,ze,Et){var on=typeof ze=="object"&&ze!==null&&ze.type===L&&ze.key===null;on&&(ze=ze.props.children);var sr=typeof ze=="object"&&ze!==null;if(sr)switch(ze.$$typeof){case x:e:{for(sr=ze.key,on=Ce;on!==null;){if(on.key===sr)if(on.tag===7?ze.type===L:on.elementType===ze.type){S(Re,on.sibling),Ce=M(on,ze.type===L?ze.props.children:ze.props,Et),Ce.ref=au(Re,on,ze),Ce.return=Re,Re=Ce;break e}else{S(Re,on);break}else m(Re,on);on=on.sibling}ze.type===L?(Ce=mi(ze.props.children,Re.mode,Et,ze.key),Ce.return=Re,Re=Ce):(Et=Hs(ze.type,ze.key,ze.props,null,Re.mode,Et),Et.ref=au(Re,Ce,ze),Et.return=Re,Re=Et)}return ee(Re);case D:e:{for(on=ze.key;Ce!==null;){if(Ce.key===on)if(Ce.tag===4&&Ce.stateNode.containerInfo===ze.containerInfo&&Ce.stateNode.implementation===ze.implementation){S(Re,Ce.sibling),Ce=M(Ce,ze.children||[],Et),Ce.return=Re,Re=Ce;break e}else{S(Re,Ce);break}else m(Re,Ce);Ce=Ce.sibling}Ce=Xf(ze,Re.mode,Et),Ce.return=Re,Re=Ce}return ee(Re)}if(typeof ze=="string"||typeof ze=="number")return ze=""+ze,Ce!==null&&Ce.tag===6?(S(Re,Ce.sibling),Ce=M(Ce,ze,Et),Ce.return=Re,Re=Ce):(S(Re,Ce),Ce=vi(ze,Re.mode,Et),Ce.return=Re,Re=Ce),ee(Re);if(M0(ze))return po(Re,Ce,ze,Et);if(J(ze))return _i(Re,Ce,ze,Et);if(sr&&Lr(Re,ze),typeof ze=="undefined"&&!on)switch(Re.tag){case 1:case 0:throw Re=Re.type,Error(t(152,Re.displayName||Re.name||"Component"))}return S(Re,Ce)}}var R=F(!0),U=F(!1),H={},fe={current:H},ue={current:H},de={current:H};function W(v){if(v===H)throw Error(t(174));return v}function ve(v,m){Fr(de,m,v),Fr(ue,v,v),Fr(fe,H,v),m=Ot(m),kr(fe,v),Fr(fe,m,v)}function Fe(v){kr(fe,v),kr(ue,v),kr(de,v)}function Ge(v){var m=W(de.current),S=W(fe.current);m=Nt(S,v.type,m),S!==m&&(Fr(ue,v,v),Fr(fe,m,v))}function K(v){ue.current===v&&(kr(fe,v),kr(ue,v))}var xe={current:0};function je(v){for(var m=v;m!==null;){if(m.tag===13){var S=m.memoizedState;if(S!==null&&(S=S.dehydrated,S===null||ll(S)||fl(S)))return m}else if(m.tag===19&&m.memoizedProps.revealOrder!==void 0){if((m.effectTag&64)!=0)return m}else if(m.child!==null){m.child.return=m,m=m.child;continue}if(m===v)break;for(;m.sibling===null;){if(m.return===null||m.return===v)return null;m=m.return}m.sibling.return=m.return,m=m.sibling}return null}function Xe(v,m){return{responder:v,props:m}}var rt=C.ReactCurrentDispatcher,st=C.ReactCurrentBatchConfig,xt=0,wt=null,lt=null,Rt=null,yn=null,sn=null,ar=null,rn=0,Hn=null,d0=0,Cr=!1,He=null,Qe=0;function Ne(){throw Error(t(321))}function ft(v,m){if(m===null)return!1;for(var S=0;Srn&&(rn=In,pf(rn))):(Yf(In,Ze.suspenseConfig),b=Ze.eagerReducer===v?Ze.eagerState:v(b,Ze.action)),ee=Ze,Ze=Ze.next}while(Ze!==null&&Ze!==O);ut||(Ye=ee,M=b),Sn(b,m.memoizedState)||(ai=!0),m.memoizedState=b,m.baseUpdate=Ye,m.baseState=M,S.lastRenderedState=b}return[m.memoizedState,S.dispatch]}function ci(v){var m=Cn();return typeof v=="function"&&(v=v()),m.memoizedState=m.baseState=v,v=m.queue={last:null,dispatch:null,lastRenderedReducer:p0,lastRenderedState:v},v=v.dispatch=Us.bind(null,wt,v),[m.memoizedState,v]}function xi(v){return h0(p0,v)}function E0(v,m,S,O){return v={tag:v,create:m,destroy:S,deps:O,next:null},Hn===null?(Hn={lastEffect:null},Hn.lastEffect=v.next=v):(m=Hn.lastEffect,m===null?Hn.lastEffect=v.next=v:(S=m.next,m.next=v,v.next=S,Hn.lastEffect=v)),v}function qr(v,m,S,O){var M=Cn();d0|=v,M.memoizedState=E0(m,S,void 0,O===void 0?null:O)}function Eo(v,m,S,O){var M=bn();O=O===void 0?null:O;var b=void 0;if(lt!==null){var ee=lt.memoizedState;if(b=ee.destroy,O!==null&&ft(O,ee.deps)){E0(0,S,b,O);return}}d0|=v,M.memoizedState=E0(m,S,b,O)}function So(v,m){return qr(516,192,v,m)}function wl(v,m){return Eo(516,192,v,m)}function js(v,m){if(typeof m=="function")return v=v(),m(v),function(){m(null)};if(m!=null)return v=v(),m.current=v,function(){m.current=null}}function Dl(){}function du(v,m){return Cn().memoizedState=[v,m===void 0?null:m],v}function Yu(v,m){var S=bn();m=m===void 0?null:m;var O=S.memoizedState;return O!==null&&m!==null&&ft(m,O[1])?O[0]:(S.memoizedState=[v,m],v)}function Us(v,m,S){if(!(25>Qe))throw Error(t(301));var O=v.alternate;if(v===wt||O!==null&&O===wt)if(Cr=!0,v={expirationTime:xt,suspenseConfig:null,action:S,eagerReducer:null,eagerState:null,next:null},He===null&&(He=new Map),S=He.get(m),S===void 0)He.set(m,v);else{for(m=S;m.next!==null;)m=m.next;m.next=v}else{var M=g0(),b=nr.suspense;M=Kr(M,v,b),b={expirationTime:M,suspenseConfig:b,action:S,eagerReducer:null,eagerState:null,next:null};var ee=m.last;if(ee===null)b.next=b;else{var Ye=ee.next;Ye!==null&&(b.next=Ye),ee.next=b}if(m.last=b,v.expirationTime===0&&(O===null||O.expirationTime===0)&&(O=m.lastRenderedReducer,O!==null))try{var Ze=m.lastRenderedState,ut=O(Ze,S);if(b.eagerReducer=O,b.eagerState=ut,Sn(ut,Ze))return}catch(In){}finally{}_0(v,M)}}var oo={readContext:D0,useCallback:Ne,useContext:Ne,useEffect:Ne,useImperativeHandle:Ne,useLayoutEffect:Ne,useMemo:Ne,useReducer:Ne,useRef:Ne,useState:Ne,useDebugValue:Ne,useResponder:Ne,useDeferredValue:Ne,useTransition:Ne},Hi={readContext:D0,useCallback:du,useContext:D0,useEffect:So,useImperativeHandle:function(v,m,S){return S=S!=null?S.concat([v]):null,qr(4,36,js.bind(null,m,v),S)},useLayoutEffect:function(v,m){return qr(4,36,v,m)},useMemo:function(v,m){var S=Cn();return m=m===void 0?null:m,v=v(),S.memoizedState=[v,m],v},useReducer:function(v,m,S){var O=Cn();return m=S!==void 0?S(m):m,O.memoizedState=O.baseState=m,v=O.queue={last:null,dispatch:null,lastRenderedReducer:v,lastRenderedState:m},v=v.dispatch=Us.bind(null,wt,v),[O.memoizedState,v]},useRef:function(v){var m=Cn();return v={current:v},m.memoizedState=v},useState:ci,useDebugValue:Dl,useResponder:Xe,useDeferredValue:function(v,m){var S=ci(v),O=S[0],M=S[1];return So(function(){g.unstable_next(function(){var b=st.suspense;st.suspense=m===void 0?null:m;try{M(v)}finally{st.suspense=b}})},[v,m]),O},useTransition:function(v){var m=ci(!1),S=m[0],O=m[1];return[du(function(M){O(!0),g.unstable_next(function(){var b=st.suspense;st.suspense=v===void 0?null:v;try{O(!1),M()}finally{st.suspense=b}})},[v,S]),S]}},qs={readContext:D0,useCallback:Yu,useContext:D0,useEffect:wl,useImperativeHandle:function(v,m,S){return S=S!=null?S.concat([v]):null,Eo(4,36,js.bind(null,m,v),S)},useLayoutEffect:function(v,m){return Eo(4,36,v,m)},useMemo:function(v,m){var S=bn();m=m===void 0?null:m;var O=S.memoizedState;return O!==null&&m!==null&&ft(m,O[1])?O[0]:(v=v(),S.memoizedState=[v,m],v)},useReducer:h0,useRef:function(){return bn().memoizedState},useState:xi,useDebugValue:Dl,useResponder:Xe,useDeferredValue:function(v,m){var S=xi(v),O=S[0],M=S[1];return wl(function(){g.unstable_next(function(){var b=st.suspense;st.suspense=m===void 0?null:m;try{M(v)}finally{st.suspense=b}})},[v,m]),O},useTransition:function(v){var m=xi(!1),S=m[0],O=m[1];return[Yu(function(M){O(!0),g.unstable_next(function(){var b=st.suspense;st.suspense=v===void 0?null:v;try{O(!1),M()}finally{st.suspense=b}})},[v,S]),S]}},F0=null,Gr=null,ir=!1;function L0(v,m){var S=xo(5,null,null,0);S.elementType="DELETED",S.type="DELETED",S.stateNode=m,S.return=v,S.effectTag=8,v.lastEffect!==null?(v.lastEffect.nextEffect=S,v.lastEffect=S):v.firstEffect=v.lastEffect=S}function Y0(v,m){switch(v.tag){case 5:return m=Ti(m,v.type,v.pendingProps),m!==null?(v.stateNode=m,!0):!1;case 6:return m=Fu(m,v.pendingProps),m!==null?(v.stateNode=m,!0):!1;case 13:return!1;default:return!1}}function Co(v){if(ir){var m=Gr;if(m){var S=m;if(!Y0(v,m)){if(m=cl(S),!m||!Y0(v,m)){v.effectTag=v.effectTag&-1025|2,ir=!1,F0=v;return}L0(F0,S)}F0=v,Gr=al(m)}else v.effectTag=v.effectTag&-1025|2,ir=!1,F0=v}}function $u(v){for(v=v.return;v!==null&&v.tag!==5&&v.tag!==3&&v.tag!==13;)v=v.return;F0=v}function Vo(v){if(!w||v!==F0)return!1;if(!ir)return $u(v),ir=!0,!1;var m=v.type;if(v.tag!==5||m!=="head"&&m!=="body"&&!at(m,v.memoizedProps))for(m=Gr;m;)L0(v,m),m=cl(m);if($u(v),v.tag===13){if(!w)throw Error(t(316));if(v=v.memoizedState,v=v!==null?v.dehydrated:null,!v)throw Error(t(317));Gr=Ac(v)}else Gr=F0?cl(v.stateNode):null;return!0}function Rr(){w&&(Gr=F0=null,ir=!1)}var Jn=C.ReactCurrentOwner,ai=!1;function o0(v,m,S,O){m.child=v===null?U(m,null,S,O):R(m,v.child,S,O)}function Vr(v,m,S,O,M){S=S.render;var b=m.ref;return io(m,M),O=St(v,m,S,O,b,M),v!==null&&!ai?(m.updateQueue=v.updateQueue,m.effectTag&=-517,v.expirationTime<=M&&(v.expirationTime=0),X0(v,m,M)):(m.effectTag|=1,o0(v,m,O,M),m.child)}function ff(v,m,S,O,M,b){if(v===null){var ee=S.type;return typeof ee=="function"&&!mf(ee)&&ee.defaultProps===void 0&&S.compare===null&&S.defaultProps===void 0?(m.tag=15,m.type=ee,cf(v,m,ee,O,M,b)):(v=Hs(S.type,null,O,null,m.mode,b),v.ref=m.ref,v.return=m,m.child=v)}return ee=v.child,Mm)&&Qn.set(v,m)))}}function Gi(v,m){v.expirationTimev?m:v)}function x0(v){if(v.lastExpiredTime!==0)v.callbackExpirationTime=1073741823,v.callbackPriority=99,v.callbackNode=Ho(Z0.bind(null,v));else{var m=fo(v),S=v.callbackNode;if(m===0)S!==null&&(v.callbackNode=null,v.callbackExpirationTime=0,v.callbackPriority=90);else{var O=g0();if(m===1073741823?O=99:m===1||m===2?O=95:(O=10*(1073741821-m)-10*(1073741821-O),O=0>=O?99:250>=O?98:5250>=O?97:95),S!==null){var M=v.callbackPriority;if(v.callbackExpirationTime===m&&M>=O)return;S!==ju&&uf(S)}v.callbackExpirationTime=m,v.callbackPriority=O,m=m===1073741823?Ho(Z0.bind(null,v)):lu(O,Xu.bind(null,v),{timeout:10*(1073741821-m)-G0()}),v.callbackNode=m}}}function Xu(v,m){if(t0=0,m)return m=g0(),kl(v,m),x0(v),null;var S=fo(v);if(S!==0){if(m=v.callbackNode,(Kt&(Br|zr))!==Fn)throw Error(t(327));if(Ws(),v===X&&S===ye||mu(v,S),Y!==null){var O=Kt;Kt|=Br;var M=ei(v);do try{Ua();break}catch(Ye){Ju(v,Ye)}while(1);if(Wu(),Kt=O,B0.current=M,he===wr)throw m=We,mu(v,S),ao(v,S),x0(v),m;if(Y===null)switch(M=v.finishedWork=v.current.alternate,v.finishedExpirationTime=S,O=he,X=null,O){case lo:case wr:throw Error(t(345));case kn:kl(v,2=S){v.lastPingedTime=S,mu(v,S);break}}if(b=fo(v),b!==0&&b!==S)break;if(O!==0&&O!==S){v.lastPingedTime=O;break}v.timeoutHandle=jt(gu.bind(null,v),M);break}gu(v);break;case hi:if(ao(v,S),O=v.lastSuspendedTime,S===O&&(v.nextKnownPendingLevel=$f(M)),qt&&(M=v.lastPingedTime,M===0||M>=S)){v.lastPingedTime=S,mu(v,S);break}if(M=fo(v),M!==0&&M!==S)break;if(O!==0&&O!==S){v.lastPingedTime=O;break}if(Dt!==1073741823?O=10*(1073741821-Dt)-G0():et===1073741823?O=0:(O=10*(1073741821-et)-5e3,M=G0(),S=10*(1073741821-S)-M,O=M-O,0>O&&(O=0),O=(120>O?120:480>O?480:1080>O?1080:1920>O?1920:3e3>O?3e3:4320>O?4320:1960*Cl(O/1960))-O,S=O?O=0:(M=ee.busyDelayMs|0,b=G0()-(10*(1073741821-b)-(ee.timeoutMs|0||5e3)),O=b<=M?0:M+O-b),10 component higher in the tree to provide a loading indicator or placeholder to display.`+dl(M))}he!==Ai&&(he=kn),b=zs(b,M),Ze=O;do{switch(Ze.tag){case 3:ee=b,Ze.effectTag|=4096,Ze.expirationTime=m;var Ce=pu(Ze,ee,m);bu(Ze,Ce);break e;case 1:ee=b;var ze=Ze.type,Et=Ze.stateNode;if((Ze.effectTag&64)==0&&(typeof ze.getDerivedStateFromError=="function"||Et!==null&&typeof Et.componentDidCatch=="function"&&(Ar===null||!Ar.has(Et)))){Ze.effectTag|=4096,Ze.expirationTime=m;var on=Sl(Ze,ee,m);bu(Ze,on);break e}}Ze=Ze.return}while(Ze!==null)}Y=vu(Y)}catch(sr){m=sr;continue}break}while(1)}function ei(){var v=B0.current;return B0.current=oo,v===null?oo:v}function Yf(v,m){vZt&&(Zt=v)}function ja(){for(;Y!==null;)Y=Ic(Y)}function Ua(){for(;Y!==null&&!_n();)Y=Ic(Y)}function Ic(v){var m=Lc(v.alternate,v,ye);return v.memoizedProps=v.pendingProps,m===null&&(m=vu(v)),hu.current=null,m}function vu(v){Y=v;do{var m=Y.alternate;if(v=Y.return,(Y.effectTag&2048)==0){e:{var S=m;m=Y;var O=ye,M=m.pendingProps;switch(m.tag){case 2:break;case 16:break;case 15:case 0:break;case 1:c0(m.type)&&Ru(m);break;case 3:Fe(m),ks(m),M=m.stateNode,M.pendingContext&&(M.context=M.pendingContext,M.pendingContext=null),(S===null||S.child===null)&&Vo(m)&&ki(m),$r(m);break;case 5:K(m);var b=W(de.current);if(O=m.type,S!==null&&m.stateNode!=null)m0(S,m,O,M,b),S.ref!==m.ref&&(m.effectTag|=128);else if(M){if(S=W(fe.current),Vo(m)){if(M=m,!w)throw Error(t(175));S=Ui(M.stateNode,M.type,M.memoizedProps,b,S,M),M.updateQueue=S,S=S!==null,S&&ki(m)}else{var ee=ne(O,M,b,S,m);Yr(ee,m,!1,!1),m.stateNode=ee,Z(ee,O,M,b,S)&&ki(m)}m.ref!==null&&(m.effectTag|=128)}else if(m.stateNode===null)throw Error(t(166));break;case 6:if(S&&m.stateNode!=null)Tn(S,m,S.memoizedProps,M);else{if(typeof M!="string"&&m.stateNode===null)throw Error(t(166));if(S=W(de.current),b=W(fe.current),Vo(m)){if(S=m,!w)throw Error(t(176));(S=Mr(S.stateNode,S.memoizedProps,S))&&ki(m)}else m.stateNode=Ft(M,S,b,m)}break;case 11:break;case 13:if(kr(xe,m),M=m.memoizedState,(m.effectTag&64)!=0){m.expirationTime=O;break e}M=M!==null,b=!1,S===null?m.memoizedProps.fallback!==void 0&&Vo(m):(O=S.memoizedState,b=O!==null,M||O===null||(O=S.child.sibling,O!==null&&(ee=m.firstEffect,ee!==null?(m.firstEffect=O,O.nextEffect=ee):(m.firstEffect=m.lastEffect=O,O.nextEffect=null),O.effectTag=8))),M&&!b&&(m.mode&2)!=0&&(S===null&&m.memoizedProps.unstable_avoidThisFallback!==!0||(xe.current&1)!=0?he===lo&&(he=T0):((he===lo||he===T0)&&(he=hi),Zt!==0&&X!==null&&(ao(X,ye),$o(X,Zt)))),cr&&M&&(m.effectTag|=4),Yt&&(M||b)&&(m.effectTag|=4);break;case 7:break;case 8:break;case 12:break;case 4:Fe(m),$r(m);break;case 10:fi(m);break;case 9:break;case 14:break;case 17:c0(m.type)&&Ru(m);break;case 19:if(kr(xe,m),M=m.memoizedState,M===null)break;if(b=(m.effectTag&64)!=0,ee=M.rendering,ee===null){if(b)bi(M,!1);else if(he!==lo||S!==null&&(S.effectTag&64)!=0)for(S=m.child;S!==null;){if(ee=je(S),ee!==null){for(m.effectTag|=64,bi(M,!1),S=ee.updateQueue,S!==null&&(m.updateQueue=S,m.effectTag|=4),M.lastEffect===null&&(m.firstEffect=null),m.lastEffect=M.lastEffect,S=O,M=m.child;M!==null;)b=M,O=S,b.effectTag&=2,b.nextEffect=null,b.firstEffect=null,b.lastEffect=null,ee=b.alternate,ee===null?(b.childExpirationTime=0,b.expirationTime=O,b.child=null,b.memoizedProps=null,b.memoizedState=null,b.updateQueue=null,b.dependencies=null):(b.childExpirationTime=ee.childExpirationTime,b.expirationTime=ee.expirationTime,b.child=ee.child,b.memoizedProps=ee.memoizedProps,b.memoizedState=ee.memoizedState,b.updateQueue=ee.updateQueue,O=ee.dependencies,b.dependencies=O===null?null:{expirationTime:O.expirationTime,firstContext:O.firstContext,responders:O.responders}),M=M.sibling;Fr(xe,xe.current&1|2,m),m=m.child;break e}S=S.sibling}}else{if(!b)if(S=je(ee),S!==null){if(m.effectTag|=64,b=!0,S=S.updateQueue,S!==null&&(m.updateQueue=S,m.effectTag|=4),bi(M,!0),M.tail===null&&M.tailMode==="hidden"&&!ee.alternate){m=m.lastEffect=M.lastEffect,m!==null&&(m.nextEffect=null);break}}else G0()>M.tailExpiration&&1M&&(M=O),ee>M&&(M=ee),b=b.sibling;S.childExpirationTime=M}if(m!==null)return m;v!==null&&(v.effectTag&2048)==0&&(v.firstEffect===null&&(v.firstEffect=Y.firstEffect),Y.lastEffect!==null&&(v.lastEffect!==null&&(v.lastEffect.nextEffect=Y.firstEffect),v.lastEffect=Y.lastEffect),1v?m:v}function gu(v){var m=Fs();return zi(99,co.bind(null,v,m)),null}function co(v,m){do Ws();while(dr!==null);if((Kt&(Br|zr))!==Fn)throw Error(t(327));var S=v.finishedWork,O=v.finishedExpirationTime;if(S===null)return null;if(v.finishedWork=null,v.finishedExpirationTime=0,S===v.current)throw Error(t(177));v.callbackNode=null,v.callbackExpirationTime=0,v.callbackPriority=90,v.nextKnownPendingLevel=0;var M=$f(S);if(v.firstPendingTime=M,O<=v.lastSuspendedTime?v.firstSuspendedTime=v.lastSuspendedTime=v.nextKnownPendingLevel=0:O<=v.firstSuspendedTime&&(v.firstSuspendedTime=O-1),O<=v.lastPingedTime&&(v.lastPingedTime=0),O<=v.lastExpiredTime&&(v.lastExpiredTime=0),v===X&&(Y=X=null,ye=0),1=S?mt(v,m,S):(Fr(xe,xe.current&1,m),m=X0(v,m,S),m!==null?m.sibling:null);Fr(xe,xe.current&1,m);break;case 19:if(O=m.childExpirationTime>=S,(v.effectTag&64)!=0){if(O)return $t(v,m,S);m.effectTag|=64}if(M=m.memoizedState,M!==null&&(M.rendering=null,M.tail=null),Fr(xe,xe.current,m),!O)return null}return X0(v,m,S)}ai=!1}}else ai=!1;switch(m.expirationTime=0,m.tag){case 2:if(O=m.type,v!==null&&(v.alternate=null,m.alternate=null,m.effectTag|=2),v=m.pendingProps,M=Lu(m,H0.current),io(m,S),M=St(null,m,O,v,M,S),m.effectTag|=1,typeof M=="object"&&M!==null&&typeof M.render=="function"&&M.$$typeof===void 0){if(m.tag=1,Qt(),c0(O)){var b=!0;wo(m)}else b=!1;m.memoizedState=M.state!==null&&M.state!==void 0?M.state:null;var ee=O.getDerivedStateFromProps;typeof ee=="function"&&Go(m,O,ee,v),M.updater=Gu,m.stateNode=M,M._reactInternalFiber=m,Vu(m,O,v,S),m=Be(null,m,O,!0,b,S)}else m.tag=0,o0(null,m,M,S),m=m.child;return m;case 16:if(M=m.elementType,v!==null&&(v.alternate=null,m.alternate=null,m.effectTag|=2),v=m.pendingProps,Te(M),M._status!==1)throw M._result;switch(M=M._result,m.type=M,b=m.tag=Wa(M),v=I0(M,v),b){case 0:m=K0(null,m,M,v,S);break;case 1:m=ae(null,m,M,v,S);break;case 11:m=Vr(null,m,M,v,S);break;case 14:m=ff(null,m,M,I0(M.type,v),O,S);break;default:throw Error(t(306,M,""))}return m;case 0:return O=m.type,M=m.pendingProps,M=m.elementType===O?M:I0(O,M),K0(v,m,O,M,S);case 1:return O=m.type,M=m.pendingProps,M=m.elementType===O?M:I0(O,M),ae(v,m,O,M,S);case 3:if(Ie(m),O=m.updateQueue,O===null)throw Error(t(282));if(M=m.memoizedState,M=M!==null?M.element:null,P0(m,O,m.pendingProps,null,S),O=m.memoizedState.element,O===M)Rr(),m=X0(v,m,S);else{if((M=m.stateNode.hydrate)&&(w?(Gr=al(m.stateNode.containerInfo),F0=m,M=ir=!0):M=!1),M)for(S=U(m,null,O,S),m.child=S;S;)S.effectTag=S.effectTag&-3|1024,S=S.sibling;else o0(v,m,O,S),Rr();m=m.child}return m;case 5:return Ge(m),v===null&&Co(m),O=m.type,M=m.pendingProps,b=v!==null?v.memoizedProps:null,ee=M.children,at(O,M)?ee=null:b!==null&&at(O,b)&&(m.effectTag|=16),$0(v,m),m.mode&4&&S!==1&&it(O,M)?(m.expirationTime=m.childExpirationTime=1,m=null):(o0(v,m,ee,S),m=m.child),m;case 6:return v===null&&Co(m),null;case 13:return mt(v,m,S);case 4:return ve(m,m.stateNode.containerInfo),O=m.pendingProps,v===null?m.child=R(m,null,O,S):o0(v,m,O,S),m.child;case 11:return O=m.type,M=m.pendingProps,M=m.elementType===O?M:I0(O,M),Vr(v,m,O,M,S);case 7:return o0(v,m,m.pendingProps,S),m.child;case 8:return o0(v,m,m.pendingProps.children,S),m.child;case 12:return o0(v,m,m.pendingProps.children,S),m.child;case 10:e:{if(O=m.type._context,M=m.pendingProps,ee=m.memoizedProps,b=M.value,Ls(m,b),ee!==null){var Ye=ee.value;if(b=Sn(Ye,b)?0:(typeof O._calculateChangedBits=="function"?O._calculateChangedBits(Ye,b):1073741823)|0,b===0){if(ee.children===M.children&&!b0.current){m=X0(v,m,S);break e}}else for(Ye=m.child,Ye!==null&&(Ye.return=m);Ye!==null;){var Ze=Ye.dependencies;if(Ze!==null){ee=Ye.child;for(var ut=Ze.firstContext;ut!==null;){if(ut.context===O&&(ut.observedBits&b)!=0){Ye.tag===1&&(ut=a0(S,null),ut.tag=2,V0(Ye,ut)),Ye.expirationTime=m&&v<=m}function ao(v,m){var S=v.firstSuspendedTime,O=v.lastSuspendedTime;Sm||S===0)&&(v.lastSuspendedTime=m),m<=v.lastPingedTime&&(v.lastPingedTime=0),m<=v.lastExpiredTime&&(v.lastExpiredTime=0)}function $o(v,m){m>v.firstPendingTime&&(v.firstPendingTime=m);var S=v.firstSuspendedTime;S!==0&&(m>=S?v.firstSuspendedTime=v.lastSuspendedTime=v.nextKnownPendingLevel=0:m>=v.lastSuspendedTime&&(v.lastSuspendedTime=m+1),m>v.nextKnownPendingLevel&&(v.nextKnownPendingLevel=m))}function kl(v,m){var S=v.lastExpiredTime;(S===0||S>m)&&(v.lastExpiredTime=m)}function Nc(v){var m=v._reactInternalFiber;if(m===void 0)throw typeof v.render=="function"?Error(t(188)):Error(t(268,Object.keys(v)));return v=Ue(m),v===null?null:v.stateNode}function Al(v,m){v=v.memoizedState,v!==null&&v.dehydrated!==null&&v.retryTime{"use strict";sE.exports=uE()});var cE=Me((db,fE)=>{"use strict";var gN={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};fE.exports=gN});var hE=Me((pb,aE)=>{"use strict";var _N=Object.assign||function(i){for(var u=1;u"}}]),i}(),dE=function(){Ph(i,null,[{key:"fromJS",value:function(f){var c=f.width,g=f.height;return new i(c,g)}}]);function i(u,f){Iy(this,i),this.width=u,this.height=f}return Ph(i,[{key:"fromJS",value:function(f){f(this.width,this.height)}},{key:"toString",value:function(){return""}}]),i}(),pE=function(){function i(u,f){Iy(this,i),this.unit=u,this.value=f}return Ph(i,[{key:"fromJS",value:function(f){f(this.unit,this.value)}},{key:"toString",value:function(){switch(this.unit){case ps.UNIT_POINT:return String(this.value);case ps.UNIT_PERCENT:return this.value+"%";case ps.UNIT_AUTO:return"auto";default:return this.value+"?"}}},{key:"valueOf",value:function(){return this.value}}]),i}();aE.exports=function(i,u){function f(C,A,x){var D=C[A];C[A]=function(){for(var L=arguments.length,N=Array(L),j=0;j1?N-1:0),$=1;$1&&arguments[1]!==void 0?arguments[1]:NaN,x=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,D=arguments.length>3&&arguments[3]!==void 0?arguments[3]:ps.DIRECTION_LTR;return C.call(this,A,x,D)}),_N({Config:u.Config,Node:u.Node,Layout:i("Layout",yN),Size:i("Size",dE),Value:i("Value",pE),getInstanceCount:function(){return u.getInstanceCount.apply(u,arguments)}},ps)}});var mE=Me((exports,module)=>{(function(i,u){typeof define=="function"&&define.amd?define([],function(){return u}):typeof module=="object"&&module.exports?module.exports=u:(i.nbind=i.nbind||{}).init=u})(exports,function(Module,cb){typeof Module=="function"&&(cb=Module,Module={}),Module.onRuntimeInitialized=function(i,u){return function(){i&&i.apply(this,arguments);try{Module.ccall("nbind_init")}catch(f){u(f);return}u(null,{bind:Module._nbind_value,reflect:Module.NBind.reflect,queryType:Module.NBind.queryType,toggleLightGC:Module.toggleLightGC,lib:Module})}}(Module.onRuntimeInitialized,cb);var Module;Module||(Module=(typeof Module!="undefined"?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;if(Module.ENVIRONMENT)if(Module.ENVIRONMENT==="WEB")ENVIRONMENT_IS_WEB=!0;else if(Module.ENVIRONMENT==="WORKER")ENVIRONMENT_IS_WORKER=!0;else if(Module.ENVIRONMENT==="NODE")ENVIRONMENT_IS_NODE=!0;else if(Module.ENVIRONMENT==="SHELL")ENVIRONMENT_IS_SHELL=!0;else throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");else ENVIRONMENT_IS_WEB=typeof window=="object",ENVIRONMENT_IS_WORKER=typeof importScripts=="function",ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof require=="function"&&!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);var nodeFS,nodePath;Module.read=function(u,f){nodeFS||(nodeFS={}("")),nodePath||(nodePath={}("")),u=nodePath.normalize(u);var c=nodeFS.readFileSync(u);return f?c:c.toString()},Module.readBinary=function(u){var f=Module.read(u,!0);return f.buffer||(f=new Uint8Array(f)),assert(f.buffer),f},Module.load=function(u){globalEval(read(u))},Module.thisProgram||(process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program"),Module.arguments=process.argv.slice(2),typeof module!="undefined"&&(module.exports=Module),Module.inspect=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),typeof printErr!="undefined"&&(Module.printErr=printErr),typeof read!="undefined"?Module.read=read:Module.read=function(){throw"no read() available"},Module.readBinary=function(u){if(typeof readbuffer=="function")return new Uint8Array(readbuffer(u));var f=read(u,"binary");return assert(typeof f=="object"),f},typeof scriptArgs!="undefined"?Module.arguments=scriptArgs:typeof arguments!="undefined"&&(Module.arguments=arguments),typeof quit=="function"&&(Module.quit=function(i,u){quit(i)});else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(Module.read=function(u){var f=new XMLHttpRequest;return f.open("GET",u,!1),f.send(null),f.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(u){var f=new XMLHttpRequest;return f.open("GET",u,!1),f.responseType="arraybuffer",f.send(null),new Uint8Array(f.response)}),Module.readAsync=function(u,f,c){var g=new XMLHttpRequest;g.open("GET",u,!0),g.responseType="arraybuffer",g.onload=function(){g.status==200||g.status==0&&g.response?f(g.response):c()},g.onerror=c,g.send(null)},typeof arguments!="undefined"&&(Module.arguments=arguments),typeof console!="undefined")Module.print||(Module.print=function(u){console.log(u)}),Module.printErr||(Module.printErr=function(u){console.warn(u)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&typeof dump!="undefined"?function(i){dump(i)}:function(i){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),typeof Module.setWindowTitle=="undefined"&&(Module.setWindowTitle=function(i){document.title=i})}else throw"Unknown runtime environment. Where are we?";function globalEval(i){eval.call(null,i)}!Module.load&&Module.read&&(Module.load=function(u){globalEval(Module.read(u))}),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(i,u){throw u}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[];for(var key in moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(i){return tempRet0=i,i},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(i){STACKTOP=i},getNativeTypeSize:function(i){switch(i){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(i[i.length-1]==="*")return Runtime.QUANTUM_SIZE;if(i[0]==="i"){var u=parseInt(i.substr(1));return assert(u%8==0),u/8}else return 0}}},getNativeFieldSize:function(i){return Math.max(Runtime.getNativeTypeSize(i),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(i,u){return u==="double"||u==="i64"?i&7&&(assert((i&7)==4),i+=4):assert((i&3)==0),i},getAlignSize:function(i,u,f){return!f&&(i=="i64"||i=="double")?8:i?Math.min(u||(i?Runtime.getNativeFieldSize(i):0),Runtime.QUANTUM_SIZE):Math.min(u,8)},dynCall:function(i,u,f){return f&&f.length?Module["dynCall_"+i].apply(null,[u].concat(f)):Module["dynCall_"+i].call(null,u)},functionPointers:[],addFunction:function(i){for(var u=0;u>2],f=(u+i+15|0)&-16;if(HEAP32[DYNAMICTOP_PTR>>2]=f,f>=TOTAL_MEMORY){var c=enlargeMemory();if(!c)return HEAP32[DYNAMICTOP_PTR>>2]=u,0}return u},alignMemory:function(i,u){var f=i=Math.ceil(i/(u||16))*(u||16);return f},makeBigInt:function(i,u,f){var c=f?+(i>>>0)+ +(u>>>0)*4294967296:+(i>>>0)+ +(u|0)*4294967296;return c},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0;function assert(i,u){i||abort("Assertion failed: "+u)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(i){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}var cwrap,ccall;(function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(i){var u=Runtime.stackAlloc(i.length);return writeArrayToMemory(i,u),u},stringToC:function(i){var u=0;if(i!=null&&i!==0){var f=(i.length<<2)+1;u=Runtime.stackAlloc(f),stringToUTF8(i,u,f)}return u}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(u,f,c,g,t){var C=getCFunc(u),A=[],x=0;if(g)for(var D=0;D>0]=u;break;case"i8":HEAP8[i>>0]=u;break;case"i16":HEAP16[i>>1]=u;break;case"i32":HEAP32[i>>2]=u;break;case"i64":tempI64=[u>>>0,(tempDouble=u,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[i>>2]=tempI64[0],HEAP32[i+4>>2]=tempI64[1];break;case"float":HEAPF32[i>>2]=u;break;case"double":HEAPF64[i>>3]=u;break;default:abort("invalid type for setValue: "+f)}}Module.setValue=setValue;function getValue(i,u,f){switch(u=u||"i8",u.charAt(u.length-1)==="*"&&(u="i32"),u){case"i1":return HEAP8[i>>0];case"i8":return HEAP8[i>>0];case"i16":return HEAP16[i>>1];case"i32":return HEAP32[i>>2];case"i64":return HEAP32[i>>2];case"float":return HEAPF32[i>>2];case"double":return HEAPF64[i>>3];default:abort("invalid type for setValue: "+u)}return null}Module.getValue=getValue;var ALLOC_NORMAL=0,ALLOC_STACK=1,ALLOC_STATIC=2,ALLOC_DYNAMIC=3,ALLOC_NONE=4;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;function allocate(i,u,f,c){var g,t;typeof i=="number"?(g=!0,t=i):(g=!1,t=i.length);var C=typeof u=="string"?u:null,A;if(f==ALLOC_NONE?A=c:A=[typeof _malloc=="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][f===void 0?ALLOC_STATIC:f](Math.max(t,C?1:u.length)),g){var c=A,x;for(assert((A&3)==0),x=A+(t&~3);c>2]=0;for(x=A+t;c>0]=0;return A}if(C==="i8")return i.subarray||i.slice?HEAPU8.set(i,A):HEAPU8.set(new Uint8Array(i),A),A;for(var D=0,L,N,j;D>0],f|=c,!(c==0&&!u||(g++,u&&g==u)););u||(u=g);var t="";if(f<128){for(var C=1024,A;u>0;)A=String.fromCharCode.apply(String,HEAPU8.subarray(i,i+Math.min(u,C))),t=t?t+A:A,i+=C,u-=C;return t}return Module.UTF8ToString(i)}Module.Pointer_stringify=Pointer_stringify;function AsciiToString(i){for(var u="";;){var f=HEAP8[i++>>0];if(!f)return u;u+=String.fromCharCode(f)}}Module.AsciiToString=AsciiToString;function stringToAscii(i,u){return writeAsciiToMemory(i,u,!1)}Module.stringToAscii=stringToAscii;var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):void 0;function UTF8ArrayToString(i,u){for(var f=u;i[f];)++f;if(f-u>16&&i.subarray&&UTF8Decoder)return UTF8Decoder.decode(i.subarray(u,f));for(var c,g,t,C,A,x,D="";;){if(c=i[u++],!c)return D;if(!(c&128)){D+=String.fromCharCode(c);continue}if(g=i[u++]&63,(c&224)==192){D+=String.fromCharCode((c&31)<<6|g);continue}if(t=i[u++]&63,(c&240)==224?c=(c&15)<<12|g<<6|t:(C=i[u++]&63,(c&248)==240?c=(c&7)<<18|g<<12|t<<6|C:(A=i[u++]&63,(c&252)==248?c=(c&3)<<24|g<<18|t<<12|C<<6|A:(x=i[u++]&63,c=(c&1)<<30|g<<24|t<<18|C<<12|A<<6|x))),c<65536)D+=String.fromCharCode(c);else{var L=c-65536;D+=String.fromCharCode(55296|L>>10,56320|L&1023)}}}Module.UTF8ArrayToString=UTF8ArrayToString;function UTF8ToString(i){return UTF8ArrayToString(HEAPU8,i)}Module.UTF8ToString=UTF8ToString;function stringToUTF8Array(i,u,f,c){if(!(c>0))return 0;for(var g=f,t=f+c-1,C=0;C=55296&&A<=57343&&(A=65536+((A&1023)<<10)|i.charCodeAt(++C)&1023),A<=127){if(f>=t)break;u[f++]=A}else if(A<=2047){if(f+1>=t)break;u[f++]=192|A>>6,u[f++]=128|A&63}else if(A<=65535){if(f+2>=t)break;u[f++]=224|A>>12,u[f++]=128|A>>6&63,u[f++]=128|A&63}else if(A<=2097151){if(f+3>=t)break;u[f++]=240|A>>18,u[f++]=128|A>>12&63,u[f++]=128|A>>6&63,u[f++]=128|A&63}else if(A<=67108863){if(f+4>=t)break;u[f++]=248|A>>24,u[f++]=128|A>>18&63,u[f++]=128|A>>12&63,u[f++]=128|A>>6&63,u[f++]=128|A&63}else{if(f+5>=t)break;u[f++]=252|A>>30,u[f++]=128|A>>24&63,u[f++]=128|A>>18&63,u[f++]=128|A>>12&63,u[f++]=128|A>>6&63,u[f++]=128|A&63}}return u[f]=0,f-g}Module.stringToUTF8Array=stringToUTF8Array;function stringToUTF8(i,u,f){return stringToUTF8Array(i,HEAPU8,u,f)}Module.stringToUTF8=stringToUTF8;function lengthBytesUTF8(i){for(var u=0,f=0;f=55296&&c<=57343&&(c=65536+((c&1023)<<10)|i.charCodeAt(++f)&1023),c<=127?++u:c<=2047?u+=2:c<=65535?u+=3:c<=2097151?u+=4:c<=67108863?u+=5:u+=6}return u}Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf-16le"):void 0;function demangle(i){var u=Module.___cxa_demangle||Module.__cxa_demangle;if(u){try{var f=i.substr(1),c=lengthBytesUTF8(f)+1,g=_malloc(c);stringToUTF8(f,g,c);var t=_malloc(4),C=u(g,0,0,t);if(getValue(t,"i32")===0&&C)return Pointer_stringify(C)}catch(A){}finally{g&&_free(g),t&&_free(t),C&&_free(C)}return i}return Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),i}function demangleAll(i){var u=/__Z[\w\d_]+/g;return i.replace(u,function(f){var c=demangle(f);return f===c?f:f+" ["+c+"]"})}function jsStackTrace(){var i=new Error;if(!i.stack){try{throw new Error(0)}catch(u){i=u}if(!i.stack)return"(no stack trace available)"}return i.stack.toString()}function stackTrace(){var i=jsStackTrace();return Module.extraStackTrace&&(i+=`
-`+Module.extraStackTrace()),demangleAll(i)}Module.stackTrace=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;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)}var STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1;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()}var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||134217728;TOTAL_MEMORY0;){var u=i.shift();if(typeof u=="function"){u();continue}var f=u.func;typeof f=="number"?u.arg===void 0?Module.dynCall_v(f):Module.dynCall_vi(f,u.arg):f(u.arg===void 0?null:u.arg)}}var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for(typeof Module.preRun=="function"&&(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(typeof Module.postRun=="function"&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(i){__ATPRERUN__.unshift(i)}Module.addOnPreRun=addOnPreRun;function addOnInit(i){__ATINIT__.unshift(i)}Module.addOnInit=addOnInit;function addOnPreMain(i){__ATMAIN__.unshift(i)}Module.addOnPreMain=addOnPreMain;function addOnExit(i){__ATEXIT__.unshift(i)}Module.addOnExit=addOnExit;function addOnPostRun(i){__ATPOSTRUN__.unshift(i)}Module.addOnPostRun=addOnPostRun;function intArrayFromString(i,u,f){var c=f>0?f:lengthBytesUTF8(i)+1,g=new Array(c),t=stringToUTF8Array(i,g,0,g.length);return u&&(g.length=t),g}Module.intArrayFromString=intArrayFromString;function intArrayToString(i){for(var u=[],f=0;f255&&(c&=255),u.push(String.fromCharCode(c))}return u.join("")}Module.intArrayToString=intArrayToString;function writeStringToMemory(i,u,f){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var c,g;f&&(g=u+lengthBytesUTF8(i),c=HEAP8[g]),stringToUTF8(i,u,Infinity),f&&(HEAP8[g]=c)}Module.writeStringToMemory=writeStringToMemory;function writeArrayToMemory(i,u){HEAP8.set(i,u)}Module.writeArrayToMemory=writeArrayToMemory;function writeAsciiToMemory(i,u,f){for(var c=0;c>0]=i.charCodeAt(c);f||(HEAP8[u>>0]=0)}if(Module.writeAsciiToMemory=writeAsciiToMemory,(!Math.imul||Math.imul(4294967295,5)!==-5)&&(Math.imul=function(u,f){var c=u>>>16,g=u&65535,t=f>>>16,C=f&65535;return g*C+(c*C+g*t<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(i){return froundBuffer[0]=i,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(i){i=i>>>0;for(var u=0;u<32;u++)if(i&1<<31-u)return u;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(i){return i<0?Math.ceil(i):Math.floor(i)}),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(i){return i}function addRunDependency(i){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}Module.addRunDependency=addRunDependency;function removeRunDependency(i){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),runDependencies==0&&(runDependencyWatcher!==null&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var u=dependenciesFulfilled;dependenciesFulfilled=null,u()}}Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var ASM_CONSTS=[function(i,u,f,c,g,t,C,A){return _nbind.callbackSignatureList[i].apply(this,arguments)}];function _emscripten_asm_const_iiiiiiii(i,u,f,c,g,t,C,A){return ASM_CONSTS[i](u,f,c,g,t,C,A)}function _emscripten_asm_const_iiiii(i,u,f,c,g){return ASM_CONSTS[i](u,f,c,g)}function _emscripten_asm_const_iiidddddd(i,u,f,c,g,t,C,A,x){return ASM_CONSTS[i](u,f,c,g,t,C,A,x)}function _emscripten_asm_const_iiididi(i,u,f,c,g,t,C){return ASM_CONSTS[i](u,f,c,g,t,C)}function _emscripten_asm_const_iiii(i,u,f,c){return ASM_CONSTS[i](u,f,c)}function _emscripten_asm_const_iiiid(i,u,f,c,g){return ASM_CONSTS[i](u,f,c,g)}function _emscripten_asm_const_iiiiii(i,u,f,c,g,t){return ASM_CONSTS[i](u,f,c,g,t)}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;STATICTOP+=16;function _atexit(i,u){__ATEXIT__.unshift({func:i,arg:u})}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(i,u,f,c){var g=arguments.length,t=g<3?u:c===null?c=Object.getOwnPropertyDescriptor(u,f):c,C;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")t=Reflect.decorate(i,u,f,c);else for(var A=i.length-1;A>=0;A--)(C=i[A])&&(t=(g<3?C(t):g>3?C(u,f,t):C(u,f))||t);return g>3&&t&&Object.defineProperty(u,f,t),t}function _defineHidden(i){return function(u,f){Object.defineProperty(u,f,{configurable:!1,enumerable:!1,value:i,writable:!0})}}var _nbind={};function __nbind_free_external(i){_nbind.externalList[i].dereference(i)}function __nbind_reference_external(i){_nbind.externalList[i].reference()}function _llvm_stackrestore(i){var u=_llvm_stacksave,f=u.LLVM_SAVEDSTACKS[i];u.LLVM_SAVEDSTACKS.splice(i,1),Runtime.stackRestore(f)}function __nbind_register_pool(i,u,f,c){_nbind.Pool.pageSize=i,_nbind.Pool.usedPtr=u/4,_nbind.Pool.rootPtr=f,_nbind.Pool.pagePtr=c/4,HEAP32[u/4]=16909060,HEAP8[u]==1&&(_nbind.bigEndian=!0),HEAP32[u/4]=0,_nbind.makeTypeKindTbl=(t={},t[1024]=_nbind.PrimitiveType,t[64]=_nbind.Int64Type,t[2048]=_nbind.BindClass,t[3072]=_nbind.BindClassPtr,t[4096]=_nbind.SharedClassPtr,t[5120]=_nbind.ArrayType,t[6144]=_nbind.ArrayType,t[7168]=_nbind.CStringType,t[9216]=_nbind.CallbackType,t[10240]=_nbind.BindType,t),_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 g=_nbind.makeType(_nbind.constructType,{flags:2048,id:0,name:""});g.proto=Module,_nbind.BindClass.list.push(g);var t}function _emscripten_set_main_loop_timing(i,u){if(Browser.mainLoop.timingMode=i,Browser.mainLoop.timingValue=u,!Browser.mainLoop.func)return 1;if(i==0)Browser.mainLoop.scheduler=function(){var C=Math.max(0,Browser.mainLoop.tickStartTime+u-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,C)},Browser.mainLoop.method="timeout";else if(i==1)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method="rAF";else if(i==2){if(!window.setImmediate){let t=function(C){C.source===window&&C.data===c&&(C.stopPropagation(),f.shift()())};var g=t,f=[],c="setimmediate";window.addEventListener("message",t,!0),window.setImmediate=function(A){f.push(A),ENVIRONMENT_IS_WORKER?(Module.setImmediates===void 0&&(Module.setImmediates=[]),Module.setImmediates.push(A),window.postMessage({target:c})):window.postMessage(c,"*")}}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(i,u,f,c,g){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=i,Browser.mainLoop.arg=c;var t;typeof c!="undefined"?t=function(){Module.dynCall_vi(i,c)}:t=function(){Module.dynCall_v(i)};var C=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT){if(Browser.mainLoop.queue.length>0){var x=Date.now(),D=Browser.mainLoop.queue.shift();if(D.func(D.arg),Browser.mainLoop.remainingBlockers){var L=Browser.mainLoop.remainingBlockers,N=L%1==0?L-1:Math.floor(L);D.counted?Browser.mainLoop.remainingBlockers=N:(N=N+.5,Browser.mainLoop.remainingBlockers=(8*L+N)/9)}if(console.log('main loop blocker "'+D.name+'" took '+(Date.now()-x)+" ms"),Browser.mainLoop.updateStatus(),C1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else Browser.mainLoop.timingMode==0&&(Browser.mainLoop.tickStartTime=_emscripten_get_now());Browser.mainLoop.method==="timeout"&&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(t),!(C0?_emscripten_set_main_loop_timing(0,1e3/u):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),f)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 i=Browser.mainLoop.timingMode,u=Browser.mainLoop.timingValue,f=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(f,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(i,u),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var i=Module.statusMessage||"Please wait...",u=Browser.mainLoop.remainingBlockers,f=Browser.mainLoop.expectedBlockers;u?u=6;){var Le=J>>Te-6&63;Te-=6,De+=Se[Le]}return Te==2?(De+=Se[(J&3)<<4],De+=me+me):Te==4&&(De+=Se[(J&15)<<2],De+=me),De}h.src="data:audio/x-"+C.substr(-3)+";base64,"+Q(t),L(h)},h.src=$,Browser.safeSetTimeout(function(){L(h)},1e4)}else return N()},Module.preloadPlugins.push(u);function f(){Browser.pointerLock=document.pointerLockElement===Module.canvas||document.mozPointerLockElement===Module.canvas||document.webkitPointerLockElement===Module.canvas||document.msPointerLockElement===Module.canvas}var c=Module.canvas;c&&(c.requestPointerLock=c.requestPointerLock||c.mozRequestPointerLock||c.webkitRequestPointerLock||c.msRequestPointerLock||function(){},c.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},c.exitPointerLock=c.exitPointerLock.bind(document),document.addEventListener("pointerlockchange",f,!1),document.addEventListener("mozpointerlockchange",f,!1),document.addEventListener("webkitpointerlockchange",f,!1),document.addEventListener("mspointerlockchange",f,!1),Module.elementPointerLock&&c.addEventListener("click",function(g){!Browser.pointerLock&&Module.canvas.requestPointerLock&&(Module.canvas.requestPointerLock(),g.preventDefault())},!1))},createContext:function(i,u,f,c){if(u&&Module.ctx&&i==Module.canvas)return Module.ctx;var g,t;if(u){var C={antialias:!1,alpha:!1};if(c)for(var A in c)C[A]=c[A];t=GL.createContext(i,C),t&&(g=GL.getContext(t).GLctx)}else g=i.getContext("2d");return g?(f&&(u||assert(typeof GLctx=="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it"),Module.ctx=g,u&&GL.makeContextCurrent(t),Module.useWebGL=u,Browser.moduleContextCreatedCallbacks.forEach(function(x){x()}),Browser.init()),g):null},destroyContext:function(i,u,f){},fullscreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullscreen:function(i,u,f){Browser.lockPointer=i,Browser.resizeCanvas=u,Browser.vrDevice=f,typeof Browser.lockPointer=="undefined"&&(Browser.lockPointer=!0),typeof Browser.resizeCanvas=="undefined"&&(Browser.resizeCanvas=!1),typeof Browser.vrDevice=="undefined"&&(Browser.vrDevice=null);var c=Module.canvas;function g(){Browser.isFullscreen=!1;var C=c.parentNode;(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===C?(c.exitFullscreen=document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.msExitFullscreen||document.webkitCancelFullScreen||function(){},c.exitFullscreen=c.exitFullscreen.bind(document),Browser.lockPointer&&c.requestPointerLock(),Browser.isFullscreen=!0,Browser.resizeCanvas&&Browser.setFullscreenCanvasSize()):(C.parentNode.insertBefore(c,C),C.parentNode.removeChild(C),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullscreen),Module.onFullscreen&&Module.onFullscreen(Browser.isFullscreen),Browser.updateCanvasDimensions(c)}Browser.fullscreenHandlersInstalled||(Browser.fullscreenHandlersInstalled=!0,document.addEventListener("fullscreenchange",g,!1),document.addEventListener("mozfullscreenchange",g,!1),document.addEventListener("webkitfullscreenchange",g,!1),document.addEventListener("MSFullscreenChange",g,!1));var t=document.createElement("div");c.parentNode.insertBefore(t,c),t.appendChild(c),t.requestFullscreen=t.requestFullscreen||t.mozRequestFullScreen||t.msRequestFullscreen||(t.webkitRequestFullscreen?function(){t.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}:null)||(t.webkitRequestFullScreen?function(){t.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),f?t.requestFullscreen({vrDisplay:f}):t.requestFullscreen()},requestFullScreen:function(i,u,f){return Module.printErr("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead."),Browser.requestFullScreen=function(c,g,t){return Browser.requestFullscreen(c,g,t)},Browser.requestFullscreen(i,u,f)},nextRAF:0,fakeRequestAnimationFrame:function(i){var u=Date.now();if(Browser.nextRAF===0)Browser.nextRAF=u+1e3/60;else for(;u+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var f=Math.max(Browser.nextRAF-u,0);setTimeout(i,f)},requestAnimationFrame:function(u){typeof window=="undefined"?Browser.fakeRequestAnimationFrame(u):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(u))},safeCallback:function(i){return function(){if(!ABORT)return i.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var i=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],i.forEach(function(u){u()})}},safeRequestAnimationFrame:function(i){return Browser.requestAnimationFrame(function(){ABORT||(Browser.allowAsyncCallbacks?i():Browser.queuedAsyncCallbacks.push(i))})},safeSetTimeout:function(i,u){return Module.noExitRuntime=!0,setTimeout(function(){ABORT||(Browser.allowAsyncCallbacks?i():Browser.queuedAsyncCallbacks.push(i))},u)},safeSetInterval:function(i,u){return Module.noExitRuntime=!0,setInterval(function(){ABORT||Browser.allowAsyncCallbacks&&i()},u)},getMimetype:function(i){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[i.substr(i.lastIndexOf(".")+1)]},getUserMedia:function(i){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(i)},getMovementX:function(i){return i.movementX||i.mozMovementX||i.webkitMovementX||0},getMovementY:function(i){return i.movementY||i.mozMovementY||i.webkitMovementY||0},getMouseWheelDelta:function(i){var u=0;switch(i.type){case"DOMMouseScroll":u=i.detail;break;case"mousewheel":u=i.wheelDelta;break;case"wheel":u=i.deltaY;break;default:throw"unrecognized mouse wheel event: "+i.type}return u},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(i){if(Browser.pointerLock)i.type!="mousemove"&&"mozMovementX"in i?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(i),Browser.mouseMovementY=Browser.getMovementY(i)),typeof SDL!="undefined"?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var u=Module.canvas.getBoundingClientRect(),f=Module.canvas.width,c=Module.canvas.height,g=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset,t=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;if(i.type==="touchstart"||i.type==="touchend"||i.type==="touchmove"){var C=i.touch;if(C===void 0)return;var A=C.pageX-(g+u.left),x=C.pageY-(t+u.top);A=A*(f/u.width),x=x*(c/u.height);var D={x:A,y:x};if(i.type==="touchstart")Browser.lastTouches[C.identifier]=D,Browser.touches[C.identifier]=D;else if(i.type==="touchend"||i.type==="touchmove"){var L=Browser.touches[C.identifier];L||(L=D),Browser.lastTouches[C.identifier]=L,Browser.touches[C.identifier]=D}return}var N=i.pageX-(g+u.left),j=i.pageY-(t+u.top);N=N*(f/u.width),j=j*(c/u.height),Browser.mouseMovementX=N-Browser.mouseX,Browser.mouseMovementY=j-Browser.mouseY,Browser.mouseX=N,Browser.mouseY=j}},asyncLoad:function(i,u,f,c){var g=c?"":getUniqueRunDependency("al "+i);Module.readAsync(i,function(t){assert(t,'Loading data file "'+i+'" failed (no arrayBuffer).'),u(new Uint8Array(t)),g&&removeRunDependency(g)},function(t){if(f)f();else throw'Loading data file "'+i+'" failed.'}),g&&addRunDependency(g)},resizeListeners:[],updateResizeListeners:function(){var i=Module.canvas;Browser.resizeListeners.forEach(function(u){u(i.width,i.height)})},setCanvasSize:function(i,u,f){var c=Module.canvas;Browser.updateCanvasDimensions(c,i,u),f||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var i=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];i=i|8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=i}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var i=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];i=i&~8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=i}Browser.updateResizeListeners()},updateCanvasDimensions:function(i,u,f){u&&f?(i.widthNative=u,i.heightNative=f):(u=i.widthNative,f=i.heightNative);var c=u,g=f;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(c/g>2];return u},getStr:function(){var i=Pointer_stringify(SYSCALLS.get());return i},get64:function(){var i=SYSCALLS.get(),u=SYSCALLS.get();return i>=0?assert(u===0):assert(u===-1),i},getZero:function(){assert(SYSCALLS.get()===0)}};function ___syscall6(i,u){SYSCALLS.varargs=u;try{var f=SYSCALLS.getStreamFromFD();return FS.close(f),0}catch(c){return(typeof FS=="undefined"||!(c instanceof FS.ErrnoError))&&abort(c),-c.errno}}function ___syscall54(i,u){SYSCALLS.varargs=u;try{return 0}catch(f){return(typeof FS=="undefined"||!(f instanceof FS.ErrnoError))&&abort(f),-f.errno}}function _typeModule(i){var u=[[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 f(x,D,L,N,j,$){if(D==1){var h=N&896;(h==128||h==256||h==384)&&(x="X const")}var re;return $?re=L.replace("X",x).replace("Y",j):re=x.replace("X",L).replace("Y",j),re.replace(/([*&]) (?=[*&])/g,"$1")}function c(x,D,L,N,j){throw new Error(x+" type "+L.replace("X",D+"?")+(N?" with flag "+N:"")+" in "+j)}function g(x,D,L,N,j,$,h,re){$===void 0&&($="X"),re===void 0&&(re=1);var ce=L(x);if(ce)return ce;var Q=N(x),oe=Q.placeholderFlag,Se=u[oe];h&&Se&&($=f(h[2],h[0],$,Se[0],"?",!0));var me;oe==0&&(me="Unbound"),oe>=10&&(me="Corrupt"),re>20&&(me="Deeply nested"),me&&c(me,x,$,oe,j||"?");var De=Q.paramList[0],J=g(De,D,L,N,j,$,Se,re+1),Te,Oe={flags:Se[0],id:x,name:"",paramList:[J]},Le=[],ot="?";switch(Q.placeholderFlag){case 1:Te=J.spec;break;case 2:if((J.flags&15360)==1024&&J.spec.ptrSize==1){Oe.flags=7168;break}case 3:case 6:case 5:Te=J.spec,(J.flags&15360)!=2048;break;case 8:ot=""+Q.paramList[1],Oe.paramList.push(Q.paramList[1]);break;case 9:for(var ct=0,Ue=Q.paramList[1];ct>2]=i),i}function _llvm_stacksave(){var i=_llvm_stacksave;return i.LLVM_SAVEDSTACKS||(i.LLVM_SAVEDSTACKS=[]),i.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),i.LLVM_SAVEDSTACKS.length-1}function ___syscall140(i,u){SYSCALLS.varargs=u;try{var f=SYSCALLS.getStreamFromFD(),c=SYSCALLS.get(),g=SYSCALLS.get(),t=SYSCALLS.get(),C=SYSCALLS.get(),A=g;return FS.llseek(f,A,C),HEAP32[t>>2]=f.position,f.getdents&&A===0&&C===0&&(f.getdents=null),0}catch(x){return(typeof FS=="undefined"||!(x instanceof FS.ErrnoError))&&abort(x),-x.errno}}function ___syscall146(i,u){SYSCALLS.varargs=u;try{var f=SYSCALLS.get(),c=SYSCALLS.get(),g=SYSCALLS.get(),t=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(L,N){var j=___syscall146.buffers[L];assert(j),N===0||N===10?((L===1?Module.print:Module.printErr)(UTF8ArrayToString(j,0)),j.length=0):j.push(N)});for(var C=0;C>2],x=HEAP32[c+(C*8+4)>>2],D=0;Di.pageSize/2||u>i.pageSize-f){var c=_nbind.typeNameTbl.NBind.proto;return c.lalloc(u)}else return HEAPU32[i.usedPtr]=f+u,i.rootPtr+f},i.lreset=function(u,f){var c=HEAPU32[i.pagePtr];if(c){var g=_nbind.typeNameTbl.NBind.proto;g.lreset(u,f)}else HEAPU32[i.usedPtr]=u},i}();_nbind.Pool=Pool;function constructType(i,u){var f=i==10240?_nbind.makeTypeNameTbl[u.name]||_nbind.BindType:_nbind.makeTypeKindTbl[i],c=new f(u);return typeIdTbl[u.id]=c,_nbind.typeNameTbl[u.name]=c,c}_nbind.constructType=constructType;function getType(i){return typeIdTbl[i]}_nbind.getType=getType;function queryType(i){var u=HEAPU8[i],f=_nbind.structureList[u][1];i/=4,f<0&&(++i,f=HEAPU32[i]+1);var c=Array.prototype.slice.call(HEAPU32.subarray(i+1,i+1+f));return u==9&&(c=[c[0],c.slice(1)]),{paramList:c,placeholderFlag:u}}_nbind.queryType=queryType;function getTypes(i,u){return i.map(function(f){return typeof f=="number"?_nbind.getComplexType(f,constructType,getType,queryType,u):_nbind.typeNameTbl[f]})}_nbind.getTypes=getTypes;function readTypeIdList(i,u){return Array.prototype.slice.call(HEAPU32,i/4,i/4+u)}_nbind.readTypeIdList=readTypeIdList;function readAsciiString(i){for(var u=i;HEAPU8[u++];);return String.fromCharCode.apply("",HEAPU8.subarray(i,u-1))}_nbind.readAsciiString=readAsciiString;function readPolicyList(i){var u={};if(i)for(;;){var f=HEAPU32[i/4];if(!f)break;u[readAsciiString(f)]=!0,i+=4}return u}_nbind.readPolicyList=readPolicyList;function getDynCall(i,u){var f={float32_t:"d",float64_t:"d",int64_t:"d",uint64_t:"d",void:"v"},c=i.map(function(t){return f[t.name]||"i"}).join(""),g=Module["dynCall_"+c];if(!g)throw new Error("dynCall_"+c+" not found for "+u+"("+i.map(function(t){return t.name}).join(", ")+")");return g}_nbind.getDynCall=getDynCall;function addMethod(i,u,f,c){var g=i[u];i.hasOwnProperty(u)&&g?((g.arity||g.arity===0)&&(g=_nbind.makeOverloader(g,g.arity),i[u]=g),g.addMethod(f,c)):(f.arity=c,i[u]=f)}_nbind.addMethod=addMethod;function throwError(i){throw new Error(i)}_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(i){__extends(u,i);function u(){var f=i!==null&&i.apply(this,arguments)||this;return f.heap=HEAPU32,f.ptrSize=4,f}return u.prototype.needsWireRead=function(f){return!!this.wireRead||!!this.makeWireRead},u.prototype.needsWireWrite=function(f){return!!this.wireWrite||!!this.makeWireWrite},u}(_nbind.Type);_nbind.BindType=BindType;var PrimitiveType=function(i){__extends(u,i);function u(f){var c=i.call(this,f)||this,g=f.flags&32?{32:HEAPF32,64:HEAPF64}:f.flags&8?{8:HEAPU8,16:HEAPU16,32:HEAPU32}:{8:HEAP8,16:HEAP16,32:HEAP32};return c.heap=g[f.ptrSize*8],c.ptrSize=f.ptrSize,c}return u.prototype.needsWireWrite=function(f){return!!f&&!!f.Strict},u.prototype.makeWireWrite=function(f,c){return c&&c.Strict&&function(g){if(typeof g=="number")return g;throw new Error("Type mismatch")}},u}(BindType);_nbind.PrimitiveType=PrimitiveType;function pushCString(i,u){if(i==null){if(u&&u.Nullable)return 0;throw new Error("Type mismatch")}if(u&&u.Strict){if(typeof i!="string")throw new Error("Type mismatch")}else i=i.toString();var f=Module.lengthBytesUTF8(i)+1,c=_nbind.Pool.lalloc(f);return Module.stringToUTF8Array(i,HEAPU8,c,f),c}_nbind.pushCString=pushCString;function popCString(i){return i===0?null:Module.Pointer_stringify(i)}_nbind.popCString=popCString;var CStringType=function(i){__extends(u,i);function u(){var f=i!==null&&i.apply(this,arguments)||this;return f.wireRead=popCString,f.wireWrite=pushCString,f.readResources=[_nbind.resources.pool],f.writeResources=[_nbind.resources.pool],f}return u.prototype.makeWireWrite=function(f,c){return function(g){return pushCString(g,c)}},u}(BindType);_nbind.CStringType=CStringType;var BooleanType=function(i){__extends(u,i);function u(){var f=i!==null&&i.apply(this,arguments)||this;return f.wireRead=function(c){return!!c},f}return u.prototype.needsWireWrite=function(f){return!!f&&!!f.Strict},u.prototype.makeWireRead=function(f){return"!!("+f+")"},u.prototype.makeWireWrite=function(f,c){return c&&c.Strict&&function(g){if(typeof g=="boolean")return g;throw new Error("Type mismatch")}||f},u}(BindType);_nbind.BooleanType=BooleanType;var Wrapper=function(){function i(){}return i.prototype.persist=function(){this.__nbindState|=1},i}();_nbind.Wrapper=Wrapper;function makeBound(i,u){var f=function(c){__extends(g,c);function g(t,C,A,x){var D=c.call(this)||this;if(!(D instanceof g))return new(Function.prototype.bind.apply(g,Array.prototype.concat.apply([null],arguments)));var L=C,N=A,j=x;if(t!==_nbind.ptrMarker){var $=D.__nbindConstructor.apply(D,arguments);L=4096|512,j=HEAPU32[$/4],N=HEAPU32[$/4+1]}var h={configurable:!0,enumerable:!1,value:null,writable:!1},re={__nbindFlags:L,__nbindPtr:N};j&&(re.__nbindShared=j,_nbind.mark(D));for(var ce=0,Q=Object.keys(re);ce>=1;var f=_nbind.valueList[i];return _nbind.valueList[i]=firstFreeValue,firstFreeValue=i,f}else{if(u)return _nbind.popShared(i,u);throw new Error("Invalid value slot "+i)}}_nbind.popValue=popValue;var valueBase=18446744073709552e3;function push64(i){return typeof i=="number"?i:pushValue(i)*4096+valueBase}function pop64(i){return i=3?C=Buffer.from(t):C=new Buffer(t),C.copy(c)}else getBuffer(c).set(t)}}_nbind.commitBuffer=commitBuffer;var dirtyList=[],gcTimer=0;function sweep(){for(var i=0,u=dirtyList;i>2]=DYNAMIC_BASE,staticSealed=!0;function invoke_viiiii(i,u,f,c,g,t){try{Module.dynCall_viiiii(i,u,f,c,g,t)}catch(C){if(typeof C!="number"&&C!=="longjmp")throw C;Module.setThrew(1,0)}}function invoke_vif(i,u,f){try{Module.dynCall_vif(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_vid(i,u,f){try{Module.dynCall_vid(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_fiff(i,u,f,c){try{return Module.dynCall_fiff(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_vi(i,u){try{Module.dynCall_vi(i,u)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_vii(i,u,f){try{Module.dynCall_vii(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_ii(i,u){try{return Module.dynCall_ii(i,u)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_viddi(i,u,f,c,g){try{Module.dynCall_viddi(i,u,f,c,g)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}function invoke_vidd(i,u,f,c){try{Module.dynCall_vidd(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_iiii(i,u,f,c){try{return Module.dynCall_iiii(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_diii(i,u,f,c){try{return Module.dynCall_diii(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_di(i,u){try{return Module.dynCall_di(i,u)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_iid(i,u,f){try{return Module.dynCall_iid(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_iii(i,u,f){try{return Module.dynCall_iii(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_viiddi(i,u,f,c,g,t){try{Module.dynCall_viiddi(i,u,f,c,g,t)}catch(C){if(typeof C!="number"&&C!=="longjmp")throw C;Module.setThrew(1,0)}}function invoke_viiiiii(i,u,f,c,g,t,C){try{Module.dynCall_viiiiii(i,u,f,c,g,t,C)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_dii(i,u,f){try{return Module.dynCall_dii(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_i(i){try{return Module.dynCall_i(i)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_iiiiii(i,u,f,c,g,t){try{return Module.dynCall_iiiiii(i,u,f,c,g,t)}catch(C){if(typeof C!="number"&&C!=="longjmp")throw C;Module.setThrew(1,0)}}function invoke_viiid(i,u,f,c,g){try{Module.dynCall_viiid(i,u,f,c,g)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}function invoke_viififi(i,u,f,c,g,t,C){try{Module.dynCall_viififi(i,u,f,c,g,t,C)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_viii(i,u,f,c){try{Module.dynCall_viii(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_v(i){try{Module.dynCall_v(i)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_viid(i,u,f,c){try{Module.dynCall_viid(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_idd(i,u,f){try{return Module.dynCall_idd(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_viiii(i,u,f,c,g){try{Module.dynCall_viiii(i,u,f,c,g)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}Module.asmGlobalArg={Math,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Float32Array,Float64Array,NaN:NaN,Infinity:Infinity},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(i,u,f){var c=new i.Int8Array(f),g=new i.Int16Array(f),t=new i.Int32Array(f),C=new i.Uint8Array(f),A=new i.Uint16Array(f),x=new i.Uint32Array(f),D=new i.Float32Array(f),L=new i.Float64Array(f),N=u.DYNAMICTOP_PTR|0,j=u.tempDoublePtr|0,$=u.ABORT|0,h=u.STACKTOP|0,re=u.STACK_MAX|0,ce=u.cttz_i8|0,Q=u.___dso_handle|0,oe=0,Se=0,me=0,De=0,J=i.NaN,Te=i.Infinity,Oe=0,Le=0,ot=0,ct=0,Ue=0,be=0,At=i.Math.floor,Ot=i.Math.abs,Nt=i.Math.sqrt,Je=i.Math.pow,V=i.Math.cos,ne=i.Math.sin,ge=i.Math.tan,Z=i.Math.acos,Ae=i.Math.asin,at=i.Math.atan,it=i.Math.atan2,Ft=i.Math.exp,jt=i.Math.log,hn=i.Math.ceil,Un=i.Math.imul,Jt=i.Math.min,Yt=i.Math.max,cr=i.Math.clz32,w=i.Math.fround,pt=u.abort,Mn=u.assert,Bn=u.enlargeMemory,Xn=u.getTotalMemory,vr=u.abortOnCannotGrowMemory,gr=u.invoke_viiiii,r0=u.invoke_vif,Ci=u.invoke_vid,yo=u.invoke_fiff,Ds=u.invoke_vi,Mu=u.invoke_vii,Gf=u.invoke_ii,iu=u.invoke_viddi,ou=u.invoke_vidd,ol=u.invoke_iiii,ul=u.invoke_diii,Es=u.invoke_di,Uo=u.invoke_iid,sl=u.invoke_iii,Ss=u.invoke_viiddi,Cs=u.invoke_viiiiii,Ti=u.invoke_dii,Fu=u.invoke_i,ll=u.invoke_iiiiii,fl=u.invoke_viiid,cl=u.invoke_viififi,al=u.invoke_viii,Ui=u.invoke_v,Mr=u.invoke_viid,Ac=u.invoke_idd,of=u.invoke_viiii,Ts=u._emscripten_asm_const_iiiii,xs=u._emscripten_asm_const_iiidddddd,dl=u._emscripten_asm_const_iiiid,qi=u.__nbind_reference_external,qo=u._emscripten_asm_const_iiiiiiii,kr=u._removeAccessorPrefix,Fr=u._typeModule,si=u.__nbind_register_pool,H0=u.__decorate,b0=u._llvm_stackrestore,Bt=u.___cxa_atexit,Lu=u.__extends,c0=u.__nbind_get_value_object,Ru=u.__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,ks=u._emscripten_set_main_loop_timing,As=u.__nbind_register_primitive,uu=u.__nbind_register_type,wo=u._emscripten_memcpy_big,zo=u.__nbind_register_function,Os=u.___setErrNo,Is=u.__nbind_register_class,uf=u.__nbind_finish,_n=u._abort,Nu=u._nbind_value,Wo=u._llvm_stacksave,su=u.___syscall54,Ps=u._defineHidden,pl=u._emscripten_set_main_loop,Vf=u._emscripten_get_now,hl=u.__nbind_register_callback_signature,Bu=u._emscripten_asm_const_iiiiii,ju=u.__nbind_free_external,sf=u._emscripten_asm_const_iiii,ro=u._emscripten_asm_const_iiididi,Ms=u.___syscall6,ml=u._atexit,Uu=u.___syscall140,G0=u.___syscall146,Fs=w(0);let tt=w(0);function zi(e){e=e|0;var n=0;return n=h,h=h+e|0,h=h+15&-16,n|0}function lu(){return h|0}function Ho(e){e=e|0,h=e}function O0(e,n){e=e|0,n=n|0,h=e,re=n}function vl(e,n){e=e|0,n=n|0,oe||(oe=e,Se=n)}function gl(e){e=e|0,be=e}function fu(){return be|0}function _l(){var e=0,n=0;vn(8104,8,400)|0,vn(8504,408,540)|0,e=9044,n=e+44|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));c[9088]=0,c[9089]=1,t[2273]=0,t[2274]=948,t[2275]=948,Bt(17,8104,Q|0)|0}function Sn(e){e=e|0,lf(e+948|0)}function gt(e){return e=w(e),((Ar(e)|0)&2147483647)>>>0>2139095040|0}function en(e,n,r){e=e|0,n=n|0,r=r|0;e:do if(t[e+(n<<3)+4>>2]|0)e=e+(n<<3)|0;else{if((n|2|0)==3?t[e+60>>2]|0:0){e=e+56|0;break}switch(n|0){case 0:case 2:case 4:case 5:{if(t[e+52>>2]|0){e=e+48|0;break e}break}default:}if(t[e+68>>2]|0){e=e+64|0;break}else{e=(n|1|0)==5?948:r;break}}while(0);return e|0}function I0(e){e=e|0;var n=0;return n=uh(1e3)|0,li(e,(n|0)!=0,2456),t[2276]=(t[2276]|0)+1,vn(n|0,8104,1e3)|0,c[e+2>>0]|0&&(t[n+4>>2]=2,t[n+12>>2]=4),t[n+976>>2]=e,n|0}function li(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;s=h,h=h+16|0,o=s,n||(t[o>>2]=r,zs(e,5,3197,o)),h=s}function qu(){return I0(956)|0}function Wi(e){e=e|0;var n=0;return n=Tt(1e3)|0,zu(n,e),li(t[e+976>>2]|0,1,2456),t[2276]=(t[2276]|0)+1,t[n+944>>2]=0,n|0}function zu(e,n){e=e|0,n=n|0;var r=0;vn(e|0,n|0,948)|0,af(e+948|0,n+948|0),r=e+960|0,e=n+960|0,n=r+40|0;do t[r>>2]=t[e>>2],r=r+4|0,e=e+4|0;while((r|0)<(n|0))}function Wu(e){e=e|0;var n=0,r=0,o=0,s=0;if(n=e+944|0,r=t[n>>2]|0,r|0&&(Ls(r+948|0,e)|0,t[n>>2]=0),r=fi(e)|0,r|0){n=0;do t[(e0(e,n)|0)+944>>2]=0,n=n+1|0;while((n|0)!=(r|0))}r=e+948|0,o=t[r>>2]|0,s=e+952|0,n=t[s>>2]|0,(n|0)!=(o|0)&&(t[s>>2]=n+(~((n+-4-o|0)>>>2)<<2)),io(r),sh(e),t[2276]=(t[2276]|0)+-1}function Ls(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0;o=t[e>>2]|0,_=e+4|0,r=t[_>>2]|0,l=r;e:do if((o|0)==(r|0))s=o,d=4;else for(e=o;;){if((t[e>>2]|0)==(n|0)){s=e,d=4;break e}if(e=e+4|0,(e|0)==(r|0)){e=0;break}}while(0);return(d|0)==4&&((s|0)!=(r|0)?(o=s+4|0,e=l-o|0,n=e>>2,n&&(Y1(s|0,o|0,e|0)|0,r=t[_>>2]|0),e=s+(n<<2)|0,(r|0)==(e|0)||(t[_>>2]=r+(~((r+-4-e|0)>>>2)<<2)),e=1):e=0),e|0}function fi(e){return e=e|0,(t[e+952>>2]|0)-(t[e+948>>2]|0)>>2|0}function e0(e,n){e=e|0,n=n|0;var r=0;return r=t[e+948>>2]|0,(t[e+952>>2]|0)-r>>2>>>0>n>>>0?e=t[r+(n<<2)>>2]|0:e=0,e|0}function io(e){e=e|0;var n=0,r=0,o=0,s=0;o=h,h=h+32|0,n=o,s=t[e>>2]|0,r=(t[e+4>>2]|0)-s|0,((t[e+8>>2]|0)-s|0)>>>0>r>>>0&&(s=r>>2,z(n,s,s,e+8|0),dr(e,n),Or(n)),h=o}function D0(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0;k=fi(e)|0;do if(k|0){if((t[(e0(e,0)|0)+944>>2]|0)==(e|0)){if(!(Ls(e+948|0,n)|0))break;vn(n+400|0,8504,540)|0,t[n+944>>2]=0,ln(e);break}d=t[(t[e+976>>2]|0)+12>>2]|0,_=e+948|0,y=(d|0)==0,r=0,l=0;do o=t[(t[_>>2]|0)+(l<<2)>>2]|0,(o|0)==(n|0)?ln(e):(s=Wi(o)|0,t[(t[_>>2]|0)+(r<<2)>>2]=s,t[s+944>>2]=e,y||Q4[d&15](o,s,e,r),r=r+1|0),l=l+1|0;while((l|0)!=(k|0));if(r>>>0>>0){y=e+948|0,_=e+952|0,d=r,r=t[_>>2]|0;do l=(t[y>>2]|0)+(d<<2)|0,o=l+4|0,s=r-o|0,n=s>>2,n&&(Y1(l|0,o|0,s|0)|0,r=t[_>>2]|0),s=r,o=l+(n<<2)|0,(s|0)!=(o|0)&&(r=s+(~((s+-4-o|0)>>>2)<<2)|0,t[_>>2]=r),d=d+1|0;while((d|0)!=(k|0))}}while(0)}function Do(e){e=e|0;var n=0,r=0,o=0,s=0;i0(e,(fi(e)|0)==0,2491),i0(e,(t[e+944>>2]|0)==0,2545),n=e+948|0,r=t[n>>2]|0,o=e+952|0,s=t[o>>2]|0,(s|0)!=(r|0)&&(t[o>>2]=s+(~((s+-4-r|0)>>>2)<<2)),io(n),n=e+976|0,r=t[n>>2]|0,vn(e|0,8104,1e3)|0,c[r+2>>0]|0&&(t[e+4>>2]=2,t[e+12>>2]=4),t[n>>2]=r}function i0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;s=h,h=h+16|0,o=s,n||(t[o>>2]=r,wn(e,5,3197,o)),h=s}function Rs(){return t[2276]|0}function a0(){var e=0;return e=uh(20)|0,Hu((e|0)!=0,2592),t[2277]=(t[2277]|0)+1,t[e>>2]=t[239],t[e+4>>2]=t[240],t[e+8>>2]=t[241],t[e+12>>2]=t[242],t[e+16>>2]=t[243],e|0}function Hu(e,n){e=e|0,n=n|0;var r=0,o=0;o=h,h=h+16|0,r=o,e||(t[r>>2]=n,wn(0,5,3197,r)),h=o}function V0(e){e=e|0,sh(e),t[2277]=(t[2277]|0)+-1}function bu(e,n){e=e|0,n=n|0;var r=0;n?(i0(e,(fi(e)|0)==0,2629),r=1):(r=0,n=0),t[e+964>>2]=n,t[e+988>>2]=r}function Ns(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,l=o+8|0,s=o+4|0,d=o,t[s>>2]=n,i0(e,(t[n+944>>2]|0)==0,2709),i0(e,(t[e+964>>2]|0)==0,2763),bo(e),n=e+948|0,t[d>>2]=(t[n>>2]|0)+(r<<2),t[l>>2]=t[d>>2],P0(n,l,s)|0,t[(t[s>>2]|0)+944>>2]=e,ln(e),h=o}function bo(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0;if(r=fi(e)|0,r|0?(t[(e0(e,0)|0)+944>>2]|0)!=(e|0):0){o=t[(t[e+976>>2]|0)+12>>2]|0,s=e+948|0,l=(o|0)==0,n=0;do d=t[(t[s>>2]|0)+(n<<2)>>2]|0,_=Wi(d)|0,t[(t[s>>2]|0)+(n<<2)>>2]=_,t[_+944>>2]=e,l||Q4[o&15](d,_,e,n),n=n+1|0;while((n|0)!=(r|0))}}function P0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0;Pe=h,h=h+64|0,P=Pe+52|0,_=Pe+48|0,q=Pe+28|0,we=Pe+24|0,le=Pe+20|0,ie=Pe,o=t[e>>2]|0,l=o,n=o+((t[n>>2]|0)-l>>2<<2)|0,o=e+4|0,s=t[o>>2]|0,d=e+8|0;do if(s>>>0<(t[d>>2]|0)>>>0){if((n|0)==(s|0)){t[n>>2]=t[r>>2],t[o>>2]=(t[o>>2]|0)+4;break}Qn(e,n,s,n+4|0),n>>>0<=r>>>0&&(r=(t[o>>2]|0)>>>0>r>>>0?r+4|0:r),t[n>>2]=t[r>>2]}else{o=(s-l>>2)+1|0,s=Q0(e)|0,s>>>0>>0&&$n(e),T=t[e>>2]|0,k=(t[d>>2]|0)-T|0,l=k>>1,z(ie,k>>2>>>0>>1>>>0?l>>>0>>0?o:l:s,n-T>>2,e+8|0),T=ie+8|0,o=t[T>>2]|0,l=ie+12|0,k=t[l>>2]|0,d=k,y=o;do if((o|0)==(k|0)){if(k=ie+4|0,o=t[k>>2]|0,ke=t[ie>>2]|0,s=ke,o>>>0<=ke>>>0){o=d-s>>1,o=(o|0)==0?1:o,z(q,o,o>>>2,t[ie+16>>2]|0),t[we>>2]=t[k>>2],t[le>>2]=t[T>>2],t[_>>2]=t[we>>2],t[P>>2]=t[le>>2],s0(q,_,P),o=t[ie>>2]|0,t[ie>>2]=t[q>>2],t[q>>2]=o,o=q+4|0,ke=t[k>>2]|0,t[k>>2]=t[o>>2],t[o>>2]=ke,o=q+8|0,ke=t[T>>2]|0,t[T>>2]=t[o>>2],t[o>>2]=ke,o=q+12|0,ke=t[l>>2]|0,t[l>>2]=t[o>>2],t[o>>2]=ke,Or(q),o=t[T>>2]|0;break}l=o,d=((l-s>>2)+1|0)/-2|0,_=o+(d<<2)|0,s=y-l|0,l=s>>2,l&&(Y1(_|0,o|0,s|0)|0,o=t[k>>2]|0),ke=_+(l<<2)|0,t[T>>2]=ke,t[k>>2]=o+(d<<2),o=ke}while(0);t[o>>2]=t[r>>2],t[T>>2]=(t[T>>2]|0)+4,n=nn(e,ie,n)|0,Or(ie)}while(0);return h=Pe,n|0}function ln(e){e=e|0;var n=0;do{if(n=e+984|0,c[n>>0]|0)break;c[n>>0]=1,D[e+504>>2]=w(J),e=t[e+944>>2]|0}while((e|0)!=0)}function lf(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-4-o|0)>>>2)<<2)),Ve(r))}function nr(e){return e=e|0,t[e+944>>2]|0}function rr(e){e=e|0,i0(e,(t[e+964>>2]|0)!=0,2832),ln(e)}function Go(e){return e=e|0,(c[e+984>>0]|0)!=0|0}function Gu(e,n){e=e|0,n=n|0,fL(e,n,400)|0&&(vn(e|0,n|0,400)|0,ln(e))}function yl(e){e=e|0;var n=tt;return n=w(D[e+44>>2]),e=gt(n)|0,w(e?w(0):n)}function cu(e){e=e|0;var n=tt;return n=w(D[e+48>>2]),gt(n)|0&&(n=c[(t[e+976>>2]|0)+2>>0]|0?w(1):w(0)),w(n)}function Bs(e,n){e=e|0,n=n|0,t[e+980>>2]=n}function Vu(e){return e=e|0,t[e+980>>2]|0}function M0(e,n){e=e|0,n=n|0;var r=0;r=e+4|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function au(e){return e=e|0,t[e+4>>2]|0}function Lr(e,n){e=e|0,n=n|0;var r=0;r=e+8|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function F(e){return e=e|0,t[e+8>>2]|0}function R(e,n){e=e|0,n=n|0;var r=0;r=e+12|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function U(e){return e=e|0,t[e+12>>2]|0}function H(e,n){e=e|0,n=n|0;var r=0;r=e+16|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function fe(e){return e=e|0,t[e+16>>2]|0}function ue(e,n){e=e|0,n=n|0;var r=0;r=e+20|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function de(e){return e=e|0,t[e+20>>2]|0}function W(e,n){e=e|0,n=n|0;var r=0;r=e+24|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function ve(e){return e=e|0,t[e+24>>2]|0}function Fe(e,n){e=e|0,n=n|0;var r=0;r=e+28|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function Ge(e){return e=e|0,t[e+28>>2]|0}function K(e,n){e=e|0,n=n|0;var r=0;r=e+32|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function xe(e){return e=e|0,t[e+32>>2]|0}function je(e,n){e=e|0,n=n|0;var r=0;r=e+36|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function Xe(e){return e=e|0,t[e+36>>2]|0}function rt(e,n){e=e|0,n=w(n);var r=0;r=e+40|0,w(D[r>>2])!=n&&(D[r>>2]=n,ln(e))}function st(e,n){e=e|0,n=w(n);var r=0;r=e+44|0,w(D[r>>2])!=n&&(D[r>>2]=n,ln(e))}function xt(e,n){e=e|0,n=w(n);var r=0;r=e+48|0,w(D[r>>2])!=n&&(D[r>>2]=n,ln(e))}function wt(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+52|0,s=e+56|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function lt(e,n){e=e|0,n=w(n);var r=0,o=0;o=e+52|0,r=e+56|0,(w(D[o>>2])==n?(t[r>>2]|0)==2:0)||(D[o>>2]=n,o=gt(n)|0,t[r>>2]=o?3:2,ln(e))}function Rt(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+52|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function yn(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=(l^1)&1,s=e+132+(n<<3)|0,n=e+132+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function sn(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=l?0:2,s=e+132+(n<<3)|0,n=e+132+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function ar(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=n+132+(r<<3)|0,n=t[o+4>>2]|0,r=e,t[r>>2]=t[o>>2],t[r+4>>2]=n}function rn(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=(l^1)&1,s=e+60+(n<<3)|0,n=e+60+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function Hn(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=l?0:2,s=e+60+(n<<3)|0,n=e+60+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function d0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=n+60+(r<<3)|0,n=t[o+4>>2]|0,r=e,t[r>>2]=t[o>>2],t[r+4>>2]=n}function Cr(e,n){e=e|0,n=n|0;var r=0;r=e+60+(n<<3)+4|0,(t[r>>2]|0)!=3&&(D[e+60+(n<<3)>>2]=w(J),t[r>>2]=3,ln(e))}function He(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=(l^1)&1,s=e+204+(n<<3)|0,n=e+204+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function Qe(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=l?0:2,s=e+204+(n<<3)|0,n=e+204+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function Ne(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=n+204+(r<<3)|0,n=t[o+4>>2]|0,r=e,t[r>>2]=t[o>>2],t[r+4>>2]=n}function ft(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=(l^1)&1,s=e+276+(n<<3)|0,n=e+276+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function St(e,n){return e=e|0,n=n|0,w(D[e+276+(n<<3)>>2])}function Qt(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+348|0,s=e+352|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Cn(e,n){e=e|0,n=w(n);var r=0,o=0;o=e+348|0,r=e+352|0,(w(D[o>>2])==n?(t[r>>2]|0)==2:0)||(D[o>>2]=n,o=gt(n)|0,t[r>>2]=o?3:2,ln(e))}function bn(e){e=e|0;var n=0;n=e+352|0,(t[n>>2]|0)!=3&&(D[e+348>>2]=w(J),t[n>>2]=3,ln(e))}function p0(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+348|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function h0(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+356|0,s=e+360|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function ci(e,n){e=e|0,n=w(n);var r=0,o=0;o=e+356|0,r=e+360|0,(w(D[o>>2])==n?(t[r>>2]|0)==2:0)||(D[o>>2]=n,o=gt(n)|0,t[r>>2]=o?3:2,ln(e))}function xi(e){e=e|0;var n=0;n=e+360|0,(t[n>>2]|0)!=3&&(D[e+356>>2]=w(J),t[n>>2]=3,ln(e))}function E0(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+356|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function qr(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+364|0,s=e+368|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Eo(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=l?0:2,o=e+364|0,s=e+368|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function So(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+364|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function wl(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+372|0,s=e+376|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function js(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=l?0:2,o=e+372|0,s=e+376|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Dl(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+372|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function du(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+380|0,s=e+384|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Yu(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=l?0:2,o=e+380|0,s=e+384|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Us(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+380|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function oo(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+388|0,s=e+392|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Hi(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=l?0:2,o=e+388|0,s=e+392|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function qs(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+388|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function F0(e,n){e=e|0,n=w(n);var r=0;r=e+396|0,w(D[r>>2])!=n&&(D[r>>2]=n,ln(e))}function Gr(e){return e=e|0,w(D[e+396>>2])}function ir(e){return e=e|0,w(D[e+400>>2])}function L0(e){return e=e|0,w(D[e+404>>2])}function Y0(e){return e=e|0,w(D[e+408>>2])}function Co(e){return e=e|0,w(D[e+412>>2])}function $u(e){return e=e|0,w(D[e+416>>2])}function Vo(e){return e=e|0,w(D[e+420>>2])}function Rr(e,n){switch(e=e|0,n=n|0,i0(e,(n|0)<6,2918),n|0){case 0:{n=(t[e+496>>2]|0)==2?5:4;break}case 2:{n=(t[e+496>>2]|0)==2?4:5;break}default:}return w(D[e+424+(n<<2)>>2])}function Jn(e,n){switch(e=e|0,n=n|0,i0(e,(n|0)<6,2918),n|0){case 0:{n=(t[e+496>>2]|0)==2?5:4;break}case 2:{n=(t[e+496>>2]|0)==2?4:5;break}default:}return w(D[e+448+(n<<2)>>2])}function ai(e,n){switch(e=e|0,n=n|0,i0(e,(n|0)<6,2918),n|0){case 0:{n=(t[e+496>>2]|0)==2?5:4;break}case 2:{n=(t[e+496>>2]|0)==2?4:5;break}default:}return w(D[e+472+(n<<2)>>2])}function o0(e,n){e=e|0,n=n|0;var r=0,o=tt;return r=t[e+4>>2]|0,(r|0)==(t[n+4>>2]|0)?r?(o=w(D[e>>2]),e=w(Ot(w(o-w(D[n>>2]))))>2]=0,t[o+4>>2]=0,t[o+8>>2]=0,Ru(o|0,e|0,n|0,0),wn(e,3,(c[o+11>>0]|0)<0?t[o>>2]|0:o,r),ML(o),h=r}function $0(e,n,r,o){e=w(e),n=w(n),r=r|0,o=o|0;var s=tt;e=w(e*n),s=w(V4(e,w(1)));do if(Vr(s,w(0))|0)e=w(e-s);else{if(e=w(e-s),Vr(s,w(1))|0){e=w(e+w(1));break}if(r){e=w(e+w(1));break}o||(s>w(.5)?s=w(1):(o=Vr(s,w(.5))|0,s=w(o?1:0)),e=w(e+s))}while(0);return w(e/n)}function K0(e,n,r,o,s,l,d,_,y,k,T,P,q){e=e|0,n=w(n),r=r|0,o=w(o),s=s|0,l=w(l),d=d|0,_=w(_),y=w(y),k=w(k),T=w(T),P=w(P),q=q|0;var we=0,le=tt,ie=tt,Pe=tt,ke=tt,qe=tt,pe=tt;return y>2]),le!=w(0)):0)?(Pe=w($0(n,le,0,0)),ke=w($0(o,le,0,0)),ie=w($0(l,le,0,0)),le=w($0(_,le,0,0))):(ie=l,Pe=n,le=_,ke=o),(s|0)==(e|0)?we=Vr(ie,Pe)|0:we=0,(d|0)==(r|0)?q=Vr(le,ke)|0:q=0,((we?0:(qe=w(n-T),!(ae(e,qe,y)|0)))?!(Be(e,qe,s,y)|0):0)?we=Ie(e,qe,s,l,y)|0:we=1,((q?0:(pe=w(o-P),!(ae(r,pe,k)|0)))?!(Be(r,pe,d,k)|0):0)?q=Ie(r,pe,d,_,k)|0:q=1,q=we&q),q|0}function ae(e,n,r){return e=e|0,n=w(n),r=w(r),(e|0)==1?e=Vr(n,r)|0:e=0,e|0}function Be(e,n,r,o){return e=e|0,n=w(n),r=r|0,o=w(o),(e|0)==2&(r|0)==0?n>=o?e=1:e=Vr(n,o)|0:e=0,e|0}function Ie(e,n,r,o,s){return e=e|0,n=w(n),r=r|0,o=w(o),s=w(s),(e|0)==2&(r|0)==2&o>n?s<=n?e=1:e=Vr(n,s)|0:e=0,e|0}function ht(e,n,r,o,s,l,d,_,y,k,T){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=l|0,d=w(d),_=w(_),y=y|0,k=k|0,T=T|0;var P=0,q=0,we=0,le=0,ie=tt,Pe=tt,ke=0,qe=0,pe=0,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0,Dr=tt,Ki=tt,Xi=tt,Ji=0,Ro=0;zt=h,h=h+160|0,It=zt+152|0,Ht=zt+120|0,Ln=zt+104|0,pe=zt+72|0,le=zt+56|0,vt=zt+8|0,qe=zt,_e=(t[2279]|0)+1|0,t[2279]=_e,gn=e+984|0,((c[gn>>0]|0)!=0?(t[e+512>>2]|0)!=(t[2278]|0):0)?ke=4:(t[e+516>>2]|0)==(o|0)?Pn=0:ke=4,(ke|0)==4&&(t[e+520>>2]=0,t[e+924>>2]=-1,t[e+928>>2]=-1,D[e+932>>2]=w(-1),D[e+936>>2]=w(-1),Pn=1);e:do if(t[e+964>>2]|0)if(ie=w(mt(e,2,d)),Pe=w(mt(e,0,d)),P=e+916|0,Xi=w(D[P>>2]),Ki=w(D[e+920>>2]),Dr=w(D[e+932>>2]),K0(s,n,l,r,t[e+924>>2]|0,Xi,t[e+928>>2]|0,Ki,Dr,w(D[e+936>>2]),ie,Pe,T)|0)ke=22;else if(we=t[e+520>>2]|0,!we)ke=21;else for(q=0;;){if(P=e+524+(q*24|0)|0,Dr=w(D[P>>2]),Ki=w(D[e+524+(q*24|0)+4>>2]),Xi=w(D[e+524+(q*24|0)+16>>2]),K0(s,n,l,r,t[e+524+(q*24|0)+8>>2]|0,Dr,t[e+524+(q*24|0)+12>>2]|0,Ki,Xi,w(D[e+524+(q*24|0)+20>>2]),ie,Pe,T)|0){ke=22;break e}if(q=q+1|0,q>>>0>=we>>>0){ke=21;break}}else{if(y){if(P=e+916|0,!(Vr(w(D[P>>2]),n)|0)){ke=21;break}if(!(Vr(w(D[e+920>>2]),r)|0)){ke=21;break}if((t[e+924>>2]|0)!=(s|0)){ke=21;break}P=(t[e+928>>2]|0)==(l|0)?P:0,ke=22;break}if(we=t[e+520>>2]|0,!we)ke=21;else for(q=0;;){if(P=e+524+(q*24|0)|0,((Vr(w(D[P>>2]),n)|0?Vr(w(D[e+524+(q*24|0)+4>>2]),r)|0:0)?(t[e+524+(q*24|0)+8>>2]|0)==(s|0):0)?(t[e+524+(q*24|0)+12>>2]|0)==(l|0):0){ke=22;break e}if(q=q+1|0,q>>>0>=we>>>0){ke=21;break}}}while(0);do if((ke|0)==21)c[11697]|0?(P=0,ke=28):(P=0,ke=31);else if((ke|0)==22){if(q=(c[11697]|0)!=0,!((P|0)!=0&(Pn^1)))if(q){ke=28;break}else{ke=31;break}le=P+16|0,t[e+908>>2]=t[le>>2],we=P+20|0,t[e+912>>2]=t[we>>2],(c[11698]|0)==0|q^1||(t[qe>>2]=Gn(_e)|0,t[qe+4>>2]=_e,wn(e,4,2972,qe),q=t[e+972>>2]|0,q|0&&Nl[q&127](e),s=$t(s,y)|0,l=$t(l,y)|0,Ro=+w(D[le>>2]),Ji=+w(D[we>>2]),t[vt>>2]=s,t[vt+4>>2]=l,L[vt+8>>3]=+n,L[vt+16>>3]=+r,L[vt+24>>3]=Ro,L[vt+32>>3]=Ji,t[vt+40>>2]=k,wn(e,4,2989,vt))}while(0);return(ke|0)==28&&(q=Gn(_e)|0,t[le>>2]=q,t[le+4>>2]=_e,t[le+8>>2]=Pn?3047:11699,wn(e,4,3038,le),q=t[e+972>>2]|0,q|0&&Nl[q&127](e),vt=$t(s,y)|0,ke=$t(l,y)|0,t[pe>>2]=vt,t[pe+4>>2]=ke,L[pe+8>>3]=+n,L[pe+16>>3]=+r,t[pe+24>>2]=k,wn(e,4,3049,pe),ke=31),(ke|0)==31&&(X0(e,n,r,o,s,l,d,_,y,T),c[11697]|0&&(q=t[2279]|0,vt=Gn(q)|0,t[Ln>>2]=vt,t[Ln+4>>2]=q,t[Ln+8>>2]=Pn?3047:11699,wn(e,4,3083,Ln),q=t[e+972>>2]|0,q|0&&Nl[q&127](e),vt=$t(s,y)|0,Ln=$t(l,y)|0,Ji=+w(D[e+908>>2]),Ro=+w(D[e+912>>2]),t[Ht>>2]=vt,t[Ht+4>>2]=Ln,L[Ht+8>>3]=Ji,L[Ht+16>>3]=Ro,t[Ht+24>>2]=k,wn(e,4,3092,Ht)),t[e+516>>2]=o,P||(q=e+520|0,P=t[q>>2]|0,(P|0)==16&&(c[11697]|0&&wn(e,4,3124,It),t[q>>2]=0,P=0),y?P=e+916|0:(t[q>>2]=P+1,P=e+524+(P*24|0)|0),D[P>>2]=n,D[P+4>>2]=r,t[P+8>>2]=s,t[P+12>>2]=l,t[P+16>>2]=t[e+908>>2],t[P+20>>2]=t[e+912>>2],P=0)),y&&(t[e+416>>2]=t[e+908>>2],t[e+420>>2]=t[e+912>>2],c[e+985>>0]=1,c[gn>>0]=0),t[2279]=(t[2279]|0)+-1,t[e+512>>2]=t[2278],h=zt,Pn|(P|0)==0|0}function mt(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return o=w(Tr(e,n,r)),w(o+w(R0(e,n,r)))}function wn(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=h,h=h+16|0,s=l,t[s>>2]=o,e?o=t[e+976>>2]|0:o=0,Ku(o,e,n,r,s),h=l}function Gn(e){return e=e|0,(e>>>0>60?3201:3201+(60-e)|0)|0}function $t(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;return s=h,h=h+32|0,r=s+12|0,o=s,t[r>>2]=t[254],t[r+4>>2]=t[255],t[r+8>>2]=t[256],t[o>>2]=t[257],t[o+4>>2]=t[258],t[o+8>>2]=t[259],(e|0)>2?e=11699:e=t[(n?o:r)+(e<<2)>>2]|0,h=s,e|0}function X0(e,n,r,o,s,l,d,_,y,k){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=l|0,d=w(d),_=w(_),y=y|0,k=k|0;var T=0,P=0,q=0,we=0,le=tt,ie=tt,Pe=tt,ke=tt,qe=tt,pe=tt,_e=tt,vt=0,Ln=0,Ht=0,It=tt,gn=tt,Pn=0,zt=tt,Dr=0,Ki=0,Xi=0,Ji=0,Ro=0,kf=0,Af=0,Cu=0,Of=0,Js=0,Qs=0,If=0,Pf=0,Mf=0,Kn=0,Tu=0,Ff=0,us=0,Lf=tt,Rf=tt,Zs=tt,el=tt,ss=tt,Fi=0,nu=0,go=0,xu=0,jl=0,Ul=tt,tl=tt,ql=tt,zl=tt,Li=tt,Di=tt,ku=0,xr=tt,Wl=tt,Qi=tt,ls=tt,Zi=tt,fs=tt,Hl=0,bl=0,cs=tt,Ri=tt,Au=0,Gl=0,Vl=0,Yl=0,En=tt,br=0,Ei=0,eo=0,Ni=0,xn=0,Vt=0,Ou=0,kt=tt,$l=0,Qr=0;Ou=h,h=h+16|0,Fi=Ou+12|0,nu=Ou+8|0,go=Ou+4|0,xu=Ou,i0(e,(s|0)==0|(gt(n)|0)^1,3326),i0(e,(l|0)==0|(gt(r)|0)^1,3406),Ei=so(e,o)|0,t[e+496>>2]=Ei,xn=N0(2,Ei)|0,Vt=N0(0,Ei)|0,D[e+440>>2]=w(Tr(e,xn,d)),D[e+444>>2]=w(R0(e,xn,d)),D[e+428>>2]=w(Tr(e,Vt,d)),D[e+436>>2]=w(R0(e,Vt,d)),D[e+464>>2]=w(C0(e,xn)),D[e+468>>2]=w(di(e,xn)),D[e+452>>2]=w(C0(e,Vt)),D[e+460>>2]=w(di(e,Vt)),D[e+488>>2]=w(u0(e,xn,d)),D[e+492>>2]=w(v0(e,xn,d)),D[e+476>>2]=w(u0(e,Vt,d)),D[e+484>>2]=w(v0(e,Vt,d));do if(t[e+964>>2]|0)To(e,n,r,s,l,d,_);else{if(eo=e+948|0,Ni=(t[e+952>>2]|0)-(t[eo>>2]|0)>>2,!Ni){pu(e,n,r,s,l,d,_);break}if(y?0:Sl(e,n,r,s,l,d,_)|0)break;bo(e),Tu=e+508|0,c[Tu>>0]=0,xn=N0(t[e+4>>2]|0,Ei)|0,Vt=Cl(xn,Ei)|0,br=Nr(xn)|0,Ff=t[e+8>>2]|0,Gl=e+28|0,us=(t[Gl>>2]|0)!=0,Zi=br?d:_,cs=br?_:d,Lf=w(B0(e,xn,d)),Rf=w(hu(e,xn,d)),le=w(B0(e,Vt,d)),fs=w(Fn(e,xn,d)),Ri=w(Fn(e,Vt,d)),Ht=br?s:l,Au=br?l:s,En=br?fs:Ri,qe=br?Ri:fs,ls=w(mt(e,2,d)),ke=w(mt(e,0,d)),ie=w(w(Tn(e+364|0,d))-En),Pe=w(w(Tn(e+380|0,d))-En),pe=w(w(Tn(e+372|0,_))-qe),_e=w(w(Tn(e+388|0,_))-qe),Zs=br?ie:pe,el=br?Pe:_e,ls=w(n-ls),n=w(ls-En),gt(n)|0?En=n:En=w(Ur(w(cc(n,Pe)),ie)),Wl=w(r-ke),n=w(Wl-qe),gt(n)|0?Qi=n:Qi=w(Ur(w(cc(n,_e)),pe)),ie=br?En:Qi,xr=br?Qi:En;e:do if((Ht|0)==1)for(o=0,P=0;;){if(T=e0(e,P)|0,!o)(w(Br(T))>w(0)?w(zr(T))>w(0):0)?o=T:o=0;else if(pi(T)|0){we=0;break e}if(P=P+1|0,P>>>0>=Ni>>>0){we=o;break}}else we=0;while(0);vt=we+500|0,Ln=we+504|0,o=0,T=0,n=w(0),q=0;do{if(P=t[(t[eo>>2]|0)+(q<<2)>>2]|0,(t[P+36>>2]|0)==1)lo(P),c[P+985>>0]=1,c[P+984>>0]=0;else{$r(P),y&&Yo(P,so(P,Ei)|0,ie,xr,En);do if((t[P+24>>2]|0)!=1)if((P|0)==(we|0)){t[vt>>2]=t[2278],D[Ln>>2]=w(0);break}else{wr(e,P,En,s,Qi,En,Qi,l,Ei,k);break}else T|0&&(t[T+960>>2]=P),t[P+960>>2]=0,T=P,o=(o|0)==0?P:o;while(0);Di=w(D[P+504>>2]),n=w(n+w(Di+w(mt(P,xn,En))))}q=q+1|0}while((q|0)!=(Ni|0));for(Xi=n>ie,ku=us&((Ht|0)==2&Xi)?1:Ht,Dr=(Au|0)==1,Ro=Dr&(y^1),kf=(ku|0)==1,Af=(ku|0)==2,Cu=976+(xn<<2)|0,Of=(Au|2|0)==2,Mf=Dr&(us^1),Js=1040+(Vt<<2)|0,Qs=1040+(xn<<2)|0,If=976+(Vt<<2)|0,Pf=(Au|0)!=1,Xi=us&((Ht|0)!=0&Xi),Ki=e+976|0,Dr=Dr^1,n=ie,Pn=0,Ji=0,Di=w(0),ss=w(0);;){e:do if(Pn>>>0>>0)for(Ln=t[eo>>2]|0,q=0,_e=w(0),pe=w(0),Pe=w(0),ie=w(0),P=0,T=0,we=Pn;;){if(vt=t[Ln+(we<<2)>>2]|0,(t[vt+36>>2]|0)!=1?(t[vt+940>>2]=Ji,(t[vt+24>>2]|0)!=1):0){if(ke=w(mt(vt,xn,En)),Kn=t[Cu>>2]|0,r=w(Tn(vt+380+(Kn<<3)|0,Zi)),qe=w(D[vt+504>>2]),r=w(cc(r,qe)),r=w(Ur(w(Tn(vt+364+(Kn<<3)|0,Zi)),r)),us&(q|0)!=0&w(ke+w(pe+r))>n){l=q,ke=_e,Ht=we;break e}ke=w(ke+r),r=w(pe+ke),ke=w(_e+ke),pi(vt)|0&&(Pe=w(Pe+w(Br(vt))),ie=w(ie-w(qe*w(zr(vt))))),T|0&&(t[T+960>>2]=vt),t[vt+960>>2]=0,q=q+1|0,T=vt,P=(P|0)==0?vt:P}else ke=_e,r=pe;if(we=we+1|0,we>>>0>>0)_e=ke,pe=r;else{l=q,Ht=we;break}}else l=0,ke=w(0),Pe=w(0),ie=w(0),P=0,Ht=Pn;while(0);Kn=Pe>w(0)&Pew(0)&ieel&((gt(el)|0)^1))n=el,Kn=51;else if(c[(t[Ki>>2]|0)+3>>0]|0)Kn=51;else{if(It!=w(0)?w(Br(e))!=w(0):0){Kn=53;break}n=ke,Kn=53}while(0);if((Kn|0)==51&&(Kn=0,gt(n)|0?Kn=53:(gn=w(n-ke),zt=n)),(Kn|0)==53&&(Kn=0,ke>2]|0,we=gnw(0),pe=w(gn/It),Pe=w(0),ke=w(0),n=w(0),T=P;do r=w(Tn(T+380+(q<<3)|0,Zi)),ie=w(Tn(T+364+(q<<3)|0,Zi)),ie=w(cc(r,w(Ur(ie,w(D[T+504>>2]))))),we?(r=w(ie*w(zr(T))),(r!=w(-0)?(kt=w(ie-w(qe*r)),Ul=w(kn(T,xn,kt,zt,En)),kt!=Ul):0)&&(Pe=w(Pe-w(Ul-ie)),n=w(n+r))):((vt?(tl=w(Br(T)),tl!=w(0)):0)?(kt=w(ie+w(pe*tl)),ql=w(kn(T,xn,kt,zt,En)),kt!=ql):0)&&(Pe=w(Pe-w(ql-ie)),ke=w(ke-tl)),T=t[T+960>>2]|0;while((T|0)!=0);if(n=w(_e+n),ie=w(gn+Pe),jl)n=w(0);else{qe=w(It+ke),we=t[Cu>>2]|0,vt=iew(0),qe=w(ie/qe),n=w(0);do{kt=w(Tn(P+380+(we<<3)|0,Zi)),Pe=w(Tn(P+364+(we<<3)|0,Zi)),Pe=w(cc(kt,w(Ur(Pe,w(D[P+504>>2]))))),vt?(kt=w(Pe*w(zr(P))),ie=w(-kt),kt!=w(-0)?(kt=w(pe*ie),ie=w(kn(P,xn,w(Pe+(Ln?ie:kt)),zt,En))):ie=Pe):(q?(zl=w(Br(P)),zl!=w(0)):0)?ie=w(kn(P,xn,w(Pe+w(qe*zl)),zt,En)):ie=Pe,n=w(n-w(ie-Pe)),ke=w(mt(P,xn,En)),r=w(mt(P,Vt,En)),ie=w(ie+ke),D[nu>>2]=ie,t[xu>>2]=1,Pe=w(D[P+396>>2]);e:do if(gt(Pe)|0){T=gt(xr)|0;do if(!T){if(Xi|(m0(P,Vt,xr)|0|Dr)||(T0(e,P)|0)!=4||(t[(hi(P,Vt)|0)+4>>2]|0)==3||(t[(Ai(P,Vt)|0)+4>>2]|0)==3)break;D[Fi>>2]=xr,t[go>>2]=1;break e}while(0);if(m0(P,Vt,xr)|0){T=t[P+992+(t[If>>2]<<2)>>2]|0,kt=w(r+w(Tn(T,xr))),D[Fi>>2]=kt,T=Pf&(t[T+4>>2]|0)==2,t[go>>2]=((gt(kt)|0|T)^1)&1;break}else{D[Fi>>2]=xr,t[go>>2]=T?0:2;break}}else kt=w(ie-ke),It=w(kt/Pe),kt=w(Pe*kt),t[go>>2]=1,D[Fi>>2]=w(r+(br?It:kt));while(0);Kt(P,xn,zt,En,xu,nu),Kt(P,Vt,xr,En,go,Fi);do if(m0(P,Vt,xr)|0?0:(T0(e,P)|0)==4){if((t[(hi(P,Vt)|0)+4>>2]|0)==3){T=0;break}T=(t[(Ai(P,Vt)|0)+4>>2]|0)!=3}else T=0;while(0);kt=w(D[nu>>2]),It=w(D[Fi>>2]),$l=t[xu>>2]|0,Qr=t[go>>2]|0,ht(P,br?kt:It,br?It:kt,Ei,br?$l:Qr,br?Qr:$l,En,Qi,y&(T^1),3488,k)|0,c[Tu>>0]=c[Tu>>0]|c[P+508>>0],P=t[P+960>>2]|0}while((P|0)!=0)}}else n=w(0);if(n=w(gn+n),Qr=n>0]=Qr|C[Tu>>0],Af&n>w(0)?(T=t[Cu>>2]|0,((t[e+364+(T<<3)+4>>2]|0)!=0?(Li=w(Tn(e+364+(T<<3)|0,Zi)),Li>=w(0)):0)?ie=w(Ur(w(0),w(Li-w(zt-n)))):ie=w(0)):ie=n,vt=Pn>>>0>>0,vt){we=t[eo>>2]|0,q=Pn,T=0;do P=t[we+(q<<2)>>2]|0,t[P+24>>2]|0||(T=((t[(hi(P,xn)|0)+4>>2]|0)==3&1)+T|0,T=T+((t[(Ai(P,xn)|0)+4>>2]|0)==3&1)|0),q=q+1|0;while((q|0)!=(Ht|0));T?(ke=w(0),r=w(0)):Kn=101}else Kn=101;e:do if((Kn|0)==101)switch(Kn=0,Ff|0){case 1:{T=0,ke=w(ie*w(.5)),r=w(0);break e}case 2:{T=0,ke=ie,r=w(0);break e}case 3:{if(l>>>0<=1){T=0,ke=w(0),r=w(0);break e}r=w((l+-1|0)>>>0),T=0,ke=w(0),r=w(w(Ur(ie,w(0)))/r);break e}case 5:{r=w(ie/w((l+1|0)>>>0)),T=0,ke=r;break e}case 4:{r=w(ie/w(l>>>0)),T=0,ke=w(r*w(.5));break e}default:{T=0,ke=w(0),r=w(0);break e}}while(0);if(n=w(Lf+ke),vt){Pe=w(ie/w(T|0)),q=t[eo>>2]|0,P=Pn,ie=w(0);do{T=t[q+(P<<2)>>2]|0;e:do if((t[T+36>>2]|0)!=1){switch(t[T+24>>2]|0){case 1:{if(X(T,xn)|0){if(!y)break e;kt=w(Y(T,xn,zt)),kt=w(kt+w(C0(e,xn))),kt=w(kt+w(Tr(T,xn,En))),D[T+400+(t[Qs>>2]<<2)>>2]=kt;break e}break}case 0:if(Qr=(t[(hi(T,xn)|0)+4>>2]|0)==3,kt=w(Pe+n),n=Qr?kt:n,y&&(Qr=T+400+(t[Qs>>2]<<2)|0,D[Qr>>2]=w(n+w(D[Qr>>2]))),Qr=(t[(Ai(T,xn)|0)+4>>2]|0)==3,kt=w(Pe+n),n=Qr?kt:n,Ro){kt=w(r+w(mt(T,xn,En))),ie=xr,n=w(n+w(kt+w(D[T+504>>2])));break e}else{n=w(n+w(r+w(ye(T,xn,En)))),ie=w(Ur(ie,w(ye(T,Vt,En))));break e}default:}y&&(kt=w(ke+w(C0(e,xn))),Qr=T+400+(t[Qs>>2]<<2)|0,D[Qr>>2]=w(kt+w(D[Qr>>2])))}while(0);P=P+1|0}while((P|0)!=(Ht|0))}else ie=w(0);if(r=w(Rf+n),Of?ke=w(w(kn(e,Vt,w(Ri+ie),cs,d))-Ri):ke=xr,Pe=w(w(kn(e,Vt,w(Ri+(Mf?xr:ie)),cs,d))-Ri),vt&y){P=Pn;do{q=t[(t[eo>>2]|0)+(P<<2)>>2]|0;do if((t[q+36>>2]|0)!=1){if((t[q+24>>2]|0)==1){if(X(q,Vt)|0){if(kt=w(Y(q,Vt,xr)),kt=w(kt+w(C0(e,Vt))),kt=w(kt+w(Tr(q,Vt,En))),T=t[Js>>2]|0,D[q+400+(T<<2)>>2]=kt,!(gt(kt)|0))break}else T=t[Js>>2]|0;kt=w(C0(e,Vt)),D[q+400+(T<<2)>>2]=w(kt+w(Tr(q,Vt,En)));break}T=T0(e,q)|0;do if((T|0)==4){if((t[(hi(q,Vt)|0)+4>>2]|0)==3){Kn=139;break}if((t[(Ai(q,Vt)|0)+4>>2]|0)==3){Kn=139;break}if(m0(q,Vt,xr)|0){n=le;break}$l=t[q+908+(t[Cu>>2]<<2)>>2]|0,t[Fi>>2]=$l,n=w(D[q+396>>2]),Qr=gt(n)|0,ie=(t[j>>2]=$l,w(D[j>>2])),Qr?n=Pe:(gn=w(mt(q,Vt,En)),kt=w(ie/n),n=w(n*ie),n=w(gn+(br?kt:n))),D[nu>>2]=n,D[Fi>>2]=w(w(mt(q,xn,En))+ie),t[go>>2]=1,t[xu>>2]=1,Kt(q,xn,zt,En,go,Fi),Kt(q,Vt,xr,En,xu,nu),n=w(D[Fi>>2]),gn=w(D[nu>>2]),kt=br?n:gn,n=br?gn:n,Qr=((gt(kt)|0)^1)&1,ht(q,kt,n,Ei,Qr,((gt(n)|0)^1)&1,En,Qi,1,3493,k)|0,n=le}else Kn=139;while(0);e:do if((Kn|0)==139){Kn=0,n=w(ke-w(ye(q,Vt,En)));do if((t[(hi(q,Vt)|0)+4>>2]|0)==3){if((t[(Ai(q,Vt)|0)+4>>2]|0)!=3)break;n=w(le+w(Ur(w(0),w(n*w(.5)))));break e}while(0);if((t[(Ai(q,Vt)|0)+4>>2]|0)==3){n=le;break}if((t[(hi(q,Vt)|0)+4>>2]|0)==3){n=w(le+w(Ur(w(0),n)));break}switch(T|0){case 1:{n=le;break e}case 2:{n=w(le+w(n*w(.5)));break e}default:{n=w(le+n);break e}}}while(0);kt=w(Di+n),Qr=q+400+(t[Js>>2]<<2)|0,D[Qr>>2]=w(kt+w(D[Qr>>2]))}while(0);P=P+1|0}while((P|0)!=(Ht|0))}if(Di=w(Di+Pe),ss=w(Ur(ss,r)),l=Ji+1|0,Ht>>>0>=Ni>>>0)break;n=zt,Pn=Ht,Ji=l}do if(y){if(T=l>>>0>1,T?0:!(he(e)|0))break;if(!(gt(xr)|0)){n=w(xr-Di);e:do switch(t[e+12>>2]|0){case 3:{le=w(le+n),pe=w(0);break}case 2:{le=w(le+w(n*w(.5))),pe=w(0);break}case 4:{xr>Di?pe=w(n/w(l>>>0)):pe=w(0);break}case 7:if(xr>Di){le=w(le+w(n/w(l<<1>>>0))),pe=w(n/w(l>>>0)),pe=T?pe:w(0);break e}else{le=w(le+w(n*w(.5))),pe=w(0);break e}case 6:{pe=w(n/w(Ji>>>0)),pe=xr>Di&T?pe:w(0);break}default:pe=w(0)}while(0);if(l|0)for(vt=1040+(Vt<<2)|0,Ln=976+(Vt<<2)|0,we=0,P=0;;){e:do if(P>>>0>>0)for(ie=w(0),Pe=w(0),n=w(0),q=P;;){T=t[(t[eo>>2]|0)+(q<<2)>>2]|0;do if((t[T+36>>2]|0)!=1?(t[T+24>>2]|0)==0:0){if((t[T+940>>2]|0)!=(we|0))break e;if(We(T,Vt)|0&&(kt=w(D[T+908+(t[Ln>>2]<<2)>>2]),n=w(Ur(n,w(kt+w(mt(T,Vt,En)))))),(T0(e,T)|0)!=5)break;Li=w(et(T)),Li=w(Li+w(Tr(T,0,En))),kt=w(D[T+912>>2]),kt=w(w(kt+w(mt(T,0,En)))-Li),Li=w(Ur(Pe,Li)),kt=w(Ur(ie,kt)),ie=kt,Pe=Li,n=w(Ur(n,w(Li+kt)))}while(0);if(T=q+1|0,T>>>0>>0)q=T;else{q=T;break}}else Pe=w(0),n=w(0),q=P;while(0);if(qe=w(pe+n),r=le,le=w(le+qe),P>>>0>>0){ke=w(r+Pe),T=P;do{P=t[(t[eo>>2]|0)+(T<<2)>>2]|0;e:do if((t[P+36>>2]|0)!=1?(t[P+24>>2]|0)==0:0)switch(T0(e,P)|0){case 1:{kt=w(r+w(Tr(P,Vt,En))),D[P+400+(t[vt>>2]<<2)>>2]=kt;break e}case 3:{kt=w(w(le-w(R0(P,Vt,En)))-w(D[P+908+(t[Ln>>2]<<2)>>2])),D[P+400+(t[vt>>2]<<2)>>2]=kt;break e}case 2:{kt=w(r+w(w(qe-w(D[P+908+(t[Ln>>2]<<2)>>2]))*w(.5))),D[P+400+(t[vt>>2]<<2)>>2]=kt;break e}case 4:{if(kt=w(r+w(Tr(P,Vt,En))),D[P+400+(t[vt>>2]<<2)>>2]=kt,m0(P,Vt,xr)|0||(br?(ie=w(D[P+908>>2]),n=w(ie+w(mt(P,xn,En))),Pe=qe):(Pe=w(D[P+912>>2]),Pe=w(Pe+w(mt(P,Vt,En))),n=qe,ie=w(D[P+908>>2])),Vr(n,ie)|0?Vr(Pe,w(D[P+912>>2]))|0:0))break e;ht(P,n,Pe,Ei,1,1,En,Qi,1,3501,k)|0;break e}case 5:{D[P+404>>2]=w(w(ke-w(et(P)))+w(Y(P,0,xr)));break e}default:break e}while(0);T=T+1|0}while((T|0)!=(q|0))}if(we=we+1|0,(we|0)==(l|0))break;P=q}}}while(0);if(D[e+908>>2]=w(kn(e,2,ls,d,d)),D[e+912>>2]=w(kn(e,0,Wl,_,d)),((ku|0)!=0?(Hl=t[e+32>>2]|0,bl=(ku|0)==2,!(bl&(Hl|0)!=2)):0)?bl&(Hl|0)==2&&(n=w(fs+zt),n=w(Ur(w(cc(n,w(Dt(e,xn,ss,Zi)))),fs)),Kn=198):(n=w(kn(e,xn,ss,Zi,d)),Kn=198),(Kn|0)==198&&(D[e+908+(t[976+(xn<<2)>>2]<<2)>>2]=n),((Au|0)!=0?(Vl=t[e+32>>2]|0,Yl=(Au|0)==2,!(Yl&(Vl|0)!=2)):0)?Yl&(Vl|0)==2&&(n=w(Ri+xr),n=w(Ur(w(cc(n,w(Dt(e,Vt,w(Ri+Di),cs)))),Ri)),Kn=204):(n=w(kn(e,Vt,w(Ri+Di),cs,d)),Kn=204),(Kn|0)==204&&(D[e+908+(t[976+(Vt<<2)>>2]<<2)>>2]=n),y){if((t[Gl>>2]|0)==2){P=976+(Vt<<2)|0,q=1040+(Vt<<2)|0,T=0;do we=e0(e,T)|0,t[we+24>>2]|0||($l=t[P>>2]|0,kt=w(D[e+908+($l<<2)>>2]),Qr=we+400+(t[q>>2]<<2)|0,kt=w(kt-w(D[Qr>>2])),D[Qr>>2]=w(kt-w(D[we+908+($l<<2)>>2]))),T=T+1|0;while((T|0)!=(Ni|0))}if(o|0){T=br?ku:s;do bt(e,o,En,T,Qi,Ei,k),o=t[o+960>>2]|0;while((o|0)!=0)}if(T=(xn|2|0)==3,P=(Vt|2|0)==3,T|P){o=0;do q=t[(t[eo>>2]|0)+(o<<2)>>2]|0,(t[q+36>>2]|0)!=1&&(T&&Zt(e,q,xn),P&&Zt(e,q,Vt)),o=o+1|0;while((o|0)!=(Ni|0))}}}while(0);h=Ou}function ki(e,n){e=e|0,n=w(n);var r=0;li(e,n>=w(0),3147),r=n==w(0),D[e+4>>2]=r?w(0):n}function Yr(e,n,r,o){e=e|0,n=w(n),r=w(r),o=o|0;var s=tt,l=tt,d=0,_=0,y=0;t[2278]=(t[2278]|0)+1,$r(e),m0(e,2,n)|0?(s=w(Tn(t[e+992>>2]|0,n)),y=1,s=w(s+w(mt(e,2,n)))):(s=w(Tn(e+380|0,n)),s>=w(0)?y=2:(y=((gt(n)|0)^1)&1,s=n)),m0(e,0,r)|0?(l=w(Tn(t[e+996>>2]|0,r)),_=1,l=w(l+w(mt(e,0,n)))):(l=w(Tn(e+388|0,r)),l>=w(0)?_=2:(_=((gt(r)|0)^1)&1,l=r)),d=e+976|0,(ht(e,s,l,o,y,_,n,r,1,3189,t[d>>2]|0)|0?(Yo(e,t[e+496>>2]|0,n,r,n),bi(e,w(D[(t[d>>2]|0)+4>>2]),w(0),w(0)),c[11696]|0):0)&&ff(e,7)}function $r(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;_=h,h=h+32|0,d=_+24|0,l=_+16|0,o=_+8|0,s=_,r=0;do n=e+380+(r<<3)|0,((t[e+380+(r<<3)+4>>2]|0)!=0?(y=n,k=t[y+4>>2]|0,T=o,t[T>>2]=t[y>>2],t[T+4>>2]=k,T=e+364+(r<<3)|0,k=t[T+4>>2]|0,y=s,t[y>>2]=t[T>>2],t[y+4>>2]=k,t[l>>2]=t[o>>2],t[l+4>>2]=t[o+4>>2],t[d>>2]=t[s>>2],t[d+4>>2]=t[s+4>>2],o0(l,d)|0):0)||(n=e+348+(r<<3)|0),t[e+992+(r<<2)>>2]=n,r=r+1|0;while((r|0)!=2);h=_}function m0(e,n,r){e=e|0,n=n|0,r=w(r);var o=0;switch(e=t[e+992+(t[976+(n<<2)>>2]<<2)>>2]|0,t[e+4>>2]|0){case 0:case 3:{e=0;break}case 1:{w(D[e>>2])>2])>2]|0){case 2:{n=w(w(w(D[e>>2])*n)/w(100));break}case 1:{n=w(D[e>>2]);break}default:n=w(J)}return w(n)}function Yo(e,n,r,o,s){e=e|0,n=n|0,r=w(r),o=w(o),s=w(s);var l=0,d=tt;n=t[e+944>>2]|0?n:1,l=N0(t[e+4>>2]|0,n)|0,n=Cl(l,n)|0,r=w(Wr(e,l,r)),o=w(Wr(e,n,o)),d=w(r+w(Tr(e,l,s))),D[e+400+(t[1040+(l<<2)>>2]<<2)>>2]=d,r=w(r+w(R0(e,l,s))),D[e+400+(t[1e3+(l<<2)>>2]<<2)>>2]=r,r=w(o+w(Tr(e,n,s))),D[e+400+(t[1040+(n<<2)>>2]<<2)>>2]=r,s=w(o+w(R0(e,n,s))),D[e+400+(t[1e3+(n<<2)>>2]<<2)>>2]=s}function bi(e,n,r,o){e=e|0,n=w(n),r=w(r),o=w(o);var s=0,l=0,d=tt,_=tt,y=0,k=0,T=tt,P=0,q=tt,we=tt,le=tt,ie=tt;if(n!=w(0)&&(s=e+400|0,ie=w(D[s>>2]),l=e+404|0,le=w(D[l>>2]),P=e+416|0,we=w(D[P>>2]),k=e+420|0,d=w(D[k>>2]),q=w(ie+r),T=w(le+o),o=w(q+we),_=w(T+d),y=(t[e+988>>2]|0)==1,D[s>>2]=w($0(ie,n,0,y)),D[l>>2]=w($0(le,n,0,y)),r=w(V4(w(we*n),w(1))),Vr(r,w(0))|0?l=0:l=(Vr(r,w(1))|0)^1,r=w(V4(w(d*n),w(1))),Vr(r,w(0))|0?s=0:s=(Vr(r,w(1))|0)^1,ie=w($0(o,n,y&l,y&(l^1))),D[P>>2]=w(ie-w($0(q,n,0,y))),ie=w($0(_,n,y&s,y&(s^1))),D[k>>2]=w(ie-w($0(T,n,0,y))),l=(t[e+952>>2]|0)-(t[e+948>>2]|0)>>2,l|0)){s=0;do bi(e0(e,s)|0,n,q,T),s=s+1|0;while((s|0)!=(l|0))}}function or(e,n,r,o,s){switch(e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,r|0){case 5:case 0:{e=q8(t[489]|0,o,s)|0;break}default:e=AL(o,s)|0}return e|0}function zs(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;s=h,h=h+16|0,l=s,t[l>>2]=o,Ku(e,0,n,r,l),h=s}function Ku(e,n,r,o,s){if(e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,e=e|0?e:956,sD[t[e+8>>2]&1](e,n,r,o,s)|0,(r|0)==5)_n();else return}function J0(e,n,r){e=e|0,n=n|0,r=r|0,c[e+n>>0]=r&1}function af(e,n){e=e|0,n=n|0;var r=0,o=0;t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,r=n+4|0,o=(t[r>>2]|0)-(t[n>>2]|0)>>2,o|0&&(S0(e,o),El(e,t[n>>2]|0,t[r>>2]|0,o))}function S0(e,n){e=e|0,n=n|0;var r=0;if((Q0(e)|0)>>>0>>0&&$n(e),n>>>0>1073741823)_n();else{r=Tt(n<<2)|0,t[e+4>>2]=r,t[e>>2]=r,t[e+8>>2]=r+(n<<2);return}}function El(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,o=e+4|0,e=r-n|0,(e|0)>0&&(vn(t[o>>2]|0,n|0,e|0)|0,t[o>>2]=(t[o>>2]|0)+(e>>>2<<2))}function Q0(e){return e=e|0,1073741823}function Tr(e,n,r){return e=e|0,n=n|0,r=w(r),(Nr(n)|0?(t[e+96>>2]|0)!=0:0)?e=e+92|0:e=en(e+60|0,t[1040+(n<<2)>>2]|0,992)|0,w(uo(e,r))}function R0(e,n,r){return e=e|0,n=n|0,r=w(r),(Nr(n)|0?(t[e+104>>2]|0)!=0:0)?e=e+100|0:e=en(e+60|0,t[1e3+(n<<2)>>2]|0,992)|0,w(uo(e,r))}function Nr(e){return e=e|0,(e|1|0)==3|0}function uo(e,n){return e=e|0,n=w(n),(t[e+4>>2]|0)==3?n=w(0):n=w(Tn(e,n)),w(n)}function so(e,n){return e=e|0,n=n|0,e=t[e>>2]|0,((e|0)==0?(n|0)>1?n:1:e)|0}function N0(e,n){e=e|0,n=n|0;var r=0;e:do if((n|0)==2){switch(e|0){case 2:{e=3;break e}case 3:break;default:{r=4;break e}}e=2}else r=4;while(0);return e|0}function C0(e,n){e=e|0,n=n|0;var r=tt;return((Nr(n)|0?(t[e+312>>2]|0)!=0:0)?(r=w(D[e+308>>2]),r>=w(0)):0)||(r=w(Ur(w(D[(en(e+276|0,t[1040+(n<<2)>>2]|0,992)|0)>>2]),w(0)))),w(r)}function di(e,n){e=e|0,n=n|0;var r=tt;return((Nr(n)|0?(t[e+320>>2]|0)!=0:0)?(r=w(D[e+316>>2]),r>=w(0)):0)||(r=w(Ur(w(D[(en(e+276|0,t[1e3+(n<<2)>>2]|0,992)|0)>>2]),w(0)))),w(r)}function u0(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return((Nr(n)|0?(t[e+240>>2]|0)!=0:0)?(o=w(Tn(e+236|0,r)),o>=w(0)):0)||(o=w(Ur(w(Tn(en(e+204|0,t[1040+(n<<2)>>2]|0,992)|0,r)),w(0)))),w(o)}function v0(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return((Nr(n)|0?(t[e+248>>2]|0)!=0:0)?(o=w(Tn(e+244|0,r)),o>=w(0)):0)||(o=w(Ur(w(Tn(en(e+204|0,t[1e3+(n<<2)>>2]|0,992)|0,r)),w(0)))),w(o)}function To(e,n,r,o,s,l,d){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=w(l),d=w(d);var _=tt,y=tt,k=tt,T=tt,P=tt,q=tt,we=0,le=0,ie=0;ie=h,h=h+16|0,we=ie,le=e+964|0,i0(e,(t[le>>2]|0)!=0,3519),_=w(Fn(e,2,n)),y=w(Fn(e,0,n)),k=w(mt(e,2,n)),T=w(mt(e,0,n)),gt(n)|0?P=n:P=w(Ur(w(0),w(w(n-k)-_))),gt(r)|0?q=r:q=w(Ur(w(0),w(w(r-T)-y))),(o|0)==1&(s|0)==1?(D[e+908>>2]=w(kn(e,2,w(n-k),l,l)),n=w(kn(e,0,w(r-T),d,l))):(lD[t[le>>2]&1](we,e,P,o,q,s),P=w(_+w(D[we>>2])),q=w(n-k),D[e+908>>2]=w(kn(e,2,(o|2|0)==2?P:q,l,l)),q=w(y+w(D[we+4>>2])),n=w(r-T),n=w(kn(e,0,(s|2|0)==2?q:n,d,l))),D[e+912>>2]=n,h=ie}function pu(e,n,r,o,s,l,d){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=w(l),d=w(d);var _=tt,y=tt,k=tt,T=tt;k=w(Fn(e,2,l)),_=w(Fn(e,0,l)),T=w(mt(e,2,l)),y=w(mt(e,0,l)),n=w(n-T),D[e+908>>2]=w(kn(e,2,(o|2|0)==2?k:n,l,l)),r=w(r-y),D[e+912>>2]=w(kn(e,0,(s|2|0)==2?_:r,d,l))}function Sl(e,n,r,o,s,l,d){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=w(l),d=w(d);var _=0,y=tt,k=tt;return _=(o|0)==2,((n<=w(0)&_?0:!(r<=w(0)&(s|0)==2))?!((o|0)==1&(s|0)==1):0)?e=0:(y=w(mt(e,0,l)),k=w(mt(e,2,l)),_=n>2]=w(kn(e,2,_?w(0):n,l,l)),n=w(r-y),_=r>2]=w(kn(e,0,_?w(0):n,d,l)),e=1),e|0}function Cl(e,n){return e=e|0,n=n|0,qt(e)|0?e=N0(2,n)|0:e=0,e|0}function B0(e,n,r){return e=e|0,n=n|0,r=w(r),r=w(u0(e,n,r)),w(r+w(C0(e,n)))}function hu(e,n,r){return e=e|0,n=n|0,r=w(r),r=w(v0(e,n,r)),w(r+w(di(e,n)))}function Fn(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return o=w(B0(e,n,r)),w(o+w(hu(e,n,r)))}function pi(e){return e=e|0,t[e+24>>2]|0?e=0:w(Br(e))!=w(0)?e=1:e=w(zr(e))!=w(0),e|0}function Br(e){e=e|0;var n=tt;if(t[e+944>>2]|0){if(n=w(D[e+44>>2]),gt(n)|0)return n=w(D[e+40>>2]),e=n>w(0)&((gt(n)|0)^1),w(e?n:w(0))}else n=w(0);return w(n)}function zr(e){e=e|0;var n=tt,r=0,o=tt;do if(t[e+944>>2]|0){if(n=w(D[e+48>>2]),gt(n)|0){if(r=c[(t[e+976>>2]|0)+2>>0]|0,r<<24>>24==0?(o=w(D[e+40>>2]),o>24?w(1):w(0)}}else n=w(0);while(0);return w(n)}function lo(e){e=e|0;var n=0,r=0;if(pa(e+400|0,0,540)|0,c[e+985>>0]=1,bo(e),r=fi(e)|0,r|0){n=e+948|0,e=0;do lo(t[(t[n>>2]|0)+(e<<2)>>2]|0),e=e+1|0;while((e|0)!=(r|0))}}function wr(e,n,r,o,s,l,d,_,y,k){e=e|0,n=n|0,r=w(r),o=o|0,s=w(s),l=w(l),d=w(d),_=_|0,y=y|0,k=k|0;var T=0,P=tt,q=0,we=0,le=tt,ie=tt,Pe=0,ke=tt,qe=0,pe=tt,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0,Dr=0,Ki=0;Dr=h,h=h+16|0,Ln=Dr+12|0,Ht=Dr+8|0,It=Dr+4|0,gn=Dr,zt=N0(t[e+4>>2]|0,y)|0,_e=Nr(zt)|0,P=w(Tn(Ut(n)|0,_e?l:d)),vt=m0(n,2,l)|0,Pn=m0(n,0,d)|0;do if(gt(P)|0?0:!(gt(_e?r:s)|0)){if(T=n+504|0,!(gt(w(D[T>>2]))|0)&&(!(fn(t[n+976>>2]|0,0)|0)||(t[n+500>>2]|0)==(t[2278]|0)))break;D[T>>2]=w(Ur(P,w(Fn(n,zt,l))))}else q=7;while(0);do if((q|0)==7){if(qe=_e^1,!(qe|vt^1)){d=w(Tn(t[n+992>>2]|0,l)),D[n+504>>2]=w(Ur(d,w(Fn(n,2,l))));break}if(!(_e|Pn^1)){d=w(Tn(t[n+996>>2]|0,d)),D[n+504>>2]=w(Ur(d,w(Fn(n,0,l))));break}D[Ln>>2]=w(J),D[Ht>>2]=w(J),t[It>>2]=0,t[gn>>2]=0,ke=w(mt(n,2,l)),pe=w(mt(n,0,l)),vt?(le=w(ke+w(Tn(t[n+992>>2]|0,l))),D[Ln>>2]=le,t[It>>2]=1,we=1):(we=0,le=w(J)),Pn?(P=w(pe+w(Tn(t[n+996>>2]|0,d))),D[Ht>>2]=P,t[gn>>2]=1,T=1):(T=0,P=w(J)),q=t[e+32>>2]|0,_e&(q|0)==2?q=2:(gt(le)|0?!(gt(r)|0):0)&&(D[Ln>>2]=r,t[It>>2]=2,we=2,le=r),(((q|0)==2&qe?0:gt(P)|0)?!(gt(s)|0):0)&&(D[Ht>>2]=s,t[gn>>2]=2,T=2,P=s),ie=w(D[n+396>>2]),Pe=gt(ie)|0;do if(Pe)q=we;else{if((we|0)==1&qe){D[Ht>>2]=w(w(le-ke)/ie),t[gn>>2]=1,T=1,q=1;break}_e&(T|0)==1?(D[Ln>>2]=w(ie*w(P-pe)),t[It>>2]=1,T=1,q=1):q=we}while(0);Ki=gt(r)|0,we=(T0(e,n)|0)!=4,(_e|vt|((o|0)!=1|Ki)|(we|(q|0)==1)?0:(D[Ln>>2]=r,t[It>>2]=1,!Pe))&&(D[Ht>>2]=w(w(r-ke)/ie),t[gn>>2]=1,T=1),(Pn|qe|((_|0)!=1|(gt(s)|0))|(we|(T|0)==1)?0:(D[Ht>>2]=s,t[gn>>2]=1,!Pe))&&(D[Ln>>2]=w(ie*w(s-pe)),t[It>>2]=1),Kt(n,2,l,l,It,Ln),Kt(n,0,d,l,gn,Ht),r=w(D[Ln>>2]),s=w(D[Ht>>2]),ht(n,r,s,y,t[It>>2]|0,t[gn>>2]|0,l,d,0,3565,k)|0,d=w(D[n+908+(t[976+(zt<<2)>>2]<<2)>>2]),D[n+504>>2]=w(Ur(d,w(Fn(n,zt,l))))}while(0);t[n+500>>2]=t[2278],h=Dr}function kn(e,n,r,o,s){return e=e|0,n=n|0,r=w(r),o=w(o),s=w(s),o=w(Dt(e,n,r,o)),w(Ur(o,w(Fn(e,n,s))))}function T0(e,n){return e=e|0,n=n|0,n=n+20|0,n=t[((t[n>>2]|0)==0?e+16|0:n)>>2]|0,((n|0)==5?qt(t[e+4>>2]|0)|0:0)&&(n=1),n|0}function hi(e,n){return e=e|0,n=n|0,(Nr(n)|0?(t[e+96>>2]|0)!=0:0)?n=4:n=t[1040+(n<<2)>>2]|0,e+60+(n<<3)|0}function Ai(e,n){return e=e|0,n=n|0,(Nr(n)|0?(t[e+104>>2]|0)!=0:0)?n=5:n=t[1e3+(n<<2)>>2]|0,e+60+(n<<3)|0}function Kt(e,n,r,o,s,l){switch(e=e|0,n=n|0,r=w(r),o=w(o),s=s|0,l=l|0,r=w(Tn(e+380+(t[976+(n<<2)>>2]<<3)|0,r)),r=w(r+w(mt(e,n,o))),t[s>>2]|0){case 2:case 1:{s=gt(r)|0,o=w(D[l>>2]),D[l>>2]=s|o>2]=2,D[l>>2]=r);break}default:}}function X(e,n){return e=e|0,n=n|0,e=e+132|0,(Nr(n)|0?(t[(en(e,4,948)|0)+4>>2]|0)!=0:0)?e=1:e=(t[(en(e,t[1040+(n<<2)>>2]|0,948)|0)+4>>2]|0)!=0,e|0}function Y(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0;return e=e+132|0,(Nr(n)|0?(o=en(e,4,948)|0,(t[o+4>>2]|0)!=0):0)?s=4:(o=en(e,t[1040+(n<<2)>>2]|0,948)|0,t[o+4>>2]|0?s=4:r=w(0)),(s|0)==4&&(r=w(Tn(o,r))),w(r)}function ye(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return o=w(D[e+908+(t[976+(n<<2)>>2]<<2)>>2]),o=w(o+w(Tr(e,n,r))),w(o+w(R0(e,n,r)))}function he(e){e=e|0;var n=0,r=0,o=0;e:do if(qt(t[e+4>>2]|0)|0)n=0;else if((t[e+16>>2]|0)!=5)if(r=fi(e)|0,!r)n=0;else for(n=0;;){if(o=e0(e,n)|0,(t[o+24>>2]|0)==0?(t[o+20>>2]|0)==5:0){n=1;break e}if(n=n+1|0,n>>>0>=r>>>0){n=0;break}}else n=1;while(0);return n|0}function We(e,n){e=e|0,n=n|0;var r=tt;return r=w(D[e+908+(t[976+(n<<2)>>2]<<2)>>2]),r>=w(0)&((gt(r)|0)^1)|0}function et(e){e=e|0;var n=tt,r=0,o=0,s=0,l=0,d=0,_=0,y=tt;if(r=t[e+968>>2]|0,r)y=w(D[e+908>>2]),n=w(D[e+912>>2]),n=w(rD[r&0](e,y,n)),i0(e,(gt(n)|0)^1,3573);else{l=fi(e)|0;do if(l|0){for(r=0,s=0;;){if(o=e0(e,s)|0,t[o+940>>2]|0){d=8;break}if((t[o+24>>2]|0)!=1)if(_=(T0(e,o)|0)==5,_){r=o;break}else r=(r|0)==0?o:r;if(s=s+1|0,s>>>0>=l>>>0){d=8;break}}if((d|0)==8&&!r)break;return n=w(et(r)),w(n+w(D[r+404>>2]))}while(0);n=w(D[e+912>>2])}return w(n)}function Dt(e,n,r,o){e=e|0,n=n|0,r=w(r),o=w(o);var s=tt,l=0;return qt(n)|0?(n=1,l=3):Nr(n)|0?(n=0,l=3):(o=w(J),s=w(J)),(l|0)==3&&(s=w(Tn(e+364+(n<<3)|0,o)),o=w(Tn(e+380+(n<<3)|0,o))),l=o=w(0)&((gt(o)|0)^1)),r=l?o:r,l=s>=w(0)&((gt(s)|0)^1)&r>2]|0,l)|0,le=Cl(Pe,l)|0,ie=Nr(Pe)|0,P=w(mt(n,2,r)),q=w(mt(n,0,r)),m0(n,2,r)|0?_=w(P+w(Tn(t[n+992>>2]|0,r))):(X(n,2)|0?_t(n,2)|0:0)?(_=w(D[e+908>>2]),y=w(C0(e,2)),y=w(_-w(y+w(di(e,2)))),_=w(Y(n,2,r)),_=w(kn(n,2,w(y-w(_+w(_r(n,2,r)))),r,r))):_=w(J),m0(n,0,s)|0?y=w(q+w(Tn(t[n+996>>2]|0,s))):(X(n,0)|0?_t(n,0)|0:0)?(y=w(D[e+912>>2]),qe=w(C0(e,0)),qe=w(y-w(qe+w(di(e,0)))),y=w(Y(n,0,s)),y=w(kn(n,0,w(qe-w(y+w(_r(n,0,s)))),s,r))):y=w(J),k=gt(_)|0,T=gt(y)|0;do if(k^T?(we=w(D[n+396>>2]),!(gt(we)|0)):0)if(k){_=w(P+w(w(y-q)*we));break}else{qe=w(q+w(w(_-P)/we)),y=T?qe:y;break}while(0);T=gt(_)|0,k=gt(y)|0,T|k&&(pe=(T^1)&1,o=r>w(0)&((o|0)!=0&T),_=ie?_:o?r:_,ht(n,_,y,l,ie?pe:o?2:pe,T&(k^1)&1,_,y,0,3623,d)|0,_=w(D[n+908>>2]),_=w(_+w(mt(n,2,r))),y=w(D[n+912>>2]),y=w(y+w(mt(n,0,r)))),ht(n,_,y,l,1,1,_,y,1,3635,d)|0,(_t(n,Pe)|0?!(X(n,Pe)|0):0)?(pe=t[976+(Pe<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(qe-w(D[n+908+(pe<<2)>>2])),qe=w(qe-w(di(e,Pe))),qe=w(qe-w(R0(n,Pe,r))),qe=w(qe-w(_r(n,Pe,ie?r:s))),D[n+400+(t[1040+(Pe<<2)>>2]<<2)>>2]=qe):ke=21;do if((ke|0)==21){if(X(n,Pe)|0?0:(t[e+8>>2]|0)==1){pe=t[976+(Pe<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(w(qe-w(D[n+908+(pe<<2)>>2]))*w(.5)),D[n+400+(t[1040+(Pe<<2)>>2]<<2)>>2]=qe;break}(X(n,Pe)|0?0:(t[e+8>>2]|0)==2)&&(pe=t[976+(Pe<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(qe-w(D[n+908+(pe<<2)>>2])),D[n+400+(t[1040+(Pe<<2)>>2]<<2)>>2]=qe)}while(0);(_t(n,le)|0?!(X(n,le)|0):0)?(pe=t[976+(le<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(qe-w(D[n+908+(pe<<2)>>2])),qe=w(qe-w(di(e,le))),qe=w(qe-w(R0(n,le,r))),qe=w(qe-w(_r(n,le,ie?s:r))),D[n+400+(t[1040+(le<<2)>>2]<<2)>>2]=qe):ke=30;do if((ke|0)==30?!(X(n,le)|0):0){if((T0(e,n)|0)==2){pe=t[976+(le<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(w(qe-w(D[n+908+(pe<<2)>>2]))*w(.5)),D[n+400+(t[1040+(le<<2)>>2]<<2)>>2]=qe;break}pe=(T0(e,n)|0)==3,pe^(t[e+28>>2]|0)==2&&(pe=t[976+(le<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(qe-w(D[n+908+(pe<<2)>>2])),D[n+400+(t[1040+(le<<2)>>2]<<2)>>2]=qe)}while(0)}function Zt(e,n,r){e=e|0,n=n|0,r=r|0;var o=tt,s=0;s=t[976+(r<<2)>>2]|0,o=w(D[n+908+(s<<2)>>2]),o=w(w(D[e+908+(s<<2)>>2])-o),o=w(o-w(D[n+400+(t[1040+(r<<2)>>2]<<2)>>2])),D[n+400+(t[1e3+(r<<2)>>2]<<2)>>2]=o}function qt(e){return e=e|0,(e|1|0)==1|0}function Ut(e){e=e|0;var n=tt;switch(t[e+56>>2]|0){case 0:case 3:{n=w(D[e+40>>2]),n>w(0)&((gt(n)|0)^1)?e=c[(t[e+976>>2]|0)+2>>0]|0?1056:992:e=1056;break}default:e=e+52|0}return e|0}function fn(e,n){return e=e|0,n=n|0,(c[e+n>>0]|0)!=0|0}function _t(e,n){return e=e|0,n=n|0,e=e+132|0,(Nr(n)|0?(t[(en(e,5,948)|0)+4>>2]|0)!=0:0)?e=1:e=(t[(en(e,t[1e3+(n<<2)>>2]|0,948)|0)+4>>2]|0)!=0,e|0}function _r(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0;return e=e+132|0,(Nr(n)|0?(o=en(e,5,948)|0,(t[o+4>>2]|0)!=0):0)?s=4:(o=en(e,t[1e3+(n<<2)>>2]|0,948)|0,t[o+4>>2]|0?s=4:r=w(0)),(s|0)==4&&(r=w(Tn(o,r))),w(r)}function Wr(e,n,r){return e=e|0,n=n|0,r=w(r),X(e,n)|0?r=w(Y(e,n,r)):r=w(-w(_r(e,n,r))),w(r)}function Ar(e){return e=w(e),D[j>>2]=e,t[j>>2]|0|0}function z(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>1073741823)_n();else{s=Tt(n<<2)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<2)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<2)}function dr(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>2)<<2)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Or(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-4-n|0)>>>2)<<2)),e=t[e>>2]|0,e|0&&Ve(e)}function Qn(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;if(d=e+4|0,_=t[d>>2]|0,s=_-o|0,l=s>>2,e=n+(l<<2)|0,e>>>0>>0){o=_;do t[o>>2]=t[e>>2],e=e+4|0,o=(t[d>>2]|0)+4|0,t[d>>2]=o;while(e>>>0>>0)}l|0&&Y1(_+(0-l<<2)|0,n|0,s|0)|0}function nn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0;return _=n+4|0,y=t[_>>2]|0,s=t[e>>2]|0,d=r,l=d-s|0,o=y+(0-(l>>2)<<2)|0,t[_>>2]=o,(l|0)>0&&vn(o|0,s|0,l|0)|0,s=e+4|0,l=n+8|0,o=(t[s>>2]|0)-d|0,(o|0)>0&&(vn(t[l>>2]|0,r|0,o|0)|0,t[l>>2]=(t[l>>2]|0)+(o>>>2<<2)),d=t[e>>2]|0,t[e>>2]=t[_>>2],t[_>>2]=d,d=t[s>>2]|0,t[s>>2]=t[l>>2],t[l>>2]=d,d=e+8|0,r=n+12|0,e=t[d>>2]|0,t[d>>2]=t[r>>2],t[r>>2]=e,t[n>>2]=t[_>>2],y|0}function s0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;if(d=t[n>>2]|0,l=t[r>>2]|0,(d|0)!=(l|0)){s=e+8|0,r=((l+-4-d|0)>>>2)+1|0,e=d,o=t[s>>2]|0;do t[o>>2]=t[e>>2],o=(t[s>>2]|0)+4|0,t[s>>2]=o,e=e+4|0;while((e|0)!=(l|0));t[n>>2]=d+(r<<2)}}function t0(){_l()}function g0(){var e=0;return e=Tt(4)|0,Kr(e),e|0}function Kr(e){e=e|0,t[e>>2]=a0()|0}function _0(e){e=e|0,e|0&&(Gi(e),Ve(e))}function Gi(e){e=e|0,V0(t[e>>2]|0)}function fo(e,n,r){e=e|0,n=n|0,r=r|0,J0(t[e>>2]|0,n,r)}function x0(e,n){e=e|0,n=w(n),ki(t[e>>2]|0,n)}function Xu(e,n){return e=e|0,n=n|0,fn(t[e>>2]|0,n)|0}function Z0(){var e=0;return e=Tt(8)|0,df(e,0),e|0}function df(e,n){e=e|0,n=n|0,n?n=I0(t[n>>2]|0)|0:n=qu()|0,t[e>>2]=n,t[e+4>>2]=0,Bs(n,e)}function Ba(e){e=e|0;var n=0;return n=Tt(8)|0,df(n,e),n|0}function Oc(e){e=e|0,e|0&&(mu(e),Ve(e))}function mu(e){e=e|0;var n=0;Wu(t[e>>2]|0),n=e+4|0,e=t[n>>2]|0,t[n>>2]=0,e|0&&(Ju(e),Ve(e))}function Ju(e){e=e|0,ei(e)}function ei(e){e=e|0,e=t[e>>2]|0,e|0&&ju(e|0)}function Yf(e){return e=e|0,Vu(e)|0}function pf(e){e=e|0;var n=0,r=0;r=e+4|0,n=t[r>>2]|0,t[r>>2]=0,n|0&&(Ju(n),Ve(n)),Do(t[e>>2]|0)}function ja(e,n){e=e|0,n=n|0,Gu(t[e>>2]|0,t[n>>2]|0)}function Ua(e,n){e=e|0,n=n|0,W(t[e>>2]|0,n)}function Ic(e,n,r){e=e|0,n=n|0,r=+r,yn(t[e>>2]|0,n,w(r))}function vu(e,n,r){e=e|0,n=n|0,r=+r,sn(t[e>>2]|0,n,w(r))}function $f(e,n){e=e|0,n=n|0,R(t[e>>2]|0,n)}function gu(e,n){e=e|0,n=n|0,H(t[e>>2]|0,n)}function co(e,n){e=e|0,n=n|0,ue(t[e>>2]|0,n)}function qa(e,n){e=e|0,n=n|0,M0(t[e>>2]|0,n)}function Ws(e,n){e=e|0,n=n|0,Fe(t[e>>2]|0,n)}function za(e,n){e=e|0,n=n|0,Lr(t[e>>2]|0,n)}function Pc(e,n,r){e=e|0,n=n|0,r=+r,rn(t[e>>2]|0,n,w(r))}function Qu(e,n,r){e=e|0,n=n|0,r=+r,Hn(t[e>>2]|0,n,w(r))}function Mc(e,n){e=e|0,n=n|0,Cr(t[e>>2]|0,n)}function Fc(e,n){e=e|0,n=n|0,K(t[e>>2]|0,n)}function Lc(e,n){e=e|0,n=n|0,je(t[e>>2]|0,n)}function Kf(e,n){e=e|0,n=+n,rt(t[e>>2]|0,w(n))}function Tl(e,n){e=e|0,n=+n,wt(t[e>>2]|0,w(n))}function xl(e,n){e=e|0,n=+n,lt(t[e>>2]|0,w(n))}function hf(e,n){e=e|0,n=+n,st(t[e>>2]|0,w(n))}function xo(e,n){e=e|0,n=+n,xt(t[e>>2]|0,w(n))}function mf(e,n){e=e|0,n=+n,Qt(t[e>>2]|0,w(n))}function Wa(e,n){e=e|0,n=+n,Cn(t[e>>2]|0,w(n))}function ti(e){e=e|0,bn(t[e>>2]|0)}function Hs(e,n){e=e|0,n=+n,h0(t[e>>2]|0,w(n))}function mi(e,n){e=e|0,n=+n,ci(t[e>>2]|0,w(n))}function vi(e){e=e|0,xi(t[e>>2]|0)}function Xf(e,n){e=e|0,n=+n,qr(t[e>>2]|0,w(n))}function Rc(e,n){e=e|0,n=+n,Eo(t[e>>2]|0,w(n))}function Jf(e,n){e=e|0,n=+n,wl(t[e>>2]|0,w(n))}function ao(e,n){e=e|0,n=+n,js(t[e>>2]|0,w(n))}function $o(e,n){e=e|0,n=+n,du(t[e>>2]|0,w(n))}function kl(e,n){e=e|0,n=+n,Yu(t[e>>2]|0,w(n))}function Nc(e,n){e=e|0,n=+n,oo(t[e>>2]|0,w(n))}function Al(e,n){e=e|0,n=+n,Hi(t[e>>2]|0,w(n))}function vf(e,n){e=e|0,n=+n,F0(t[e>>2]|0,w(n))}function Qf(e,n,r){e=e|0,n=n|0,r=+r,ft(t[e>>2]|0,n,w(r))}function k0(e,n,r){e=e|0,n=n|0,r=+r,He(t[e>>2]|0,n,w(r))}function v(e,n,r){e=e|0,n=n|0,r=+r,Qe(t[e>>2]|0,n,w(r))}function m(e){return e=e|0,ve(t[e>>2]|0)|0}function S(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;o=h,h=h+16|0,s=o,ar(s,t[n>>2]|0,r),O(e,s),h=o}function O(e,n){e=e|0,n=n|0,M(e,t[n+4>>2]|0,+w(D[n>>2]))}function M(e,n,r){e=e|0,n=n|0,r=+r,t[e>>2]=n,L[e+8>>3]=r}function b(e){return e=e|0,U(t[e>>2]|0)|0}function ee(e){return e=e|0,fe(t[e>>2]|0)|0}function Ye(e){return e=e|0,de(t[e>>2]|0)|0}function Ze(e){return e=e|0,au(t[e>>2]|0)|0}function ut(e){return e=e|0,Ge(t[e>>2]|0)|0}function In(e){return e=e|0,F(t[e>>2]|0)|0}function A0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;o=h,h=h+16|0,s=o,d0(s,t[n>>2]|0,r),O(e,s),h=o}function jr(e){return e=e|0,xe(t[e>>2]|0)|0}function gi(e){return e=e|0,Xe(t[e>>2]|0)|0}function po(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,Rt(o,t[n>>2]|0),O(e,o),h=r}function _i(e){return e=e|0,+ +w(yl(t[e>>2]|0))}function Re(e){return e=e|0,+ +w(cu(t[e>>2]|0))}function Ce(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,p0(o,t[n>>2]|0),O(e,o),h=r}function ze(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,E0(o,t[n>>2]|0),O(e,o),h=r}function Et(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,So(o,t[n>>2]|0),O(e,o),h=r}function on(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,Dl(o,t[n>>2]|0),O(e,o),h=r}function sr(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,Us(o,t[n>>2]|0),O(e,o),h=r}function mn(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,qs(o,t[n>>2]|0),O(e,o),h=r}function pr(e){return e=e|0,+ +w(Gr(t[e>>2]|0))}function Hr(e,n){return e=e|0,n=n|0,+ +w(St(t[e>>2]|0,n))}function Vn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;o=h,h=h+16|0,s=o,Ne(s,t[n>>2]|0,r),O(e,s),h=o}function ni(e,n,r){e=e|0,n=n|0,r=r|0,Ns(t[e>>2]|0,t[n>>2]|0,r)}function Zf(e,n){e=e|0,n=n|0,D0(t[e>>2]|0,t[n>>2]|0)}function Pm(e){return e=e|0,fi(t[e>>2]|0)|0}function Ha(e){return e=e|0,e=nr(t[e>>2]|0)|0,e?e=Yf(e)|0:e=0,e|0}function vd(e,n){return e=e|0,n=n|0,e=e0(t[e>>2]|0,n)|0,e?e=Yf(e)|0:e=0,e|0}function gd(e,n){e=e|0,n=n|0;var r=0,o=0;o=Tt(4)|0,ba(o,n),r=e+4|0,n=t[r>>2]|0,t[r>>2]=o,n|0&&(Ju(n),Ve(n)),bu(t[e>>2]|0,1)}function ba(e,n){e=e|0,n=n|0,Oo(e,n)}function Bc(e,n,r,o,s,l){e=e|0,n=n|0,r=w(r),o=o|0,s=w(s),l=l|0;var d=0,_=0;d=h,h=h+16|0,_=d,Mm(_,Vu(n)|0,+r,o,+s,l),D[e>>2]=w(+L[_>>3]),D[e+4>>2]=w(+L[_+8>>3]),h=d}function Mm(e,n,r,o,s,l){e=e|0,n=n|0,r=+r,o=o|0,s=+s,l=l|0;var d=0,_=0,y=0,k=0,T=0;d=h,h=h+32|0,T=d+8|0,k=d+20|0,y=d,_=d+16|0,L[T>>3]=r,t[k>>2]=o,L[y>>3]=s,t[_>>2]=l,_d(e,t[n+4>>2]|0,T,k,y,_),h=d}function _d(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0;d=h,h=h+16|0,_=d,Zo(_),n=Oi(n)|0,Fm(e,n,+L[r>>3],t[o>>2]|0,+L[s>>3],t[l>>2]|0),eu(_),h=d}function Oi(e){return e=e|0,t[e>>2]|0}function Fm(e,n,r,o,s,l){e=e|0,n=n|0,r=+r,o=o|0,s=+s,l=l|0;var d=0;d=ko(yd()|0)|0,r=+Ko(r),o=jc(o)|0,s=+Ko(s),Ga(e,ro(0,d|0,n|0,+r,o|0,+s,jc(l)|0)|0)}function yd(){var e=0;return c[7608]|0||(Ed(9120),e=7608,t[e>>2]=1,t[e+4>>2]=0),9120}function ko(e){return e=e|0,t[e+8>>2]|0}function Ko(e){return e=+e,+ +Ol(e)}function jc(e){return e=e|0,Dd(e)|0}function Ga(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;s=h,h=h+32|0,r=s,o=n,o&1?(Lm(r,0),c0(o|0,r|0)|0,Va(e,r),Wn(r)):(t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=t[n+8>>2],t[e+12>>2]=t[n+12>>2]),h=s}function Lm(e,n){e=e|0,n=n|0,wd(e,n),t[e+8>>2]=0,c[e+24>>0]=0}function Va(e,n){e=e|0,n=n|0,n=n+8|0,t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=t[n+8>>2],t[e+12>>2]=t[n+12>>2]}function Wn(e){e=e|0,c[e+24>>0]=0}function wd(e,n){e=e|0,n=n|0,t[e>>2]=n}function Dd(e){return e=e|0,e|0}function Ol(e){return e=+e,+e}function Ed(e){e=e|0,Ao(e,Rm()|0,4)}function Rm(){return 1064}function Ao(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r,t[e+8>>2]=hl(n|0,r+1|0)|0}function Oo(e,n){e=e|0,n=n|0,n=t[n>>2]|0,t[e>>2]=n,qi(n|0)}function Nm(e){e=e|0;var n=0,r=0;r=e+4|0,n=t[r>>2]|0,t[r>>2]=0,n|0&&(Ju(n),Ve(n)),bu(t[e>>2]|0,0)}function Uc(e){e=e|0,rr(t[e>>2]|0)}function Ya(e){return e=e|0,Go(t[e>>2]|0)|0}function Sd(e,n,r,o){e=e|0,n=+n,r=+r,o=o|0,Yr(t[e>>2]|0,w(n),w(r),o)}function Cd(e){return e=e|0,+ +w(ir(t[e>>2]|0))}function ho(e){return e=e|0,+ +w(Y0(t[e>>2]|0))}function bs(e){return e=e|0,+ +w(L0(t[e>>2]|0))}function $a(e){return e=e|0,+ +w(Co(t[e>>2]|0))}function Td(e){return e=e|0,+ +w($u(t[e>>2]|0))}function qc(e){return e=e|0,+ +w(Vo(t[e>>2]|0))}function xd(e,n){e=e|0,n=n|0,L[e>>3]=+w(ir(t[n>>2]|0)),L[e+8>>3]=+w(Y0(t[n>>2]|0)),L[e+16>>3]=+w(L0(t[n>>2]|0)),L[e+24>>3]=+w(Co(t[n>>2]|0)),L[e+32>>3]=+w($u(t[n>>2]|0)),L[e+40>>3]=+w(Vo(t[n>>2]|0))}function Ka(e,n){return e=e|0,n=n|0,+ +w(Rr(t[e>>2]|0,n))}function kd(e,n){return e=e|0,n=n|0,+ +w(Jn(t[e>>2]|0,n))}function Xa(e,n){return e=e|0,n=n|0,+ +w(ai(t[e>>2]|0,n))}function Ja(){return Rs()|0}function Gs(){Bm(),Vs(),Ad(),Od(),Qa(),jm()}function Bm(){hO(11713,4938,1)}function Vs(){FA(10448)}function Ad(){hA(10408)}function Od(){Bk(10324)}function Qa(){Gx(10096)}function jm(){Um(9132)}function Um(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0,pe=0,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0,Dr=0,Ki=0,Xi=0,Ji=0,Ro=0,kf=0,Af=0,Cu=0,Of=0,Js=0,Qs=0,If=0,Pf=0,Mf=0,Kn=0,Tu=0,Ff=0,us=0,Lf=0,Rf=0,Zs=0,el=0,ss=0,Fi=0,nu=0,go=0,xu=0,jl=0,Ul=0,tl=0,ql=0,zl=0,Li=0,Di=0,ku=0,xr=0,Wl=0,Qi=0,ls=0,Zi=0,fs=0,Hl=0,bl=0,cs=0,Ri=0,Au=0,Gl=0,Vl=0,Yl=0,En=0,br=0,Ei=0,eo=0,Ni=0,xn=0,Vt=0,Ou=0;n=h,h=h+672|0,r=n+656|0,Ou=n+648|0,Vt=n+640|0,xn=n+632|0,Ni=n+624|0,eo=n+616|0,Ei=n+608|0,br=n+600|0,En=n+592|0,Yl=n+584|0,Vl=n+576|0,Gl=n+568|0,Au=n+560|0,Ri=n+552|0,cs=n+544|0,bl=n+536|0,Hl=n+528|0,fs=n+520|0,Zi=n+512|0,ls=n+504|0,Qi=n+496|0,Wl=n+488|0,xr=n+480|0,ku=n+472|0,Di=n+464|0,Li=n+456|0,zl=n+448|0,ql=n+440|0,tl=n+432|0,Ul=n+424|0,jl=n+416|0,xu=n+408|0,go=n+400|0,nu=n+392|0,Fi=n+384|0,ss=n+376|0,el=n+368|0,Zs=n+360|0,Rf=n+352|0,Lf=n+344|0,us=n+336|0,Ff=n+328|0,Tu=n+320|0,Kn=n+312|0,Mf=n+304|0,Pf=n+296|0,If=n+288|0,Qs=n+280|0,Js=n+272|0,Of=n+264|0,Cu=n+256|0,Af=n+248|0,kf=n+240|0,Ro=n+232|0,Ji=n+224|0,Xi=n+216|0,Ki=n+208|0,Dr=n+200|0,zt=n+192|0,Pn=n+184|0,gn=n+176|0,It=n+168|0,Ht=n+160|0,Ln=n+152|0,vt=n+144|0,_e=n+136|0,pe=n+128|0,qe=n+120|0,ke=n+112|0,Pe=n+104|0,ie=n+96|0,le=n+88|0,we=n+80|0,q=n+72|0,P=n+64|0,T=n+56|0,k=n+48|0,y=n+40|0,_=n+32|0,d=n+24|0,l=n+16|0,s=n+8|0,o=n,qm(e,3646),Id(e,3651,2)|0,Pd(e,3665,2)|0,zm(e,3682,18)|0,t[Ou>>2]=19,t[Ou+4>>2]=0,t[r>>2]=t[Ou>>2],t[r+4>>2]=t[Ou+4>>2],gf(e,3690,r)|0,t[Vt>>2]=1,t[Vt+4>>2]=0,t[r>>2]=t[Vt>>2],t[r+4>>2]=t[Vt+4>>2],Md(e,3696,r)|0,t[xn>>2]=2,t[xn+4>>2]=0,t[r>>2]=t[xn>>2],t[r+4>>2]=t[xn+4>>2],Xr(e,3706,r)|0,t[Ni>>2]=1,t[Ni+4>>2]=0,t[r>>2]=t[Ni>>2],t[r+4>>2]=t[Ni+4>>2],yi(e,3722,r)|0,t[eo>>2]=2,t[eo+4>>2]=0,t[r>>2]=t[eo>>2],t[r+4>>2]=t[eo+4>>2],yi(e,3734,r)|0,t[Ei>>2]=3,t[Ei+4>>2]=0,t[r>>2]=t[Ei>>2],t[r+4>>2]=t[Ei+4>>2],Xr(e,3753,r)|0,t[br>>2]=4,t[br+4>>2]=0,t[r>>2]=t[br>>2],t[r+4>>2]=t[br+4>>2],Xr(e,3769,r)|0,t[En>>2]=5,t[En+4>>2]=0,t[r>>2]=t[En>>2],t[r+4>>2]=t[En+4>>2],Xr(e,3783,r)|0,t[Yl>>2]=6,t[Yl+4>>2]=0,t[r>>2]=t[Yl>>2],t[r+4>>2]=t[Yl+4>>2],Xr(e,3796,r)|0,t[Vl>>2]=7,t[Vl+4>>2]=0,t[r>>2]=t[Vl>>2],t[r+4>>2]=t[Vl+4>>2],Xr(e,3813,r)|0,t[Gl>>2]=8,t[Gl+4>>2]=0,t[r>>2]=t[Gl>>2],t[r+4>>2]=t[Gl+4>>2],Xr(e,3825,r)|0,t[Au>>2]=3,t[Au+4>>2]=0,t[r>>2]=t[Au>>2],t[r+4>>2]=t[Au+4>>2],yi(e,3843,r)|0,t[Ri>>2]=4,t[Ri+4>>2]=0,t[r>>2]=t[Ri>>2],t[r+4>>2]=t[Ri+4>>2],yi(e,3853,r)|0,t[cs>>2]=9,t[cs+4>>2]=0,t[r>>2]=t[cs>>2],t[r+4>>2]=t[cs+4>>2],Xr(e,3870,r)|0,t[bl>>2]=10,t[bl+4>>2]=0,t[r>>2]=t[bl>>2],t[r+4>>2]=t[bl+4>>2],Xr(e,3884,r)|0,t[Hl>>2]=11,t[Hl+4>>2]=0,t[r>>2]=t[Hl>>2],t[r+4>>2]=t[Hl+4>>2],Xr(e,3896,r)|0,t[fs>>2]=1,t[fs+4>>2]=0,t[r>>2]=t[fs>>2],t[r+4>>2]=t[fs+4>>2],j0(e,3907,r)|0,t[Zi>>2]=2,t[Zi+4>>2]=0,t[r>>2]=t[Zi>>2],t[r+4>>2]=t[Zi+4>>2],j0(e,3915,r)|0,t[ls>>2]=3,t[ls+4>>2]=0,t[r>>2]=t[ls>>2],t[r+4>>2]=t[ls+4>>2],j0(e,3928,r)|0,t[Qi>>2]=4,t[Qi+4>>2]=0,t[r>>2]=t[Qi>>2],t[r+4>>2]=t[Qi+4>>2],j0(e,3948,r)|0,t[Wl>>2]=5,t[Wl+4>>2]=0,t[r>>2]=t[Wl>>2],t[r+4>>2]=t[Wl+4>>2],j0(e,3960,r)|0,t[xr>>2]=6,t[xr+4>>2]=0,t[r>>2]=t[xr>>2],t[r+4>>2]=t[xr+4>>2],j0(e,3974,r)|0,t[ku>>2]=7,t[ku+4>>2]=0,t[r>>2]=t[ku>>2],t[r+4>>2]=t[ku+4>>2],j0(e,3983,r)|0,t[Di>>2]=20,t[Di+4>>2]=0,t[r>>2]=t[Di>>2],t[r+4>>2]=t[Di+4>>2],gf(e,3999,r)|0,t[Li>>2]=8,t[Li+4>>2]=0,t[r>>2]=t[Li>>2],t[r+4>>2]=t[Li+4>>2],j0(e,4012,r)|0,t[zl>>2]=9,t[zl+4>>2]=0,t[r>>2]=t[zl>>2],t[r+4>>2]=t[zl+4>>2],j0(e,4022,r)|0,t[ql>>2]=21,t[ql+4>>2]=0,t[r>>2]=t[ql>>2],t[r+4>>2]=t[ql+4>>2],gf(e,4039,r)|0,t[tl>>2]=10,t[tl+4>>2]=0,t[r>>2]=t[tl>>2],t[r+4>>2]=t[tl+4>>2],j0(e,4053,r)|0,t[Ul>>2]=11,t[Ul+4>>2]=0,t[r>>2]=t[Ul>>2],t[r+4>>2]=t[Ul+4>>2],j0(e,4065,r)|0,t[jl>>2]=12,t[jl+4>>2]=0,t[r>>2]=t[jl>>2],t[r+4>>2]=t[jl+4>>2],j0(e,4084,r)|0,t[xu>>2]=13,t[xu+4>>2]=0,t[r>>2]=t[xu>>2],t[r+4>>2]=t[xu+4>>2],j0(e,4097,r)|0,t[go>>2]=14,t[go+4>>2]=0,t[r>>2]=t[go>>2],t[r+4>>2]=t[go+4>>2],j0(e,4117,r)|0,t[nu>>2]=15,t[nu+4>>2]=0,t[r>>2]=t[nu>>2],t[r+4>>2]=t[nu+4>>2],j0(e,4129,r)|0,t[Fi>>2]=16,t[Fi+4>>2]=0,t[r>>2]=t[Fi>>2],t[r+4>>2]=t[Fi+4>>2],j0(e,4148,r)|0,t[ss>>2]=17,t[ss+4>>2]=0,t[r>>2]=t[ss>>2],t[r+4>>2]=t[ss+4>>2],j0(e,4161,r)|0,t[el>>2]=18,t[el+4>>2]=0,t[r>>2]=t[el>>2],t[r+4>>2]=t[el+4>>2],j0(e,4181,r)|0,t[Zs>>2]=5,t[Zs+4>>2]=0,t[r>>2]=t[Zs>>2],t[r+4>>2]=t[Zs+4>>2],yi(e,4196,r)|0,t[Rf>>2]=6,t[Rf+4>>2]=0,t[r>>2]=t[Rf>>2],t[r+4>>2]=t[Rf+4>>2],yi(e,4206,r)|0,t[Lf>>2]=7,t[Lf+4>>2]=0,t[r>>2]=t[Lf>>2],t[r+4>>2]=t[Lf+4>>2],yi(e,4217,r)|0,t[us>>2]=3,t[us+4>>2]=0,t[r>>2]=t[us>>2],t[r+4>>2]=t[us+4>>2],Zu(e,4235,r)|0,t[Ff>>2]=1,t[Ff+4>>2]=0,t[r>>2]=t[Ff>>2],t[r+4>>2]=t[Ff+4>>2],_f(e,4251,r)|0,t[Tu>>2]=4,t[Tu+4>>2]=0,t[r>>2]=t[Tu>>2],t[r+4>>2]=t[Tu+4>>2],Zu(e,4263,r)|0,t[Kn>>2]=5,t[Kn+4>>2]=0,t[r>>2]=t[Kn>>2],t[r+4>>2]=t[Kn+4>>2],Zu(e,4279,r)|0,t[Mf>>2]=6,t[Mf+4>>2]=0,t[r>>2]=t[Mf>>2],t[r+4>>2]=t[Mf+4>>2],Zu(e,4293,r)|0,t[Pf>>2]=7,t[Pf+4>>2]=0,t[r>>2]=t[Pf>>2],t[r+4>>2]=t[Pf+4>>2],Zu(e,4306,r)|0,t[If>>2]=8,t[If+4>>2]=0,t[r>>2]=t[If>>2],t[r+4>>2]=t[If+4>>2],Zu(e,4323,r)|0,t[Qs>>2]=9,t[Qs+4>>2]=0,t[r>>2]=t[Qs>>2],t[r+4>>2]=t[Qs+4>>2],Zu(e,4335,r)|0,t[Js>>2]=2,t[Js+4>>2]=0,t[r>>2]=t[Js>>2],t[r+4>>2]=t[Js+4>>2],_f(e,4353,r)|0,t[Of>>2]=12,t[Of+4>>2]=0,t[r>>2]=t[Of>>2],t[r+4>>2]=t[Of+4>>2],Io(e,4363,r)|0,t[Cu>>2]=1,t[Cu+4>>2]=0,t[r>>2]=t[Cu>>2],t[r+4>>2]=t[Cu+4>>2],_u(e,4376,r)|0,t[Af>>2]=2,t[Af+4>>2]=0,t[r>>2]=t[Af>>2],t[r+4>>2]=t[Af+4>>2],_u(e,4388,r)|0,t[kf>>2]=13,t[kf+4>>2]=0,t[r>>2]=t[kf>>2],t[r+4>>2]=t[kf+4>>2],Io(e,4402,r)|0,t[Ro>>2]=14,t[Ro+4>>2]=0,t[r>>2]=t[Ro>>2],t[r+4>>2]=t[Ro+4>>2],Io(e,4411,r)|0,t[Ji>>2]=15,t[Ji+4>>2]=0,t[r>>2]=t[Ji>>2],t[r+4>>2]=t[Ji+4>>2],Io(e,4421,r)|0,t[Xi>>2]=16,t[Xi+4>>2]=0,t[r>>2]=t[Xi>>2],t[r+4>>2]=t[Xi+4>>2],Io(e,4433,r)|0,t[Ki>>2]=17,t[Ki+4>>2]=0,t[r>>2]=t[Ki>>2],t[r+4>>2]=t[Ki+4>>2],Io(e,4446,r)|0,t[Dr>>2]=18,t[Dr+4>>2]=0,t[r>>2]=t[Dr>>2],t[r+4>>2]=t[Dr+4>>2],Io(e,4458,r)|0,t[zt>>2]=3,t[zt+4>>2]=0,t[r>>2]=t[zt>>2],t[r+4>>2]=t[zt+4>>2],_u(e,4471,r)|0,t[Pn>>2]=1,t[Pn+4>>2]=0,t[r>>2]=t[Pn>>2],t[r+4>>2]=t[Pn+4>>2],ec(e,4486,r)|0,t[gn>>2]=10,t[gn+4>>2]=0,t[r>>2]=t[gn>>2],t[r+4>>2]=t[gn+4>>2],Zu(e,4496,r)|0,t[It>>2]=11,t[It+4>>2]=0,t[r>>2]=t[It>>2],t[r+4>>2]=t[It+4>>2],Zu(e,4508,r)|0,t[Ht>>2]=3,t[Ht+4>>2]=0,t[r>>2]=t[Ht>>2],t[r+4>>2]=t[Ht+4>>2],_f(e,4519,r)|0,t[Ln>>2]=4,t[Ln+4>>2]=0,t[r>>2]=t[Ln>>2],t[r+4>>2]=t[Ln+4>>2],Wm(e,4530,r)|0,t[vt>>2]=19,t[vt+4>>2]=0,t[r>>2]=t[vt>>2],t[r+4>>2]=t[vt+4>>2],Fd(e,4542,r)|0,t[_e>>2]=12,t[_e+4>>2]=0,t[r>>2]=t[_e>>2],t[r+4>>2]=t[_e+4>>2],yf(e,4554,r)|0,t[pe>>2]=13,t[pe+4>>2]=0,t[r>>2]=t[pe>>2],t[r+4>>2]=t[pe+4>>2],tc(e,4568,r)|0,t[qe>>2]=2,t[qe+4>>2]=0,t[r>>2]=t[qe>>2],t[r+4>>2]=t[qe+4>>2],Hm(e,4578,r)|0,t[ke>>2]=20,t[ke+4>>2]=0,t[r>>2]=t[ke>>2],t[r+4>>2]=t[ke+4>>2],Ld(e,4587,r)|0,t[Pe>>2]=22,t[Pe+4>>2]=0,t[r>>2]=t[Pe>>2],t[r+4>>2]=t[Pe+4>>2],gf(e,4602,r)|0,t[ie>>2]=23,t[ie+4>>2]=0,t[r>>2]=t[ie>>2],t[r+4>>2]=t[ie+4>>2],gf(e,4619,r)|0,t[le>>2]=14,t[le+4>>2]=0,t[r>>2]=t[le>>2],t[r+4>>2]=t[le+4>>2],Rd(e,4629,r)|0,t[we>>2]=1,t[we+4>>2]=0,t[r>>2]=t[we>>2],t[r+4>>2]=t[we+4>>2],zc(e,4637,r)|0,t[q>>2]=4,t[q+4>>2]=0,t[r>>2]=t[q>>2],t[r+4>>2]=t[q+4>>2],_u(e,4653,r)|0,t[P>>2]=5,t[P+4>>2]=0,t[r>>2]=t[P>>2],t[r+4>>2]=t[P+4>>2],_u(e,4669,r)|0,t[T>>2]=6,t[T+4>>2]=0,t[r>>2]=t[T>>2],t[r+4>>2]=t[T+4>>2],_u(e,4686,r)|0,t[k>>2]=7,t[k+4>>2]=0,t[r>>2]=t[k>>2],t[r+4>>2]=t[k+4>>2],_u(e,4701,r)|0,t[y>>2]=8,t[y+4>>2]=0,t[r>>2]=t[y>>2],t[r+4>>2]=t[y+4>>2],_u(e,4719,r)|0,t[_>>2]=9,t[_+4>>2]=0,t[r>>2]=t[_>>2],t[r+4>>2]=t[_+4>>2],_u(e,4736,r)|0,t[d>>2]=21,t[d+4>>2]=0,t[r>>2]=t[d>>2],t[r+4>>2]=t[d+4>>2],Nd(e,4754,r)|0,t[l>>2]=2,t[l+4>>2]=0,t[r>>2]=t[l>>2],t[r+4>>2]=t[l+4>>2],ec(e,4772,r)|0,t[s>>2]=3,t[s+4>>2]=0,t[r>>2]=t[s>>2],t[r+4>>2]=t[s+4>>2],ec(e,4790,r)|0,t[o>>2]=4,t[o+4>>2]=0,t[r>>2]=t[o>>2],t[r+4>>2]=t[o+4>>2],ec(e,4808,r)|0,h=n}function qm(e,n){e=e|0,n=n|0;var r=0;r=Nx()|0,t[e>>2]=r,Bx(r,n),Cf(t[e>>2]|0)}function Id(e,n,r){return e=e|0,n=n|0,r=r|0,Ex(e,Zn(n)|0,r,0),e|0}function Pd(e,n,r){return e=e|0,n=n|0,r=r|0,ux(e,Zn(n)|0,r,0),e|0}function zm(e,n,r){return e=e|0,n=n|0,r=r|0,V9(e,Zn(n)|0,r,0),e|0}function gf(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],I9(e,n,s),h=o,e|0}function Md(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],vo(e,n,s),h=o,e|0}function Xr(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],a(e,n,s),h=o,e|0}function yi(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],n4(e,n,s),h=o,e|0}function j0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],b_(e,n,s),h=o,e|0}function Zu(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],L_(e,n,s),h=o,e|0}function _f(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Hp(e,n,s),h=o,e|0}function Io(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],e_(e,n,s),h=o,e|0}function _u(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Ip(e,n,s),h=o,e|0}function ec(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Ng(e,n,s),h=o,e|0}function Wm(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],l0(e,n,s),h=o,e|0}function Fd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],hg(e,n,s),h=o,e|0}function yf(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],sg(e,n,s),h=o,e|0}function tc(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Kv(e,n,s),h=o,e|0}function Hm(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],y1(e,n,s),h=o,e|0}function Ld(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],wv(e,n,s),h=o,e|0}function Rd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],fv(e,n,s),h=o,e|0}function zc(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Gd(e,n,s),h=o,e|0}function Nd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Wc(e,n,s),h=o,e|0}function Wc(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Hc(e,r,s,1),h=o}function Zn(e){return e=e|0,e|0}function Hc(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=Za()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Bd(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,bc(l,o)|0,o),h=s}function Za(){var e=0,n=0;if(c[7616]|0||(yu(9136),Bt(24,9136,Q|0)|0,n=7616,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9136)|0)){e=9136,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));yu(9136)}return 9136}function Bd(e){return e=e|0,0}function bc(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=Za()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],n1(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(jd(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function ur(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0;d=h,h=h+32|0,q=d+24|0,P=d+20|0,y=d+16|0,T=d+12|0,k=d+8|0,_=d+4|0,we=d,t[P>>2]=n,t[y>>2]=r,t[T>>2]=o,t[k>>2]=s,t[_>>2]=l,l=e+28|0,t[we>>2]=t[l>>2],t[q>>2]=t[we>>2],e1(e+24|0,q,P,T,k,y,_)|0,t[l>>2]=t[t[l>>2]>>2],h=d}function e1(e,n,r,o,s,l,d){return e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,d=d|0,e=bm(n)|0,n=Tt(24)|0,t1(n+4|0,t[r>>2]|0,t[o>>2]|0,t[s>>2]|0,t[l>>2]|0,t[d>>2]|0),t[n>>2]=t[e>>2],t[e>>2]=n,n|0}function bm(e){return e=e|0,t[e>>2]|0}function t1(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,t[e>>2]=n,t[e+4>>2]=r,t[e+8>>2]=o,t[e+12>>2]=s,t[e+16>>2]=l}function Lt(e,n){return e=e|0,n=n|0,n|e|0}function n1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function jd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Gm(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Ud(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],n1(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Vm(e,_),Ym(_),h=k;return}}function Gm(e){return e=e|0,357913941}function Ud(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Vm(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Ym(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function yu(e){e=e|0,Gc(e)}function r1(e){e=e|0,i1(e+24|0)}function Dn(e){return e=e|0,t[e>>2]|0}function i1(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Gc(e){e=e|0;var n=0;n=An()|0,Nn(e,2,3,n,cn()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function An(){return 9228}function cn(){return 1140}function Vc(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=Il(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=$m(n,o)|0,h=r,n|0}function Nn(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,t[e>>2]=n,t[e+4>>2]=r,t[e+8>>2]=o,t[e+12>>2]=s,t[e+16>>2]=l}function Il(e){return e=e|0,(t[(Za()|0)+24>>2]|0)+(e*12|0)|0}function $m(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;return s=h,h=h+48|0,o=s,r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Bl[r&31](o,e),o=o1(o)|0,h=s,o|0}function o1(e){e=e|0;var n=0,r=0,o=0,s=0;return s=h,h=h+32|0,n=s+12|0,r=s,o=U0(u1()|0)|0,o?(s1(n,o),l1(r,n),qd(e,r),e=f1(n)|0):e=zd(e)|0,h=s,e|0}function u1(){var e=0;return c[7632]|0||(nc(9184),Bt(25,9184,Q|0)|0,e=7632,t[e>>2]=1,t[e+4>>2]=0),9184}function U0(e){return e=e|0,t[e+36>>2]|0}function s1(e,n){e=e|0,n=n|0,t[e>>2]=n,t[e+4>>2]=e,t[e+8>>2]=0}function l1(e,n){e=e|0,n=n|0,t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=0}function qd(e,n){e=e|0,n=n|0,Ii(n,e,e+8|0,e+16|0,e+24|0,e+32|0,e+40|0)|0}function f1(e){return e=e|0,t[(t[e+4>>2]|0)+8>>2]|0}function zd(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0;y=h,h=h+16|0,r=y+4|0,o=y,s=Qo(8)|0,l=s,d=Tt(48)|0,_=d,n=_+48|0;do t[_>>2]=t[e>>2],_=_+4|0,e=e+4|0;while((_|0)<(n|0));return n=l+4|0,t[n>>2]=d,_=Tt(8)|0,d=t[n>>2]|0,t[o>>2]=0,t[r>>2]=t[o>>2],Wd(_,d,r),t[s>>2]=_,h=y,l|0}function Wd(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1092,t[r+12>>2]=n,t[e+4>>2]=r}function Km(e){e=e|0,da(e),Ve(e)}function Xm(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function es(e){e=e|0,Ve(e)}function Ii(e,n,r,o,s,l,d){return e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,d=d|0,l=c1(t[e>>2]|0,n,r,o,s,l,d)|0,d=e+4|0,t[(t[d>>2]|0)+8>>2]=l,t[(t[d>>2]|0)+8>>2]|0}function c1(e,n,r,o,s,l,d){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,d=d|0;var _=0,y=0;return _=h,h=h+16|0,y=_,Zo(y),e=Oi(e)|0,d=Jm(e,+L[n>>3],+L[r>>3],+L[o>>3],+L[s>>3],+L[l>>3],+L[d>>3])|0,eu(y),h=_,d|0}function Jm(e,n,r,o,s,l,d){e=e|0,n=+n,r=+r,o=+o,s=+s,l=+l,d=+d;var _=0;return _=ko(a1()|0)|0,n=+Ko(n),r=+Ko(r),o=+Ko(o),s=+Ko(s),l=+Ko(l),xs(0,_|0,e|0,+n,+r,+o,+s,+l,+ +Ko(d))|0}function a1(){var e=0;return c[7624]|0||(Qm(9172),e=7624,t[e>>2]=1,t[e+4>>2]=0),9172}function Qm(e){e=e|0,Ao(e,Zm()|0,6)}function Zm(){return 1112}function nc(e){e=e|0,Ys(e)}function Hd(e){e=e|0,d1(e+24|0),bd(e+16|0)}function d1(e){e=e|0,tv(e)}function bd(e){e=e|0,ev(e)}function ev(e){e=e|0;var n=0,r=0;if(n=t[e>>2]|0,n|0)do r=n,n=t[n>>2]|0,Ve(r);while((n|0)!=0);t[e>>2]=0}function tv(e){e=e|0;var n=0,r=0;if(n=t[e>>2]|0,n|0)do r=n,n=t[n>>2]|0,Ve(r);while((n|0)!=0);t[e>>2]=0}function Ys(e){e=e|0;var n=0;t[e+16>>2]=0,t[e+20>>2]=0,n=e+24|0,t[n>>2]=0,t[e+28>>2]=n,t[e+36>>2]=0,c[e+40>>0]=0,c[e+41>>0]=0}function Gd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Vd(e,r,s,0),h=o}function Vd(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=p1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=h1(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Yd(l,o)|0,o),h=s}function p1(){var e=0,n=0;if(c[7640]|0||(Xo(9232),Bt(26,9232,Q|0)|0,n=7640,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9232)|0)){e=9232,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Xo(9232)}return 9232}function h1(e){return e=e|0,0}function Yd(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=p1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],wf(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(m1(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function wf(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function m1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=$d(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Kd(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],wf(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Yc(e,_),Xd(_),h=k;return}}function $d(e){return e=e|0,357913941}function Kd(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Yc(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Xd(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Xo(e){e=e|0,Jd(e)}function Pl(e){e=e|0,nv(e+24|0)}function nv(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Jd(e){e=e|0;var n=0;n=An()|0,Nn(e,2,1,n,rv()|0,3),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function rv(){return 1144}function iv(e,n,r,o,s){e=e|0,n=n|0,r=+r,o=+o,s=s|0;var l=0,d=0,_=0,y=0;l=h,h=h+16|0,d=l+8|0,_=l,y=ov(e)|0,e=t[y+4>>2]|0,t[_>>2]=t[y>>2],t[_+4>>2]=e,t[d>>2]=t[_>>2],t[d+4>>2]=t[_+4>>2],uv(n,d,r,o,s),h=l}function ov(e){return e=e|0,(t[(p1()|0)+24>>2]|0)+(e*12|0)|0}function uv(e,n,r,o,s){e=e|0,n=n|0,r=+r,o=+o,s=s|0;var l=0,d=0,_=0,y=0,k=0;k=h,h=h+16|0,d=k+2|0,_=k+1|0,y=k,l=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(l=t[(t[e>>2]|0)+l>>2]|0),wu(d,r),r=+Du(d,r),wu(_,o),o=+Du(_,o),ts(y,s),y=ns(y,s)|0,iD[l&1](e,r,o,y),h=k}function wu(e,n){e=e|0,n=+n}function Du(e,n){return e=e|0,n=+n,+ +lv(n)}function ts(e,n){e=e|0,n=n|0}function ns(e,n){return e=e|0,n=n|0,sv(n)|0}function sv(e){return e=e|0,e|0}function lv(e){return e=+e,+e}function fv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Qd(e,r,s,1),h=o}function Qd(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=$c()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Zd(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,cv(l,o)|0,o),h=s}function $c(){var e=0,n=0;if(c[7648]|0||(np(9268),Bt(27,9268,Q|0)|0,n=7648,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9268)|0)){e=9268,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));np(9268)}return 9268}function Zd(e){return e=e|0,0}function cv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=$c()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],ep(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(av(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function ep(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function av(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=tp(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,dv(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],ep(l,o,r),t[y>>2]=(t[y>>2]|0)+12,pv(e,_),hv(_),h=k;return}}function tp(e){return e=e|0,357913941}function dv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function pv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function hv(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function np(e){e=e|0,Po(e)}function mv(e){e=e|0,vv(e+24|0)}function vv(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Po(e){e=e|0;var n=0;n=An()|0,Nn(e,2,4,n,gv()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function gv(){return 1160}function _v(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=yv(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=rp(n,o)|0,h=r,n|0}function yv(e){return e=e|0,(t[($c()|0)+24>>2]|0)+(e*12|0)|0}function rp(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),ip(dc[r&31](e)|0)|0}function ip(e){return e=e|0,e&1|0}function wv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Dv(e,r,s,0),h=o}function Dv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=v1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=g1(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Ev(l,o)|0,o),h=s}function v1(){var e=0,n=0;if(c[7656]|0||(up(9304),Bt(28,9304,Q|0)|0,n=7656,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9304)|0)){e=9304,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));up(9304)}return 9304}function g1(e){return e=e|0,0}function Ev(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=v1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],op(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Sv(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function op(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function Sv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Cv(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Tv(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],op(l,o,r),t[y>>2]=(t[y>>2]|0)+12,xv(e,_),kv(_),h=k;return}}function Cv(e){return e=e|0,357913941}function Tv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function xv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function kv(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function up(e){e=e|0,Iv(e)}function Av(e){e=e|0,Ov(e+24|0)}function Ov(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Iv(e){e=e|0;var n=0;n=An()|0,Nn(e,2,5,n,Pv()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Pv(){return 1164}function Mv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=Fv(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Lv(n,s,r),h=o}function Fv(e){return e=e|0,(t[(v1()|0)+24>>2]|0)+(e*12|0)|0}function Lv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),$s(s,r),r=Ks(s,r)|0,Bl[o&31](e,r),Xs(s),h=l}function $s(e,n){e=e|0,n=n|0,Rv(e,n)}function Ks(e,n){return e=e|0,n=n|0,e|0}function Xs(e){e=e|0,Ju(e)}function Rv(e,n){e=e|0,n=n|0,_1(e,n)}function _1(e,n){e=e|0,n=n|0,t[e>>2]=n}function y1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],sp(e,r,s,0),h=o}function sp(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=w1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Nv(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Bv(l,o)|0,o),h=s}function w1(){var e=0,n=0;if(c[7664]|0||(cp(9340),Bt(29,9340,Q|0)|0,n=7664,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9340)|0)){e=9340,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));cp(9340)}return 9340}function Nv(e){return e=e|0,0}function Bv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=w1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],lp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(jv(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function lp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function jv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Uv(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,qv(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],lp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,zv(e,_),fp(_),h=k;return}}function Uv(e){return e=e|0,357913941}function qv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function zv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function fp(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function cp(e){e=e|0,Hv(e)}function Kc(e){e=e|0,Wv(e+24|0)}function Wv(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Hv(e){e=e|0;var n=0;n=An()|0,Nn(e,2,4,n,bv()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function bv(){return 1180}function Gv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=Vv(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r=Yv(n,s,r)|0,h=o,r|0}function Vv(e){return e=e|0,(t[(w1()|0)+24>>2]|0)+(e*12|0)|0}function Yv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;return l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),Ml(s,r),s=Fl(s,r)|0,s=Xc(J4[o&15](e,s)|0)|0,h=l,s|0}function Ml(e,n){e=e|0,n=n|0}function Fl(e,n){return e=e|0,n=n|0,$v(n)|0}function Xc(e){return e=e|0,e|0}function $v(e){return e=e|0,e|0}function Kv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Xv(e,r,s,0),h=o}function Xv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=D1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Jv(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Qv(l,o)|0,o),h=s}function D1(){var e=0,n=0;if(c[7672]|0||(hp(9376),Bt(30,9376,Q|0)|0,n=7672,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9376)|0)){e=9376,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));hp(9376)}return 9376}function Jv(e){return e=e|0,0}function Qv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=D1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],ap(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(dp(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function ap(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function dp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=pp(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Zv(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],ap(l,o,r),t[y>>2]=(t[y>>2]|0)+12,eg(e,_),tg(_),h=k;return}}function pp(e){return e=e|0,357913941}function Zv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function eg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function tg(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function hp(e){e=e|0,rg(e)}function Jc(e){e=e|0,ng(e+24|0)}function ng(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function rg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,5,n,mp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function mp(){return 1196}function ig(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=og(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=ug(n,o)|0,h=r,n|0}function og(e){return e=e|0,(t[(D1()|0)+24>>2]|0)+(e*12|0)|0}function ug(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Xc(dc[r&31](e)|0)|0}function sg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],lg(e,r,s,1),h=o}function lg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=E1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=fg(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,cg(l,o)|0,o),h=s}function E1(){var e=0,n=0;if(c[7680]|0||(C1(9412),Bt(31,9412,Q|0)|0,n=7680,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9412)|0)){e=9412,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));C1(9412)}return 9412}function fg(e){return e=e|0,0}function cg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=E1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],rc(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(ag(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function rc(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function ag(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=vp(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,gp(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],rc(l,o,r),t[y>>2]=(t[y>>2]|0)+12,S1(e,_),_p(_),h=k;return}}function vp(e){return e=e|0,357913941}function gp(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function S1(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function _p(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function C1(e){e=e|0,dg(e)}function yp(e){e=e|0,wp(e+24|0)}function wp(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function dg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,6,n,Dp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Dp(){return 1200}function pg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=Qc(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=Zc(n,o)|0,h=r,n|0}function Qc(e){return e=e|0,(t[(E1()|0)+24>>2]|0)+(e*12|0)|0}function Zc(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),ea(dc[r&31](e)|0)|0}function ea(e){return e=e|0,e|0}function hg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],T1(e,r,s,0),h=o}function T1(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=ta()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=mg(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,vg(l,o)|0,o),h=s}function ta(){var e=0,n=0;if(c[7688]|0||(Sp(9448),Bt(32,9448,Q|0)|0,n=7688,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9448)|0)){e=9448,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Sp(9448)}return 9448}function mg(e){return e=e|0,0}function vg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=ta()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Ep(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(gg(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Ep(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function gg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=_g(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,yg(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Ep(l,o,r),t[y>>2]=(t[y>>2]|0)+12,wg(e,_),Dg(_),h=k;return}}function _g(e){return e=e|0,357913941}function yg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function wg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Dg(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Sp(e){e=e|0,Cg(e)}function Eg(e){e=e|0,Sg(e+24|0)}function Sg(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Cg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,6,n,Mo()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Mo(){return 1204}function Tg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=xg(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Ll(n,s,r),h=o}function xg(e){return e=e|0,(t[(ta()|0)+24>>2]|0)+(e*12|0)|0}function Ll(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),On(s,r),s=x1(s,r)|0,Bl[o&31](e,s),h=l}function On(e,n){e=e|0,n=n|0}function x1(e,n){return e=e|0,n=n|0,Vi(n)|0}function Vi(e){return e=e|0,e|0}function l0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],kg(e,r,s,0),h=o}function kg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=Eu()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Ag(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Og(l,o)|0,o),h=s}function Eu(){var e=0,n=0;if(c[7696]|0||(A1(9484),Bt(33,9484,Q|0)|0,n=7696,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9484)|0)){e=9484,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));A1(9484)}return 9484}function Ag(e){return e=e|0,0}function Og(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=Eu()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Cp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Ig(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Cp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function Ig(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Pg(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,k1(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Cp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Mg(e,_),rs(_),h=k;return}}function Pg(e){return e=e|0,357913941}function k1(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Mg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function rs(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function A1(e){e=e|0,n0(e)}function na(e){e=e|0,Jr(e+24|0)}function Jr(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function n0(e){e=e|0;var n=0;n=An()|0,Nn(e,2,1,n,Tp()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Tp(){return 1212}function Fg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,l=s+8|0,d=s,_=Lg(e)|0,e=t[_+4>>2]|0,t[d>>2]=t[_>>2],t[d+4>>2]=e,t[l>>2]=t[d>>2],t[l+4>>2]=t[d+4>>2],Rg(n,l,r,o),h=s}function Lg(e){return e=e|0,(t[(Eu()|0)+24>>2]|0)+(e*12|0)|0}function Rg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;_=h,h=h+16|0,l=_+1|0,d=_,s=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(s=t[(t[e>>2]|0)+s>>2]|0),On(l,r),l=x1(l,r)|0,Ml(d,o),d=Fl(d,o)|0,X1[s&15](e,l,d),h=_}function Ng(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Bg(e,r,s,1),h=o}function Bg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=O1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=xp(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,ic(l,o)|0,o),h=s}function O1(){var e=0,n=0;if(c[7704]|0||(Ap(9520),Bt(34,9520,Q|0)|0,n=7704,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9520)|0)){e=9520,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Ap(9520)}return 9520}function xp(e){return e=e|0,0}function ic(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=O1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],ra(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(jg(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function ra(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function jg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=kp(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,ia(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],ra(l,o,r),t[y>>2]=(t[y>>2]|0)+12,mo(e,_),Df(_),h=k;return}}function kp(e){return e=e|0,357913941}function ia(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function mo(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Df(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Ap(e){e=e|0,zg(e)}function Ug(e){e=e|0,qg(e+24|0)}function qg(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function zg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,1,n,Wg()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Wg(){return 1224}function Op(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;return s=h,h=h+16|0,l=s+8|0,d=s,_=is(e)|0,e=t[_+4>>2]|0,t[d>>2]=t[_>>2],t[d+4>>2]=e,t[l>>2]=t[d>>2],t[l+4>>2]=t[d+4>>2],o=+jn(n,l,r),h=s,+o}function is(e){return e=e|0,(t[(O1()|0)+24>>2]|0)+(e*12|0)|0}function jn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),ts(s,r),s=ns(s,r)|0,d=+Ol(+uD[o&7](e,s)),h=l,+d}function Ip(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Fo(e,r,s,1),h=o}function Fo(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=oa()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Hg(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,yr(l,o)|0,o),h=s}function oa(){var e=0,n=0;if(c[7712]|0||(Fp(9556),Bt(35,9556,Q|0)|0,n=7712,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9556)|0)){e=9556,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Fp(9556)}return 9556}function Hg(e){return e=e|0,0}function yr(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=oa()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Pp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Mp(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Pp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function Mp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=ua(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,bg(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Pp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Gg(e,_),Vg(_),h=k;return}}function ua(e){return e=e|0,357913941}function bg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Gg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Vg(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Fp(e){e=e|0,Kg(e)}function Yg(e){e=e|0,$g(e+24|0)}function $g(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Kg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,5,n,Xg()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Xg(){return 1232}function Jg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=Qg(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r=+Zg(n,s),h=o,+r}function Qg(e){return e=e|0,(t[(oa()|0)+24>>2]|0)+(e*12|0)|0}function Zg(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),+ +Ol(+oD[r&15](e))}function e_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],t_(e,r,s,1),h=o}function t_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=oc()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=n_(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,I1(l,o)|0,o),h=s}function oc(){var e=0,n=0;if(c[7720]|0||(Rp(9592),Bt(36,9592,Q|0)|0,n=7720,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9592)|0)){e=9592,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Rp(9592)}return 9592}function n_(e){return e=e|0,0}function I1(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=oc()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Lp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(r_(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Lp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function r_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=i_(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,q0(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Lp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Yi(e,_),o_(_),h=k;return}}function i_(e){return e=e|0,357913941}function q0(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Yi(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function o_(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Rp(e){e=e|0,s_(e)}function u_(e){e=e|0,Np(e+24|0)}function Np(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function s_(e){e=e|0;var n=0;n=An()|0,Nn(e,2,7,n,l_()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function l_(){return 1276}function f_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=Bp(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=c_(n,o)|0,h=r,n|0}function Bp(e){return e=e|0,(t[(oc()|0)+24>>2]|0)+(e*12|0)|0}function c_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;return s=h,h=h+16|0,o=s,r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Bl[r&31](o,e),o=jp(o)|0,h=s,o|0}function jp(e){e=e|0;var n=0,r=0,o=0,s=0;return s=h,h=h+32|0,n=s+12|0,r=s,o=U0(Up()|0)|0,o?(s1(n,o),l1(r,n),qp(e,r),e=f1(n)|0):e=zp(e)|0,h=s,e|0}function Up(){var e=0;return c[7736]|0||(Wp(9640),Bt(25,9640,Q|0)|0,e=7736,t[e>>2]=1,t[e+4>>2]=0),9640}function qp(e,n){e=e|0,n=n|0,Ef(n,e,e+8|0)|0}function zp(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0;return r=h,h=h+16|0,s=r+4|0,d=r,o=Qo(8)|0,n=o,_=Tt(16)|0,t[_>>2]=t[e>>2],t[_+4>>2]=t[e+4>>2],t[_+8>>2]=t[e+8>>2],t[_+12>>2]=t[e+12>>2],l=n+4|0,t[l>>2]=_,e=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],P1(e,l,s),t[o>>2]=e,h=r,n|0}function P1(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1244,t[r+12>>2]=n,t[e+4>>2]=r}function a_(e){e=e|0,da(e),Ve(e)}function d_(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function p_(e){e=e|0,Ve(e)}function Ef(e,n,r){return e=e|0,n=n|0,r=r|0,n=h_(t[e>>2]|0,n,r)|0,r=e+4|0,t[(t[r>>2]|0)+8>>2]=n,t[(t[r>>2]|0)+8>>2]|0}function h_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;return o=h,h=h+16|0,s=o,Zo(s),e=Oi(e)|0,r=m_(e,t[n>>2]|0,+L[r>>3])|0,eu(s),h=o,r|0}function m_(e,n,r){e=e|0,n=n|0,r=+r;var o=0;return o=ko(v_()|0)|0,n=jc(n)|0,dl(0,o|0,e|0,n|0,+ +Ko(r))|0}function v_(){var e=0;return c[7728]|0||(g_(9628),e=7728,t[e>>2]=1,t[e+4>>2]=0),9628}function g_(e){e=e|0,Ao(e,__()|0,2)}function __(){return 1264}function Wp(e){e=e|0,Ys(e)}function Hp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],y_(e,r,s,1),h=o}function y_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=M1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=w_(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,D_(l,o)|0,o),h=s}function M1(){var e=0,n=0;if(c[7744]|0||(Gp(9684),Bt(37,9684,Q|0)|0,n=7744,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9684)|0)){e=9684,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Gp(9684)}return 9684}function w_(e){return e=e|0,0}function D_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=M1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],bp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(E_(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function bp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function E_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=S_(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,C_(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],bp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,T_(e,_),x_(_),h=k;return}}function S_(e){return e=e|0,357913941}function C_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function T_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function x_(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Gp(e){e=e|0,O_(e)}function k_(e){e=e|0,A_(e+24|0)}function A_(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function O_(e){e=e|0;var n=0;n=An()|0,Nn(e,2,5,n,I_()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function I_(){return 1280}function P_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=M_(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r=F_(n,s,r)|0,h=o,r|0}function M_(e){return e=e|0,(t[(M1()|0)+24>>2]|0)+(e*12|0)|0}function F_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return d=h,h=h+32|0,s=d,l=d+16|0,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),ts(l,r),l=ns(l,r)|0,X1[o&15](s,e,l),l=jp(s)|0,h=d,l|0}function L_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],R_(e,r,s,1),h=o}function R_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=F1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=N_(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,B_(l,o)|0,o),h=s}function F1(){var e=0,n=0;if(c[7752]|0||(Kp(9720),Bt(38,9720,Q|0)|0,n=7752,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9720)|0)){e=9720,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Kp(9720)}return 9720}function N_(e){return e=e|0,0}function B_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=F1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Vp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(j_(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Vp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function j_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=L1(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Yp(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Vp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,$p(e,_),U_(_),h=k;return}}function L1(e){return e=e|0,357913941}function Yp(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function $p(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function U_(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Kp(e){e=e|0,z_(e)}function q_(e){e=e|0,R1(e+24|0)}function R1(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function z_(e){e=e|0;var n=0;n=An()|0,Nn(e,2,8,n,W_()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function W_(){return 1288}function H_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=$i(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=N1(n,o)|0,h=r,n|0}function $i(e){return e=e|0,(t[(F1()|0)+24>>2]|0)+(e*12|0)|0}function N1(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Dd(dc[r&31](e)|0)|0}function b_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],G_(e,r,s,0),h=o}function G_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=B1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=V_(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,j1(l,o)|0,o),h=s}function B1(){var e=0,n=0;if(c[7760]|0||(q1(9756),Bt(39,9756,Q|0)|0,n=7760,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9756)|0)){e=9756,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));q1(9756)}return 9756}function V_(e){return e=e|0,0}function j1(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=B1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Xp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(U1(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Xp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function U1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Y_(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,$_(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Xp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,K_(e,_),X_(_),h=k;return}}function Y_(e){return e=e|0,357913941}function $_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function K_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function X_(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function q1(e){e=e|0,Z_(e)}function J_(e){e=e|0,Q_(e+24|0)}function Q_(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Z_(e){e=e|0;var n=0;n=An()|0,Nn(e,2,8,n,z1()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function z1(){return 1292}function W1(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=e4(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],t4(n,s,r),h=o}function e4(e){return e=e|0,(t[(B1()|0)+24>>2]|0)+(e*12|0)|0}function t4(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),wu(s,r),r=+Du(s,r),nD[o&31](e,r),h=l}function n4(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r4(e,r,s,0),h=o}function r4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=H1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=i4(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,o4(l,o)|0,o),h=s}function H1(){var e=0,n=0;if(c[7768]|0||(Qp(9792),Bt(40,9792,Q|0)|0,n=7768,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9792)|0)){e=9792,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Qp(9792)}return 9792}function i4(e){return e=e|0,0}function o4(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=H1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Jp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(u4(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Jp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function u4(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=s4(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,l4(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Jp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,f4(e,_),c4(_),h=k;return}}function s4(e){return e=e|0,357913941}function l4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function f4(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function c4(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Qp(e){e=e|0,p4(e)}function a4(e){e=e|0,d4(e+24|0)}function d4(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function p4(e){e=e|0;var n=0;n=An()|0,Nn(e,2,1,n,h4()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function h4(){return 1300}function m4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=+o;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,l=s+8|0,d=s,_=v4(e)|0,e=t[_+4>>2]|0,t[d>>2]=t[_>>2],t[d+4>>2]=e,t[l>>2]=t[d>>2],t[l+4>>2]=t[d+4>>2],g4(n,l,r,o),h=s}function v4(e){return e=e|0,(t[(H1()|0)+24>>2]|0)+(e*12|0)|0}function g4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=+o;var s=0,l=0,d=0,_=0;_=h,h=h+16|0,l=_+1|0,d=_,s=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(s=t[(t[e>>2]|0)+s>>2]|0),ts(l,r),l=ns(l,r)|0,wu(d,o),o=+Du(d,o),cD[s&15](e,l,o),h=_}function a(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],p(e,r,s,0),h=o}function p(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=E()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=I(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,B(l,o)|0,o),h=s}function E(){var e=0,n=0;if(c[7776]|0||(nt(9828),Bt(41,9828,Q|0)|0,n=7776,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9828)|0)){e=9828,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));nt(9828)}return 9828}function I(e){return e=e|0,0}function B(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=E()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],G(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(te(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function G(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function te(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=se(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Ee(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],G(l,o,r),t[y>>2]=(t[y>>2]|0)+12,$e(e,_),Ke(_),h=k;return}}function se(e){return e=e|0,357913941}function Ee(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function $e(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Ke(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function nt(e){e=e|0,an(e)}function Ct(e){e=e|0,Gt(e+24|0)}function Gt(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function an(e){e=e|0;var n=0;n=An()|0,Nn(e,2,7,n,qn()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function qn(){return 1312}function dn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=Yn(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],er(n,s,r),h=o}function Yn(e){return e=e|0,(t[(E()|0)+24>>2]|0)+(e*12|0)|0}function er(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),ts(s,r),s=ns(s,r)|0,Bl[o&31](e,s),h=l}function vo(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Pi(e,r,s,0),h=o}function Pi(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=Mi()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=f0(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Jo(l,o)|0,o),h=s}function Mi(){var e=0,n=0;if(c[7784]|0||(kw(9864),Bt(42,9864,Q|0)|0,n=7784,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9864)|0)){e=9864,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));kw(9864)}return 9864}function f0(e){return e=e|0,0}function Jo(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=Mi()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Su(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Zp(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Su(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function Zp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=v9(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,g9(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Su(l,o,r),t[y>>2]=(t[y>>2]|0)+12,_9(e,_),y9(_),h=k;return}}function v9(e){return e=e|0,357913941}function g9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function _9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function y9(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function kw(e){e=e|0,E9(e)}function w9(e){e=e|0,D9(e+24|0)}function D9(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function E9(e){e=e|0;var n=0;n=An()|0,Nn(e,2,8,n,S9()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function S9(){return 1320}function C9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=T9(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],x9(n,s,r),h=o}function T9(e){return e=e|0,(t[(Mi()|0)+24>>2]|0)+(e*12|0)|0}function x9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),k9(s,r),s=A9(s,r)|0,Bl[o&31](e,s),h=l}function k9(e,n){e=e|0,n=n|0}function A9(e,n){return e=e|0,n=n|0,O9(n)|0}function O9(e){return e=e|0,e|0}function I9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],P9(e,r,s,0),h=o}function P9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=_4()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=M9(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,F9(l,o)|0,o),h=s}function _4(){var e=0,n=0;if(c[7792]|0||(Ow(9900),Bt(43,9900,Q|0)|0,n=7792,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9900)|0)){e=9900,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Ow(9900)}return 9900}function M9(e){return e=e|0,0}function F9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=_4()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Aw(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(L9(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Aw(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function L9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=R9(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,N9(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Aw(l,o,r),t[y>>2]=(t[y>>2]|0)+12,B9(e,_),j9(_),h=k;return}}function R9(e){return e=e|0,357913941}function N9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function B9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function j9(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Ow(e){e=e|0,z9(e)}function U9(e){e=e|0,q9(e+24|0)}function q9(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function z9(e){e=e|0;var n=0;n=An()|0,Nn(e,2,22,n,W9()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function W9(){return 1344}function H9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;r=h,h=h+16|0,o=r+8|0,s=r,l=b9(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],G9(n,o),h=r}function b9(e){return e=e|0,(t[(_4()|0)+24>>2]|0)+(e*12|0)|0}function G9(e,n){e=e|0,n=n|0;var r=0;r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Nl[r&127](e)}function V9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=y4()|0,e=Y9(r)|0,ur(l,n,s,e,$9(r,o)|0,o)}function y4(){var e=0,n=0;if(c[7800]|0||(Pw(9936),Bt(44,9936,Q|0)|0,n=7800,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9936)|0)){e=9936,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Pw(9936)}return 9936}function Y9(e){return e=e|0,e|0}function $9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=y4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(Iw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(K9(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function Iw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function K9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=X9(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,J9(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,Iw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,Q9(e,s),Z9(s),h=_;return}}function X9(e){return e=e|0,536870911}function J9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function Q9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Z9(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Pw(e){e=e|0,nx(e)}function ex(e){e=e|0,tx(e+24|0)}function tx(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function nx(e){e=e|0;var n=0;n=An()|0,Nn(e,1,23,n,Mo()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function rx(e,n){e=e|0,n=n|0,ox(t[(ix(e)|0)>>2]|0,n)}function ix(e){return e=e|0,(t[(y4()|0)+24>>2]|0)+(e<<3)|0}function ox(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,On(o,n),n=x1(o,n)|0,Nl[e&127](n),h=r}function ux(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=w4()|0,e=sx(r)|0,ur(l,n,s,e,lx(r,o)|0,o)}function w4(){var e=0,n=0;if(c[7808]|0||(Fw(9972),Bt(45,9972,Q|0)|0,n=7808,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9972)|0)){e=9972,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Fw(9972)}return 9972}function sx(e){return e=e|0,e|0}function lx(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=w4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(Mw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(fx(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function Mw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function fx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=cx(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,ax(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,Mw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,dx(e,s),px(s),h=_;return}}function cx(e){return e=e|0,536870911}function ax(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function dx(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function px(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Fw(e){e=e|0,vx(e)}function hx(e){e=e|0,mx(e+24|0)}function mx(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function vx(e){e=e|0;var n=0;n=An()|0,Nn(e,1,9,n,gx()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function gx(){return 1348}function _x(e,n){return e=e|0,n=n|0,wx(t[(yx(e)|0)>>2]|0,n)|0}function yx(e){return e=e|0,(t[(w4()|0)+24>>2]|0)+(e<<3)|0}function wx(e,n){e=e|0,n=n|0;var r=0,o=0;return r=h,h=h+16|0,o=r,Lw(o,n),n=Rw(o,n)|0,n=Xc(dc[e&31](n)|0)|0,h=r,n|0}function Lw(e,n){e=e|0,n=n|0}function Rw(e,n){return e=e|0,n=n|0,Dx(n)|0}function Dx(e){return e=e|0,e|0}function Ex(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=D4()|0,e=Sx(r)|0,ur(l,n,s,e,Cx(r,o)|0,o)}function D4(){var e=0,n=0;if(c[7816]|0||(Bw(10008),Bt(46,10008,Q|0)|0,n=7816,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10008)|0)){e=10008,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Bw(10008)}return 10008}function Sx(e){return e=e|0,e|0}function Cx(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=D4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(Nw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(Tx(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function Nw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function Tx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=xx(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,kx(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,Nw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,Ax(e,s),Ox(s),h=_;return}}function xx(e){return e=e|0,536870911}function kx(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function Ax(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Ox(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Bw(e){e=e|0,Mx(e)}function Ix(e){e=e|0,Px(e+24|0)}function Px(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function Mx(e){e=e|0;var n=0;n=An()|0,Nn(e,1,15,n,mp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Fx(e){return e=e|0,Rx(t[(Lx(e)|0)>>2]|0)|0}function Lx(e){return e=e|0,(t[(D4()|0)+24>>2]|0)+(e<<3)|0}function Rx(e){return e=e|0,Xc(ph[e&7]()|0)|0}function Nx(){var e=0;return c[7832]|0||(bx(10052),Bt(25,10052,Q|0)|0,e=7832,t[e>>2]=1,t[e+4>>2]=0),10052}function Bx(e,n){e=e|0,n=n|0,t[e>>2]=jx()|0,t[e+4>>2]=Ux()|0,t[e+12>>2]=n,t[e+8>>2]=qx()|0,t[e+32>>2]=2}function jx(){return 11709}function Ux(){return 1188}function qx(){return eh()|0}function zx(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(Wx(r),Ve(r)):n|0&&(mu(n),Ve(n))}function Sf(e,n){return e=e|0,n=n|0,n&e|0}function Wx(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function eh(){var e=0;return c[7824]|0||(t[2511]=Hx()|0,t[2512]=0,e=7824,t[e>>2]=1,t[e+4>>2]=0),10044}function Hx(){return 0}function bx(e){e=e|0,Ys(e)}function Gx(e){e=e|0;var n=0,r=0,o=0,s=0,l=0;n=h,h=h+32|0,r=n+24|0,l=n+16|0,s=n+8|0,o=n,Vx(e,4827),Yx(e,4834,3)|0,$x(e,3682,47)|0,t[l>>2]=9,t[l+4>>2]=0,t[r>>2]=t[l>>2],t[r+4>>2]=t[l+4>>2],Kx(e,4841,r)|0,t[s>>2]=1,t[s+4>>2]=0,t[r>>2]=t[s>>2],t[r+4>>2]=t[s+4>>2],Xx(e,4871,r)|0,t[o>>2]=10,t[o+4>>2]=0,t[r>>2]=t[o>>2],t[r+4>>2]=t[o+4>>2],Jx(e,4891,r)|0,h=n}function Vx(e,n){e=e|0,n=n|0;var r=0;r=Ok()|0,t[e>>2]=r,Ik(r,n),Cf(t[e>>2]|0)}function Yx(e,n,r){return e=e|0,n=n|0,r=r|0,pk(e,Zn(n)|0,r,0),e|0}function $x(e,n,r){return e=e|0,n=n|0,r=r|0,Q7(e,Zn(n)|0,r,0),e|0}function Kx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],F7(e,n,s),h=o,e|0}function Xx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],h7(e,n,s),h=o,e|0}function Jx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Qx(e,n,s),h=o,e|0}function Qx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Zx(e,r,s,1),h=o}function Zx(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=E4()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=e7(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,t7(l,o)|0,o),h=s}function E4(){var e=0,n=0;if(c[7840]|0||(Uw(10100),Bt(48,10100,Q|0)|0,n=7840,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10100)|0)){e=10100,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Uw(10100)}return 10100}function e7(e){return e=e|0,0}function t7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=E4()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],jw(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(n7(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function jw(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function n7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=r7(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,i7(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],jw(l,o,r),t[y>>2]=(t[y>>2]|0)+12,o7(e,_),u7(_),h=k;return}}function r7(e){return e=e|0,357913941}function i7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function o7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function u7(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Uw(e){e=e|0,f7(e)}function s7(e){e=e|0,l7(e+24|0)}function l7(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function f7(e){e=e|0;var n=0;n=An()|0,Nn(e,2,6,n,c7()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function c7(){return 1364}function a7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=d7(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r=p7(n,s,r)|0,h=o,r|0}function d7(e){return e=e|0,(t[(E4()|0)+24>>2]|0)+(e*12|0)|0}function p7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;return l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),ts(s,r),s=ns(s,r)|0,s=ip(J4[o&15](e,s)|0)|0,h=l,s|0}function h7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],m7(e,r,s,0),h=o}function m7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=S4()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=v7(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,g7(l,o)|0,o),h=s}function S4(){var e=0,n=0;if(c[7848]|0||(zw(10136),Bt(49,10136,Q|0)|0,n=7848,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10136)|0)){e=10136,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));zw(10136)}return 10136}function v7(e){return e=e|0,0}function g7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=S4()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],qw(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(_7(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function qw(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function _7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=y7(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,w7(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],qw(l,o,r),t[y>>2]=(t[y>>2]|0)+12,D7(e,_),E7(_),h=k;return}}function y7(e){return e=e|0,357913941}function w7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function D7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function E7(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function zw(e){e=e|0,T7(e)}function S7(e){e=e|0,C7(e+24|0)}function C7(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function T7(e){e=e|0;var n=0;n=An()|0,Nn(e,2,9,n,x7()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function x7(){return 1372}function k7(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=A7(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],O7(n,s,r),h=o}function A7(e){return e=e|0,(t[(S4()|0)+24>>2]|0)+(e*12|0)|0}function O7(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0,d=tt;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),I7(s,r),d=w(P7(s,r)),tD[o&1](e,d),h=l}function I7(e,n){e=e|0,n=+n}function P7(e,n){return e=e|0,n=+n,w(M7(n))}function M7(e){return e=+e,w(e)}function F7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],L7(e,r,s,0),h=o}function L7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=C4()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=R7(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,N7(l,o)|0,o),h=s}function C4(){var e=0,n=0;if(c[7856]|0||(Hw(10172),Bt(50,10172,Q|0)|0,n=7856,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10172)|0)){e=10172,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Hw(10172)}return 10172}function R7(e){return e=e|0,0}function N7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=C4()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Ww(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(B7(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Ww(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function B7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=j7(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,U7(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Ww(l,o,r),t[y>>2]=(t[y>>2]|0)+12,q7(e,_),z7(_),h=k;return}}function j7(e){return e=e|0,357913941}function U7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function q7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function z7(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Hw(e){e=e|0,b7(e)}function W7(e){e=e|0,H7(e+24|0)}function H7(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function b7(e){e=e|0;var n=0;n=An()|0,Nn(e,2,3,n,G7()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function G7(){return 1380}function V7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,l=s+8|0,d=s,_=Y7(e)|0,e=t[_+4>>2]|0,t[d>>2]=t[_>>2],t[d+4>>2]=e,t[l>>2]=t[d>>2],t[l+4>>2]=t[d+4>>2],$7(n,l,r,o),h=s}function Y7(e){return e=e|0,(t[(C4()|0)+24>>2]|0)+(e*12|0)|0}function $7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;_=h,h=h+16|0,l=_+1|0,d=_,s=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(s=t[(t[e>>2]|0)+s>>2]|0),ts(l,r),l=ns(l,r)|0,K7(d,o),d=X7(d,o)|0,X1[s&15](e,l,d),h=_}function K7(e,n){e=e|0,n=n|0}function X7(e,n){return e=e|0,n=n|0,J7(n)|0}function J7(e){return e=e|0,(e|0)!=0|0}function Q7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=T4()|0,e=Z7(r)|0,ur(l,n,s,e,ek(r,o)|0,o)}function T4(){var e=0,n=0;if(c[7864]|0||(Gw(10208),Bt(51,10208,Q|0)|0,n=7864,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10208)|0)){e=10208,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Gw(10208)}return 10208}function Z7(e){return e=e|0,e|0}function ek(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=T4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(bw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(tk(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function bw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function tk(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=nk(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,rk(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,bw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,ik(e,s),ok(s),h=_;return}}function nk(e){return e=e|0,536870911}function rk(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function ik(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function ok(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Gw(e){e=e|0,lk(e)}function uk(e){e=e|0,sk(e+24|0)}function sk(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function lk(e){e=e|0;var n=0;n=An()|0,Nn(e,1,24,n,fk()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function fk(){return 1392}function ck(e,n){e=e|0,n=n|0,dk(t[(ak(e)|0)>>2]|0,n)}function ak(e){return e=e|0,(t[(T4()|0)+24>>2]|0)+(e<<3)|0}function dk(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,Lw(o,n),n=Rw(o,n)|0,Nl[e&127](n),h=r}function pk(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=x4()|0,e=hk(r)|0,ur(l,n,s,e,mk(r,o)|0,o)}function x4(){var e=0,n=0;if(c[7872]|0||(Yw(10244),Bt(52,10244,Q|0)|0,n=7872,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10244)|0)){e=10244,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Yw(10244)}return 10244}function hk(e){return e=e|0,e|0}function mk(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=x4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(Vw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(vk(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function Vw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function vk(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=gk(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,_k(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,Vw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,yk(e,s),wk(s),h=_;return}}function gk(e){return e=e|0,536870911}function _k(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function yk(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function wk(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Yw(e){e=e|0,Sk(e)}function Dk(e){e=e|0,Ek(e+24|0)}function Ek(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function Sk(e){e=e|0;var n=0;n=An()|0,Nn(e,1,16,n,Ck()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Ck(){return 1400}function Tk(e){return e=e|0,kk(t[(xk(e)|0)>>2]|0)|0}function xk(e){return e=e|0,(t[(x4()|0)+24>>2]|0)+(e<<3)|0}function kk(e){return e=e|0,Ak(ph[e&7]()|0)|0}function Ak(e){return e=e|0,e|0}function Ok(){var e=0;return c[7880]|0||(Nk(10280),Bt(25,10280,Q|0)|0,e=7880,t[e>>2]=1,t[e+4>>2]=0),10280}function Ik(e,n){e=e|0,n=n|0,t[e>>2]=Pk()|0,t[e+4>>2]=Mk()|0,t[e+12>>2]=n,t[e+8>>2]=Fk()|0,t[e+32>>2]=4}function Pk(){return 11711}function Mk(){return 1356}function Fk(){return eh()|0}function Lk(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(Rk(r),Ve(r)):n|0&&(Gi(n),Ve(n))}function Rk(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function Nk(e){e=e|0,Ys(e)}function Bk(e){e=e|0,jk(e,4920),Uk(e)|0,qk(e)|0}function jk(e,n){e=e|0,n=n|0;var r=0;r=Up()|0,t[e>>2]=r,sA(r,n),Cf(t[e>>2]|0)}function Uk(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,Jk()|0),e|0}function qk(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,zk()|0),e|0}function zk(){var e=0;return c[7888]|0||($w(10328),Bt(53,10328,Q|0)|0,e=7888,t[e>>2]=1,t[e+4>>2]=0),Dn(10328)|0||$w(10328),10328}function uc(e,n){e=e|0,n=n|0,ur(e,0,n,0,0,0)}function $w(e){e=e|0,bk(e),sc(e,10)}function Wk(e){e=e|0,Hk(e+24|0)}function Hk(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function bk(e){e=e|0;var n=0;n=An()|0,Nn(e,5,1,n,$k()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Gk(e,n,r){e=e|0,n=n|0,r=+r,Vk(e,n,r)}function sc(e,n){e=e|0,n=n|0,t[e+20>>2]=n}function Vk(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,l=o+8|0,_=o+13|0,s=o,d=o+12|0,ts(_,n),t[l>>2]=ns(_,n)|0,wu(d,r),L[s>>3]=+Du(d,r),Yk(e,l,s),h=o}function Yk(e,n,r){e=e|0,n=n|0,r=r|0,M(e+8|0,t[n>>2]|0,+L[r>>3]),c[e+24>>0]=1}function $k(){return 1404}function Kk(e,n){return e=e|0,n=+n,Xk(e,n)|0}function Xk(e,n){e=e|0,n=+n;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return o=h,h=h+16|0,l=o+4|0,d=o+8|0,_=o,s=Qo(8)|0,r=s,y=Tt(16)|0,ts(l,e),e=ns(l,e)|0,wu(d,n),M(y,e,+Du(d,n)),d=r+4|0,t[d>>2]=y,e=Tt(8)|0,d=t[d>>2]|0,t[_>>2]=0,t[l>>2]=t[_>>2],P1(e,d,l),t[s>>2]=e,h=o,r|0}function Jk(){var e=0;return c[7896]|0||(Kw(10364),Bt(54,10364,Q|0)|0,e=7896,t[e>>2]=1,t[e+4>>2]=0),Dn(10364)|0||Kw(10364),10364}function Kw(e){e=e|0,eA(e),sc(e,55)}function Qk(e){e=e|0,Zk(e+24|0)}function Zk(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function eA(e){e=e|0;var n=0;n=An()|0,Nn(e,5,4,n,iA()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function tA(e){e=e|0,nA(e)}function nA(e){e=e|0,rA(e)}function rA(e){e=e|0,Xw(e+8|0),c[e+24>>0]=1}function Xw(e){e=e|0,t[e>>2]=0,L[e+8>>3]=0}function iA(){return 1424}function oA(){return uA()|0}function uA(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0;return n=h,h=h+16|0,s=n+4|0,d=n,r=Qo(8)|0,e=r,o=Tt(16)|0,Xw(o),l=e+4|0,t[l>>2]=o,o=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],P1(o,l,s),t[r>>2]=o,h=n,e|0}function sA(e,n){e=e|0,n=n|0,t[e>>2]=lA()|0,t[e+4>>2]=fA()|0,t[e+12>>2]=n,t[e+8>>2]=cA()|0,t[e+32>>2]=5}function lA(){return 11710}function fA(){return 1416}function cA(){return th()|0}function aA(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(dA(r),Ve(r)):n|0&&Ve(n)}function dA(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function th(){var e=0;return c[7904]|0||(t[2600]=pA()|0,t[2601]=0,e=7904,t[e>>2]=1,t[e+4>>2]=0),10400}function pA(){return t[357]|0}function hA(e){e=e|0,mA(e,4926),vA(e)|0}function mA(e,n){e=e|0,n=n|0;var r=0;r=u1()|0,t[e>>2]=r,kA(r,n),Cf(t[e>>2]|0)}function vA(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,gA()|0),e|0}function gA(){var e=0;return c[7912]|0||(Jw(10412),Bt(56,10412,Q|0)|0,e=7912,t[e>>2]=1,t[e+4>>2]=0),Dn(10412)|0||Jw(10412),10412}function Jw(e){e=e|0,wA(e),sc(e,57)}function _A(e){e=e|0,yA(e+24|0)}function yA(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function wA(e){e=e|0;var n=0;n=An()|0,Nn(e,5,5,n,CA()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function DA(e){e=e|0,EA(e)}function EA(e){e=e|0,SA(e)}function SA(e){e=e|0;var n=0,r=0;n=e+8|0,r=n+48|0;do t[n>>2]=0,n=n+4|0;while((n|0)<(r|0));c[e+56>>0]=1}function CA(){return 1432}function TA(){return xA()|0}function xA(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0,_=0;d=h,h=h+16|0,e=d+4|0,n=d,r=Qo(8)|0,o=r,s=Tt(48)|0,l=s,_=l+48|0;do t[l>>2]=0,l=l+4|0;while((l|0)<(_|0));return l=o+4|0,t[l>>2]=s,_=Tt(8)|0,l=t[l>>2]|0,t[n>>2]=0,t[e>>2]=t[n>>2],Wd(_,l,e),t[r>>2]=_,h=d,o|0}function kA(e,n){e=e|0,n=n|0,t[e>>2]=AA()|0,t[e+4>>2]=OA()|0,t[e+12>>2]=n,t[e+8>>2]=IA()|0,t[e+32>>2]=6}function AA(){return 11704}function OA(){return 1436}function IA(){return th()|0}function PA(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(MA(r),Ve(r)):n|0&&Ve(n)}function MA(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function FA(e){e=e|0,LA(e,4933),RA(e)|0,NA(e)|0}function LA(e,n){e=e|0,n=n|0;var r=0;r=uO()|0,t[e>>2]=r,sO(r,n),Cf(t[e>>2]|0)}function RA(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,XA()|0),e|0}function NA(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,BA()|0),e|0}function BA(){var e=0;return c[7920]|0||(Qw(10452),Bt(58,10452,Q|0)|0,e=7920,t[e>>2]=1,t[e+4>>2]=0),Dn(10452)|0||Qw(10452),10452}function Qw(e){e=e|0,qA(e),sc(e,1)}function jA(e){e=e|0,UA(e+24|0)}function UA(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function qA(e){e=e|0;var n=0;n=An()|0,Nn(e,5,1,n,bA()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function zA(e,n,r){e=e|0,n=+n,r=+r,WA(e,n,r)}function WA(e,n,r){e=e|0,n=+n,r=+r;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+32|0,l=o+8|0,_=o+17|0,s=o,d=o+16|0,wu(_,n),L[l>>3]=+Du(_,n),wu(d,r),L[s>>3]=+Du(d,r),HA(e,l,s),h=o}function HA(e,n,r){e=e|0,n=n|0,r=r|0,Zw(e+8|0,+L[n>>3],+L[r>>3]),c[e+24>>0]=1}function Zw(e,n,r){e=e|0,n=+n,r=+r,L[e>>3]=n,L[e+8>>3]=r}function bA(){return 1472}function GA(e,n){return e=+e,n=+n,VA(e,n)|0}function VA(e,n){e=+e,n=+n;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return o=h,h=h+16|0,d=o+4|0,_=o+8|0,y=o,s=Qo(8)|0,r=s,l=Tt(16)|0,wu(d,e),e=+Du(d,e),wu(_,n),Zw(l,e,+Du(_,n)),_=r+4|0,t[_>>2]=l,l=Tt(8)|0,_=t[_>>2]|0,t[y>>2]=0,t[d>>2]=t[y>>2],e8(l,_,d),t[s>>2]=l,h=o,r|0}function e8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1452,t[r+12>>2]=n,t[e+4>>2]=r}function YA(e){e=e|0,da(e),Ve(e)}function $A(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function KA(e){e=e|0,Ve(e)}function XA(){var e=0;return c[7928]|0||(t8(10488),Bt(59,10488,Q|0)|0,e=7928,t[e>>2]=1,t[e+4>>2]=0),Dn(10488)|0||t8(10488),10488}function t8(e){e=e|0,ZA(e),sc(e,60)}function JA(e){e=e|0,QA(e+24|0)}function QA(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function ZA(e){e=e|0;var n=0;n=An()|0,Nn(e,5,6,n,rO()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function eO(e){e=e|0,tO(e)}function tO(e){e=e|0,nO(e)}function nO(e){e=e|0,n8(e+8|0),c[e+24>>0]=1}function n8(e){e=e|0,t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,t[e+12>>2]=0}function rO(){return 1492}function iO(){return oO()|0}function oO(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0;return n=h,h=h+16|0,s=n+4|0,d=n,r=Qo(8)|0,e=r,o=Tt(16)|0,n8(o),l=e+4|0,t[l>>2]=o,o=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],e8(o,l,s),t[r>>2]=o,h=n,e|0}function uO(){var e=0;return c[7936]|0||(pO(10524),Bt(25,10524,Q|0)|0,e=7936,t[e>>2]=1,t[e+4>>2]=0),10524}function sO(e,n){e=e|0,n=n|0,t[e>>2]=lO()|0,t[e+4>>2]=fO()|0,t[e+12>>2]=n,t[e+8>>2]=cO()|0,t[e+32>>2]=7}function lO(){return 11700}function fO(){return 1484}function cO(){return th()|0}function aO(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(dO(r),Ve(r)):n|0&&Ve(n)}function dO(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function pO(e){e=e|0,Ys(e)}function hO(e,n,r){e=e|0,n=n|0,r=r|0,e=Zn(n)|0,n=mO(r)|0,r=vO(r,0)|0,VO(e,n,r,k4()|0,0)}function mO(e){return e=e|0,e|0}function vO(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=k4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(i8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(SO(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function k4(){var e=0,n=0;if(c[7944]|0||(r8(10568),Bt(61,10568,Q|0)|0,n=7944,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10568)|0)){e=10568,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));r8(10568)}return 10568}function r8(e){e=e|0,yO(e)}function gO(e){e=e|0,_O(e+24|0)}function _O(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function yO(e){e=e|0;var n=0;n=An()|0,Nn(e,1,17,n,Dp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function wO(e){return e=e|0,EO(t[(DO(e)|0)>>2]|0)|0}function DO(e){return e=e|0,(t[(k4()|0)+24>>2]|0)+(e<<3)|0}function EO(e){return e=e|0,ea(ph[e&7]()|0)|0}function i8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function SO(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=CO(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,TO(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,i8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,xO(e,s),kO(s),h=_;return}}function CO(e){return e=e|0,536870911}function TO(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function xO(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function kO(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function AO(){OO()}function OO(){IO(10604)}function IO(e){e=e|0,PO(e,4955)}function PO(e,n){e=e|0,n=n|0;var r=0;r=MO()|0,t[e>>2]=r,FO(r,n),Cf(t[e>>2]|0)}function MO(){var e=0;return c[7952]|0||(WO(10612),Bt(25,10612,Q|0)|0,e=7952,t[e>>2]=1,t[e+4>>2]=0),10612}function FO(e,n){e=e|0,n=n|0,t[e>>2]=BO()|0,t[e+4>>2]=jO()|0,t[e+12>>2]=n,t[e+8>>2]=UO()|0,t[e+32>>2]=8}function Cf(e){e=e|0;var n=0,r=0;n=h,h=h+16|0,r=n,sa()|0,t[r>>2]=e,LO(10608,r),h=n}function sa(){return c[11714]|0||(t[2652]=0,Bt(62,10608,Q|0)|0,c[11714]=1),10608}function LO(e,n){e=e|0,n=n|0;var r=0;r=Tt(8)|0,t[r+4>>2]=t[n>>2],t[r>>2]=t[e>>2],t[e>>2]=r}function RO(e){e=e|0,NO(e)}function NO(e){e=e|0;var n=0,r=0;if(n=t[e>>2]|0,n|0)do r=n,n=t[n>>2]|0,Ve(r);while((n|0)!=0);t[e>>2]=0}function BO(){return 11715}function jO(){return 1496}function UO(){return eh()|0}function qO(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(zO(r),Ve(r)):n|0&&Ve(n)}function zO(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function WO(e){e=e|0,Ys(e)}function HO(e,n){e=e|0,n=n|0;var r=0,o=0;sa()|0,r=t[2652]|0;e:do if(r|0){for(;o=t[r+4>>2]|0,!(o|0?(U8(A4(o)|0,e)|0)==0:0);)if(r=t[r>>2]|0,!r)break e;bO(o,n)}while(0)}function A4(e){return e=e|0,t[e+12>>2]|0}function bO(e,n){e=e|0,n=n|0;var r=0;e=e+36|0,r=t[e>>2]|0,r|0&&(Ju(r),Ve(r)),r=Tt(4)|0,ba(r,n),t[e>>2]=r}function O4(){return c[11716]|0||(t[2664]=0,Bt(63,10656,Q|0)|0,c[11716]=1),10656}function o8(){var e=0;return c[11717]|0?e=t[2665]|0:(GO(),t[2665]=1504,c[11717]=1,e=1504),e|0}function GO(){c[11740]|0||(c[11718]=Lt(Lt(8,0)|0,0)|0,c[11719]=Lt(Lt(0,0)|0,0)|0,c[11720]=Lt(Lt(0,16)|0,0)|0,c[11721]=Lt(Lt(8,0)|0,0)|0,c[11722]=Lt(Lt(0,0)|0,0)|0,c[11723]=Lt(Lt(8,0)|0,0)|0,c[11724]=Lt(Lt(0,0)|0,0)|0,c[11725]=Lt(Lt(8,0)|0,0)|0,c[11726]=Lt(Lt(0,0)|0,0)|0,c[11727]=Lt(Lt(8,0)|0,0)|0,c[11728]=Lt(Lt(0,0)|0,0)|0,c[11729]=Lt(Lt(0,0)|0,32)|0,c[11730]=Lt(Lt(0,0)|0,32)|0,c[11740]=1)}function u8(){return 1572}function VO(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0,T=0;l=h,h=h+32|0,T=l+16|0,k=l+12|0,y=l+8|0,_=l+4|0,d=l,t[T>>2]=e,t[k>>2]=n,t[y>>2]=r,t[_>>2]=o,t[d>>2]=s,O4()|0,YO(10656,T,k,y,_,d),h=l}function YO(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0;d=Tt(24)|0,t1(d+4|0,t[n>>2]|0,t[r>>2]|0,t[o>>2]|0,t[s>>2]|0,t[l>>2]|0),t[d>>2]=t[e>>2],t[e>>2]=d}function s8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0;if(qe=h,h=h+32|0,le=qe+20|0,ie=qe+8|0,Pe=qe+4|0,ke=qe,n=t[n>>2]|0,n|0){we=le+4|0,y=le+8|0,k=ie+4|0,T=ie+8|0,P=ie+8|0,q=le+8|0;do{if(d=n+4|0,_=I4(d)|0,_|0){if(s=b1(_)|0,t[le>>2]=0,t[we>>2]=0,t[y>>2]=0,o=(G1(_)|0)+1|0,$O(le,o),o|0)for(;o=o+-1|0,os(ie,t[s>>2]|0),l=t[we>>2]|0,l>>>0<(t[q>>2]|0)>>>0?(t[l>>2]=t[ie>>2],t[we>>2]=(t[we>>2]|0)+4):P4(le,ie),o;)s=s+4|0;o=V1(_)|0,t[ie>>2]=0,t[k>>2]=0,t[T>>2]=0;e:do if(t[o>>2]|0)for(s=0,l=0;;){if((s|0)==(l|0)?KO(ie,o):(t[s>>2]=t[o>>2],t[k>>2]=(t[k>>2]|0)+4),o=o+4|0,!(t[o>>2]|0))break e;s=t[k>>2]|0,l=t[P>>2]|0}while(0);t[Pe>>2]=nh(d)|0,t[ke>>2]=Dn(_)|0,XO(r,e,Pe,ke,le,ie),M4(ie),Rl(le)}n=t[n>>2]|0}while((n|0)!=0)}h=qe}function I4(e){return e=e|0,t[e+12>>2]|0}function b1(e){return e=e|0,t[e+12>>2]|0}function G1(e){return e=e|0,t[e+16>>2]|0}function $O(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;s=h,h=h+32|0,r=s,o=t[e>>2]|0,(t[e+8>>2]|0)-o>>2>>>0>>0&&(m8(r,n,(t[e+4>>2]|0)-o>>2,e+8|0),v8(e,r),g8(r)),h=s}function P4(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0;if(d=h,h=h+32|0,r=d,o=e+4|0,s=((t[o>>2]|0)-(t[e>>2]|0)>>2)+1|0,l=h8(e)|0,l>>>0>>0)$n(e);else{_=t[e>>2]|0,k=(t[e+8>>2]|0)-_|0,y=k>>1,m8(r,k>>2>>>0>>1>>>0?y>>>0>>0?s:y:l,(t[o>>2]|0)-_>>2,e+8|0),l=r+8|0,t[t[l>>2]>>2]=t[n>>2],t[l>>2]=(t[l>>2]|0)+4,v8(e,r),g8(r),h=d;return}}function V1(e){return e=e|0,t[e+8>>2]|0}function KO(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0;if(d=h,h=h+32|0,r=d,o=e+4|0,s=((t[o>>2]|0)-(t[e>>2]|0)>>2)+1|0,l=p8(e)|0,l>>>0>>0)$n(e);else{_=t[e>>2]|0,k=(t[e+8>>2]|0)-_|0,y=k>>1,mI(r,k>>2>>>0>>1>>>0?y>>>0>>0?s:y:l,(t[o>>2]|0)-_>>2,e+8|0),l=r+8|0,t[t[l>>2]>>2]=t[n>>2],t[l>>2]=(t[l>>2]|0)+4,vI(e,r),gI(r),h=d;return}}function nh(e){return e=e|0,t[e>>2]|0}function XO(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,JO(e,n,r,o,s,l)}function M4(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-4-o|0)>>>2)<<2)),Ve(r))}function Rl(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-4-o|0)>>>2)<<2)),Ve(r))}function JO(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0;d=h,h=h+48|0,T=d+40|0,_=d+32|0,P=d+24|0,y=d+12|0,k=d,Zo(_),e=Oi(e)|0,t[P>>2]=t[n>>2],r=t[r>>2]|0,o=t[o>>2]|0,F4(y,s),QO(k,l),t[T>>2]=t[P>>2],ZO(e,T,r,o,y,k),M4(k),Rl(y),eu(_),h=d}function F4(e,n){e=e|0,n=n|0;var r=0,o=0;t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,r=n+4|0,o=(t[r>>2]|0)-(t[n>>2]|0)>>2,o|0&&(pI(e,o),hI(e,t[n>>2]|0,t[r>>2]|0,o))}function QO(e,n){e=e|0,n=n|0;var r=0,o=0;t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,r=n+4|0,o=(t[r>>2]|0)-(t[n>>2]|0)>>2,o|0&&(aI(e,o),dI(e,t[n>>2]|0,t[r>>2]|0,o))}function ZO(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0;d=h,h=h+32|0,T=d+28|0,P=d+24|0,_=d+12|0,y=d,k=ko(eI()|0)|0,t[P>>2]=t[n>>2],t[T>>2]=t[P>>2],n=lc(T)|0,r=l8(r)|0,o=L4(o)|0,t[_>>2]=t[s>>2],T=s+4|0,t[_+4>>2]=t[T>>2],P=s+8|0,t[_+8>>2]=t[P>>2],t[P>>2]=0,t[T>>2]=0,t[s>>2]=0,s=R4(_)|0,t[y>>2]=t[l>>2],T=l+4|0,t[y+4>>2]=t[T>>2],P=l+8|0,t[y+8>>2]=t[P>>2],t[P>>2]=0,t[T>>2]=0,t[l>>2]=0,qo(0,k|0,e|0,n|0,r|0,o|0,s|0,tI(y)|0)|0,M4(y),Rl(_),h=d}function eI(){var e=0;return c[7968]|0||(fI(10708),e=7968,t[e>>2]=1,t[e+4>>2]=0),10708}function lc(e){return e=e|0,c8(e)|0}function l8(e){return e=e|0,f8(e)|0}function L4(e){return e=e|0,ea(e)|0}function R4(e){return e=e|0,rI(e)|0}function tI(e){return e=e|0,nI(e)|0}function nI(e){e=e|0;var n=0,r=0,o=0;if(o=(t[e+4>>2]|0)-(t[e>>2]|0)|0,r=o>>2,o=Qo(o+4|0)|0,t[o>>2]=r,r|0){n=0;do t[o+4+(n<<2)>>2]=f8(t[(t[e>>2]|0)+(n<<2)>>2]|0)|0,n=n+1|0;while((n|0)!=(r|0))}return o|0}function f8(e){return e=e|0,e|0}function rI(e){e=e|0;var n=0,r=0,o=0;if(o=(t[e+4>>2]|0)-(t[e>>2]|0)|0,r=o>>2,o=Qo(o+4|0)|0,t[o>>2]=r,r|0){n=0;do t[o+4+(n<<2)>>2]=c8((t[e>>2]|0)+(n<<2)|0)|0,n=n+1|0;while((n|0)!=(r|0))}return o|0}function c8(e){e=e|0;var n=0,r=0,o=0,s=0;return s=h,h=h+32|0,n=s+12|0,r=s,o=U0(a8()|0)|0,o?(s1(n,o),l1(r,n),UF(e,r),e=f1(n)|0):e=iI(e)|0,h=s,e|0}function a8(){var e=0;return c[7960]|0||(lI(10664),Bt(25,10664,Q|0)|0,e=7960,t[e>>2]=1,t[e+4>>2]=0),10664}function iI(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0;return r=h,h=h+16|0,s=r+4|0,d=r,o=Qo(8)|0,n=o,_=Tt(4)|0,t[_>>2]=t[e>>2],l=n+4|0,t[l>>2]=_,e=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],d8(e,l,s),t[o>>2]=e,h=r,n|0}function d8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1656,t[r+12>>2]=n,t[e+4>>2]=r}function oI(e){e=e|0,da(e),Ve(e)}function uI(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function sI(e){e=e|0,Ve(e)}function lI(e){e=e|0,Ys(e)}function fI(e){e=e|0,Ao(e,cI()|0,5)}function cI(){return 1676}function aI(e,n){e=e|0,n=n|0;var r=0;if((p8(e)|0)>>>0>>0&&$n(e),n>>>0>1073741823)_n();else{r=Tt(n<<2)|0,t[e+4>>2]=r,t[e>>2]=r,t[e+8>>2]=r+(n<<2);return}}function dI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,o=e+4|0,e=r-n|0,(e|0)>0&&(vn(t[o>>2]|0,n|0,e|0)|0,t[o>>2]=(t[o>>2]|0)+(e>>>2<<2))}function p8(e){return e=e|0,1073741823}function pI(e,n){e=e|0,n=n|0;var r=0;if((h8(e)|0)>>>0>>0&&$n(e),n>>>0>1073741823)_n();else{r=Tt(n<<2)|0,t[e+4>>2]=r,t[e>>2]=r,t[e+8>>2]=r+(n<<2);return}}function hI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,o=e+4|0,e=r-n|0,(e|0)>0&&(vn(t[o>>2]|0,n|0,e|0)|0,t[o>>2]=(t[o>>2]|0)+(e>>>2<<2))}function h8(e){return e=e|0,1073741823}function mI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>1073741823)_n();else{s=Tt(n<<2)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<2)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<2)}function vI(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>2)<<2)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function gI(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-4-n|0)>>>2)<<2)),e=t[e>>2]|0,e|0&&Ve(e)}function m8(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>1073741823)_n();else{s=Tt(n<<2)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<2)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<2)}function v8(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>2)<<2)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function g8(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-4-n|0)>>>2)<<2)),e=t[e>>2]|0,e|0&&Ve(e)}function _I(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0;if(ie=h,h=h+32|0,T=ie+20|0,P=ie+12|0,k=ie+16|0,q=ie+4|0,we=ie,le=ie+8|0,_=o8()|0,l=t[_>>2]|0,d=t[l>>2]|0,d|0)for(y=t[_+8>>2]|0,_=t[_+4>>2]|0;os(T,d),yI(e,T,_,y),l=l+4|0,d=t[l>>2]|0,d;)y=y+1|0,_=_+1|0;if(l=u8()|0,d=t[l>>2]|0,d|0)do os(T,d),t[P>>2]=t[l+4>>2],wI(n,T,P),l=l+8|0,d=t[l>>2]|0;while((d|0)!=0);if(l=t[(sa()|0)>>2]|0,l|0)do n=t[l+4>>2]|0,os(T,t[(la(n)|0)>>2]|0),t[P>>2]=A4(n)|0,DI(r,T,P),l=t[l>>2]|0;while((l|0)!=0);if(os(k,0),l=O4()|0,t[T>>2]=t[k>>2],s8(T,l,s),l=t[(sa()|0)>>2]|0,l|0){e=T+4|0,n=T+8|0,r=T+8|0;do{if(y=t[l+4>>2]|0,os(P,t[(la(y)|0)>>2]|0),EI(q,_8(y)|0),d=t[q>>2]|0,d|0){t[T>>2]=0,t[e>>2]=0,t[n>>2]=0;do os(we,t[(la(t[d+4>>2]|0)|0)>>2]|0),_=t[e>>2]|0,_>>>0<(t[r>>2]|0)>>>0?(t[_>>2]=t[we>>2],t[e>>2]=(t[e>>2]|0)+4):P4(T,we),d=t[d>>2]|0;while((d|0)!=0);SI(o,P,T),Rl(T)}t[le>>2]=t[P>>2],k=y8(y)|0,t[T>>2]=t[le>>2],s8(T,k,s),bd(q),l=t[l>>2]|0}while((l|0)!=0)}h=ie}function yI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,RI(e,n,r,o)}function wI(e,n,r){e=e|0,n=n|0,r=r|0,LI(e,n,r)}function la(e){return e=e|0,e|0}function DI(e,n,r){e=e|0,n=n|0,r=r|0,II(e,n,r)}function _8(e){return e=e|0,e+16|0}function EI(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;if(l=h,h=h+16|0,s=l+8|0,r=l,t[e>>2]=0,o=t[n>>2]|0,t[s>>2]=o,t[r>>2]=e,r=OI(r)|0,o|0){if(o=Tt(12)|0,d=(w8(s)|0)+4|0,e=t[d+4>>2]|0,n=o+4|0,t[n>>2]=t[d>>2],t[n+4>>2]=e,n=t[t[s>>2]>>2]|0,t[s>>2]=n,!n)e=o;else for(n=o;e=Tt(12)|0,y=(w8(s)|0)+4|0,_=t[y+4>>2]|0,d=e+4|0,t[d>>2]=t[y>>2],t[d+4>>2]=_,t[n>>2]=e,d=t[t[s>>2]>>2]|0,t[s>>2]=d,d;)n=e;t[e>>2]=t[r>>2],t[r>>2]=o}h=l}function SI(e,n,r){e=e|0,n=n|0,r=r|0,CI(e,n,r)}function y8(e){return e=e|0,e+24|0}function CI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+32|0,d=o+24|0,s=o+16|0,_=o+12|0,l=o,Zo(s),e=Oi(e)|0,t[_>>2]=t[n>>2],F4(l,r),t[d>>2]=t[_>>2],TI(e,d,l),Rl(l),eu(s),h=o}function TI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+32|0,d=o+16|0,_=o+12|0,s=o,l=ko(xI()|0)|0,t[_>>2]=t[n>>2],t[d>>2]=t[_>>2],n=lc(d)|0,t[s>>2]=t[r>>2],d=r+4|0,t[s+4>>2]=t[d>>2],_=r+8|0,t[s+8>>2]=t[_>>2],t[_>>2]=0,t[d>>2]=0,t[r>>2]=0,Ts(0,l|0,e|0,n|0,R4(s)|0)|0,Rl(s),h=o}function xI(){var e=0;return c[7976]|0||(kI(10720),e=7976,t[e>>2]=1,t[e+4>>2]=0),10720}function kI(e){e=e|0,Ao(e,AI()|0,2)}function AI(){return 1732}function OI(e){return e=e|0,t[e>>2]|0}function w8(e){return e=e|0,t[e>>2]|0}function II(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+32|0,l=o+16|0,s=o+8|0,d=o,Zo(s),e=Oi(e)|0,t[d>>2]=t[n>>2],r=t[r>>2]|0,t[l>>2]=t[d>>2],D8(e,l,r),eu(s),h=o}function D8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,l=o+4|0,d=o,s=ko(PI()|0)|0,t[d>>2]=t[n>>2],t[l>>2]=t[d>>2],n=lc(l)|0,Ts(0,s|0,e|0,n|0,l8(r)|0)|0,h=o}function PI(){var e=0;return c[7984]|0||(MI(10732),e=7984,t[e>>2]=1,t[e+4>>2]=0),10732}function MI(e){e=e|0,Ao(e,FI()|0,2)}function FI(){return 1744}function LI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+32|0,l=o+16|0,s=o+8|0,d=o,Zo(s),e=Oi(e)|0,t[d>>2]=t[n>>2],r=t[r>>2]|0,t[l>>2]=t[d>>2],D8(e,l,r),eu(s),h=o}function RI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+32|0,d=s+16|0,l=s+8|0,_=s,Zo(l),e=Oi(e)|0,t[_>>2]=t[n>>2],r=c[r>>0]|0,o=c[o>>0]|0,t[d>>2]=t[_>>2],NI(e,d,r,o),eu(l),h=s}function NI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,d=s+4|0,_=s,l=ko(BI()|0)|0,t[_>>2]=t[n>>2],t[d>>2]=t[_>>2],n=lc(d)|0,r=fa(r)|0,Bu(0,l|0,e|0,n|0,r|0,fa(o)|0)|0,h=s}function BI(){var e=0;return c[7992]|0||(UI(10744),e=7992,t[e>>2]=1,t[e+4>>2]=0),10744}function fa(e){return e=e|0,jI(e)|0}function jI(e){return e=e|0,e&255|0}function UI(e){e=e|0,Ao(e,qI()|0,3)}function qI(){return 1756}function zI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;switch(q=h,h=h+32|0,_=q+8|0,y=q+4|0,k=q+20|0,T=q,_1(e,0),o=jF(n)|0,t[_>>2]=0,P=_+4|0,t[P>>2]=0,t[_+8>>2]=0,o<<24>>24){case 0:{c[k>>0]=0,WI(y,r,k),rh(e,y)|0,ei(y);break}case 8:{P=z4(n)|0,c[k>>0]=8,os(T,t[P+4>>2]|0),HI(y,r,k,T,P+8|0),rh(e,y)|0,ei(y);break}case 9:{if(l=z4(n)|0,n=t[l+4>>2]|0,n|0)for(d=_+8|0,s=l+12|0;n=n+-1|0,os(y,t[s>>2]|0),o=t[P>>2]|0,o>>>0<(t[d>>2]|0)>>>0?(t[o>>2]=t[y>>2],t[P>>2]=(t[P>>2]|0)+4):P4(_,y),n;)s=s+4|0;c[k>>0]=9,os(T,t[l+8>>2]|0),bI(y,r,k,T,_),rh(e,y)|0,ei(y);break}default:P=z4(n)|0,c[k>>0]=o,os(T,t[P+4>>2]|0),GI(y,r,k,T),rh(e,y)|0,ei(y)}Rl(_),h=q}function WI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;o=h,h=h+16|0,s=o,Zo(s),n=Oi(n)|0,iP(e,n,c[r>>0]|0),eu(s),h=o}function rh(e,n){e=e|0,n=n|0;var r=0;return r=t[e>>2]|0,r|0&&ju(r|0),t[e>>2]=t[n>>2],t[n>>2]=0,e|0}function HI(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0;l=h,h=h+32|0,_=l+16|0,d=l+8|0,y=l,Zo(d),n=Oi(n)|0,r=c[r>>0]|0,t[y>>2]=t[o>>2],s=t[s>>2]|0,t[_>>2]=t[y>>2],eP(e,n,r,_,s),eu(d),h=l}function bI(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0;l=h,h=h+32|0,y=l+24|0,d=l+16|0,k=l+12|0,_=l,Zo(d),n=Oi(n)|0,r=c[r>>0]|0,t[k>>2]=t[o>>2],F4(_,s),t[y>>2]=t[k>>2],XI(e,n,r,y,_),Rl(_),eu(d),h=l}function GI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+32|0,d=s+16|0,l=s+8|0,_=s,Zo(l),n=Oi(n)|0,r=c[r>>0]|0,t[_>>2]=t[o>>2],t[d>>2]=t[_>>2],VI(e,n,r,d),eu(l),h=s}function VI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,l=s+4|0,_=s,d=ko(YI()|0)|0,r=fa(r)|0,t[_>>2]=t[o>>2],t[l>>2]=t[_>>2],ih(e,Ts(0,d|0,n|0,r|0,lc(l)|0)|0),h=s}function YI(){var e=0;return c[8e3]|0||($I(10756),e=8e3,t[e>>2]=1,t[e+4>>2]=0),10756}function ih(e,n){e=e|0,n=n|0,_1(e,n)}function $I(e){e=e|0,Ao(e,KI()|0,2)}function KI(){return 1772}function XI(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0;l=h,h=h+32|0,y=l+16|0,k=l+12|0,d=l,_=ko(JI()|0)|0,r=fa(r)|0,t[k>>2]=t[o>>2],t[y>>2]=t[k>>2],o=lc(y)|0,t[d>>2]=t[s>>2],y=s+4|0,t[d+4>>2]=t[y>>2],k=s+8|0,t[d+8>>2]=t[k>>2],t[k>>2]=0,t[y>>2]=0,t[s>>2]=0,ih(e,Bu(0,_|0,n|0,r|0,o|0,R4(d)|0)|0),Rl(d),h=l}function JI(){var e=0;return c[8008]|0||(QI(10768),e=8008,t[e>>2]=1,t[e+4>>2]=0),10768}function QI(e){e=e|0,Ao(e,ZI()|0,3)}function ZI(){return 1784}function eP(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0;l=h,h=h+16|0,_=l+4|0,y=l,d=ko(tP()|0)|0,r=fa(r)|0,t[y>>2]=t[o>>2],t[_>>2]=t[y>>2],o=lc(_)|0,ih(e,Bu(0,d|0,n|0,r|0,o|0,L4(s)|0)|0),h=l}function tP(){var e=0;return c[8016]|0||(nP(10780),e=8016,t[e>>2]=1,t[e+4>>2]=0),10780}function nP(e){e=e|0,Ao(e,rP()|0,3)}function rP(){return 1800}function iP(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=ko(oP()|0)|0,ih(e,sf(0,o|0,n|0,fa(r)|0)|0)}function oP(){var e=0;return c[8024]|0||(uP(10792),e=8024,t[e>>2]=1,t[e+4>>2]=0),10792}function uP(e){e=e|0,Ao(e,sP()|0,1)}function sP(){return 1816}function lP(){fP(),cP(),aP()}function fP(){t[2702]=K8(65536)|0}function cP(){PP(10856)}function aP(){dP(10816)}function dP(e){e=e|0,pP(e,5044),hP(e)|0}function pP(e,n){e=e|0,n=n|0;var r=0;r=a8()|0,t[e>>2]=r,TP(r,n),Cf(t[e>>2]|0)}function hP(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,mP()|0),e|0}function mP(){var e=0;return c[8032]|0||(E8(10820),Bt(64,10820,Q|0)|0,e=8032,t[e>>2]=1,t[e+4>>2]=0),Dn(10820)|0||E8(10820),10820}function E8(e){e=e|0,_P(e),sc(e,25)}function vP(e){e=e|0,gP(e+24|0)}function gP(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function _P(e){e=e|0;var n=0;n=An()|0,Nn(e,5,18,n,EP()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function yP(e,n){e=e|0,n=n|0,wP(e,n)}function wP(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;r=h,h=h+16|0,o=r,s=r+4|0,Ml(s,n),t[o>>2]=Fl(s,n)|0,DP(e,o),h=r}function DP(e,n){e=e|0,n=n|0,S8(e+4|0,t[n>>2]|0),c[e+8>>0]=1}function S8(e,n){e=e|0,n=n|0,t[e>>2]=n}function EP(){return 1824}function SP(e){return e=e|0,CP(e)|0}function CP(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0;return r=h,h=h+16|0,s=r+4|0,d=r,o=Qo(8)|0,n=o,_=Tt(4)|0,Ml(s,e),S8(_,Fl(s,e)|0),l=n+4|0,t[l>>2]=_,e=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],d8(e,l,s),t[o>>2]=e,h=r,n|0}function Qo(e){e=e|0;var n=0,r=0;return e=e+7&-8,(e>>>0<=32768?(n=t[2701]|0,e>>>0<=(65536-n|0)>>>0):0)?(r=(t[2702]|0)+n|0,t[2701]=n+e,e=r):(e=K8(e+8|0)|0,t[e>>2]=t[2703],t[2703]=e,e=e+8|0),e|0}function TP(e,n){e=e|0,n=n|0,t[e>>2]=xP()|0,t[e+4>>2]=kP()|0,t[e+12>>2]=n,t[e+8>>2]=AP()|0,t[e+32>>2]=9}function xP(){return 11744}function kP(){return 1832}function AP(){return th()|0}function OP(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(IP(r),Ve(r)):n|0&&Ve(n)}function IP(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function PP(e){e=e|0,MP(e,5052),FP(e)|0,LP(e,5058,26)|0,RP(e,5069,1)|0,NP(e,5077,10)|0,BP(e,5087,19)|0,jP(e,5094,27)|0}function MP(e,n){e=e|0,n=n|0;var r=0;r=IF()|0,t[e>>2]=r,PF(r,n),Cf(t[e>>2]|0)}function FP(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,vF()|0),e|0}function LP(e,n,r){return e=e|0,n=n|0,r=r|0,QM(e,Zn(n)|0,r,0),e|0}function RP(e,n,r){return e=e|0,n=n|0,r=r|0,BM(e,Zn(n)|0,r,0),e|0}function NP(e,n,r){return e=e|0,n=n|0,r=r|0,mM(e,Zn(n)|0,r,0),e|0}function BP(e,n,r){return e=e|0,n=n|0,r=r|0,eM(e,Zn(n)|0,r,0),e|0}function C8(e,n){e=e|0,n=n|0;var r=0,o=0;e:for(;;){for(r=t[2703]|0;;){if((r|0)==(n|0))break e;if(o=t[r>>2]|0,t[2703]=o,!r)r=o;else break}Ve(r)}t[2701]=e}function jP(e,n,r){return e=e|0,n=n|0,r=r|0,UP(e,Zn(n)|0,r,0),e|0}function UP(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=N4()|0,e=qP(r)|0,ur(l,n,s,e,zP(r,o)|0,o)}function N4(){var e=0,n=0;if(c[8040]|0||(x8(10860),Bt(65,10860,Q|0)|0,n=8040,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10860)|0)){e=10860,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));x8(10860)}return 10860}function qP(e){return e=e|0,e|0}function zP(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=N4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(T8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(WP(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function T8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function WP(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=HP(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,bP(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,T8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,GP(e,s),VP(s),h=_;return}}function HP(e){return e=e|0,536870911}function bP(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function GP(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function VP(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function x8(e){e=e|0,KP(e)}function YP(e){e=e|0,$P(e+24|0)}function $P(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function KP(e){e=e|0;var n=0;n=An()|0,Nn(e,1,11,n,XP()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function XP(){return 1840}function JP(e,n,r){e=e|0,n=n|0,r=r|0,ZP(t[(QP(e)|0)>>2]|0,n,r)}function QP(e){return e=e|0,(t[(N4()|0)+24>>2]|0)+(e<<3)|0}function ZP(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;o=h,h=h+16|0,l=o+1|0,s=o,Ml(l,n),n=Fl(l,n)|0,Ml(s,r),r=Fl(s,r)|0,Bl[e&31](n,r),h=o}function eM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=B4()|0,e=tM(r)|0,ur(l,n,s,e,nM(r,o)|0,o)}function B4(){var e=0,n=0;if(c[8048]|0||(A8(10896),Bt(66,10896,Q|0)|0,n=8048,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10896)|0)){e=10896,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));A8(10896)}return 10896}function tM(e){return e=e|0,e|0}function nM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=B4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(k8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(rM(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function k8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function rM(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=iM(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,oM(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,k8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,uM(e,s),sM(s),h=_;return}}function iM(e){return e=e|0,536870911}function oM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function uM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function sM(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function A8(e){e=e|0,cM(e)}function lM(e){e=e|0,fM(e+24|0)}function fM(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function cM(e){e=e|0;var n=0;n=An()|0,Nn(e,1,11,n,aM()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function aM(){return 1852}function dM(e,n){return e=e|0,n=n|0,hM(t[(pM(e)|0)>>2]|0,n)|0}function pM(e){return e=e|0,(t[(B4()|0)+24>>2]|0)+(e<<3)|0}function hM(e,n){e=e|0,n=n|0;var r=0,o=0;return r=h,h=h+16|0,o=r,Ml(o,n),n=Fl(o,n)|0,n=ea(dc[e&31](n)|0)|0,h=r,n|0}function mM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=j4()|0,e=vM(r)|0,ur(l,n,s,e,gM(r,o)|0,o)}function j4(){var e=0,n=0;if(c[8056]|0||(I8(10932),Bt(67,10932,Q|0)|0,n=8056,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10932)|0)){e=10932,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));I8(10932)}return 10932}function vM(e){return e=e|0,e|0}function gM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=j4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(O8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(_M(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function O8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function _M(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=yM(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,wM(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,O8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,DM(e,s),EM(s),h=_;return}}function yM(e){return e=e|0,536870911}function wM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function DM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function EM(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function I8(e){e=e|0,TM(e)}function SM(e){e=e|0,CM(e+24|0)}function CM(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function TM(e){e=e|0;var n=0;n=An()|0,Nn(e,1,7,n,xM()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function xM(){return 1860}function kM(e,n,r){return e=e|0,n=n|0,r=r|0,OM(t[(AM(e)|0)>>2]|0,n,r)|0}function AM(e){return e=e|0,(t[(j4()|0)+24>>2]|0)+(e<<3)|0}function OM(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0;return o=h,h=h+32|0,d=o+12|0,l=o+8|0,_=o,y=o+16|0,s=o+4|0,IM(y,n),PM(_,y,n),$s(s,r),r=Ks(s,r)|0,t[d>>2]=t[_>>2],X1[e&15](l,d,r),r=MM(l)|0,ei(l),Xs(s),h=o,r|0}function IM(e,n){e=e|0,n=n|0}function PM(e,n,r){e=e|0,n=n|0,r=r|0,FM(e,r)}function MM(e){return e=e|0,Oi(e)|0}function FM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;s=h,h=h+16|0,r=s,o=n,o&1?(LM(r,0),c0(o|0,r|0)|0,RM(e,r),NM(r)):t[e>>2]=t[n>>2],h=s}function LM(e,n){e=e|0,n=n|0,wd(e,n),t[e+4>>2]=0,c[e+8>>0]=0}function RM(e,n){e=e|0,n=n|0,t[e>>2]=t[n+4>>2]}function NM(e){e=e|0,c[e+8>>0]=0}function BM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=U4()|0,e=jM(r)|0,ur(l,n,s,e,UM(r,o)|0,o)}function U4(){var e=0,n=0;if(c[8064]|0||(M8(10968),Bt(68,10968,Q|0)|0,n=8064,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10968)|0)){e=10968,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));M8(10968)}return 10968}function jM(e){return e=e|0,e|0}function UM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=U4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(P8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(qM(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function P8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function qM(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=zM(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,WM(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,P8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,HM(e,s),bM(s),h=_;return}}function zM(e){return e=e|0,536870911}function WM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function HM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function bM(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function M8(e){e=e|0,YM(e)}function GM(e){e=e|0,VM(e+24|0)}function VM(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function YM(e){e=e|0;var n=0;n=An()|0,Nn(e,1,1,n,$M()|0,5),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function $M(){return 1872}function KM(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,JM(t[(XM(e)|0)>>2]|0,n,r,o,s,l)}function XM(e){return e=e|0,(t[(U4()|0)+24>>2]|0)+(e<<3)|0}function JM(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0;d=h,h=h+32|0,_=d+16|0,y=d+12|0,k=d+8|0,T=d+4|0,P=d,$s(_,n),n=Ks(_,n)|0,$s(y,r),r=Ks(y,r)|0,$s(k,o),o=Ks(k,o)|0,$s(T,s),s=Ks(T,s)|0,$s(P,l),l=Ks(P,l)|0,eD[e&1](n,r,o,s,l),Xs(P),Xs(T),Xs(k),Xs(y),Xs(_),h=d}function QM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=q4()|0,e=ZM(r)|0,ur(l,n,s,e,eF(r,o)|0,o)}function q4(){var e=0,n=0;if(c[8072]|0||(L8(11004),Bt(69,11004,Q|0)|0,n=8072,t[n>>2]=1,t[n+4>>2]=0),!(Dn(11004)|0)){e=11004,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));L8(11004)}return 11004}function ZM(e){return e=e|0,e|0}function eF(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=q4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(F8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(tF(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function F8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function tF(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=nF(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,rF(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,F8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,iF(e,s),oF(s),h=_;return}}function nF(e){return e=e|0,536870911}function rF(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function iF(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function oF(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function L8(e){e=e|0,lF(e)}function uF(e){e=e|0,sF(e+24|0)}function sF(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function lF(e){e=e|0;var n=0;n=An()|0,Nn(e,1,12,n,fF()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function fF(){return 1896}function cF(e,n,r){e=e|0,n=n|0,r=r|0,dF(t[(aF(e)|0)>>2]|0,n,r)}function aF(e){return e=e|0,(t[(q4()|0)+24>>2]|0)+(e<<3)|0}function dF(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;o=h,h=h+16|0,l=o+4|0,s=o,pF(l,n),n=hF(l,n)|0,$s(s,r),r=Ks(s,r)|0,Bl[e&31](n,r),Xs(s),h=o}function pF(e,n){e=e|0,n=n|0}function hF(e,n){return e=e|0,n=n|0,mF(n)|0}function mF(e){return e=e|0,e|0}function vF(){var e=0;return c[8080]|0||(R8(11040),Bt(70,11040,Q|0)|0,e=8080,t[e>>2]=1,t[e+4>>2]=0),Dn(11040)|0||R8(11040),11040}function R8(e){e=e|0,yF(e),sc(e,71)}function gF(e){e=e|0,_F(e+24|0)}function _F(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function yF(e){e=e|0;var n=0;n=An()|0,Nn(e,5,7,n,SF()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function wF(e){e=e|0,DF(e)}function DF(e){e=e|0,EF(e)}function EF(e){e=e|0,c[e+8>>0]=1}function SF(){return 1936}function CF(){return TF()|0}function TF(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0;return n=h,h=h+16|0,s=n+4|0,d=n,r=Qo(8)|0,e=r,l=e+4|0,t[l>>2]=Tt(1)|0,o=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],xF(o,l,s),t[r>>2]=o,h=n,e|0}function xF(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1916,t[r+12>>2]=n,t[e+4>>2]=r}function kF(e){e=e|0,da(e),Ve(e)}function AF(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function OF(e){e=e|0,Ve(e)}function IF(){var e=0;return c[8088]|0||(BF(11076),Bt(25,11076,Q|0)|0,e=8088,t[e>>2]=1,t[e+4>>2]=0),11076}function PF(e,n){e=e|0,n=n|0,t[e>>2]=MF()|0,t[e+4>>2]=FF()|0,t[e+12>>2]=n,t[e+8>>2]=LF()|0,t[e+32>>2]=10}function MF(){return 11745}function FF(){return 1940}function LF(){return eh()|0}function RF(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(NF(r),Ve(r)):n|0&&Ve(n)}function NF(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function BF(e){e=e|0,Ys(e)}function os(e,n){e=e|0,n=n|0,t[e>>2]=n}function z4(e){return e=e|0,t[e>>2]|0}function jF(e){return e=e|0,c[t[e>>2]>>0]|0}function UF(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,t[o>>2]=t[e>>2],qF(n,o)|0,h=r}function qF(e,n){e=e|0,n=n|0;var r=0;return r=zF(t[e>>2]|0,n)|0,n=e+4|0,t[(t[n>>2]|0)+8>>2]=r,t[(t[n>>2]|0)+8>>2]|0}function zF(e,n){e=e|0,n=n|0;var r=0,o=0;return r=h,h=h+16|0,o=r,Zo(o),e=Oi(e)|0,n=WF(e,t[n>>2]|0)|0,eu(o),h=r,n|0}function Zo(e){e=e|0,t[e>>2]=t[2701],t[e+4>>2]=t[2703]}function WF(e,n){e=e|0,n=n|0;var r=0;return r=ko(HF()|0)|0,sf(0,r|0,e|0,L4(n)|0)|0}function eu(e){e=e|0,C8(t[e>>2]|0,t[e+4>>2]|0)}function HF(){var e=0;return c[8096]|0||(bF(11120),e=8096,t[e>>2]=1,t[e+4>>2]=0),11120}function bF(e){e=e|0,Ao(e,GF()|0,1)}function GF(){return 1948}function VF(){YF()}function YF(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0;if(le=h,h=h+16|0,T=le+4|0,P=le,si(65536,10804,t[2702]|0,10812),r=o8()|0,n=t[r>>2]|0,e=t[n>>2]|0,e|0)for(o=t[r+8>>2]|0,r=t[r+4>>2]|0;As(e|0,C[r>>0]|0|0,c[o>>0]|0),n=n+4|0,e=t[n>>2]|0,e;)o=o+1|0,r=r+1|0;if(e=u8()|0,n=t[e>>2]|0,n|0)do uu(n|0,t[e+4>>2]|0),e=e+8|0,n=t[e>>2]|0;while((n|0)!=0);uu($F()|0,5167),k=sa()|0,e=t[k>>2]|0;e:do if(e|0){do KF(t[e+4>>2]|0),e=t[e>>2]|0;while((e|0)!=0);if(e=t[k>>2]|0,e|0){y=k;do{for(;s=e,e=t[e>>2]|0,s=t[s+4>>2]|0,!!(XF(s)|0);)if(t[P>>2]=y,t[T>>2]=t[P>>2],JF(k,T)|0,!e)break e;if(QF(s),y=t[y>>2]|0,n=N8(s)|0,l=Wo()|0,d=h,h=h+((1*(n<<2)|0)+15&-16)|0,_=h,h=h+((1*(n<<2)|0)+15&-16)|0,n=t[(_8(s)|0)>>2]|0,n|0)for(r=d,o=_;t[r>>2]=t[(la(t[n+4>>2]|0)|0)>>2],t[o>>2]=t[n+8>>2],n=t[n>>2]|0,n;)r=r+4|0,o=o+4|0;ie=la(s)|0,n=ZF(s)|0,r=N8(s)|0,o=eL(s)|0,Is(ie|0,n|0,d|0,_|0,r|0,o|0,A4(s)|0),b0(l|0)}while((e|0)!=0)}}while(0);if(e=t[(O4()|0)>>2]|0,e|0)do ie=e+4|0,k=I4(ie)|0,s=V1(k)|0,l=b1(k)|0,d=(G1(k)|0)+1|0,_=oh(k)|0,y=B8(ie)|0,k=Dn(k)|0,T=nh(ie)|0,P=W4(ie)|0,zo(0,s|0,l|0,d|0,_|0,y|0,k|0,T|0,P|0,H4(ie)|0),e=t[e>>2]|0;while((e|0)!=0);e=t[(sa()|0)>>2]|0;e:do if(e|0){t:for(;;){if(n=t[e+4>>2]|0,n|0?(q=t[(la(n)|0)>>2]|0,we=t[(y8(n)|0)>>2]|0,we|0):0){r=we;do{n=r+4|0,o=I4(n)|0;n:do if(o|0)switch(Dn(o)|0){case 0:break t;case 4:case 3:case 2:{_=V1(o)|0,y=b1(o)|0,k=(G1(o)|0)+1|0,T=oh(o)|0,P=Dn(o)|0,ie=nh(n)|0,zo(q|0,_|0,y|0,k|0,T|0,0,P|0,ie|0,W4(n)|0,H4(n)|0);break n}case 1:{d=V1(o)|0,_=b1(o)|0,y=(G1(o)|0)+1|0,k=oh(o)|0,T=B8(n)|0,P=Dn(o)|0,ie=nh(n)|0,zo(q|0,d|0,_|0,y|0,k|0,T|0,P|0,ie|0,W4(n)|0,H4(n)|0);break n}case 5:{k=V1(o)|0,T=b1(o)|0,P=(G1(o)|0)+1|0,ie=oh(o)|0,zo(q|0,k|0,T|0,P|0,ie|0,tL(o)|0,Dn(o)|0,0,0,0);break n}default:break n}while(0);r=t[r>>2]|0}while((r|0)!=0)}if(e=t[e>>2]|0,!e)break e}_n()}while(0);uf(),h=le}function $F(){return 11703}function KF(e){e=e|0,c[e+40>>0]=0}function XF(e){return e=e|0,(c[e+40>>0]|0)!=0|0}function JF(e,n){return e=e|0,n=n|0,n=nL(n)|0,e=t[n>>2]|0,t[n>>2]=t[e>>2],Ve(e),t[n>>2]|0}function QF(e){e=e|0,c[e+40>>0]=1}function N8(e){return e=e|0,t[e+20>>2]|0}function ZF(e){return e=e|0,t[e+8>>2]|0}function eL(e){return e=e|0,t[e+32>>2]|0}function oh(e){return e=e|0,t[e+4>>2]|0}function B8(e){return e=e|0,t[e+4>>2]|0}function W4(e){return e=e|0,t[e+8>>2]|0}function H4(e){return e=e|0,t[e+16>>2]|0}function tL(e){return e=e|0,t[e+20>>2]|0}function nL(e){return e=e|0,t[e>>2]|0}function uh(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0,pe=0,_e=0,vt=0;vt=h,h=h+16|0,q=vt;do if(e>>>0<245){if(k=e>>>0<11?16:e+11&-8,e=k>>>3,P=t[2783]|0,r=P>>>e,r&3|0)return n=(r&1^1)+e|0,e=11172+(n<<1<<2)|0,r=e+8|0,o=t[r>>2]|0,s=o+8|0,l=t[s>>2]|0,(e|0)==(l|0)?t[2783]=P&~(1<>2]=e,t[r>>2]=l),_e=n<<3,t[o+4>>2]=_e|3,_e=o+_e+4|0,t[_e>>2]=t[_e>>2]|1,_e=s,h=vt,_e|0;if(T=t[2785]|0,k>>>0>T>>>0){if(r|0)return n=2<>>12&16,n=n>>>d,r=n>>>5&8,n=n>>>r,s=n>>>2&4,n=n>>>s,e=n>>>1&2,n=n>>>e,o=n>>>1&1,o=(r|d|s|e|o)+(n>>>o)|0,n=11172+(o<<1<<2)|0,e=n+8|0,s=t[e>>2]|0,d=s+8|0,r=t[d>>2]|0,(n|0)==(r|0)?(e=P&~(1<>2]=n,t[e>>2]=r,e=P),l=(o<<3)-k|0,t[s+4>>2]=k|3,o=s+k|0,t[o+4>>2]=l|1,t[o+l>>2]=l,T|0&&(s=t[2788]|0,n=T>>>3,r=11172+(n<<1<<2)|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=s,t[n+12>>2]=s,t[s+8>>2]=n,t[s+12>>2]=r),t[2785]=l,t[2788]=o,_e=d,h=vt,_e|0;if(_=t[2784]|0,_){if(r=(_&0-_)+-1|0,d=r>>>12&16,r=r>>>d,l=r>>>5&8,r=r>>>l,y=r>>>2&4,r=r>>>y,o=r>>>1&2,r=r>>>o,e=r>>>1&1,e=t[11436+((l|d|y|o|e)+(r>>>e)<<2)>>2]|0,r=(t[e+4>>2]&-8)-k|0,o=t[e+16+(((t[e+16>>2]|0)==0&1)<<2)>>2]|0,!o)y=e,l=r;else{do d=(t[o+4>>2]&-8)-k|0,y=d>>>0>>0,r=y?d:r,e=y?o:e,o=t[o+16+(((t[o+16>>2]|0)==0&1)<<2)>>2]|0;while((o|0)!=0);y=e,l=r}if(d=y+k|0,y>>>0>>0){s=t[y+24>>2]|0,n=t[y+12>>2]|0;do if((n|0)==(y|0)){if(e=y+20|0,n=t[e>>2]|0,!n&&(e=y+16|0,n=t[e>>2]|0,!n)){r=0;break}for(;;){if(r=n+20|0,o=t[r>>2]|0,o|0){n=o,e=r;continue}if(r=n+16|0,o=t[r>>2]|0,o)n=o,e=r;else break}t[e>>2]=0,r=n}else r=t[y+8>>2]|0,t[r+12>>2]=n,t[n+8>>2]=r,r=n;while(0);do if(s|0){if(n=t[y+28>>2]|0,e=11436+(n<<2)|0,(y|0)==(t[e>>2]|0)){if(t[e>>2]=r,!r){t[2784]=_&~(1<>2]|0)!=(y|0)&1)<<2)>>2]=r,!r)break;t[r+24>>2]=s,n=t[y+16>>2]|0,n|0&&(t[r+16>>2]=n,t[n+24>>2]=r),n=t[y+20>>2]|0,n|0&&(t[r+20>>2]=n,t[n+24>>2]=r)}while(0);return l>>>0<16?(_e=l+k|0,t[y+4>>2]=_e|3,_e=y+_e+4|0,t[_e>>2]=t[_e>>2]|1):(t[y+4>>2]=k|3,t[d+4>>2]=l|1,t[d+l>>2]=l,T|0&&(o=t[2788]|0,n=T>>>3,r=11172+(n<<1<<2)|0,n=1<>2]|0):(t[2783]=P|n,n=r,e=r+8|0),t[e>>2]=o,t[n+12>>2]=o,t[o+8>>2]=n,t[o+12>>2]=r),t[2785]=l,t[2788]=d),_e=y+8|0,h=vt,_e|0}else P=k}else P=k}else P=k}else if(e>>>0<=4294967231)if(e=e+11|0,k=e&-8,y=t[2784]|0,y){o=0-k|0,e=e>>>8,e?k>>>0>16777215?_=31:(P=(e+1048320|0)>>>16&8,pe=e<>>16&4,pe=pe<>>16&2,_=14-(T|P|_)+(pe<<_>>>15)|0,_=k>>>(_+7|0)&1|_<<1):_=0,r=t[11436+(_<<2)>>2]|0;e:do if(!r)r=0,e=0,pe=57;else for(e=0,d=k<<((_|0)==31?0:25-(_>>>1)|0),l=0;;){if(s=(t[r+4>>2]&-8)-k|0,s>>>0>>0)if(s)e=r,o=s;else{e=r,o=0,s=r,pe=61;break e}if(s=t[r+20>>2]|0,r=t[r+16+(d>>>31<<2)>>2]|0,l=(s|0)==0|(s|0)==(r|0)?l:s,s=(r|0)==0,s){r=l,pe=57;break}else d=d<<((s^1)&1)}while(0);if((pe|0)==57){if((r|0)==0&(e|0)==0){if(e=2<<_,e=y&(e|0-e),!e){P=k;break}P=(e&0-e)+-1|0,d=P>>>12&16,P=P>>>d,l=P>>>5&8,P=P>>>l,_=P>>>2&4,P=P>>>_,T=P>>>1&2,P=P>>>T,r=P>>>1&1,e=0,r=t[11436+((l|d|_|T|r)+(P>>>r)<<2)>>2]|0}r?(s=r,pe=61):(_=e,d=o)}if((pe|0)==61)for(;;)if(pe=0,r=(t[s+4>>2]&-8)-k|0,P=r>>>0>>0,r=P?r:o,e=P?s:e,s=t[s+16+(((t[s+16>>2]|0)==0&1)<<2)>>2]|0,s)o=r,pe=61;else{_=e,d=r;break}if((_|0)!=0?d>>>0<((t[2785]|0)-k|0)>>>0:0){if(l=_+k|0,_>>>0>=l>>>0)return _e=0,h=vt,_e|0;s=t[_+24>>2]|0,n=t[_+12>>2]|0;do if((n|0)==(_|0)){if(e=_+20|0,n=t[e>>2]|0,!n&&(e=_+16|0,n=t[e>>2]|0,!n)){n=0;break}for(;;){if(r=n+20|0,o=t[r>>2]|0,o|0){n=o,e=r;continue}if(r=n+16|0,o=t[r>>2]|0,o)n=o,e=r;else break}t[e>>2]=0}else _e=t[_+8>>2]|0,t[_e+12>>2]=n,t[n+8>>2]=_e;while(0);do if(s){if(e=t[_+28>>2]|0,r=11436+(e<<2)|0,(_|0)==(t[r>>2]|0)){if(t[r>>2]=n,!n){o=y&~(1<>2]|0)!=(_|0)&1)<<2)>>2]=n,!n){o=y;break}t[n+24>>2]=s,e=t[_+16>>2]|0,e|0&&(t[n+16>>2]=e,t[e+24>>2]=n),e=t[_+20>>2]|0,e&&(t[n+20>>2]=e,t[e+24>>2]=n),o=y}else o=y;while(0);do if(d>>>0>=16){if(t[_+4>>2]=k|3,t[l+4>>2]=d|1,t[l+d>>2]=d,n=d>>>3,d>>>0<256){r=11172+(n<<1<<2)|0,e=t[2783]|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=l,t[n+12>>2]=l,t[l+8>>2]=n,t[l+12>>2]=r;break}if(n=d>>>8,n?d>>>0>16777215?n=31:(pe=(n+1048320|0)>>>16&8,_e=n<>>16&4,_e=_e<>>16&2,n=14-(qe|pe|n)+(_e<>>15)|0,n=d>>>(n+7|0)&1|n<<1):n=0,r=11436+(n<<2)|0,t[l+28>>2]=n,e=l+16|0,t[e+4>>2]=0,t[e>>2]=0,e=1<>2]=l,t[l+24>>2]=r,t[l+12>>2]=l,t[l+8>>2]=l;break}for(e=d<<((n|0)==31?0:25-(n>>>1)|0),r=t[r>>2]|0;;){if((t[r+4>>2]&-8|0)==(d|0)){pe=97;break}if(o=r+16+(e>>>31<<2)|0,n=t[o>>2]|0,n)e=e<<1,r=n;else{pe=96;break}}if((pe|0)==96){t[o>>2]=l,t[l+24>>2]=r,t[l+12>>2]=l,t[l+8>>2]=l;break}else if((pe|0)==97){pe=r+8|0,_e=t[pe>>2]|0,t[_e+12>>2]=l,t[pe>>2]=l,t[l+8>>2]=_e,t[l+12>>2]=r,t[l+24>>2]=0;break}}else _e=d+k|0,t[_+4>>2]=_e|3,_e=_+_e+4|0,t[_e>>2]=t[_e>>2]|1;while(0);return _e=_+8|0,h=vt,_e|0}else P=k}else P=k;else P=-1;while(0);if(r=t[2785]|0,r>>>0>=P>>>0)return n=r-P|0,e=t[2788]|0,n>>>0>15?(_e=e+P|0,t[2788]=_e,t[2785]=n,t[_e+4>>2]=n|1,t[_e+n>>2]=n,t[e+4>>2]=P|3):(t[2785]=0,t[2788]=0,t[e+4>>2]=r|3,_e=e+r+4|0,t[_e>>2]=t[_e>>2]|1),_e=e+8|0,h=vt,_e|0;if(d=t[2786]|0,d>>>0>P>>>0)return qe=d-P|0,t[2786]=qe,_e=t[2789]|0,pe=_e+P|0,t[2789]=pe,t[pe+4>>2]=qe|1,t[_e+4>>2]=P|3,_e=_e+8|0,h=vt,_e|0;if(t[2901]|0?e=t[2903]|0:(t[2903]=4096,t[2902]=4096,t[2904]=-1,t[2905]=-1,t[2906]=0,t[2894]=0,e=q&-16^1431655768,t[q>>2]=e,t[2901]=e,e=4096),_=P+48|0,y=P+47|0,l=e+y|0,s=0-e|0,k=l&s,k>>>0<=P>>>0||(e=t[2893]|0,e|0?(T=t[2891]|0,q=T+k|0,q>>>0<=T>>>0|q>>>0>e>>>0):0))return _e=0,h=vt,_e|0;e:do if(t[2894]&4)n=0,pe=133;else{r=t[2789]|0;t:do if(r){for(o=11580;e=t[o>>2]|0,!(e>>>0<=r>>>0?(ie=o+4|0,(e+(t[ie>>2]|0)|0)>>>0>r>>>0):0);)if(e=t[o+8>>2]|0,e)o=e;else{pe=118;break t}if(n=l-d&s,n>>>0<2147483647)if(e=xf(n|0)|0,(e|0)==((t[o>>2]|0)+(t[ie>>2]|0)|0)){if((e|0)!=(-1|0)){d=n,l=e,pe=135;break e}}else o=e,pe=126;else n=0}else pe=118;while(0);do if((pe|0)==118)if(r=xf(0)|0,(r|0)!=(-1|0)?(n=r,we=t[2902]|0,le=we+-1|0,n=((le&n|0)==0?0:(le+n&0-we)-n|0)+k|0,we=t[2891]|0,le=n+we|0,n>>>0>P>>>0&n>>>0<2147483647):0){if(ie=t[2893]|0,ie|0?le>>>0<=we>>>0|le>>>0>ie>>>0:0){n=0;break}if(e=xf(n|0)|0,(e|0)==(r|0)){d=n,l=r,pe=135;break e}else o=e,pe=126}else n=0;while(0);do if((pe|0)==126){if(r=0-n|0,!(_>>>0>n>>>0&(n>>>0<2147483647&(o|0)!=(-1|0))))if((o|0)==(-1|0)){n=0;break}else{d=n,l=o,pe=135;break e}if(e=t[2903]|0,e=y-n+e&0-e,e>>>0>=2147483647){d=n,l=o,pe=135;break e}if((xf(e|0)|0)==(-1|0)){xf(r|0)|0,n=0;break}else{d=e+n|0,l=o,pe=135;break e}}while(0);t[2894]=t[2894]|4,pe=133}while(0);if((((pe|0)==133?k>>>0<2147483647:0)?(qe=xf(k|0)|0,ie=xf(0)|0,Pe=ie-qe|0,ke=Pe>>>0>(P+40|0)>>>0,!((qe|0)==(-1|0)|ke^1|qe>>>0>>0&((qe|0)!=(-1|0)&(ie|0)!=(-1|0))^1)):0)&&(d=ke?Pe:n,l=qe,pe=135),(pe|0)==135){n=(t[2891]|0)+d|0,t[2891]=n,n>>>0>(t[2892]|0)>>>0&&(t[2892]=n),y=t[2789]|0;do if(y){for(n=11580;;){if(e=t[n>>2]|0,r=n+4|0,o=t[r>>2]|0,(l|0)==(e+o|0)){pe=145;break}if(s=t[n+8>>2]|0,s)n=s;else break}if(((pe|0)==145?(t[n+12>>2]&8|0)==0:0)?y>>>0>>0&y>>>0>=e>>>0:0){t[r>>2]=o+d,_e=y+8|0,_e=(_e&7|0)==0?0:0-_e&7,pe=y+_e|0,_e=(t[2786]|0)+(d-_e)|0,t[2789]=pe,t[2786]=_e,t[pe+4>>2]=_e|1,t[pe+_e+4>>2]=40,t[2790]=t[2905];break}for(l>>>0<(t[2787]|0)>>>0&&(t[2787]=l),r=l+d|0,n=11580;;){if((t[n>>2]|0)==(r|0)){pe=153;break}if(e=t[n+8>>2]|0,e)n=e;else break}if((pe|0)==153?(t[n+12>>2]&8|0)==0:0){t[n>>2]=l,T=n+4|0,t[T>>2]=(t[T>>2]|0)+d,T=l+8|0,T=l+((T&7|0)==0?0:0-T&7)|0,n=r+8|0,n=r+((n&7|0)==0?0:0-n&7)|0,k=T+P|0,_=n-T-P|0,t[T+4>>2]=P|3;do if((n|0)!=(y|0)){if((n|0)==(t[2788]|0)){_e=(t[2785]|0)+_|0,t[2785]=_e,t[2788]=k,t[k+4>>2]=_e|1,t[k+_e>>2]=_e;break}if(e=t[n+4>>2]|0,(e&3|0)==1){d=e&-8,o=e>>>3;e:do if(e>>>0<256)if(e=t[n+8>>2]|0,r=t[n+12>>2]|0,(r|0)==(e|0)){t[2783]=t[2783]&~(1<>2]=r,t[r+8>>2]=e;break}else{l=t[n+24>>2]|0,e=t[n+12>>2]|0;do if((e|0)==(n|0)){if(o=n+16|0,r=o+4|0,e=t[r>>2]|0,!e)if(e=t[o>>2]|0,e)r=o;else{e=0;break}for(;;){if(o=e+20|0,s=t[o>>2]|0,s|0){e=s,r=o;continue}if(o=e+16|0,s=t[o>>2]|0,s)e=s,r=o;else break}t[r>>2]=0}else _e=t[n+8>>2]|0,t[_e+12>>2]=e,t[e+8>>2]=_e;while(0);if(!l)break;r=t[n+28>>2]|0,o=11436+(r<<2)|0;do if((n|0)!=(t[o>>2]|0)){if(t[l+16+(((t[l+16>>2]|0)!=(n|0)&1)<<2)>>2]=e,!e)break e}else{if(t[o>>2]=e,e|0)break;t[2784]=t[2784]&~(1<>2]=l,r=n+16|0,o=t[r>>2]|0,o|0&&(t[e+16>>2]=o,t[o+24>>2]=e),r=t[r+4>>2]|0,!r)break;t[e+20>>2]=r,t[r+24>>2]=e}while(0);n=n+d|0,s=d+_|0}else s=_;if(n=n+4|0,t[n>>2]=t[n>>2]&-2,t[k+4>>2]=s|1,t[k+s>>2]=s,n=s>>>3,s>>>0<256){r=11172+(n<<1<<2)|0,e=t[2783]|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=k,t[n+12>>2]=k,t[k+8>>2]=n,t[k+12>>2]=r;break}n=s>>>8;do if(!n)n=0;else{if(s>>>0>16777215){n=31;break}pe=(n+1048320|0)>>>16&8,_e=n<>>16&4,_e=_e<>>16&2,n=14-(qe|pe|n)+(_e<>>15)|0,n=s>>>(n+7|0)&1|n<<1}while(0);if(o=11436+(n<<2)|0,t[k+28>>2]=n,e=k+16|0,t[e+4>>2]=0,t[e>>2]=0,e=t[2784]|0,r=1<>2]=k,t[k+24>>2]=o,t[k+12>>2]=k,t[k+8>>2]=k;break}for(e=s<<((n|0)==31?0:25-(n>>>1)|0),r=t[o>>2]|0;;){if((t[r+4>>2]&-8|0)==(s|0)){pe=194;break}if(o=r+16+(e>>>31<<2)|0,n=t[o>>2]|0,n)e=e<<1,r=n;else{pe=193;break}}if((pe|0)==193){t[o>>2]=k,t[k+24>>2]=r,t[k+12>>2]=k,t[k+8>>2]=k;break}else if((pe|0)==194){pe=r+8|0,_e=t[pe>>2]|0,t[_e+12>>2]=k,t[pe>>2]=k,t[k+8>>2]=_e,t[k+12>>2]=r,t[k+24>>2]=0;break}}else _e=(t[2786]|0)+_|0,t[2786]=_e,t[2789]=k,t[k+4>>2]=_e|1;while(0);return _e=T+8|0,h=vt,_e|0}for(n=11580;e=t[n>>2]|0,!(e>>>0<=y>>>0?(_e=e+(t[n+4>>2]|0)|0,_e>>>0>y>>>0):0);)n=t[n+8>>2]|0;s=_e+-47|0,e=s+8|0,e=s+((e&7|0)==0?0:0-e&7)|0,s=y+16|0,e=e>>>0>>0?y:e,n=e+8|0,r=l+8|0,r=(r&7|0)==0?0:0-r&7,pe=l+r|0,r=d+-40-r|0,t[2789]=pe,t[2786]=r,t[pe+4>>2]=r|1,t[pe+r+4>>2]=40,t[2790]=t[2905],r=e+4|0,t[r>>2]=27,t[n>>2]=t[2895],t[n+4>>2]=t[2896],t[n+8>>2]=t[2897],t[n+12>>2]=t[2898],t[2895]=l,t[2896]=d,t[2898]=0,t[2897]=n,n=e+24|0;do pe=n,n=n+4|0,t[n>>2]=7;while((pe+8|0)>>>0<_e>>>0);if((e|0)!=(y|0)){if(l=e-y|0,t[r>>2]=t[r>>2]&-2,t[y+4>>2]=l|1,t[e>>2]=l,n=l>>>3,l>>>0<256){r=11172+(n<<1<<2)|0,e=t[2783]|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=y,t[n+12>>2]=y,t[y+8>>2]=n,t[y+12>>2]=r;break}if(n=l>>>8,n?l>>>0>16777215?r=31:(pe=(n+1048320|0)>>>16&8,_e=n<>>16&4,_e=_e<>>16&2,r=14-(qe|pe|r)+(_e<>>15)|0,r=l>>>(r+7|0)&1|r<<1):r=0,o=11436+(r<<2)|0,t[y+28>>2]=r,t[y+20>>2]=0,t[s>>2]=0,n=t[2784]|0,e=1<>2]=y,t[y+24>>2]=o,t[y+12>>2]=y,t[y+8>>2]=y;break}for(e=l<<((r|0)==31?0:25-(r>>>1)|0),r=t[o>>2]|0;;){if((t[r+4>>2]&-8|0)==(l|0)){pe=216;break}if(o=r+16+(e>>>31<<2)|0,n=t[o>>2]|0,n)e=e<<1,r=n;else{pe=215;break}}if((pe|0)==215){t[o>>2]=y,t[y+24>>2]=r,t[y+12>>2]=y,t[y+8>>2]=y;break}else if((pe|0)==216){pe=r+8|0,_e=t[pe>>2]|0,t[_e+12>>2]=y,t[pe>>2]=y,t[y+8>>2]=_e,t[y+12>>2]=r,t[y+24>>2]=0;break}}}else{_e=t[2787]|0,(_e|0)==0|l>>>0<_e>>>0&&(t[2787]=l),t[2895]=l,t[2896]=d,t[2898]=0,t[2792]=t[2901],t[2791]=-1,n=0;do _e=11172+(n<<1<<2)|0,t[_e+12>>2]=_e,t[_e+8>>2]=_e,n=n+1|0;while((n|0)!=32);_e=l+8|0,_e=(_e&7|0)==0?0:0-_e&7,pe=l+_e|0,_e=d+-40-_e|0,t[2789]=pe,t[2786]=_e,t[pe+4>>2]=_e|1,t[pe+_e+4>>2]=40,t[2790]=t[2905]}while(0);if(n=t[2786]|0,n>>>0>P>>>0)return qe=n-P|0,t[2786]=qe,_e=t[2789]|0,pe=_e+P|0,t[2789]=pe,t[pe+4>>2]=qe|1,t[_e+4>>2]=P|3,_e=_e+8|0,h=vt,_e|0}return t[(ca()|0)>>2]=12,_e=0,h=vt,_e|0}function sh(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0;if(!!e){r=e+-8|0,s=t[2787]|0,e=t[e+-4>>2]|0,n=e&-8,y=r+n|0;do if(e&1)_=r,d=r;else{if(o=t[r>>2]|0,!(e&3)||(d=r+(0-o)|0,l=o+n|0,d>>>0>>0))return;if((d|0)==(t[2788]|0)){if(e=y+4|0,n=t[e>>2]|0,(n&3|0)!=3){_=d,n=l;break}t[2785]=l,t[e>>2]=n&-2,t[d+4>>2]=l|1,t[d+l>>2]=l;return}if(r=o>>>3,o>>>0<256)if(e=t[d+8>>2]|0,n=t[d+12>>2]|0,(n|0)==(e|0)){t[2783]=t[2783]&~(1<>2]=n,t[n+8>>2]=e,_=d,n=l;break}s=t[d+24>>2]|0,e=t[d+12>>2]|0;do if((e|0)==(d|0)){if(r=d+16|0,n=r+4|0,e=t[n>>2]|0,!e)if(e=t[r>>2]|0,e)n=r;else{e=0;break}for(;;){if(r=e+20|0,o=t[r>>2]|0,o|0){e=o,n=r;continue}if(r=e+16|0,o=t[r>>2]|0,o)e=o,n=r;else break}t[n>>2]=0}else _=t[d+8>>2]|0,t[_+12>>2]=e,t[e+8>>2]=_;while(0);if(s){if(n=t[d+28>>2]|0,r=11436+(n<<2)|0,(d|0)==(t[r>>2]|0)){if(t[r>>2]=e,!e){t[2784]=t[2784]&~(1<>2]|0)!=(d|0)&1)<<2)>>2]=e,!e){_=d,n=l;break}t[e+24>>2]=s,n=d+16|0,r=t[n>>2]|0,r|0&&(t[e+16>>2]=r,t[r+24>>2]=e),n=t[n+4>>2]|0,n?(t[e+20>>2]=n,t[n+24>>2]=e,_=d,n=l):(_=d,n=l)}else _=d,n=l}while(0);if(!(d>>>0>=y>>>0)&&(e=y+4|0,o=t[e>>2]|0,!!(o&1))){if(o&2)t[e>>2]=o&-2,t[_+4>>2]=n|1,t[d+n>>2]=n,s=n;else{if(e=t[2788]|0,(y|0)==(t[2789]|0)){if(y=(t[2786]|0)+n|0,t[2786]=y,t[2789]=_,t[_+4>>2]=y|1,(_|0)!=(e|0))return;t[2788]=0,t[2785]=0;return}if((y|0)==(e|0)){y=(t[2785]|0)+n|0,t[2785]=y,t[2788]=d,t[_+4>>2]=y|1,t[d+y>>2]=y;return}s=(o&-8)+n|0,r=o>>>3;do if(o>>>0<256)if(n=t[y+8>>2]|0,e=t[y+12>>2]|0,(e|0)==(n|0)){t[2783]=t[2783]&~(1<>2]=e,t[e+8>>2]=n;break}else{l=t[y+24>>2]|0,e=t[y+12>>2]|0;do if((e|0)==(y|0)){if(r=y+16|0,n=r+4|0,e=t[n>>2]|0,!e)if(e=t[r>>2]|0,e)n=r;else{r=0;break}for(;;){if(r=e+20|0,o=t[r>>2]|0,o|0){e=o,n=r;continue}if(r=e+16|0,o=t[r>>2]|0,o)e=o,n=r;else break}t[n>>2]=0,r=e}else r=t[y+8>>2]|0,t[r+12>>2]=e,t[e+8>>2]=r,r=e;while(0);if(l|0){if(e=t[y+28>>2]|0,n=11436+(e<<2)|0,(y|0)==(t[n>>2]|0)){if(t[n>>2]=r,!r){t[2784]=t[2784]&~(1<>2]|0)!=(y|0)&1)<<2)>>2]=r,!r)break;t[r+24>>2]=l,e=y+16|0,n=t[e>>2]|0,n|0&&(t[r+16>>2]=n,t[n+24>>2]=r),e=t[e+4>>2]|0,e|0&&(t[r+20>>2]=e,t[e+24>>2]=r)}}while(0);if(t[_+4>>2]=s|1,t[d+s>>2]=s,(_|0)==(t[2788]|0)){t[2785]=s;return}}if(e=s>>>3,s>>>0<256){r=11172+(e<<1<<2)|0,n=t[2783]|0,e=1<