diff --git a/code/__DEFINES/__game.dm b/code/__DEFINES/__game.dm index 7cb7440ba8da..ead4c9665c7c 100644 --- a/code/__DEFINES/__game.dm +++ b/code/__DEFINES/__game.dm @@ -152,6 +152,7 @@ block( \ //toggles_admin /// Splits admin tabs in Statpanel #define SPLIT_ADMIN_TABS (1<<0) +#define ADMIN_STEALTHMODE (1<<1) //================================================= diff --git a/code/__DEFINES/_math.dm b/code/__DEFINES/_math.dm index 7f19c95b2bcf..6fb634e66720 100644 --- a/code/__DEFINES/_math.dm +++ b/code/__DEFINES/_math.dm @@ -9,23 +9,6 @@ #define CARDINAL_DIRS list(1,2,4,8) #define CARDINAL_ALL_DIRS list(1,2,4,5,6,8,9,10) -//some colors -#define COLOR_RED "#FF0000" -#define COLOR_GREEN "#00FF00" -#define COLOR_BLUE "#0000FF" -#define COLOR_CYAN "#00FFFF" -#define COLOR_PINK "#FF00FF" -#define COLOR_YELLOW "#FFFF00" -#define COLOR_ORANGE "#FF9900" -#define COLOR_WHITE "#FFFFFF" -#define COLOR_BLACK "#000000" -#define COLOR_OIL "#030303" - -//Grass Colors -#define COLOR_G_ICE "#C7EDDE" //faded cyan -#define COLOR_G_DES "#FF7C1C" //bright orange -#define COLOR_G_JUNG "#64AA6E" //faded green - #define LEFT 1 #define RIGHT 2 diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index 97e4b0dbd1e8..be96a2e32b85 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -152,6 +152,8 @@ most of them are tied into map-placed objects. This should be reworked in the fu /// Ancients only #define ACCESS_YAUTJA_ANCIENT 392 +/// Anything in a tutorial sequence that shouldn't be accessed +#define ACCESS_TUTORIAL_LOCKED 998 ///Temporary, just so I can flag places I need to change #define ACCESS_COME_BACK_TO_ME 999 diff --git a/code/__DEFINES/chat.dm b/code/__DEFINES/chat.dm index 85966e4032e2..f2db3980e887 100644 --- a/code/__DEFINES/chat.dm +++ b/code/__DEFINES/chat.dm @@ -6,6 +6,7 @@ #define MESSAGE_TYPE_SYSTEM "system" #define MESSAGE_TYPE_LOCALCHAT "localchat" #define MESSAGE_TYPE_RADIO "radio" +#define MESSAGE_TYPE_HIVEMIND "hivemind" #define MESSAGE_TYPE_INFO "info" #define MESSAGE_TYPE_WARNING "warning" #define MESSAGE_TYPE_DEADCHAT "deadchat" diff --git a/code/__DEFINES/colours.dm b/code/__DEFINES/colours.dm index 5fa106715f39..e9a03a6382da 100644 --- a/code/__DEFINES/colours.dm +++ b/code/__DEFINES/colours.dm @@ -1,214 +1,152 @@ // tg port thing -//different types of atom colourations -/// Only used by rare effects like greentext colouring mobs and when admins varedit color -#define ADMIN_COLOUR_PRIORITY 1 +//different types of atom colorations +/// Only used by rare effects like greentext coloring mobs and when admins varedit color +#define ADMIN_COLOR_PRIORITY 1 /// e.g. purple effect of the revenant on a mob, black effect when mob electrocuted -#define TEMPORARY_COLOUR_PRIORITY 2 -/// Colour splashed onto an atom (e.g. paint on turf) -#define WASHABLE_COLOUR_PRIORITY 3 -/// Colour inherent to the atom (e.g. blob color) -#define FIXED_COLOUR_PRIORITY 4 +#define TEMPORARY_COLOR_PRIORITY 2 +/// Color splashed onto an atom (e.g. paint on turf) +#define WASHABLE_COLOR_PRIORITY 3 +/// Color inherent to the atom (e.g. blob color) +#define FIXED_COLOR_PRIORITY 4 ///how many color priority levels there are. -#define COLOUR_PRIORITY_AMOUNT 4 - -#define COLOUR_DARKMODE_BACKGROUND "#202020" -#define COLOUR_DARKMODE_DARKBACKGROUND "#171717" -#define COLOUR_DARKMODE_TEXT "#a4bad6" - -#define COLOUR_WHITE "#FFFFFF" -#define COLOUR_VERY_LIGHT_GRAY "#EEEEEE" -#define COLOUR_SILVER "#C0C0C0" -#define COLOUR_GRAY "#808080" -#define COLOUR_FLOORTILE_GRAY "#8D8B8B" -#define COLOUR_DARK "#454545" -#define COLOUR_ALMOST_BLACK "#333333" -#define COLOUR_BLACK "#000000" -#define COLOUR_HALF_TRANSPARENT_BLACK "#0000007A" - -#define COLOUR_RED "#FF0000" -#define COLOUR_MOSTLY_PURE_RED "#FF3300" -#define COLOUR_DARK_RED "#A50824" -#define COLOUR_RED_LIGHT "#FF3333" -#define COLOUR_MAROON "#800000" -#define COLOUR_VIVID_RED "#FF3232" -#define COLOUR_LIGHT_GRAYISH_RED "#E4C7C5" -#define COLOUR_SOFT_RED "#FA8282" -#define COLOUR_CULT_RED "#960000" -#define COLOUR_BUBBLEGUM_RED "#950A0A" - -#define COLOUR_YELLOW "#FFFF00" -#define COLOUR_VIVID_YELLOW "#FBFF23" -#define COLOUR_VERY_SOFT_YELLOW "#FAE48E" - -#define COLOUR_OLIVE "#808000" -#define COLOUR_VIBRANT_LIME "#00FF00" -#define COLOUR_LIME "#32CD32" -#define COLOUR_DARK_LIME "#00aa00" -#define COLOUR_VERY_PALE_LIME_GREEN "#DDFFD3" -#define COLOUR_VERY_DARK_LIME_GREEN "#003300" -#define COLOUR_GREEN "#008000" -#define COLOUR_DARK_MODERATE_LIME_GREEN "#44964A" - -#define COLOUR_CYAN "#00FFFF" -#define COLOUR_DARK_CYAN "#00A2FF" -#define COLOUR_TEAL "#008080" -#define COLOUR_BLUE "#0000FF" -#define COLOUR_STRONG_BLUE "#1919c8" -#define COLOUR_BRIGHT_BLUE "#2CB2E8" -#define COLOUR_MODERATE_BLUE "#555CC2" -#define COLOUR_AMETHYST "#822BFF" -#define COLOUR_BLUE_LIGHT "#33CCFF" -#define COLOUR_NAVY "#000080" -#define COLOUR_BLUE_GRAY "#75A2BB" - -#define COLOUR_PINK "#FFC0CB" -#define COLOUR_LIGHT_PINK "#ff3cc8" -#define COLOUR_MOSTLY_PURE_PINK "#E4005B" -#define COLOUR_BLUSH_PINK "#DE5D83" -#define COLOUR_MAGENTA "#FF00FF" -#define COLOUR_STRONG_MAGENTA "#B800B8" -#define COLOUR_PURPLE "#800080" -#define COLOUR_VIOLET "#B900F7" -#define COLOUR_STRONG_VIOLET "#6927c5" - -#define COLOUR_ORANGE "#FF9900" -#define COLOUR_MOSTLY_PURE_ORANGE "#ff8000" -#define COLOUR_TAN_ORANGE "#FF7B00" -#define COLOUR_BRIGHT_ORANGE "#E2853D" -#define COLOUR_LIGHT_ORANGE "#ffc44d" -#define COLOUR_PALE_ORANGE "#FFBE9D" -#define COLOUR_BEIGE "#CEB689" -#define COLOUR_DARK_ORANGE "#C3630C" -#define COLOUR_DARK_MODERATE_ORANGE "#8B633B" - -#define COLOUR_BROWN "#BA9F6D" -#define COLOUR_DARK_BROWN "#997C4F" -#define COLOUR_ORANGE_BROWN "#a9734f" - -//Colour defines used by the soapstone (based on readability against grey tiles) -#define COLOUR_SOAPSTONE_PLASTIC "#a19d94" -#define COLOUR_SOAPSTONE_IRON "#b2b2b2" -#define COLOUR_SOAPSTONE_BRONZE "#FE8001" -#define COLOUR_SOAPSTONE_SILVER "#FFFFFF" -#define COLOUR_SOAPSTONE_GOLD "#FFD900" -#define COLOUR_SOAPSTONE_DIAMOND "#00ffee" - -#define COLOUR_GREEN_GRAY "#99BB76" -#define COLOUR_RED_GRAY "#B4696A" -#define COLOUR_PALE_BLUE_GRAY "#98C5DF" -#define COLOUR_PALE_GREEN_GRAY "#B7D993" -#define COLOUR_PALE_RED_GRAY "#D59998" -#define COLOUR_PALE_PURPLE_GRAY "#CBB1CA" -#define COLOUR_PURPLE_GRAY "#AE8CA8" - -//Colour defines used by the assembly detailer. -#define COLOUR_ASSEMBLY_BLACK "#545454" -#define COLOUR_ASSEMBLY_BGRAY "#9497AB" -#define COLOUR_ASSEMBLY_WHITE "#E2E2E2" -#define COLOUR_ASSEMBLY_RED "#CC4242" -#define COLOUR_ASSEMBLY_ORANGE "#E39751" -#define COLOUR_ASSEMBLY_BEIGE "#AF9366" -#define COLOUR_ASSEMBLY_BROWN "#97670E" -#define COLOUR_ASSEMBLY_GOLD "#AA9100" -#define COLOUR_ASSEMBLY_YELLOW "#CECA2B" -#define COLOUR_ASSEMBLY_GURKHA "#999875" -#define COLOUR_ASSEMBLY_LGREEN "#789876" -#define COLOUR_ASSEMBLY_GREEN "#44843C" -#define COLOUR_ASSEMBLY_LBLUE "#5D99BE" -#define COLOUR_ASSEMBLY_BLUE "#38559E" -#define COLOUR_ASSEMBLY_PURPLE "#6F6192" - -///Colours for xenobiology vatgrowing -#define COLOUR_SAMPLE_YELLOW "#c0b823" -#define COLOUR_SAMPLE_PURPLE "#342941" -#define COLOUR_SAMPLE_GREEN "#98b944" -#define COLOUR_SAMPLE_BROWN "#91542d" -#define COLOUR_SAMPLE_GRAY "#5e5856" - -///Main colours for UI themes -#define COLOUR_THEME_MIDNIGHT "#6086A0" -#define COLOUR_THEME_PLASMAFIRE "#FFB200" -#define COLOUR_THEME_RETRO "#24CA00" -#define COLOUR_THEME_SLIMECORE "#4FB259" -#define COLOUR_THEME_OPERATIVE "#B8221F" -#define COLOUR_THEME_GLASS "#75A4C4" -#define COLOUR_THEME_CLOCKWORK "#CFBA47" - -///Colours for eigenstates -#define COLOUR_PERIWINKLEE "#9999FF" +#define COLOR_PRIORITY_AMOUNT 4 + +// BLACK AND WHITE COLOR DEFINE. + +/// White rgb(255, 255, 255) +#define COLOR_WHITE "#FFFFFF" +/// Black rgb(0, 0, 0) +#define COLOR_BLACK "#000000" + +// THE THREE PRIMARIES COLORS DEFINES. + +/// Red rgb(255, 0, 0) +#define COLOR_RED "#FF0000" +/// Green rgb(0, 255, 0) +#define COLOR_GREEN "#00FF00" +/// Blue rgb(0, 0, 255) +#define COLOR_BLUE "#0000FF" + +//mix of two full primary colors + +/// Cyan rgb(0, 255, 255) B + G +#define COLOR_CYAN "#00FFFF" +/// Magenta rgb(255, 0, 255) R+B +#define COLOR_MAGENTA "#FF00FF" +/// Yellow rgb(255, 255, 0) R+G +#define COLOR_YELLOW "#FFFF00" + +// colors define in use bellow + +/// Olive rgb(128, 128, 0) +#define COLOR_OLIVE "#808000" +/// Silver rgb(192, 192, 192) shade of grey +#define COLOR_SILVER "#C0C0C0" +/// Gray rgb(128, 128, 128) +#define COLOR_GRAY "#808080" + +#define COLOR_FLOORTILE_GRAY "#8D8B8B" + +#define COLOR_HALF_TRANSPARENT_BLACK "#0000007A" + +#define COLOR_DARK_RED "#A50824" + +/// Maroon rgb(128, 0, 0) shade of red +#define COLOR_MAROON "#800000" + +#define COLOR_VIVID_RED "#FF3232" +#define COLOR_LIGHT_GRAYISH_RED "#E4C7C5" +#define COLOR_SOFT_RED "#FA8282" + +#define COLOR_VERY_SOFT_YELLOW "#FAE48E" + +///light green rgb( 0, 128, 0) +#define COLOR_LIGHT_GREEN "#008000" +#define COLOR_DARK_MODERATE_LIME_GREEN "#44964A" + +#define COLOR_TEAL "#008080" + +#define COLOR_MODERATE_BLUE "#555CC2" +/// Purple rgb( 128, 0, 128) +#define COLOR_PURPLE "#800080" +#define COLOR_STRONG_VIOLET "#6927c5" + +#define LIGHT_BEIGE "#CEB689" +#define COLOR_DARK_MODERATE_ORANGE "#8B633B" + +#define COLOR_BROWN "#BA9F6D" +#define COLOR_DARK_BROWN "#997C4F" + /** - * Some defines to generalise colours used in lighting. + * Some defines to generalise Colors used in lighting. * - * Important note: colours can end up significantly different from the basic html picture, especially when saturated + * Important note: Colors can end up significantly different from the basic html picture, especially when saturated */ -/// Full white. rgb(255, 255, 255) -#define LIGHT_COLOR_WHITE "#FFFFFF" /// Bright but quickly dissipating neon green. rgb(100, 200, 100) -#define LIGHT_COLOUR_GREEN "#64C864" -/// Electric green. rgb(0, 255, 0) -#define LIGHT_COLOUR_ELECTRIC_GREEN "#00FF00" +#define LIGHT_COLOR_GREEN "#64C864" /// Cold, diluted blue. rgb(100, 150, 250) -#define LIGHT_COLOUR_BLUE "#6496FA" +#define LIGHT_COLOR_BLUE "#6496FA" /// Light blueish green. rgb(125, 225, 175) -#define LIGHT_COLOUR_BLUEGREEN "#7DE1AF" +#define LIGHT_COLOR_BLUEGREEN "#7DE1AF" /// Diluted cyan. rgb(125, 225, 225) -#define LIGHT_COLOUR_CYAN "#7DE1E1" -/// Electric cyan rgb(0, 255, 255) -#define LIGHT_COLOUR_ELECTRIC_CYAN "#00FFFF" +#define LIGHT_COLOR_CYAN "#7DE1E1" /// More-saturated cyan. rgb(64, 206, 255) -#define LIGHT_COLOUR_LIGHT_CYAN "#40CEFF" +#define LIGHT_COLOR_LIGHT_CYAN "#40CEFF" /// Saturated blue. rgb(51, 117, 248) -#define LIGHT_COLOUR_DARK_BLUE "#6496FA" +#define LIGHT_COLOR_DARK_BLUE "#3375F8" /// Diluted, mid-warmth pink. rgb(225, 125, 225) -#define LIGHT_COLOUR_PINK "#E17DE1" +#define LIGHT_COLOR_PINK "#E17DE1" /// Dimmed yellow, leaning kaki. rgb(225, 225, 125) -#define LIGHT_COLOUR_YELLOW "#E1E17D" +#define LIGHT_COLOR_YELLOW "#E1E17D" /// Clear brown, mostly dim. rgb(150, 100, 50) -#define LIGHT_COLOUR_BROWN "#966432" +#define LIGHT_COLOR_BROWN "#966432" /// Mostly pure orange. rgb(250, 150, 50) -#define LIGHT_COLOUR_ORANGE "#FA9632" +#define LIGHT_COLOR_ORANGE "#FA9632" /// Light Purple. rgb(149, 44, 244) -#define LIGHT_COLOUR_PURPLE "#952CF4" +#define LIGHT_COLOR_PURPLE "#952CF4" /// Less-saturated light purple. rgb(155, 81, 255) -#define LIGHT_COLOUR_LAVENDER "#9B51FF" +#define LIGHT_COLOR_LAVENDER "#9B51FF" ///slightly desaturated bright yellow. -#define LIGHT_COLOUR_HOLY_MAGIC "#FFF743" +#define LIGHT_COLOR_HOLY_MAGIC "#FFF743" /// deep crimson -#define LIGHT_COLOUR_BLOOD_MAGIC "#D00000" +#define LIGHT_COLOR_BLOOD_MAGIC "#D00000" /* These ones aren't a direct color like the ones above, because nothing would fit */ /// Warm orange color, leaning strongly towards yellow. rgb(250, 160, 25) -#define LIGHT_COLOUR_FIRE "#FAA019" +#define LIGHT_COLOR_FIRE "#FAA019" /// Very warm yellow, leaning slightly towards orange. rgb(196, 138, 24) -#define LIGHT_COLOUR_LAVA "#C48A18" +#define LIGHT_COLOR_LAVA "#C48A18" /// Bright, non-saturated red. Leaning slightly towards pink for visibility. rgb(250, 100, 75) -#define LIGHT_COLOUR_FLARE "#FA644B" +#define LIGHT_COLOR_FLARE "#FA644B" /// Weird color, between yellow and green, very slimy. rgb(175, 200, 75) -#define LIGHT_COLOUR_SLIME_LAMP "#AFC84B" +#define LIGHT_COLOR_SLIME_LAMP "#AFC84B" /// Extremely diluted yellow, close to skin color (for some reason). rgb(250, 225, 175) -#define LIGHT_COLOUR_TUNGSTEN "#FAE1AF" +#define LIGHT_COLOR_TUNGSTEN "#FAE1AF" /// Barely visible cyan-ish hue, as the doctor prescribed. rgb(240, 250, 250) -#define LIGHT_COLOUR_HALOGEN "#F0FAFA" - -//The GAGS greyscale_colours for each department's computer/machine circuits -#define CIRCUIT_COLOUR_GENERIC "#1A7A13" -#define CIRCUIT_COLOUR_COMMAND "#1B4594" -#define CIRCUIT_COLOUR_SECURITY "#9A151E" -#define CIRCUIT_COLOUR_SCIENCE "#BC4A9B" -#define CIRCUIT_COLOUR_SERVICE "#92DCBA" -#define CIRCUIT_COLOUR_MEDICAL "#00CCFF" -#define CIRCUIT_COLOUR_ENGINEERING "#F8D700" -#define CIRCUIT_COLOUR_SUPPLY "#C47749" +#define LIGHT_COLOR_HALOGEN "#F0FAFA" /// The default color for admin say, used as a fallback when the preference is not enabled -#define DEFAULT_ASAY_COLOUR COLOUR_MOSTLY_PURE_RED -#define DEFAULT_HEX_COLOUR_LEN 6 +#define COLOR_MOSTLY_PURE_RED "#FF3300" +#define DEFAULT_ASAY_COLOR COLOR_MOSTLY_PURE_RED + +#define DEFAULT_HEX_COLOR_LEN 6 -// Colour filters +// Color filters /// Icon filter that creates ambient occlusion #define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, border=4, color="#04080FAA") /// Icon filter that creates gaussian blur #define GAUSSIAN_BLUR(filter_size) filter(type="blur", size=filter_size) + +//some colors coming from _math.dm + +#define COLOR_ORANGE "#FF9900" +#define COLOR_OIL "#030303" + +//Grass Colors coming from _math.dm + +#define COLOR_G_ICE "#C7EDDE" //faded cyan +#define COLOR_G_DES "#FF7C1C" //bright orange +#define COLOR_G_JUNG "#64AA6E" //faded green diff --git a/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm b/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm index 6614272d33e5..2e247cdccc73 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm @@ -67,3 +67,6 @@ #define COMSIG_HUMAN_SURGERY_APPLY_MODIFIERS "human_surgery_apply_modifiers" /// From /mob/living/carbon/human/proc/get_flags_cold_protection() #define COMSIG_HUMAN_COLD_PROTECTION_APPLY_MODIFIERS "human_cold_protection_apply_modifiers" + +/// From /obj/item/proc/dig_out_shrapnel() : () +#define COMSIG_HUMAN_SHRAPNEL_REMOVED "human_shrapnel_removed" diff --git a/code/__DEFINES/dcs/signals/atom/mob/living/signals_living.dm b/code/__DEFINES/dcs/signals/atom/mob/living/signals_living.dm index 89f3951e7c99..cea905dd1011 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/living/signals_living.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/living/signals_living.dm @@ -29,7 +29,19 @@ #define COMSIG_LIVING_PRE_COLLIDE "living_pre_collide" #define COMPONENT_LIVING_COLLIDE_HANDLED (1<<0) +/// From /mob/living/proc/do_ghost() : (mob/dead/observer/ghost) +#define COMSIG_LIVING_GHOSTED "living_ghosted" + +/// From /mob/living/carbon/human/attack_hand() : (mob/living/carbon/human/attacked_mob) +#define COMSIG_LIVING_ATTACKHAND_HUMAN "living_attackhand_human" + +/// From /obj/item/reagent_container/hypospray/attack() : (obj/item/reagent_container/hypospray/injector) +#define COMSIG_LIVING_HYPOSPRAY_INJECTED "living_hypospray_injected" + ///from base of mob/living/set_buckled(): (new_buckled) #define COMSIG_LIVING_SET_BUCKLED "living_set_buckled" ///from base of mob/living/set_body_position() #define COMSIG_LIVING_SET_BODY_POSITION "living_set_body_position" + +/// from base of /mob/living/apply_status_effect(): (datum/status_effect/new_effect) +#define COMSIG_LIVING_APPLY_EFFECT "living_apply_effect" diff --git a/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm b/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm index bfb62c2bcf6e..58021ba564a2 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm @@ -77,6 +77,9 @@ ///from base of /mob/Logout(): () #define COMSIG_MOB_LOGOUT "mob_logout" +/// From /mob/proc/change_real_name(): (old_name, new_name) +#define COMSIG_MOB_REAL_NAME_CHANGED "mob_real_name_changed" + //from /mob/proc/on_deafness_gain() #define COMSIG_MOB_DEAFENED "mob_deafened" //from /mob/proc/on_deafness_loss() @@ -128,5 +131,42 @@ /// From /obj/item/proc/pickup() : (obj/item/picked_up) #define COMSIG_MOB_PICKUP_ITEM "mob_pickup_item" +/// From /obj/item/proc/attack_self() : (obj/item/used) +#define COMSIG_MOB_ITEM_ATTACK_SELF "mob_item_attack_self" + +/// From /obj/item/proc/dropped() : (obj/item/dropped) +#define COMSIG_MOB_ITEM_DROPPED "mob_item_dropped" + + +/// From /obj/item/reagent_container/food/snacks/proc/on_Consume() : (obj/item/reagent_container/food/snacks/eaten_food) +#define COMSIG_MOB_EATEN_SNACK "mob_eaten_snack" + +/// From /atom/proc/attackby() : (atom/attacked, obj/item/attacked_with) +#define COMSIG_MOB_PARENT_ATTACKBY "mob_parent_attackby" + +/// From /obj/item/weapon/gun/proc/reload_into_chamber() : (obj/item/weapon/gun/empty_gun) +#define COMSIG_MOB_GUN_EMPTY "mob_gun_empty" + +/// From /obj/item/weapon/gun/proc/reload() : (obj/item/weapon/gun/reloaded) +#define COMSIG_MOB_RELOADED_GUN "mob_reloaded_gun" + +/// From /mob/proc/get_status_tab_items() : (list/status_list) +#define COMSIG_MOB_GET_STATUS_TAB_ITEMS "mob_get_status_tab_items" + +/// From /datum/tutorial/proc/update_objective() : (new_objective) +#define COMSIG_MOB_TUTORIAL_UPDATE_OBJECTIVE "mob_tutorial_update_objective" + +/// From /mob/proc/swap_hand() : () +#define COMSIG_MOB_SWAPPED_HAND "mob_swapped_hand" + +/// From /mob/proc/a_intent_change() : (new_intent) +#define COMSIG_MOB_INTENT_CHANGE "mob_intent_change" + +/// From /obj/item/grab/proc/progress_passive() : (mob/living/carbon/human/grabber) +#define COMSIG_MOB_AGGRESSIVELY_GRABBED "mob_aggressively_grabbed" + #define COMSIG_MOB_AGGRESIVE_GRAB_CANCEL (1<<0) + /// Cancels all running cloaking effects on target #define COMSIG_MOB_EFFECT_CLOAK_CANCEL "mob_effect_cloak_cancel" + +#define COMSIG_MOB_END_TUTORIAL "mob_end_tutorial" diff --git a/code/__DEFINES/dcs/signals/atom/signals_obj.dm b/code/__DEFINES/dcs/signals/atom/signals_obj.dm index b5f2bb3ff6a9..c870a55ed746 100644 --- a/code/__DEFINES/dcs/signals/atom/signals_obj.dm +++ b/code/__DEFINES/dcs/signals/atom/signals_obj.dm @@ -30,6 +30,16 @@ /// from /obj/proc/afterbuckle() #define COSMIG_OBJ_AFTER_BUCKLE "signal_obj_after_buckle" +/// from /obj/structure/machinery/cryopod/go_out() +#define COMSIG_CRYOPOD_GO_OUT "cryopod_go_out" + +/// from /proc/vendor_successful_vend() : (obj/structure/machinery/cm_vending/vendor, list/itemspec, mob/living/carbon/human/user) +#define COMSIG_VENDOR_SUCCESSFUL_VEND "vendor_successful_vend" + +/// from /obj/limb/proc/remove_all_bleeding() : (external, internal) +#define COMSIG_LIMB_STOP_BLEEDING "limb_stop_bleeding" + #define COMSIG_DROPSHIP_ADD_EQUIPMENT "dropship_add_equipment" #define COMSIG_DROPSHIP_REMOVE_EQUIPMENT "dropship_remove_equipment" + #define COMSIG_STRUCTURE_CRATE_SQUAD_LAUNCHED "structure_crate_squad_launched" diff --git a/code/__DEFINES/dcs/signals/signals_client.dm b/code/__DEFINES/dcs/signals/signals_client.dm index 6733e0703514..3968f654c486 100644 --- a/code/__DEFINES/dcs/signals/signals_client.dm +++ b/code/__DEFINES/dcs/signals/signals_client.dm @@ -27,6 +27,3 @@ /// Called when something is removed from a client's screen : /client/proc/remove_from_screen(screen_remove) #define COMSIG_CLIENT_SCREEN_REMOVE "client_screen_remove" - -/// When a mind is transfered to another mob at /datum/mind/proc/transfer_to() -#define COMSIG_CLIENT_MIND_TRANSFER "mind_transfer" diff --git a/code/__DEFINES/equipment.dm b/code/__DEFINES/equipment.dm index f0688282572d..375dd0db540d 100644 --- a/code/__DEFINES/equipment.dm +++ b/code/__DEFINES/equipment.dm @@ -194,11 +194,11 @@ //=========================================================================================== //Marine armor only, use for flags_marine_armor. -#define ARMOR_SQUAD_OVERLAY 1 -#define ARMOR_LAMP_OVERLAY 2 -#define ARMOR_LAMP_ON 4 -#define ARMOR_IS_REINFORCED 8 -#define SYNTH_ALLOWED 16 +#define ARMOR_SQUAD_OVERLAY (1<<0) +#define ARMOR_LAMP_OVERLAY (1<<1) +#define ARMOR_LAMP_ON (1<<2) +#define ARMOR_IS_REINFORCED (1<<3) +#define SYNTH_ALLOWED (1<<4) //=========================================================================================== //=========================================================================================== diff --git a/code/__DEFINES/keybinding.dm b/code/__DEFINES/keybinding.dm index 764282d59765..f4503aeea5d5 100644 --- a/code/__DEFINES/keybinding.dm +++ b/code/__DEFINES/keybinding.dm @@ -170,8 +170,7 @@ #define COMSIG_KB_YAUTJA_BUTCHER "keybinding_yautja_butcher" #define COMSIG_KB_YAUTJA_PRED_BUY "keybinding_yautja_pred_buy" #define COMSIG_KB_YAUTJA_MARK_PANEL "keybinding_yautja_mark_panel" -#define COMSIG_KB_YAUTJA_MARK_FOR_HUNT "keybinding_yautja_mark_for_hunt" -#define COMSIG_KB_YAUTJA_REMOVE_FROM_HUNT "keybinding_yautja_remove_from_hunt" +#define COMSIG_KB_YAUTJA_TOGGLE_MARK_FOR_HUNT "keybinding_yautja_toggle_mark_for_hunt" // Yautja Bracer #define COMSIG_KB_YAUTJA_TOGGLE_NOTIFICATION_SOUND "keybinding_yautja_toggle_notification_sound" @@ -192,6 +191,7 @@ #define COMSIG_KB_YAUTJA_BRACERNAME "keybinding_yautja_bracername" #define COMSIG_KB_YAUTJA_IDCHIP "keybinding_yautja_idchip" #define COMSIG_KB_YAUTJA_LINK_BRACER "keybinding_yautja_link_bracer" +#define COMSIG_KB_YAUTJA_CONTROL_FALCON "keybinding_yautja_control_falcon" //mask #define COMSIG_KB_YAUTJA_MASK_TOGGLE_ZOOM "keybinding_yautja_mask_toggle_zoom" diff --git a/code/__DEFINES/minimap.dm b/code/__DEFINES/minimap.dm index 003d723600c4..57c5ffeba38a 100644 --- a/code/__DEFINES/minimap.dm +++ b/code/__DEFINES/minimap.dm @@ -71,7 +71,6 @@ GLOBAL_LIST_INIT(all_minimap_flags, bitfield2list(MINIMAP_FLAG_ALL)) #define MINIMAP_ICON_COLOR_COMMANDER "#c6fcfc" #define MINIMAP_ICON_COLOR_HEAD "#F0C542" -#define MINIMAP_ICON_COLOR_SILVER "#c0c0c0" #define MINIMAP_ICON_COLOR_BRONZE "#eb9545" #define MINIMAP_ICON_COLOR_DOCTOR "#b83737" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index b024f22ebfff..8a8e9678fbdf 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -124,7 +124,6 @@ #define MATERIAL_METAL "metal" #define MATERIAL_PLASTEEL "plasteel" #define MATERIAL_WOOD "wood plank" -#define MATERIAL_CRYSTAL "plasmagas" // SIZES FOR ITEMS, use it for w_class diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm new file mode 100644 index 000000000000..7f9f33ea483c --- /dev/null +++ b/code/__DEFINES/mob.dm @@ -0,0 +1 @@ +#define DEFAULT_MOB_STATUS_FLAGS CANKNOCKDOWN|CANPUSH|STATUS_FLAGS_DEBILITATE diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index e50d9e72497c..9cd69e61c8b2 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -47,9 +47,7 @@ //disabilities #define NEARSIGHTED (1<<0) -#define EPILEPSY (1<<1) -#define COUGHING (1<<2) -#define TOURETTES (1<<3) + #define NERVOUS (1<<4) #define OPIATE_RECEPTOR_DEFICIENCY (1<<5) //================================================= @@ -197,22 +195,22 @@ //================================================= //Species flags. -#define NO_BLOOD (1<<0) -#define NO_BREATHE (1<<1) +#define NO_BLOOD (1<<0) +#define NO_BREATHE (1<<1) #define NO_CLONE_LOSS (1<<2) -#define NO_SLIP (1<<3) +#define NO_SLIP (1<<3) #define NO_POISON (1<<4) -#define NO_CHEM_METABOLIZATION (1<<5) //Prevents reagents from acting on_mob_life(). +#define NO_CHEM_METABOLIZATION (1<<5) //Prevents reagents from acting on_mob_life(). #define HAS_SKIN_TONE (1<<6) -#define HAS_SKIN_COLOR (1<<7) -#define HAS_LIPS (1<<8) +#define HAS_SKIN_COLOR (1<<7) +#define HAS_LIPS (1<<8) #define HAS_UNDERWEAR (1<<9) -#define IS_WHITELISTED (1<<10) -#define IS_SYNTHETIC (1<<11) -#define NO_NEURO (1<<12) +#define IS_WHITELISTED (1<<10) +#define IS_SYNTHETIC (1<<11) +#define NO_NEURO (1<<12) #define SPECIAL_BONEBREAK (1<<13) //species do not get their bonebreak chance modified by endurance -#define NO_SHRAPNEL (1<<14) -#define HAS_HARDCRIT (1<<15) +#define NO_SHRAPNEL (1<<14) +#define HAS_HARDCRIT (1<<15) //================================================= diff --git a/code/__DEFINES/text.dm b/code/__DEFINES/text.dm index 0ce7e508daac..26567be26255 100644 --- a/code/__DEFINES/text.dm +++ b/code/__DEFINES/text.dm @@ -23,4 +23,4 @@ #define MAX_EMOTE_LEN 256 #define MAX_PAPER_MESSAGE_LEN 3072 #define MAX_BOOK_MESSAGE_LEN 9216 -#define MAX_NAME_LEN 26 +#define MAX_NAME_LEN 28 diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index b0e97e05e9b2..c561a64ebf58 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "6.7.0" +#define TGS_DMAPI_VERSION "7.0.1" // All functions and datums outside this document are subject to change with any version and should not be relied on. @@ -73,12 +73,12 @@ #define TGS_EVENT_REPO_MERGE_PULL_REQUEST 3 /// Before the repository makes a sychronize operation. Parameters: Absolute repostiory path. #define TGS_EVENT_REPO_PRE_SYNCHRONIZE 4 -/// Before a BYOND install operation begins. Parameters: [/datum/tgs_version] of the installing BYOND. -#define TGS_EVENT_BYOND_INSTALL_START 5 -/// When a BYOND install operation fails. Parameters: Error message -#define TGS_EVENT_BYOND_INSTALL_FAIL 6 -/// When the active BYOND version changes. Parameters: (Nullable) [/datum/tgs_version] of the current BYOND, [/datum/tgs_version] of the new BYOND. -#define TGS_EVENT_BYOND_ACTIVE_VERSION_CHANGE 7 +/// Before a engine install operation begins. Parameters: Version string of the installing engine. +#define TGS_EVENT_ENGINE_INSTALL_START 5 +/// When a engine install operation fails. Parameters: Error message +#define TGS_EVENT_ENGINE_INSTALL_FAIL 6 +/// When the active engine version changes. Parameters: (Nullable) Version string of the current engine, version string of the new engine. +#define TGS_EVENT_ENGINE_ACTIVE_VERSION_CHANGE 7 /// When the compiler starts running. Parameters: Game directory path, origin commit SHA. #define TGS_EVENT_COMPILE_START 8 /// When a compile is cancelled. No parameters. @@ -108,7 +108,7 @@ // #define TGS_EVENT_DREAM_DAEMON_LAUNCH 22 /// After a single submodule update is performed. Parameters: Updated submodule name. #define TGS_EVENT_REPO_SUBMODULE_UPDATE 23 -/// After CodeModifications are applied, before DreamMaker is run. Parameters: Game directory path, origin commit sha, byond version. +/// After CodeModifications are applied, before DreamMaker is run. Parameters: Game directory path, origin commit sha, version string of the used engine. #define TGS_EVENT_PRE_DREAM_MAKER 24 /// Whenever a deployment folder is deleted from disk. Parameters: Game directory path. #define TGS_EVENT_DEPLOYMENT_CLEANUP 25 @@ -122,6 +122,7 @@ /// The watchdog will restart on reboot. #define TGS_REBOOT_MODE_RESTART 2 +// Note that security levels are currently meaningless in OpenDream /// DreamDaemon Trusted security level. #define TGS_SECURITY_TRUSTED 0 /// DreamDaemon Safe security level. @@ -136,6 +137,11 @@ /// DreamDaemon invisible visibility level. #define TGS_VISIBILITY_INVISIBLE 2 +/// The Build Your Own Net Dream engine. +#define TGS_ENGINE_TYPE_BYOND 0 +/// The OpenDream engine. +#define TGS_ENGINE_TYPE_OPENDREAM 1 + //REQUIRED HOOKS /** @@ -449,6 +455,10 @@ /world/proc/TgsVersion() return +/// Returns the running engine type +/world/proc/TgsEngine() + return + /// Returns the current [/datum/tgs_version] of the DMAPI being used if it was activated, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsApiVersion() return diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index d37c9185fa6d..c2abe21a26ad 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -155,6 +155,8 @@ #define TRAIT_FORCED_STANDING "forcedstanding" /// Stuns preventing movement and using objects but without further impairement #define TRAIT_INCAPACITATED "incapacitated" +/// Disoriented. Unable to talk properly, and unable to use some skills as Xeno +#define TRAIT_DAZED "dazed" /// Apply this to identify a mob as merged with weeds #define TRAIT_MERGED_WITH_WEEDS "merged_with_weeds" @@ -221,6 +223,8 @@ #define TRAIT_HARDCORE "t_hardcore" /// If the mob is able to use the vulture rifle or spotting scope #define TRAIT_VULTURE_USER "t_vulture_user" +/// If the mob is currently loading a tutorial +#define TRAIT_IN_TUTORIAL "t_IN_TUTORIAL" /// If the mob is cloaked in any form #define TRAIT_CLOAKED "t_cloaked" @@ -297,6 +301,7 @@ GLOBAL_LIST_INIT(mob_traits, list( TRAIT_REAGENT_SCANNER, TRAIT_ABILITY_BURROWED, TRAIT_VULTURE_USER, + TRAIT_IN_TUTORIAL, )) /* @@ -310,6 +315,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_IMMOBILIZED" = TRAIT_IMMOBILIZED, "TRAIT_INCAPACITATED" = TRAIT_INCAPACITATED, "TRAIT_FLOORED" = TRAIT_FLOORED, + "TRAIT_DAZED" = TRAIT_DAZED, "TRAIT_UNDENSE" = TRAIT_UNDENSE, "TRAIT_YAUTJA_TECH" = TRAIT_YAUTJA_TECH, "TRAIT_SUPER_STRONG" = TRAIT_SUPER_STRONG, @@ -336,6 +342,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_VULTURE_USER" = TRAIT_VULTURE_USER, "TRAIT_CLOAKED" = TRAIT_CLOAKED, ), +// /mob/living/carbon/human = list( +// ), /mob/living/carbon/xenomorph = list( "TRAIT_ABILITY_NO_PLASMA_TRANSFER" = TRAIT_ABILITY_NO_PLASMA_TRANSFER, "TRAIT_ABILITY_OVIPOSITOR" = TRAIT_ABILITY_OVIPOSITOR, @@ -403,6 +411,8 @@ GLOBAL_LIST(trait_name_map) #define TRAIT_SOURCE_JOB "t_s_job" ///Status trait forced by staff #define TRAIT_SOURCE_ADMIN "t_s_admin" +/// Status trait coming from a tutorial +#define TRAIT_SOURCE_TUTORIAL "t_s_tutorials" ///Status trait coming from equipment #define TRAIT_SOURCE_EQUIPMENT(slot) "t_s_equipment_[slot]" ///Status trait coming from skill @@ -411,6 +421,7 @@ GLOBAL_LIST(trait_name_map) #define TRAIT_SOURCE_ATTACHMENT(slot) "t_s_attachment_[slot]" ///Status trait coming from ability #define TRAIT_SOURCE_ABILITY(ability) "t_s_ability_[ability]" +#define TRAIT_SOURCE_LIMB(limb) "t_s_limb_[limb]" ///Status trait forced by the xeno action charge #define TRAIT_SOURCE_XENO_ACTION_CHARGE "t_s_xeno_action_charge" ///Status trait coming from a xeno nest diff --git a/code/__DEFINES/tutorial.dm b/code/__DEFINES/tutorial.dm new file mode 100644 index 000000000000..75dc7f6da21f --- /dev/null +++ b/code/__DEFINES/tutorial.dm @@ -0,0 +1,6 @@ +#define TUTORIAL_ATOM_FROM_TRACKING(path, varname) var##path/##varname = tracking_atoms[##path] + +#define TUTORIAL_CATEGORY_BASE "Base" // Shouldn't be used outside of base types +#define TUTORIAL_CATEGORY_SS13 "Space Station 13" +#define TUTORIAL_CATEGORY_MARINE "Marine" +#define TUTORIAL_CATEGORY_XENO "Xenomorph" diff --git a/code/__DEFINES/xeno.dm b/code/__DEFINES/xeno.dm index 630c9740dc80..e3a35d0c4744 100644 --- a/code/__DEFINES/xeno.dm +++ b/code/__DEFINES/xeno.dm @@ -177,6 +177,20 @@ /// The time until you can re-corrupt a comms relay after the last pylon was destroyed #define XENO_PYLON_DESTRUCTION_DELAY (5 MINUTES) +/// Evolution boost during hijack +#define XENO_HIJACK_EVILUTION_BUFF 10 + +/// For how long the buff lasts +#define XENO_HIJACK_EVILUTION_TIME (3 MINUTES) + +/// If this is marine to xeno ratio during hijack, xenos see marines on tacmap +#define HIJACK_RATIO_FOR_TACMAP 0.8 + +/// Xenos need to have their number to marines ratio lower than this to get larvae from pylons +#define ENDGAME_LARVA_CAP_MULTIPLIER 0.5 + +/// What percent of their numbers xeno get from pylons +#define LARVA_ADDITION_MULTIPLIER 0.10 /// The time against away_timer when an AFK xeno larva can be replaced #define XENO_LEAVE_TIMER_LARVA 80 //80 seconds @@ -250,11 +264,6 @@ #define XENO_PLASMA_TIER_8 800 * XENO_UNIVERSAL_PLASMAMULT #define XENO_PLASMA_TIER_10 1000 * XENO_UNIVERSAL_PLASMAMULT -// Resource stockpile bands -#define XENO_CRYSTAL_LOW 50 -#define XENO_CRYSTAL_MEDIUM 100 -#define XENO_CRYSTAL_HIGH 150 - // Plasma gain bands #define XENO_PLASMA_GAIN_TIER_1 1 #define XENO_PLASMA_GAIN_TIER_2 1.5 diff --git a/code/__HELPERS/filters.dm b/code/__HELPERS/filters.dm index aa8d77c81d3a..29e3ec9efb1e 100644 --- a/code/__HELPERS/filters.dm +++ b/code/__HELPERS/filters.dm @@ -46,7 +46,7 @@ GLOBAL_LIST_INIT(master_filter_info, list( "y" = -1, "size" = 1, "offset" = 0, - "color" = COLOUR_HALF_TRANSPARENT_BLACK + "color" = COLOR_HALF_TRANSPARENT_BLACK ) ), "blur" = list( diff --git a/code/__HELPERS/level_traits.dm b/code/__HELPERS/level_traits.dm index 01a972485fa2..8b3d1b0a3809 100644 --- a/code/__HELPERS/level_traits.dm +++ b/code/__HELPERS/level_traits.dm @@ -1,4 +1,3 @@ - #define is_admin_level(z) SSmapping.level_trait(z, ZTRAIT_ADMIN) #define is_ground_level(z) SSmapping.level_trait(z, ZTRAIT_GROUND) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 55b234b1e419..663d72fd5079 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -73,6 +73,7 @@ /mob/proc/change_real_name(mob/M, new_name) if(!new_name) return FALSE + var/old_name = M.real_name M.real_name = new_name M.name = new_name @@ -83,6 +84,7 @@ // If we are humans, we need to update our voice as well M.change_mob_voice(new_name) + SEND_SIGNAL(src, COMSIG_MOB_REAL_NAME_CHANGED, old_name, new_name) return TRUE /mob/proc/change_mind_name(new_mind_name) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 7425046da7c7..05fa7c69e50f 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -933,86 +933,103 @@ GLOBAL_DATUM(action_purple_power_up, /image) if(!GLOB.busy_indicator_clock) GLOB.busy_indicator_clock = image('icons/mob/mob.dmi', null, "busy_generic", "pixel_y" = 22) GLOB.busy_indicator_clock.layer = FLY_LAYER + GLOB.busy_indicator_clock.plane = ABOVE_HUD_PLANE return GLOB.busy_indicator_clock else if(busy_type == BUSY_ICON_MEDICAL) if(!GLOB.busy_indicator_medical) GLOB.busy_indicator_medical = image('icons/mob/mob.dmi', null, "busy_medical", "pixel_y" = 0) //This shows directly on top of the mob, no offset! GLOB.busy_indicator_medical.layer = FLY_LAYER + GLOB.busy_indicator_medical.plane = ABOVE_HUD_PLANE return GLOB.busy_indicator_medical else if(busy_type == BUSY_ICON_BUILD) if(!GLOB.busy_indicator_build) GLOB.busy_indicator_build = image('icons/mob/mob.dmi', null, "busy_build", "pixel_y" = 22) GLOB.busy_indicator_build.layer = FLY_LAYER + GLOB.busy_indicator_build.plane = ABOVE_HUD_PLANE return GLOB.busy_indicator_build else if(busy_type == BUSY_ICON_FRIENDLY) if(!GLOB.busy_indicator_friendly) GLOB.busy_indicator_friendly = image('icons/mob/mob.dmi', null, "busy_friendly", "pixel_y" = 22) GLOB.busy_indicator_friendly.layer = FLY_LAYER + GLOB.busy_indicator_friendly.plane = ABOVE_HUD_PLANE return GLOB.busy_indicator_friendly else if(busy_type == BUSY_ICON_HOSTILE) if(!GLOB.busy_indicator_hostile) GLOB.busy_indicator_hostile = image('icons/mob/mob.dmi', null, "busy_hostile", "pixel_y" = 22) GLOB.busy_indicator_hostile.layer = FLY_LAYER + GLOB.busy_indicator_hostile.plane = ABOVE_HUD_PLANE return GLOB.busy_indicator_hostile else if(busy_type == EMOTE_ICON_HIGHFIVE) if(!GLOB.emote_indicator_highfive) GLOB.emote_indicator_highfive = image('icons/mob/mob.dmi', null, "emote_highfive", "pixel_y" = 22) GLOB.emote_indicator_highfive.layer = FLY_LAYER + GLOB.emote_indicator_highfive.plane = ABOVE_HUD_PLANE return GLOB.emote_indicator_highfive else if(busy_type == EMOTE_ICON_FISTBUMP) if(!GLOB.emote_indicator_fistbump) GLOB.emote_indicator_fistbump = image('icons/mob/mob.dmi', null, "emote_fistbump", "pixel_y" = 22) GLOB.emote_indicator_fistbump.layer = FLY_LAYER + GLOB.emote_indicator_fistbump.plane = ABOVE_HUD_PLANE return GLOB.emote_indicator_fistbump else if(busy_type == EMOTE_ICON_ROCK_PAPER_SCISSORS) if(!GLOB.emote_indicator_rock_paper_scissors) GLOB.emote_indicator_rock_paper_scissors = image('icons/mob/mob.dmi', null, "emote_rps", "pixel_y" = 22) GLOB.emote_indicator_rock_paper_scissors.layer = FLY_LAYER + GLOB.emote_indicator_rock_paper_scissors.plane = ABOVE_HUD_PLANE return GLOB.emote_indicator_rock_paper_scissors else if(busy_type == EMOTE_ICON_ROCK) if(!GLOB.emote_indicator_rock) GLOB.emote_indicator_rock = image('icons/mob/mob.dmi', null, "emote_rock", "pixel_y" = 22) GLOB.emote_indicator_rock.layer = FLY_LAYER + GLOB.emote_indicator_rock.plane = ABOVE_HUD_PLANE return GLOB.emote_indicator_rock else if(busy_type == EMOTE_ICON_PAPER) if(!GLOB.emote_indicator_paper) GLOB.emote_indicator_paper = image('icons/mob/mob.dmi', null, "emote_paper", "pixel_y" = 22) GLOB.emote_indicator_paper.layer = FLY_LAYER + GLOB.emote_indicator_paper.plane = ABOVE_HUD_PLANE return GLOB.emote_indicator_paper else if(busy_type == EMOTE_ICON_SCISSORS) if(!GLOB.emote_indicator_scissors) GLOB.emote_indicator_scissors = image('icons/mob/mob.dmi', null, "emote_scissors", "pixel_y" = 22) GLOB.emote_indicator_scissors.layer = FLY_LAYER + GLOB.emote_indicator_scissors.plane = ABOVE_HUD_PLANE return GLOB.emote_indicator_scissors else if(busy_type == EMOTE_ICON_HEADBUTT) if(!GLOB.emote_indicator_headbutt) GLOB.emote_indicator_headbutt = image('icons/mob/mob.dmi', null, "emote_headbutt", "pixel_y" = 22) GLOB.emote_indicator_headbutt.layer = FLY_LAYER + GLOB.emote_indicator_headbutt.plane = ABOVE_HUD_PLANE return GLOB.emote_indicator_headbutt else if(busy_type == EMOTE_ICON_TAILSWIPE) if(!GLOB.emote_indicator_tailswipe) GLOB.emote_indicator_tailswipe = image('icons/mob/mob.dmi', null, "emote_tailswipe", "pixel_y" = 22) GLOB.emote_indicator_tailswipe.layer = FLY_LAYER + GLOB.emote_indicator_tailswipe.plane = ABOVE_HUD_PLANE return GLOB.emote_indicator_tailswipe else if(busy_type == ACTION_RED_POWER_UP) if(!GLOB.action_red_power_up) GLOB.action_red_power_up = image('icons/effects/effects.dmi', null, "anger", "pixel_x" = 16) GLOB.action_red_power_up.layer = FLY_LAYER + GLOB.action_red_power_up.plane = ABOVE_HUD_PLANE return GLOB.action_red_power_up else if(busy_type == ACTION_GREEN_POWER_UP) if(!GLOB.action_green_power_up) GLOB.action_green_power_up = image('icons/effects/effects.dmi', null, "vitality", "pixel_x" = 16) GLOB.action_green_power_up.layer = FLY_LAYER + GLOB.action_green_power_up.plane = ABOVE_HUD_PLANE return GLOB.action_green_power_up else if(busy_type == ACTION_BLUE_POWER_UP) if(!GLOB.action_blue_power_up) GLOB.action_blue_power_up = image('icons/effects/effects.dmi', null, "shock", "pixel_x" = 16) GLOB.action_blue_power_up.layer = FLY_LAYER + GLOB.action_blue_power_up.plane = ABOVE_HUD_PLANE return GLOB.action_blue_power_up else if(busy_type == ACTION_PURPLE_POWER_UP) if(!GLOB.action_purple_power_up) GLOB.action_purple_power_up = image('icons/effects/effects.dmi', null, "pain", "pixel_x" = 16) GLOB.action_purple_power_up.layer = FLY_LAYER + GLOB.action_purple_power_up.plane = ABOVE_HUD_PLANE return GLOB.action_purple_power_up @@ -1125,7 +1142,7 @@ GLOBAL_DATUM(action_purple_power_up, /image) ) . = FALSE break - if(user_flags & INTERRUPT_DAZED && busy_user.dazed) + if(user_flags & INTERRUPT_DAZED && HAS_TRAIT(busy_user, TRAIT_DAZED)) . = FALSE break if(user_flags & INTERRUPT_EMOTE && !busy_user.flags_emote) @@ -2088,3 +2105,15 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( if(NORTHWEST) return list(NORTHWEST, NORTH, WEST) + +/// Returns TRUE if the target is somewhere that the game should not interact with if possible +/// In this case, admin Zs and tutorial areas +/proc/should_block_game_interaction(atom/target) + if(is_admin_level(target.z)) + return TRUE + + var/area/target_area = get_area(target) + if(target_area?.block_game_interaction) + return TRUE + + return FALSE diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index d302191c67eb..59d14f2e0fed 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -87,6 +87,7 @@ DEFINE_BITFIELD(flags_ammo_behaviour, list( "AMMO_IGNORE_RESIST" = AMMO_IGNORE_RESIST, "AMMO_BALLISTIC" = AMMO_BALLISTIC, "AMMO_IGNORE_COVER" = AMMO_IGNORE_COVER, + "AMMO_ANTIVEHICLE" = AMMO_ANTIVEHICLE, "AMMO_STOPPED_BY_COVER" = AMMO_STOPPED_BY_COVER, "AMMO_SPECIAL_EMBED" = AMMO_SPECIAL_EMBED, "AMMO_STRIKES_SURFACE" = AMMO_STRIKES_SURFACE, @@ -97,7 +98,6 @@ DEFINE_BITFIELD(flags_ammo_behaviour, list( "AMMO_FLAME" = AMMO_FLAME, )) - DEFINE_BITFIELD(projectile_flags, list( "PROJECTILE_SHRAPNEL" = PROJECTILE_SHRAPNEL, "PROJECTILE_BULLSEYE" = PROJECTILE_BULLSEYE, @@ -120,6 +120,7 @@ DEFINE_BITFIELD(flags_gun_features, list( "GUN_ANTIQUE" = GUN_ANTIQUE, "GUN_RECOIL_BUILDUP" = GUN_RECOIL_BUILDUP, "GUN_SUPPORT_PLATFORM" = GUN_SUPPORT_PLATFORM, + "GUN_NO_DESCRIPTION" = GUN_NO_DESCRIPTION, )) DEFINE_BITFIELD(flags_magazine, list( @@ -150,6 +151,7 @@ DEFINE_BITFIELD(flags_atom, list( "INITIALIZED" = INITIALIZED, "ATOM_DECORATED" = ATOM_DECORATED, "USES_HEARING" = USES_HEARING, + "HTML_USE_INITAL_ICON" = HTML_USE_INITAL_ICON, )) DEFINE_BITFIELD(flags_item, list( @@ -181,7 +183,7 @@ DEFINE_BITFIELD(flags_inv_hide, list( "HIDETOPHAIR" = HIDETOPHAIR, "HIDEALLHAIR" = HIDEALLHAIR, "HIDETAIL" = HIDETAIL, - "HIDEFACE" = HIDEFACE + "HIDEFACE" = HIDEFACE, )) DEFINE_BITFIELD(flags_inventory, list( @@ -327,9 +329,6 @@ DEFINE_BITFIELD(flags_area, list( DEFINE_BITFIELD(disabilities, list( "NEARSIGHTED" = NEARSIGHTED, - "EPILEPSY" = EPILEPSY, - "COUGHING" = COUGHING, - "TOURETTES" = TOURETTES, "NERVOUS" = NERVOUS, "OPIATE_RECEPTOR_DEFICIENCY" = OPIATE_RECEPTOR_DEFICIENCY, )) @@ -423,6 +422,7 @@ DEFINE_BITFIELD(toggleable_flags, list( "MODE_NO_COMBAT_CAS" = MODE_NO_COMBAT_CAS, "MODE_LZ_PROTECTION" = MODE_LZ_PROTECTION, "MODE_SHIPSIDE_SD" = MODE_SHIPSIDE_SD, + "MODE_HARDCORE_PERMA" = MODE_HARDCORE_PERMA, "MODE_DISPOSABLE_MOBS" = MODE_DISPOSABLE_MOBS, "MODE_BYPASS_JOE" = MODE_BYPASS_JOE, )) @@ -456,7 +456,9 @@ DEFINE_BITFIELD(fire_immunity, list( "FIRE_IMMUNITY_NO_DAMAGE" = FIRE_IMMUNITY_NO_DAMAGE, "FIRE_IMMUNITY_NO_IGNITE" = FIRE_IMMUNITY_NO_IGNITE, "FIRE_IMMUNITY_XENO_FRENZY" = FIRE_IMMUNITY_XENO_FRENZY, + "FIRE_VULNERABILITY" = FIRE_VULNERABILITY, )) + DEFINE_BITFIELD(vend_flags, list( "VEND_TO_HAND" = VEND_TO_HAND, "VEND_UNIFORM_RANKS" = VEND_UNIFORM_RANKS, @@ -478,3 +480,122 @@ DEFINE_BITFIELD(vehicle_flags, list( "VEHICLE_CLASS_HEAVY" = VEHICLE_CLASS_HEAVY, "VEHICLE_BYPASS_BLOCKERS" = VEHICLE_BYPASS_BLOCKERS, )) + +DEFINE_BITFIELD(flags_pass, list( + "PASS_THROUGH" = PASS_THROUGH, + "PASS_AROUND" = PASS_AROUND, + "PASS_OVER_THROW_ITEM" = PASS_OVER_THROW_ITEM, + "PASS_OVER_THROW_MOB" = PASS_OVER_THROW_MOB, + "PASS_OVER_FIRE" = PASS_OVER_FIRE, + "PASS_OVER_ACID_SPRAY" = PASS_OVER_ACID_SPRAY, + "PASS_UNDER" = PASS_UNDER, + "PASS_GLASS" = PASS_GLASS, + "PASS_MOB_IS_XENO" = PASS_MOB_IS_XENO, + "PASS_MOB_IS_HUMAN" = PASS_MOB_IS_HUMAN, + "PASS_MOB_IS_OTHER" = PASS_MOB_IS_OTHER, + "PASS_MOB_THRU_XENO" = PASS_MOB_THRU_XENO, + "PASS_MOB_THRU_HUMAN" = PASS_MOB_THRU_HUMAN, + "PASS_MOB_THRU_OTHER" = PASS_MOB_THRU_OTHER, + "PASS_TYPE_CRAWLER" = PASS_TYPE_CRAWLER, + "PASS_HIGH_OVER_ONLY" = PASS_HIGH_OVER_ONLY, + "PASS_BUILDING_ONLY" = PASS_BUILDING_ONLY, + "PASS_CRUSHER_CHARGE" = PASS_CRUSHER_CHARGE, +)) + +DEFINE_BITFIELD(flags_can_pass_all, list( + "PASS_THROUGH" = PASS_THROUGH, + "PASS_AROUND" = PASS_AROUND, + "PASS_OVER_THROW_ITEM" = PASS_OVER_THROW_ITEM, + "PASS_OVER_THROW_MOB" = PASS_OVER_THROW_MOB, + "PASS_OVER_FIRE" = PASS_OVER_FIRE, + "PASS_OVER_ACID_SPRAY" = PASS_OVER_ACID_SPRAY, + "PASS_UNDER" = PASS_UNDER, + "PASS_GLASS" = PASS_GLASS, + "PASS_MOB_IS_XENO" = PASS_MOB_IS_XENO, + "PASS_MOB_IS_HUMAN" = PASS_MOB_IS_HUMAN, + "PASS_MOB_IS_OTHER" = PASS_MOB_IS_OTHER, + "PASS_MOB_THRU_XENO" = PASS_MOB_THRU_XENO, + "PASS_MOB_THRU_HUMAN" = PASS_MOB_THRU_HUMAN, + "PASS_MOB_THRU_OTHER" = PASS_MOB_THRU_OTHER, + "PASS_TYPE_CRAWLER" = PASS_TYPE_CRAWLER, + "PASS_HIGH_OVER_ONLY" = PASS_HIGH_OVER_ONLY, + "PASS_BUILDING_ONLY" = PASS_BUILDING_ONLY, + "PASS_CRUSHER_CHARGE" = PASS_CRUSHER_CHARGE, +)) + +DEFINE_BITFIELD(flags_can_pass_front, list( + "PASS_THROUGH" = PASS_THROUGH, + "PASS_AROUND" = PASS_AROUND, + "PASS_OVER_THROW_ITEM" = PASS_OVER_THROW_ITEM, + "PASS_OVER_THROW_MOB" = PASS_OVER_THROW_MOB, + "PASS_OVER_FIRE" = PASS_OVER_FIRE, + "PASS_OVER_ACID_SPRAY" = PASS_OVER_ACID_SPRAY, + "PASS_UNDER" = PASS_UNDER, + "PASS_GLASS" = PASS_GLASS, + "PASS_MOB_IS_XENO" = PASS_MOB_IS_XENO, + "PASS_MOB_IS_HUMAN" = PASS_MOB_IS_HUMAN, + "PASS_MOB_IS_OTHER" = PASS_MOB_IS_OTHER, + "PASS_MOB_THRU_XENO" = PASS_MOB_THRU_XENO, + "PASS_MOB_THRU_HUMAN" = PASS_MOB_THRU_HUMAN, + "PASS_MOB_THRU_OTHER" = PASS_MOB_THRU_OTHER, + "PASS_TYPE_CRAWLER" = PASS_TYPE_CRAWLER, + "PASS_HIGH_OVER_ONLY" = PASS_HIGH_OVER_ONLY, + "PASS_BUILDING_ONLY" = PASS_BUILDING_ONLY, + "PASS_CRUSHER_CHARGE" = PASS_CRUSHER_CHARGE, +)) + +DEFINE_BITFIELD(flags_can_pass_behind, list( + "PASS_THROUGH" = PASS_THROUGH, + "PASS_AROUND" = PASS_AROUND, + "PASS_OVER_THROW_ITEM" = PASS_OVER_THROW_ITEM, + "PASS_OVER_THROW_MOB" = PASS_OVER_THROW_MOB, + "PASS_OVER_FIRE" = PASS_OVER_FIRE, + "PASS_OVER_ACID_SPRAY" = PASS_OVER_ACID_SPRAY, + "PASS_UNDER" = PASS_UNDER, + "PASS_GLASS" = PASS_GLASS, + "PASS_MOB_IS_XENO" = PASS_MOB_IS_XENO, + "PASS_MOB_IS_HUMAN" = PASS_MOB_IS_HUMAN, + "PASS_MOB_IS_OTHER" = PASS_MOB_IS_OTHER, + "PASS_MOB_THRU_XENO" = PASS_MOB_THRU_XENO, + "PASS_MOB_THRU_HUMAN" = PASS_MOB_THRU_HUMAN, + "PASS_MOB_THRU_OTHER" = PASS_MOB_THRU_OTHER, + "PASS_TYPE_CRAWLER" = PASS_TYPE_CRAWLER, + "PASS_HIGH_OVER_ONLY" = PASS_HIGH_OVER_ONLY, + "PASS_BUILDING_ONLY" = PASS_BUILDING_ONLY, + "PASS_CRUSHER_CHARGE" = PASS_CRUSHER_CHARGE, +)) + +DEFINE_BITFIELD(sight, list( + "BLIND" = BLIND, + "SEE_BLACKNESS" = SEE_BLACKNESS, + "SEE_INFRA" = SEE_INFRA, + "SEE_MOBS" = SEE_MOBS, + "SEE_OBJS" = SEE_OBJS, + "SEE_PIXELS" = SEE_PIXELS, + "SEE_SELF" = SEE_SELF, + "SEE_THRU" = SEE_THRU, + "SEE_TURFS" = SEE_TURFS, +)) + +DEFINE_BITFIELD(vision_flags, list( + "BLIND" = BLIND, + "SEE_BLACKNESS" = SEE_BLACKNESS, + "SEE_INFRA" = SEE_INFRA, + "SEE_MOBS" = SEE_MOBS, + "SEE_OBJS" = SEE_OBJS, + "SEE_PIXELS" = SEE_PIXELS, + "SEE_SELF" = SEE_SELF, + "SEE_THRU" = SEE_THRU, + "SEE_TURFS" = SEE_TURFS, +)) + +DEFINE_BITFIELD(vis_flags, list( + "VIS_HIDE" = VIS_HIDE, + "VIS_INHERIT_DIR" = VIS_INHERIT_DIR, + "VIS_INHERIT_ICON" = VIS_INHERIT_ICON, + "VIS_INHERIT_ICON_STATE" = VIS_INHERIT_ICON_STATE, + "VIS_INHERIT_ID" = VIS_INHERIT_ID, + "VIS_INHERIT_LAYER" = VIS_INHERIT_LAYER, + "VIS_INHERIT_PLANE" = VIS_INHERIT_PLANE, + "VIS_UNDERLAY" = VIS_UNDERLAY, +)) diff --git a/code/_onclick/hud/map_popups.dm b/code/_onclick/hud/map_popups.dm index aed6b46a7905..26dc93bbff2b 100644 --- a/code/_onclick/hud/map_popups.dm +++ b/code/_onclick/hud/map_popups.dm @@ -118,10 +118,11 @@ * anyway. they're effectively qdel'd. */ /client/proc/clear_map(map_name) - if(!map_name || !(map_name in screen_maps)) + if(!map_name || !screen_maps[map_name]) return FALSE for(var/atom/movable/screen/screen_obj in screen_maps[map_name]) screen_maps[map_name] -= screen_obj + remove_from_screen(screen_obj) if(screen_obj.del_on_map_removal) qdel(screen_obj) screen_maps -= map_name diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index c6052da33199..8d77920a59cc 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -3,6 +3,7 @@ /obj/item/proc/attack_self(mob/user) SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) + SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK_SELF, src) if(flags_item & CAN_DIG_SHRAPNEL && ishuman(user)) dig_out_shrapnel(user) @@ -11,6 +12,7 @@ /atom/proc/attackby(obj/item/W, mob/living/user,list/mods) if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, mods) & COMPONENT_NO_AFTERATTACK) return TRUE + SEND_SIGNAL(user, COMSIG_MOB_PARENT_ATTACKBY, src, W) return FALSE /atom/movable/attackby(obj/item/W, mob/living/user) diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index f87778355755..21dd804f09c4 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -29,7 +29,7 @@ if(ismob(target) || isVehicle(target)) if(isxeno(target) && SSticker.mode.check_xeno_late_join(src)) //if it's a xeno and all checks are alright, we are gonna try to take their body var/mob/living/carbon/xenomorph/xeno = target - if(xeno.stat == DEAD || is_admin_level(xeno.z) || xeno.aghosted) + if(xeno.stat == DEAD || should_block_game_interaction(xeno) || xeno.aghosted) to_chat(src, SPAN_WARNING("You cannot join as [xeno].")) do_observe(xeno) return FALSE diff --git a/code/_onclick/xeno.dm b/code/_onclick/xeno.dm index cc785f32f426..ad4ba9d72546 100644 --- a/code/_onclick/xeno.dm +++ b/code/_onclick/xeno.dm @@ -111,7 +111,7 @@ so that it doesn't double up on the delays) so that it applies the delay immedia if(alt_pressed && shift_pressed) if(istype(target, /mob/living/carbon/xenomorph)) var/mob/living/carbon/xenomorph/xeno = target - if(!QDELETED(xeno) && xeno.stat != DEAD && !is_admin_level(xeno.z) && xeno.check_state(TRUE) && xeno.hivenumber == hivenumber) + if(!QDELETED(xeno) && xeno.stat != DEAD && !should_block_game_interaction(xeno) && xeno.check_state(TRUE) && xeno.hivenumber == hivenumber) overwatch(xeno) next_move = world.time + 3 // Some minimal delay so this isn't crazy spammy return TRUE diff --git a/code/controllers/subsystem/minimap.dm b/code/controllers/subsystem/minimap.dm index a808e7e3fd85..f3b141c0d9f8 100644 --- a/code/controllers/subsystem/minimap.dm +++ b/code/controllers/subsystem/minimap.dm @@ -691,6 +691,11 @@ SUBSYSTEM_DEF(minimaps) if(faction == FACTION_NEUTRAL && isobserver(user)) faction = allowed_flags == MINIMAP_FLAG_XENO ? XENO_HIVE_NORMAL : FACTION_MARINE + if(is_xeno && xeno.hive.see_humans_on_tacmap && targeted_ztrait != ZTRAIT_MARINE_MAIN_SHIP) + allowed_flags |= MINIMAP_FLAG_USCM|MINIMAP_FLAG_PMC|MINIMAP_FLAG_UPP|MINIMAP_FLAG_CLF + targeted_ztrait = ZTRAIT_MARINE_MAIN_SHIP + map_holder = null + new_current_map = get_unannounced_tacmap_data_png(faction) old_map = get_tacmap_data_png(faction) current_svg = get_tacmap_data_svg(faction) diff --git a/code/controllers/subsystem/techtree.dm b/code/controllers/subsystem/techtree.dm index 04ac2591bc15..5f22373228f0 100644 --- a/code/controllers/subsystem/techtree.dm +++ b/code/controllers/subsystem/techtree.dm @@ -34,17 +34,6 @@ SUBSYSTEM_DEF(techtree) var/datum/space_level/zpos = SSmapping.add_new_zlevel(tree.name, list(ZTRAIT_TECHTREE)) tree.zlevel = zpos - var/zlevel = zpos.z_value - var/turf/z_min = locate(1, 1, zlevel) - var/turf/z_max = locate(world.maxx, world.maxy, zlevel) - - - - for(var/t in block(z_min, z_max)) - var/turf/Tu = t - Tu.ChangeTurf(/turf/closed/void, list(/turf/closed/void)) - new /area/techtree(Tu) - for(var/tier in tree.tree_tiers) tree.unlocked_techs += tier tree.all_techs += tier diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index c6d6f008acd6..2e11ba8a96cb 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -46,6 +46,7 @@ SUBSYSTEM_DEF(ticker) var/totalPlayers = 0 //used for pregame stats on statpanel var/totalPlayersReady = 0 //used for pregame stats on statpanel + var/tutorial_disabled = FALSE //zonenote /datum/controller/subsystem/ticker/Initialize(timeofday) load_mode() diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 79bd10c65736..104bb838bbcf 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -360,7 +360,7 @@ SUBSYSTEM_DEF(vote) log_vote(text) var/vp = CONFIG_GET(number/vote_period) SEND_SOUND(world, sound(vote_sound, channel = SOUND_CHANNEL_VOX, volume = vote_sound_vol)) - to_chat(world, SPAN_CENTERBOLD("

[text]
Type vote or click here to place your votes.
You have [DisplayTimeText(vp)] to vote.


")) + to_chat(world, SPAN_CENTERBOLD("

[text]
Type vote or click here to place your votes.
You have [DisplayTimeText(vp)] to vote.


")) time_remaining = round(vp/10) for(var/c in GLOB.clients) var/client/C = c diff --git a/code/controllers/subsystem/x_evolution.dm b/code/controllers/subsystem/x_evolution.dm index be787b37de80..2232147d2eb8 100644 --- a/code/controllers/subsystem/x_evolution.dm +++ b/code/controllers/subsystem/x_evolution.dm @@ -11,6 +11,7 @@ SUBSYSTEM_DEF(xevolution) var/time_ratio_modifier = 0.4 var/list/boost_power = list() + var/list/overridden_power = list() var/force_boost_power = FALSE // Debugging only /datum/controller/subsystem/xevolution/Initialize(start_timeofday) @@ -18,6 +19,7 @@ SUBSYSTEM_DEF(xevolution) for(var/hivenumber in GLOB.hive_datum) HS = GLOB.hive_datum[hivenumber] boost_power[HS.hivenumber] = 1 + overridden_power[HS.hivenumber] = FALSE return SS_INIT_SUCCESS /datum/controller/subsystem/xevolution/fire(resumed = FALSE) @@ -27,6 +29,9 @@ SUBSYSTEM_DEF(xevolution) if(!HS) continue + if(overridden_power[HS.hivenumber]) + continue + if(!HS.dynamic_evolution) boost_power[HS.hivenumber] = HS.evolution_rate + HS.evolution_bonus HS.hive_ui.update_burrowed_larva() @@ -54,6 +59,12 @@ SUBSYSTEM_DEF(xevolution) /datum/controller/subsystem/xevolution/proc/get_evolution_boost_power(hivenumber) return boost_power[hivenumber] +/datum/controller/subsystem/xevolution/proc/override_power(hivenumber, power, override) + var/datum/hive_status/hive_status = GLOB.hive_datum[hivenumber] + boost_power[hivenumber] = power + overridden_power[hivenumber] = override + hive_status.hive_ui.update_burrowed_larva() + #undef EVOLUTION_INCREMENT_TIME #undef BOOST_POWER_MIN #undef BOOST_POWER_MAX diff --git a/code/datums/action.dm b/code/datums/action.dm index 0510a43415a7..3a597ad262b1 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -11,9 +11,9 @@ var/cost = 0 // By default an action has no cost -> will be utilized by skill actions/xeno actions var/action_flags = 0 // Check out __game.dm for flags /// Whether the action is hidden from its owner - /// Useful for when you want to preserve action state while preventing - /// a mob from using said action - var/hidden = FALSE + var/hidden = FALSE //Preserve action state while preventing mob from using action + ///Hide the action from the owner without preventing them from using it (incase of keybind listen_signal) + var/player_hidden = FALSE var/unique = TRUE /// A signal on the mob that will cause the action to activate var/listen_signal @@ -227,7 +227,7 @@ var/atom/movable/screen/action_button/B = A.button if(reload_screen) client.add_to_screen(B) - if(A.hidden) + if(A.hidden || A.player_hidden) B.screen_loc = null continue button_number++ diff --git a/code/datums/ammo/ammo.dm b/code/datums/ammo/ammo.dm index 48a387e54d20..7a4006deee73 100644 --- a/code/datums/ammo/ammo.dm +++ b/code/datums/ammo/ammo.dm @@ -106,7 +106,7 @@ SHOULD_NOT_SLEEP(TRUE) return -/datum/ammo/proc/on_embed(mob/embedded_mob, obj/limb/target_organ) +/datum/ammo/proc/on_embed(mob/embedded_mob, obj/limb/target_organ, silent = FALSE) return /datum/ammo/proc/do_at_max_range(obj/projectile/P) diff --git a/code/datums/ammo/misc.dm b/code/datums/ammo/misc.dm index 607a6e517a7c..3aaba8443efb 100644 --- a/code/datums/ammo/misc.dm +++ b/code/datums/ammo/misc.dm @@ -178,7 +178,7 @@ accurate_range = 12 shell_speed = AMMO_SPEED_TIER_1 -/datum/ammo/souto/on_embed(mob/embedded_mob, obj/limb/target_organ) +/datum/ammo/souto/on_embed(mob/embedded_mob, obj/limb/target_organ, silent = FALSE) if(ishuman(embedded_mob) && !isyautja(embedded_mob)) if(istype(target_organ)) target_organ.embed(new can_type) diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index 00a5e86b5d60..9bc5b019b5cd 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -194,7 +194,7 @@ get_new_turfs() -///Adds the luminosity and source for the afected movable atoms to keep track of their visibility. +///Adds the luminosity and source for the affected movable atoms to keep track of their visibility. /datum/component/overlay_lighting/proc/add_dynamic_lumi() LAZYSET(current_holder.affected_movable_lights, src, lumcount_range + 1) current_holder.underlays += visible_mask @@ -202,7 +202,7 @@ if(directional) current_holder.underlays += cone -///Removes the luminosity and source for the afected movable atoms to keep track of their visibility. +///Removes the luminosity and source for the affected movable atoms to keep track of their visibility. /datum/component/overlay_lighting/proc/remove_dynamic_lumi() LAZYREMOVE(current_holder.affected_movable_lights, src) current_holder.underlays -= visible_mask @@ -262,6 +262,9 @@ ///Used to determine the new valid current_holder from the parent's loc. /datum/component/overlay_lighting/proc/check_holder() var/atom/movable/movable_parent = GET_PARENT + if(QDELETED(movable_parent)) + set_holder(null) + return if(isturf(movable_parent.loc)) set_holder(movable_parent) return @@ -270,13 +273,21 @@ set_holder(null) return if(isturf(inside.loc)) - set_holder(inside) + // storage items block light, also don't be moving into a qdeleted item + if(QDELETED(inside) || istype(inside, /obj/item/storage)) + set_holder(null) + else + set_holder(inside) return set_holder(null) ///Called when the current_holder is qdeleted, to remove the light effect. /datum/component/overlay_lighting/proc/on_holder_qdel(atom/movable/source, force) + SIGNAL_HANDLER + if(QDELETED(current_holder)) + set_holder(null) + return UnregisterSignal(current_holder, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED)) if(directional) UnregisterSignal(current_holder, COMSIG_ATOM_DIR_CHANGE) @@ -285,6 +296,7 @@ ///Called when current_holder changes loc. /datum/component/overlay_lighting/proc/on_holder_moved(atom/movable/source, OldLoc, Dir, Forced) + SIGNAL_HANDLER if(!(overlay_lighting_flags & LIGHTING_ON)) return make_luminosity_update() @@ -443,8 +455,7 @@ . = lum_power lum_power = new_lum_power var/difference = . - lum_power - for(var/t in affected_turfs) - var/turf/lit_turf = t + for(var/turf/lit_turf as anything in affected_turfs) lit_turf.dynamic_lumcount -= difference ///Here we append the behavior associated to changing lum_power. diff --git a/code/datums/components/tutorial_status.dm b/code/datums/components/tutorial_status.dm new file mode 100644 index 000000000000..97b8d408bcb5 --- /dev/null +++ b/code/datums/components/tutorial_status.dm @@ -0,0 +1,25 @@ +/datum/component/tutorial_status + dupe_mode = COMPONENT_DUPE_UNIQUE + /// What the mob's current tutorial status is, displayed in the status panel + var/tutorial_status = "" + +/datum/component/tutorial_status/Initialize() + . = ..() + if(!ismob(parent)) + return COMPONENT_INCOMPATIBLE + +/datum/component/tutorial_status/RegisterWithParent() + ..() + RegisterSignal(parent, COMSIG_MOB_TUTORIAL_UPDATE_OBJECTIVE, PROC_REF(update_objective)) + RegisterSignal(parent, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(get_status_tab_item)) + +/datum/component/tutorial_status/proc/update_objective(datum/source, objective_text) + SIGNAL_HANDLER + + tutorial_status = objective_text + +/datum/component/tutorial_status/proc/get_status_tab_item(datum/source, list/status_tab_items) + SIGNAL_HANDLER + + if(tutorial_status) + status_tab_items += "Tutorial Objective: " + tutorial_status diff --git a/code/datums/components/weed_food.dm b/code/datums/components/weed_food.dm index 2335a053412f..400c2f15cf9a 100644 --- a/code/datums/components/weed_food.dm +++ b/code/datums/components/weed_food.dm @@ -90,6 +90,7 @@ RegisterSignal(parent_mob, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) RegisterSignal(parent_mob, list(COMSIG_LIVING_REJUVENATED, COMSIG_HUMAN_REVIVED), PROC_REF(on_rejuv)) RegisterSignal(parent_mob, COMSIG_HUMAN_SET_UNDEFIBBABLE, PROC_REF(on_update)) + RegisterSignal(SSdcs, COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING, PROC_REF(on_forsaken)) if(parent_turf) RegisterSignal(parent_turf, COMSIG_WEEDNODE_GROWTH, PROC_REF(on_update)) @@ -109,6 +110,7 @@ UnregisterSignal(parent_buckle, COSMIG_OBJ_AFTER_BUCKLE) if(parent_nest) UnregisterSignal(parent_nest, COMSIG_PARENT_QDELETING) + UnregisterSignal(SSdcs, COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING) /// SIGNAL_HANDLER for COMSIG_MOVABLE_MOVED /datum/component/weed_food/proc/on_move() @@ -178,6 +180,20 @@ UnregisterSignal(parent_nest, COMSIG_PARENT_QDELETING) parent_nest = null +/// SIGNAL_HANDLER for COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING +/datum/component/weed_food/proc/on_forsaken() + SIGNAL_HANDLER + + UnregisterSignal(SSdcs, COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING) + + if(!merged) + return + if(!is_ground_level(parent_mob.z)) + return + + var/datum/hive_status/hive = GLOB.hive_datum[XENO_HIVE_FORSAKEN] + weed_appearance.color = hive.color + /** * Try to start the process to turn into weeds * Returns TRUE if started successfully diff --git a/code/datums/construction/construction_template.dm b/code/datums/construction/construction_template.dm index 0b874def4495..37832327c381 100644 --- a/code/datums/construction/construction_template.dm +++ b/code/datums/construction/construction_template.dm @@ -14,8 +14,8 @@ var/pixel_y = -16 var/pixel_x = -16 - var/crystals_required = 0 - var/crystals_stored = 0 + var/plasma_required = 0 + var/plasma_stored = 0 var/materials_required = list() //Example resource requirements i.e. MATERIAL_METAL = 1 var/extras_required = list() //Example extra requirements i.e. /obj/item = 1 @@ -43,47 +43,23 @@ return if(!xeno.plasma_max) return - if(crystals_stored >= crystals_required) + if(plasma_stored >= plasma_required) to_chat(xeno, SPAN_WARNING("\The [name] does not require plasma.")) return - to_chat(xeno, SPAN_NOTICE("You begin adding \the plasma to \the [name].")) + to_chat(xeno, SPAN_NOTICE("We begin adding \the plasma to \the [name].")) xeno_attack_delay(xeno) if(!do_after(xeno, 40, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return //double-check amount required - if(crystals_stored >= crystals_required) + if(plasma_stored >= plasma_required) to_chat(xeno, SPAN_WARNING("\The [name] has enough plasma.")) return - var/amount_to_use = min(xeno.plasma_stored, (crystals_required - crystals_stored)) - crystals_stored += amount_to_use + var/amount_to_use = min(xeno.plasma_stored, (plasma_required - plasma_stored)) + plasma_stored += amount_to_use xeno.plasma_stored -= amount_to_use - to_chat(xeno, SPAN_WARNING("\The [name] requires [crystals_required - crystals_stored] more plasma.")) + to_chat(xeno, SPAN_WARNING("\The [name] requires [plasma_required - plasma_stored] more plasma.")) check_completion() -// Xeno ressource collection -/* -/datum/construction_template/proc/add_crystal(mob/living/carbon/xenomorph/M) - if(!istype(M)) - return - if(!M.crystal_stored) - to_chat(M, SPAN_WARNING("You have no [MATERIAL_CRYSTAL] stored.")) - return - if(crystals_stored >= crystals_required) - to_chat(M, SPAN_WARNING("\The [name] does not require [MATERIAL_CRYSTAL].")) - return - to_chat(M, SPAN_NOTICE("You begin adding \the [MATERIAL_CRYSTAL] to \the [name].")) - if(!do_after(M, 40, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - return - //double-check amount required - if(crystals_stored >= crystals_required) - to_chat(M, SPAN_WARNING("\The [name] has enough [MATERIAL_CRYSTAL].")) - return - var/amount_to_use = min(M.crystal_stored, (crystals_required - crystals_stored)) - crystals_stored += amount_to_use - M.crystal_stored -= amount_to_use - to_chat(M, SPAN_WARNING("\The [name] requires [crystals_required - crystals_stored] more [MATERIAL_CRYSTAL].")) - check_completion() */ - /datum/construction_template/proc/add_material(mob/user, obj/item/I) if(isStack(I)) var/obj/item/stack/S = I @@ -123,7 +99,7 @@ check_completion() /datum/construction_template/proc/check_completion() - if(crystals_stored < crystals_required) + if(plasma_stored < plasma_required) return FALSE for(var/material_req in materials_required) if(materials_required[material_req] > 0) diff --git a/code/datums/construction/xenomorph/construction_template_xenomorph.dm b/code/datums/construction/xenomorph/construction_template_xenomorph.dm index 0bddbeecf359..94914eb1e9ce 100644 --- a/code/datums/construction/xenomorph/construction_template_xenomorph.dm +++ b/code/datums/construction/xenomorph/construction_template_xenomorph.dm @@ -3,7 +3,7 @@ /datum/construction_template/xenomorph name = "xenomorph structure" build_type = /obj/effect/alien/resin/special - crystals_required = 45 * XENO_STRUCTURE_PLASMA_MULTIPLIER + plasma_required = 45 * XENO_STRUCTURE_PLASMA_MULTIPLIER /// The hive that this structure belongs to. var/datum/hive_status/hive_ref /// The range around this structure which needs to be clear for it to be constructed. @@ -29,7 +29,7 @@ description = "Heart of the hive, grows hive weeds (which are necessary for other structures), stores larva, spawns lesser drones, and protects the hive from skyfire." build_type = /obj/effect/alien/resin/special/pylon/core build_icon_state = "core" - crystals_required = 100 * XENO_STRUCTURE_PLASMA_MULTIPLIER + plasma_required = 100 * XENO_STRUCTURE_PLASMA_MULTIPLIER block_range = 0 /datum/construction_template/xenomorph/cluster @@ -39,7 +39,7 @@ build_icon_state = "hive_cluster" pixel_y = -8 pixel_x = -8 - crystals_required = 50 * XENO_STRUCTURE_PLASMA_MULTIPLIER + plasma_required = 50 * XENO_STRUCTURE_PLASMA_MULTIPLIER block_range = 0 /datum/construction_template/xenomorph/cluster/set_structure_image() @@ -50,7 +50,7 @@ description = "Remote section of the hive, grows hive weeds, spawns lesser drones, and protects sisters from air strikes." build_type = /obj/effect/alien/resin/special/pylon build_icon_state = "pylon" - crystals_required = 100 * XENO_STRUCTURE_PLASMA_MULTIPLIER + plasma_required = 100 * XENO_STRUCTURE_PLASMA_MULTIPLIER block_range = 0 /datum/construction_template/xenomorph/eggmorph diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 933b547aa1f2..ae19a3044678 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -206,8 +206,8 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) sleep(40) var/list/jobs_to_check = GLOB.ROLES_CIC + GLOB.ROLES_AUXIL_SUPPORT + GLOB.ROLES_MISC + GLOB.ROLES_POLICE + GLOB.ROLES_ENGINEERING + GLOB.ROLES_REQUISITION + GLOB.ROLES_MEDICAL + GLOB.ROLES_MARINES - for(var/mob/living/carbon/human/H in GLOB.human_mob_list) - if(is_admin_level(H.z)) + for(var/mob/living/carbon/human/H as anything in GLOB.human_mob_list) + if(should_block_game_interaction(H)) continue if(H.job in jobs_to_check) manifest_inject(H) diff --git a/code/datums/diseases/black_goo.dm b/code/datums/diseases/black_goo.dm index 7ee83f4def9c..183cdadf17aa 100644 --- a/code/datums/diseases/black_goo.dm +++ b/code/datums/diseases/black_goo.dm @@ -1,4 +1,12 @@ //Disease Datum +#define ZOMBIE_INFECTION_STAGE_ONE 1 +#define ZOMBIE_INFECTION_STAGE_TWO 2 +#define ZOMBIE_INFECTION_STAGE_THREE 3 +#define SLOW_INFECTION_RATE 1 +#define FAST_INFECTION_RATE 7 +#define STAGE_LEVEL_THRESHOLD 360 +#define MESSAGE_COOLDOWN_TIME 1 MINUTES + /datum/disease/black_goo name = "Black Goo" max_stages = 3 @@ -16,117 +24,117 @@ longevity = 500 //the virus tend to die before the dead is turn into zombie this should fix it. stage_prob = 0//no randomness - /// whether we're currently transforming the host into a zombie. - var/zombie_transforming = 0 - /// tells a dead infectee their stage, so they can know when-abouts they'll revive + /// boolean value to determine if the mob is currently transforming into a zombie. + var/zombie_is_transforming = FALSE + + /// variable to keep track of the stage level, used to prevent the stage message from being displayed more than once for any given stage. var/stage_counter = 0 //new variables to handle infection progression inside a stage. - /// variable that contain accumulated virus progression for an host. + /// variable that contains accumulated virus progression for a host. Iterates to a value above 360 and is then reset. var/stage_level = 0 - /// variable that handle passive increase of the virus of an host. - var/infection_rate = 1 - ///the number of stage level needed to pass another stage. - var/stage_level_check = 360 + /// variable that handles passive increase of the virus of a host. + var/infection_rate = SLOW_INFECTION_RATE - /// cooldown between each check to see if we display a symptome idea is to get 60s between symptome atleast. - var/message_cooldown_time = 1 MINUTES + /// cooldown for the living mob's symptom messages COOLDOWN_DECLARE(goo_message_cooldown) /datum/disease/black_goo/stage_act() ..() - if(!ishuman(affected_mob)) return - var/mob/living/carbon/human/H = affected_mob + if(!ishuman_strict(affected_mob)) + return + var/mob/living/carbon/human/infected_mob = affected_mob - // check if your already a zombie or in the process of being transform into one... - if(iszombie(H)) + if(iszombie(infected_mob)) return - // check if dead - if(H.stat == DEAD) - infection_rate = 4 + // infection rate is faster for dead mobs + if(infected_mob.stat == DEAD) + infection_rate = FAST_INFECTION_RATE - // check if he isn't dead - if(H.stat != DEAD) - infection_rate = 1 + // standard infection rate for living mobs + if(infected_mob.stat != DEAD) + infection_rate = SLOW_INFECTION_RATE - // here we add the new infection rate to the stage level. stage_level += infection_rate - // we want to check if we have reach enough stage level to gain a stage 3 stage of 6 min if you get it once. - if(stage_level >= stage_level_check) + // resets the stage_level once it passes the threshold. + if(stage_level >= STAGE_LEVEL_THRESHOLD) stage++ - stage_level -= stage_level_check + stage_level = stage_level % STAGE_LEVEL_THRESHOLD switch(stage) - if(1) - if(H.stat == DEAD && stage_counter != stage) - to_chat(H, SPAN_CENTERBOLD("Your zombie infection is now at stage one! Zombie transformation begins at stage three.")) + if(ZOMBIE_INFECTION_STAGE_ONE) + if(infected_mob.stat == DEAD && stage_counter != stage) + to_chat(infected_mob, SPAN_CENTERBOLD("Your zombie infection is now at stage one! Zombie transformation begins at stage three.")) stage_counter = stage - if (!COOLDOWN_FINISHED(src, goo_message_cooldown)) - return - COOLDOWN_START(src, goo_message_cooldown, message_cooldown_time) - - switch(rand(0, 100)) - if(0 to 25) + // dead mobs should not have symptoms, because... they are dead. + if(infected_mob.stat != DEAD) + if (!COOLDOWN_FINISHED(src, goo_message_cooldown)) return - if(25 to 75) - to_chat(affected_mob, SPAN_DANGER("You feel warm...")) - stage_level += 9 - if(75 to 95) - to_chat(affected_mob, SPAN_DANGER("Your throat is really dry...")) - stage_level += 18 - if(95 to 100) - to_chat(affected_mob, SPAN_DANGER("You can't trust them...")) - stage_level += 36 - - if(2) - if(H.stat == DEAD && stage_counter != stage) - to_chat(H, SPAN_CENTERBOLD("Your zombie infection is now at stage two! Zombie transformation begins at stage three.")) + COOLDOWN_START(src, goo_message_cooldown, MESSAGE_COOLDOWN_TIME) + + switch(rand(0, 100)) + if(0 to 25) + return + if(25 to 75) + to_chat(infected_mob, SPAN_DANGER("You feel warm...")) + stage_level += 9 + if(75 to 95) + to_chat(infected_mob, SPAN_DANGER("Your throat is really dry...")) + stage_level += 18 + if(95 to 100) + to_chat(infected_mob, SPAN_DANGER("You can't trust them...")) + stage_level += 36 + + if(ZOMBIE_INFECTION_STAGE_TWO) + if(infected_mob.stat == DEAD && stage_counter != stage) + to_chat(infected_mob, SPAN_CENTERBOLD("Your zombie infection is now at stage two! Zombie transformation begins at stage three.")) stage_counter = stage - if (!COOLDOWN_FINISHED(src, goo_message_cooldown)) - return - COOLDOWN_START(src, goo_message_cooldown, message_cooldown_time) - - switch(rand(0, 100)) - if(0 to 25) + if(infected_mob.stat != DEAD) + if (!COOLDOWN_FINISHED(src, goo_message_cooldown)) return - if(25 to 50) - to_chat(affected_mob, SPAN_DANGER("You can't trust them...")) - stage_level += 5 - if(50 to 75) - to_chat(affected_mob, SPAN_DANGER("You feel really warm...")) - stage_level += 9 - if(75 to 85) - to_chat(affected_mob, SPAN_DANGER("Your throat is really dry...")) - stage_level += 18 - if(85 to 95) - H.vomit_on_floor() - stage_level += 36 - if(95 to 100) - to_chat(affected_mob, SPAN_DANGER("You cough up some black fluid...")) - stage_level += 42 - - if(3) - //check if your already a zombie just return to avoid weird stuff... if for some weird reason first filter deoesn't work... - if(iszombie(H)) + COOLDOWN_START(src, goo_message_cooldown, MESSAGE_COOLDOWN_TIME) + + switch(rand(0, 100)) + if(0 to 25) + return + if(25 to 50) + to_chat(infected_mob, SPAN_DANGER("You can't trust them...")) + stage_level += 5 + if(50 to 75) + to_chat(infected_mob, SPAN_DANGER("You feel really warm...")) + stage_level += 9 + if(75 to 85) + to_chat(infected_mob, SPAN_DANGER("Your throat is really dry...")) + stage_level += 18 + if(85 to 95) + infected_mob.vomit_on_floor() + stage_level += 36 + if(95 to 100) + to_chat(infected_mob, SPAN_DANGER("You cough up some black fluid...")) + stage_level += 42 + + if(ZOMBIE_INFECTION_STAGE_THREE) + //check if the mob is already a zombie and just return to avoid weird stuff, edge case if zombie_is_transforming deoesn't work. + if(iszombie(infected_mob)) return - if(H.stat == DEAD && stage_counter != stage) - to_chat(H, SPAN_CENTERBOLD("Your zombie infection is now at stage three! Zombie transformation begin!")) + if(infected_mob.stat == DEAD && stage_counter != stage) + to_chat(infected_mob, SPAN_CENTERBOLD("Your zombie infection is now at stage three! Zombie transformation begin!")) stage_counter = stage hidden = list(0,0) - if(!zombie_transforming) - zombie_transform(H) - H.next_move_slowdown = max(H.next_move_slowdown, 2) + if(!zombie_is_transforming) + zombie_transform(infected_mob) + infected_mob.next_move_slowdown = max(infected_mob.next_move_slowdown, 2) /datum/disease/black_goo/proc/zombie_transform(mob/living/carbon/human/human) set waitfor = 0 - zombie_transforming = TRUE + zombie_is_transforming = TRUE human.vomit_on_floor() human.adjust_effect(5, STUN) sleep(20) @@ -143,7 +151,7 @@ human.set_species(SPECIES_ZOMBIE) stage = 3 human.faction = FACTION_ZOMBIE - zombie_transforming = FALSE + zombie_is_transforming = FALSE /obj/item/weapon/zombie_claws @@ -298,3 +306,11 @@ for(var/i=1; i <= storage_slots; i++) new /obj/item/reagent_container/food/drinks/bottle/black_goo(src) return + +#undef ZOMBIE_INFECTION_STAGE_ONE +#undef ZOMBIE_INFECTION_STAGE_TWO +#undef ZOMBIE_INFECTION_STAGE_THREE +#undef STAGE_LEVEL_THRESHOLD +#undef SLOW_INFECTION_RATE +#undef FAST_INFECTION_RATE +#undef MESSAGE_COOLDOWN_TIME diff --git a/code/datums/effects/bleeding.dm b/code/datums/effects/bleeding.dm index e6cb184850d4..2171580a94db 100644 --- a/code/datums/effects/bleeding.dm +++ b/code/datums/effects/bleeding.dm @@ -19,6 +19,13 @@ if(L && istype(L)) limb = L +/datum/effects/bleeding/Destroy() + if(limb) + SEND_SIGNAL(limb, COMSIG_LIMB_STOP_BLEEDING, TRUE, FALSE) + limb.bleeding_effects_list -= src + limb = null + return ..() + /datum/effects/bleeding/validate_atom(atom/A) if(isobj(A)) return FALSE @@ -48,12 +55,6 @@ duration += damage * (blood_duration_multiplier / BLOOD_ADD_PENALTY) blood_loss += damage / (blood_loss_divider * BLOOD_ADD_PENALTY) //Make the first hit count, adding on bleeding has a penalty -/datum/effects/bleeding/Destroy() - if(limb) - limb.bleeding_effects_list -= src - return ..() - - /datum/effects/bleeding/external var/buffer_blood_loss = 0 diff --git a/code/datums/emergency_calls/emergency_call.dm b/code/datums/emergency_calls/emergency_call.dm index c6f71382b877..7884d93b18bc 100644 --- a/code/datums/emergency_calls/emergency_call.dm +++ b/code/datums/emergency_calls/emergency_call.dm @@ -30,7 +30,7 @@ var/arrival_message = "" //Msg to display about when the shuttle arrives var/objectives //Txt of objectives to display to joined. Todo: make this into objective notes var/objective_info //For additional info in the objectives txt - var/probability = 0 //Chance of it occurring. Total must equal 100% + var/probability = 0 var/hostility //For ERTs who are either hostile or friendly by random chance. var/list/datum/mind/members = list() //Currently-joined members. var/list/datum/mind/candidates = list() //Potential candidates for enlisting. diff --git a/code/datums/emergency_calls/royal_marines.dm b/code/datums/emergency_calls/royal_marines.dm index b3feaccf87bb..21f79e7c3026 100644 --- a/code/datums/emergency_calls/royal_marines.dm +++ b/code/datums/emergency_calls/royal_marines.dm @@ -1,7 +1,7 @@ /datum/emergency_call/royal_marines name = "Royal Marines Commando (Squad) (Friendly)" mob_max = 7 - probability = 0 + probability = 15 name_of_spawn = /obj/effect/landmark/ert_spawns/distress_twe item_spawn = /obj/effect/landmark/ert_spawns/distress_twe/item max_engineers = 0 diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 207310ac34c5..6a4276208d13 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -177,7 +177,7 @@ teleatom.visible_message(SPAN_DANGER("[teleatom] bounces off of the portal!")) return 0 - if(is_admin_level(destination.z)) + if(should_block_game_interaction(destination)) if(length(teleatom.search_contents_for(/obj/item/storage/backpack/holding))) teleatom.visible_message(SPAN_DANGER("The Bag of Holding bounces off of the portal!")) return 0 diff --git a/code/datums/keybinding/yautja.dm b/code/datums/keybinding/yautja.dm index 4729db004582..c79788df49a3 100644 --- a/code/datums/keybinding/yautja.dm +++ b/code/datums/keybinding/yautja.dm @@ -30,16 +30,7 @@ classic_keys = list("Unbound") name = "pred_buy" full_name = "Claim equipment" - keybind_signal = COMSIG_KB_YAUTJA_BUTCHER - -/datum/keybinding/yautja/pred_buy/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - if(!isyautja(H)) - return - H.pred_buy() + keybind_signal = COMSIG_KB_YAUTJA_PRED_BUY /datum/keybinding/yautja/mark_panel hotkey_keys = list("Unbound") @@ -48,46 +39,12 @@ full_name = "Mark panel" keybind_signal = COMSIG_KB_YAUTJA_MARK_PANEL -/datum/keybinding/yautja/mark_panel/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - if(!isyautja(H)) - return - H.mark_panel() - /datum/keybinding/yautja/mark_for_hunt hotkey_keys = list("Unbound") classic_keys = list("Unbound") name = "mark_for_hunt" - full_name = "Mark for hunt" - keybind_signal = COMSIG_KB_YAUTJA_MARK_FOR_HUNT - -/datum/keybinding/yautja/mark_for_hunt/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - if(!isyautja(H)) - return - H.mark_for_hunt() - -/datum/keybinding/yautja/remove_from_hunt - hotkey_keys = list("Unbound") - classic_keys = list("Unbound") - name = "remove_from_hunt" - full_name = "Remove from hunt" - keybind_signal = COMSIG_KB_YAUTJA_REMOVE_FROM_HUNT - -/datum/keybinding/yautja/remove_from_hunt/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - if(!isyautja(H)) - return - H.remove_from_hunt() + full_name = "Toggle mark for hunt" + keybind_signal = COMSIG_KB_YAUTJA_TOGGLE_MARK_FOR_HUNT // BRACER SPECIFIC \\ @@ -168,22 +125,6 @@ full_name = "Toggle wristblades" keybind_signal = COMSIG_KB_YAUTJA_WRISTBLADES -/datum/keybinding/yautja/bracer_hunter/wristblades/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.wristblades() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.wristblades() - return TRUE - /datum/keybinding/yautja/bracer_hunter/track_gear hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -214,22 +155,6 @@ full_name = "Toggle cloak" keybind_signal = COMSIG_KB_YAUTJA_CLOAKER -/datum/keybinding/yautja/bracer_hunter/cloaker/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.cloaker() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.cloaker() - return TRUE - /datum/keybinding/yautja/bracer_hunter/caster hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -237,22 +162,6 @@ full_name = "Toggle plasma caster" keybind_signal = COMSIG_KB_YAUTJA_CASTER -/datum/keybinding/yautja/bracer_hunter/caster/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.caster() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.caster() - return TRUE - /datum/keybinding/yautja/bracer_hunter/change_explosion_type hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -283,22 +192,6 @@ full_name = "Self-destruct" keybind_signal = COMSIG_KB_YAUTJA_ACTIVATE_SUICIDE -/datum/keybinding/yautja/bracer_hunter/activate_suicide/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.activate_suicide() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.activate_suicide() - return TRUE - /datum/keybinding/yautja/bracer_hunter/injectors hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -306,21 +199,6 @@ full_name = "Create Stabilising Crystal" keybind_signal = COMSIG_KB_YAUTJA_INJECTORS -/datum/keybinding/yautja/bracer_hunter/injectors/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.injectors() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.injectors() - return TRUE /datum/keybinding/yautja/bracer_hunter/healing_capsule hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -328,22 +206,6 @@ full_name = "Create Healing Capsule" keybind_signal = COMSIG_KB_YAUTJA_CAPSULE -/datum/keybinding/yautja/bracer_hunter/healing_capsule/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.healing_capsule() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.healing_capsule() - return TRUE - /datum/keybinding/yautja/bracer_hunter/call_disc hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -351,22 +213,6 @@ full_name = "Call smart-disc" keybind_signal = COMSIG_KB_YAUTJA_CALL_DISC -/datum/keybinding/yautja/bracer_hunter/call_disc/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.call_disc() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.call_disc() - return TRUE - /datum/keybinding/yautja/bracer_hunter/remove_tracked_item hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -420,22 +266,6 @@ full_name = "Yank combi-stick" keybind_signal = COMSIG_KB_YAUTJA_CALL_COMBI -/datum/keybinding/yautja/bracer_hunter/call_combi/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.call_combi() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.call_combi() - return TRUE - /datum/keybinding/yautja/bracer_hunter/translate hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -443,22 +273,6 @@ full_name = "Translator" keybind_signal = COMSIG_KB_YAUTJA_TRANSLATE -/datum/keybinding/yautja/bracer_hunter/translate/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.translate() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.translate() - return TRUE - /datum/keybinding/yautja/bracer_hunter/bracername hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -528,6 +342,13 @@ held.link_bracer() return TRUE +/datum/keybinding/yautja/bracer_hunter/control_falcon_drone + hotkey_keys = list("Unbound") + classic_keys = list("Unbound") + name = "control_falcon" + full_name = "Control falcon drone" + keybind_signal = COMSIG_KB_YAUTJA_CONTROL_FALCON + // Misc stuff - mask, teleporter \\ // mask @@ -545,32 +366,14 @@ classic_keys = list("Unbound") name = "toggle_zoom" full_name = "Toggle mask zoom" - keybind_signal = COMSIG_KB_YAUTJA_LINK_BRACER - -/datum/keybinding/yautja/mask/toggle_zoom/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - var/obj/item/clothing/mask/gas/yautja/mask = H.wear_mask - mask.toggle_zoom() - return TRUE + keybind_signal = COMSIG_KB_YAUTJA_MASK_TOGGLE_ZOOM /datum/keybinding/yautja/mask/togglesight hotkey_keys = list("Unbound") classic_keys = list("Unbound") name = "togglesight" full_name = "Toggle mask visors" - keybind_signal = COMSIG_KB_YAUTJA_LINK_BRACER - -/datum/keybinding/yautja/mask/togglesight/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - var/obj/item/clothing/mask/gas/yautja/mask = H.wear_mask - mask.togglesight() - return TRUE + keybind_signal = COMSIG_KB_YAUTJA_MASK_TOGGLESIGHT // teleporter diff --git a/code/datums/medal_awards.dm b/code/datums/medal_awards.dm index ba8847c03661..a3041c622bd6 100644 --- a/code/datums/medal_awards.dm +++ b/code/datums/medal_awards.dm @@ -11,6 +11,7 @@ GLOBAL_LIST_EMPTY(medal_awards) GLOBAL_LIST_EMPTY(jelly_awards) +GLOBAL_LIST_EMPTY(medal_recommendations) /datum/recipient_awards var/list/medal_names @@ -160,7 +161,99 @@ GLOBAL_LIST_INIT(human_medals, list(MARINE_CONDUCT_MEDAL, MARINE_BRONZE_HEART_ME return TRUE -/proc/print_medal(mob/living/carbon/human/user, obj/printer) +/proc/give_medal_award_prefilled(medal_location, mob/giving_mob, chosen_recipient, recipient_rank, recipient_ckey, reason, _medal_type) + var/list/recipient_ranks = list() + for(var/datum/data/record/record in GLOB.data_core.general) + var/recipient_name = record.fields["name"] + recipient_ranks[recipient_name] = record.fields["rank"] + + if(!chosen_recipient) + return FALSE + + // Pick a medal + var/medal_type = _medal_type + if(!medal_type) + return FALSE + + // Write a citation + var/citation = strip_html(reason) + if(!citation) + return FALSE + + // Get mob information + var/posthumous = TRUE + var/mob/recipient_mob + var/found_other = FALSE + + for(var/mob/mob in GLOB.mob_list) + if(mob.real_name == chosen_recipient) + // Recipient: Check if they are dead, and get some info + // We might not get this info if gibbed, so we'd need to refactor again and find another way if we want stats always correct + if(isliving(mob) && mob.stat != DEAD) + posthumous = FALSE + recipient_mob = mob + if(found_other) + break + found_other = TRUE + if(!recipient_mob) + for(var/mob/mob in GLOB.dead_mob_list) + if(mob.real_name == chosen_recipient) + // Recipient: Check if they are dead?, and get some info + // We might not get this info if gibbed, so we'd need to refactor again and find another way if we want stats always correct + if(isliving(mob) && mob.stat != DEAD) + posthumous = FALSE + recipient_mob = mob + break + + // Create the recipient_award + if(!GLOB.medal_awards[chosen_recipient]) + GLOB.medal_awards[chosen_recipient] = new /datum/recipient_awards() + var/datum/recipient_awards/recipient_award = GLOB.medal_awards[chosen_recipient] + recipient_award.recipient_rank = recipient_rank + recipient_award.recipient_ckey = recipient_ckey + recipient_award.recipient_mob = recipient_mob + recipient_award.giver_mob += giving_mob + recipient_award.medal_names += medal_type + recipient_award.medal_citations += citation + recipient_award.posthumous += posthumous + recipient_award.giver_ckey += giving_mob.ckey + + recipient_award.giver_rank += recipient_ranks[giving_mob.real_name] // Currently not used in marine award message + recipient_award.giver_name += giving_mob.real_name // Currently not used in marine award message + + // Create an actual medal item + if(medal_location) + var/obj/item/clothing/accessory/medal/medal + switch(medal_type) + if(MARINE_CONDUCT_MEDAL) + medal = new /obj/item/clothing/accessory/medal/bronze/conduct(medal_location) + if(MARINE_BRONZE_HEART_MEDAL) + medal = new /obj/item/clothing/accessory/medal/bronze/heart(medal_location) + if(MARINE_VALOR_MEDAL) + medal = new /obj/item/clothing/accessory/medal/silver/valor(medal_location) + if(MARINE_HEROISM_MEDAL) + medal = new /obj/item/clothing/accessory/medal/gold/heroism(medal_location) + else + return FALSE + medal.recipient_name = chosen_recipient + medal.medal_citation = citation + medal.recipient_rank = recipient_rank + recipient_award.medal_items += medal + else + recipient_award.medal_items += null + + // Recipient: Add the medal to the player's stats + if(recipient_ckey) + var/datum/entity/player_entity/recipient_player = setup_player_entity(recipient_ckey) + if(recipient_player) + recipient_player.track_medal_earned(medal_type, recipient_mob, recipient_rank, citation, giving_mob) + + // Inform staff of success + message_admins("[key_name_admin(giving_mob)] awarded a [medal_type] to [chosen_recipient] for: \'[citation]\'.") + + return TRUE + +/proc/open_medal_panel(mob/living/carbon/human/user, obj/printer) var/obj/item/card/id/card = user.wear_id if(!card) to_chat(user, SPAN_WARNING("You must have an authenticated ID Card to award medals.")) @@ -178,8 +271,9 @@ GLOBAL_LIST_INIT(human_medals, list(MARINE_CONDUCT_MEDAL, MARINE_BRONZE_HEART_ME user.visible_message("ERROR: ID card not registered for [user.real_name] in USCM registry. Potential medal fraud detected.") return - if(give_medal_award(get_turf(printer))) - user.visible_message(SPAN_NOTICE("[printer] prints a medal.")) + GLOB.ic_medals_panel.user_locs[WEAKREF(user)] = WEAKREF(printer) + GLOB.ic_medals_panel.tgui_interact(user) + GLOBAL_LIST_INIT(xeno_medals, list(XENO_SLAUGHTER_MEDAL, XENO_RESILIENCE_MEDAL, XENO_SABOTAGE_MEDAL, XENO_PROLIFERATION_MEDAL, XENO_REJUVENATION_MEDAL)) @@ -364,3 +458,200 @@ GLOBAL_LIST_INIT(xeno_medals, list(XENO_SLAUGHTER_MEDAL, XENO_RESILIENCE_MEDAL, message_admins("[key_name_admin(usr)] deleted [recipient_name]'s [medal_type] for: \'[citation]\'.") return TRUE + +/datum/medal_recommendation + var/recipient_rank + var/recipient_ckey + var/recipient_name + var/recommended_by_name + var/recommended_by_ckey + var/reason + var/recommended_by_rank + + +/proc/add_medal_recommendation(mob/recommendation_giver) + // Pick a marine + var/list/possible_recipients = list() + var/list/recipient_ranks = list() + for(var/datum/data/record/record in GLOB.data_core.general) + var/recipient_name = record.fields["name"] + if(recipient_name == recommendation_giver.real_name) + continue + recipient_ranks[recipient_name] = record.fields["rank"] + possible_recipients += recipient_name + var/chosen_recipient = tgui_input_list(recommendation_giver, "Who do you want to recommend a medal for?", "Medal Recommendation", possible_recipients) + if(!chosen_recipient) + return FALSE + + // Write a citation + var/reason = strip_html(tgui_input_text(recommendation_giver, "Why does this person deserve a medal?", "Medal Recommendation", null, MAX_PAPER_MESSAGE_LEN, TRUE), MAX_PAPER_MESSAGE_LEN) + if(!reason) + return FALSE + + // Get mob information + var/recipient_rank = recipient_ranks[chosen_recipient] + var/recipient_ckey + var/mob/recipient_mob + var/found_other = FALSE + + for(var/mob/mob in GLOB.mob_list) + if(mob.real_name == chosen_recipient) + // We might not get this info if gibbed, so we'd need to refactor again and find another way if we want stats always correct + recipient_ckey = mob.persistent_ckey + recipient_mob = mob + if(found_other) + break + found_other = TRUE + if(!recipient_mob) + for(var/mob/mob in GLOB.dead_mob_list) + if(mob.real_name == chosen_recipient) + // Recipient: Check if they are dead?, and get some info + // We might not get this info if gibbed, so we'd need to refactor again and find another way if we want stats always correct + recipient_ckey = mob.persistent_ckey + recipient_mob = mob + break + + // Create the recipient_award + var/datum/medal_recommendation/recommendation = new /datum/medal_recommendation() + GLOB.medal_recommendations += recommendation + + recommendation.recipient_rank = recipient_rank + recommendation.recipient_ckey = recipient_ckey + recommendation.recipient_name = recipient_mob.real_name + recommendation.recommended_by_name = recommendation_giver.real_name + recommendation.recommended_by_ckey = recommendation_giver.ckey + recommendation.recommended_by_rank = recipient_ranks[recommendation_giver.real_name] + + + recommendation.reason = reason + + return TRUE + + +GLOBAL_DATUM_INIT(ic_medals_panel, /datum/ic_medal_panel, new) + +/datum/ic_medal_panel + var/name = "Medals Panel" + var/list/datum/weakref/user_locs = list() + +/datum/ic_medal_panel/tgui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "IcMedalsPanel", "Medals Panel") + ui.open() + ui.set_autoupdate(FALSE) + +/datum/ic_medal_panel/ui_state(mob/user) + var/datum/weakref/user_reference = WEAKREF(user) + var/datum/weakref/loc_reference = user_locs[user_reference] + if(istype(loc_reference?.resolve(), /obj/item)) + return GLOB.not_incapacitated_and_inventory_state + else + return GLOB.not_incapacitated_and_adjacent_state + +/datum/ic_medal_panel/ui_host(mob/user) + . = ..() + var/datum/weakref/user_reference = WEAKREF(user) + var/datum/weakref/loc_reference = user_locs[user_reference] + . = loc_reference?.resolve() + +/datum/ic_medal_panel/ui_data(mob/user) + var/list/data = list() + data["recommendations"] = list() + + for(var/datum/medal_recommendation/recommendation in GLOB.medal_recommendations) + var/recommendation_list = list() + + recommendation_list["rank"] = recommendation.recipient_rank + recommendation_list["name"] = recommendation.recipient_name + recommendation_list["ref"] = REF(recommendation) + recommendation_list["recommender_name"] = recommendation.recommended_by_name + recommendation_list["reason"] = recommendation.reason + recommendation_list["recommender_rank"] = recommendation.recommended_by_rank + + data["recommendations"] += list(recommendation_list) + return data + +/datum/ic_medal_panel/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + var/mob/living/carbon/human/user = usr + var/obj/item/card/id/card = user.wear_id + if(!card) + to_chat(user, SPAN_WARNING("You must have an authenticated ID Card to award medals.")) + return + + if(!((card.paygrade in GLOB.co_paygrades) || (card.paygrade in GLOB.highcom_paygrades))) + to_chat(user, SPAN_WARNING("Only a Senior Officer can award medals!")) + return + + if(!card.registered_ref) + user.visible_message("ERROR: ID card not registered in USCM registry. Potential medal fraud detected.") + return + + var/real_owner_ref = card.registered_ref + + if(real_owner_ref != WEAKREF(user)) + user.visible_message("ERROR: ID card not registered for [user.real_name] in USCM registry. Potential medal fraud detected.") + return + + var/datum/weakref/user_ref = WEAKREF(user) + var/datum/weakref/loc_ref = user_locs[user_ref] + var/atom/actual_loc = loc_ref?.resolve() + if(!actual_loc) + return + + switch(action) + if("grant_new_medal") + if(give_medal_award(get_turf(actual_loc))) + actual_loc.visible_message(SPAN_NOTICE("[actual_loc] prints a medal.")) + . = TRUE + + if("approve_medal") + var/recommendation_ref = params["ref"] + var/medal_type = params["medal_type"] + if(!(medal_type in GLOB.human_medals)) + return + var/datum/medal_recommendation/recommendation = locate(recommendation_ref) in GLOB.medal_recommendations + if(!recommendation) + return + if(recommendation.recipient_name == user.real_name) + to_chat(user, SPAN_WARNING("You cannot give medals to yourself!")) + return + + var/choice = tgui_alert(user, "Would you like to change the medal text?", "Medal Citation", list("Yes", "No")) + var/medal_citation = recommendation.reason + if(choice == "Yes") + medal_citation = strip_html(tgui_input_text(user, "What should the medal citation read?", "Medal Citation", null, MAX_PAPER_MESSAGE_LEN, TRUE), MAX_PAPER_MESSAGE_LEN) + + var/confirm_choice = tgui_alert(user, "Are you sure you want to give a medal to [recommendation.recipient_name]?", "Medal Confirmation", list("Yes", "No")) + if(confirm_choice != "Yes") + return + + if(give_medal_award_prefilled(get_turf(actual_loc), user, recommendation.recipient_name, recommendation.recipient_rank, recommendation.recipient_ckey, medal_citation, medal_type, recommendation.recommended_by_ckey, recommendation.recommended_by_name)) + GLOB.medal_recommendations -= recommendation + qdel(recommendation) + user.visible_message(SPAN_NOTICE("[actual_loc] prints a medal.")) + . = TRUE + + if("deny_medal") + var/recommendation_ref = params["ref"] + var/datum/medal_recommendation/recommendation = locate(recommendation_ref) in GLOB.medal_recommendations + if(!recommendation) + return + var/confirm = tgui_alert(user, "Are you sure you want to deny this medal recommendation?", "Medal Confirmation", list("Yes", "No")) + if(confirm != "Yes") + return + GLOB.medal_recommendations -= recommendation + qdel(recommendation) + . = TRUE + +/datum/ic_medal_panel/ui_close(mob/user) + . = ..() + user_locs -= WEAKREF(user) + +/datum/ic_medal_panel/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/medal) + ) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 205032f46a97..74f445f21597 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -44,8 +44,6 @@ msg_admin_niche("[key]/[ckey] has tried to transfer to deleted [new_character].") return - SEND_SIGNAL(current.client, COMSIG_CLIENT_MIND_TRANSFER, new_character) - if(current) current.mind = null //remove ourself from our old body's mind variable SSnano.nanomanager.user_transferred(current, new_character) // transfer active NanoUI instances to new user diff --git a/code/datums/mob_hud.dm b/code/datums/mob_hud.dm index e4ec3acc1410..778ec2b75a36 100644 --- a/code/datums/mob_hud.dm +++ b/code/datums/mob_hud.dm @@ -33,10 +33,8 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( /datum/mob_hud/proc/remove_hud_from(mob/user, source) if(length(hudusers[user]) && (source in hudusers[user])) hudusers[user] -= source - if(length(hudusers[user])) return FALSE - for(var/mob/target in hudmobs) remove_from_single_hud(user, target) diff --git a/code/datums/skills/civilian.dm b/code/datums/skills/civilian.dm index 53b7cb8c2194..9dc4afd78826 100644 --- a/code/datums/skills/civilian.dm +++ b/code/datums/skills/civilian.dm @@ -160,6 +160,7 @@ CIVILIAN name = "Survivor Trucker" additional_skills = list( SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, ) diff --git a/code/datums/status_effects/_status_effect_helpers.dm b/code/datums/status_effects/_status_effect_helpers.dm index 0ee952200610..02a4f9a5ccea 100644 --- a/code/datums/status_effects/_status_effect_helpers.dm +++ b/code/datums/status_effects/_status_effect_helpers.dm @@ -40,6 +40,7 @@ // Create the status effect with our mob + our arguments var/datum/status_effect/new_instance = new new_effect(arguments) + SEND_SIGNAL(src, COMSIG_LIVING_APPLY_EFFECT, new_instance) if(!QDELETED(new_instance)) return new_instance diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index a36b7b91e4c6..0ecfead05615 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -102,3 +102,19 @@ name = "Unconscious" desc = "You've been knocked out." icon_state = ALERT_KNOCKEDOUT + +/// DAZED: +/// This prevents talking as human or using abilities as Xenos, mainly +/datum/status_effect/incapacitating/dazed + id = "dazed" + needs_update_stat = TRUE + +/datum/status_effect/incapacitating/dazed/on_apply() + . = ..() + if(!.) + return + ADD_TRAIT(owner, TRAIT_DAZED, TRAIT_STATUS_EFFECT(id)) + +/datum/status_effect/incapacitating/dazed/on_remove() + REMOVE_TRAIT(owner, TRAIT_DAZED, TRAIT_STATUS_EFFECT(id)) + return ..() diff --git a/code/datums/supply_packs/black_market.dm b/code/datums/supply_packs/black_market.dm index 36d890e2b3d5..43e0358a96f9 100644 --- a/code/datums/supply_packs/black_market.dm +++ b/code/datums/supply_packs/black_market.dm @@ -101,7 +101,7 @@ Non-USCM items, from CLF, UPP, colonies, etc. Mostly combat-related. new /obj/item/clothing/head/helmet/marine/veteran/UPP(src) new /obj/item/clothing/under/marine/veteran/UPP(src) new /obj/item/clothing/suit/storage/marine/faction/UPP(src) - new /obj/item/clothing/shoes/marine/upp(src) + new /obj/item/clothing/shoes/marine/upp/knife(src) new /obj/item/clothing/gloves/marine/veteran(src) new /obj/item/storage/backpack/lightpack/five_slot(src) if(5) //freelancer diff --git a/code/datums/tutorial/_tutorial.dm b/code/datums/tutorial/_tutorial.dm new file mode 100644 index 000000000000..5423453bbdb9 --- /dev/null +++ b/code/datums/tutorial/_tutorial.dm @@ -0,0 +1,259 @@ +GLOBAL_LIST_EMPTY_TYPED(ongoing_tutorials, /datum/tutorial) + +/// A tutorial datum contains a set of instructions for a player tutorial, such as what to spawn, what's scripted to occur, and so on. +/datum/tutorial + /// What the tutorial is called, is player facing + var/name = "Base" + /// Internal ID of the tutorial, kept for save files + var/tutorial_id = "base" + /// A short 1-2 sentence description of the tutorial itself + var/desc = "" + /// What the tutorial's icon in the UI should look like + var/icon_state = "" + /// What category the tutorial should be under + var/category = TUTORIAL_CATEGORY_BASE + /// Ref to the bottom-left corner tile of the tutorial room + var/turf/bottom_left_corner + /// Ref to the turf reservation for this tutorial + var/datum/turf_reservation/reservation + /// Ref to the player who is doing the tutorial + var/mob/tutorial_mob + /// If the tutorial will be ending soon + var/tutorial_ending = FALSE + /// A dict of type:atom ref for some important junk that should be trackable + var/list/tracking_atoms = list() + /// What map template should be used for the tutorial + var/datum/map_template/tutorial/tutorial_template = /datum/map_template/tutorial/s12x12 + /// What is the parent path of this, to exclude from the tutorial menu + var/parent_path = /datum/tutorial + /// A dictionary of "bind_name" : "keybind_button". The inverse of `key_bindings` on a client's prefs + var/list/player_bind_dict = list() + +/datum/tutorial/Destroy(force, ...) + GLOB.ongoing_tutorials -= src + QDEL_NULL(reservation) // Its Destroy() handles releasing reserved turfs + + tutorial_mob = null // We don't delete it because the turf reservation will typically clean it up + + QDEL_LIST_ASSOC_VAL(tracking_atoms) + + return ..() + +/// The proc to begin doing everything related to the tutorial +/datum/tutorial/proc/start_tutorial(mob/starting_mob) + SHOULD_CALL_PARENT(TRUE) + + if(!starting_mob?.client) + return FALSE + + ADD_TRAIT(starting_mob, TRAIT_IN_TUTORIAL, TRAIT_SOURCE_TUTORIAL) + + tutorial_mob = starting_mob + + reservation = SSmapping.RequestBlockReservation(initial(tutorial_template.width), initial(tutorial_template.height)) + if(!reservation) + return FALSE + + var/turf/bottom_left_corner_reservation = locate(reservation.bottom_left_coords[1], reservation.bottom_left_coords[2], reservation.bottom_left_coords[3]) + var/datum/map_template/tutorial/template = new tutorial_template + template.load(bottom_left_corner_reservation, FALSE, TRUE) + var/obj/landmark = locate(/obj/effect/landmark/tutorial_bottom_left) in GLOB.landmarks_list + bottom_left_corner = get_turf(landmark) + qdel(landmark) + + if(!verify_template_loaded()) + abort_tutorial() + return FALSE + + generate_binds() + + GLOB.ongoing_tutorials |= src + var/area/tutorial_area = get_area(bottom_left_corner) + tutorial_area.update_base_lighting() // this will be entirely dark otherwise + init_map() + if(!tutorial_mob) + end_tutorial() + + return TRUE + +/// The proc used to end and clean up the tutorial +/datum/tutorial/proc/end_tutorial(completed = FALSE) + SHOULD_CALL_PARENT(TRUE) + + if(tutorial_mob) + remove_action(tutorial_mob, /datum/action/tutorial_end) // Just in case to make sure the client can't try and leave the tutorial while it's mid-cleanup + if(tutorial_mob.client?.prefs && completed) + tutorial_mob.client.prefs.completed_tutorials |= tutorial_id + tutorial_mob.client.prefs.save_character() + var/mob/new_player/new_player = new + if(!tutorial_mob.mind) + tutorial_mob.mind_initialize() + + tutorial_mob.mind.transfer_to(new_player) + + if(!QDELETED(src)) + qdel(src) + +/// Verify the template loaded fully and without error. +/datum/tutorial/proc/verify_template_loaded() + // We subtract 1 from x and y because the bottom left corner doesn't start at the walls. + var/turf/true_bottom_left_corner = locate( + reservation.bottom_left_coords[1], + reservation.bottom_left_coords[2], + reservation.bottom_left_coords[3], + ) + // We subtract 1 from x and y here because the bottom left corner counts as the first tile + var/turf/top_right_corner = locate( + true_bottom_left_corner.x + initial(tutorial_template.width) - 1, + true_bottom_left_corner.y + initial(tutorial_template.height) - 1, + true_bottom_left_corner.z + ) + for(var/turf/tile as anything in block(true_bottom_left_corner, top_right_corner)) + // For some reason I'm unsure of, the template will not always fully load, leaving some tiles to be space tiles. So, we check all tiles in the (small) tutorial area + // and tell start_tutorial to abort if there's any space tiles. + if(istype(tile, /turf/open/space)) + return FALSE + + return TRUE + +/// Something went very, very wrong during load so let's abort +/datum/tutorial/proc/abort_tutorial() + to_chat(tutorial_mob, SPAN_BOLDWARNING("Something went wrong during tutorial load, please try again!")) + end_tutorial(FALSE) + +/datum/tutorial/proc/add_highlight(atom/target, color = "#d19a02") + target.add_filter("tutorial_highlight", 2, list("type" = "outline", "color" = color, "size" = 1)) + +/datum/tutorial/proc/remove_highlight(atom/target) + target.remove_filter("tutorial_highlight") + +/datum/tutorial/proc/add_to_tracking_atoms(atom/reference) + tracking_atoms[reference.type] = reference + +/datum/tutorial/proc/remove_from_tracking_atoms(atom/reference) + tracking_atoms -= reference.type + +/// Broadcast a message to the player's screen +/datum/tutorial/proc/message_to_player(message) + playsound_client(tutorial_mob.client, 'sound/effects/radiostatic.ogg', tutorial_mob.loc, 25, FALSE) + tutorial_mob.play_screen_text(message, /atom/movable/screen/text/screen_text/command_order/tutorial, rgb(103, 214, 146)) + to_chat(tutorial_mob, SPAN_NOTICE(message)) + +/// Updates a player's objective in their status tab +/datum/tutorial/proc/update_objective(message) + SEND_SIGNAL(tutorial_mob, COMSIG_MOB_TUTORIAL_UPDATE_OBJECTIVE, message) + +/// Initialize the tutorial mob. +/datum/tutorial/proc/init_mob() + tutorial_mob.AddComponent(/datum/component/tutorial_status) + give_action(tutorial_mob, /datum/action/tutorial_end, null, null, src) + ADD_TRAIT(tutorial_mob, TRAIT_IN_TUTORIAL, TRAIT_SOURCE_TUTORIAL) + +/// Ends the tutorial after a certain amount of time. +/datum/tutorial/proc/tutorial_end_in(time = 5 SECONDS, completed = TRUE) + tutorial_ending = TRUE + addtimer(CALLBACK(src, PROC_REF(end_tutorial), completed), time) + +/// Initialize any objects that need to be in the tutorial area from the beginning. +/datum/tutorial/proc/init_map() + return + +/// Returns a turf offset by offset_x (left-to-right) and offset_y (up-to-down) +/datum/tutorial/proc/loc_from_corner(offset_x = 0, offset_y = 0) + RETURN_TYPE(/turf) + return locate(bottom_left_corner.x + offset_x, bottom_left_corner.y + offset_y, bottom_left_corner.z) + +/// Handle the player ghosting out +/datum/tutorial/proc/on_ghost(datum/source, mob/dead/observer/ghost) + SIGNAL_HANDLER + + var/mob/new_player/new_player = new + if(!ghost.mind) + ghost.mind_initialize() + + ghost.mind.transfer_to(new_player) + + end_tutorial(FALSE) + +/// A wrapper for signals to call end_tutorial() +/datum/tutorial/proc/signal_end_tutorial(datum/source) + SIGNAL_HANDLER + + end_tutorial(FALSE) + +/// Called whenever the tutorial_mob logs out +/datum/tutorial/proc/on_logout(datum/source) + SIGNAL_HANDLER + + if(tutorial_mob.aghosted) + return + + end_tutorial(FALSE) + +/// Generate a dictionary of button : action for use of referencing what keys to press +/datum/tutorial/proc/generate_binds() + if(!tutorial_mob.client?.prefs) + return + + for(var/bind in tutorial_mob.client.prefs.key_bindings) + var/action = tutorial_mob.client.prefs.key_bindings[bind] + // We presume the first action under a certain binding is the one we want. + if(action[1] in player_bind_dict) + player_bind_dict[action[1]] += bind + else + player_bind_dict[action[1]] = list(bind) + +/// Getter for player_bind_dict. Provide an action name like "North" or "quick_equip" +/datum/tutorial/proc/retrieve_bind(action_name) + if(!action_name) + return + + if(!(action_name in player_bind_dict)) + return "Undefined" + + return player_bind_dict[action_name][1] + +/datum/action/tutorial_end + name = "Stop Tutorial" + action_icon_state = "hologram_exit" + /// Weakref to the tutorial this is related to + var/datum/weakref/tutorial + +/datum/action/tutorial_end/New(Target, override_icon_state, datum/tutorial/selected_tutorial) + . = ..() + tutorial = WEAKREF(selected_tutorial) + +/datum/action/tutorial_end/action_activate() + if(!tutorial) + return + + var/datum/tutorial/selected_tutorial = tutorial.resolve() + if(selected_tutorial.tutorial_ending) + return + + selected_tutorial.end_tutorial() + + +/datum/map_template/tutorial + name = "Tutorial Zone (12x12)" + mappath = "maps/tutorial/tutorial_12x12.dmm" + width = 12 + height = 12 + +/datum/map_template/tutorial/s12x12 + +/datum/map_template/tutorial/s8x9 + name = "Tutorial Zone (8x9)" + mappath = "maps/tutorial/tutorial_8x9.dmm" + width = 8 + height = 9 + +/datum/map_template/tutorial/s8x9/no_baselight + name = "Tutorial Zone (8x9) (No Baselight)" + mappath = "maps/tutorial/tutorial_8x9_nb.dmm" + +/datum/map_template/tutorial/s7x7 + name = "Tutorial Zone (7x7)" + mappath = "maps/tutorial/tutorial_7x7.dmm" + width = 7 + height = 7 diff --git a/code/datums/tutorial/_tutorial_menu.dm b/code/datums/tutorial/_tutorial_menu.dm new file mode 100644 index 000000000000..42eb3f6aabfa --- /dev/null +++ b/code/datums/tutorial/_tutorial_menu.dm @@ -0,0 +1,83 @@ +/datum/tutorial_menu + /// List of ["name" = name, "tutorials" = ["name" = name, "path" = "path", "id" = tutorial_id]] + var/static/list/categories = list() + + +/datum/tutorial_menu/New() + if(!length(categories)) + var/list/categories_2 = list() + for(var/datum/tutorial/tutorial as anything in subtypesof(/datum/tutorial)) + if(initial(tutorial.parent_path) == tutorial) + continue + + if(!(initial(tutorial.category) in categories_2)) + categories_2[initial(tutorial.category)] = list() + + categories_2[initial(tutorial.category)] += list(list( + "name" = initial(tutorial.name), + "path" = "[tutorial]", + "id" = initial(tutorial.tutorial_id), + "description" = initial(tutorial.desc), + "image" = initial(tutorial.icon_state), + )) + + for(var/category in categories_2) + categories += list(list( + "name" = category, + "tutorials" = categories_2[category], + )) + + +/datum/tutorial_menu/proc/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "TutorialMenu") + ui.open() + +/datum/tutorial_menu/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/tutorial), + ) + +/datum/tutorial_menu/ui_state(mob/user) + if(istype(get_area(user), /area/misc/tutorial)) + return GLOB.never_state + + return GLOB.new_player_state + + +/datum/tutorial_menu/ui_static_data(mob/user) + var/list/data = list() + + data["tutorial_categories"] = categories + if(user.client?.prefs) + data["completed_tutorials"] = user.client.prefs.completed_tutorials + else + data["completed_tutorials"] = list() + + return data + + +/datum/tutorial_menu/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + switch(action) + if("select_tutorial") + var/datum/tutorial/path + if(!params["tutorial_path"]) + return + + path = text2path(params["tutorial_path"]) + + if(!path || !isnewplayer(usr)) + return + + if(HAS_TRAIT(usr, TRAIT_IN_TUTORIAL) || istype(get_area(usr), /area/misc/tutorial)) + to_chat(usr, SPAN_NOTICE("You are currently in a tutorial, or one is loading. Please be patient.")) + return + + path = new path + path.start_tutorial(usr) + return TRUE diff --git a/code/datums/tutorial/creating_a_tutorial.md b/code/datums/tutorial/creating_a_tutorial.md new file mode 100644 index 000000000000..96a7cb886820 --- /dev/null +++ b/code/datums/tutorial/creating_a_tutorial.md @@ -0,0 +1,96 @@ +# Tutorial Creation + +[ToC] + +## Step 1: Identifying the Goal + +Your first objective when making a tutorial should be to have a clear and concise vision of what you want the tutorial to convey to the user. People absorb information better in smaller chunks, so you should ideally keep a tutorial to one section of information at a time. + +For example, if you are making a tutorial for new CM players, it should be split into multiple parts like: + +- Basics +- Medical +- Weaponry +- Requisitions/Communication + +## Step 2: Coding + +For an example of the current code standards for tutorials, see [this](https://github.com/cmss13-devs/cmss13/pull/4442/files#diff-843b2f84360b9b932dfc960027992f2b5117667962bfa8da14f9a35f0179a926) file. + +The API for tutorials is designed to be very simple, so I'll go over all the base `/datum/tutorial` procs and some vars here: + +### Variables +- `name` + - This is the player-facing name of the tutorial. +- `tutorial_id` + - This is the back-end ID of the tutorial, used for save files. Try not to change a tutorial's ID after it's on the live server. +- `category` + - This is what category the tutorial should be under. Use the `TUTORIAL_CATEGORY_XXXX` macros. +- `tutorial_template` + - This is what type the map template of the tutorial should be. The default space is 12x12; ideally make it so it fits the given scale of the tutorial with some wiggle room for the player to move around. +- `parent_path` + - This is the top-most parent `/datum/tutorial` path, used to exclude abstract parents from the tutorial menu. For example, `/datum/tutorial/marine/basic` would have a `parent_path` of `/datum/tutorial/marine`, since that path is the top-most abstract path. + +### Procs +- `start_tutorial(mob/starting_mob)` + - This proc starts the tutorial, setting up the map template and player. This should be overridden with a parent call before any overridden code. +- `end_tutorial(completed = FALSE)` + - This proc ends the tutorial, sending the player back to the lobby and deleting the tutorial itself. A parent call on any subtypes should be at the end of the overridden segment. If `completed` is `TRUE`, then the tutorial will save as a completed one for the user. +- `add_highlight(atom/target, color = "#d19a02")` + - This proc adds a highlight filter around an atom, by default this color. Successive calls of highlight on the same atom will override the last. +- `remove_highlight(atom/target)` + - This proc removes the tutorial highlight from a target. +- `add_to_tracking_atoms(atom/reference)` + - This proc will add a reference to the tutorial's tracked atom dictionary. For what a tracked atom is, see Step 2.1. +- `remove_from_tracking_atoms(atom/reference)` + - This proc will remove a reference from the tutorial's tracked atom dictionary. For what a tracked atom is, see Step 2.1. +- `message_to_player(message)` + - This proc is the ideal way to communicate to a player. It is visually similar to overwatch messages or weather alerts, but appears and disappears much faster. The messages sent should be consise, but can have a degree of dialogue to them. +- `update_objective(message)` + - This proc is used to update the player's objective in their status panel. This should be only what is required and how to do it without any dialogue or extra text. +- `init_mob()` + - This proc is used to initialize the mob and set them up correctly. +- `init_map()` + - This proc does nothing by default, but can be overriden to spawn any atoms necessary for the tutorial from the very start. +- `tutorial_end_in(time = 5 SECONDS, completed = TRUE)` + - This proc will end the tutorial in the given time, defaulting to 5 seconds. Once the proc is called, the player will be booted back to the menu screen after the time is up. Will mark the tutorial as completed if `completed` is `TRUE` +- `loc_from_corner(offset_x = 0, offset_y = 0)` + - This proc will return a turf offset from the bottom left corner of the tutorial zone. Keep in mind, the bottom left corner is NOT on a wall, it is on the first floor on the bottom left corner. `offset_x` and `offset_y` are used to offset what turf you want to get, and should never be negative. + +## Step 2.1: Tracking Atoms +Naturally, you will need to keep track of certain objects or mobs for signal purposes, so the tracking system exists to fill that purpose. When you add a reference to the tracking atom list with `add_to_tracking_atoms()`, it gets put into a dictionary of `{path : reference}`. Because of this limitation, you should not track more than 1 object of the same type. To get a tracked atom, use of the `TUTORIAL_ATOM_FROM_TRACKING(path, varname)` macro is recommended. `path` should be replaced with the precise typepath of the tracked atom, and `varname` should be replaced with the variable name you wish to use. If an object is going to be deleted, remove it with `remove_from_tracking_atoms()` first. + +## Step 2.2: Scripting Format +Any proc whose main purpose is to advance the tutorial will be hereon referred to as a "script proc", as part of the entire "script". In the vast majority of cases, a script proc should hand off to the next using signals. Here is an example from `basic_marine.dm`: + +```javascript +/datum/tutorial/marine/basic/proc/on_cryopod_exit() + SIGNAL_HANDLER + + UnregisterSignal(tracking_atoms[/obj/structure/machinery/cryopod/tutorial], COMSIG_CRYOPOD_GO_OUT) + message_to_player("Good. You may notice the yellow \"food\" icon on the right side of your screen. Proceed to the outlined Food Vendor and vend the USCM Protein Bar.") + update_objective("Vend a USCM Protein Bar from the outlined ColMarTech Food Vendor.") + TUTORIAL_ATOM_FROM_TRACKING(/obj/structure/machinery/cm_vending/sorted/marine_food/tutorial, food_vendor) + add_highlight(food_vendor) + food_vendor.req_access = list() + RegisterSignal(food_vendor, COMSIG_VENDOR_SUCCESSFUL_VEND, PROC_REF(on_food_vend)) + +``` + +Line-by-line: + - `SIGNAL_HANDLER` is necessary as this proc was called via signal. + - Here we are unregistering the signal we registered in the previous proc to call this one, which in this case was waiting for the player to leave the tracked cryopod. + - Now, we tell the user the next step in the script, which is sent to their screen. + - Here we update the player's status panel with similar info to the above line, but far more condensed. + - Since we need to access the food vendor, we use the `TUTORIAL_ATOM_FROM_TRACKING()` macro to get a ref to it. + - We add a yellow outline to the food vendor to make it more clear what is wanted of the player + - The tutorial food vendors are locked to `ACCESS_TUTORIAL_LOCKED` by default, so here we remove that access requirement + - And finally, we register a signal for the next script proc, waiting for the user to vend something from the food vendor. + + +## Step 2.3: Quirks & Tips +- Generally speaking, you will want to create `/tutorial` subtypes of anything you add in the tutorial, should it need any special functions or similar. +- Restrict access from players as much as possible. As seen in the example above, restricting access to vendors and similar machines is recommended to prevent sequence breaking. Additionally, avoid adding anything that detracts from the tutorial itself. +- Attempt to avoid softlocks when possible. If someone could reasonably do something (e.g. firing every bullet they have at a ranged target and missing, now unable to kill them and progress) that could softlock them, then there should be a fallback of some sort. However, accomodations don't need to be made for people who purposefully cause a softlock; there's a "stop tutorial" button for a reason. +- When calling `message_to_player()` or `update_objective()`, **bold** the names of objects, items, and keybinds. +- Attempt to bind as many scripting signals to the `tutorial_mob` as possible. The nature of SS13 means something as sequence-heavy as this will always be fragile, so keeping the fragility we can affect to a minimum is imperative. diff --git a/code/datums/tutorial/marine/_marine.dm b/code/datums/tutorial/marine/_marine.dm new file mode 100644 index 000000000000..ceb0ba8ab550 --- /dev/null +++ b/code/datums/tutorial/marine/_marine.dm @@ -0,0 +1,21 @@ +/datum/tutorial/marine + category = TUTORIAL_CATEGORY_MARINE + parent_path = /datum/tutorial/marine + icon_state = "marine" + +/datum/tutorial/marine/init_mob() + var/mob/living/carbon/human/new_character = new(bottom_left_corner) + new_character.lastarea = get_area(bottom_left_corner) + + setup_human(new_character, tutorial_mob) + + //SSround_recording.recorder.track_player(new_character) //zonenote: check if necessary + + new_character.marine_snowflake_points = MARINE_TOTAL_SNOWFLAKE_POINTS + new_character.marine_buyable_categories = MARINE_CAN_BUY_ALL + + tutorial_mob = new_character + RegisterSignal(tutorial_mob, COMSIG_LIVING_GHOSTED, PROC_REF(on_ghost)) + RegisterSignal(tutorial_mob, list(COMSIG_PARENT_QDELETING, COMSIG_MOB_DEATH, COMSIG_MOB_END_TUTORIAL), PROC_REF(signal_end_tutorial)) + RegisterSignal(tutorial_mob, COMSIG_MOB_LOGOUT, PROC_REF(on_logout)) + return ..() diff --git a/code/datums/tutorial/marine/basic_marine.dm b/code/datums/tutorial/marine/basic_marine.dm new file mode 100644 index 000000000000..af9d2eaf18dd --- /dev/null +++ b/code/datums/tutorial/marine/basic_marine.dm @@ -0,0 +1,208 @@ +/datum/tutorial/marine/basic + name = "Marine - Basic" + desc = "A tutorial to get you acquainted with the very basics of how to play a groundside marine role." + tutorial_id = "marine_basic_1" + tutorial_template = /datum/map_template/tutorial/s8x9/no_baselight + /// How many items need to be vended from the clothing vendor for the script to continue, if something vends 2 items (for example), increase this number by 2. + var/clothing_items_to_vend = 8 + /// How many items need to be vended from the gun vendor to continue + var/gun_items_to_vend = 2 + +// START OF SCRIPTING + +/datum/tutorial/marine/basic/start_tutorial(mob/starting_mob) + . = ..() + if(!.) + return + + var/obj/item/device/flashlight/flashlight = new(loc_from_corner(2, 3)) + flashlight.anchored = TRUE + flashlight.set_light_power(4) + flashlight.set_light_range(12) + flashlight.icon = null + flashlight.set_light_on(TRUE) + add_to_tracking_atoms(flashlight) + + init_mob() + message_to_player("This is the tutorial for marine rifleman. Leave the cryopod by pressing [retrieve_bind("North")] or [retrieve_bind("East")] to continue.") + update_objective("Exit the cryopod by pressing [retrieve_bind("North")] or [retrieve_bind("East")].") + RegisterSignal(tracking_atoms[/obj/structure/machinery/cryopod/tutorial], COMSIG_CRYOPOD_GO_OUT, PROC_REF(on_cryopod_exit)) + +/datum/tutorial/marine/basic/proc/on_cryopod_exit() + SIGNAL_HANDLER + + UnregisterSignal(tracking_atoms[/obj/structure/machinery/cryopod/tutorial], COMSIG_CRYOPOD_GO_OUT) + message_to_player("Good. You may notice the yellow \"food\" icon on the right side of your screen. Proceed to the outlined Food Vendor and vend the USCM Protein Bar.") + update_objective("Vend a USCM Protein Bar from the outlined ColMarTech Food Vendor.") + TUTORIAL_ATOM_FROM_TRACKING(/obj/structure/machinery/cm_vending/sorted/marine_food/tutorial, food_vendor) + add_highlight(food_vendor) + food_vendor.req_access = list() + RegisterSignal(food_vendor, COMSIG_VENDOR_SUCCESSFUL_VEND, PROC_REF(on_food_vend)) + +/datum/tutorial/marine/basic/proc/on_food_vend(datum/source, obj/structure/machinery/cm_vending/vendor, list/itemspec, mob/living/carbon/human/user) + SIGNAL_HANDLER + + TUTORIAL_ATOM_FROM_TRACKING(/obj/structure/machinery/cm_vending/sorted/marine_food/tutorial, food_vendor) + UnregisterSignal(food_vendor, COMSIG_VENDOR_SUCCESSFUL_VEND) + remove_highlight(food_vendor) + food_vendor.req_access = list(ACCESS_TUTORIAL_LOCKED) + message_to_player("Now click on your character with the USCM Protein Bar in-hand until it is fully eaten. If you accidentally switched hands, switch back with [retrieve_bind("swap_hands")].") + update_objective("Eat the USCM Protein Bar by clicking on yourself while holding it, until it is gone.") + RegisterSignal(tutorial_mob, COMSIG_MOB_EATEN_SNACK, PROC_REF(on_foodbar_eaten)) + +/datum/tutorial/marine/basic/proc/on_foodbar_eaten(datum/source, obj/item/reagent_container/food/snacks/eaten_food) + SIGNAL_HANDLER + + if(!istype(eaten_food, /obj/item/reagent_container/food/snacks/protein_pack) || eaten_food.reagents.total_volume) + return + + UnregisterSignal(source, COMSIG_MOB_EATEN_SNACK) + message_to_player("Good. Now move to the outlined vendor and vend everything inside.") + update_objective("Vend everything inside the ColMarTech Automated Closet.") + TUTORIAL_ATOM_FROM_TRACKING(/obj/structure/machinery/cm_vending/clothing/tutorial, clothing_vendor) + add_highlight(clothing_vendor) + clothing_vendor.req_access = list() + RegisterSignal(clothing_vendor, COMSIG_VENDOR_SUCCESSFUL_VEND, PROC_REF(on_clothing_vend)) + +/datum/tutorial/marine/basic/proc/on_clothing_vend(datum/source) + SIGNAL_HANDLER + + clothing_items_to_vend-- + if(clothing_items_to_vend <= 0) + TUTORIAL_ATOM_FROM_TRACKING(/obj/structure/machinery/cm_vending/clothing/tutorial, clothing_vendor) + UnregisterSignal(clothing_vendor, COMSIG_VENDOR_SUCCESSFUL_VEND) + clothing_vendor.req_access = list(ACCESS_TUTORIAL_LOCKED) + remove_highlight(clothing_vendor) + message_to_player("Now, the room will darken. Take a flare out of your flare pouch by clicking on it with an empty hand, and then light it by using it in-hand with [retrieve_bind("activate_inhand")].") + update_objective("Click on your flare pouch to remove a flare before using it in-hand.") + var/obj/item/storage/pouch/flare/flare_pouch = locate(/obj/item/storage/pouch/flare) in tutorial_mob.contents + if(flare_pouch) + add_highlight(flare_pouch) + RegisterSignal(tutorial_mob, COMSIG_MOB_ITEM_ATTACK_SELF, PROC_REF(on_flare_light)) + addtimer(CALLBACK(src, PROC_REF(dim_room)), 2.5 SECONDS) + +/datum/tutorial/marine/basic/proc/on_flare_light(datum/source, obj/item/used) + SIGNAL_HANDLER + + if(!istype(used, /obj/item/device/flashlight/flare)) + return + + UnregisterSignal(tutorial_mob, COMSIG_MOB_ITEM_ATTACK_SELF) + var/obj/item/storage/pouch/flare/flare_pouch = locate(/obj/item/storage/pouch/flare) in tutorial_mob.contents + if(flare_pouch) + remove_highlight(flare_pouch) + + message_to_player("Now throw the flare by clicking on a nearby tile, or dropping it with [retrieve_bind("drop_item")].") + update_objective("Throw the flare by clicking on a nearby tile, or dropping it with [retrieve_bind("drop_item")].") + RegisterSignal(tutorial_mob, COMSIG_MOB_ITEM_DROPPED, PROC_REF(on_flare_throw)) + +/datum/tutorial/marine/basic/proc/on_flare_throw(datum/source, obj/item/thrown) + SIGNAL_HANDLER + + if(!istype(thrown, /obj/item/device/flashlight/flare)) + return + + UnregisterSignal(tutorial_mob, COMSIG_MOB_ITEM_DROPPED) + message_to_player("Good. Now, the room will brighten again. Proceed to the highlighted vendor and vend a M41A Pulse Rifle MK2, along with a magazine.") + update_objective("Vend everything from the ColMarTech Automated Weapons Rack.") + addtimer(CALLBACK(src, PROC_REF(brighten_room)), 1.5 SECONDS) + TUTORIAL_ATOM_FROM_TRACKING(/obj/structure/machinery/cm_vending/sorted/cargo_guns/squad_prep/tutorial, gun_vendor) + gun_vendor.req_access = list() + add_highlight(gun_vendor) + RegisterSignal(gun_vendor, COMSIG_VENDOR_SUCCESSFUL_VEND, PROC_REF(on_gun_vend)) + +/datum/tutorial/marine/basic/proc/on_gun_vend(datum/source) + SIGNAL_HANDLER + + gun_items_to_vend-- + if(gun_items_to_vend <= 0) + TUTORIAL_ATOM_FROM_TRACKING(/obj/structure/machinery/cm_vending/sorted/cargo_guns/squad_prep/tutorial, gun_vendor) + gun_vendor.req_access = list(ACCESS_TUTORIAL_LOCKED) + remove_highlight(gun_vendor) + UnregisterSignal(gun_vendor, COMSIG_VENDOR_SUCCESSFUL_VEND) + message_to_player("Now insert the magazine into the M41A Pulse Rifle by having the magazine in your active hand and hitting the Pulse Rifle with it. If it is in the off-hand, switch with [retrieve_bind("swap_hands")].") + update_objective("Insert the M41A magazine by hitting the M41A Pulse Rifle with it.") + RegisterSignal(tutorial_mob, COMSIG_MOB_RELOADED_GUN, PROC_REF(on_magazine_insert)) + +/datum/tutorial/marine/basic/proc/on_magazine_insert(datum/source, atom/attacked, obj/item/attacked_with) + SIGNAL_HANDLER + + UnregisterSignal(tutorial_mob, COMSIG_MOB_RELOADED_GUN) + message_to_player("Good. Now wield your gun by using it in-hand with [retrieve_bind("activate_inhand")].") + update_objective("Wield your gun with two hands by pressing [retrieve_bind("activate_inhand")] with the gun in your main hand.") + RegisterSignal(tutorial_mob, COMSIG_MOB_ITEM_ATTACK_SELF, PROC_REF(on_gun_wield)) + +/datum/tutorial/marine/basic/proc/on_gun_wield(datum/source, obj/item/used) + SIGNAL_HANDLER + + if(!istype(used, /obj/item/weapon/gun/rifle/m41a)) + return + + UnregisterSignal(tutorial_mob, COMSIG_MOB_ITEM_ATTACK_SELF) + message_to_player("Now, shoot at the highlighted Xenomorph until it dies.") + update_objective("Shoot at the Xenomorph until it dies.") + var/mob/living/carbon/xenomorph/drone/tutorial/xeno_dummy = new(loc_from_corner(4, 5)) + add_to_tracking_atoms(xeno_dummy) + add_highlight(xeno_dummy, COLOR_VIVID_RED) + RegisterSignal(xeno_dummy, COMSIG_MOB_DEATH, PROC_REF(on_xeno_death)) + RegisterSignal(tutorial_mob, COMSIG_MOB_GUN_EMPTY, PROC_REF(on_magazine_empty)) // I'd like to prevent unwilling softlocks as much as I can + +/// Non-contiguous part of the script, called if the user manages to run out of ammo in the gun without the xeno dying +/datum/tutorial/marine/basic/proc/on_magazine_empty(obj/item/weapon/gun/empty_gun) + SIGNAL_HANDLER + + UnregisterSignal(tutorial_mob, COMSIG_MOB_GUN_EMPTY) + message_to_player("Your gun's out of ammo. Go grab some more from the Weaponry Vendor and kill the Xenomorph.") + TUTORIAL_ATOM_FROM_TRACKING(/obj/structure/machinery/cm_vending/sorted/cargo_guns/squad_prep/tutorial, gun_vendor) + gun_vendor.req_access = list() + gun_vendor.load_ammo() // 99 magazines, to make sure that the xeno dies + +/datum/tutorial/marine/basic/proc/on_xeno_death(datum/source) + SIGNAL_HANDLER + + TUTORIAL_ATOM_FROM_TRACKING(/mob/living/carbon/xenomorph/drone/tutorial, xeno_dummy) + UnregisterSignal(xeno_dummy, COMSIG_MOB_DEATH) + UnregisterSignal(tutorial_mob, COMSIG_MOB_GUN_EMPTY) + remove_highlight(xeno_dummy) + addtimer(CALLBACK(src, PROC_REF(disappear_xeno)), 2.5 SECONDS) + message_to_player("Very good. This is the end of the tutorial, proceed to the next one to learn the basics of Medical. You will be sent back to the lobby screen momentarily.") + update_objective("") + tutorial_end_in(7.5 SECONDS, TRUE) + + +// END OF SCRIPTING +// START OF SCRIPT HELPERS + +/datum/tutorial/marine/basic/proc/dim_room() + TUTORIAL_ATOM_FROM_TRACKING(/obj/item/device/flashlight, flashlight) + flashlight.set_light_on(FALSE) + +/datum/tutorial/marine/basic/proc/brighten_room() + TUTORIAL_ATOM_FROM_TRACKING(/obj/item/device/flashlight, flashlight) + flashlight.set_light_on(TRUE) + +/datum/tutorial/marine/basic/proc/disappear_xeno() + TUTORIAL_ATOM_FROM_TRACKING(/mob/living/carbon/xenomorph/drone/tutorial, xeno_dummy) + animate(xeno_dummy, time = 5 SECONDS, alpha = 0) + remove_from_tracking_atoms(xeno_dummy) + QDEL_IN(xeno_dummy, 5.5 SECONDS) + +// END OF SCRIPT HELPERS + +/datum/tutorial/marine/basic/init_mob() + . = ..() + arm_equipment(tutorial_mob, /datum/equipment_preset/tutorial) + + TUTORIAL_ATOM_FROM_TRACKING(/obj/structure/machinery/cryopod/tutorial, tutorial_pod) + tutorial_pod.go_in_cryopod(tutorial_mob, TRUE, FALSE) + + +/datum/tutorial/marine/basic/init_map() + var/obj/structure/machinery/cryopod/tutorial/tutorial_pod = new(bottom_left_corner) + add_to_tracking_atoms(tutorial_pod) + var/obj/structure/machinery/cm_vending/sorted/marine_food/tutorial/food_vendor = new(loc_from_corner(0, 2)) + add_to_tracking_atoms(food_vendor) + var/obj/structure/machinery/cm_vending/clothing/tutorial/clothing_vendor = new(loc_from_corner(0, 4)) + add_to_tracking_atoms(clothing_vendor) + var/obj/structure/machinery/cm_vending/sorted/cargo_guns/squad_prep/tutorial/gun_vendor = new(loc_from_corner(0, 5)) + add_to_tracking_atoms(gun_vendor) diff --git a/code/datums/tutorial/marine/medical_basic.dm b/code/datums/tutorial/marine/medical_basic.dm new file mode 100644 index 000000000000..3a42a6d2ecc2 --- /dev/null +++ b/code/datums/tutorial/marine/medical_basic.dm @@ -0,0 +1,174 @@ +/datum/tutorial/marine/medical_basic + name = "Marine - Medical (Basic)" + desc = "Learn how to treat common injuries you may face as a marine." + tutorial_id = "marine_medical_1" + tutorial_template = /datum/map_template/tutorial/s7x7 + +// START OF SCRIPTING + +/datum/tutorial/marine/medical_basic/start_tutorial(mob/starting_mob) + . = ..() + if(!.) + return + + init_mob() + message_to_player("This is the tutorial for the basics of medical that you will need to know for playing a marine role.") + addtimer(CALLBACK(src, PROC_REF(brute_tutorial)), 4 SECONDS) + +/datum/tutorial/marine/medical_basic/proc/brute_tutorial() + message_to_player("The first kind of damage is Brute, the most common kind. It represents physical trauma from things like punches, weapons, or guns.") + var/mob/living/living_mob = tutorial_mob + living_mob.adjustBruteLoss(10) + addtimer(CALLBACK(src, PROC_REF(brute_tutorial_2)), 4 SECONDS) + +/datum/tutorial/marine/medical_basic/proc/brute_tutorial_2() + message_to_player("You can observe if you have Brute or Burn damage by clicking on yourself with an empty hand on help intent.") + update_objective("Click on yourself with an empty hand.") + RegisterSignal(tutorial_mob, COMSIG_LIVING_ATTACKHAND_HUMAN, PROC_REF(on_health_examine)) + +/datum/tutorial/marine/medical_basic/proc/on_health_examine(datum/source, mob/living/carbon/human/attacked_mob) + SIGNAL_HANDLER + + if(attacked_mob != tutorial_mob) + return + + UnregisterSignal(tutorial_mob, COMSIG_LIVING_ATTACKHAND_HUMAN) + message_to_player("Good. Now, you have taken some brute damage. Bicaridine is used to fix brute over time. Pick up the bicaridine EZ autoinjector and use it in-hand.") + update_objective("Inject yourself with the bicaridine injector.") + var/obj/item/reagent_container/hypospray/autoinjector/bicaridine/skillless/one_use/brute_injector = new(loc_from_corner(0, 4)) + add_to_tracking_atoms(brute_injector) + add_highlight(brute_injector) + RegisterSignal(tutorial_mob, COMSIG_LIVING_HYPOSPRAY_INJECTED, PROC_REF(on_brute_inject)) + +/datum/tutorial/marine/medical_basic/proc/on_brute_inject(datum/source, obj/item/reagent_container/hypospray/injector) + SIGNAL_HANDLER + + if(!istype(injector, /obj/item/reagent_container/hypospray/autoinjector/bicaridine/skillless/one_use)) + return + + UnregisterSignal(tutorial_mob, COMSIG_LIVING_HYPOSPRAY_INJECTED) + TUTORIAL_ATOM_FROM_TRACKING(/obj/item/reagent_container/hypospray/autoinjector/bicaridine/skillless/one_use, brute_injector) + remove_highlight(brute_injector) + message_to_player("All medicines take time to work after injection. Next is Burn damage. It is obtained from things like acid or being set on fire.") + update_objective("") + var/mob/living/living_mob = tutorial_mob + living_mob.adjustFireLoss(10) + addtimer(CALLBACK(src, PROC_REF(burn_tutorial)), 4 SECONDS) + +/datum/tutorial/marine/medical_basic/proc/burn_tutorial() + message_to_player("Kelotane is used to fix burn over time. Inject yourself with the kelotane EZ autoinjector.") + update_objective("Inject yourself with the kelotane injector.") + var/obj/item/reagent_container/hypospray/autoinjector/kelotane/skillless/one_use/burn_injector = new(loc_from_corner(0, 4)) + add_to_tracking_atoms(burn_injector) + add_highlight(burn_injector) + RegisterSignal(tutorial_mob, COMSIG_LIVING_HYPOSPRAY_INJECTED, PROC_REF(on_burn_inject)) + + +/datum/tutorial/marine/medical_basic/proc/on_burn_inject(datum/source, obj/item/reagent_container/hypospray/injector) + SIGNAL_HANDLER + + if(!istype(injector, /obj/item/reagent_container/hypospray/autoinjector/kelotane/skillless/one_use)) + return + + UnregisterSignal(tutorial_mob, COMSIG_LIVING_HYPOSPRAY_INJECTED) + TUTORIAL_ATOM_FROM_TRACKING(/obj/item/reagent_container/hypospray/autoinjector/kelotane/skillless/one_use, burn_injector) + remove_highlight(burn_injector) + message_to_player("Good. Now, when you normally take damage, you will also feel pain. Pain slows you down and can knock you out if left unchecked.") + update_objective("") + var/mob/living/living_mob = tutorial_mob + living_mob.pain.apply_pain(PAIN_CHESTBURST_STRONG) + addtimer(CALLBACK(src, PROC_REF(pain_tutorial)), 4 SECONDS) + +/datum/tutorial/marine/medical_basic/proc/pain_tutorial() + message_to_player("Tramadol is used to reduce your pain. Inject yourself with the tramadol EZ autoinjector.") + update_objective("Inject yourself with the tramadol injector.") + var/obj/item/reagent_container/hypospray/autoinjector/tramadol/skillless/one_use/pain_injector = new(loc_from_corner(0, 4)) + add_to_tracking_atoms(pain_injector) + add_highlight(pain_injector) + RegisterSignal(tutorial_mob, COMSIG_LIVING_HYPOSPRAY_INJECTED, PROC_REF(on_pain_inject)) + +/datum/tutorial/marine/medical_basic/proc/on_pain_inject(datum/source, obj/item/reagent_container/hypospray/injector) + SIGNAL_HANDLER + + if(!istype(injector, /obj/item/reagent_container/hypospray/autoinjector/tramadol/skillless/one_use)) + return + + UnregisterSignal(tutorial_mob, COMSIG_LIVING_HYPOSPRAY_INJECTED) + TUTORIAL_ATOM_FROM_TRACKING(/obj/item/reagent_container/hypospray/autoinjector/tramadol/skillless/one_use, pain_injector) + remove_highlight(pain_injector) + message_to_player("Good. Keep in mind that you can overdose on chemicals, so don't inject yourself with the same chemical too much too often. In the field, injectors have 3 uses.") + update_objective("Don't overdose! Generally, 3 injections of a chemical will overdose you.") + var/mob/living/living_mob = tutorial_mob + living_mob.pain.apply_pain(-PAIN_CHESTBURST_STRONG) // just to make sure + addtimer(CALLBACK(src, PROC_REF(bleed_tutorial)), 4 SECONDS) + +/datum/tutorial/marine/medical_basic/proc/bleed_tutorial() + message_to_player("You can sometimes start bleeding from things like bullets or slashes. Losing blood will accumulate oxygen damage, eventually causing death.") + update_objective("") + var/mob/living/carbon/human/human_mob = tutorial_mob + var/obj/limb/chest/mob_chest = locate(/obj/limb/chest) in human_mob.limbs + mob_chest.add_bleeding(damage_amount = 15) + addtimer(CALLBACK(src, PROC_REF(bleed_tutorial_2)), 4 SECONDS) + +/datum/tutorial/marine/medical_basic/proc/bleed_tutorial_2() + message_to_player("Bleeding wounds can clot themselves over time, or you can fix it quickly with gauze. Pick up the gauze and click on yourself while targeting your chest.") + update_objective("Gauze your chest, or let it clot on its own.") + var/obj/item/stack/medical/bruise_pack/two/bandage = new(loc_from_corner(0, 4)) + add_to_tracking_atoms(bandage) + add_highlight(bandage) + var/mob/living/carbon/human/human_mob = tutorial_mob + var/obj/limb/chest/mob_chest = locate(/obj/limb/chest) in human_mob.limbs + RegisterSignal(mob_chest, COMSIG_LIMB_STOP_BLEEDING, PROC_REF(on_chest_bleed_stop)) + +/datum/tutorial/marine/medical_basic/proc/on_chest_bleed_stop(datum/source, external, internal) + SIGNAL_HANDLER + + // If you exit on this step, your limbs get deleted, which stops the bleeding, which progresses the tutorial despite it ending + if(!tutorial_mob || QDELETED(src)) + return + + var/mob/living/carbon/human/human_mob = tutorial_mob + var/obj/limb/chest/mob_chest = locate(/obj/limb/chest) in human_mob.limbs + UnregisterSignal(mob_chest, COMSIG_LIMB_STOP_BLEEDING) + + TUTORIAL_ATOM_FROM_TRACKING(/obj/item/stack/medical/bruise_pack/two, bandage) + remove_from_tracking_atoms(bandage) + remove_highlight(bandage) + qdel(bandage) + + message_to_player("Good. Sometimes, a bullet or bone shard can result in you getting shrapnel, dealing damage over time. Pick up the knife and use it in-hand to remove the shrapnel.") + update_objective("Remove your shrapnel by using the knife in-hand.") + var/mob/living/living_mob = tutorial_mob + living_mob.pain.feels_pain = FALSE + + var/obj/item/attachable/bayonet/knife = new(loc_from_corner(0, 4)) + add_to_tracking_atoms(knife) + add_highlight(knife) + + var/obj/item/shard/shrapnel/tutorial/shrapnel = new + shrapnel.on_embed(tutorial_mob, mob_chest, TRUE) + + RegisterSignal(tutorial_mob, COMSIG_HUMAN_SHRAPNEL_REMOVED, PROC_REF(on_shrapnel_removed)) + +/datum/tutorial/marine/medical_basic/proc/on_shrapnel_removed() + SIGNAL_HANDLER + + UnregisterSignal(tutorial_mob, COMSIG_HUMAN_SHRAPNEL_REMOVED) + TUTORIAL_ATOM_FROM_TRACKING(/obj/item/attachable/bayonet, knife) + remove_highlight(knife) + message_to_player("Good. This is the end of the basic marine medical tutorial. The tutorial will end shortly.") + update_objective("Tutorial completed.") + tutorial_end_in(5 SECONDS) + +// END OF SCRIPTING +// START OF SCRIPT HELPERS + +// END OF SCRIPT HELPERS + +/datum/tutorial/marine/medical_basic/init_mob() + . = ..() + arm_equipment(tutorial_mob, /datum/equipment_preset/tutorial/fed) + + +/datum/tutorial/marine/medical_basic/init_map() + new /obj/structure/surface/table/almayer(loc_from_corner(0, 4)) diff --git a/code/datums/tutorial/ss13/_ss13.dm b/code/datums/tutorial/ss13/_ss13.dm new file mode 100644 index 000000000000..53cf5c918ee9 --- /dev/null +++ b/code/datums/tutorial/ss13/_ss13.dm @@ -0,0 +1,41 @@ +/datum/tutorial/ss13 + category = TUTORIAL_CATEGORY_SS13 + parent_path = /datum/tutorial/ss13 + icon_state = "ss13" + +/datum/tutorial/ss13/init_mob() + tutorial_mob.close_spawn_windows() + + var/mob/living/carbon/human/new_character = new(bottom_left_corner) + new_character.lastarea = get_area(bottom_left_corner) + + tutorial_mob.client.prefs.copy_all_to(new_character) + + if(tutorial_mob.client.prefs.be_random_body) + var/datum/preferences/rand_prefs = new() + rand_prefs.randomize_appearance(new_character) + + new_character.job = tutorial_mob.job + new_character.name = tutorial_mob.real_name + new_character.voice = tutorial_mob.real_name + + new_character.sec_hud_set_ID() + new_character.hud_set_squad() + + SSround_recording.recorder.track_player(new_character) + + if(tutorial_mob.mind) + tutorial_mob.mind_initialize() + tutorial_mob.mind.transfer_to(new_character, TRUE) + tutorial_mob.mind.setup_human_stats() + + INVOKE_ASYNC(new_character, TYPE_PROC_REF(/mob/living/carbon/human, regenerate_icons)) + INVOKE_ASYNC(new_character, TYPE_PROC_REF(/mob/living/carbon/human, update_body), 1, 0) + INVOKE_ASYNC(new_character, TYPE_PROC_REF(/mob/living/carbon/human, update_hair)) + + tutorial_mob = new_character + RegisterSignal(tutorial_mob, COMSIG_LIVING_GHOSTED, PROC_REF(on_ghost)) + RegisterSignal(tutorial_mob, list(COMSIG_PARENT_QDELETING, COMSIG_MOB_DEATH, COMSIG_MOB_END_TUTORIAL), PROC_REF(signal_end_tutorial)) + RegisterSignal(tutorial_mob, COMSIG_MOB_LOGOUT, PROC_REF(on_logout)) + arm_equipment(tutorial_mob, /datum/equipment_preset/tutorial/fed) + return ..() diff --git a/code/datums/tutorial/ss13/basic_ss13.dm b/code/datums/tutorial/ss13/basic_ss13.dm new file mode 100644 index 000000000000..65bb0cac94f4 --- /dev/null +++ b/code/datums/tutorial/ss13/basic_ss13.dm @@ -0,0 +1,84 @@ +/datum/tutorial/ss13/basic + name = "Space Station 13 - Basic" + desc = "Learn the very basics of Space Station 13. Recommended if you haven't played before." + tutorial_id = "ss13_basic_1" + tutorial_template = /datum/map_template/tutorial/s7x7 + +// START OF SCRIPTING + +/datum/tutorial/ss13/basic/start_tutorial(mob/starting_mob) + . = ..() + if(!.) + return + + init_mob() + message_to_player("This is the tutorial for the basics of Space Station 13. Any current instructions can be found in the top-right corner, in the status panel.") + update_objective("Here's where it'll be!") + + addtimer(CALLBACK(src, PROC_REF(require_move)), 4 SECONDS) // check if this is a good amount of time + +/datum/tutorial/ss13/basic/proc/require_move() + message_to_player("Now, move in any direction using [retrieve_bind("North")], [retrieve_bind("West")], [retrieve_bind("South")], or [retrieve_bind("East")].") + update_objective("Move in any direction using the [retrieve_bind("North")][retrieve_bind("West")][retrieve_bind("South")][retrieve_bind("East")] keys.") + + RegisterSignal(tutorial_mob, COMSIG_MOB_MOVE_OR_LOOK, PROC_REF(on_move)) + +/datum/tutorial/ss13/basic/proc/on_move(datum/source, actually_moving, direction, specific_direction) + SIGNAL_HANDLER + + if(!actually_moving) // The mob just looked in a different dir instead of moving + return + + UnregisterSignal(tutorial_mob, COMSIG_MOB_MOVE_OR_LOOK) + + message_to_player("Good. Now, switch hands with [retrieve_bind("swap_hands")].") + update_objective("Switch hands with [retrieve_bind("swap_hands")].") + + RegisterSignal(tutorial_mob, COMSIG_MOB_SWAPPED_HAND, PROC_REF(on_hand_swap)) + +/datum/tutorial/ss13/basic/proc/on_hand_swap(datum/source) + SIGNAL_HANDLER + + UnregisterSignal(tutorial_mob, COMSIG_MOB_SWAPPED_HAND) + + message_to_player("Good. Now, pick up the satchel that just spawned and equip it with [retrieve_bind("quick_equip")].") + update_objective("Pick up the satchel and equip it with [retrieve_bind("quick_equip")].") + + var/obj/item/storage/backpack/marine/satchel/satchel = new(loc_from_corner(2, 2)) + add_to_tracking_atoms(satchel) + add_highlight(satchel) + + RegisterSignal(tutorial_mob, COMSIG_HUMAN_EQUIPPED_ITEM, PROC_REF(on_satchel_equip)) + +/datum/tutorial/ss13/basic/proc/on_satchel_equip(datum/source, obj/item/equipped, slot) + SIGNAL_HANDLER + + if(!istype(equipped, /obj/item/storage/backpack/marine/satchel) || (slot != WEAR_BACK)) + return + + UnregisterSignal(tutorial_mob, COMSIG_HUMAN_EQUIPPED_ITEM) + TUTORIAL_ATOM_FROM_TRACKING(/obj/item/storage/backpack/marine/satchel, satchel) + remove_highlight(satchel) + message_to_player("Now, say anything by pressing [retrieve_bind("Say")].") + update_objective("Speak using [retrieve_bind("Say")].") + + RegisterSignal(tutorial_mob, COMSIG_LIVING_SPEAK, PROC_REF(on_speak)) + +/datum/tutorial/ss13/basic/proc/on_speak(datum/source) + SIGNAL_HANDLER + + UnregisterSignal(tutorial_mob, COMSIG_LIVING_SPEAK) + message_to_player("Excellent. The next tutorial will cover intents. The tutorial will end shortly.") + update_objective("") + tutorial_end_in(5 SECONDS, TRUE) + +// END OF SCRIPTING +// START OF SCRIPT HELPERS + + + +// END OF SCRIPT HELPERS + +/datum/tutorial/ss13/basic/init_mob() + . = ..() + tutorial_mob.forceMove(loc_from_corner(2, 1)) diff --git a/code/datums/tutorial/ss13/intents.dm b/code/datums/tutorial/ss13/intents.dm new file mode 100644 index 000000000000..d67b2ac1b4a1 --- /dev/null +++ b/code/datums/tutorial/ss13/intents.dm @@ -0,0 +1,113 @@ +/datum/tutorial/ss13/intents + name = "Space Station 13 - Intents" + desc = "Learn how the intent interaction system works." + icon_state = "intents" + tutorial_id = "ss13_intents_1" + tutorial_template = /datum/map_template/tutorial/s7x7 + +// START OF SCRIPTING + +/datum/tutorial/ss13/intents/start_tutorial(mob/starting_mob) + . = ..() + if(!.) + return + + init_mob() + message_to_player("This is the tutorial for the intents system of Space Station 13. The highlighted UI element in the bottom-right corner is your current intent.") + var/datum/hud/human/human_hud = tutorial_mob.hud_used + add_highlight(human_hud.action_intent) + + addtimer(CALLBACK(src, PROC_REF(require_help)), 4.5 SECONDS) + +/datum/tutorial/ss13/intents/proc/require_help() + tutorial_mob.a_intent_change(INTENT_DISARM) + message_to_player("Your intent has been changed off of help. Change back to it by pressing [retrieve_bind("select_help_intent")].") + update_objective("Change to help intent by pressing [retrieve_bind("select_help_intent")].") + + RegisterSignal(tutorial_mob, COMSIG_MOB_INTENT_CHANGE, PROC_REF(on_help_intent)) + +/datum/tutorial/ss13/intents/proc/on_help_intent(datum/source, new_intent) + SIGNAL_HANDLER + + if(new_intent != INTENT_HELP) + return + + UnregisterSignal(tutorial_mob, COMSIG_MOB_INTENT_CHANGE) + + var/mob/living/carbon/human/dummy/tutorial/tutorial_dummy = new(loc_from_corner(2, 3)) + add_to_tracking_atoms(tutorial_dummy) + + message_to_player("The first of the intents is help intent. It is used to harmlessly touch others, put out fire, give CPR, and similar. Click on the Test Dummy to give them a pat on the back.") + update_objective("Click on the dummy on help intent.") + + RegisterSignal(tutorial_mob, COMSIG_LIVING_ATTACKHAND_HUMAN, PROC_REF(on_help_attack)) + +/datum/tutorial/ss13/intents/proc/on_help_attack(datum/source, mob/living/carbon/human/attacked_mob) + SIGNAL_HANDLER + + if((attacked_mob == src) || (tutorial_mob.a_intent != INTENT_HELP)) + return + + UnregisterSignal(tutorial_mob, COMSIG_LIVING_ATTACKHAND_HUMAN) + TUTORIAL_ATOM_FROM_TRACKING(/mob/living/carbon/human/dummy/tutorial, tutorial_dummy) + tutorial_dummy.status_flags = DEFAULT_MOB_STATUS_FLAGS + REMOVE_TRAIT(tutorial_dummy, TRAIT_IMMOBILIZED, TRAIT_SOURCE_TUTORIAL) + tutorial_dummy.anchored = FALSE + + message_to_player("The second intent is disarm, selectable with [retrieve_bind("select_disarm_intent")]. Disarm is used to shove people, which can make them drop items or fall to the ground. Shove the Test Dummy until it falls over.") + update_objective("Switch to disarm intent by pressing [retrieve_bind("select_disarm_intent")] and shove the dummy to the ground.") + + RegisterSignal(tutorial_dummy, COMSIG_LIVING_APPLY_EFFECT, PROC_REF(on_shove_down)) + +/datum/tutorial/ss13/intents/proc/on_shove_down(datum/source, datum/status_effect/new_effect) + SIGNAL_HANDLER + + if(!istype(new_effect, /datum/status_effect/incapacitating/knockdown)) + return + + TUTORIAL_ATOM_FROM_TRACKING(/mob/living/carbon/human/dummy/tutorial, tutorial_dummy) + UnregisterSignal(tutorial_dummy, COMSIG_LIVING_APPLY_EFFECT) + tutorial_dummy.rejuvenate() + + message_to_player("The third intent is grab. Grab is used to grab people in either a passive, aggressive, or chokehold grab. Grab successively to \"upgrade\" your grab. Aggressively grab the Test Dummy.") + update_objective("Aggressively grab the dummy by grabbing them twice.") + + + RegisterSignal(tutorial_dummy, COMSIG_MOB_AGGRESSIVELY_GRABBED, PROC_REF(on_aggrograb)) + +/datum/tutorial/ss13/intents/proc/on_aggrograb(datum/source, mob/living/carbon/human/choker) + SIGNAL_HANDLER + + TUTORIAL_ATOM_FROM_TRACKING(/mob/living/carbon/human/dummy/tutorial, tutorial_dummy) + UnregisterSignal(tutorial_dummy, COMSIG_MOB_AGGRESSIVELY_GRABBED) + + message_to_player("The final intent is harm. Harm is used to injure people with your fists or a melee weapon. Punch the Test Dummy with an empty hand.") + update_objective("Attack the dummy with an empty hand.") + + RegisterSignal(tutorial_mob, COMSIG_LIVING_ATTACKHAND_HUMAN, PROC_REF(on_harm_attack)) + +/datum/tutorial/ss13/intents/proc/on_harm_attack(datum/source, mob/living/carbon/human/attacked_mob) + SIGNAL_HANDLER + + if((attacked_mob == src) || (tutorial_mob.a_intent != INTENT_HARM)) + return + + UnregisterSignal(tutorial_mob, COMSIG_LIVING_ATTACKHAND_HUMAN) + TUTORIAL_ATOM_FROM_TRACKING(/mob/living/carbon/human/dummy/tutorial, tutorial_dummy) + tutorial_dummy.status_flags = GODMODE + + message_to_player("Excellent. Those are the basics of the intent system. The tutorial will end shortly.") + update_objective("") + + tutorial_end_in(5 SECONDS, TRUE) + +// END OF SCRIPTING +// START OF SCRIPT HELPERS + + + +// END OF SCRIPT HELPERS + +/datum/tutorial/ss13/intents/init_mob() + . = ..() + tutorial_mob.forceMove(loc_from_corner(2, 0)) diff --git a/code/datums/tutorial/tutorial_example.dm b/code/datums/tutorial/tutorial_example.dm new file mode 100644 index 000000000000..9042346f8d39 --- /dev/null +++ b/code/datums/tutorial/tutorial_example.dm @@ -0,0 +1,74 @@ +/datum/tutorial/marine/example + name = "Example Tutorial" + tutorial_id = "example" // This won't show up in the list, so this'll be irrelevant anyway. + category = TUTORIAL_CATEGORY_BASE + parent_path = /datum/tutorial/marine/example + +// START OF SCRIPTING + +/datum/tutorial/marine/example/start_tutorial(mob/starting_mob) + // Here, we're calling parent and checking its return value. If it has a falsey one (as done by !.), then something went wrong and we should abort + // There isn't really a reason that you _shouldn't_ have this + . = ..() + if(!.) + return + + // Init_mob() isn't called by default, so we call it here + init_mob() + // As is standard, we give a message to the player and update their status panel with what we want done. + message_to_player("This is an example tutorial. Perform any emote to continue.") + update_objective("Do any emote.") + // This makes the player (tutorial_mob) listen for the COMSIG_MOB_EMOTE event, which will then call on_emote() when it hears it. + RegisterSignal(tutorial_mob, COMSIG_MOB_EMOTE, PROC_REF(on_emote)) + +/datum/tutorial/marine/example/proc/on_emote(datum/source) + // With any proc called via signal (see the RegisterSignal line above for details), we add SIGNAL_HANDLER to it. + SIGNAL_HANDLER + + // Now that we've gotten the signal and started the script, we want to immediately stop listening for it. + UnregisterSignal(tutorial_mob, COMSIG_MOB_EMOTE) + message_to_player("Good. Now, pick up that can of Weyland-Yutani Aspen Beer.") + update_objective("Pick up that can.") + // This macro takes a specific type path (the same used in init_map()) and a variable name to retrieve an object from the tracked object list + TUTORIAL_ATOM_FROM_TRACKING(/obj/item/reagent_container/food/drinks/cans/aspen, beer_can) + // Now we're adding a yellow highlight around the can to make sure people know what we're talking about + add_highlight(beer_can) + // Now, we always prefer to register signals on the tutorial_mob (as opposed to the beer_can) whenever possible + RegisterSignal(tutorial_mob, COMSIG_MOB_PICKUP_ITEM, PROC_REF(on_can_pickup)) + +/// We get these arguments from the signal's definition. If you have VSC, ctrl+click on COMSIG_MOB_PICKUP_ITEM above. When dealing with a signal proc, `datum/source` is always the first argument, then any added ones +/datum/tutorial/marine/example/proc/on_can_pickup(datum/source, obj/item/picked_up) + SIGNAL_HANDLER + + // Since we're just listening for the mob picking anything up, we want to confirm that the picked up item is the can before continuing. If it's not, then we return and keep listening. + if(!istype(picked_up, /obj/item/reagent_container/food/drinks/cans/aspen)) + // If we hit this return here, then the picked up item wasn't the can, so we abort and keep listening. + return + + // Since we passed the above if statement, stop listening for item pickups. + UnregisterSignal(tutorial_mob, COMSIG_MOB_PICKUP_ITEM) + // Let's get the tracked beer can again. + TUTORIAL_ATOM_FROM_TRACKING(/obj/item/reagent_container/food/drinks/cans/aspen, beer_can) + // And remove the highlight now that it's picked up + remove_highlight(beer_can) + message_to_player("Very good. This is the end of the example tutorial. You will be sent back to the lobby screen momentarily.") + // 7.5 seconds after the above message is sent, kick the player out and end the tutorial. + tutorial_end_in(7.5 SECONDS, TRUE) + + +// END OF SCRIPTING +// START OF SCRIPT HELPERS + +// END OF SCRIPT HELPERS + +/datum/tutorial/marine/example/init_mob() + . = ..() + // We give the tutorial mob a basic ID so they can use general vendors and etc. This is here because not all marine tutorials may want to use a naked equipment preset. + arm_equipment(tutorial_mob, /datum/equipment_preset/tutorial) + + +/datum/tutorial/marine/example/init_map() + // Here we're initializing a new can that we want to track, so we spawn it 2 tiles to the left and up from the bottom left corner of the tutorial zone + var/obj/item/reagent_container/food/drinks/cans/aspen/the_can = new(loc_from_corner(2, 2)) + // Now we start tracking it + add_to_tracking_atoms(the_can) diff --git a/code/game/area/admin_level.dm b/code/game/area/admin_level.dm index 00b408c04adf..bfca1481155e 100644 --- a/code/game/area/admin_level.dm +++ b/code/game/area/admin_level.dm @@ -144,3 +144,22 @@ /area/misc/testroom requires_power = FALSE name = "Test Room" + +/area/misc/tutorial + name = "Tutorial Zone" + icon_state = "tutorial" + requires_power = FALSE + flags_area = AREA_NOTUNNEL|AREA_AVOID_BIOSCAN + statistic_exempt = TRUE + ceiling = CEILING_METAL + block_game_interaction = TRUE + unique = TRUE + + base_lighting_alpha = 255 + +/area/misc/tutorial/Initialize(mapload, ...) + . = ..() + update_base_lighting() + +/area/misc/tutorial/no_baselight + base_lighting_alpha = 0 diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 536e29599597..9699db527102 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -79,6 +79,10 @@ var/used_environ = 0 var/used_oneoff = 0 //one-off power usage + /// If this area is outside the game's normal interactivity and should be excluded from things like EOR reports and crew monitors. + /// Doesn't need to be set for areas/Z levels that are marked as admin-only + var/block_game_interaction = FALSE + /area/New() // This interacts with the map loader, so it needs to be set immediately diff --git a/code/game/bioscans.dm b/code/game/bioscans.dm index ff6e00ec430e..5be3c9fbe3fd 100644 --- a/code/game/bioscans.dm +++ b/code/game/bioscans.dm @@ -111,7 +111,7 @@ GLOBAL_DATUM_INIT(bioscan_data, /datum/bioscan_data, new) /datum/bioscan_data/proc/ares_can_bioscan() var/datum/ares_link/link = GLOB.ares_link - if(!istype(link)) + if(!istype(link) || !ares_is_active()) return FALSE if(link.processor_bioscan && !link.processor_bioscan.inoperable()) return TRUE @@ -123,8 +123,8 @@ GLOBAL_DATUM_INIT(bioscan_data, /datum/bioscan_data, new) message_admins("An ARES Bioscan has failed.") var/name = "[MAIN_AI_SYSTEM] Bioscan Status" var/input = "Bioscan failed. \n\nInvestigation into Bioscan subsystem recommended." - log_ares_bioscan(name, input) - if(ares_can_interface()) + log_ares_bioscan(name, input, forced) + if(ares_can_interface() || forced) marine_announcement(input, name, 'sound/misc/interference.ogg', logging = ARES_LOG_NONE) return //Adjust the randomness there so everyone gets the same thing diff --git a/code/game/camera_manager/camera_manager.dm b/code/game/camera_manager/camera_manager.dm index 93d56aca443c..450c7c8beb64 100644 --- a/code/game/camera_manager/camera_manager.dm +++ b/code/game/camera_manager/camera_manager.dm @@ -25,13 +25,16 @@ . = ..() map_name = "camera_manager_[REF(src)]_map" cam_screen = new + cam_screen.icon = null 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_screen.appearance_flags |= TILE_BOUND cam_background = new cam_background.assigned_map = map_name cam_background.del_on_map_removal = FALSE + 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) @@ -42,14 +45,17 @@ . = ..() range_turfs = null current_area = null - cam_plane_masters = null + QDEL_LIST_ASSOC_VAL(cam_plane_masters) QDEL_NULL(cam_background) QDEL_NULL(cam_screen) if(current) UnregisterSignal(current, COMSIG_PARENT_QDELETING) + current = null + last_camera_turf = null /datum/component/camera_manager/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 @@ -61,8 +67,8 @@ var/client/user_client = user.client if(!user_client) return - user_client.register_map_obj(cam_background) user_client.register_map_obj(cam_screen) + user_client.register_map_obj(cam_background) for(var/plane_id in cam_plane_masters) user_client.register_map_obj(cam_plane_masters[plane_id]) @@ -71,14 +77,10 @@ var/client/user_client = user.client if(!user_client) return - user_client.clear_map(cam_background) - user_client.clear_map(cam_screen) - for(var/plane_id in cam_plane_masters) - user_client.clear_map(cam_plane_masters[plane_id]) + user_client.clear_map(map_name) /datum/component/camera_manager/RegisterWithParent() . = ..() - START_PROCESSING(SSdcs, src) SEND_SIGNAL(parent, COMSIG_CAMERA_MAPNAME_ASSIGNED, map_name) RegisterSignal(parent, COMSIG_CAMERA_REGISTER_UI, PROC_REF(register)) RegisterSignal(parent, COMSIG_CAMERA_UNREGISTER_UI, PROC_REF(unregister)) @@ -90,8 +92,6 @@ /datum/component/camera_manager/UnregisterFromParent() . = ..() - STOP_PROCESSING(SSdcs, src) - UnregisterSignal(parent, COMSIG_CAMERA_REGISTER_UI) UnregisterSignal(parent, COMSIG_CAMERA_UNREGISTER_UI) UnregisterSignal(parent, COMSIG_CAMERA_SET_NVG) @@ -134,6 +134,8 @@ target_x = x target_y = y target_z = z + target_width = w + target_height = h update_area_camera() /datum/component/camera_manager/proc/enable_nvg(source, power, matrixcol) @@ -152,10 +154,10 @@ /datum/component/camera_manager/proc/sync_lighting_plane_alpha(lighting_alpha) var/atom/movable/screen/plane_master/lighting/lighting = cam_plane_masters["[LIGHTING_PLANE]"] - if (lighting) + if(lighting) lighting.alpha = lighting_alpha var/atom/movable/screen/plane_master/lighting/exterior_lighting = cam_plane_masters["[EXTERIOR_LIGHTING_PLANE]"] - if (exterior_lighting) + if(exterior_lighting) exterior_lighting.alpha = min(GLOB.minimum_exterior_lighting_alpha, lighting_alpha) /** @@ -215,7 +217,7 @@ var/turf/target = locate(current_area.center_x, current_area.center_y, target_z) var/list/visible_things = isXRay ? range("[x_size]x[y_size]", target) : view("[x_size]x[y_size]", target) - src.render_objects(visible_things) + render_objects(visible_things) /datum/component/camera_manager/proc/render_objects(list/visible_things) var/list/visible_turfs = list() diff --git a/code/game/cas_manager/datums/cas_fire_envelope.dm b/code/game/cas_manager/datums/cas_fire_envelope.dm index 04cd688194dd..d9355cd005a9 100644 --- a/code/game/cas_manager/datums/cas_fire_envelope.dm +++ b/code/game/cas_manager/datums/cas_fire_envelope.dm @@ -19,7 +19,7 @@ var/datum/cas_signal/recorded_loc = null var/obj/effect/firemission_guidance/guidance - + var/atom/tracked_object /datum/cas_fire_envelope/New() ..() @@ -27,6 +27,7 @@ /datum/cas_fire_envelope/Destroy(force, ...) linked_console = null + untrack_object() return ..() /datum/cas_fire_envelope/ui_data(mob/user) @@ -151,7 +152,9 @@ recorded_loc = marker return TRUE -/datum/cas_fire_envelope/proc/change_current_loc(location) +/datum/cas_fire_envelope/proc/change_current_loc(location, atom/object) + if(object) + untrack_object() if(!location && guidance) for(var/mob/M in guidance.users) if(istype(M) && M.client) @@ -162,6 +165,21 @@ guidance = new /obj/effect/firemission_guidance() guidance.forceMove(location) guidance.updateCameras(linked_console) + if(object) + tracked_object = object + RegisterSignal(tracked_object, COMSIG_PARENT_QDELETING, PROC_REF(on_tracked_object_del)) + +/// Call to unregister the on_tracked_object_del behavior +/datum/cas_fire_envelope/proc/untrack_object() + if(tracked_object) + UnregisterSignal(tracked_object, COMSIG_PARENT_QDELETING) + tracked_object = null + +/// Signal handler for when we are viewing a object in cam is qdel'd (but camera actually is actually some other obj) +/datum/cas_fire_envelope/proc/on_tracked_object_del(atom/target) + SIGNAL_HANDLER + tracked_object = null + change_current_loc() /datum/cas_fire_envelope/proc/user_is_guided(user) return guidance && (user in guidance.users) diff --git a/code/game/gamemodes/cm_initialize.dm b/code/game/gamemodes/cm_initialize.dm index 55452972cc3f..c017733de7fd 100644 --- a/code/game/gamemodes/cm_initialize.dm +++ b/code/game/gamemodes/cm_initialize.dm @@ -350,7 +350,7 @@ Additional game mode variables. if(cur_xeno.aghosted) continue //aghosted xenos don't count var/area/area = get_area(cur_xeno) - if(is_admin_level(cur_xeno.z) && (!area || !(area.flags_area & AREA_ALLOW_XENO_JOIN))) + if(should_block_game_interaction(cur_xeno) && (!area || !(area.flags_area & AREA_ALLOW_XENO_JOIN))) continue //xenos on admin z level don't count if(!istype(cur_xeno)) continue @@ -734,8 +734,6 @@ Additional game mode variables. to_chat(new_queen, "You should start by building a hive core.") to_chat(new_queen, "Talk in Hivemind using ; (e.g. ';Hello my children!')") - // Xeno ressource collection - //new_queen.crystal_stored = XENO_STARTING_CRYSTAL new_queen.update_icons() //===================================================\\ diff --git a/code/game/gamemodes/colonialmarines/colonialmarines.dm b/code/game/gamemodes/colonialmarines/colonialmarines.dm index bc5d6b69228c..f64c2432486b 100644 --- a/code/game/gamemodes/colonialmarines/colonialmarines.dm +++ b/code/game/gamemodes/colonialmarines/colonialmarines.dm @@ -329,7 +329,7 @@ var/datum/hive_status/HS for(var/HN in GLOB.hive_datum) HS = GLOB.hive_datum[HN] - if(HS.living_xeno_queen && !is_admin_level(HS.living_xeno_queen.loc.z)) + if(HS.living_xeno_queen && !should_block_game_interaction(HS.living_xeno_queen.loc)) //Some Queen is alive, we shouldn't end the game yet return round_finished = MODE_INFESTATION_M_MINOR diff --git a/code/game/gamemodes/colonialmarines/whiskey_outpost/whiskey_output_waves.dm b/code/game/gamemodes/colonialmarines/whiskey_outpost/whiskey_output_waves.dm index 6e2738a83788..1ec07b9d8fec 100644 --- a/code/game/gamemodes/colonialmarines/whiskey_outpost/whiskey_output_waves.dm +++ b/code/game/gamemodes/colonialmarines/whiskey_outpost/whiskey_output_waves.dm @@ -32,7 +32,7 @@ for(var/mob/living/carbon/xenomorph/X as anything in GLOB.living_xeno_list) var/area/A = get_area(X) - if(is_admin_level(X.z) && (!A || !(A.flags_area & AREA_ALLOW_XENO_JOIN)) || X.aghosted) continue //xenos on admin z level and aghosted ones don't count + if(should_block_game_interaction(X) && (!A || !(A.flags_area & AREA_ALLOW_XENO_JOIN)) || X.aghosted) continue //xenos on admin z level and aghosted ones don't count if(istype(X) && !X.client) if((X.away_timer >= XENO_LEAVE_TIMER) || (islarva(X) && X.away_timer >= XENO_LEAVE_TIMER_LARVA)) available_xenos += X diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 56decd8f0c02..094b899c1691 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -237,32 +237,10 @@ if(!istype(NP)) return - NP.spawning = TRUE - NP.close_spawn_windows() - var/mob/living/carbon/human/new_character = new(NP.loc) new_character.lastarea = get_area(NP.loc) - NP.client.prefs.copy_all_to(new_character, title) - - if (NP.client.prefs.be_random_body) - var/datum/preferences/TP = new() - TP.randomize_appearance(new_character) - - new_character.job = NP.job - new_character.name = NP.real_name - new_character.voice = NP.real_name - - if(NP.mind) - NP.mind_initialize() - NP.mind.transfer_to(new_character, TRUE) - NP.mind.setup_human_stats() - - // Update the character icons - // This is done in set_species when the mob is created as well, but - INVOKE_ASYNC(new_character, TYPE_PROC_REF(/mob/living/carbon/human, regenerate_icons)) - INVOKE_ASYNC(new_character, TYPE_PROC_REF(/mob/living/carbon/human, update_body), 1, 0) - INVOKE_ASYNC(new_character, TYPE_PROC_REF(/mob/living/carbon/human, update_hair)) + setup_human(new_character, NP) return new_character diff --git a/code/game/jobs/role_authority.dm b/code/game/jobs/role_authority.dm index 37131451ca07..be2b75e0e7f6 100644 --- a/code/game/jobs/role_authority.dm +++ b/code/game/jobs/role_authority.dm @@ -268,6 +268,7 @@ I hope it's easier to tell what the heck this proc is even doing, unlike previou var/datum/job/PJ = temp_roles_for_mode[JOB_PREDATOR] if(istype(PJ)) PJ.set_spawn_positions(GLOB.players_preassigned) + REDIS_PUBLISH("byond.round", "type" = "predator-round", "map" = SSmapping.configs[GROUND_MAP].map_name) // Assign the roles, this time for real, respecting limits we have established. var/list/roles_left = assign_roles(temp_roles_for_mode, unassigned_players) diff --git a/code/game/machinery/ARES/ARES_procs.dm b/code/game/machinery/ARES/ARES_procs.dm index 06b082e3c5e2..ffcea5406856 100644 --- a/code/game/machinery/ARES/ARES_procs.dm +++ b/code/game/machinery/ARES/ARES_procs.dm @@ -77,6 +77,12 @@ GLOBAL_LIST_INIT(maintenance_categories, list( // ------ ARES Logging Procs ------ // +/proc/ares_is_active() + for(var/mob/living/silicon/decoy/ship_ai/ai in GLOB.ai_mob_list) + if(ai.stat == DEAD) + return FALSE //ARES dead, most other systems also die with it + return TRUE + /proc/ares_apollo_talk(broadcast_message) var/datum/language/apollo/apollo = GLOB.all_languages[LANGUAGE_APOLLO] for(var/mob/living/silicon/decoy/ship_ai/ai in GLOB.ai_mob_list) @@ -89,33 +95,38 @@ GLOBAL_LIST_INIT(maintenance_categories, list( /proc/ares_can_interface() var/obj/structure/machinery/ares/processor/interface/processor = GLOB.ares_link.processor_interface - if(!istype(GLOB.ares_link)) + if(!istype(GLOB.ares_link) || !ares_is_active()) return FALSE if(processor && !processor.inoperable()) return TRUE return FALSE //interface processor not found or is broken /proc/ares_can_log() - if(!istype(GLOB.ares_link) || !istype(GLOB.ares_datacore)) + if(!istype(GLOB.ares_link) || !istype(GLOB.ares_datacore) || !ares_is_active()) return FALSE var/obj/structure/machinery/ares/cpu/central_processor = GLOB.ares_link.central_processor if(central_processor && !central_processor.inoperable()) return TRUE return FALSE //CPU not found or is broken -/proc/log_ares_apollo(speaker, message) - if(!ares_can_log()) +/proc/ares_can_apollo() + if(!istype(GLOB.ares_link) || !istype(GLOB.ares_datacore) || !ares_is_active()) return FALSE var/datum/ares_link/link = GLOB.ares_link if(!link.processor_apollo || link.processor_apollo.inoperable()) return FALSE + return TRUE + +/proc/log_ares_apollo(speaker, message) + if(!ares_can_log() || !ares_can_apollo()) + return FALSE if(!speaker) speaker = "Unknown" var/datum/ares_datacore/datacore = GLOB.ares_datacore datacore.apollo_log.Add("[worldtime2text()]: [speaker], '[message]'") -/proc/log_ares_bioscan(title, input) - if(!ares_can_log()) +/proc/log_ares_bioscan(title, input, forced = FALSE) + if(!ares_can_log() && !forced) return FALSE var/datum/ares_datacore/datacore = GLOB.ares_datacore datacore.records_bioscan.Add(new /datum/ares_record/bioscan(title, input)) @@ -225,6 +236,13 @@ GLOBAL_LIST_INIT(maintenance_categories, list( conversation.conversation += "[MAIN_AI_SYSTEM] at [worldtime2text()], '[text]'" // ------ End ARES Interface Procs ------ // +/proc/ares_final_words() + //APOLLO + ares_apollo_talk("APOLLO sub-system shutting down. STOP CODE: 0x000000f4|CRITICAL_PROCESS_DIED") + + //GENERAL CREW + shipwide_ai_announcement("A Problem has been detected and the [MAIN_AI_SYSTEM] system has been shutdown. \nTechnical Information: \n\n*** STOP CODE: 0x000000f4|CRITICAL_PROCESS_DIED\n\nPossible caused by: Rapid Unscheduled Disassembly\nContact an AI Service Technician for further assistance.", title = ":(", ares_logging = null) + /obj/structure/machinery/computer/working_joe/get_ares_access(obj/item/card/id/card) if(ACCESS_ARES_DEBUG in card.access) return APOLLO_ACCESS_DEBUG diff --git a/code/game/machinery/ARES/ARES_step_triggers.dm b/code/game/machinery/ARES/ARES_step_triggers.dm index fdf7b26b2e65..2c6d605bcc9b 100644 --- a/code/game/machinery/ARES/ARES_step_triggers.dm +++ b/code/game/machinery/ARES/ARES_step_triggers.dm @@ -69,7 +69,7 @@ broadcast_message = "ALERT: Unauthorized movement detected in [area_name]!" var/datum/ares_link/link = GLOB.ares_link - if(link.processor_apollo.inoperable()) + if(!ares_can_apollo()) return FALSE to_chat(passer, SPAN_BOLDWARNING("You hear a soft beeping sound as you cross the threshold.")) @@ -154,7 +154,7 @@ var/broadcast_message = get_broadcast(passer, idcard, failure) var/datum/ares_link/link = GLOB.ares_link - if(link.processor_apollo.inoperable()) + if(!ares_can_apollo()) return FALSE to_chat(passer, SPAN_BOLDWARNING("You hear a harsh buzzing sound as you cross the threshold!")) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index b9ea018ba98f..190d51d3f7b8 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -4,7 +4,7 @@ /mob/living/silicon/ai/proc/InvalidTurf(turf/T as turf) if(!T) return 1 - if(is_admin_level(T.z)) + if(should_block_game_interaction(T)) return 1 if(T.z > 6) return 1 diff --git a/code/game/machinery/computer/almayer_control.dm b/code/game/machinery/computer/almayer_control.dm index e9b969e023b8..d38ccd725785 100644 --- a/code/game/machinery/computer/almayer_control.dm +++ b/code/game/machinery/computer/almayer_control.dm @@ -110,7 +110,7 @@ return switch(action) if("award") - print_medal(usr, src) + open_medal_panel(usr, src) . = TRUE // evac stuff start \\ diff --git a/code/game/machinery/computer/camera_console.dm b/code/game/machinery/computer/camera_console.dm index cad4fd4fc747..d7dbfb9717cc 100644 --- a/code/game/machinery/computer/camera_console.dm +++ b/code/game/machinery/computer/camera_console.dm @@ -58,9 +58,8 @@ SStgui.close_uis(src) QDEL_NULL(current) QDEL_NULL(cam_screen) - qdel(cam_screen) QDEL_NULL(cam_background) - qdel(cam_background) + QDEL_NULL_LIST(cam_plane_masters) last_camera_turf = null concurrent_users = null return ..() @@ -69,7 +68,7 @@ return attack_hand(user) /obj/structure/machinery/computer/cameras/attack_hand(mob/user) - if(!admin_console && is_admin_level(z)) + if(!admin_console && should_block_game_interaction(src)) to_chat(user, SPAN_DANGER("Unable to establish a connection: \black You're too far away from the ship!")) return if(inoperable()) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index bcc4c4ac3ec8..77c9bbacc293 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -130,7 +130,7 @@ cooldown_message = world.time if("award") - print_medal(usr, src) + open_medal_panel(usr, src) if("evacuation_start") if(state == STATE_EVACUATION) diff --git a/code/game/machinery/computer/demo_sim.dm b/code/game/machinery/computer/demo_sim.dm index 15261cfc8f4b..f633e8f351d4 100644 --- a/code/game/machinery/computer/demo_sim.dm +++ b/code/game/machinery/computer/demo_sim.dm @@ -55,7 +55,6 @@ var/list/data = list() data["configuration"] = configuration - data["looking"] = simulation.looking_at_simulation data["dummy_mode"] = simulation.dummy_mode data["worldtime"] = world.time @@ -104,8 +103,7 @@ /obj/structure/machinery/computer/demo_sim/ui_close(mob/user) . = ..() - if(simulation.looking_at_simulation) - simulation.stop_watching(user) + simulation.stop_watching(user) // DEMOLITIONS TGUI SHIT END \\ diff --git a/code/game/machinery/computer/dropship_weapons.dm b/code/game/machinery/computer/dropship_weapons.dm index 2f9047abc63c..dce026f4ce33 100644 --- a/code/game/machinery/computer/dropship_weapons.dm +++ b/code/game/machinery/computer/dropship_weapons.dm @@ -33,6 +33,8 @@ var/camera_width = 11 var/camera_height = 11 var/camera_map_name + ///Tracks equipment with a camera that is deployed and we are viewing + var/obj/structure/dropship_equipment/camera_area_equipment = null var/registered = FALSE @@ -62,17 +64,20 @@ /obj/structure/machinery/computer/dropship_weapons/attack_hand(mob/user) if(..()) return - if(!allowed(user)) + if(!allowed(user)) + // TODO: Restore cas simulator + to_chat(user, SPAN_WARNING("Weapons modification access denied.")) + return TRUE // everyone can access the simulator, requested feature. - to_chat(user, SPAN_WARNING("Weapons modification access denied, attempting to launch simulation.")) + /*to_chat(user, SPAN_WARNING("Weapons modification access denied, attempting to launch simulation.")) if(!selected_firemission) to_chat(user, SPAN_WARNING("Firemission must be selected before attempting to run the simulation")) - return + return TRUE tgui_interact(user) - return 1 + return FALSE*/ user.set_interaction(src) ui_interact(user) @@ -100,7 +105,7 @@ /obj/structure/machinery/computer/dropship_weapons/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) var/obj/docking_port/mobile/marine_dropship/dropship = SSshuttle.getShuttle(shuttle_tag) - if (!istype(dropship)) + if(!istype(dropship)) return var/screen_mode = 0 @@ -129,11 +134,6 @@ if(screen_mode != 3 || !selected_firemission || dropship.mode != SHUTTLE_CALL) update_location(user, null) - ui_data(user) - if(!tacmap.map_holder) - var/level = SSmapping.levels_by_trait(tacmap.targeted_ztrait) - tacmap.map_holder = SSminimaps.fetch_tacmap_datum(level[1], tacmap.allowed_flags) - user.client.register_map_obj(tacmap.map_holder.map) tgui_interact(user) /obj/structure/machinery/computer/dropship_weapons/tgui_interact(mob/user, datum/tgui/ui) @@ -141,10 +141,15 @@ var/obj/docking_port/mobile/marine_dropship/dropship = SSshuttle.getShuttle(shuttle_tag) RegisterSignal(dropship, COMSIG_DROPSHIP_ADD_EQUIPMENT, PROC_REF(equipment_update)) RegisterSignal(dropship, COMSIG_DROPSHIP_REMOVE_EQUIPMENT, PROC_REF(equipment_update)) - registered=TRUE + registered = TRUE + + if(!tacmap.map_holder) + var/level = SSmapping.levels_by_trait(tacmap.targeted_ztrait) + tacmap.map_holder = SSminimaps.fetch_tacmap_datum(level[1], tacmap.allowed_flags) ui = SStgui.try_update_ui(user, src, ui) - if (!ui) + if(!ui) + user.client.register_map_obj(tacmap.map_holder.map) SEND_SIGNAL(src, COMSIG_CAMERA_REGISTER_UI, user) ui = new(user, src, "DropshipWeaponsConsole", "Weapons Console") ui.open() @@ -152,8 +157,7 @@ /obj/structure/machinery/computer/dropship_weapons/ui_close(mob/user) . = ..() SEND_SIGNAL(src, COMSIG_CAMERA_UNREGISTER_UI, user) - if(simulation.looking_at_simulation) - simulation.stop_watching(user) + simulation.stop_watching(user) /obj/structure/machinery/computer/dropship_weapons/ui_status(mob/user, datum/ui_state/state) . = ..() @@ -239,7 +243,6 @@ .["firemission_selected_laser"] = firemission_envelope.recorded_loc ? firemission_envelope.recorded_loc.get_name() : "NOT SELECTED" .["configuration"] = configuration - .["looking"] = simulation.looking_at_simulation .["dummy_mode"] = simulation.dummy_mode .["worldtime"] = world.time .["nextdetonationtime"] = simulation.detonation_cooldown @@ -257,7 +260,7 @@ switch(action) if("button_push") playsound(src, get_sfx("terminal_button"), 25, FALSE) - return TRUE + return FALSE if("select_equipment") var/base_tag = params["equipment_id"] @@ -305,12 +308,13 @@ var/mount_point = equipment.ship_base.attach_id if(mount_point != equipment_tag) continue - if (istype(equipment, /obj/structure/dropship_equipment/sentry_holder)) + if(istype(equipment, /obj/structure/dropship_equipment/sentry_holder)) var/obj/structure/dropship_equipment/sentry_holder/sentry = equipment var/obj/structure/machinery/defenses/sentry/defense = sentry.deployed_turret - if (defense.has_camera) + if(defense.has_camera) defense.set_range() var/datum/shape/rectangle/current_bb = defense.range_bounds + camera_area_equipment = sentry SEND_SIGNAL(src, COMSIG_CAMERA_SET_AREA, current_bb.center_x, current_bb.center_y, defense.loc.z, current_bb.width, current_bb.height) return TRUE @@ -331,6 +335,7 @@ if(medevac.linked_stretcher) SEND_SIGNAL(src, COMSIG_CAMERA_SET_TARGET, medevac.linked_stretcher, 5, 5) return TRUE + if("fulton-target") var/equipment_tag = params["equipment_id"] for(var/obj/structure/dropship_equipment/equipment as anything in shuttle.equipments) @@ -342,6 +347,7 @@ var/target_ref = params["ref"] fulton.automate_interact(user, target_ref) return TRUE + if("fire-weapon") var/weapon_tag = params["eqp_tag"] var/obj/structure/dropship_equipment/weapon/DEW = get_weapon(weapon_tag) @@ -349,19 +355,23 @@ return FALSE var/datum/cas_signal/sig = get_cas_signal(camera_target_id) - if(!sig) return FALSE selected_equipment = DEW - ui_open_fire(user, shuttle, camera_target_id) + if(ui_open_fire(user, shuttle, camera_target_id)) + if(firemission_envelope) + firemission_envelope.untrack_object() return TRUE + if("deploy-equipment") var/equipment_tag = params["equipment_id"] for(var/obj/structure/dropship_equipment/equipment as anything in shuttle.equipments) var/mount_point = equipment.ship_base.attach_id if(mount_point != equipment_tag) continue + if(camera_area_equipment == equipment) + set_camera_target(null) equipment.equipment_interact(user) return TRUE @@ -386,13 +396,8 @@ var/x_offset_value = params["x_offset_value"] var/y_offset_value = params["y_offset_value"] - var/datum/cas_iff_group/cas_group = GLOB.cas_groups[faction] - var/datum/cas_signal/cas_sig - for(var/X in cas_group.cas_signals) - var/datum/cas_signal/LT = X - if(LT.target_id == target_id && LT.valid_signal()) - cas_sig = LT - break + camera_target_id = target_id + var/datum/cas_signal/cas_sig = get_cas_signal(camera_target_id, valid_only = TRUE) // we don't want rapid offset changes to trigger admin warnings // and block the user from accessing TGUI // we change the minute_count @@ -410,12 +415,14 @@ current.y + dy, current.z) - firemission_envelope.change_current_loc(new_target) - + camera_area_equipment = null + firemission_envelope.change_current_loc(new_target, cas_sig) return TRUE + if("nvg-enable") SEND_SIGNAL(src, COMSIG_CAMERA_SET_NVG, 5, "#7aff7a") return TRUE + if("nvg-disable") SEND_SIGNAL(src, COMSIG_CAMERA_CLEAR_NVG) return TRUE @@ -449,24 +456,28 @@ /obj/structure/machinery/computer/dropship_weapons/proc/get_weapon(eqp_tag) var/obj/docking_port/mobile/marine_dropship/dropship = SSshuttle.getShuttle(shuttle_tag) - for(var/obj/structure/dropship_equipment/equipment in dropship.equipments) - if(istype(equipment, /obj/structure/dropship_equipment/weapon)) - //is weapon - if(selected_equipment == equipment) - return equipment + var/obj/structure/dropship_equipment/equipment = dropship.equipments[eqp_tag] + if(istype(equipment, /obj/structure/dropship_equipment/weapon)) + //is weapon + return equipment return -/obj/structure/machinery/computer/dropship_weapons/proc/get_cas_signal(target_ref) +/obj/structure/machinery/computer/dropship_weapons/proc/get_cas_signal(target_ref, valid_only = FALSE) if(!target_ref) return var/datum/cas_iff_group/cas_group = GLOB.cas_groups[faction] for(var/datum/cas_signal/sig in cas_group.cas_signals) if(sig.target_id == target_ref) + if(valid_only && !sig.valid_signal()) + continue return sig - /obj/structure/machinery/computer/dropship_weapons/proc/set_camera_target(target_ref) + camera_area_equipment = null + if(firemission_envelope) + firemission_envelope.untrack_object() + var/datum/cas_signal/target = get_cas_signal(target_ref) camera_target_id = target_ref if(!target) diff --git a/code/game/machinery/computer/groundside_operations.dm b/code/game/machinery/computer/groundside_operations.dm index 7b4c2d5df771..b5d1c112a3f8 100644 --- a/code/game/machinery/computer/groundside_operations.dm +++ b/code/game/machinery/computer/groundside_operations.dm @@ -235,7 +235,7 @@ log_announcement("[key_name(usr)] has announced the following: [input]") if("award") - print_medal(usr, src) + open_medal_panel(usr, src) if("selectlz") if(SSticker.mode.active_lz) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index ab5dc6448f4b..69c2c897e276 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -519,7 +519,7 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li if(mob.client) to_chat(mob, SPAN_NOTICE("You feel cool air surround you. You go numb as your senses turn inward.")) to_chat(mob, SPAN_BOLDNOTICE("If you log out or close your client now, your character will permanently removed from the round in 10 minutes. If you ghost, timer will be decreased to 2 minutes.")) - if(!is_admin_level(src.z)) // Set their queue time now because the client has to actually leave to despawn and at that point the client is lost + if(!should_block_game_interaction(src)) // Set their queue time now because the client has to actually leave to despawn and at that point the client is lost mob.client.player_details.larva_queue_time = max(mob.client.player_details.larva_queue_time, world.time) var/area/location = get_area(src) if(mob.job != GET_MAPPED_ROLE(JOB_SQUAD_MARINE)) @@ -536,6 +536,7 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li icon_state = "body_scanner_open" set_light(0) playsound(src, 'sound/machines/pod_open.ogg', 30) + SEND_SIGNAL(src, COMSIG_CRYOPOD_GO_OUT) #ifdef OBJECTS_PROXY_SPEECH // Transfers speech to occupant @@ -554,3 +555,40 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li return move_inside(target) + + +/obj/structure/machinery/cryopod/tutorial + silent_exit = TRUE + +/obj/structure/machinery/cryopod/tutorial/process() + return + +/obj/structure/machinery/cryopod/tutorial/go_in_cryopod(mob/mob, silent = FALSE, del_them = TRUE) + if(occupant) + return + mob.forceMove(src) + occupant = mob + icon_state = "body_scanner_closed" + set_light(2) + time_entered = world.time + if(del_them) + despawn_occupant() + +/obj/structure/machinery/cryopod/tutorial/despawn_occupant() + SSminimaps.remove_marker(occupant) + + if(ishuman(occupant)) + var/mob/living/carbon/human/man = occupant + man.species.handle_cryo(man) + + icon_state = "body_scanner_open" + set_light(0) + + + var/mob/new_player/new_player = new + + if(!occupant.mind) + occupant.mind_initialize() + + occupant.mind.transfer_to(new_player) + SEND_SIGNAL(occupant, COMSIG_MOB_END_TUTORIAL) diff --git a/code/game/machinery/nuclearbomb.dm b/code/game/machinery/nuclearbomb.dm index cfb0d1abb94f..aac4f82ccff1 100644 --- a/code/game/machinery/nuclearbomb.dm +++ b/code/game/machinery/nuclearbomb.dm @@ -396,45 +396,39 @@ GLOBAL_VAR_INIT(bomb_set, FALSE) playsound(src, 'sound/machines/Alarm.ogg', 75, 0, 30) world << pick('sound/theme/nuclear_detonation1.ogg','sound/theme/nuclear_detonation2.ogg') - var/list/alive_mobs = list() //Everyone who will be destroyed on the zlevel(s). - var/list/dead_mobs = list() //Everyone who only needs to see the cinematic. for(var/mob/current_mob as anything in GLOB.mob_list) - if(!current_mob?.loc) - continue - if(current_mob.stat == DEAD) - dead_mobs |= current_mob - continue var/turf/current_turf = get_turf(current_mob) - if(z == current_turf.z) - alive_mobs |= current_mob + if(current_turf?.z == z && current_mob.stat != DEAD) shake_camera(current_mob, 110, 4) + sleep(10 SECONDS) + + var/list/mob/alive_mobs = list() //Everyone who will be destroyed on the zlevel(s). + var/list/mob/dead_mobs = list() //Everyone that needs embryos cleared + for(var/mob/current_mob as anything in GLOB.mob_list) + var/turf/current_turf = get_turf(current_mob) + if(current_turf?.z == z) + if(current_mob.stat == DEAD) + dead_mobs |= current_mob + continue + alive_mobs |= current_mob + for(var/mob/current_mob in alive_mobs) - if(current_mob && current_mob.loc) - var/turf/current_mob_turf = get_turf(current_mob) - if(z == current_mob_turf.z) - if(istype(current_mob.loc, /obj/structure/closet/secure_closet/freezer/fridge)) - continue - current_mob.death(create_cause_data("nuclear explosion")) - - for(var/mob/current_mob in (alive_mobs + dead_mobs)) - if(current_mob && current_mob.loc) - var/turf/current_mob_turf = get_turf(current_mob) - if(z == current_mob_turf.z) - if(istype(current_mob.loc, /obj/structure/closet/secure_closet/freezer/fridge)) - continue - for(var/obj/item/alien_embryo/embryo in current_mob) - qdel(embryo) - - sleep(100) + if(istype(current_mob.loc, /obj/structure/closet/secure_closet/freezer/fridge)) + continue + current_mob.death(create_cause_data("nuclear explosion")) + + for(var/mob/living/current_mob in (alive_mobs + dead_mobs)) + if(istype(current_mob.loc, /obj/structure/closet/secure_closet/freezer/fridge)) + continue + for(var/obj/item/alien_embryo/embryo in current_mob) + qdel(embryo) + cell_explosion(loc, 500, 150, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, create_cause_data(initial(name))) qdel(src) return TRUE /obj/structure/machinery/nuclearbomb/Destroy() - if(timing != -1) - message_admins("\The [src] has been unexpectedly deleted at ([x],[y],[x]). [ADMIN_JMP(src)]") - log_game("\The [src] has been unexpectedly deleted at ([x],[y],[x]).") GLOB.bomb_set = FALSE SSminimaps.remove_marker(src) return ..() diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 942d70f80705..e43598c4e248 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -177,7 +177,7 @@ if(src.listening_level == TELECOMM_GROUND_Z) // equals the station src.listening_level = position.z return 1 - else if(is_admin_level(position.z)) + else if(should_block_game_interaction(position)) src.listening_level = TELECOMM_GROUND_Z return 1 return 0 @@ -229,7 +229,7 @@ /obj/structure/machinery/telecomms/relay/Options_Menu() var/dat = "" - if(is_admin_level(z)) + if(should_block_game_interaction(src)) dat += "
Signal Locked to Station: [listening_level == TELECOMM_GROUND_Z ? "TRUE" : "FALSE"]" dat += "
Broadcasting: [broadcasting ? "YES" : "NO"]" dat += "
Receiving: [receiving ? "YES" : "NO"]" diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 8ea00ce4061d..8b6622121b86 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -98,7 +98,7 @@ var/turf/T = get_turf(R) if (!T) continue - if(is_admin_level(T.z)) + if(should_block_game_interaction(T)) continue var/tmpname = T.loc.name if(areaindex[tmpname]) @@ -118,7 +118,7 @@ continue var/turf/T = get_turf(M) if(T) continue - if(is_admin_level(T.z)) continue + if(should_block_game_interaction(T)) continue var/tmpname = M.real_name if(areaindex[tmpname]) tmpname = "[tmpname] ([++areaindex[tmpname]])" diff --git a/code/game/machinery/vending/cm_vending.dm b/code/game/machinery/vending/cm_vending.dm index 6415e1d0acd5..5568a5fda600 100644 --- a/code/game/machinery/vending/cm_vending.dm +++ b/code/game/machinery/vending/cm_vending.dm @@ -1239,8 +1239,10 @@ GLOBAL_LIST_INIT(cm_vending_gear_corresponding_types_list, list( if(islist(prod_type)) for(var/each_type in prod_type) vendor_successful_vend_one(each_type, user, target_turf, itemspec[4] == MARINE_CAN_BUY_UNIFORM) + SEND_SIGNAL(src, COMSIG_VENDOR_SUCCESSFUL_VEND, src, itemspec, user) else vendor_successful_vend_one(prod_type, user, target_turf, itemspec[4] == MARINE_CAN_BUY_UNIFORM) + SEND_SIGNAL(src, COMSIG_VENDOR_SUCCESSFUL_VEND, src, itemspec, user) if(vend_flags & VEND_LIMITED_INVENTORY) itemspec[2]-- diff --git a/code/game/machinery/vending/vending_types.dm b/code/game/machinery/vending/vending_types.dm index 90947684bee1..0a7b85cae7e2 100644 --- a/code/game/machinery/vending/vending_types.dm +++ b/code/game/machinery/vending/vending_types.dm @@ -267,6 +267,7 @@ /obj/item/ammo_magazine/rifle/rubber = 40, /obj/item/ammo_magazine/rifle/m4ra/rubber = 40, /obj/item/clothing/head/helmet/marine/MP = 8, + /obj/item/explosive/plastic/breaching_charge/rubber = 6, ) /obj/structure/machinery/vending/sea diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm index ecef3ed622d9..2395d572bad7 100644 --- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm +++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm @@ -345,18 +345,20 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list( return ..() /obj/structure/machinery/cm_vending/own_points/experimental_tools/get_listed_products(mob/user) - return list( - list("Autocompressor", 15, /obj/item/clothing/suit/auto_cpr, null, VENDOR_ITEM_REGULAR), - list("Backpack Firefighting Watertank", 15, /obj/item/reagent_container/glass/watertank/atmos, null, VENDOR_ITEM_REGULAR), - list("Breaching Hammer", 15, /obj/item/weapon/twohanded/breacher/synth, null, VENDOR_ITEM_REGULAR), - list("Compact Defibrillator", 15, /obj/item/device/defibrillator/compact, null, VENDOR_ITEM_REGULAR), - list("Compact Nailgun kit", 15, /obj/effect/essentials_set/cnailgun, null, VENDOR_ITEM_REGULAR), - list("Crew Monitor", 15, /obj/item/tool/crew_monitor, null, VENDOR_ITEM_REGULAR), - list("Experimental Meson Goggles", 15, /obj/item/clothing/glasses/night/experimental_mesons, null, VENDOR_ITEM_REGULAR), - list("Maintenance Jack", 15, /obj/item/maintenance_jack, null, VENDOR_ITEM_REGULAR), - list("Portable Dialysis Machine", 15, /obj/item/tool/portadialysis, null, VENDOR_ITEM_REGULAR), - list("Telescopic Baton", 15, /obj/item/weapon/telebaton, null, VENDOR_ITEM_REGULAR), - ) + return GLOB.cm_vending_synth_tools + +GLOBAL_LIST_INIT(cm_vending_synth_tools, list( + list("Autocompressor", 15, /obj/item/clothing/suit/auto_cpr, null, VENDOR_ITEM_REGULAR), + list("Backpack Firefighting Watertank", 15, /obj/item/reagent_container/glass/watertank/atmos, null, VENDOR_ITEM_REGULAR), + list("Breaching Hammer", 15, /obj/item/weapon/twohanded/breacher/synth, null, VENDOR_ITEM_REGULAR), + list("Compact Defibrillator", 15, /obj/item/device/defibrillator/compact, null, VENDOR_ITEM_REGULAR), + list("Compact Nailgun kit", 15, /obj/effect/essentials_set/cnailgun, null, VENDOR_ITEM_REGULAR), + list("Crew Monitor", 15, /obj/item/tool/crew_monitor, null, VENDOR_ITEM_REGULAR), + list("Experimental Meson Goggles", 15, /obj/item/clothing/glasses/night/experimental_mesons, null, VENDOR_ITEM_REGULAR), + list("Maintenance Jack", 15, /obj/item/maintenance_jack, null, VENDOR_ITEM_REGULAR), + list("Portable Dialysis Machine", 15, /obj/item/tool/portadialysis, null, VENDOR_ITEM_REGULAR), + list("Telescopic Baton", 15, /obj/item/weapon/telebaton, null, VENDOR_ITEM_REGULAR), +)) //------------EXPERIMENTAL TOOL KITS--------------- /obj/effect/essentials_set/cnailgun diff --git a/code/game/machinery/vending/vendor_types/food.dm b/code/game/machinery/vending/vendor_types/food.dm index 51749ab2a010..62ed5124727e 100644 --- a/code/game/machinery/vending/vendor_types/food.dm +++ b/code/game/machinery/vending/vendor_types/food.dm @@ -25,6 +25,27 @@ list("W-Y Flask", 5, /obj/item/reagent_container/food/drinks/flask/weylandyutani, VENDOR_ITEM_REGULAR) ) +/obj/structure/machinery/cm_vending/sorted/marine_food/tutorial + hackable = FALSE + wrenchable = FALSE + req_access = list(ACCESS_TUTORIAL_LOCKED) + +/obj/structure/machinery/cm_vending/sorted/marine_food/tutorial/populate_product_list(scale) + listed_products = list( + list("PREPARED MEALS", -1, null, null), + list("USCM Prepared Meal (Chicken)", 0, /obj/item/reagent_container/food/snacks/mre_pack/meal5, VENDOR_ITEM_REGULAR), + list("USCM Prepared Meal (Cornbread)", 0, /obj/item/reagent_container/food/snacks/mre_pack/meal1, VENDOR_ITEM_REGULAR), + list("USCM Prepared Meal (Pasta)", 0, /obj/item/reagent_container/food/snacks/mre_pack/meal3, VENDOR_ITEM_REGULAR), + list("USCM Prepared Meal (Pizza)", 0, /obj/item/reagent_container/food/snacks/mre_pack/meal4, VENDOR_ITEM_REGULAR), + list("USCM Prepared Meal (Pork)", 0, /obj/item/reagent_container/food/snacks/mre_pack/meal2, VENDOR_ITEM_REGULAR), + list("USCM Prepared Meal (Tofu)", 0, /obj/item/reagent_container/food/snacks/mre_pack/meal6, VENDOR_ITEM_REGULAR), + list("USCM Protein Bar", 1, /obj/item/reagent_container/food/snacks/protein_pack, VENDOR_ITEM_RECOMMENDED), + list("FLASKS", -1, null, null), + list("Canteen", 0, /obj/item/reagent_container/food/drinks/flask/canteen, VENDOR_ITEM_REGULAR), + list("Metal Flask", 0, /obj/item/reagent_container/food/drinks/flask, VENDOR_ITEM_REGULAR), + list("USCM Flask", 0, /obj/item/reagent_container/food/drinks/flask/marine, VENDOR_ITEM_REGULAR), + list("W-Y Flask", 0, /obj/item/reagent_container/food/drinks/flask/weylandyutani, VENDOR_ITEM_REGULAR) + ) //------------BOOZE-O-MAT VENDOR--------------- /obj/structure/machinery/cm_vending/sorted/boozeomat @@ -38,8 +59,8 @@ unslashable = FALSE wrenchable = TRUE -/obj/structure/machinery/cm_vending/sorted/boozeomat/get_listed_products(mob/user) - return list( +/obj/structure/machinery/cm_vending/sorted/boozeomat/populate_product_list(scale) + listed_products = list( list("ALCOHOL", -1, null, null), list("Ale", 6, /obj/item/reagent_container/food/drinks/cans/ale, VENDOR_ITEM_REGULAR), list("Beer", 6, /obj/item/reagent_container/food/drinks/cans/beer, VENDOR_ITEM_REGULAR), @@ -97,8 +118,8 @@ unslashable = FALSE wrenchable = TRUE -/obj/structure/machinery/cm_vending/sorted/boozeomat/chess/get_listed_products(mob/user) - return list( +/obj/structure/machinery/cm_vending/sorted/boozeomat/chess/populate_product_list(scale) + listed_products = list( list("White Pieces", -1, null, null), list("Pawn", 2, /obj/item/reagent_container/food/drinks/bottle/vodka/chess/w_pawn, VENDOR_ITEM_REGULAR), list("Bishop", 2, /obj/item/reagent_container/food/drinks/bottle/vodka/chess/w_bishop, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/intelligence_officer.dm b/code/game/machinery/vending/vendor_types/intelligence_officer.dm index 4d9ced354e2b..6446d17e2db7 100644 --- a/code/game/machinery/vending/vendor_types/intelligence_officer.dm +++ b/code/game/machinery/vending/vendor_types/intelligence_officer.dm @@ -72,6 +72,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_intelligence_officer, list( list("BACKPACK (CHOOSE 1)", 0, null, null, null), list("Expedition Pack", 0, /obj/item/storage/backpack/marine/satchel/intel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_RECOMMENDED), + list("Expedition Chestrig", 0, /obj/item/storage/backpack/marine/satchel/intel/chestrig, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_RECOMMENDED), list("Radio Telephone Pack", 0, /obj/item/storage/backpack/marine/satchel/rto/io, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), list("HELMET (CHOOSE 1)", 0, null, null, null), diff --git a/code/game/machinery/vending/vendor_types/requisitions.dm b/code/game/machinery/vending/vendor_types/requisitions.dm index 1ea56c9fc0f5..24f58c8f6ae3 100644 --- a/code/game/machinery/vending/vendor_types/requisitions.dm +++ b/code/game/machinery/vending/vendor_types/requisitions.dm @@ -50,7 +50,7 @@ list("M40 HPDP White Phosphorus Smoke Grenade", round(scale * 4), /obj/item/explosive/grenade/phosphorus, VENDOR_ITEM_REGULAR), list("M40 HSDP Smoke Grenade", round(scale * 5), /obj/item/explosive/grenade/smokebomb, VENDOR_ITEM_REGULAR), list("M74 AGM-Frag Airburst Grenade", round(scale * 4), /obj/item/explosive/grenade/high_explosive/airburst, VENDOR_ITEM_REGULAR), - list("M74 AGM-Icendiary Airburst Grenade", round(scale * 4), /obj/item/explosive/grenade/incendiary/airburst, VENDOR_ITEM_REGULAR), + list("M74 AGM-Incendiary Airburst Grenade", round(scale * 4), /obj/item/explosive/grenade/incendiary/airburst, VENDOR_ITEM_REGULAR), list("M74 AGM-Smoke Airburst Grenade", round(scale * 4), /obj/item/explosive/grenade/smokebomb/airburst, VENDOR_ITEM_REGULAR), list("M74 AGM-Star Shell", round(scale * 2), /obj/item/explosive/grenade/high_explosive/airburst/starshell, VENDOR_ITEM_REGULAR), list("M74 AGM-Hornet Shell", round(scale * 4), /obj/item/explosive/grenade/high_explosive/airburst/hornet_shell, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm index 6a770e89984e..296bce8a9d8d 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm @@ -53,6 +53,34 @@ list("M94 Marking Flare Pack", round(scale * 10), /obj/item/storage/box/m94, VENDOR_ITEM_RECOMMENDED) ) +/obj/structure/machinery/cm_vending/sorted/cargo_guns/squad_prep/tutorial + name = "\improper ColMarTech Automated Weapons Rack" + desc = "An automated weapon rack hooked up to a big storage of standard-issue weapons." + icon_state = "guns" + req_access = list(ACCESS_TUTORIAL_LOCKED) + req_one_access = list() + hackable = FALSE + vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_TO_HAND + +/obj/structure/machinery/cm_vending/sorted/cargo_guns/squad_prep/tutorial/populate_product_list(scale) + listed_products = list( + list("PRIMARY FIREARMS", -1, null, null), + list("M41A Pulse Rifle MK2", 1, /obj/item/weapon/gun/rifle/m41a, VENDOR_ITEM_RECOMMENDED), + + list("PRIMARY AMMUNITION", -1, null, null), + list("M41A Magazine (10x24mm)", 1, /obj/item/ammo_magazine/rifle, VENDOR_ITEM_RECOMMENDED), + ) + +/// Called if the tutorial mob somehow uses an entire magazine without the xeno dying +/obj/structure/machinery/cm_vending/sorted/cargo_guns/squad_prep/tutorial/proc/load_ammo() + listed_products = list( + list("PRIMARY FIREARMS", -1, null, null), + list("M41A Pulse Rifle MK2", 0, /obj/item/weapon/gun/rifle/m41a, VENDOR_ITEM_RECOMMENDED), + + list("PRIMARY AMMUNITION", -1, null, null), + list("M41A Magazine (10x24mm)", 99, /obj/item/ammo_magazine/rifle, VENDOR_ITEM_RECOMMENDED), + ) + //------------SQUAD PREP UNIFORM VENDOR--------------- @@ -162,6 +190,11 @@ list("Falling Falcons Shoulder Patch", round(scale * 15), /obj/item/clothing/accessory/patch/falcon, VENDOR_ITEM_REGULAR), list("USCM Shoulder Patch", round(scale * 15), /obj/item/clothing/accessory/patch, VENDOR_ITEM_REGULAR), list("Bedroll", round(scale * 20), /obj/item/roller/bedroll, VENDOR_ITEM_REGULAR), + + list("OPTICS", -1, null, null, null), + list("Advanced Medical Optic (CORPSMAN ONLY)", round(scale * 4), /obj/item/device/helmet_visor/medical/advanced, VENDOR_ITEM_REGULAR), + list("Squad Optic", round(scale * 15), /obj/item/device/helmet_visor, VENDOR_ITEM_REGULAR), + ) //--------------SQUAD SPECIFIC VERSIONS-------------- diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm index 3a15229182b4..15661cc4b661 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm @@ -45,6 +45,12 @@ GLOBAL_LIST_INIT(cm_vending_clothing_marine, list( list("Heat Absorbent Coif", 0, /obj/item/clothing/mask/rebreather/scarf, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), list("Rebreather", 0, /obj/item/clothing/mask/rebreather, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), + list("ENGINEERING SUPPLIES", 0, null, null, null), + list("E-Tool", 5, /obj/item/tool/shovel/etool/folded, null, VENDOR_ITEM_REGULAR), + list("Sandbags", 20, /obj/item/stack/sandbags_empty/half, null, VENDOR_ITEM_REGULAR), + list("ES-11 Mobile Fuel Canister", 5, /obj/item/tool/weldpack/minitank, null, VENDOR_ITEM_REGULAR), + list("ME3 Hand Welder", 5, /obj/item/tool/weldingtool/simple, null, VENDOR_ITEM_REGULAR), + list("RESTRICTED FIREARMS", 0, null, null, null), list("VP78 Pistol", 15, /obj/item/storage/box/guncase/vp78, null, VENDOR_ITEM_REGULAR), list("SU-6 Smart Pistol", 15, /obj/item/storage/box/guncase/smartpistol, null, VENDOR_ITEM_REGULAR), @@ -88,8 +94,6 @@ GLOBAL_LIST_INIT(cm_vending_clothing_marine, list( list("Large General Pouch", 15, /obj/item/storage/pouch/general/large, null, VENDOR_ITEM_REGULAR), list("UTILITIES", 0, null, null, null), - list("E-Tool", 5, /obj/item/tool/shovel/etool/folded, null, VENDOR_ITEM_REGULAR), - list("Sandbags", 20, /obj/item/stack/sandbags_empty/half, null, VENDOR_ITEM_REGULAR), list("Roller Bed", 5, /obj/item/roller, null, VENDOR_ITEM_REGULAR), list("Fulton Device Stack", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), list("Fire Extinguisher (Portable)", 5, /obj/item/tool/extinguisher/mini, null, VENDOR_ITEM_REGULAR), @@ -98,6 +102,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_marine, list( list("Whistle", 5, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR), list("BINOCULARS", 0, null, null, null), + list("Binoculars", 5, /obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR), list("Range Finder", 10, /obj/item/device/binoculars/range, null, VENDOR_ITEM_REGULAR), list("Laser Designator", 15, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm index 7ddcf14eccde..d9ba7ee97c26 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm @@ -42,10 +42,14 @@ GLOBAL_LIST_INIT(cm_vending_gear_tl, list( list("Insulated Gloves", 3, /obj/item/clothing/gloves/yellow, null, VENDOR_ITEM_REGULAR), list("Night Vision Optic", 30, /obj/item/device/helmet_visor/night_vision, null, VENDOR_ITEM_RECOMMENDED), - list("UTILITIES", 0, null, null, null), - list("Motion Detector", 15, /obj/item/device/motiondetector, null, VENDOR_ITEM_RECOMMENDED), + list("ENGINEERING SUPPLIES", 0, null, null, null), list("Plastic Explosive", 10, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR), list("Breaching Charge", 10, /obj/item/explosive/plastic/breaching_charge, null, VENDOR_ITEM_REGULAR), + list("ES-11 Mobile Fuel Canister", 5, /obj/item/tool/weldpack/minitank, null, VENDOR_ITEM_REGULAR), + list("ME3 Hand Welder", 5, /obj/item/tool/weldingtool/simple, null, VENDOR_ITEM_REGULAR), + + list("UTILITIES", 0, null, null, null), + list("Motion Detector", 15, /obj/item/device/motiondetector, null, VENDOR_ITEM_RECOMMENDED), list("Roller Bed", 5, /obj/item/roller, null, VENDOR_ITEM_REGULAR), list("Fulton Device Stack", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), list("Fire Extinguisher (Portable)", 5, /obj/item/tool/extinguisher/mini, null, VENDOR_ITEM_REGULAR), @@ -53,6 +57,8 @@ GLOBAL_LIST_INIT(cm_vending_gear_tl, list( list("BINOCULARS", 0, null, null, null), list("Binoculars", 5, /obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR), + list("Range Finder", 10, /obj/item/device/binoculars/range, null, VENDOR_ITEM_REGULAR), + list("Laser Designator", 15, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_REGULAR), list("HELMET OPTICS", 0, null, null, null), list("Medical Helmet Optic", 15, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/tutorial.dm b/code/game/machinery/vending/vendor_types/squad_prep/tutorial.dm new file mode 100644 index 000000000000..c1cedd85c7fc --- /dev/null +++ b/code/game/machinery/vending/vendor_types/squad_prep/tutorial.dm @@ -0,0 +1,30 @@ +GLOBAL_LIST_INIT(cm_vending_clothing_tutorial, list( + list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), + list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/clothing/head/helmet/marine), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), + + list("ARMOR (CHOOSE 1)", 0, null, null, null), + list("Medium Armor", 0, /obj/item/clothing/suit/storage/marine/medium, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), + + list("BACKPACK (CHOOSE 1)", 0, null, null, null), + list("Satchel", 0, /obj/item/storage/backpack/marine/satchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_RECOMMENDED), + + list("BELT (CHOOSE 1)", 0, null, null, null), + list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + + list("POUCHES (CHOOSE 1)", 0, null, null, null), + list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_RECOMMENDED), + + )) // The pouch uses a different category so they only get one + +/obj/structure/machinery/cm_vending/clothing/tutorial + name = "\improper ColMarTech Automated Marine Equipment Rack" + desc = "An automated rack hooked up to a colossal storage of Marine Rifleman standard-issue equipment." + icon_state = "mar_rack" + show_points = TRUE + vendor_theme = VENDOR_THEME_USCM + req_access = list(ACCESS_TUTORIAL_LOCKED) + + vendor_role = list() + +/obj/structure/machinery/cm_vending/clothing/tutorial/get_listed_products(mob/user) + return GLOB.cm_vending_clothing_tutorial diff --git a/code/game/objects/effects/acid_hole.dm b/code/game/objects/effects/acid_hole.dm index a4db9ef5c0e0..db24c1c9c56a 100644 --- a/code/game/objects/effects/acid_hole.dm +++ b/code/game/objects/effects/acid_hole.dm @@ -40,7 +40,7 @@ /obj/effect/acid_hole/attack_alien(mob/living/carbon/xenomorph/user) - if (!holed_wall) + if(!holed_wall) qdel(src) //no wall?! then cease existence... return @@ -49,6 +49,9 @@ expand_hole(user) return XENO_NO_DELAY_ACTION +/obj/effect/acid_hole/attack_larva(mob/living/carbon/xenomorph/larva/M) + attack_alien(M) + /obj/effect/acid_hole/proc/expand_hole(mob/living/carbon/xenomorph/user) if(user.action_busy || user.is_mob_incapacitated()) return diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index 41adfdd9581d..7fa61c474ea1 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -500,13 +500,13 @@ QDEL_IN(src, ttl) /obj/effect/xenomorph/xeno_telegraph/red - color = COLOUR_DARK_RED + color = COLOR_DARK_RED /obj/effect/xenomorph/xeno_telegraph/brown - color = COLOUR_BROWN + color = COLOR_BROWN /obj/effect/xenomorph/xeno_telegraph/green - color = COLOUR_GREEN + color = COLOR_LIGHT_GREEN /// This has a brown icon state and does not have a color overlay by default. /obj/effect/xenomorph/xeno_telegraph/abduct_hook diff --git a/code/game/objects/effects/decals/cleanable/blood/robots.dm b/code/game/objects/effects/decals/cleanable/blood/robots.dm index 1bbadb1461b6..3ee3c9e07f9a 100644 --- a/code/game/objects/effects/decals/cleanable/blood/robots.dm +++ b/code/game/objects/effects/decals/cleanable/blood/robots.dm @@ -3,11 +3,11 @@ desc = "It's a useless heap of junk... or is it?" icon = 'icons/mob/robots.dmi' icon_state = "gib1" - basecolor="#030303" + basecolor=COLOR_OIL random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7") /obj/effect/decal/cleanable/blood/gibs/robot/update_icon() - color = "#FFFFFF" + color = COLOR_WHITE /obj/effect/decal/cleanable/blood/gibs/robot/dry() //pieces of robots do not dry up like return @@ -39,7 +39,7 @@ /obj/effect/decal/cleanable/blood/oil name = "motor oil" desc = "It's black and greasy." - basecolor="#030303" + basecolor=COLOR_OIL /obj/effect/decal/cleanable/blood/oil/dry() return diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 9cf2aa3d8e09..a88b4ea5c5ea 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -36,7 +36,7 @@ acid_damage = 1 icon_state = "greenglow" light_range = 1 - light_color = COLOUR_GREEN + light_color = COLOR_LIGHT_GREEN /obj/effect/decal/cleanable/flour name = "flour" desc = "It's still good. Four second rule!" @@ -55,7 +55,7 @@ anchored = TRUE layer = TURF_LAYER light_range = 1 - light_color = COLOUR_GREEN + light_color = COLOR_LIGHT_GREEN icon = 'icons/effects/effects.dmi' icon_state = "greenglow" diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index cfe5f27da9a7..35e354c121bb 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -5,7 +5,7 @@ layer = ABOVE_TURF_LAYER anchored = TRUE -/obj/effect/decal/cleanable/crayon/New(location, main = "#FFFFFF",shade = "#000000", type = "rune") +/obj/effect/decal/cleanable/crayon/New(location, main = COLOR_WHITE,shade = COLOR_BLACK, type = "rune") ..() forceMove(location) diff --git a/code/game/objects/effects/decals/posters.dm b/code/game/objects/effects/decals/posters.dm index 7a8054efce1a..23f7b8c5296a 100644 --- a/code/game/objects/effects/decals/posters.dm +++ b/code/game/objects/effects/decals/posters.dm @@ -160,14 +160,14 @@ icon_state = "poster3" /obj/structure/sign/poster/music/Initialize() - serial_number = pick(3,5,25,26,29,38,39) + serial_number = pick(3,5,25,26,38,39) .=..() /obj/structure/sign/poster/pinup icon_state = "poster12" /obj/structure/sign/poster/pinup/Initialize() - serial_number = pick(12,16,17) + serial_number = pick(12,16,17,29) .=..() /obj/structure/sign/poster/propaganda diff --git a/code/game/objects/effects/landmarks/landmarks.dm b/code/game/objects/effects/landmarks/landmarks.dm index 5f4a374ba31c..45cc6fd8b5fa 100644 --- a/code/game/objects/effects/landmarks/landmarks.dm +++ b/code/game/objects/effects/landmarks/landmarks.dm @@ -508,3 +508,7 @@ /// In landmarks.dm and not unit_test.dm so it is always active in the mapping tools. /obj/effect/landmark/unit_test_top_right name = "unit test zone top right" + +/// Marks the bottom left of the tutorial zone. +/obj/effect/landmark/tutorial_bottom_left + name = "tutorial bottom left" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 11da4cce6d98..fcd431c33d26 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -275,7 +275,7 @@ cases. Override_icon_state should be a list.*/ size = "huge" if(SIZE_MASSIVE) size = "massive" - . += "This is a [blood_color ? blood_color != "#030303" ? "bloody " : "oil-stained " : ""][icon2html(src, user)][src.name]. It is a [size] item." + . += "This is a [blood_color ? blood_color != COLOR_OIL ? "bloody " : "oil-stained " : ""][icon2html(src, user)][src.name]. It is a [size] item." if(desc) . += desc if(desc_lore) @@ -364,6 +364,7 @@ cases. Override_icon_state should be a list.*/ qdel(src) SEND_SIGNAL(src, COMSIG_ITEM_DROPPED, user) + SEND_SIGNAL(user, COMSIG_MOB_ITEM_DROPPED, src) if(drop_sound && (src.loc?.z)) playsound(src, drop_sound, dropvol, drop_vary) src.do_drop_animation(user) @@ -708,7 +709,7 @@ cases. Override_icon_state should be a list.*/ if(WEAR_IN_SHOES) if(human.shoes && istype(human.shoes, /obj/item/clothing/shoes)) var/obj/item/clothing/shoes/shoes = human.shoes - if(shoes.attempt_insert_item(human, src)) + if(shoes.can_be_inserted(src)) return TRUE return FALSE if(WEAR_IN_SCABBARD) diff --git a/code/game/objects/items/devices/cictablet.dm b/code/game/objects/items/devices/cictablet.dm index 3f87b2bfbea2..4d6db2f7772d 100644 --- a/code/game/objects/items/devices/cictablet.dm +++ b/code/game/objects/items/devices/cictablet.dm @@ -123,7 +123,7 @@ if("award") if(announcement_faction != FACTION_MARINE) return - print_medal(usr, src) + open_medal_panel(usr, src) . = TRUE if("mapview") diff --git a/code/game/objects/items/devices/helmet_visors.dm b/code/game/objects/items/devices/helmet_visors.dm index c3c3f9597060..05d75a9fefd6 100644 --- a/code/game/objects/items/devices/helmet_visors.dm +++ b/code/game/objects/items/devices/helmet_visors.dm @@ -295,7 +295,7 @@ /atom/movable/nvg_light light_power = 0.5 light_range = 1 - light_color = COLOUR_GREEN + light_color = COLOR_LIGHT_GREEN light_system = MOVABLE_LIGHT light_flags = LIGHT_ATTACHED diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index c6da7d354054..114ed48b1819 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -30,9 +30,8 @@ return // we know user is a human now, so adjust user for this check var/mob/living/carbon/human/humanoid = user - if(humanoid.speech_problem_flag) - var/list/new_message = humanoid.handle_speech_problems(message) - message = new_message[1] + var/list/new_message = humanoid.handle_speech_problems(message) + message = new_message[1] message = capitalize(message) log_admin("[key_name(user)] used a megaphone to say: >[message]<") diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 7ec941f1192b..9581f63679b9 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -405,6 +405,24 @@ var/datum/techtree/T = GET_TREE(TREE_MARINE) T.enter_mob(usr) +/obj/item/device/radio/headset/almayer/verb/give_medal_recommendation() + set name = "Give Medal Recommendation" + set desc = "Send a medal recommendation for approval by the Commanding Officer" + set category = "Object.Medals" + set src in usr + + var/mob/living/carbon/human/wearer = usr + if(!istype(wearer)) + return + var/obj/item/card/id/id_card = wearer.wear_id?.GetID() + if(!istype(id_card)) + return + if(!(id_card.rank in list(JOB_SO, JOB_XO, JOB_SQUAD_LEADER))) + to_chat(wearer, SPAN_WARNING("Only Staff Officers, Executive Officers and Squad Leaders are permitted to give medal recommendations!")) + return + if(add_medal_recommendation(usr)) + to_chat(usr, SPAN_NOTICE("Recommendation successfully submitted.")) + /obj/item/device/radio/headset/almayer/ce name = "chief engineer's headset" desc = "The headset of the guy in charge of spooling engines, managing MTs, and tearing up the floor for scrap metal. Of robust and sturdy construction. Channels are as follows: :n - engineering, :v - marine command, :m - medical, :u - requisitions, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad." @@ -520,6 +538,7 @@ name = "corporate liaison radio headset" desc = "Used by the CL to convince people to sign NDAs. Channels are as follows: :v - marine command, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad, :n - engineering, :m - medbay, :u - requisitions, :j - JTAC, :t - intel, :y for WY." icon_state = "wy_headset" + maximum_keys = 5 initial_keys = list(/obj/item/device/encryptionkey/mcom/cl) /obj/item/device/radio/headset/almayer/reporter diff --git a/code/game/objects/items/devices/radio/listening_bugs.dm b/code/game/objects/items/devices/radio/listening_bugs.dm index 67a91de1bd56..9492188a14f0 100644 --- a/code/game/objects/items/devices/radio/listening_bugs.dm +++ b/code/game/objects/items/devices/radio/listening_bugs.dm @@ -126,7 +126,7 @@ size = "small" if(SIZE_MEDIUM) size = "normal-sized" - . += "This is a [blood_color ? blood_color != "#030303" ? "bloody " : "oil-stained " : ""][icon2html(src, user)][src.name]. It is a [size] item." + . += "This is a [blood_color ? blood_color != COLOR_OIL ? "bloody " : "oil-stained " : ""][icon2html(src, user)][src.name]. It is a [size] item." if(desc) . += desc if(desc_lore) diff --git a/code/game/objects/items/devices/teleportation.dm b/code/game/objects/items/devices/teleportation.dm index 793f399ecdf0..8dea3b872cd1 100644 --- a/code/game/objects/items/devices/teleportation.dm +++ b/code/game/objects/items/devices/teleportation.dm @@ -48,7 +48,7 @@ if (usr.stat || usr.is_mob_restrained()) return var/turf/current_location = get_turf(usr)//What turf is the user on? - if(!current_location || is_admin_level(current_location.z))//If turf was not found or they're on z level 2. + if(!current_location || should_block_game_interaction(current_location))//If turf was not found or they're on z level 2. to_chat(usr, "[src] is malfunctioning.") return if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) @@ -140,7 +140,7 @@ ..() var/turf/current_location = get_turf(user)//What turf is the user on? - if(!current_location || is_admin_level(current_location.z))//If turf was not found or they're on z level 2 + if(!current_location || should_block_game_interaction(current_location))//If turf was not found or they're on z level 2 to_chat(user, SPAN_NOTICE("\The [src] is malfunctioning.")) return var/list/L = list( ) diff --git a/code/game/objects/items/explosives/plastic.dm b/code/game/objects/items/explosives/plastic.dm index 071ff3458a91..1d2986f79e55 100644 --- a/code/game/objects/items/explosives/plastic.dm +++ b/code/game/objects/items/explosives/plastic.dm @@ -321,6 +321,8 @@ penetration = 0.60 deploying_time = 10 var/shrapnel_volume = 40 + var/shrapnel_type = /datum/ammo/bullet/shrapnel/metal + var/explosion_strength = 60 /obj/item/explosive/plastic/breaching_charge/can_place(mob/user, atom/target) if(!is_type_in_list(target, breachable))//only items on the list are allowed @@ -347,13 +349,21 @@ /obj/item/explosive/plastic/breaching_charge/handle_explosion(turf/target_turf, dir, cause_data) var/explosion_target = get_step(target_turf, dir) - create_shrapnel(explosion_target, shrapnel_volume, dir, angle,/datum/ammo/bullet/shrapnel/metal, cause_data) + create_shrapnel(explosion_target, shrapnel_volume, dir, angle, shrapnel_type, cause_data) addtimer(CALLBACK(src, PROC_REF(trigger_explosion), target_turf, dir, cause_data), 1) /obj/item/explosive/plastic/breaching_charge/proc/trigger_explosion(turf/target_turf, dir, cause_data) - cell_explosion(target_turf, 60, 60, EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL, dir, cause_data) + cell_explosion(target_turf, explosion_strength, explosion_strength, EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL, dir, cause_data) qdel(src) +/obj/item/explosive/plastic/breaching_charge/rubber + name = "X17 riot charge" + desc = "An explosive device used to break into areas while protecting the user from the blast. Unlike the standard breaching charge, the X17 deploys a cone spray of rubber pellets to incapacitate rather than kill." + icon_state = "riot-charge" + overlay_image = "riot-active" + shrapnel_volume = 20 + shrapnel_type = /datum/ammo/bullet/shrapnel/rubber + /obj/item/explosive/plastic/breaching_charge/plasma name = "plasma charge" desc = "An alien explosive device. Who knows what it might do." @@ -367,6 +377,8 @@ deploying_time = 10 flags_item = NOBLUDGEON|ITEM_PREDATOR shrapnel_volume = 10 + shrapnel_type = /datum/ammo/bullet/shrapnel/plasma + explosion_strength = 90 /obj/item/explosive/plastic/breaching_charge/plasma/can_place(mob/user, atom/target) if(!HAS_TRAIT(user, TRAIT_YAUTJA_TECH)) @@ -374,11 +386,3 @@ return FALSE . = ..() -/obj/item/explosive/plastic/breaching_charge/plasma/handle_explosion(turf/target_turf, dir, cause_data) - var/explosion_target = get_step(target_turf, dir) - create_shrapnel(explosion_target, shrapnel_volume, dir, angle,/datum/ammo/bullet/shrapnel/plasma, cause_data) - addtimer(CALLBACK(src, PROC_REF(trigger_explosion), target_turf, dir, cause_data), 1) - -/obj/item/explosive/plastic/breaching_charge/plasma/trigger_explosion(turf/target_turf, dir, cause_data) - cell_explosion(target_turf, 90, 90, EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL, dir, cause_data) - qdel(src) diff --git a/code/game/objects/items/lightstick.dm b/code/game/objects/items/lightstick.dm index 89ce2c00762e..05f5a96c5b16 100644 --- a/code/game/objects/items/lightstick.dm +++ b/code/game/objects/items/lightstick.dm @@ -8,7 +8,7 @@ icon = 'icons/obj/items/lighting.dmi' icon_state = "lightstick_blue0" light_range = 2 - light_color = COLOUR_BLUE + light_color = COLOR_BLUE var/s_color = "blue" var/trample_chance = 30 var/can_trample = TRUE @@ -68,7 +68,7 @@ name = "red lightstick" icon_state = "lightstick_red0" s_color = "red" - light_color = COLOUR_RED + light_color = COLOR_RED /obj/item/lightstick/red/planted icon_state = "lightstick_red1" diff --git a/code/game/objects/items/paint.dm b/code/game/objects/items/paint.dm index c538cbf3944f..804d258bdcb4 100644 --- a/code/game/objects/items/paint.dm +++ b/code/game/objects/items/paint.dm @@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(cached_icons) name = "Paint" id = "paint_" reagent_state = 2 - color = "#808080" + color = COLOR_GRAY description = "This paint will only adhere to floor tiles." /datum/reagent/paint/reaction_turf(turf/T, volume) @@ -128,7 +128,7 @@ GLOBAL_LIST_EMPTY(cached_icons) id = "paint_remover" description = "Paint remover is used to remove floor paint from floor tiles." reagent_state = 2 - color = "#808080" + color = COLOR_GRAY /datum/reagent/paint_remover/reaction_turf(turf/T, volume) if(istype(T) && T.icon != initial(T.icon)) diff --git a/code/game/objects/items/reagent_containers/autoinjectors.dm b/code/game/objects/items/reagent_containers/autoinjectors.dm index 46463e628c1d..04a3a15585ab 100644 --- a/code/game/objects/items/reagent_containers/autoinjectors.dm +++ b/code/game/objects/items/reagent_containers/autoinjectors.dm @@ -139,6 +139,12 @@ item_state = "emptyskill" skilllock = SKILL_MEDICAL_DEFAULT +/obj/item/reagent_container/hypospray/autoinjector/tramadol/skillless/one_use + desc = "An EZ autoinjector loaded with 1 use of Tramadol, a weak but effective painkiller for normal wounds. Doesn't require any training to use." + volume = 15 + amount_per_transfer_from_this = 15 + uses_left = 1 + /obj/item/reagent_container/hypospray/autoinjector/oxycodone name = "oxycodone autoinjector (EXTREME PAINKILLER)" chemname = "oxycodone" @@ -164,6 +170,12 @@ item_state = "emptyskill" skilllock = SKILL_MEDICAL_DEFAULT +/obj/item/reagent_container/hypospray/autoinjector/kelotane/skillless/one_use + desc = "An EZ autoinjector loaded with 1 use of Kelotane, a common burn medicine. Doesn't require any training to use." + volume = 15 + amount_per_transfer_from_this = 15 + uses_left = 1 + /obj/item/reagent_container/hypospray/autoinjector/bicaridine name = "bicaridine autoinjector" chemname = "bicaridine" @@ -180,6 +192,12 @@ item_state = "emptyskill" skilllock = SKILL_MEDICAL_DEFAULT +/obj/item/reagent_container/hypospray/autoinjector/bicaridine/skillless/one_use + desc = "An EZ autoinjector loaded with 1 use of Bicaridine, a common brute and circulatory damage medicine. Doesn't require any training to use." + volume = 15 + amount_per_transfer_from_this = 15 + uses_left = 1 + /obj/item/reagent_container/hypospray/autoinjector/inaprovaline name = "inaprovaline autoinjector" chemname = "inaprovaline" diff --git a/code/game/objects/items/reagent_containers/food.dm b/code/game/objects/items/reagent_containers/food.dm index ded1b90b106f..f4b2213904d2 100644 --- a/code/game/objects/items/reagent_containers/food.dm +++ b/code/game/objects/items/reagent_containers/food.dm @@ -9,7 +9,7 @@ possible_transfer_amounts = null volume = 50 //Sets the default container amount for all food items. flags_atom = CAN_BE_SYRINGED - var/filling_color = "#FFFFFF" //Used by sandwiches. + var/filling_color = COLOR_WHITE //Used by sandwiches. /obj/item/reagent_container/food/Initialize() . = ..() diff --git a/code/game/objects/items/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm index 927501286f13..4d1c82764fb6 100644 --- a/code/game/objects/items/reagent_containers/food/snacks.dm +++ b/code/game/objects/items/reagent_containers/food/snacks.dm @@ -21,6 +21,7 @@ //Placeholder for effect that trigger on eating that aren't tied to reagents. /obj/item/reagent_container/food/snacks/proc/On_Consume(mob/M) SEND_SIGNAL(src, COMSIG_SNACK_EATEN, M) + SEND_SIGNAL(M, COMSIG_MOB_EATEN_SNACK, src) if(!usr) return if(!reagents.total_volume) @@ -568,7 +569,7 @@ name = "Boiled egg" desc = "A hard-boiled egg." icon_state = "egg" - filling_color = "#FFFFFF" + filling_color = COLOR_WHITE /obj/item/reagent_container/food/snacks/boiledegg/Initialize() . = ..() @@ -864,7 +865,7 @@ name = "Clown Burger" desc = "This tastes funny..." icon_state = "clownburger" - filling_color = "#FF00FF" + filling_color = COLOR_MAGENTA /obj/item/reagent_container/food/snacks/clownburger/Initialize() . = ..() @@ -880,7 +881,7 @@ name = "Mime Burger" desc = "Its taste defies language." icon_state = "mimeburger" - filling_color = "#FFFFFF" + filling_color = COLOR_WHITE /obj/item/reagent_container/food/snacks/mimeburger/Initialize() . = ..() @@ -1367,7 +1368,7 @@ name = "Tomato soup" desc = "Smells like copper" icon_state = "tomatosoup" - filling_color = "#FF0000" + filling_color = COLOR_RED /obj/item/reagent_container/food/snacks/bloodsoup/Initialize() . = ..() @@ -2127,7 +2128,7 @@ desc = "A tasty dessert that won't make it through a metal detector." icon_state = "gappletart" trash = /obj/item/trash/plate - filling_color = "#FFFF00" + filling_color = COLOR_YELLOW /obj/item/reagent_container/food/snacks/appletart/Initialize() . = ..() diff --git a/code/game/objects/items/reagent_containers/food/snacks/grown.dm b/code/game/objects/items/reagent_containers/food/snacks/grown.dm index 32423c121b61..4c988f18ac7c 100644 --- a/code/game/objects/items/reagent_containers/food/snacks/grown.dm +++ b/code/game/objects/items/reagent_containers/food/snacks/grown.dm @@ -62,7 +62,7 @@ name = "cherries" desc = "Great for toppings!" icon_state = "cherry" - filling_color = "#FF0000" + filling_color = COLOR_RED gender = PLURAL plantname = "cherry" @@ -357,7 +357,7 @@ name = "chili" desc = "It's spicy! Wait... IT'S BURNING ME!!" icon_state = "chilipepper" - filling_color = "#FF0000" + filling_color = COLOR_RED plantname = "chili" /obj/item/reagent_container/food/snacks/grown/eggplant @@ -379,7 +379,7 @@ name = "tomato" desc = "I say to-mah-to, you say tom-mae-to." icon_state = "tomato" - filling_color = "#FF0000" + filling_color = COLOR_RED potency = 10 plantname = "tomato" @@ -395,7 +395,7 @@ desc = "I say to-mah-to, you say tom-mae-to... OH GOD IT'S EATING MY LEGS!!" icon_state = "killertomato" potency = 10 - filling_color = "#FF0000" + filling_color = COLOR_RED potency = 30 plantname = "killertomato" @@ -414,7 +414,7 @@ desc = "So bloody...so...very...bloody....AHHHH!!!!" icon_state = "bloodtomato" potency = 10 - filling_color = "#FF0000" + filling_color = COLOR_RED plantname = "bloodtomato" /obj/item/reagent_container/food/snacks/grown/bloodtomato/launch_impact(atom/hit_atom) @@ -502,7 +502,7 @@ desc = "Amanita Muscaria: Learn poisonous mushrooms by heart. Only pick mushrooms you know." icon_state = "amanita" potency = 10 - filling_color = "#FF0000" + filling_color = COLOR_RED plantname = "amanita" /obj/item/reagent_container/food/snacks/grown/mushroom/angel diff --git a/code/game/objects/items/reagent_containers/hypospray.dm b/code/game/objects/items/reagent_containers/hypospray.dm index fcea8997f0b5..5e268d35a33d 100644 --- a/code/game/objects/items/reagent_containers/hypospray.dm +++ b/code/game/objects/items/reagent_containers/hypospray.dm @@ -206,6 +206,7 @@ to_chat(user, SPAN_NOTICE(" You inject [M] with [src].")) to_chat(M, SPAN_WARNING("You feel a tiny prick!")) playsound(loc, injectSFX, injectVOL, 1) + SEND_SIGNAL(M, COMSIG_LIVING_HYPOSPRAY_INJECTED, src) reagents.reaction(M, INGEST) if(M.reagents) diff --git a/code/game/objects/items/shards.dm b/code/game/objects/items/shards.dm index 84c3d5b83427..dab573e6f5a5 100644 --- a/code/game/objects/items/shards.dm +++ b/code/game/objects/items/shards.dm @@ -81,7 +81,7 @@ /obj/item/large_shrapnel/proc/on_embedded_movement(mob/living/embedded_mob) return -/obj/item/large_shrapnel/proc/on_embed(mob/embedded_mob, obj/limb/target_organ) +/obj/item/large_shrapnel/proc/on_embed(mob/embedded_mob, obj/limb/target_organ, silent = FALSE) return /obj/item/large_shrapnel/at_rocket_dud @@ -180,14 +180,14 @@ cell_explosion(get_turf(target), 200, 150, EXPLOSION_FALLOFF_SHAPE_LINEAR, direction, create_cause_data("[cause] UXO detonation", user)) qdel(src) -/obj/item/large_shrapnel/at_rocket_dud/on_embed(mob/embedded_mob, obj/limb/target_organ) +/obj/item/large_shrapnel/at_rocket_dud/on_embed(mob/embedded_mob, obj/limb/target_organ, silent = FALSE) if(!ishuman(embedded_mob)) return var/mob/living/carbon/human/H = embedded_mob if(H.species.flags & NO_SHRAPNEL) return if(istype(target_organ)) - target_organ.embed(src) + target_organ.embed(src, silent) /obj/item/large_shrapnel/at_rocket_dud/on_embedded_movement(mob/living/embedded_mob) if(!ishuman(embedded_mob)) @@ -212,14 +212,14 @@ source_sheet_type = null var/damage_on_move = 0.5 -/obj/item/shard/shrapnel/proc/on_embed(mob/embedded_mob, obj/limb/target_organ) +/obj/item/shard/shrapnel/proc/on_embed(mob/embedded_mob, obj/limb/target_organ, silent = FALSE) if(!ishuman(embedded_mob)) return var/mob/living/carbon/human/H = embedded_mob if(H.species.flags & NO_SHRAPNEL) return if(istype(target_organ)) - target_organ.embed(src) + target_organ.embed(src, silent) /obj/item/shard/shrapnel/proc/on_embedded_movement(mob/living/embedded_mob) if(!ishuman(embedded_mob)) @@ -228,7 +228,7 @@ if(H.species.flags & NO_SHRAPNEL) return var/obj/limb/organ = embedded_organ - if(istype(organ)) + if(istype(organ) && damage_on_move) organ.take_damage(damage_on_move * count, 0, 0, no_limb_loss = TRUE) embedded_mob.pain.apply_pain(damage_on_move * count) @@ -261,3 +261,7 @@ name = "alien bone fragments" icon_state = "alienbonechips" desc = "Sharp, jagged fragments of alien bone. Looks like the previous owner exploded violently..." + +/obj/item/shard/shrapnel/tutorial + damage_on_move = 0 + diff --git a/code/game/objects/items/stacks/cable_coil.dm b/code/game/objects/items/stacks/cable_coil.dm index e846979c00b4..077cb801c90d 100644 --- a/code/game/objects/items/stacks/cable_coil.dm +++ b/code/game/objects/items/stacks/cable_coil.dm @@ -33,7 +33,7 @@ /obj/item/stack/cable_coil/proc/updateicon() if (!color) - color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_ORANGE, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN) + color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_ORANGE, COLOR_WHITE, COLOR_MAGENTA, COLOR_YELLOW, COLOR_CYAN) if(amount == 1) icon_state = "coil1" name = "cable piece" @@ -298,11 +298,11 @@ color = "#a8c1dd" /obj/item/stack/cable_coil/white - color = "#FFFFFF" + color = COLOR_WHITE /obj/item/stack/cable_coil/random/Initialize() . = ..() - color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN) + color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_WHITE, COLOR_MAGENTA, COLOR_YELLOW, COLOR_CYAN) /obj/item/stack/cable_coil/attack(mob/M as mob, mob/user as mob) if(ishuman(M)) diff --git a/code/game/objects/items/stacks/flags.dm b/code/game/objects/items/stacks/flags.dm index bc55096211d4..484d2779f5f8 100644 --- a/code/game/objects/items/stacks/flags.dm +++ b/code/game/objects/items/stacks/flags.dm @@ -71,7 +71,7 @@ var/obj/item/stack/flag/newflag = new src.type(T) newflag.amount = 1 newflag.upright = TRUE - anchored = TRUE + newflag.anchored = TRUE newflag.name = newflag.singular_name newflag.icon_state = "[newflag.base_state]_open" newflag.visible_message("[user] plants [newflag] firmly in the ground.") diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index f96903cfb687..5434aa006137 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -95,6 +95,9 @@ to_chat(user, SPAN_WARNING("There are no wounds on [possessive] [affecting.display_name].")) return TRUE +/obj/item/stack/medical/bruise_pack/two + amount = 2 + /obj/item/stack/medical/ointment name = "ointment" desc = "Used to treat burns, infected wounds, and relieve itching in unusual places." diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 412dcf164cd4..29c4ec15d03a 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -461,6 +461,12 @@ icon_state = "marinebigsatch" max_storage_space = 20 +/obj/item/storage/backpack/marine/satchel/intel/chestrig + name = "\improper USCM expedition chestrig" + desc = "A heavy-duty IMP based chestrig, can quickly be accessed with only one hand. Usually issued to USCM intelligence officers." + icon_state = "intel_chestrig" + max_storage_space = 20 + /obj/item/storage/backpack/marine/satchel name = "\improper USCM satchel" desc = "A heavy-duty satchel carried by some USCM soldiers and support personnel." diff --git a/code/game/objects/items/storage/large_holster.dm b/code/game/objects/items/storage/large_holster.dm index b02dff1bdbcc..3f653926f8b3 100644 --- a/code/game/objects/items/storage/large_holster.dm +++ b/code/game/objects/items/storage/large_holster.dm @@ -253,9 +253,12 @@ to_chat(user, SPAN_WARNING("[src] must be equipped before you can switch types.")) return - var/obj/item/weapon/gun/flamer/M240T/flamer = user.get_active_hand() - if(!istype(flamer)) - to_chat(user, SPAN_WARNING("You must be holding [flamer] to use [src].")) + if(!linked_flamer) + to_chat(user, SPAN_WARNING("An incinerator unit must be linked in order to switch fuel types.")) + return + + if(user.get_active_hand() != linked_flamer) + to_chat(user, SPAN_WARNING("You must be holding [linked_flamer] to use [src].")) return if(!active_fuel) @@ -276,8 +279,8 @@ to_chat(user, "You switch the fuel tank to [active_fuel.caliber]") playsound(src, 'sound/machines/click.ogg', 25, TRUE) - flamer.current_mag = active_fuel - flamer.update_icon() + linked_flamer.current_mag = active_fuel + linked_flamer.update_icon() return TRUE diff --git a/code/game/objects/items/tools/flame_tools.dm b/code/game/objects/items/tools/flame_tools.dm index 82870f7ed8d1..d5cd708f29b3 100644 --- a/code/game/objects/items/tools/flame_tools.dm +++ b/code/game/objects/items/tools/flame_tools.dm @@ -180,7 +180,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM flags_atom = CAN_BE_SYRINGED attack_verb = list("burnt", "singed") blood_overlay_type = "" - light_color = LIGHT_COLOUR_ORANGE + light_color = LIGHT_COLOR_ORANGE /// Note - these are in masks.dmi not in cigarette.dmi var/icon_on = "cigon" var/icon_off = "cigoff" @@ -685,7 +685,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon = 'icons/obj/items/items.dmi' icon_state = "lighter_g" item_state = "lighter_g" - light_color = LIGHT_COLOUR_LAVA + light_color = LIGHT_COLOR_LAVA var/icon_on = "lighter_g_on" var/icon_off = "lighter_g" var/clr = "g" @@ -721,6 +721,22 @@ CIGARETTE PACKETS ARE IN FANCY.DM log_admin("[user] has engraved \the [src] with engraving \"[str]\". (CKEY: ([user.ckey]))") +/obj/item/tool/lighter/zippo/black + name = "black Zippo lighter" + desc = "A fancy black Zippo lighter. Ignite in style." + icon_state = "blackzippo" + item_state = "blackzippo" + icon_on = "blackzippoon" + icon_off = "blackzippo" + +/obj/item/tool/lighter/zippo/blue + name = "blue Zippo lighter" + desc = "A fancy blue Zippo lighter. Ignite in style." + icon_state = "bluezippo" + item_state = "bluezippo" + icon_on = "bluezippoon" + icon_off = "bluezippo" + /obj/item/tool/lighter/zippo/gold name = "golden Zippo lighter" desc = "A gold-anodized Zippo lighter. Ostentatious, but it certainly stands out." @@ -730,6 +746,15 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon_off = "goldzippo" black_market_value = 30 +/obj/item/tool/lighter/zippo/executive + name = "Weyland-Yutani executive Zippo lighter" + desc = "A remarkable Zippo lighter embellished in the Company's black and gold shade." + icon_state = "execzippo" + item_state = "execzippo" + icon_on = "execzippoon" + icon_off = "execzippo" + black_market_value = 40 + /obj/item/tool/lighter/random /obj/item/tool/lighter/random/Initialize() diff --git a/code/game/objects/items/tools/misc_tools.dm b/code/game/objects/items/tools/misc_tools.dm index 44aaab771db8..06f42aacd56c 100644 --- a/code/game/objects/items/tools/misc_tools.dm +++ b/code/game/objects/items/tools/misc_tools.dm @@ -161,7 +161,7 @@ matter = list("metal" = 10) inherent_traits = list(TRAIT_TOOL_PEN) /// what color the ink is! - var/pen_colour = "black" + var/pen_color = "black" var/on = TRUE var/clicky = FALSE @@ -180,7 +180,7 @@ /obj/item/tool/pen/proc/update_pen_state() overlays.Cut() if(on) - overlays += "+[pen_colour]_tip" + overlays += "+[pen_color]_tip" /obj/item/tool/pen/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() @@ -246,7 +246,7 @@ /obj/item/tool/pen/blue desc = "It's a normal blue ink pen." - pen_colour = "blue" + pen_color = "blue" /obj/item/tool/pen/blue/clicky desc = "It's a WY brand extra clicky blue ink pen." @@ -255,7 +255,7 @@ /obj/item/tool/pen/red desc = "It's a normal red ink pen." - pen_colour = "red" + pen_color = "red" /obj/item/tool/pen/red/clicky desc = "It's a WY brand extra clicky red ink pen." @@ -264,7 +264,7 @@ /obj/item/tool/pen/green desc = "It's a normal green ink pen." - pen_colour = "green" + pen_color = "green" /obj/item/tool/pen/green/clicky desc = "It's a WY brand extra clicky green ink pen." @@ -273,7 +273,7 @@ /obj/item/tool/pen/invisible desc = "It's an invisible pen marker." - pen_colour = "white" + pen_color = "white" /obj/item/tool/pen/fountain desc = "A lavish testament to the ingenuity of ARMAT's craftsmanship, this fountain pen is a paragon of design and functionality. Detailed with golden accents and intricate mechanics, the pen allows for a swift change between a myriad of ink colors with a simple twist. A product of precision engineering, each mechanism inside the pen is designed to provide a seamless, effortless transition from one color to the next, creating an instrument of luxurious versatility." @@ -282,8 +282,8 @@ icon_state = "fountain_pen" item_state = "fountain_pen" matter = list("metal" = 20, "gold" = 10) - var/static/list/colour_list = list("red", "blue", "green", "yellow", "purple", "pink", "brown", "black", "orange") // Can add more colors as required - var/current_colour_index = 1 + var/static/list/color_list = list("red", "blue", "green", "yellow", "purple", "pink", "brown", "black", "orange") // Can add more colors as required + var/current_color_index = 1 var/owner_name /obj/item/tool/pen/fountain/pickup(mob/user, silent) @@ -305,9 +305,9 @@ /obj/item/tool/pen/fountain/attack_self(mob/living/carbon/human/user) if(on) - current_colour_index = (current_colour_index % length(colour_list)) + 1 - pen_colour = colour_list[current_colour_index] - balloon_alert(user,"you twist the pen and change the ink color to [pen_colour].") + current_color_index = (current_color_index % length(color_list)) + 1 + pen_color = color_list[current_color_index] + balloon_alert(user,"you twist the pen and change the ink color to [pen_color].") if(clicky) playsound(user.loc, 'sound/items/pen_click_on.ogg', 100, 1, 5) update_pen_state() @@ -415,6 +415,10 @@ name = "\improper DENIED rubber stamp" icon_state = "stamp-deny" +/obj/item/tool/stamp/approved + name = "\improper APPROVED rubber stamp" + icon_state = "stamp-approve" + /obj/item/tool/stamp/clown name = "clown's rubber stamp" icon_state = "stamp-clown" diff --git a/code/game/objects/items/toys/crayons.dm b/code/game/objects/items/toys/crayons.dm index c02b59289fa1..c8dc85b95a1a 100644 --- a/code/game/objects/items/toys/crayons.dm +++ b/code/game/objects/items/toys/crayons.dm @@ -37,21 +37,21 @@ /obj/item/toy/crayon/mime icon_state = "crayonmime" desc = "A very sad-looking crayon." - crayon_color = "#FFFFFF" - shadeColour = "#000000" + crayon_color = COLOR_WHITE + shadeColour = COLOR_BLACK colourName = "mime" uses = 0 /obj/item/toy/crayon/mime/attack_self(mob/living/user) //inversion ..() - if(crayon_color != "#FFFFFF" && shadeColour != "#000000") - crayon_color = "#FFFFFF" - shadeColour = "#000000" + if(crayon_color != COLOR_WHITE && shadeColour != COLOR_BLACK) + crayon_color = COLOR_WHITE + shadeColour = COLOR_BLACK to_chat(user, "You will now draw in white and black with this crayon.") else - crayon_color = "#000000" - shadeColour = "#FFFFFF" + crayon_color = COLOR_BLACK + shadeColour = COLOR_WHITE to_chat(user, "You will now draw in black and white with this crayon.") /obj/item/toy/crayon/rainbow diff --git a/code/game/objects/items/weapons/blades.dm b/code/game/objects/items/weapons/blades.dm index 2fe80f123bce..a2a4aa8db75d 100644 --- a/code/game/objects/items/weapons/blades.dm +++ b/code/game/objects/items/weapons/blades.dm @@ -213,6 +213,8 @@ else INVOKE_ASYNC(embedded_human, TYPE_PROC_REF(/mob, emote), "me", 1, pick("winces.", "grimaces.", "flinches.")) + SEND_SIGNAL(embedded_human, COMSIG_HUMAN_SHRAPNEL_REMOVED) + else to_chat(user, SPAN_NOTICE("You couldn't find any shrapnel.")) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index cc9f1fe53fea..7747a45ed9da 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -278,6 +278,11 @@ if (iszombie(user)) return + // mobs that become immobilized should not be able to buckle themselves. + if(M == user && HAS_TRAIT(user, TRAIT_IMMOBILIZED)) + to_chat(user, SPAN_WARNING("You are unable to do this in your current state.")) + return + if(density) density = FALSE if(!step(M, get_dir(M, src)) && loc != M.loc) diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 078eac70bd14..39a659c5f397 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -268,22 +268,22 @@ GLOBAL_LIST_EMPTY(rbarrel_cap_states) // Will be set up in generate_barrel_states GLOBAL_LIST_INIT(rbarrel_center_states, generate_barrel_states()) -GLOBAL_LIST_INIT(rbarrel_color_list, list(COLOUR_SILVER, - COLOUR_FLOORTILE_GRAY, - COLOUR_MAROON, - COLOUR_SOFT_RED, - COLOUR_LIGHT_GRAYISH_RED, - COLOUR_VERY_SOFT_YELLOW, - COLOUR_OLIVE, - COLOUR_DARK_MODERATE_LIME_GREEN, - COLOUR_TEAL, - COLOUR_MODERATE_BLUE, - COLOUR_PURPLE, - COLOUR_STRONG_VIOLET, - COLOUR_BEIGE, - COLOUR_DARK_MODERATE_ORANGE, - COLOUR_BROWN, - COLOUR_DARK_BROWN)) +GLOBAL_LIST_INIT(rbarrel_color_list, list(COLOR_SILVER, + COLOR_FLOORTILE_GRAY, + COLOR_MAROON, + COLOR_SOFT_RED, + COLOR_LIGHT_GRAYISH_RED, + COLOR_VERY_SOFT_YELLOW, + COLOR_OLIVE, + COLOR_DARK_MODERATE_LIME_GREEN, + COLOR_TEAL, + COLOR_MODERATE_BLUE, + COLOR_PURPLE, + COLOR_STRONG_VIOLET, + LIGHT_BEIGE, + COLOR_DARK_MODERATE_ORANGE, + COLOR_BROWN, + COLOR_DARK_BROWN)) /proc/generate_barrel_states() var/list/rbarrel_center_states = list() diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index 9d007a0c8c80..0c763378ede1 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -1,80 +1,111 @@ +#define MAX_NOTICES 8 + /obj/structure/noticeboard name = "notice board" desc = "A board for pinning important notices upon." icon = 'icons/obj/structures/props/stationobjs.dmi' - icon_state = "nboard00" + icon_state = "noticeboard" density = FALSE anchored = TRUE var/notices = 0 -/obj/structure/noticeboard/Initialize() +/obj/structure/noticeboard/Initialize(mapload) . = ..() + if(!mapload) + return + for(var/obj/item/I in loc) - if(notices > 4) break + if(notices >= MAX_NOTICES) + break if(istype(I, /obj/item/paper)) I.forceMove(src) notices++ - icon_state = "nboard0[notices]" + update_overlays() //attaching papers!! -/obj/structure/noticeboard/attackby(obj/item/O as obj, mob/user as mob) - if(istype(O, /obj/item/paper)) - if(notices < 5) - O.add_fingerprint(user) - add_fingerprint(user) - user.drop_held_item() - O.forceMove(src) +/obj/structure/noticeboard/attackby(obj/item/O, mob/user, params) + if(istype(O, /obj/item/paper) || istype(O, /obj/item/photo)) + if(!allowed(user)) + to_chat(user, SPAN_WARNING("You are not authorized to add notices!")) + return + if(notices < MAX_NOTICES) + if(!user.drop_inv_item_to_loc(O, src)) + return notices++ - icon_state = "nboard0[notices]" //update sprite - to_chat(user, SPAN_NOTICE("You pin the paper to the noticeboard.")) + update_overlays() + to_chat(user, SPAN_NOTICE("You pin the [O] to the noticeboard.")) else - to_chat(user, SPAN_NOTICE("You reach to pin your paper to the board but hesitate. You are certain your paper will not be seen among the many others already attached.")) + to_chat(user, SPAN_WARNING("The notice board is full!")) + else if(istype(O, /obj/item/tool/pen)) + user.set_interaction(src) + tgui_interact(user) + else + return ..() -/obj/structure/noticeboard/attack_hand(user as mob) - var/dat = "Noticeboard
" - for(var/obj/item/paper/P in src) - dat += "[P.name] Write Remove
" - user << browse("Notices[dat]","window=noticeboard") - onclose(user, "noticeboard") +/obj/structure/noticeboard/attack_hand(mob/user) + . = ..() + user.set_interaction(src) + tgui_interact(user) +/obj/structure/noticeboard/ui_state(mob/user) + return GLOB.physical_state -/obj/structure/noticeboard/Topic(href, href_list) - ..() - usr.set_interaction(src) - if(href_list["remove"]) - if((usr.stat || usr.is_mob_restrained())) //For when a player is handcuffed while they have the notice window open - return - var/obj/item/P = locate(href_list["remove"]) - if((P && P.loc == src)) - P.forceMove(get_turf(src) )//dump paper on the floor because you're a clumsy fuck - P.add_fingerprint(usr) - add_fingerprint(usr) - notices-- - icon_state = "nboard0[notices]" +/obj/structure/noticeboard/tgui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "NoticeBoard", name) + ui.open() - if(href_list["write"]) - if((usr.stat || usr.is_mob_restrained())) //For when a player is handcuffed while they have the notice window open - return - var/obj/item/P = locate(href_list["write"]) +/obj/structure/noticeboard/ui_data(mob/user) + var/list/data = list() + data["allowed"] = allowed(user) + data["items"] = list() + for(var/obj/item/content in contents) + var/list/content_data = list( + name = content.name, + ref = REF(content) + ) + data["items"] += list(content_data) + return data + +/obj/structure/noticeboard/ui_act(action, params) + . = ..() + if(.) + return + + var/obj/item/item = locate(params["ref"]) in contents + if(!istype(item) || item.loc != src) + return + + var/mob/user = usr + + switch(action) + if("examine") + user.examinate(item) + return TRUE + if("write") + var/obj/item/writing_tool = user.get_held_item() + if(!istype(writing_tool, /obj/item/tool/pen)) + balloon_alert(user, "you need a pen for that!") + return + item.attackby(writing_tool, user) + return TRUE + if("remove") + if(!allowed(user)) + return + remove_item(item, user) + return TRUE + +/obj/structure/noticeboard/proc/update_overlays() + if(overlays) overlays.Cut() + if(notices) + overlays += image(icon, "notices_[notices]") - if((P && P.loc == src)) //ifthe paper's on the board - if(HAS_TRAIT(usr.r_hand, TRAIT_TOOL_PEN)) - add_fingerprint(usr) - P.attackby(usr.r_hand, usr) //then do ittttt - else - if(HAS_TRAIT(usr.l_hand, TRAIT_TOOL_PEN)) //check other hand for pen - add_fingerprint(usr) - P.attackby(usr.l_hand, usr) - else - to_chat(usr, SPAN_NOTICE("You'll need something to write with!")) +/obj/structure/noticeboard/proc/remove_item(obj/item/item, mob/user) + item.forceMove(loc) + if(user) + user.put_in_hands(item) + balloon_alert(user, "removed from board") + notices-- + update_overlays() - if(href_list["read"]) - var/obj/item/paper/P = locate(href_list["read"]) - if((P && P.loc == src)) - if(!( istype(usr, /mob/living/carbon/human) )) - usr << browse("[P.name][stars(P.info)]", "window=[P.name]") - onclose(usr, "[P.name]") - else - usr << browse("[P.name][P.info]", "window=[P.name]") - onclose(usr, "[P.name]") - return diff --git a/code/game/sim_manager/datums/simulator.dm b/code/game/sim_manager/datums/simulator.dm index bf99c65ee66f..1f1aedad8153 100644 --- a/code/game/sim_manager/datums/simulator.dm +++ b/code/game/sim_manager/datums/simulator.dm @@ -1,18 +1,21 @@ +#define GRID_CLEARING_SIZE 16 + /datum/simulator // Necessary to prevent multiple users from simulating at the same time. var/static/detonation_cooldown = 0 + var/static/detonation_cooldown_time = 2 MINUTES var/static/sim_reboot_state = TRUE - var/looking_at_simulation = FALSE - var/detonation_cooldown_time = 2 MINUTES var/dummy_mode = CLF_MODE var/obj/structure/machinery/camera/simulation/sim_camera - var/grid_clearing_size = 16 // garbage collection, var/static/list/delete_targets = list() + // list of users currently inside the simulator + var/static/list/users_in_sim = list() + /* unarmoured humans are unnencessary clutter as they tend to explode easily and litter the sim room with body parts, best left out. @@ -29,7 +32,7 @@ /datum/simulator/proc/start_watching(mob/living/user) - if(looking_at_simulation) + if(user in users_in_sim) to_chat(user, SPAN_WARNING("You are already looking at the simulation.")) return if(!sim_camera) @@ -41,13 +44,15 @@ to_chat(user, SPAN_WARNING("You're too busy looking at something else.")) return user.reset_view(sim_camera) - looking_at_simulation = TRUE + users_in_sim += user /datum/simulator/proc/stop_watching(mob/living/user) + if(!(user in users_in_sim)) + return user.unset_interaction() user.reset_view(null) user.cameraFollow = null - looking_at_simulation = FALSE + users_in_sim -= user /datum/simulator/proc/sim_turf_garbage_collection() @@ -67,8 +72,8 @@ y:2 | x: 1 2 3 4 ... 16 y:1 | x: 1 2 3 4 ... 16 */ - for (var/y_pos in 1 to grid_clearing_size)// outer y - for (var/x_pos in 1 to grid_clearing_size) // inner x + for (var/y_pos in 1 to GRID_CLEARING_SIZE)// outer y + for (var/x_pos in 1 to GRID_CLEARING_SIZE) // inner x var/turf/current_grid = locate(sim_grid_start_pos.x + x_pos,sim_grid_start_pos.y + y_pos,sim_grid_start_pos.z) current_grid.empty(/turf/open/floor/engine) @@ -101,3 +106,4 @@ addtimer(CALLBACK(src, PROC_REF(sim_turf_garbage_collection)), 30 SECONDS, TIMER_STOPPABLE) +#undef GRID_CLEARING_SIZE diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 069d932d991b..8214ee76d091 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -667,9 +667,12 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) var/list/packages -/obj/item/paper/manifest/read_paper(mob/user) +/obj/item/paper/manifest/read_paper(mob/user, scramble = FALSE) + var/paper_info = info + if(scramble) + paper_info = stars_decode_html(info) // Tossing ref in widow id as this allows us to read multiple manifests at same time - show_browser(user, "[info][stamps]", null, "manifest\ref[src]", "size=550x650") + show_browser(user, "[paper_info][stamps]", null, "manifest\ref[src]", "size=550x650") onclose(user, "manifest\ref[src]") /obj/item/paper/manifest/proc/generate_contents() @@ -1442,7 +1445,7 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) world.log << "## ERROR: Eek. The supply/elevator datum is missing somehow." return - if(!is_admin_level(SSshuttle.vehicle_elevator.z)) + if(!should_block_game_interaction(SSshuttle.vehicle_elevator)) to_chat(usr, SPAN_WARNING("The elevator needs to be in the cargo bay dock to call a vehicle up. Ask someone to send it away.")) return diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index 9cad56cdabe8..5871fdc7a152 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -42,6 +42,8 @@ var/list/Lines = list() if(admin_holder && ((R_ADMIN & admin_holder.rights) || (R_MOD & admin_holder.rights))) for(var/client/C in GLOB.clients) + if(!CLIENT_HAS_RIGHTS(src, R_STEALTH) && (CLIENT_IS_STEALTHED(C))) + continue var/entry = "[C.key]" if(C.mob) //Juuuust in case if(istype(C.mob, /mob/new_player)) @@ -139,7 +141,7 @@ else for(var/client/C in GLOB.clients) - if(C.admin_holder && C.admin_holder.fakekey) + if((C.admin_holder && C.admin_holder.fakekey) || (CLIENT_IS_STEALTHED(C))) continue Lines += C.key @@ -172,6 +174,8 @@ LAZYSET(listings, category, list()) for(var/client/C in GLOB.admins) + if(CLIENT_IS_STEALTHED(C) && !CLIENT_HAS_RIGHTS(src, R_STEALTH)) + continue if(C.admin_holder?.fakekey && !CLIENT_IS_STAFF(src)) continue for(var/category in mappings) @@ -187,7 +191,9 @@ for(var/srank in entry.admin_holder.extra_titles) dat += " & [srank]" if(CLIENT_IS_STAFF(src)) - if(entry.admin_holder?.fakekey) + if(CLIENT_IS_STEALTHED(entry)) + dat += " (STEALTHED)" + else if(entry.admin_holder?.fakekey) dat += " (HIDDEN)" if(istype(entry.mob, /mob/dead/observer)) dat += " - Observing" diff --git a/code/global.dm b/code/global.dm index 6847fbd2b7fe..f141dc5d68ac 100644 --- a/code/global.dm +++ b/code/global.dm @@ -33,6 +33,7 @@ #define CLIENT_HAS_RIGHTS(cli, flags) ((cli?.admin_holder?.rights & flags) == flags) #define CLIENT_IS_STAFF(cli) (cli?.admin_holder?.rights & (R_MOD|R_ADMIN)) #define CLIENT_IS_MENTOR(cli) CLIENT_HAS_RIGHTS(cli, R_MENTOR) +#define CLIENT_IS_STEALTHED(cli) (CLIENT_HAS_RIGHTS(cli, R_STEALTH) && cli.prefs?.toggles_admin & ADMIN_STEALTHMODE) #define AHOLD_IS_MOD(ahold) (ahold && (ahold.rights & R_MOD)) #define AHOLD_IS_ADMIN(ahold) (ahold && (ahold.rights & R_ADMIN)) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 71491cd7d6f9..4623df8a5dc5 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -67,7 +67,7 @@ GLOBAL_LIST_INIT(admin_verbs_default, list( /datum/admins/proc/subtlemessageall, /datum/admins/proc/alertall, /datum/admins/proc/imaginary_friend, - /client/proc/toggle_ares_ping, + /client/proc/toggle_admin_pings, /client/proc/cmd_admin_say, /*staff-only ooc chat*/ /client/proc/cmd_mod_say, /* alternate way of typing asay, no different than cmd_admin_say */ /client/proc/cmd_admin_tacmaps_panel, @@ -250,6 +250,10 @@ GLOBAL_LIST_INIT(admin_verbs_color, list( /client/proc/set_ooc_color_self )) +GLOBAL_LIST_INIT(admin_verbs_stealth, list( + /client/proc/toggle_admin_stealth +)) + GLOBAL_LIST_INIT(admin_mob_event_verbs_hideable, list( /client/proc/hide_event_mob_verbs, /client/proc/cmd_admin_select_mob_rank, @@ -341,6 +345,8 @@ GLOBAL_LIST_INIT(roundstart_mod_verbs, list( add_verb(src, GLOB.admin_verbs_sounds) if(CLIENT_HAS_RIGHTS(src, R_SPAWN)) add_verb(src, GLOB.admin_verbs_spawn) + if(CLIENT_HAS_RIGHTS(src, R_STEALTH)) + add_verb(src, GLOB.admin_verbs_stealth) if(GLOB.RoleAuthority && (GLOB.RoleAuthority.roles_whitelist[ckey] & WHITELIST_YAUTJA_LEADER)) add_verb(src, GLOB.clan_verbs) @@ -370,6 +376,7 @@ GLOBAL_LIST_INIT(roundstart_mod_verbs, list( GLOB.admin_mob_event_verbs_hideable, GLOB.admin_verbs_hideable, GLOB.debug_verbs, + GLOB.admin_verbs_stealth, )) /client/proc/jobbans() @@ -585,16 +592,24 @@ GLOBAL_LIST_INIT(roundstart_mod_verbs, list( message_admins("[key_name(usr)] announced a random fact.") SSticker.mode?.declare_fun_facts() -/client/proc/toggle_ares_ping() - set name = "Toggle ARES notification sound" - set category = "Preferences.Logs" +/client/proc/toggle_admin_pings() + set name = "Toggle StaffIC log sounds" + set category = "Preferences.Sound" prefs.toggles_sound ^= SOUND_ARES_MESSAGE if (prefs.toggles_sound & SOUND_ARES_MESSAGE) - to_chat(usr, SPAN_BOLDNOTICE("You will now hear a ping for ARES messages.")) + to_chat(usr, SPAN_BOLDNOTICE("You will now hear an audio cue for ARES and Prayer messages.")) else - to_chat(usr, SPAN_BOLDNOTICE("You will no longer hear a ping for ARES messages.")) + to_chat(usr, SPAN_BOLDNOTICE("You will no longer hear an audio cue for ARES and Prayer messages.")) +/client/proc/toggle_admin_stealth() + set name = "Toggle Admin Stealth" + set category = "Preferences" + prefs.toggles_admin ^= ADMIN_STEALTHMODE + if(prefs.toggles_admin & ADMIN_STEALTHMODE) + to_chat(usr, SPAN_BOLDNOTICE("You enabled admin stealth mode.")) + else + to_chat(usr, SPAN_BOLDNOTICE("You disabled admin stealth mode.")) #undef MAX_WARNS #undef AUTOBANTIME diff --git a/code/modules/admin/player_panel/actions/general.dm b/code/modules/admin/player_panel/actions/general.dm index a47a42d44cc2..e4ebc9fb85dd 100644 --- a/code/modules/admin/player_panel/actions/general.dm +++ b/code/modules/admin/player_panel/actions/general.dm @@ -68,17 +68,9 @@ message_admins("[key_name_admin(user)] has sent [key_name_admin(target)] back to the Lobby.") - var/mob/new_player/NP = new() - - if(!target.mind) - target.mind_initialize() - - target.mind.transfer_to(NP) - - qdel(target) + target.send_to_lobby() return TRUE - /datum/player_action/force_say action_tag = "mob_force_say" name = "Force Say" diff --git a/code/modules/admin/player_panel/player_panel.dm b/code/modules/admin/player_panel/player_panel.dm index bead55f994ab..0fef0415bb38 100644 --- a/code/modules/admin/player_panel/player_panel.dm +++ b/code/modules/admin/player_panel/player_panel.dm @@ -188,6 +188,8 @@ for(var/mob/M in mobs) if(!M.ckey) continue + if(!CLIENT_HAS_RIGHTS(usr.client, R_STEALTH) && (M.client && (CLIENT_IS_STEALTHED(M.client)))) + continue var/color = i % 2 == 0 ? "#6289b7" : "#48709d" diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm index 830717ef91b9..839dea7b2334 100644 --- a/code/modules/admin/tabs/event_tab.dm +++ b/code/modules/admin/tabs/event_tab.dm @@ -570,7 +570,12 @@ if(!admin_holder || !(admin_holder.rights & R_MOD)) to_chat(src, "Only administrators may use this command.") - return + return FALSE + + if(!ares_is_active()) + to_chat(usr, SPAN_WARNING("[MAIN_AI_SYSTEM] is destroyed, and cannot talk!")) + return FALSE + var/input = input(usr, "This is a standard message from the ship's AI. It uses Almayer General channel and won't be heard by humans without access to Almayer General channel (headset or intercom). Check with online staff before you send this. Do not use html.", "What?", "") as message|null if(!input) return FALSE @@ -579,7 +584,7 @@ var/prompt = tgui_alert(src, "ARES interface processor is offline or destroyed, send the message anyways?", "Choose.", list("Yes", "No"), 20 SECONDS) if(prompt == "No") to_chat(usr, SPAN_WARNING("[MAIN_AI_SYSTEM] is not responding. It's interface processor may be offline or destroyed.")) - return + return FALSE ai_announcement(input) message_admins("[key_name_admin(src)] has created an AI comms report") @@ -592,13 +597,17 @@ if(!admin_holder || !(admin_holder.rights & R_MOD)) to_chat(src, "Only administrators may use this command.") - return + return FALSE + + if(!ares_is_active()) + to_chat(usr, SPAN_WARNING("[MAIN_AI_SYSTEM] is destroyed, and cannot talk!")) + return FALSE + var/input = tgui_input_text(usr, "This is a broadcast from the ship AI to Working Joes and Maintenance Drones. Do not use html.", "What?", "") if(!input) return FALSE - var/datum/ares_link/link = GLOB.ares_link - if(link.processor_apollo.inoperable()) + if(!ares_can_apollo()) var/prompt = tgui_alert(src, "ARES APOLLO processor is offline or destroyed, send the message anyways?", "Choose.", list("Yes", "No"), 20 SECONDS) if(prompt != "Yes") to_chat(usr, SPAN_WARNING("[MAIN_AI_SYSTEM] is not responding. It's APOLLO processor may be offline or destroyed.")) @@ -1007,10 +1016,11 @@ if("Xeno") GLOB.bioscan_data.qm_bioscan(variance) if("Marine") - var/force_check = tgui_alert(usr, "Do you wish to force ARES to display the bioscan?", "Display force", list("Yes", "No"), 20 SECONDS) var/force_status = FALSE - if(force_check == "Yes") - force_status = TRUE + if(!ares_can_interface()) //proc checks if ARES is dead or if ARES cannot do announcements + var/force_check = tgui_alert(usr, "ARES is currently unable to properly display and/or perform the Bioscan, do you wish to force ARES to display the bioscan?", "Display force", list("Yes", "No"), 20 SECONDS) + if(force_check == "Yes") + force_status = TRUE GLOB.bioscan_data.ares_bioscan(force_status, variance) if("Yautja") GLOB.bioscan_data.yautja_bioscan() diff --git a/code/modules/admin/topic/topic_events.dm b/code/modules/admin/topic/topic_events.dm index 0c37e81f2641..da8743d6dead 100644 --- a/code/modules/admin/topic/topic_events.dm +++ b/code/modules/admin/topic/topic_events.dm @@ -205,6 +205,7 @@ em_call.mob_max = humans.len em_call.players_to_offer = humans em_call.owner = owner + var/quiet_launch = TRUE var/ql_prompt = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) if(ql_prompt == "Yes") @@ -214,7 +215,7 @@ var/ar_prompt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) if(ar_prompt == "Yes") announce_receipt = TRUE - log_debug("ERT DEBUG (CUSTOM SET): [quiet_launch] - [announce_receipt]") + em_call.activate(quiet_launch, announce_receipt) message_admins("[key_name_admin(usr)] created [humans_to_spawn] humans as [job_name] at [get_area(initial_spot)]") @@ -285,7 +286,7 @@ xenos += X - if (offer_as_ert) + if(offer_as_ert) var/datum/emergency_call/custom/em_call = new() var/name = input(usr, "Please name your ERT", "ERT Name", "Admin spawned xenos") em_call.name = name @@ -293,19 +294,16 @@ em_call.players_to_offer = xenos em_call.owner = owner - var/launch_broadcast = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) - if(launch_broadcast == "Yes") - launch_broadcast = TRUE - else - launch_broadcast = FALSE + var/quiet_launch = TRUE + var/ql_prompt = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) + if(ql_prompt == "Yes") + quiet_launch = FALSE - var/announce_receipt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) - if(announce_receipt == "Yes") + var/announce_receipt = FALSE + var/ar_prompt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) + if(ar_prompt == "Yes") announce_receipt = TRUE - else - announce_receipt = FALSE - em_call.activate(launch_broadcast, announce_receipt) + em_call.activate(quiet_launch, announce_receipt) message_admins("[key_name_admin(usr)] created [xenos_to_spawn] xenos as [xeno_caste] at [get_area(initial_spot)]") - diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 66ed690a0e80..f6df1e652ba5 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -12,23 +12,20 @@ if(src.client.handle_spam_prevention(msg,MUTE_PRAY)) return - var/liaison = 0 - if(job == "Corporate Liaison") - liaison = 1 + var/prefix = SPAN_PURPLE("PRAY: ") + var/receipt = "Your prayers have been received by the gods." + if(job == JOB_CORPORATE_LIAISON) + prefix = SPAN_PURPLE("LIAISON: ") + receipt = "Your corporate overlords at Weyland-Yutani have received your message." - if(liaison) - msg = "[SPAN_STAFF_IC("LIAISON:")][key_name(src, 1)] [CC_MARK(src)] [ADMIN_PP(src)] [ADMIN_VV(src)] [ADMIN_SM(src)] [ADMIN_JMP_USER(src)] [ADMIN_SC(src)]: [msg]" - else - msg = "[SPAN_STAFF_IC("PRAY: ")][key_name(src, 1)] [CC_MARK(src)] [ADMIN_PP(src)] [ADMIN_VV(src)] [ADMIN_SM(src)] [ADMIN_JMP_USER(src)] [ADMIN_SC(src)]: [msg]" + msg = SPAN_BIGNOTICE("[prefix][key_name(src, 1)] [CC_MARK(src)] [ADMIN_PP(src)] [ADMIN_VV(src)] [ADMIN_SM(src)] [ADMIN_JMP_USER(src)] [ADMIN_SC(src)]: [msg]") log_admin(msg) - for(var/client/C in GLOB.admins) - if(AHOLD_IS_MOD(C.admin_holder) && C.prefs.toggles_chat & CHAT_PRAYER) - to_chat(C, msg) - C << 'sound/machines/terminal_alert.ogg' - if(liaison) - to_chat(usr, "Your corporate overlords at Weyland-Yutani have received your message.") - else - to_chat(usr, "Your prayers have been received by the gods.") + for(var/client/admin in GLOB.admins) + if(AHOLD_IS_MOD(admin.admin_holder)) + to_chat(admin, SPAN_STAFF_IC(msg)) + if(admin.prefs.toggles_sound & SOUND_ARES_MESSAGE) + admin << 'sound/machines/terminal_alert.ogg' + to_chat(usr, receipt) /proc/high_command_announce(text , mob/Sender , iamessage) var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN) diff --git a/code/modules/admin/view_variables/get_variables.dm b/code/modules/admin/view_variables/get_variables.dm index a2b87b0909d0..9ec449e4c3f6 100644 --- a/code/modules/admin/view_variables/get_variables.dm +++ b/code/modules/admin/view_variables/get_variables.dm @@ -121,12 +121,12 @@ switch(.["class"]) if(VV_TEXT) - .["value"] = tgui_input_text(usr, "Enter new text:", "Text", current_value, encode = FALSE) + .["value"] = tgui_input_text(usr, "Enter new text:", "Text", current_value, encode = FALSE, trim = FALSE) if(.["value"] == null) .["class"] = null return if(VV_MESSAGE) - .["value"] = tgui_input_text(usr, "Enter new text:", "Text", current_value, encode = FALSE) + .["value"] = tgui_input_text(usr, "Enter new text:", "Text", current_value, encode = FALSE, trim = FALSE) if(.["value"] == null) .["class"] = null return diff --git a/code/modules/animations/animation_library.dm b/code/modules/animations/animation_library.dm index d4fd8feeaf24..f153338487cd 100644 --- a/code/modules/animations/animation_library.dm +++ b/code/modules/animations/animation_library.dm @@ -47,22 +47,22 @@ Instead of being uniform, it starts out a littler slower, goes fast in the middl animate(A, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3) //Flashes a color, then goes back to regular. -/proc/animation_flash_color(atom/A, flash_color = "#FF0000", speed = 3) //Flashes red on default. +/proc/animation_flash_color(atom/A, flash_color = COLOR_RED, speed = 3) //Flashes red on default. var/oldcolor = A.color animate(A, color = flash_color, time = speed, flags = ANIMATION_PARALLEL) animate(color = oldcolor, time = speed) /* fuck this, only halloween uses this -spookydonut //Gives it a spooky overlay and animation. Same as above, mostly, only adds a cool overlay effect. -/proc/animation_horror_flick(atom/A, flash_color = "#000000", speed = 4) +/proc/animation_horror_flick(atom/A, flash_color = COLOR_BLACK, speed = 4) animate(A, color = flash_color, time = speed) - animate(color = "#FFFFFF", time = speed) + animate(color = COLOR_WHITE, time = speed) var/image/I = image('icons/mob/mob.dmi',A,"spook") I.flick_overlay(A,7) /proc/animation_blood_spatter(atom/A, flash_color = "#8A0707", speed = 4) animate(A, color = flash_color, time = speed) - animate(color = "#FFFFFF", time = speed) + animate(color = COLOR_WHITE, time = speed) var/image/I = image('icons/mob/mob.dmi',A,"blood_spatter") if(prob(50)) I.transform = matrix(rand(0,45), MATRIX_ROTATE) @@ -91,13 +91,13 @@ Instead of being uniform, it starts out a littler slower, goes fast in the middl /proc/animation_teleport_quick_in(atom/A, speed = 10) A.transform = matrix(0, 4, MATRIX_SCALE) A.alpha = 0 //Start with transparency, just in case. - animate(A, alpha = 255, transform = null, color = "#FFFFFF", time = speed, easing = BACK_EASING) + animate(A, alpha = 255, transform = null, color = COLOR_WHITE, time = speed, easing = BACK_EASING) /*A magical teleport animation, for when the person is transported with some magic. Good for Halloween type events. Can look good elsewhere as well.*/ /*proc/animation_teleport_magic_out(atom/A, speed = 6) animate(A, transform = matrix(1.5, 0, MATRIX_SCALE), time = speed, easing = BACK_EASING) - animate(transform = matrix(0, 4, MATRIX_SCALE) * matrix(0, 6, MATRIX_TRANSLATE), color = "#FFFF00", time = speed, alpha = 100, easing = BOUNCE_EASING|EASE_IN) + animate(transform = matrix(0, 4, MATRIX_SCALE) * matrix(0, 6, MATRIX_TRANSLATE), color = COLOR_YELLOW, time = speed, alpha = 100, easing = BOUNCE_EASING|EASE_IN) animate(alpha = 0, time = speed) var/image/I = image('icons/effects/effects.dmi',A,"sparkle") I.flick_overlay(A,9) @@ -106,8 +106,8 @@ Can look good elsewhere as well.*/ /proc/animation_teleport_magic_in(atom/A, speed = 6) A.transform = matrix(0,3.5, MATRIX_SCALE) A.alpha = 0 - animate(A, alpha = 255, color = "#FFFF00", time = speed, easing = BACK_EASING) - animate(transform = matrix(1.5, 0, MATRIX_SCALE), color = "#FFFFFF", time = speed, easing = CIRCULAR_EASING|EASE_OUT) + animate(A, alpha = 255, color = COLOR_YELLOW, time = speed, easing = BACK_EASING) + animate(transform = matrix(1.5, 0, MATRIX_SCALE), color = COLOR_WHITE, time = speed, easing = CIRCULAR_EASING|EASE_OUT) animate(transform = null, time = speed-1) var/image/I = image('icons/effects/effects.dmi',A,"sparkle") I.flick_overlay(A,10) @@ -115,7 +115,7 @@ Can look good elsewhere as well.*/ //A spooky teleport for evil dolls, horrors, and whatever else. Halloween type stuff. /proc/animation_teleport_spooky_out(atom/A, speed = 6, sleep_duration = 0) animate(A, transform = matrix() * 1.5, color = "#551a8b", time = speed, easing = BACK_EASING) - animate(transform = matrix() * 0.2, alpha = 100, color = "#000000", time = speed, easing = BACK_EASING) + animate(transform = matrix() * 0.2, alpha = 100, color = COLOR_BLACK, time = speed, easing = BACK_EASING) animate(alpha = 0, time = speed) var/image/I = image('icons/effects/effects.dmi',A,"spooky") I.flick_overlay(A,9,RESET_COLOR|RESET_ALPHA|TILE_BOUND) @@ -125,7 +125,7 @@ Can look good elsewhere as well.*/ A.transform *= 1.2 A.alpha = 0 animate(A, alpha = 255, color = "#551a8b", time = speed) - animate(transform = null, color = "#FFFFFF", time = speed, easing = QUAD_EASING|EASE_OUT) + animate(transform = null, color = COLOR_WHITE, time = speed, easing = QUAD_EASING|EASE_OUT) var/image/I = image('icons/effects/effects.dmi',A,"spooky") I.flick_overlay(A,10)*/ @@ -135,7 +135,7 @@ Can look good elsewhere as well.*/ A.mouse_opacity = MOUSE_OPACITY_TRANSPARENT //We don't want them to click this while the animation is still playing. A.density = FALSE //So it doesn't block anything. var/i = 1 + (0.1 * rand(1,5)) - animate(A, transform = matrix() * i, color = "#808080", time = speed, easing = SINE_EASING) + animate(A, transform = matrix() * i, color = COLOR_GRAY, time = speed, easing = SINE_EASING) animate(alpha = 0, time = speed) return speed @@ -166,7 +166,7 @@ Can look good elsewhere as well.*/ animate(alpha = 100, matrix(rand(45,90) * pick(1,-1), MATRIX_ROTATE), time = speed) animate(pixel_x = x_o+rand(-x_n, x_n), pixel_y = y_o+rand(-y_n, y_n), time = speed, easing = ELASTIC_EASING|EASE_IN) animate(pixel_x = x_o, pixel_y = y_o, time = speed, easing = CIRCULAR_EASING|EASE_OUT) - animate(alpha = 0, color = "#808080", time = speed) + animate(alpha = 0, color = COLOR_GRAY, time = speed) var/image/I = image('icons/effects/effects.dmi',A,"red_particles") I.flick_overlay(A,25) return speed*9*/ diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index 300c999b885b..e9587319a160 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -378,6 +378,22 @@ Insert("[icon_name]_big", iconBig) return ..() +/datum/asset/spritesheet/tutorial + name = "tutorial" + +/datum/asset/spritesheet/tutorial/register() + for(var/icon_state in icon_states('icons/misc/tutorial.dmi')) + var/icon/icon_sprite = icon('icons/misc/tutorial.dmi', icon_state) + icon_sprite.Scale(128, 128) + Insert(icon_state, icon_sprite) + + var/icon/retrieved_icon = icon('icons/mob/hud/human_dark.dmi', "intent_all") + retrieved_icon.Scale(128, 128) + Insert("intents", retrieved_icon) + + return ..() + + /datum/asset/spritesheet/gun_lineart name = "gunlineart" diff --git a/code/modules/character_traits/biology_traits.dm b/code/modules/character_traits/biology_traits.dm index c90ea7b8751e..efd894fe20cf 100644 --- a/code/modules/character_traits/biology_traits.dm +++ b/code/modules/character_traits/biology_traits.dm @@ -59,13 +59,10 @@ return ADD_TRAIT(target, TRAIT_LISPING, ROUNDSTART_TRAIT) - target.speech_problem_flag = TRUE - ..() /datum/character_trait/biology/lisp/unapply_trait(mob/living/carbon/human/target) REMOVE_TRAIT(target, TRAIT_LISPING, ROUNDSTART_TRAIT) - target.speech_problem_flag = FALSE ..() /datum/character_trait/biology/bad_leg diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 6d5efba2645f..3dfe2d38d81f 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -330,7 +330,6 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( admin_holder = GLOB.admin_datums[ckey] if(admin_holder) admin_holder.associate(src) - notify_login() add_pref_verbs() //preferences datum - also holds some persistent data for the client (because we may as well keep these datums to a minimum) @@ -343,6 +342,8 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( prefs.last_id = computer_id //these are gonna be used for banning fps = prefs.fps + notify_login() + load_xeno_name() human_name_ban = prefs.human_name_ban @@ -476,7 +477,7 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( SSping.currentrun -= src log_access("Logout: [key_name(src)]") - if(CLIENT_IS_STAFF(src)) + if(CLIENT_IS_STAFF(src) && !CLIENT_IS_STEALTHED(src)) message_admins("Admin logout: [key_name(src)]") var/list/adm = get_admin_counts(R_MOD) @@ -493,7 +494,7 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( /// Handles login-related logging and associated notifications /client/proc/notify_login() log_access("Login: [key_name(src)] from [address ? address : "localhost"]-[computer_id] || BYOND v[byond_version].[byond_build]") - if(CLIENT_IS_STAFF(src)) + if(CLIENT_IS_STAFF(src) && !CLIENT_IS_STEALTHED(src)) message_admins("Admin login: [key_name(src)]") var/list/adm = get_admin_counts(R_MOD) @@ -848,3 +849,32 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( total_t3_playtime += get_job_playtime(src, caste_name) return total_t3_playtime + +/client/verb/action_hide_menu() + set name = "Show/Hide Actions" + set category = "IC" + + var/mob/user = usr + + var/list/actions_list = list() + for(var/datum/action/action as anything in user.actions) + var/action_name = action.name + if(action.player_hidden) + action_name += " (Hidden)" + actions_list[action_name] += action + + if(!LAZYLEN(actions_list)) + to_chat(user, SPAN_WARNING("You have no actions available.")) + return + + var/selected_action_name = tgui_input_list(user, "Show or hide selected action", "Show/Hide Actions", actions_list, 30 SECONDS) + if(!selected_action_name) + to_chat(user, SPAN_WARNING("You did not select an action.")) + return + + var/datum/action/selected_action = actions_list[selected_action_name] + selected_action.player_hidden = !selected_action.player_hidden + user.update_action_buttons() + + if(!selected_action.player_hidden && selected_action.hidden) //Inform the player that even if they are unhiding it, itll still not be visible + to_chat(user, SPAN_NOTICE("[selected_action] is forcefully hidden, bypassing player unhiding.")) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index c11d35451656..29676ddb4ac8 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -239,6 +239,8 @@ GLOBAL_LIST_INIT(bgstate_options, list( /// if this client has tooltips enabled var/tooltips = TRUE + /// A list of tutorials that the client has completed, saved across rounds + var/list/completed_tutorials = list() /// If this client has auto observe enabled, used by /datum/orbit_menu var/auto_observe = TRUE @@ -1995,7 +1997,8 @@ GLOBAL_LIST_INIT(bgstate_options, list( if(!istype(character)) return - find_assigned_slot(job_title, is_late_join) + if(job_title) + find_assigned_slot(job_title, is_late_join) if(check_datacore && !(be_random_body && be_random_name)) for(var/datum/data/record/record as anything in GLOB.data_core.locked) if(record.fields["name"] == real_name) @@ -2302,6 +2305,22 @@ GLOBAL_LIST_INIT(bgstate_options, list( show_browser(user, dat, "Character Traits", "character_traits") update_preview_icon(TRUE) +/// Converts a client's list of completed tutorials into a string for saving +/datum/preferences/proc/tutorial_list_to_savestring() + if(!length(completed_tutorials)) + return "" + + var/return_string = "" + var/last_id = completed_tutorials[length(completed_tutorials)] + for(var/tutorial_id in completed_tutorials) + return_string += tutorial_id + (tutorial_id != last_id ? ";" : "") + return return_string + +/// Converts a saved string of completed tutorials into a list for in-game use +/datum/preferences/proc/tutorial_savestring_to_list(savestring) + completed_tutorials = splittext(savestring, ";") + return completed_tutorials + #undef MENU_MARINE #undef MENU_XENOMORPH #undef MENU_CO diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index a71f7dbcb3e9..1337cadf5228 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -863,6 +863,14 @@ GLOBAL_LIST_EMPTY(gear_datums_by_name) display_name = "Lighter, zippo" path = /obj/item/tool/lighter/zippo +/datum/gear/smoking/zippo/black + display_name = "Black lighter, zippo" + path = /obj/item/tool/lighter/zippo/black + +/datum/gear/smoking/zippo/blue + display_name = "Blue lighter, zippo" + path = /obj/item/tool/lighter/zippo/blue + /datum/gear/smoking/electronic_cigarette display_name = "Electronic cigarette" path = /obj/item/clothing/mask/electronic_cigarette @@ -891,7 +899,7 @@ GLOBAL_LIST_EMPTY(gear_datums_by_name) /datum/gear/misc/facepaint_skull display_name = "Facepaint, skull" path = /obj/item/facepaint/skull - cost = 3 + cost = 3 /datum/gear/misc/facepaint_body display_name = "Fullbody paint" diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index c67effe90eb1..2261ddf5ebfa 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -480,6 +480,10 @@ S["uplinklocation"] >> uplinklocation S["exploit_record"] >> exploit_record + var/tutorial_string = "" + S["completed_tutorials"] >> tutorial_string + tutorial_savestring_to_list(tutorial_string) + //Sanitize metadata = sanitize_text(metadata, initial(metadata)) real_name = reject_bad_name(real_name) @@ -625,6 +629,8 @@ S["uplinklocation"] << uplinklocation S["exploit_record"] << exploit_record + S["completed_tutorials"] << tutorial_list_to_savestring() + return 1 /// checks through keybindings for outdated unbound keys and updates them diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index d6596474885c..91f42fbafe79 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -336,41 +336,64 @@ permeability_coefficient = 0.50 slowdown = SHOES_SLOWDOWN blood_overlay_type = "feet" + /// The currently inserted item. var/obj/item/stored_item - var/list/items_allowed + /// List of item types that can be inserted. + var/list/allowed_items_typecache + /// An item which should be inserted when the shoes are spawned. + var/obj/item/spawn_item_type var/shoes_blood_amt = 0 -///Checks if you can put the item inside of the shoes -/obj/item/clothing/shoes/proc/attempt_insert_item(mob/user, obj/item/attacking_item, insert_after = FALSE) - if(!items_allowed) - return +/obj/item/clothing/shoes/Initialize(mapload, ...) + . = ..() + if(allowed_items_typecache) + allowed_items_typecache = typecacheof(allowed_items_typecache) + if(spawn_item_type) + _insert_item(new spawn_item_type(src)) + +/// Returns a boolean indicating if `item_to_insert` can be inserted into the shoes. +/obj/item/clothing/shoes/proc/can_be_inserted(obj/item/item_to_insert) + // If the shoes can't actually hold an item. + if(allowed_items_typecache == null) + return FALSE + // If there's already an item inside. if(stored_item) - return - var/allowed = FALSE - for(var/allowed_item in items_allowed) - if(istype(attacking_item, allowed_item)) - allowed = TRUE - break - if(!allowed) - return - if(!insert_after) - return TRUE - insert_item(user, attacking_item) - -///Puts the item inside of the shoe -/obj/item/clothing/shoes/proc/insert_item(mob/user, obj/item/attacking_item) - stored_item = attacking_item - user.drop_inv_item_to_loc(attacking_item, src) - to_chat(user, SPAN_NOTICE("You slide [attacking_item] into [src].")) - playsound(user, 'sound/weapons/gun_shotgun_shell_insert.ogg', 15, 1) + return FALSE + // If `item_to_insert` isn't in the whitelist. + if(!is_type_in_typecache(item_to_insert, allowed_items_typecache)) + return FALSE + // If all of those passed, `item_to_insert` can be inserted. + return TRUE + +/** + * Try to insert `item_to_insert` into the shoes. + * + * Returns `TRUE` if it succeeded, or `FALSE` if [/obj/item/clothing/shoes/proc/can_be_inserted] failed, or `user` couldn't drop the item. + */ +/obj/item/clothing/shoes/proc/attempt_insert_item(mob/user, obj/item/item_to_insert) + if(!can_be_inserted(item_to_insert)) + return FALSE + // Try to drop the item and place it inside `src`. + if(!user.drop_inv_item_to_loc(item_to_insert, src)) + return FALSE + _insert_item(item_to_insert) + to_chat(user, SPAN_NOTICE("You slide [item_to_insert] into [src].")) + playsound(user, 'sound/weapons/gun_shotgun_shell_insert.ogg', 15, TRUE) + return TRUE + +/// Insert `item_to_insert` directly into the shoes without bothering with any checks. +/// (In the majority of cases [/obj/item/clothing/shoes/proc/attempt_insert_item()] should be used instead of this.) +/obj/item/clothing/shoes/proc/_insert_item(obj/item/item_to_insert) + PROTECTED_PROC(TRUE) + stored_item = item_to_insert update_icon() -///Removes the item from the shoes +/// Remove `stored_item` from the shoes, and place it into the `user`'s active hand. /obj/item/clothing/shoes/proc/remove_item(mob/user) - if(!user.put_in_active_hand(stored_item)) + if(!stored_item || !user.put_in_active_hand(stored_item)) return to_chat(user, SPAN_NOTICE("You slide [stored_item] out of [src].")) - playsound(user, 'sound/weapons/gun_shotgun_shell_insert.ogg', 15, 1) + playsound(user, 'sound/weapons/gun_shotgun_shell_insert.ogg', 15, TRUE) stored_item = null update_icon() @@ -380,10 +403,8 @@ user.update_inv_shoes() /obj/item/clothing/shoes/Destroy() - if(stored_item) - qdel(stored_item) - stored_item = null - . = ..() + QDEL_NULL(stored_item) + return ..() /obj/item/clothing/shoes/get_examine_text(mob/user) . = ..() @@ -391,17 +412,14 @@ . += "\nIt is storing \a [stored_item]." /obj/item/clothing/shoes/attack_hand(mob/living/user) - if(!stored_item) //Only allow someone to take out the stored_item if it's being worn or held. So you can pick them up off the floor - return ..() - if(user.is_mob_incapacitated()) - return ..() - if(loc != user) + // Only allow someone to take out the `stored_item` if it's being worn or held, so that you can pick them up off the floor. + if(!stored_item || loc != user || user.is_mob_incapacitated()) return ..() remove_item(user) /obj/item/clothing/shoes/attackby(obj/item/attacking_item, mob/living/user) . = ..() - user.equip_to_slot_if_possible(attacking_item, WEAR_IN_SHOES) + attempt_insert_item(user, attacking_item) /obj/item/clothing/equipped(mob/user, slot, silent) if(is_valid_slot(slot, TRUE)) //is it going to a matching clothing slot? diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index c39e6a620833..18ffacf57b1f 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/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index b5ec4f3ab924..4318e1a3b184 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -41,7 +41,14 @@ /obj/item/clothing/shoes/red/knife name = "dirty red shoes" desc = "Stylish red shoes with a small space to hold a knife." - items_allowed = list(/obj/item/attachable/bayonet, /obj/item/weapon/throwing_knife, /obj/item/weapon/gun/pistol/holdout, /obj/item/weapon/gun/pistol/clfpistol, /obj/item/tool/screwdriver, /obj/item/weapon/straight_razor) + allowed_items_typecache = list( + /obj/item/attachable/bayonet, + /obj/item/weapon/throwing_knife, + /obj/item/weapon/gun/pistol/holdout, + /obj/item/weapon/gun/pistol/clfpistol, + /obj/item/tool/screwdriver, + /obj/item/weapon/straight_razor, + ) /obj/item/clothing/shoes/white name = "white shoes" @@ -90,5 +97,3 @@ ..() if (istype(H, /obj/item/handcuffs)) attach_cuffs(H, user) - - diff --git a/code/modules/clothing/shoes/marine_shoes.dm b/code/modules/clothing/shoes/marine_shoes.dm index c7eb4ba53982..7855075c2fb4 100644 --- a/code/modules/clothing/shoes/marine_shoes.dm +++ b/code/modules/clothing/shoes/marine_shoes.dm @@ -18,47 +18,46 @@ min_cold_protection_temperature = SHOE_MIN_COLD_PROT max_heat_protection_temperature = SHOE_MAX_HEAT_PROT siemens_coefficient = 0.7 - var/armor_stage = 0 - items_allowed = list(/obj/item/attachable/bayonet, /obj/item/weapon/throwing_knife, /obj/item/weapon/gun/pistol/holdout, /obj/item/weapon/gun/pistol/clfpistol, /obj/item/tool/screwdriver, /obj/item/tool/surgery/scalpel, /obj/item/weapon/straight_razor) - var/knife_type + allowed_items_typecache = list( + /obj/item/attachable/bayonet, + /obj/item/weapon/throwing_knife, + /obj/item/weapon/gun/pistol/holdout, + /obj/item/weapon/gun/pistol/clfpistol, + /obj/item/tool/screwdriver, + /obj/item/tool/surgery/scalpel, + /obj/item/weapon/straight_razor, + ) drop_sound = "armorequip" -/obj/item/clothing/shoes/marine/Initialize(mapload, ...) - . = ..() - if(knife_type) - stored_item = new knife_type(src) - update_icon() - /obj/item/clothing/shoes/marine/update_icon() - if(stored_item && !armor_stage) + if(stored_item) icon_state = "[initial(icon_state)]-1" else - if(!armor_stage) - icon_state = initial(icon_state) + icon_state = initial(icon_state) /obj/item/clothing/shoes/marine/knife - knife_type = /obj/item/attachable/bayonet + spawn_item_type = /obj/item/attachable/bayonet /obj/item/clothing/shoes/marine/jungle icon_state = "marine_jungle" desc = "Don't go walkin' slow, the devil's on the loose." /obj/item/clothing/shoes/marine/jungle/knife - knife_type = /obj/item/attachable/bayonet + spawn_item_type = /obj/item/attachable/bayonet /obj/item/clothing/shoes/marine/brown icon_state = "marine_brown" desc = "Standard issue combat boots for combat scenarios or combat situations. All combat, all the time. These are brown." /obj/item/clothing/shoes/marine/brown/knife - knife_type = /obj/item/attachable/bayonet + spawn_item_type = /obj/item/attachable/bayonet /obj/item/clothing/shoes/marine/monkey name = "monkey combat boots" desc = "A sturdy pair of combat boots, the reflection of the polished leather reflects your true self." icon_state = "monkey_shoes" item_state = "monkey_shoes" - knife_type = /obj/item/attachable/bayonet + spawn_item_type = /obj/item/attachable/bayonet /obj/item/clothing/shoes/marine/upp name = "military combat boots" @@ -67,10 +66,9 @@ armor_bullet = CLOTHING_ARMOR_HIGHPLUS armor_bomb = CLOTHING_ARMOR_MEDIUM armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH - knife_type = /obj/item/attachable/bayonet/upp -/obj/item/clothing/shoes/marine/upp_knife - knife_type = /obj/item/attachable/bayonet/upp +/obj/item/clothing/shoes/marine/upp/knife + spawn_item_type = /obj/item/attachable/bayonet/upp /obj/item/clothing/shoes/marine/joe name = "biohazard boots" @@ -80,7 +78,7 @@ armor_bio = CLOTHING_ARMOR_MEDIUMHIGH armor_rad = CLOTHING_ARMOR_MEDIUMHIGH armor_internaldamage = CLOTHING_ARMOR_MEDIUMLOW - knife_type = /obj/item/attachable/bayonet + spawn_item_type = /obj/item/attachable/bayonet /obj/item/clothing/shoes/dress name = "dress shoes" @@ -120,7 +118,13 @@ flags_heat_protection = BODY_FLAG_FEET flags_inventory = FPRINT|NOSLIPPING siemens_coefficient = 0.6 - items_allowed = list(/obj/item/attachable/bayonet, /obj/item/weapon/throwing_knife, /obj/item/weapon/gun/pistol/holdout, /obj/item/weapon/gun/pistol/clfpistol, /obj/item/weapon/straight_razor) + allowed_items_typecache = list( + /obj/item/attachable/bayonet, + /obj/item/weapon/throwing_knife, + /obj/item/weapon/gun/pistol/holdout, + /obj/item/weapon/gun/pistol/clfpistol, + /obj/item/weapon/straight_razor, + ) /obj/item/clothing/shoes/veteran/pmc/update_icon() if(stored_item) @@ -128,10 +132,8 @@ else icon_state = initial(icon_state) -/obj/item/clothing/shoes/veteran/pmc/knife/Initialize(mapload, ...) - . = ..() - stored_item = new /obj/item/attachable/bayonet(src) - update_icon() +/obj/item/clothing/shoes/veteran/pmc/knife + spawn_item_type = /obj/item/attachable/bayonet /obj/item/clothing/shoes/veteran/pmc/commando name = "\improper PMC commando boots" @@ -141,22 +143,13 @@ siemens_coefficient = 0.2 unacidable = TRUE -/obj/item/clothing/shoes/veteran/pmc/commando/knife/Initialize(mapload, ...) - . = ..() - stored_item = new /obj/item/attachable/bayonet(src) - update_icon() +/obj/item/clothing/shoes/veteran/pmc/commando/knife + spawn_item_type = /obj/item/attachable/bayonet /obj/item/clothing/shoes/veteran/pmc/van_bandolier name = "hiking boots" desc = "Over stone, over ice, through sun and sand, mud and snow, into raging water and hungry bog, these will never let you down." - -/obj/item/clothing/shoes/veteran/pmc/van_bandolier/New() - ..() - var/obj/item/attachable/bayonet/upp/knife = new(src) - knife.name = "\improper Fairbairn-Sykes fighting knife" - knife.desc = "This isn't for dressing game or performing camp chores. It's almost certainly not an original. Almost." - stored_item = knife - update_icon() + spawn_item_type = /obj/item/attachable/bayonet/van_bandolier /obj/item/clothing/shoes/veteran/pmc/commando/cbrn name = "\improper M3 MOPP boots" @@ -165,22 +158,18 @@ item_state = "cbrn" armor_rad = CLOTHING_ARMOR_GIGAHIGHPLUS armor_bio = CLOTHING_ARMOR_GIGAHIGHPLUS - -/obj/item/clothing/shoes/veteran/pmc/commando/cbrn/Initialize(mapload, ...) - . = ..() - stored_item = new /obj/item/attachable/bayonet(src) - update_icon() + spawn_item_type = /obj/item/attachable/bayonet /obj/item/clothing/shoes/marine/corporate name = "rugged boots" desc = "These synth-leather boots seem high quality when first worn, but quickly detoriate, especially in the environments the corporate security members these are issued to operate in. Still, better than nothing." - knife_type = /obj/item/attachable/bayonet + spawn_item_type = /obj/item/attachable/bayonet /obj/item/clothing/shoes/marine/ress name = "armored sandals" icon_state = "sandals" item_state = "sandals" - items_allowed = null + allowed_items_typecache = null /obj/item/clothing/shoes/hiking name = "hiking shoes" @@ -201,7 +190,13 @@ flags_heat_protection = BODY_FLAG_FEET flags_inventory = FPRINT|NOSLIPPING siemens_coefficient = 0.6 - items_allowed = list(/obj/item/attachable/bayonet, /obj/item/weapon/throwing_knife, /obj/item/weapon/gun/pistol/holdout, /obj/item/weapon/gun/pistol/clfpistol, /obj/item/weapon/straight_razor) + allowed_items_typecache = list( + /obj/item/attachable/bayonet, + /obj/item/weapon/throwing_knife, + /obj/item/weapon/gun/pistol/holdout, + /obj/item/weapon/gun/pistol/clfpistol, + /obj/item/weapon/straight_razor, + ) var/weed_slowdown_mult = 0.5 /obj/item/clothing/shoes/hiking/equipped(mob/user, slot, silent) @@ -239,7 +234,7 @@ flags_heat_protection = BODY_FLAG_FEET flags_inventory = FPRINT|NOSLIPPING siemens_coefficient = 0.6 - items_allowed = list( + allowed_items_typecache = list( /obj/item/attachable/bayonet, /obj/item/weapon/throwing_knife, /obj/item/weapon/gun/pistol/holdout, @@ -248,7 +243,4 @@ flags_atom = NO_NAME_OVERRIDE /obj/item/clothing/shoes/royal_marine/knife -/obj/item/clothing/shoes/royal_marine/knife/Initialize(mapload, ...) - . = ..() - stored_item = new /obj/item/attachable/bayonet/rmc(src) - update_icon() + spawn_item_type = /obj/item/attachable/bayonet/rmc diff --git a/code/modules/cm_aliens/XenoStructures.dm b/code/modules/cm_aliens/XenoStructures.dm index e78756f1eda6..7e4f7996d3f8 100644 --- a/code/modules/cm_aliens/XenoStructures.dm +++ b/code/modules/cm_aliens/XenoStructures.dm @@ -160,13 +160,12 @@ /obj/effect/alien/resin/sticky/Crossed(atom/movable/AM) . = ..() var/mob/living/carbon/human/H = AM - // Wait doesn't this stack slows if you get dragged over it? What's going on here? if(istype(H) && !H.ally_of_hivenumber(hivenumber)) - H.next_move_slowdown = H.next_move_slowdown + slow_amt + H.next_move_slowdown = max(H.next_move_slowdown, slow_amt) return . var/mob/living/carbon/xenomorph/X = AM if(istype(X) && !X.ally_of_hivenumber(hivenumber)) - X.next_move_slowdown = X.next_move_slowdown + slow_amt + X.next_move_slowdown = max(X.next_move_slowdown, slow_amt) return . /obj/effect/alien/resin/sticky/proc/forsaken_handling() diff --git a/code/modules/cm_aliens/structures/construction_node.dm b/code/modules/cm_aliens/structures/construction_node.dm index 0fdcd5c5c67a..dbc4fcb0d9bf 100644 --- a/code/modules/cm_aliens/structures/construction_node.dm +++ b/code/modules/cm_aliens/structures/construction_node.dm @@ -22,8 +22,7 @@ color = linked_hive.color /obj/effect/alien/resin/construction/Destroy() - if(template && linked_hive && (template.crystals_stored < template.crystals_required)) - linked_hive.crystal_stored += template.crystals_stored + if(template && linked_hive && (template.plasma_stored < template.plasma_required)) linked_hive.remove_construction(src) template = null linked_hive = null @@ -42,7 +41,7 @@ /obj/effect/alien/resin/construction/get_examine_text(mob/user) . = ..() if((isxeno(user) || isobserver(user)) && linked_hive) - var/message = "A [template.name] construction is designated here. It requires [template.crystals_required - template.crystals_stored] more [MATERIAL_CRYSTAL]." + var/message = "A [template.name] construction is designated here. It requires [template.plasma_required - template.plasma_stored] more plasma." . += message /obj/effect/alien/resin/construction/attack_alien(mob/living/carbon/xenomorph/M) diff --git a/code/modules/cm_aliens/structures/egg.dm b/code/modules/cm_aliens/structures/egg.dm index 5b0654d05b55..889359bb7eef 100644 --- a/code/modules/cm_aliens/structures/egg.dm +++ b/code/modules/cm_aliens/structures/egg.dm @@ -23,10 +23,21 @@ if (hive) hivenumber = hive + if(hivenumber == XENO_HIVE_NORMAL) + RegisterSignal(SSdcs, COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING, PROC_REF(forsaken_handling)) + set_hive_data(src, hivenumber) update_icon() addtimer(CALLBACK(src, PROC_REF(Grow)), rand(EGG_MIN_GROWTH_TIME, EGG_MAX_GROWTH_TIME)) +/obj/effect/alien/egg/proc/forsaken_handling() + SIGNAL_HANDLER + if(is_ground_level(z)) + hivenumber = XENO_HIVE_FORSAKEN + set_hive_data(src, XENO_HIVE_FORSAKEN) + + UnregisterSignal(SSdcs, COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING) + /obj/effect/alien/egg/Destroy() . = ..() for(var/obj/effect/egg_trigger/trigger as anything in egg_triggers) diff --git a/code/modules/cm_aliens/structures/fruit.dm b/code/modules/cm_aliens/structures/fruit.dm index a1d3624c7337..408ed5d951cc 100644 --- a/code/modules/cm_aliens/structures/fruit.dm +++ b/code/modules/cm_aliens/structures/fruit.dm @@ -403,7 +403,8 @@ if(cant_consume) user.affected_message(affected_xeno, SPAN_HELPFUL("You fail to [user == affected_xeno ? "eat" : "feed [affected_xeno]"] [current_fruit]."), - SPAN_HELPFUL("[user] fails to feed you [current_fruit].")) + SPAN_HELPFUL("[user] fails to feed you [current_fruit]."), + SPAN_NOTICE("[user] fails to [user == affected_xeno ? "eat" : "feed [affected_xeno]"] [current_fruit].")) return user.affected_message(affected_xeno, SPAN_HELPFUL("You start [user == affected_xeno ? "eating" : "feeding [affected_xeno]"] [current_fruit]."), @@ -417,7 +418,8 @@ if(cant_consume) //Check again after the timer incase they ate another fruit user.affected_message(affected_xeno, SPAN_HELPFUL("You fail to [user == affected_xeno ? "eat" : "feed [affected_xeno]"] [current_fruit]."), - SPAN_HELPFUL("[user] fails to feed you [current_fruit].")) + SPAN_HELPFUL("[user] fails to feed you [current_fruit]."), + SPAN_NOTICE("[user] fails to [user == affected_xeno ? "eat" : "feed [affected_xeno]"] [current_fruit].")) return user.affected_message(affected_xeno, diff --git a/code/modules/cm_aliens/structures/special/pylon_core.dm b/code/modules/cm_aliens/structures/special/pylon_core.dm index 2350ecfa4462..add9646c56ac 100644 --- a/code/modules/cm_aliens/structures/special/pylon_core.dm +++ b/code/modules/cm_aliens/structures/special/pylon_core.dm @@ -159,7 +159,7 @@ xeno_announcement(SPAN_XENOANNOUNCE("We have lost our control of the tall's communication relay at [get_area(src)]."), hivenumber, XENO_GENERAL_ANNOUNCE) else xeno_announcement(SPAN_XENOANNOUNCE("Another hive has lost control of the tall's communication relay at [get_area(src)]."), hivenumber, XENO_GENERAL_ANNOUNCE) - + linked_hive.hive_ui.update_pylon_status() return ..() /// Checks if all comms towers are connected and then starts end game content on all pylons if they are @@ -172,16 +172,14 @@ continue if(checked_hive == linked_hive) - xeno_announcement(SPAN_XENOANNOUNCE("We have harnessed the tall's communication relay at [get_area(src)].\n\nWe will now grow more of our number from this pylon. Hold it!"), hivenumber, XENO_GENERAL_ANNOUNCE) + xeno_announcement(SPAN_XENOANNOUNCE("We have harnessed the tall's communication relay at [get_area(src)].\n\nWe will now grow our numbers from this pylon. Hold it!"), hivenumber, XENO_GENERAL_ANNOUNCE) else xeno_announcement(SPAN_XENOANNOUNCE("Another hive has harnessed the tall's communication relay at [get_area(src)].[linked_hive.faction_is_ally(checked_hive.name) ? "" : " Stop them!"]"), hivenumber, XENO_GENERAL_ANNOUNCE) activated = TRUE + linked_hive.check_if_hit_larva_from_pylon_limit() addtimer(CALLBACK(src, PROC_REF(give_larva)), XENO_PYLON_ACTIVATION_COOLDOWN, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_LOOP|TIMER_DELETE_ME) -#define ENDGAME_LARVA_CAP_MULTIPLIER 0.4 -#define LARVA_ADDITION_MULTIPLIER 0.10 - /// Looped proc via timer to give larva after time /obj/effect/alien/resin/special/pylon/endgame/proc/give_larva() if(!activated) @@ -190,24 +188,13 @@ if(!linked_hive.hive_location || !linked_hive.living_xeno_queen) return - var/list/hive_xenos = linked_hive.totalXenos.Copy() - - for(var/mob/living/carbon/xenomorph/xeno in hive_xenos) - if(!xeno.counts_for_slots) - hive_xenos -= xeno - - var/real_total_xeno_count = length(hive_xenos) + linked_hive.stored_larva - - if(real_total_xeno_count > (length(GLOB.alive_human_list) * ENDGAME_LARVA_CAP_MULTIPLIER)) + if(linked_hive.check_if_hit_larva_from_pylon_limit()) return - linked_hive.partial_larva += real_total_xeno_count * LARVA_ADDITION_MULTIPLIER + linked_hive.partial_larva += (linked_hive.get_real_total_xeno_count() + linked_hive.stored_larva) * LARVA_ADDITION_MULTIPLIER linked_hive.convert_partial_larva_to_full_larva() linked_hive.hive_ui.update_burrowed_larva() -#undef ENDGAME_LARVA_CAP_MULTIPLIER -#undef LARVA_ADDITION_MULTIPLIER - //Hive Core - Generates strong weeds, supports other buildings /obj/effect/alien/resin/special/pylon/core name = XENO_STRUCTURE_CORE diff --git a/code/modules/cm_aliens/structures/trap.dm b/code/modules/cm_aliens/structures/trap.dm index d885e4d14a91..e4b021e98f46 100644 --- a/code/modules/cm_aliens/structures/trap.dm +++ b/code/modules/cm_aliens/structures/trap.dm @@ -145,7 +145,7 @@ clear_tripwires() for(var/mob/living/carbon/xenomorph/X in GLOB.living_xeno_list) if(X.hivenumber == hivenumber) - to_chat(X, SPAN_XENOMINORWARNING("You sense one of your Hive's facehugger traps at [A.name] has been burnt!")) + to_chat(X, SPAN_XENOMINORWARNING("We sense one of our Hive's facehugger traps at [A.name] has been burnt!")) /obj/effect/alien/resin/trap/proc/get_spray_type(level) switch(level) @@ -199,9 +199,9 @@ for(var/mob/living/carbon/xenomorph/X in GLOB.living_xeno_list) if(X.hivenumber == hivenumber) if(destroyed) - to_chat(X, SPAN_XENOMINORWARNING("You sense one of your Hive's [trap_type_name] traps at [A.name] has been destroyed!")) + to_chat(X, SPAN_XENOMINORWARNING("We sense one of our Hive's [trap_type_name] traps at [A.name] has been destroyed!")) else - to_chat(X, SPAN_XENOMINORWARNING("You sense one of your Hive's [trap_type_name] traps at [A.name] has been triggered!")) + to_chat(X, SPAN_XENOMINORWARNING("We sense one of our Hive's [trap_type_name] traps at [A.name] has been triggered!")) /obj/effect/alien/resin/trap/proc/clear_tripwires() QDEL_NULL_LIST(tripwires) diff --git a/code/modules/cm_aliens/structures/tunnel.dm b/code/modules/cm_aliens/structures/tunnel.dm index 1f0f98c14361..973920fe2693 100644 --- a/code/modules/cm_aliens/structures/tunnel.dm +++ b/code/modules/cm_aliens/structures/tunnel.dm @@ -48,8 +48,22 @@ if(resin_trap) qdel(resin_trap) + if(hivenumber == XENO_HIVE_NORMAL) + RegisterSignal(SSdcs, COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING, PROC_REF(forsaken_handling)) + SSminimaps.add_marker(src, z, get_minimap_flag_for_faction(hivenumber), "xenotunnel") +/obj/structure/tunnel/proc/forsaken_handling() + SIGNAL_HANDLER + if(is_ground_level(z)) + hive.tunnels -= src + hivenumber = XENO_HIVE_FORSAKEN + set_hive_data(src, XENO_HIVE_FORSAKEN) + hive = GLOB.hive_datum[XENO_HIVE_FORSAKEN] + hive.tunnels += src + + UnregisterSignal(SSdcs, COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING) + /obj/structure/tunnel/Destroy() if(hive) hive.tunnels -= src @@ -221,7 +235,7 @@ return XENO_NO_DELAY_ACTION if(!hive.tunnels.len) - to_chat(M, SPAN_WARNING("\The [src] doesn't seem to lead anywhere.")) + to_chat(M, SPAN_WARNING("[src] doesn't seem to lead anywhere.")) return XENO_NO_DELAY_ACTION if(contents.len > 2) @@ -236,11 +250,11 @@ tunnel_time = TUNNEL_ENTER_LARVA_DELAY if(M.mob_size >= MOB_SIZE_BIG) - M.visible_message(SPAN_XENONOTICE("[M] begins heaving their huge bulk down into \the [src]."), \ - SPAN_XENONOTICE("We begin heaving our monstrous bulk into \the [src].")) + M.visible_message(SPAN_XENONOTICE("[M] begins heaving their huge bulk down into [src]."), + SPAN_XENONOTICE("We begin heaving our monstrous bulk into [src] ([tunnel_desc]).")) else - M.visible_message(SPAN_XENONOTICE("\The [M] begins crawling down into \the [src]."), \ - SPAN_XENONOTICE("We begin crawling down into \the [src].")) + M.visible_message(SPAN_XENONOTICE("[M] begins crawling down into [src]."), + SPAN_XENONOTICE("We begin crawling down into [src] ([tunnel_desc]).")) xeno_attack_delay(M) if(!do_after(M, tunnel_time, INTERRUPT_NO_NEEDHAND, BUSY_ICON_GENERIC)) @@ -252,7 +266,7 @@ to_chat(M, SPAN_HIGHDANGER("Alt + Click the tunnel to exit, Ctrl + Click to choose a destination.")) pick_tunnel(M) else - to_chat(M, SPAN_WARNING("\The [src] ended unexpectedly, so we return back up.")) + to_chat(M, SPAN_WARNING("[src] ended unexpectedly, so we return back up.")) return XENO_NO_DELAY_ACTION /obj/structure/tunnel/maint_tunnel diff --git a/code/modules/cm_aliens/weeds.dm b/code/modules/cm_aliens/weeds.dm index 4be1ce63ac25..45c78b979105 100644 --- a/code/modules/cm_aliens/weeds.dm +++ b/code/modules/cm_aliens/weeds.dm @@ -186,7 +186,7 @@ SEND_SIGNAL(crossing_mob, COMSIG_MOB_WEED_SLOWDOWN, slowdata, src) var/final_slowdown = slowdata["movement_slowdown"] - crossing_mob.next_move_slowdown += POSITIVE(final_slowdown) + crossing_mob.next_move_slowdown = max(crossing_mob.next_move_slowdown, POSITIVE(final_slowdown)) // Uh oh, we might be dying! // I know this is bad proc naming but it was too good to pass on and it's only used in this file anyways diff --git a/code/modules/cm_marines/Donator_Items.dm b/code/modules/cm_marines/Donator_Items.dm index 72cfa9724ebd..320ec2844b70 100644 --- a/code/modules/cm_marines/Donator_Items.dm +++ b/code/modules/cm_marines/Donator_Items.dm @@ -421,12 +421,12 @@ item_state = "merc_armor" /obj/item/clothing/suit/storage/marine/fluff/steelpoint //CKEY=steelpoint (UNIQUE) - name = "M4X Armor" - desc = "Armor to the M4X!!!! DONOR ITEM" + name = "M4-X Armor" + desc = "A next generation body armor system intended for Marines fighting against xenomorphs, the system is coated in a unique acid resistant polymer coating, as well as enhanced ballistics protection. This prototype version lacks those two features. DONOR ITEM" + flags_atom = FPRINT|CONDUCT|NO_NAME_OVERRIDE icon_state = "steelpoint_armor" item_state = "steelpoint_armor" - /obj/item/clothing/suit/storage/marine/fluff/valentine //CKEY=markvalentine name = "Shocky's Armor" desc = "Shockingly good armor. DONOR ITEM" @@ -842,10 +842,11 @@ flags_inv_hide = HIDEEARS|HIDEMASK|HIDEEYES|HIDEALLHAIR /obj/item/clothing/head/helmet/marine/fluff/steelpoint //CKEY=steelpoint (UNIQUE) - name = "M4X Helmet" - desc = "Helmets to the M4X!!! DONOR ITEM" + name = "M4-X Helmet" + desc = "A next generation combat helmet intended to be paired with the M4-X armor. The full faced helmet provides complete light ballistic-resistant protection alongside enchanced acid resistance. This prototype version lacks those features. DONOR ITEM" icon_state = "steelpoint_helmet" item_state = "steelpoint_helmet" + flags_atom = FPRINT|CONDUCT|NO_NAME_OVERRIDE flags_inventory = BLOCKSHARPOBJ flags_inv_hide = HIDEEARS|HIDEMASK|HIDEEYES|HIDEALLHAIR @@ -1148,8 +1149,8 @@ flags_jumpsuit = FALSE /obj/item/clothing/under/marine/fluff/steelpoint //CKEY=steelpoint (UNIQUE) - name = "M4X Jumpsuit" - desc = "Jumpsuit to the M4X!!! DONOR ITEM" + name = "M4-X Jumpsuit" + desc = "Jumpsuit issued alongside the M4-X armor. Considered outdated compared to the more modern armor system. DONOR ITEM" icon_state = "steelpoint_jumpsuit" worn_state = "steelpoint_jumpsuit" flags_jumpsuit = FALSE @@ -1319,10 +1320,10 @@ item_state = "doom_boots" /obj/item/clothing/shoes/marine/fluff/steelpoint //CKEY=steelpoint (UNIQUE) - name = "M4X Boot" - desc = "Boots to the M4X. DONOR ITEM" - icon_state = "jackboots" - item_state = "jackboots" + name = "M4-X Boot" + desc = "Standard issue boots issued alongside M4-X armor, features a special coating of acid-resistant layering to allow its operator to move through acid-dretched enviroments safely. This prototype version lacks that feature. DONOR ITEM" + icon_state = "marine" + item_state = "marine" //GENERIC GLASSES, GLOVES, AND MISC //////////////////// diff --git a/code/modules/cm_marines/dropship_ammo.dm b/code/modules/cm_marines/dropship_ammo.dm index 7e655fce55b6..19086b36c957 100644 --- a/code/modules/cm_marines/dropship_ammo.dm +++ b/code/modules/cm_marines/dropship_ammo.dm @@ -12,8 +12,8 @@ var/fire_mission_delay = 4 /// Time to impact in deciseconds var/travelling_time = 100 - /// Type of equipment that accept this type of ammo. - var/equipment_type + /// Type of dropship equipment that accepts this type of ammo. + var/obj/structure/dropship_equipment/equipment_type /// Ammunition count remaining var/ammo_count /// Maximal ammunition count @@ -84,7 +84,7 @@ /obj/structure/ship_ammo/proc/show_loaded_desc(mob/user) return "It's loaded with \a [src]." -/obj/structure/ship_ammo/proc/detonate_on(turf/impact) +/obj/structure/ship_ammo/proc/detonate_on(turf/impact, obj/structure/dropship_equipment/weapon/fired_from) return /obj/structure/ship_ammo/proc/can_fire_at(turf/impact, mob/user) @@ -159,7 +159,7 @@ else return "It's loaded with an empty [name]." -/obj/structure/ship_ammo/heavygun/detonate_on(turf/impact) +/obj/structure/ship_ammo/heavygun/detonate_on(turf/impact, obj/structure/dropship_equipment/weapon/fired_from) set waitfor = 0 var/list/turf_list = list() for(var/turf/T in range(bullet_spread_range, impact)) @@ -171,7 +171,7 @@ sleep(1) for(var/j in 1 to 2) //rather than halving the sleep, were doubling the bullets shot "bang" var/turf/impact_tile = pick(turf_list) - var/datum/cause_data/cause_data = create_cause_data(initial(name), source_mob) + var/datum/cause_data/cause_data = create_cause_data(fired_from.name, source_mob) impact_tile.ex_act(EXPLOSION_THRESHOLD_VLOW, pick(GLOB.alldirs), cause_data) create_shrapnel(impact_tile,1,0,0,shrapnel_type,cause_data,FALSE,100) //simulates a bullet for(var/atom/movable/explosion_effect in impact_tile) @@ -242,7 +242,7 @@ return "It's loaded with an empty [name]." -/obj/structure/ship_ammo/laser_battery/detonate_on(turf/impact) +/obj/structure/ship_ammo/laser_battery/detonate_on(turf/impact, obj/structure/dropship_equipment/weapon/fired_from) set waitfor = 0 var/list/turf_list = list() for(var/turf/T in range(impact, 3)) //This is its area of effect @@ -251,17 +251,12 @@ for(var/i=1 to 16) //This is how many tiles within that area of effect will be randomly ignited var/turf/U = pick(turf_list) turf_list -= U - laser_burn(U) + fire_spread_recur(U, create_cause_data(fired_from.name, source_mob), 1, null, 5, 75, "#EE6515")//Very, very intense, but goes out very quick if(!ammo_count && !QDELETED(src)) qdel(src) //deleted after last laser beam is fired and impact the ground. - -/obj/structure/ship_ammo/laser_battery/proc/laser_burn(turf/T) - fire_spread_recur(T, create_cause_data(initial(name), source_mob), 1, null, 5, 75, "#EE6515")//Very, very intense, but goes out very quick - - //Rockets /obj/structure/ship_ammo/rocket @@ -279,7 +274,7 @@ max_inaccuracy = 5 point_cost = 0 -/obj/structure/ship_ammo/rocket/detonate_on(turf/impact) +/obj/structure/ship_ammo/rocket/detonate_on(turf/impact, obj/structure/dropship_equipment/weapon/fired_from) qdel(src) @@ -293,7 +288,7 @@ point_cost = 300 fire_mission_delay = 4 //We don't care because our ammo has just 1 rocket -/obj/structure/ship_ammo/rocket/widowmaker/detonate_on(turf/impact) +/obj/structure/ship_ammo/rocket/widowmaker/detonate_on(turf/impact, obj/structure/dropship_equipment/weapon/fired_from) impact.ceiling_debris_check(3) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(cell_explosion), impact, 300, 40, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, create_cause_data(initial(name)), source_mob), 0.5 SECONDS) //Your standard HE splash damage rocket. Good damage, good range, good speed, it's an all rounder QDEL_IN(src, 0.5 SECONDS) @@ -306,7 +301,7 @@ point_cost = 300 fire_mission_delay = 4 //We don't care because our ammo has just 1 rocket -/obj/structure/ship_ammo/rocket/banshee/detonate_on(turf/impact) +/obj/structure/ship_ammo/rocket/banshee/detonate_on(turf/impact, obj/structure/dropship_equipment/weapon/fired_from) impact.ceiling_debris_check(3) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(cell_explosion), impact, 175, 20, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, create_cause_data(initial(name)), source_mob), 0.5 SECONDS) //Small explosive power with a small fall off for a big explosion range addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(fire_spread), impact, create_cause_data(initial(name), source_mob), 4, 15, 50, "#00b8ff"), 0.5 SECONDS) //Very intense but the fire doesn't last very long @@ -321,7 +316,7 @@ point_cost = 300 fire_mission_delay = 4 //We don't care because our ammo has just 1 rocket -/obj/structure/ship_ammo/rocket/keeper/detonate_on(turf/impact) +/obj/structure/ship_ammo/rocket/keeper/detonate_on(turf/impact, obj/structure/dropship_equipment/weapon/fired_from) impact.ceiling_debris_check(3) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(cell_explosion), impact, 450, 100, EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL, null, create_cause_data(initial(name)), source_mob), 0.5 SECONDS) //Insane fall off combined with insane damage makes the Keeper useful for single targets, but very bad against multiple. QDEL_IN(src, 0.5 SECONDS) @@ -336,7 +331,7 @@ fire_mission_delay = 4 //Looks kinda OP but all it can actually do is just to blow windows and some of other things out, cant do much damage. -/obj/structure/ship_ammo/rocket/harpoon/detonate_on(turf/impact) +/obj/structure/ship_ammo/rocket/harpoon/detonate_on(turf/impact, obj/structure/dropship_equipment/weapon/fired_from) impact.ceiling_debris_check(3) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(cell_explosion), impact, 150, 16, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, create_cause_data(initial(name)), source_mob), 0.5 SECONDS) QDEL_IN(src, 0.5 SECONDS) @@ -349,7 +344,7 @@ point_cost = 500 fire_mission_delay = 0 //0 means unusable -/obj/structure/ship_ammo/rocket/napalm/detonate_on(turf/impact) +/obj/structure/ship_ammo/rocket/napalm/detonate_on(turf/impact, obj/structure/dropship_equipment/weapon/fired_from) impact.ceiling_debris_check(3) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(cell_explosion), impact, 200, 25, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, create_cause_data(initial(name)), source_mob), 0.5 SECONDS) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(fire_spread), impact, create_cause_data(initial(name), source_mob), 6, 60, 30, "#EE6515"), 0.5 SECONDS) //Color changed into napalm's color to better convey how intense the fire actually is. @@ -364,7 +359,7 @@ point_cost = 300 fire_mission_delay = 4 -/obj/structure/ship_ammo/rocket/thermobaric/detonate_on(turf/impact) +/obj/structure/ship_ammo/rocket/thermobaric/detonate_on(turf/impact, obj/structure/dropship_equipment/weapon/fired_from) impact.ceiling_debris_check(3) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(fire_spread), impact, create_cause_data(initial(name), source_mob), 4, 25, 50, "#c96500"), 0.5 SECONDS) //Very intense but the fire doesn't last very long for(var/mob/living/carbon/victim in orange(5, impact)) @@ -388,7 +383,7 @@ point_cost = 300 fire_mission_delay = 3 //high cooldown -/obj/structure/ship_ammo/minirocket/detonate_on(turf/impact) +/obj/structure/ship_ammo/minirocket/detonate_on(turf/impact, obj/structure/dropship_equipment/weapon/fired_from) impact.ceiling_debris_check(2) spawn(5) cell_explosion(impact, 200, 44, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, create_cause_data(initial(name), source_mob)) @@ -418,7 +413,7 @@ point_cost = 500 fire_mission_delay = 3 //high cooldown -/obj/structure/ship_ammo/minirocket/incendiary/detonate_on(turf/impact) +/obj/structure/ship_ammo/minirocket/incendiary/detonate_on(turf/impact, obj/structure/dropship_equipment/weapon/fired_from) ..() spawn(5) fire_spread(impact, create_cause_data(initial(name), source_mob), 3, 25, 20, "#EE6515") @@ -438,7 +433,7 @@ /// Special structures it needs to break with drop pod var/list/breakeable_structures = list(/obj/structure/barricade, /obj/structure/surface/table) -/obj/structure/ship_ammo/sentry/detonate_on(turf/impact) +/obj/structure/ship_ammo/sentry/detonate_on(turf/impact, obj/structure/dropship_equipment/weapon/fired_from) var/obj/structure/droppod/equipment/sentry/droppod = new(impact, /obj/structure/machinery/defenses/sentry/launchable, source_mob) droppod.special_structures_to_damage = breakeable_structures droppod.special_structure_damage = 500 diff --git a/code/modules/cm_marines/dropship_equipment.dm b/code/modules/cm_marines/dropship_equipment.dm index 036b6ecf8330..785283541eb8 100644 --- a/code/modules/cm_marines/dropship_equipment.dm +++ b/code/modules/cm_marines/dropship_equipment.dm @@ -161,7 +161,7 @@ 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 @@ -332,11 +332,11 @@ /obj/structure/dropship_equipment/mg_holder/ui_data(mob/user) . = list() - var/is_deployed = deployed_mg.loc == src + var/is_deployed = deployed_mg.loc != src .["name"] = name .["selection_state"] = list() .["health"] = health - .["health_max"] = 100 + .["health_max"] = initial(health) .["rounds"] = deployed_mg.rounds .["max_rounds"] = deployed_mg.rounds_max .["deployed"] = is_deployed @@ -486,8 +486,6 @@ point_cost = 0 -#define LIGHTING_MAX_LUMINOSITY_SHIPLIGHTS 12 - /obj/structure/dropship_equipment/electronics/spotlights name = "\improper AN/LEN-15 Spotlight" shorthand = "Spotlight" @@ -502,7 +500,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].")) @@ -515,13 +513,13 @@ /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() @@ -530,7 +528,13 @@ /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 @@ -701,7 +705,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 @@ -727,7 +731,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" @@ -818,7 +822,7 @@ 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() @@ -887,7 +891,8 @@ if (evaccee_triagecard_color && evaccee_triagecard_color == "none") evaccee_triagecard_color = null - .["[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 /obj/structure/dropship_equipment/medevac_system/proc/can_medevac(mob/user) if(!linked_shuttle) @@ -907,7 +912,7 @@ var/list/possible_stretchers = get_targets() - if(!possible_stretchers.len) + if(!length(possible_stretchers)) to_chat(user, SPAN_WARNING("No active medevac stretcher detected.")) return FALSE return TRUE @@ -1432,4 +1437,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/m2c.dm b/code/modules/cm_marines/m2c.dm index f61c9ef89659..742ad954c20b 100644 --- a/code/modules/cm_marines/m2c.dm +++ b/code/modules/cm_marines/m2c.dm @@ -137,15 +137,15 @@ M.anchored = TRUE playsound(M, 'sound/items/m56dauto_setup.ogg', 75, TRUE) to_chat(user, SPAN_NOTICE("You deploy [M].")) - if((rounds > 0) && !user.get_inactive_hand()) - user.set_interaction(M) - give_action(user, /datum/action/human_action/mg_exit) M.rounds = rounds M.overheat_value = overheat_value M.health = health M.update_icon() qdel(src) + if(M.rounds > 0) + M.try_mount_gun(user) + /obj/item/device/m2c_gun/attackby(obj/item/O as obj, mob/user as mob) if(!ishuman(user)) return @@ -446,33 +446,10 @@ //ATTACK WITH BOTH HANDS COMBO /obj/structure/machinery/m56d_hmg/auto/attack_hand(mob/living/user) - ..() + if(..()) + return TRUE - var/turf/user_turf = get_turf(user) - for(var/opp_dir in reverse_nearby_direction(src.dir)) - if(get_step(src, opp_dir) == user_turf) - if(operator) //If there is already a operator then they're manning it. - if(operator.interactee == null) - operator = null //this shouldn't happen, but just in case - else - to_chat(user, "Someone's already controlling it.") - return - if(!(user.alpha > 60)) - to_chat(user, SPAN_WARNING("You aren't going to be setting up while cloaked.")) - return - else - if(user.interactee) //Make sure we're not manning two guns at once, tentacle arms. - to_chat(user, "You're already manning something!") - return - - if(user.get_active_hand() == null && user.get_inactive_hand() == null) - ADD_TRAIT(user, TRAIT_IMMOBILIZED, INTERACTION_TRAIT) - user.set_interaction(src) - give_action(user, /datum/action/human_action/mg_exit) - else - to_chat(usr, SPAN_NOTICE("Your hands are too busy holding things to grab the handles!")) - else - to_chat(usr, SPAN_NOTICE("You are too far from the handles to man [src]!")) + try_mount_gun(user) // DISASSEMBLY @@ -515,7 +492,6 @@ ..() ADD_TRAIT(user, TRAIT_OVERRIDE_CLICKDRAG, TRAIT_SOURCE_WEAPON) RegisterSignal(user, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(disable_interaction)) - RegisterSignal(user, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(body_position_changed)) // DISMOUNT THE MG @@ -601,12 +577,6 @@ if(user.body_position != STANDING_UP || get_dist(user,src) > 0 || user.is_mob_incapacitated() || !user.client) user.unset_interaction() -/obj/structure/machinery/m56d_hmg/auto/proc/body_position_changed(mob/living/user, body_position, old_body_position) - SIGNAL_HANDLER - - if(body_position != STANDING_UP) - user.unset_interaction() - /obj/structure/machinery/m56d_hmg/auto/proc/handle_rotating_gun(mob/user) var/angle = get_dir(src, target) if(world.time > rotate_timer && !((dir & angle) && target.loc != src.loc && target.loc != operator.loc)) diff --git a/code/modules/cm_marines/marines_consoles.dm b/code/modules/cm_marines/marines_consoles.dm index 994e9f1ddcb2..00a8c442b770 100644 --- a/code/modules/cm_marines/marines_consoles.dm +++ b/code/modules/cm_marines/marines_consoles.dm @@ -819,7 +819,7 @@ GLOBAL_LIST_EMPTY_TYPED(crewmonitor, /datum/crewmonitor) var/turf/pos = get_turf(H) if(!pos) continue - if(is_admin_level(pos.z)) + if(should_block_game_interaction(H)) continue // The entry for this human diff --git a/code/modules/cm_marines/smartgun_mount.dm b/code/modules/cm_marines/smartgun_mount.dm index 765f7a673812..b4c01a8842aa 100644 --- a/code/modules/cm_marines/smartgun_mount.dm +++ b/code/modules/cm_marines/smartgun_mount.dm @@ -42,8 +42,12 @@ flags_equip_slot = SLOT_BACK icon = 'icons/turf/whiskeyoutpost.dmi' icon_state = "M56D_gun_e" - var/rounds = 0 // How many rounds are in the weapon. This is useful if we break down our guns. - var/has_mount = FALSE // Indicates whether the M56D will come with its folding mount already attached + ///How many rounds are in the weapon. This is useful if we break down our guns. + var/rounds = 0 + ///Indicates whether the M56D will come with its folding mount already attached + var/has_mount = FALSE + ///The distance this has to be away from other m56d_hmg and m56d_post to be placed. + var/defense_check_range = 5 /obj/item/device/m56d_gun/Initialize(mapload, ...) . = ..() @@ -84,7 +88,10 @@ /obj/item/device/m56d_gun/attack_self(mob/user) ..() - + for(var/obj/structure/machinery/machine in urange(defense_check_range, loc)) + if(istype(machine, /obj/structure/machinery/m56d_hmg) || istype(machine, /obj/structure/machinery/m56d_post)) + to_chat(user, SPAN_WARNING("This is too close to [machine]!")) + return if(!ishuman(user)) return if(!has_mount) @@ -125,6 +132,10 @@ if(!do_after(user, 1 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return + for(var/obj/structure/machinery/machine in urange(defense_check_range, loc)) + if(istype(machine, /obj/structure/machinery/m56d_hmg) || istype(machine, /obj/structure/machinery/m56d_post)) + to_chat(user, SPAN_WARNING("This is too close to [machine]!")) + return var/obj/structure/machinery/m56d_post/M = new /obj/structure/machinery/m56d_post(user.loc) M.setDir(user.dir) // Make sure we face the right direction @@ -307,6 +318,10 @@ if(istype(O,/obj/item/device/m56d_gun)) //lets mount the MG onto the mount. var/obj/item/device/m56d_gun/MG = O + for(var/obj/structure/machinery/machine in urange(MG.defense_check_range, loc, TRUE)) + if(istype(machine, /obj/structure/machinery/m56d_hmg) || istype(machine, /obj/structure/machinery/m56d_post)) + to_chat(user, SPAN_WARNING("This is too close to [machine]!")) + return if(!anchored) to_chat(user, SPAN_WARNING("[src] must be anchored! Use a screwdriver!")) return @@ -703,6 +718,9 @@ if((dir == NORTH) && (angle > 180) && (abs(360 - angle) > shoot_degree)) // If north and shooting to the left, we do some extra math return + if((dir == NORTH) && (angle < 180) && (angle > shoot_degree)) + return + else if((dir != NORTH) && (abs(angle - dir2angle(dir)) > shoot_degree)) return @@ -794,84 +812,114 @@ I.flick_overlay(src, 3) /obj/structure/machinery/m56d_hmg/MouseDrop(over_object, src_location, over_location) //Drag the MG to us to man it. - if(!ishuman(usr) || usr.stat) + // If the gun sprite wasn't dragged onto the user, or the user isn't adjacent. + if(over_object != usr || !in_range(src, usr)) return - var/mob/living/carbon/human/user = usr //this is us + // If the user is already manning the gun. + if(operator == usr) + // Exit the gun. + usr.unset_interaction() + else + // Try to man the gun + try_mount_gun(usr) - var/user_turf = get_turf(user) - - for(var/opp_dir in reverse_nearby_direction(src.dir)) - if(get_step(src, opp_dir) == user_turf) //Players must be behind, or left or right of that back tile - src.add_fingerprint(usr) - if((over_object == user && (in_range(src, user) || locate(src) in user))) //Make sure its on ourselves - if(user.interactee == src) - user.unset_interaction() - user.visible_message("[icon2html(src, viewers(src))] [SPAN_NOTICE("[user] lets go of \the [src].")]", SPAN_NOTICE("You let go of \the [src].")) - return - if(operator) //If there is already a operator then they're manning it. - if(operator.interactee == null) - operator = null //this shouldn't happen, but just in case - else - to_chat(user, "Someone's already controlling it.") - return - else - if(user.interactee) //Make sure we're not manning two guns at once, tentacle arms. - to_chat(user, "You're already manning something!") - return - if(user.get_active_hand() != null) - to_chat(user, SPAN_WARNING("You need a free hand to man \the [src].")) - - if(!user.allow_gun_usage) - to_chat(user, SPAN_WARNING("You aren't allowed to use firearms!")) - return - else - ADD_TRAIT(user, TRAIT_IMMOBILIZED, INTERACTION_TRAIT) - user.set_interaction(src) - give_action(user, /datum/action/human_action/mg_exit) +/obj/structure/machinery/m56d_hmg/proc/try_mount_gun(mob/living/carbon/human/user) + // If the user isn't a human. + if(!istype(user)) + return + + // If the user isn't actually allowed to use guns. + if(!user.allow_gun_usage) + to_chat(user, SPAN_WARNING("You aren't allowed to use firearms!")) + return + // If the user is invisible. + if(user.alpha <= 60) + to_chat(user, SPAN_WARNING("You can't use [src] while cloaked!")) + return + + // Make sure we're not manning two guns at once, tentacle arms. + if(user.interactee) + to_chat(user, SPAN_WARNING("You're already manning something!")) + return + + // Check the directions opposite of where the gun is facing. + var/found_user = FALSE + var/turf/user_turf = get_turf(user) + for(var/opposite_dir in reverse_nearby_direction(src.dir)) + if(get_step(src, opposite_dir) == user_turf) + found_user = TRUE + break + // If the user isn't standing behind or on top of the gun. + if(!found_user && user_turf != get_turf(src)) + to_chat(user, SPAN_WARNING("You are too far from the handles to man [src]!")) + return + + // If there's already someone manning it. + if(operator) + // This shouldn't happen, but just in case. + if(operator.interactee == null) + operator = null else - to_chat(usr, SPAN_NOTICE("You are too far from the handles to man [src]!")) + to_chat(user, SPAN_WARNING("Someone's already controlling [src]!")) + return + + // If both hands aren't empty. + if(user.get_active_hand() || user.get_inactive_hand()) + to_chat(user, SPAN_WARNING("You need both hands free to grab the handles!")) + return + + // Man the gun! + user.set_interaction(src) /obj/structure/machinery/m56d_hmg/on_set_interaction(mob/user) - RegisterSignal(user, list(COMSIG_MOB_MG_EXIT, COMSIG_MOB_RESISTED, COMSIG_MOB_DEATH, COMSIG_LIVING_SET_BODY_POSITION), PROC_REF(exit_interaction)) - flags_atom |= RELAY_CLICK - user.status_flags |= IMMOBILE_ACTION - user.visible_message(SPAN_NOTICE("[user] mans \the [src]."),SPAN_NOTICE("You man \the [src], locked and loaded!")) - RegisterSignal(user, COMSIG_MOB_MOUSEDOWN, PROC_REF(start_fire)) - RegisterSignal(user, COMSIG_MOB_MOUSEDRAG, PROC_REF(change_target)) - RegisterSignal(user, COMSIG_MOB_MOUSEUP, PROC_REF(stop_fire)) + ADD_TRAIT(user, TRAIT_IMMOBILIZED, INTERACTION_TRAIT) + give_action(user, /datum/action/human_action/mg_exit) user.forceMove(src.loc) user.setDir(dir) + user.reset_view(src) + user.status_flags |= IMMOBILE_ACTION + user.visible_message(SPAN_NOTICE("[user] mans [src]."), SPAN_NOTICE("You man [src], locked and loaded!")) user_old_x = user.pixel_x user_old_y = user.pixel_y - user.reset_view(src) update_pixels(user) + + RegisterSignal(user, list(COMSIG_MOB_MG_EXIT, COMSIG_MOB_RESISTED, COMSIG_MOB_DEATH, COMSIG_LIVING_SET_BODY_POSITION), PROC_REF(exit_interaction)) + RegisterSignal(user, COMSIG_MOB_MOUSEDOWN, PROC_REF(start_fire)) + RegisterSignal(user, COMSIG_MOB_MOUSEDRAG, PROC_REF(change_target)) + RegisterSignal(user, COMSIG_MOB_MOUSEUP, PROC_REF(stop_fire)) + operator = user + flags_atom |= RELAY_CLICK -/obj/structure/machinery/m56d_hmg/on_unset_interaction(mob/living/user) - flags_atom &= ~RELAY_CLICK - SEND_SIGNAL(src, COMSIG_GUN_INTERRUPT_FIRE) - user.status_flags &= ~IMMOBILE_ACTION - user.visible_message(SPAN_NOTICE("[user] lets go of \the [src]."),SPAN_NOTICE("You let go of \the [src], letting the gun rest.")) +/obj/structure/machinery/m56d_hmg/on_unset_interaction(mob/user) REMOVE_TRAIT(user, TRAIT_IMMOBILIZED, INTERACTION_TRAIT) - UnregisterSignal(user, list(COMSIG_MOB_MOUSEUP, COMSIG_MOB_MOUSEDOWN, COMSIG_MOB_MOUSEDRAG)) - user.reset_view(null) - user.remove_temp_pass_flags(PASS_MOB_THRU) // this is necessary because being knocked over while using the gun makes you incorporeal + remove_action(user, /datum/action/human_action/mg_exit) user.Move(get_step(src, reverse_direction(src.dir))) user.setDir(dir) //set the direction of the player to the direction the gun is facing + user.reset_view(null) + user.status_flags &= ~IMMOBILE_ACTION + user.visible_message(SPAN_NOTICE("[user] lets go of [src]."), SPAN_NOTICE("You let go of [src], letting the gun rest.")) user_old_x = 0 //reset our x user_old_y = 0 //reset our y update_pixels(user, FALSE) - if(operator == user) //We have no operator now - operator = null - remove_action(user, /datum/action/human_action/mg_exit) + user.remove_temp_pass_flags(PASS_MOB_THRU) // this is necessary because being knocked over while using the gun makes you incorporeal + + SEND_SIGNAL(src, COMSIG_GUN_INTERRUPT_FIRE) UnregisterSignal(user, list( COMSIG_MOB_MG_EXIT, COMSIG_MOB_RESISTED, COMSIG_MOB_DEATH, COMSIG_LIVING_SET_BODY_POSITION, + COMSIG_MOB_MOUSEUP, + COMSIG_MOB_MOUSEDOWN, + COMSIG_MOB_MOUSEDRAG, )) + if(operator == user) //We have no operator now + operator = null + flags_atom &= ~RELAY_CLICK + /obj/structure/machinery/m56d_hmg/proc/update_pixels(mob/user, mounting = TRUE) if(mounting) diff --git a/code/modules/cm_preds/falcon.dm b/code/modules/cm_preds/falcon.dm index dc898a2b76ba..eb97a19c2233 100644 --- a/code/modules/cm_preds/falcon.dm +++ b/code/modules/cm_preds/falcon.dm @@ -35,40 +35,57 @@ return "on [t_his] shoulder" return ..() +/obj/item/falcon_drone/equipped(mob/user, slot, silent) + . = ..() + if(!(slot == WEAR_L_EAR || slot == WEAR_R_EAR)) + return + add_verb(user, /obj/item/falcon_drone/proc/can_control_falcon_drone) + var/datum/action/predator_action/mask/control_falcon_drone/falcon_action = give_action(user, /datum/action/predator_action/mask/control_falcon_drone) + falcon_action.linked_falcon_drone = src + +/obj/item/falcon_drone/dropped(mob/user) + . = ..() + remove_verb(user, /obj/item/falcon_drone/proc/can_control_falcon_drone) + remove_action(user, /datum/action/predator_action/mask/control_falcon_drone) + /obj/item/falcon_drone/attack_self(mob/user) ..() - control_falcon_drone() + can_control_falcon_drone() -/obj/item/falcon_drone/verb/control_falcon_drone() +/obj/item/falcon_drone/proc/can_control_falcon_drone() set name = "Control Falcon Drone" set desc = "Activates your falcon drone." set category = "Yautja.Misc" - set src in usr if(usr.is_mob_incapacitated()) return - var/mob/living/carbon/human/H = usr - if(!istype(H) || !HAS_TRAIT(usr, TRAIT_YAUTJA_TECH)) + var/mob/living/carbon/human/human = usr + if(!istype(human) || !HAS_TRAIT(usr, TRAIT_YAUTJA_TECH)) to_chat(usr, SPAN_WARNING("You do not know how to use this.")) return - if(!istype(H.gloves, /obj/item/clothing/gloves/yautja)) + if(!istype(human.gloves, /obj/item/clothing/gloves/yautja)) to_chat(usr, SPAN_WARNING("You need your bracers to control \the [src]!")) return + control_falcon_drone(human, human.gloves) - var/mob/hologram/falcon/hologram = new /mob/hologram/falcon(usr.loc, usr, src, H.gloves) - usr.drop_inv_item_to_loc(src, hologram) +/obj/item/falcon_drone/proc/control_falcon_drone(mob/living/user, obj/item/clothing/gloves/yautja/bracers) + var/mob/hologram/falcon/hologram = new /mob/hologram/falcon(get_turf(user), user, src, bracers) + user.drop_inv_item_to_loc(src, hologram) /mob/hologram/falcon name = "falcon drone" + desc = "An agile drone used by Yautja to survey the hunting grounds." icon = 'icons/obj/items/hunter/pred_gear.dmi' + action_icon_state = "falcon_drone" icon_state = "falcon_drone_active" hud_possible = list(HUNTER_HUD) + motion_sensed = TRUE + initial_leave_button = /datum/action/leave_hologram/falcon + var/obj/item/falcon_drone/parent_drone var/obj/item/clothing/gloves/yautja/owned_bracers - desc = "An agile drone used by Yautja to survey the hunting grounds." - motion_sensed = TRUE /mob/hologram/falcon/Initialize(mapload, mob/M, obj/item/falcon_drone/drone, obj/item/clothing/gloves/yautja/bracers) . = ..() @@ -129,6 +146,11 @@ qdel(src) +/datum/action/leave_hologram/falcon + icon_file = 'icons/mob/hud/actions_yautja.dmi' + button_icon_state = "pred_template" + action_icon_state = "falcon_drone" + /obj/item/trash/falcon_drone name = "destroyed falcon drone" desc = "The wreckage of a Yautja drone." diff --git a/code/modules/cm_preds/thrall_items.dm b/code/modules/cm_preds/thrall_items.dm index 80b4d42c16e2..708b230d5c11 100644 --- a/code/modules/cm_preds/thrall_items.dm +++ b/code/modules/cm_preds/thrall_items.dm @@ -35,7 +35,7 @@ ) thrall = TRUE - items_allowed = list( + allowed_items_typecache = list( /obj/item/attachable/bayonet, /obj/item/weapon/throwing_knife, /obj/item/weapon/gun/pistol/holdout, diff --git a/code/modules/cm_preds/yaut_actions.dm b/code/modules/cm_preds/yaut_actions.dm new file mode 100644 index 000000000000..f55f58e0a557 --- /dev/null +++ b/code/modules/cm_preds/yaut_actions.dm @@ -0,0 +1,329 @@ +#define PREDATOR_ACTION_ON_CLICK 2 //If the action is on click, and not toggled on or off +/datum/action/predator_action + icon_file = 'icons/mob/hud/actions_yautja.dmi' + button_icon_state = "pred_template" + ///If the action requires bracers worn or in-hand + var/require_bracers = FALSE + ///If the action requires a yautja mask to be worn + var/require_mask = FALSE + ///The mob calling the action + var/mob/living/carbon/human/yautja + ///The bracers on the mob (if applicable) + var/obj/item/clothing/gloves/yautja/hunter/bracers + ///The mask on the mob (if applicable) + var/obj/item/clothing/mask/gas/yautja/mask + ///If the action is currently on or in use + var/active = FALSE + +/datum/action/predator_action/can_use_action() + . = ..() + if(!.) + return FALSE + + yautja = null + bracers = null + mask = null + + var/mob/living/carbon/human/mob = owner + if(!isyautja(mob)) + return FALSE + if(mob.is_mob_incapacitated()) + return FALSE + yautja = mob + + if(require_bracers) + if(istype(yautja.gloves, /obj/item/clothing/gloves/yautja/hunter)) + bracers = yautja.gloves + else if(istype(yautja.get_held_item(), /obj/item/clothing/gloves/yautja/hunter)) + bracers = yautja.get_held_item() + if(!bracers) + to_chat(yautja, SPAN_WARNING("You don't have bracers.")) + return FALSE + + if(require_mask) + if(!istype(yautja.wear_mask, /obj/item/clothing/mask/gas/yautja)) + to_chat(yautja, SPAN_WARNING("You don't have a clan mask.")) + return FALSE + mask = yautja.wear_mask + + return TRUE + +/datum/action/predator_action/action_activate() + if(!can_use_action()) + return FALSE + +/datum/action/predator_action/update_button_icon(enabled) + . = ..() + if(active == PREDATOR_ACTION_ON_CLICK) + return + + if(isnull(enabled)) + active = !active + else + active = enabled + + button.icon_state = initial(button_icon_state) + if(active) + button.icon_state += "_on" + +/datum/action/predator_action/mark_for_hunt + name = "Mark for Hunt" + action_icon_state = "mark_for_hunt" + listen_signal = COMSIG_KB_YAUTJA_TOGGLE_MARK_FOR_HUNT + active = PREDATOR_ACTION_ON_CLICK + +/datum/action/predator_action/mark_for_hunt/action_activate() + . = ..() + if(yautja.hunter_data.prey) //You can only hunt one person at a time + yautja.remove_from_hunt() + return + yautja.mark_for_hunt() + +/datum/action/predator_action/mark_panel + name = "Open Mark Panel" + action_icon_state = "mark_panel" + listen_signal = COMSIG_KB_YAUTJA_MARK_PANEL + active = PREDATOR_ACTION_ON_CLICK + +/datum/action/predator_action/mark_panel/action_activate() + . = ..() + yautja.mark_panel() + +/datum/action/predator_action/claim_equipment + name = "Claim Equipment" + action_icon_state = "claim_equipment" + listen_signal = COMSIG_KB_YAUTJA_PRED_BUY + active = PREDATOR_ACTION_ON_CLICK + +/datum/action/predator_action/claim_equipment/action_activate() + . = ..() + yautja.pred_buy() + +//Actions that require wearing a mask +/datum/action/predator_action/mask + require_mask = TRUE + +/datum/action/predator_action/mask/zoom + name = "Toggle Mask Zoom" + action_icon_state = "zoom" + listen_signal = COMSIG_KB_YAUTJA_MASK_TOGGLE_ZOOM + +/datum/action/predator_action/mask/zoom/action_activate() + . = ..() + mask.toggle_zoom() + +/datum/action/predator_action/mask/visor + name = "Toggle Mask Visor" + action_icon_state = "visor" + require_bracers = TRUE //Needs bracer power to operate + listen_signal = COMSIG_KB_YAUTJA_MASK_TOGGLESIGHT + +/datum/action/predator_action/mask/visor/action_activate() + . = ..() + mask.togglesight() + +/datum/action/predator_action/mask/visor/update_button_icon(enabled) //Open or close the eye + . = ..() //Overlays + + var/new_icon_state = action_icon_state + if(enabled) + new_icon_state += "_on" + + button.overlays.Cut() + var/image/new_overlays + new_overlays = image(icon_file, button, new_icon_state) + + button.overlays += new_overlays + +/datum/action/predator_action/mask/control_falcon_drone + name = "Control Falcon Drone" + action_icon_state = "falcon_drone" + listen_signal = COMSIG_KB_YAUTJA_CONTROL_FALCON + active = PREDATOR_ACTION_ON_CLICK + require_bracers = TRUE + ///The falcon drone that will be sent when the action is pressed + var/obj/item/falcon_drone/linked_falcon_drone + +/datum/action/predator_action/mask/control_falcon_drone/action_activate() + . = ..() + linked_falcon_drone.control_falcon_drone(yautja, bracers) + + +//Actions that require wearing bracers +/datum/action/predator_action/bracer + require_bracers = TRUE + +/datum/action/predator_action/bracer/wristblade + name = "Toggle Wristblades" + action_icon_state = "wristblade" + listen_signal = COMSIG_KB_YAUTJA_WRISTBLADES + +/datum/action/predator_action/bracer/wristblade/action_activate() + . = ..() + bracers.wristblades() + +/datum/action/predator_action/bracer/combistick + name = "Yank Combi-stick" + action_icon_state = "combi" + listen_signal = COMSIG_KB_YAUTJA_CALL_COMBI + active = PREDATOR_ACTION_ON_CLICK + +/datum/action/predator_action/bracer/combistick/action_activate() + . = ..() + yautja.call_combi_internal(yautja, forced = FALSE) + +/datum/action/predator_action/bracer/smartdisc + name = "Recall nearby smart-discs" + action_icon_state = "smartdisc" + listen_signal = COMSIG_KB_YAUTJA_CALL_DISC + active = PREDATOR_ACTION_ON_CLICK + +/datum/action/predator_action/bracer/smartdisc/action_activate() + . = ..() + bracers.call_disc() + +/datum/action/predator_action/bracer/caster + name = "Toggle Plasma Caster" + action_icon_state = "plasma_caster" + listen_signal = COMSIG_KB_YAUTJA_CASTER + +/datum/action/predator_action/bracer/caster/action_activate() + . = ..() + bracers.caster() + +/datum/action/predator_action/bracer/cloak + name = "Toggle Cloak" + action_icon_state = "cloak" + listen_signal = COMSIG_KB_YAUTJA_CLOAKER + +/datum/action/predator_action/bracer/cloak/action_activate() + . = ..() + bracers.cloaker() + +/datum/action/predator_action/bracer/thwei + name = "Create Stabilizing Crystal" + action_icon_state = "thwei" + listen_signal = COMSIG_KB_YAUTJA_INJECTORS + active = PREDATOR_ACTION_ON_CLICK + +/datum/action/predator_action/bracer/thwei/action_activate() + . = ..() + bracers.injectors() + +/datum/action/predator_action/bracer/capsule + name = "Create Healing Capsule" + action_icon_state = "thwei" + listen_signal = COMSIG_KB_YAUTJA_CAPSULE + active = PREDATOR_ACTION_ON_CLICK + +/datum/action/predator_action/bracer/capsule/action_activate() + . = ..() + bracers.healing_capsule() + +/datum/action/predator_action/bracer/translator + name = "Use Translator" + action_icon_state = "translator" + listen_signal = COMSIG_KB_YAUTJA_TRANSLATE + active = PREDATOR_ACTION_ON_CLICK + +/datum/action/predator_action/bracer/translator/action_activate() + . = ..() + bracers.translate() + +/datum/action/predator_action/bracer/self_destruct + name = "Self Destruct" + action_icon_state = "self_destruct" + listen_signal = COMSIG_KB_YAUTJA_ACTIVATE_SUICIDE + +/datum/action/predator_action/bracer/self_destruct/action_activate() + . = ..() + bracers.activate_suicide() + +#undef PREDATOR_ACTION_ON_CLICK + +//Misc actions +/datum/action/yautja_emote_panel + name = "Open Emote Panel" + button_icon_state = "pred_template" + action_icon_state = "looc_toggle" + +/datum/action/yautja_emote_panel/action_activate() + var/mob/living/carbon/human/human_owner = owner + var/datum/species/yautja/yautja_species = human_owner.species + yautja_species.open_emote_panel() + +/datum/yautja_emote_panel + /// Static dict ("category" : (emotes)) of every yautja emote typepath + var/static/list/yautja_emotes + /// Static list of categories + var/static/list/yautja_categories = list() + /// Panel allows you to spam, so a manual CD is added here + COOLDOWN_DECLARE(panel_emote_cooldown) + +/datum/yautja_emote_panel/New() + if(length(yautja_emotes)) + return + var/list/emotes_to_add = list() + for(var/datum/emote/living/carbon/human/yautja/emote as anything in subtypesof(/datum/emote/living/carbon/human/yautja)) + if(!initial(emote.key) || initial(emote.no_panel)) + continue + + if(!(initial(emote.category) in yautja_categories)) + yautja_categories += initial(emote.category) + emotes_to_add += emote + yautja_emotes = emotes_to_add + +/datum/yautja_emote_panel/proc/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "YautjaEmotes") + ui.open() + +/datum/yautja_emote_panel/ui_data(mob/user) + var/list/data = list() + + data["on_cooldown"] = !COOLDOWN_FINISHED(src, panel_emote_cooldown) + + return data + +/datum/yautja_emote_panel/ui_state(mob/user) + return GLOB.conscious_state + +/datum/yautja_emote_panel/ui_static_data(mob/user) + var/list/data = list() + + data["categories"] = yautja_categories + data["emotes"] = list() + + for(var/datum/emote/living/carbon/human/yautja/emote as anything in yautja_emotes) + data["emotes"] += list(list( + "id" = initial(emote.key), + "text" = (initial(emote.override_say) || initial(emote.say_message) || initial(emote.key)), + "category" = initial(emote.category), + "path" = "[emote]", + )) + + return data + +/datum/yautja_emote_panel/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + switch(action) + if("emote") + var/datum/emote/living/carbon/human/yautja/path + if(!params["emotePath"]) + return FALSE + + path = text2path(params["emotePath"]) + + if(!path || !COOLDOWN_FINISHED(src, panel_emote_cooldown)) + return + + if(!(path in subtypesof(/datum/emote/living/carbon/human/yautja))) + return FALSE + + COOLDOWN_START(src, panel_emote_cooldown, 2.5 SECONDS) + ui.user.emote(initial(path.key)) + return TRUE diff --git a/code/modules/cm_preds/yaut_bracers.dm b/code/modules/cm_preds/yaut_bracers.dm index df8ab136ea18..1cf8310a607e 100644 --- a/code/modules/cm_preds/yaut_bracers.dm +++ b/code/modules/cm_preds/yaut_bracers.dm @@ -260,8 +260,6 @@ cloak_alpha = 10 var/exploding = 0 - var/inject_timer = 0 - var/healing_capsule_timer = 0 var/disc_timer = 0 var/explosion_type = 1 //0 is BIG explosion, 1 ONLY gibs the user. var/name_active = TRUE @@ -278,6 +276,9 @@ var/obj/item/weapon/wristblades/left_wristblades var/obj/item/weapon/wristblades/right_wristblades + ///A list of all intrinsic bracer actions + var/list/bracer_actions = list(/datum/action/predator_action/bracer/wristblade, /datum/action/predator_action/bracer/caster, /datum/action/predator_action/bracer/cloak, /datum/action/predator_action/bracer/thwei, /datum/action/predator_action/bracer/capsule, /datum/action/predator_action/bracer/translator, /datum/action/predator_action/bracer/self_destruct, /datum/action/predator_action/bracer/smartdisc) + /obj/item/clothing/gloves/yautja/hunter/Initialize(mapload, new_translator_type, new_caster_material, new_owner_rank) . = ..() if(new_owner_rank) @@ -312,6 +313,10 @@ if(embedded_id.registered_name) embedded_id.set_user_data(user) + for(var/datum/action/action as anything in bracer_actions) + give_action(user, action) + + //Any projectile can decloak a predator. It does defeat one free bullet though. /obj/item/clothing/gloves/yautja/hunter/proc/bullet_hit(mob/living/carbon/human/H, obj/projectile/P) SIGNAL_HANDLER @@ -351,6 +356,10 @@ move_chip_to_bracer() if(HAS_TRAIT(user, TRAIT_CLOAKED)) decloak(user, TRUE) + + for(var/datum/action/action as anything in bracer_actions) + remove_action(user, action) + ..() /obj/item/clothing/gloves/yautja/hunter/on_enter_storage(obj/item/storage/S) @@ -362,8 +371,8 @@ //We use this to activate random verbs for non-Yautja /obj/item/clothing/gloves/yautja/hunter/proc/activate_random_verb(mob/caller) - var/option = rand(1, 11) - //we have options from 1 to 8, but we're giving the user a higher probability of being punished if they already rolled this bad + var/option = rand(1, 10) + //we have options from 1 to 7, but we're giving the user a higher probability of being punished if they already rolled this bad switch(option) if(1) . = wristblades_internal(caller, TRUE) @@ -379,8 +388,6 @@ . = call_disc_internal(caller, TRUE) if(7) . = translate_internal(caller, TRUE) - if(8) - . = call_combi_internal(caller, TRUE) else . = delimb_user(caller) @@ -451,6 +458,12 @@ to_chat(caller, SPAN_NOTICE("You activate your [left_wristblades.plural_name].")) playsound(caller, 'sound/weapons/wristblades_on.ogg', 15, TRUE) + var/datum/action/predator_action/bracer/wristblade/wb_action + for(wb_action as anything in caller.actions) + if(istypestrict(wb_action, /datum/action/predator_action/bracer/wristblade)) + wb_action.update_button_icon(wristblades_deployed) + break + return TRUE /obj/item/clothing/gloves/yautja/hunter/verb/track_gear() @@ -597,6 +610,12 @@ XI.remove_from_hud(M) anim(M.loc,M,'icons/mob/mob.dmi',,"cloak",,M.dir) + var/datum/action/predator_action/bracer/cloak/cloak_action + for(cloak_action as anything in M.actions) + if(istypestrict(cloak_action, /datum/action/predator_action/bracer/cloak)) + cloak_action.update_button_icon(HAS_TRAIT(caller, TRAIT_CLOAKED)) + break + return TRUE /obj/item/clothing/gloves/yautja/hunter/proc/wrapper_fizzle_camouflage() @@ -675,6 +694,12 @@ to_chat(caller, SPAN_NOTICE("You activate your plasma caster. It is in [caster.mode] mode.")) playsound(src, 'sound/weapons/pred_plasmacaster_on.ogg', 15, TRUE) + var/datum/action/predator_action/bracer/caster/caster_action + for(caster_action as anything in caller.actions) + if(istypestrict(caster_action, /datum/action/predator_action/bracer/caster)) + caster_action.update_button_icon(caster_deployed) + break + return TRUE @@ -793,10 +818,19 @@ to_chat(M, SPAN_NOTICE("Your bracers stop beeping.")) message_all_yautja("[M.real_name] has cancelled their bracer's self-destruction sequence.") message_admins("[key_name(M)] has deactivated their Self-Destruct.") + + var/datum/action/predator_action/bracer/self_destruct/sd_action + for(sd_action as anything in M.actions) + if(istypestrict(sd_action, /datum/action/predator_action/bracer/self_destruct)) + sd_action.update_button_icon(exploding) + break + return + if(istype(M.wear_mask,/obj/item/clothing/mask/facehugger) || (M.status_flags & XENO_HOST)) to_chat(M, SPAN_WARNING("Strange...something seems to be interfering with your bracer functions...")) return + if(forced || alert("Detonate the bracers? Are you sure?\n\nNote: If you activate SD for any non-accidental reason during or after a fight, you commit to the SD. By initially activating the SD, you have accepted your impending death to preserve any lost honor.","Explosive Bracers", "Yes", "No") == "Yes") if(M.gloves != src) return @@ -815,10 +849,16 @@ log_attack("[key_name(M)] triggered their predator self-destruct sequence in [A ? "in [A.name]":""]") message_all_yautja("[M.real_name] has triggered their bracer's self-destruction sequence.") explode(M) - return 1 + var/datum/action/predator_action/bracer/self_destruct/sd_action + for(sd_action as anything in M.actions) + if(istypestrict(sd_action, /datum/action/predator_action/bracer/self_destruct)) + sd_action.update_button_icon(exploding) + break + return TRUE +#define YAUTJA_CREATE_CRYSTAL_COOLDOWN "yautja_create_crystal_cooldown" /obj/item/clothing/gloves/yautja/hunter/verb/injectors() set name = "Create Stabilising Crystal" set category = "Yautja.Utility" @@ -826,7 +866,6 @@ set src in usr . = injectors_internal(usr, FALSE) - /obj/item/clothing/gloves/yautja/hunter/proc/injectors_internal(mob/caller, forced = FALSE) if(caller.is_mob_incapacitated()) return FALSE @@ -839,26 +878,22 @@ to_chat(caller, SPAN_WARNING("Your active hand must be empty!")) return FALSE - if(inject_timer) - to_chat(caller, SPAN_WARNING("You recently activated the stabilising crystal. Be patient.")) + if(TIMER_COOLDOWN_CHECK(src, YAUTJA_CREATE_CRYSTAL_COOLDOWN)) + var/remaining_time = DisplayTimeText(S_TIMER_COOLDOWN_TIMELEFT(src, YAUTJA_CREATE_CRYSTAL_COOLDOWN)) + to_chat(caller, SPAN_WARNING("You recently synthesized a stabilising crystal. A new crystal will be available in [remaining_time].")) return FALSE if(!drain_power(caller, 400)) return FALSE - inject_timer = TRUE - addtimer(CALLBACK(src, PROC_REF(injectors_ready)), 2 MINUTES) + S_TIMER_COOLDOWN_START(src, YAUTJA_CREATE_CRYSTAL_COOLDOWN, 2 MINUTES) to_chat(caller, SPAN_NOTICE("You feel a faint hiss and a crystalline injector drops into your hand.")) var/obj/item/reagent_container/hypospray/autoinjector/yautja/O = new(caller) caller.put_in_active_hand(O) playsound(src, 'sound/machines/click.ogg', 15, 1) return TRUE - -/obj/item/clothing/gloves/yautja/hunter/proc/injectors_ready() - if(ismob(loc)) - to_chat(loc, SPAN_NOTICE("Your bracers beep faintly and inform you that a new stabilising crystal is ready to be created.")) - inject_timer = FALSE +#undef YAUTJA_CREATE_CRYSTAL_COOLDOWN /obj/item/clothing/gloves/yautja/hunter/verb/healing_capsule() set name = "Create Healing Capsule" @@ -867,7 +902,7 @@ set src in usr . = healing_capsule_internal(usr, FALSE) - +#define YAUTJA_CREATE_CAPSULE_COOLDOWN "yautja_create_capsule_cooldown" /obj/item/clothing/gloves/yautja/hunter/proc/healing_capsule_internal(mob/caller, forced = FALSE) if(caller.is_mob_incapacitated()) return FALSE @@ -880,26 +915,22 @@ to_chat(caller, SPAN_WARNING("Your active hand must be empty!")) return FALSE - if(healing_capsule_timer) - to_chat(usr, SPAN_WARNING("Your bracer is still generating a new healing capsule!")) + if(TIMER_COOLDOWN_CHECK(src, YAUTJA_CREATE_CAPSULE_COOLDOWN)) + var/remaining_time = DisplayTimeText(S_TIMER_COOLDOWN_TIMELEFT(src, YAUTJA_CREATE_CAPSULE_COOLDOWN)) + to_chat(caller, SPAN_WARNING("You recently synthesized a healing capsule. A new capsule will be available in [remaining_time].")) return FALSE if(!drain_power(caller, 600)) return FALSE - healing_capsule_timer = TRUE - addtimer(CALLBACK(src, PROC_REF(healing_capsule_ready)), 4 MINUTES) + S_TIMER_COOLDOWN_START(src, YAUTJA_CREATE_CAPSULE_COOLDOWN, 4 MINUTES) to_chat(caller, SPAN_NOTICE("You feel your bracer churn as it pops out a healing capsule.")) var/obj/item/tool/surgery/healing_gel/O = new(caller) caller.put_in_active_hand(O) playsound(src, 'sound/machines/click.ogg', 15, 1) return TRUE - -/obj/item/clothing/gloves/yautja/hunter/proc/healing_capsule_ready() - if(ismob(loc)) - to_chat(loc, SPAN_NOTICE("Your bracers beep faintly and inform you that a new healing capsule is ready to be created.")) - healing_capsule_timer = FALSE +#undef YAUTJA_CREATE_CAPSULE_COOLDOWN /obj/item/clothing/gloves/yautja/hunter/verb/call_disc() set name = "Call Smart-Disc" @@ -991,26 +1022,6 @@ to_chat(caller, SPAN_NOTICE("You add \the [untracked_item] to the tracking system.")) return TRUE -/obj/item/clothing/gloves/yautja/hunter/verb/call_combi() - set name = "Yank combi-stick" - set category = "Yautja.Weapons" - set desc = "Yank on your combi-stick's chain, if it's in range. Otherwise... recover it yourself." - set src in usr - . = call_combi_internal(usr, FALSE) - -/obj/item/clothing/gloves/yautja/hunter/proc/call_combi_internal(mob/caller, forced = FALSE) - if(caller.is_mob_incapacitated()) - return FALSE - - . = check_random_function(caller, forced) - if(.) - return - - for(var/datum/effects/tethering/tether in caller.effects_list) - if(istype(tether.tethered.affected_atom, /obj/item/weapon/yautja/combistick)) - var/obj/item/weapon/yautja/combistick/stick = tether.tethered.affected_atom - stick.recall() - /obj/item/clothing/gloves/yautja/hunter/verb/translate() set name = "Translator" set desc = "Emit a message from your bracer to those nearby." @@ -1148,7 +1159,7 @@ return TRUE var/mob/living/carbon/human/victim = held_mob.grabbed_thing - var/obj/item/clothing/gloves/yautja/hunter/bracer = victim.gloves + var/obj/item/clothing/gloves/yautja/bracer = victim.gloves if(isspeciesyautja(victim) && !(victim.stat == DEAD)) to_chat(user, SPAN_WARNING("You cannot unlock the bracer of a living hunter!")) return FALSE diff --git a/code/modules/cm_preds/yaut_hudprocs.dm b/code/modules/cm_preds/yaut_hudprocs.dm index 6131ac135cb7..460cad894c6d 100644 --- a/code/modules/cm_preds/yaut_hudprocs.dm +++ b/code/modules/cm_preds/yaut_hudprocs.dm @@ -442,3 +442,18 @@ T.hud_set_hunter() else to_chat(src, SPAN_YAUTJABOLD("You cannot undo the actions of a living brother or sister!")) + +/mob/living/carbon/human/proc/call_combi() + set name = "Yank combi-stick" + set category = "Yautja.Weapons" + set desc = "Yank on your combi-stick's chain, if it's in range. Otherwise... recover it yourself." + + if(usr.is_mob_incapacitated()) + return FALSE + call_combi_internal(usr) + +/mob/living/carbon/human/proc/call_combi_internal(mob/caller, forced = FALSE) + for(var/datum/effects/tethering/tether in caller.effects_list) + if(istype(tether.tethered.affected_atom, /obj/item/weapon/yautja/combistick)) + var/obj/item/weapon/yautja/combistick/stick = tether.tethered.affected_atom + stick.recall() diff --git a/code/modules/cm_preds/yaut_items.dm b/code/modules/cm_preds/yaut_items.dm index a648f2392d47..22e1318a7358 100644 --- a/code/modules/cm_preds/yaut_items.dm +++ b/code/modules/cm_preds/yaut_items.dm @@ -3,7 +3,7 @@ //Thrall subtypes are located in /code/modules/cm_preds/thrall_items.dm /proc/add_to_missing_pred_gear(obj/item/W) - if(!is_admin_level(W.z)) + if(!should_block_game_interaction(W)) GLOB.loose_yautja_gear |= W /proc/remove_from_missing_pred_gear(obj/item/W) @@ -217,7 +217,7 @@ siemens_coefficient = 0.2 min_cold_protection_temperature = SHOE_MIN_COLD_PROT max_heat_protection_temperature = SHOE_MAX_HEAT_PROT - items_allowed = list( + allowed_items_typecache = list( /obj/item/weapon/yautja/knife, /obj/item/weapon/gun/energy/yautja/plasmapistol, ) @@ -259,10 +259,9 @@ armor_rad = CLOTHING_ARMOR_MEDIUMHIGH armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH -/obj/item/clothing/shoes/yautja/hunter/knife/New() - ..() - stored_item = new /obj/item/weapon/yautja/knife(src) - update_icon() +/obj/item/clothing/shoes/yautja/hunter/knife + spawn_item_type = /obj/item/weapon/yautja/knife + /obj/item/clothing/under/chainshirt name = "ancient alien mesh suit" desc = "A strange alloy weave in the form of a vest. It feels cold with an alien weight." @@ -394,7 +393,7 @@ var/mob/living/carbon/human/H = user var/ship_to_tele = list("Yautja Ship" = -1, "Human Ship" = "Human") - if(!HAS_TRAIT(H, TRAIT_YAUTJA_TECH) || is_admin_level(H.z)) + if(!HAS_TRAIT(H, TRAIT_YAUTJA_TECH) || should_block_game_interaction(H)) to_chat(user, SPAN_WARNING("You fiddle with it, but nothing happens!")) return diff --git a/code/modules/cm_preds/yaut_mask.dm b/code/modules/cm_preds/yaut_mask.dm index 7e8e661e8a5e..f87c7a48c2e0 100644 --- a/code/modules/cm_preds/yaut_mask.dm +++ b/code/modules/cm_preds/yaut_mask.dm @@ -43,6 +43,8 @@ var/list/mask_huds = list(MOB_HUD_XENO_STATUS, MOB_HUD_HUNTER, MOB_HUD_HUNTER_CLAN, MOB_HUD_MEDICAL_OBSERVER) var/thrall = FALSE //Used to affect icon generation. + ///A list of all intrinsic mask actions + var/list/mask_actions = list(/datum/action/predator_action/mask/zoom, /datum/action/predator_action/mask/visor) /obj/item/clothing/mask/gas/yautja/New(location, mask_number = rand(1,12), armor_material = "ebony", legacy = "None") ..() @@ -96,8 +98,8 @@ if(istype(visor, /obj/item/clothing/glasses/night/yautja))//To change if any new vision modes are made human_holder.temp_drop_inv_item(visor) qdel(visor) - human_holder.update_inv_glasses() human_holder.update_sight() + add_vision(human_holder) /obj/item/clothing/mask/gas/yautja/proc/drain_power(mob/living/carbon/human/human_holder, drain_amount) var/obj/item/clothing/gloves/yautja/bracer = human_holder.gloves @@ -115,6 +117,18 @@ return zoom(usr, 11, 12) + update_zoom_action(src, usr) + if(zoom) + RegisterSignal(src, COMSIG_ITEM_UNZOOM, PROC_REF(update_zoom_action)) + return + +/obj/item/clothing/mask/gas/yautja/proc/update_zoom_action(source, mob/living/user) + UnregisterSignal(src, COMSIG_ITEM_UNZOOM) + var/datum/action/predator_action/mask/zoom/zoom_action + for(zoom_action as anything in user.actions) + if(istypestrict(zoom_action, /datum/action/predator_action/mask/zoom)) + zoom_action.update_button_icon(zoom) + break /obj/item/clothing/mask/gas/yautja/verb/togglesight() set name = "Toggle Mask Visors" @@ -165,12 +179,21 @@ playsound(src, 'sound/effects/pred_vision.ogg', 15, 1) user.update_inv_glasses() + var/datum/action/predator_action/mask/visor/visor_action + for(visor_action as anything in user.actions) + if(istypestrict(visor_action, /datum/action/predator_action/mask/visor)) + visor_action.update_button_icon(current_goggles) + break + #undef VISION_MODE_OFF #undef VISION_MODE_NVG /obj/item/clothing/mask/gas/yautja/dropped(mob/living/carbon/human/user) //Clear the gogglors if the helmet is removed. STOP_PROCESSING(SSobj, src) if(istype(user) && user.wear_mask == src) //inventory reference is only cleared after dropped(). + for(var/datum/action/action as anything in mask_actions) + remove_action(user, action) + for(var/listed_hud in mask_huds) var/datum/mob_hud/H = GLOB.huds[listed_hud] H.remove_hud_from(user, src) @@ -185,6 +208,9 @@ /obj/item/clothing/mask/gas/yautja/equipped(mob/living/carbon/human/user, slot) if(slot == WEAR_FACE) + for(var/datum/action/action as anything in mask_actions) + give_action(user, action) + START_PROCESSING(SSobj, src) for(var/listed_hud in mask_huds) var/datum/mob_hud/H = GLOB.huds[listed_hud] diff --git a/code/modules/cm_preds/yaut_procs.dm b/code/modules/cm_preds/yaut_procs.dm index 728e548dfd2f..d8ad1c297a37 100644 --- a/code/modules/cm_preds/yaut_procs.dm +++ b/code/modules/cm_preds/yaut_procs.dm @@ -337,3 +337,4 @@ equip_to_slot_if_possible(new /obj/item/falcon_drone(src.loc), WEAR_R_EAR, disable_warning = TRUE) remove_verb(src, /mob/living/carbon/human/proc/pred_buy) + remove_action(src, /datum/action/predator_action/claim_equipment) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 0ea527847d72..9cb8a8bef3fc 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -128,6 +128,7 @@ attack_speed = 5 attack_verb = list("sliced", "slashed", "jabbed", "torn", "gored") force = MELEE_FORCE_TIER_5 + has_speed_bonus = FALSE /*######################################### ########### One Handed Weapons ############ @@ -248,14 +249,16 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("speared", "stabbed", "impaled") - var/on = 1 - var/charged + var/on = TRUE + var/charged = FALSE var/force_wielded = MELEE_FORCE_TIER_6 var/force_unwielded = MELEE_FORCE_TIER_2 var/force_storage = MELEE_FORCE_TIER_1 /// Ref to the tether effect when thrown var/datum/effects/tethering/chain + ///The mob the chain is linked to + var/mob/living/linked_to /obj/item/weapon/yautja/combistick/Destroy() cleanup_chain() @@ -273,11 +276,13 @@ charged = FALSE remove_filter("combistick_charge") unwield(user) //Otherwise stays wielded even when thrown - if(on) - setup_chain(user) return TRUE /obj/item/weapon/yautja/combistick/proc/setup_chain(mob/living/user) + give_action(user, /datum/action/predator_action/bracer/combistick) + add_verb(user, /mob/living/carbon/human/proc/call_combi) + linked_to = user + var/list/tether_effects = apply_tether(user, src, range = 6, resistable = FALSE) chain = tether_effects["tetherer_tether"] RegisterSignal(chain, COMSIG_PARENT_QDELETING, PROC_REF(cleanup_chain)) @@ -293,6 +298,10 @@ /// Clean up the chain, deleting/nulling/unregistering as needed /obj/item/weapon/yautja/combistick/proc/cleanup_chain() SIGNAL_HANDLER + if(linked_to) + remove_action(linked_to, /datum/action/predator_action/bracer/combistick) + remove_verb(linked_to, /mob/living/carbon/human/proc/call_combi) + if(!QDELETED(chain)) QDEL_NULL(chain) @@ -1238,6 +1247,13 @@ /obj/item/weapon/gun/energy/yautja/plasma_caster/dropped(mob/living/carbon/human/M) playsound(M, 'sound/weapons/pred_plasmacaster_off.ogg', 15, 1) to_chat(M, SPAN_NOTICE("You deactivate your plasma caster.")) + + var/datum/action/predator_action/bracer/caster/caster_action + for(caster_action as anything in M.actions) + if(istypestrict(caster_action, /datum/action/predator_action/bracer/caster)) + caster_action.update_button_icon(FALSE) + break + if(source) forceMove(source) source.caster_deployed = FALSE diff --git a/code/modules/cm_tech/hologram.dm b/code/modules/cm_tech/hologram.dm index 3509c0a73a7d..1fcba71a4560 100644 --- a/code/modules/cm_tech/hologram.dm +++ b/code/modules/cm_tech/hologram.dm @@ -14,6 +14,7 @@ GLOBAL_LIST_EMPTY_TYPED(hologram_list, /mob/hologram) var/action_icon_state = "hologram_exit" var/mob/linked_mob + var/initial_leave_button = /datum/action/leave_hologram var/datum/action/leave_hologram/leave_button ///If can be detected on motion detectors. var/motion_sensed = FALSE @@ -45,7 +46,7 @@ GLOBAL_LIST_EMPTY_TYPED(hologram_list, /mob/hologram) name = "[initial(name)] ([M.name])" - leave_button = new(null, action_icon_state) + leave_button = new initial_leave_button(null, action_icon_state) leave_button.linked_hologram = src leave_button.give_to(M) diff --git a/code/modules/cm_tech/tech_tiers.dm b/code/modules/cm_tech/tech_tiers.dm index 498c267afa05..b2d2c0a08de3 100644 --- a/code/modules/cm_tech/tech_tiers.dm +++ b/code/modules/cm_tech/tech_tiers.dm @@ -4,8 +4,8 @@ var/flags = NO_FLAGS - var/disabled_color = "#FFFFFF" - var/color = "#FFFFFF" + var/disabled_color = COLOR_WHITE + var/color = COLOR_WHITE var/max_techs = INFINITE_TECHS // Infinite var/list/turf/tier_turfs @@ -19,22 +19,22 @@ /datum/tier/free name = "Initial Tier" tier = 0 - color = "#000000" - disabled_color = "#000000" + color = COLOR_BLACK + disabled_color = COLOR_BLACK flags = TIER_FLAG_TRANSITORY /datum/tier/one name = "Tier 1" tier = 1 - color = "#00FF00" + color = COLOR_GREEN disabled_color = "#007d00" /datum/tier/one_transition_two name = "Tier 1 to Tier 2 transition" tier = 1 - color = "#000000" - disabled_color = "#000000" + color = COLOR_BLACK + disabled_color = COLOR_BLACK flags = TIER_FLAG_TRANSITORY /datum/tier/two @@ -47,27 +47,27 @@ /datum/tier/two_transition_three name = "Tier 2 to Tier 3 transition" tier = 2 - color = "#000000" - disabled_color = "#000000" + color = COLOR_BLACK + disabled_color = COLOR_BLACK flags = TIER_FLAG_TRANSITORY /datum/tier/three name = "Tier 3" tier = 3 - color = "#FF0000" + color = COLOR_RED disabled_color = "#7d0000" /datum/tier/three_transition_four name = "Tier 3 to Tier 4 transition" tier = 3 - color = "#000000" - disabled_color = "#000000" + color = COLOR_BLACK + disabled_color = COLOR_BLACK flags = TIER_FLAG_TRANSITORY /datum/tier/four name = "Tier 4" tier = 4 - color = "#FF00FF" + color = COLOR_MAGENTA disabled_color = "#7d007d" max_techs = 1 diff --git a/code/modules/cm_tech/techtree.dm b/code/modules/cm_tech/techtree.dm index 6c39d8ab9cf9..a027789185ef 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/sentry_computer.dm b/code/modules/defenses/sentry_computer.dm index e2cbd5d5858e..59c6409d552c 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].")) @@ -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,12 @@ 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_range() + var/datum/shape/rectangle/current_bb = defense.range_bounds + SEND_SIGNAL(src, COMSIG_CAMERA_SET_AREA, current_bb.center_x, current_bb.center_y, defense.loc.z, current_bb.width, current_bb.height) + return TRUE if("ping") playsound(sentry, 'sound/machines/twobeep.ogg', 50, 1) @@ -439,62 +417,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_range() - var/datum/shape/rectangle/current_bb = current.range_bounds - var/x_size = current_bb.width - var/y_size = current_bb.height - var/target = locate(current_bb.center_x, current_bb.center_y, current.loc.z) - var/list/guncamera_zone = range("[x_size]x[y_size]", target) - - var/list/visible_turfs = list() - - for(var/turf/visible_turf in guncamera_zone) - visible_turfs += visible_turf - - 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/gear_presets/clf.dm b/code/modules/gear_presets/clf.dm index d89e349a62c1..7748f4e0c558 100644 --- a/code/modules/gear_presets/clf.dm +++ b/code/modules/gear_presets/clf.dm @@ -918,7 +918,7 @@ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smartgun/clf(new_human), WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(new_human), WEAR_HANDS) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/smartgunner/clf/full(new_human), WEAR_WAIST) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/survival/full(new_human), WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_R_STORE) diff --git a/code/modules/gear_presets/corpses.dm b/code/modules/gear_presets/corpses.dm index ca2b2e2ab52d..72513a95f880 100644 --- a/code/modules/gear_presets/corpses.dm +++ b/code/modules/gear_presets/corpses.dm @@ -111,7 +111,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/sec(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine(new_human), WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel(new_human), WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/rebreather/scarf(new_human), WEAR_FACE) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS) if(prob(25)) @@ -738,7 +738,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP, WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/device/binoculars, WEAR_IN_JACKET) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) add_random_survivor_equipment(new_human) @@ -854,7 +854,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/freelancer, WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/freelancer, WEAR_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/pmc, WEAR_HANDS) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/dutch, WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine, WEAR_WAIST) diff --git a/code/modules/gear_presets/fun.dm b/code/modules/gear_presets/fun.dm index 68253afbf90a..44b2a1a1157a 100644 --- a/code/modules/gear_presets/fun.dm +++ b/code/modules/gear_presets/fun.dm @@ -327,7 +327,7 @@ //head new_human.equip_to_slot_or_del(new /obj/item/clothing/head/ivanberet, WEAR_HEAD) //limb - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/pmc, WEAR_HANDS) //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/ivan, WEAR_WAIST) diff --git a/code/modules/gear_presets/other.dm b/code/modules/gear_presets/other.dm index 6a9fa4d6f55a..d97a032337ee 100644 --- a/code/modules/gear_presets/other.dm +++ b/code/modules/gear_presets/other.dm @@ -69,7 +69,7 @@ //generic clothing new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/freelancer, WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/freelancer, WEAR_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/pmc, WEAR_HANDS) spawn_merc_helmet(new_human) //storage and specific stuff, they all get an ERT medpouch. @@ -149,7 +149,7 @@ new_human.equip_to_slot_or_del(FREELANCER, WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/freelancer, WEAR_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/pmc, WEAR_HANDS) spawn_merc_helmet(new_human) @@ -216,7 +216,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/freelancer, WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/freelancer, WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/freelancer/beret, WEAR_HEAD) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) if(new_human.disabilities & NEARSIGHTED) new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/prescription(new_human), WEAR_EYES) @@ -774,7 +774,7 @@ /datum/equipment_preset/other/xeno_cultist/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chaplain/cultist(new_human), WEAR_BODY) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/tools/full(new_human), WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/survival/full(new_human), WEAR_L_STORE) @@ -952,3 +952,21 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/tools/tank(new_human), WEAR_R_STORE) //*****************************************************************************************************/ + + +/datum/equipment_preset/tutorial + name = "Tutorial" + faction = FACTION_MARINE + flags = EQUIPMENT_PRESET_EXTRA + faction_group = FACTION_LIST_MARINE + languages = list(LANGUAGE_ENGLISH) + idtype = /obj/item/card/id + /// If the player should start out underfed + var/underfed = TRUE + +/datum/equipment_preset/tutorial/load_status(mob/living/carbon/human/new_human) + if(underfed) + new_human.nutrition = NUTRITION_LOW + +/datum/equipment_preset/tutorial/fed + underfed = FALSE diff --git a/code/modules/gear_presets/survivors/fiorina_sciannex/preset_fiorina_sciannex.dm b/code/modules/gear_presets/survivors/fiorina_sciannex/preset_fiorina_sciannex.dm index f0d812026491..248c1a00d353 100644 --- a/code/modules/gear_presets/survivors/fiorina_sciannex/preset_fiorina_sciannex.dm +++ b/code/modules/gear_presets/survivors/fiorina_sciannex/preset_fiorina_sciannex.dm @@ -1,9 +1,9 @@ -/datum/equipment_preset/survivor/scientist/florina - name = "Survivor - Florina Researcher" - assignment = "Florina Researcher" +/datum/equipment_preset/survivor/scientist/fiorina + name = "Survivor - Fiorina Researcher" + assignment = "Fiorina Researcher" -/datum/equipment_preset/survivor/scientist/florina/load_gear(mob/living/carbon/human/new_human) +/datum/equipment_preset/survivor/scientist/fiorina/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/purple(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/surgery/purple(new_human), WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/science(new_human), WEAR_JACKET) @@ -15,20 +15,20 @@ ..() -/datum/equipment_preset/survivor/doctor/florina - name = "Survivor - Florina Doctor" - assignment = "Florina Doctor" +/datum/equipment_preset/survivor/doctor/fiorina + name = "Survivor - Fiorina Doctor" + assignment = "Fiorina Doctor" -/datum/equipment_preset/survivor/doctor/florina/load_gear(mob/living/carbon/human/new_human) +/datum/equipment_preset/survivor/doctor/fiorina/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc(new_human), WEAR_HEAD) ..() -/datum/equipment_preset/survivor/security/florina - name = "Survivor - Florina Prison Guard" - assignment = "Florina Prison Guard" +/datum/equipment_preset/survivor/security/fiorina + name = "Survivor - Fiorina Prison Guard" + assignment = "Fiorina Prison Guard" -/datum/equipment_preset/survivor/security/florina/load_gear(mob/living/carbon/human/new_human) +/datum/equipment_preset/survivor/security/fiorina/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/sec(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/security(new_human), WEAR_JACKET) @@ -37,11 +37,11 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(new_human), WEAR_FEET) ..() -/datum/equipment_preset/survivor/colonial_marshal/florina +/datum/equipment_preset/survivor/colonial_marshal/fiorina name = "Survivor - United Americas Riot Officer" assignment = "United Americas Riot Officer" -/datum/equipment_preset/survivor/colonial_marshal/florina/load_gear(mob/living/carbon/human/new_human) +/datum/equipment_preset/survivor/colonial_marshal/fiorina/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/ua_riot(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/sec(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/ua_riot(new_human), WEAR_JACKET) @@ -52,11 +52,11 @@ ..() -/datum/equipment_preset/survivor/engineer/florina - name = "Survivor - Florina Engineer" - assignment = "Florina Engineer" +/datum/equipment_preset/survivor/engineer/fiorina + name = "Survivor - Fiorina Engineer" + assignment = "Fiorina Engineer" -/datum/equipment_preset/survivor/engineer/florina/load_gear(mob/living/carbon/human/new_human) +/datum/equipment_preset/survivor/engineer/fiorina/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/color/white(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/apron/overalls(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/eng(new_human), WEAR_BACK) diff --git a/code/modules/gear_presets/survivors/misc.dm b/code/modules/gear_presets/survivors/misc.dm index 396c38054965..692833bfa82b 100644 --- a/code/modules/gear_presets/survivors/misc.dm +++ b/code/modules/gear_presets/survivors/misc.dm @@ -242,7 +242,7 @@ Everything below isn't used or out of place. new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/freelancer, WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/freelancer, WEAR_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/pmc, WEAR_HANDS) spawn_merc_helmet(new_human) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/dutch, WEAR_L_EAR) diff --git a/code/modules/gear_presets/survivors/sorokyne_strata/preset_sorokyne_strata.dm b/code/modules/gear_presets/survivors/sorokyne_strata/preset_sorokyne_strata.dm index f53f25326b69..220034399293 100644 --- a/code/modules/gear_presets/survivors/sorokyne_strata/preset_sorokyne_strata.dm +++ b/code/modules/gear_presets/survivors/sorokyne_strata/preset_sorokyne_strata.dm @@ -5,7 +5,7 @@ /datum/equipment_preset/survivor/engineer/soro/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel(new_human), WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/snow_suit/soviet(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(new_human), WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/rebreather/scarf(new_human), WEAR_FACE) @@ -19,7 +19,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/rank/veteran/soviet_uniform_01(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/snow_suit/soviet(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/sec(new_human), WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/rebreather/scarf(new_human), WEAR_FACE) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(new_human), WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS) @@ -71,4 +71,3 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/lockable/liaison, WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET) ..() - diff --git a/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm b/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm index 324cfbe3bf7a..99589582cbf6 100644 --- a/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm +++ b/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm @@ -26,7 +26,7 @@ uniform.roll_suit_sleeves(new_human) new_human.equip_to_slot_or_del(uniform, WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp (new_human), WEAR_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp_knife(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flare(new_human), WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate(new_human), WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/five_slot(new_human), WEAR_BACK) @@ -207,4 +207,4 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp, WEAR_ACCESSORY) 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/storage/pouch/tools/uppsynth, WEAR_R_STORE) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm index 3b2efd8c22be..9a181c817020 100644 --- a/code/modules/gear_presets/synths.dm +++ b/code/modules/gear_presets/synths.dm @@ -317,7 +317,7 @@ WEAR_WAIST = /obj/item/storage/belt/marine, WEAR_HANDS = /obj/item/clothing/gloves/marine/veteran, WEAR_R_HAND = /obj/item/storage/pouch/flare/full, - WEAR_FEET = /obj/item/clothing/shoes/marine/upp, + WEAR_FEET = /obj/item/clothing/shoes/marine/upp/knife, WEAR_L_HAND = /obj/item/storage/large_holster/katana/full ) diff --git a/code/modules/gear_presets/upp.dm b/code/modules/gear_presets/upp.dm index dc79f87c5135..0b3b4d4ecfb5 100644 --- a/code/modules/gear_presets/upp.dm +++ b/code/modules/gear_presets/upp.dm @@ -78,7 +78,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP, WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/device/binoculars, WEAR_IN_JACKET) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/upp, WEAR_HANDS) if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD]) @@ -151,7 +151,7 @@ /datum/equipment_preset/upp/soldier/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("UM5 Personal Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), @@ -261,7 +261,7 @@ //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/upp/full, WEAR_WAIST) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/upp, WEAR_HANDS) //póckets var/obj/item/storage/pouch/magazine/large/ppouch = new() @@ -280,7 +280,7 @@ /datum/equipment_preset/upp/medic/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Medic Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/medic, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("UL6 Personal Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/support, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), @@ -435,7 +435,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine/upp/sapper(new_human), WEAR_WAIST) //limb new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/insulated(new_human), WEAR_HANDS) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) //pockets new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/ert(new_human), WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/construction/full(new_human), WEAR_R_STORE) @@ -443,7 +443,7 @@ /datum/equipment_preset/upp/sapper/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("UM5 Personal Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), @@ -556,7 +556,7 @@ new_human.equip_to_slot_or_del(UPP, WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/heavy, WEAR_JACKET) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/upp, WEAR_HANDS) //pockets new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/explosive/C4, WEAR_R_STORE) @@ -582,7 +582,7 @@ /datum/equipment_preset/upp/specialist/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("UH7 Heavy Plated Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/heavy, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), @@ -683,7 +683,7 @@ new_human.equip_to_slot_or_del(UPP, WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/heavy, WEAR_JACKET) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/upp, WEAR_HANDS) //pockets new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/explosive/C4, WEAR_R_STORE) @@ -707,7 +707,7 @@ /datum/equipment_preset/upp/machinegunner/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("UH7 Heavy Plated Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/heavy, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), @@ -829,7 +829,7 @@ if(4) //25% new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/revolver, WEAR_WAIST) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/upp, WEAR_HANDS) //pockets new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flamertank, WEAR_R_STORE) @@ -843,7 +843,7 @@ /datum/equipment_preset/upp/leader/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("UH7 Heavy Plated Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/heavy, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), @@ -979,7 +979,7 @@ //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/security/MP/UPP/full, WEAR_WAIST) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/upp, WEAR_HANDS) //pockets new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/autoinjector/full, WEAR_L_STORE) @@ -990,7 +990,7 @@ /datum/equipment_preset/upp/military_police/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/mp, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("UL4 camouflaged jacket", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/mp, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), @@ -1140,7 +1140,7 @@ //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/np92, WEAR_WAIST) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/upp, WEAR_HANDS) //pockets new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large, WEAR_L_STORE) @@ -1155,7 +1155,7 @@ /datum/equipment_preset/upp/officer/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/officer, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/command, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), @@ -1300,7 +1300,7 @@ //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/t73, WEAR_WAIST) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/upp, WEAR_HANDS) //pockets new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large, WEAR_L_STORE) @@ -1315,7 +1315,7 @@ /datum/equipment_preset/upp/officer/senior/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/officer, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/command, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), @@ -1461,7 +1461,7 @@ //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/t73, WEAR_WAIST) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) //pockets new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large, WEAR_L_STORE) @@ -1476,7 +1476,7 @@ /datum/equipment_preset/upp/officer/kapitan/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/officer, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/command, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), @@ -1622,7 +1622,7 @@ //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/t73/leader, WEAR_WAIST) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/upp, WEAR_HANDS) //pockets new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large, WEAR_L_STORE) @@ -1637,7 +1637,7 @@ /datum/equipment_preset/upp/officer/major/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/officer, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/command, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), @@ -1783,7 +1783,7 @@ //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/t73/leader, WEAR_WAIST) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) //pockets new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large, WEAR_L_STORE) @@ -1798,7 +1798,7 @@ /datum/equipment_preset/upp/officer/lt_kolonel/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/officer, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/command, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), @@ -1944,7 +1944,7 @@ //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/t73/leader, WEAR_WAIST) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/upp, WEAR_HANDS) //pockets new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large, WEAR_L_STORE) @@ -1959,7 +1959,7 @@ /datum/equipment_preset/upp/officer/kolonel/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/officer, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/command, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), @@ -2105,7 +2105,7 @@ //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/t73/leader, WEAR_WAIST) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) //pockets new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large, WEAR_L_STORE) @@ -2120,7 +2120,7 @@ /datum/equipment_preset/upp/officer/may_gen/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/officer, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/command, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), @@ -2266,7 +2266,7 @@ //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/t73/leader, WEAR_WAIST) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) //pockets new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large, WEAR_L_STORE) @@ -2281,7 +2281,7 @@ /datum/equipment_preset/upp/officer/ley_gen/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/officer, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/command, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), @@ -2427,7 +2427,7 @@ //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/t73/leader, WEAR_WAIST) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) //pockets new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large, WEAR_L_STORE) @@ -2442,7 +2442,7 @@ /datum/equipment_preset/upp/officer/gen/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/officer, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/command, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), @@ -2583,7 +2583,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/shotgun/upp/heavybuck(new_human), WEAR_WAIST) //limb new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/insulated(new_human), WEAR_HANDS) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) //pockets new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/ert(new_human), WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/explosive/C4, WEAR_R_STORE) @@ -2667,7 +2667,7 @@ //waist new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/upp/full, WEAR_WAIST) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/upp, WEAR_HANDS) //póckets var/obj/item/storage/pouch/magazine/large/ppouch = new() @@ -2836,7 +2836,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/upp, WEAR_IN_JACKET) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) var/maybegloves = prob(80) ? pick(/obj/item/clothing/gloves/black, /obj/item/clothing/gloves/marine/veteran/upp, /obj/item/clothing/gloves/combat) : null if(maybegloves) new_human.equip_to_slot_or_del(new maybegloves, WEAR_HANDS) @@ -2865,7 +2865,7 @@ /datum/equipment_preset/upp/conscript/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("Ration", 0, /obj/item/reagent_container/food/snacks/upp, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), @@ -2933,7 +2933,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/np92/suppressed, WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/scout_cloak/upp, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/upp, WEAR_HANDS) new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/pmc/upp, WEAR_FACE) new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m42_night_goggles/upp, WEAR_EYES) @@ -2954,7 +2954,7 @@ /datum/equipment_preset/upp/commando/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/commando, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/kdo, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), @@ -3055,7 +3055,7 @@ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/ap, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/scout_cloak/upp, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/upp, WEAR_HANDS) new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/pmc/upp, WEAR_FACE) new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m42_night_goggles/upp, WEAR_EYES) @@ -3085,7 +3085,7 @@ /datum/equipment_preset/upp/commando/medic/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues Medic", 0, /obj/item/clothing/under/marine/veteran/UPP/medic, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/kdo/medic, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), @@ -3225,7 +3225,7 @@ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/ap, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap/beret, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/scout_cloak/upp, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/upp, WEAR_HANDS) new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/pmc/upp, WEAR_FACE) new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m42_night_goggles/upp, WEAR_EYES) @@ -3249,7 +3249,7 @@ /datum/equipment_preset/upp/commando/leader/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Fatigues", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/commando, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/kdo/command, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), @@ -3369,7 +3369,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/np92/suppressed, WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/scout_cloak/upp/weak, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) 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/mask/gas/pmc/upp, WEAR_FACE) new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m42_night_goggles/upp, WEAR_EYES) @@ -3399,7 +3399,7 @@ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/ap, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/scout_cloak/upp/weak, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) 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/mask/gas/pmc/upp, WEAR_FACE) new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m42_night_goggles/upp, WEAR_EYES) @@ -3438,7 +3438,7 @@ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71/ap, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap/beret, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/scout_cloak/upp/weak, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) 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/mask/gas/pmc/upp, WEAR_FACE) new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m42_night_goggles/upp, WEAR_EYES) @@ -3472,7 +3472,7 @@ /datum/equipment_preset/upp/tank/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP(new_human), WEAR_BODY) - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/cct(new_human), WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/welding(new_human), WEAR_EYES) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow(new_human), WEAR_HANDS) @@ -3611,7 +3611,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/upp/full, WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/oxycodone, WEAR_IN_BELT) //limbs - new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/upp, WEAR_HANDS) //póckets new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large, WEAR_R_STORE) @@ -3630,7 +3630,7 @@ /datum/equipment_preset/upp/doctor/get_antag_clothing_equipment() return list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/upp, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Medic Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/medic, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("UL6 Personal Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/support, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), diff --git a/code/modules/gear_presets/uscm.dm b/code/modules/gear_presets/uscm.dm index 7cee0802e479..8289bdfe09cb 100644 --- a/code/modules/gear_presets/uscm.dm +++ b/code/modules/gear_presets/uscm.dm @@ -30,7 +30,7 @@ /datum/equipment_preset/uscm/load_preset(mob/living/carbon/human/new_human, randomise, count_participant) . = ..() - if(!auto_squad_name || (is_admin_level(new_human.z) && !ert_squad)) + if(!auto_squad_name || (should_block_game_interaction(new_human) && !ert_squad)) return if(!GLOB.data_core.manifest_modify(new_human.real_name, WEAKREF(new_human), assignment, rank)) GLOB.data_core.manifest_inject(new_human) diff --git a/code/modules/gear_presets/uscm_ship.dm b/code/modules/gear_presets/uscm_ship.dm index b5ef13f35b2b..0b6a3b4b1ed7 100644 --- a/code/modules/gear_presets/uscm_ship.dm +++ b/code/modules/gear_presets/uscm_ship.dm @@ -624,7 +624,7 @@ minimum_age = 27 skills = /datum/skills/auxiliary_officer - minimap_icon = list("cic" = MINIMAP_ICON_COLOR_SILVER) + minimap_icon = list("cic" = COLOR_SILVER) minimap_background = MINIMAP_ICON_BACKGROUND_CIC /datum/equipment_preset/uscm_ship/auxiliary_officer/New() diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 2abe8c598032..edc5f4baf880 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -112,14 +112,14 @@ /atom/proc/flash_lighting_fx( _range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, - _color = LIGHT_COLOR_WHITE, + _color = COLOR_WHITE, _duration = FLASH_LIGHT_DURATION, _reset_lighting = TRUE, _flash_times = 1) new /obj/effect/light_flash(get_turf(src), _range, _power, _color, _duration, _flash_times) -/obj/effect/light_flash/Initialize(mapload, _range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = LIGHT_COLOR_WHITE, _duration = FLASH_LIGHT_DURATION, _flash_times = 1) +/obj/effect/light_flash/Initialize(mapload, _range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = COLOR_WHITE, _duration = FLASH_LIGHT_DURATION, _flash_times = 1) light_range = _range light_power = _power light_color = _color diff --git a/code/modules/maptext_alerts/screen_alerts.dm b/code/modules/maptext_alerts/screen_alerts.dm index b096d3b3718f..e0a4d2e4d5b8 100644 --- a/code/modules/maptext_alerts/screen_alerts.dm +++ b/code/modules/maptext_alerts/screen_alerts.dm @@ -64,6 +64,26 @@ style_open = "" style_close = "" +/atom/movable/screen/text/screen_text/command_order/tutorial + letters_per_update = 4 // overall, pretty fast while not immediately popping in + play_delay = 0.1 + fade_out_delay = 2.5 SECONDS + fade_out_time = 0.5 SECONDS + +/atom/movable/screen/text/screen_text/command_order/tutorial/end_play() + if(!player) + qdel(src) + return + + if(player.mob || HAS_TRAIT(player.mob, TRAIT_IN_TUTORIAL)) + return ..() + + for(var/atom/movable/screen/text/screen_text/command_order/tutorial/tutorial_message in player.screen_texts) + LAZYREMOVE(player.screen_texts, tutorial_message) + qdel(tutorial_message) + + return ..() + ///proc for actually playing this screen_text on a mob. /atom/movable/screen/text/screen_text/proc/play_to_client() player?.add_to_screen(src) @@ -222,6 +242,10 @@ if(!QDELETED(src)) openToolTip(usr, src, params, title = name, content = desc, theme = alerttooltipstyle) +/atom/movable/screen/alert/MouseExited(location, control, params) + . = ..() + closeToolTip(usr) + /atom/movable/screen/alert/notify_action name = "Notification" desc = "A new notification. You can enter it." diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 430f959a7718..2c06d28de8bb 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -262,6 +262,9 @@ var/mob/living/carbon/human/human_target = target client.eye = human_target + observe_target_mob = human_target + RegisterSignal(observe_target_mob, COMSIG_PARENT_QDELETING, PROC_REF(clean_observe_target)) + RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(observer_move_react)) if(!human_target.hud_used) return @@ -290,19 +293,14 @@ break - observe_target_mob = human_target - 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 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) @@ -463,7 +461,7 @@ Works together with spawning an observer, noted above. ghost.langchat_make_image() SStgui.on_transfer(src, ghost) - if(is_admin_level((get_turf(src))?.z)) // Gibbed humans ghostize the brain in their head which itself is z 0 + if(should_block_game_interaction(src)) // Gibbed humans ghostize the brain in their head which itself is z 0 ghost.timeofdeath = 1 // Bypass respawn limit if you die on the admin zlevel ghost.key = key @@ -547,7 +545,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp msg_admin_niche("[key_name_admin(client)] has ghosted. [ADMIN_JMP(location)]") log_game("[key_name_admin(client)] has ghosted.") var/mob/dead/observer/ghost = ghostize((is_nested && nest && !QDELETED(nest))) //FALSE parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 - if(ghost && !is_admin_level(z)) + SEND_SIGNAL(src, COMSIG_LIVING_GHOSTED, ghost) + if(ghost && !should_block_game_interaction(src)) ghost.timeofdeath = world.time // Larva queue: We use the larger of their existing queue time or the new timeofdeath except for facehuggers or lesser drone @@ -1231,6 +1230,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(client.prefs?.be_special & BE_ALIEN_AFTER_DEATH) if(larva_queue_cached_message) . += larva_queue_cached_message + . += "" + + if(timeofdeath) + var/time_since_death = world.time - timeofdeath + var/format = (time_since_death >= 1 HOURS ? "hh:mm:ss" : "mm:ss") + + . += "Time Since Death: [time2text(time_since_death, format)]" /proc/message_ghosts(message) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index c66d096c6c68..dd71180e2dfe 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -202,18 +202,21 @@ /mob/living/hear_say(message, verb, datum/language/language, alt_name, italics, mob/speaker, sound/speech_sound, sound_vol) if(client && mind && stat == UNCONSCIOUS) - hear_sleep(src, message, src == speaker, Adjacent(speaker)) + hear_sleep(speaker, message, src == speaker, Adjacent(speaker), language) return return ..() /mob/living/hear_radio(message, verb, datum/language/language, part_a, part_b, mob/speaker, hard_to_hear, vname, command, no_paygrade) if(client && mind && stat == UNCONSCIOUS) - hear_sleep(src, message, FALSE, FALSE) + hear_sleep(speaker, message, FALSE, FALSE, language) return return ..() -/mob/living/proc/hear_sleep(mob/speaker = null, message, hearing_self = FALSE, proximity_flag = FALSE) +/mob/living/proc/hear_sleep(mob/speaker = null, message, hearing_self = FALSE, proximity_flag = FALSE, datum/language/language = null) var/heard = "" + var/clear_char_probability = 90 + if(!say_understands(speaker, language)) + clear_char_probability = 25 if(sdisabilities & DISABILITY_DEAF || ear_deaf) if(speaker == src) @@ -226,7 +229,7 @@ heard = SPAN_LOCALSAY("You mutter something about... [stars(message, clear_char_probability = 99)]") else if(!sleeping && proximity_flag) - heard = SPAN_LOCALSAY("You hear someone near you say something... [stars(message, clear_char_probability = 90)]") + heard = SPAN_LOCALSAY("You hear someone near you say something... [stars(message, clear_char_probability)]") else if(prob(15)) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index d71a908d627a..8a0f0f8aa1e9 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -347,13 +347,12 @@ W.forceMove(B) equipped = 1 if(WEAR_IN_SHOES) - if(!shoes) - return + // If the player isn't wearing shoes, or the shoes somehow aren't shoes. if(!istype(shoes, /obj/item/clothing/shoes)) return - if(shoes.stored_item) - return - shoes.attempt_insert_item(src, shoes, TRUE) + // If the item was successfully inserted. + if(shoes.attempt_insert_item(src, W)) + equipped = 1 // what is this proc if(WEAR_IN_SCABBARD) if(src.back && istype(src.back, /obj/item/storage/large_holster)) var/obj/item/storage/large_holster/B = src.back diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 5890a44f4168..af0da452d13e 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -75,14 +75,22 @@ // Finding the last guy for anti-delay. if(SSticker.mode && SSticker.mode.is_in_endgame && SSticker.current_state != GAME_STATE_FINISHED && is_mainship_level(z)) var/mob/last_living_human + var/shipside_humans_count = 0 + var/datum/hive_status/main_hive = GLOB.hive_datum[XENO_HIVE_NORMAL] + var/see_humans_on_tacmap = main_hive.see_humans_on_tacmap for(var/mob/living/carbon/human/cur_human as anything in GLOB.alive_human_list) if(!is_mainship_level(cur_human.z)) continue - if(last_living_human) + shipside_humans_count++ + if(last_living_human && see_humans_on_tacmap) last_living_human = null break last_living_human = cur_human - if(last_living_human && (GLOB.last_qm_callout + 2 MINUTES) < world.time) + + if(!see_humans_on_tacmap && shipside_humans_count < (main_hive.get_real_total_xeno_count() * HIJACK_RATIO_FOR_TACMAP)) + xeno_announcement("There is only a handful of tallhosts left, they are now visible on our hive mind map.", XENO_HIVE_NORMAL, SPAN_ANNOUNCEMENT_HEADER_BLUE("[QUEEN_MOTHER_ANNOUNCE]")) + main_hive.see_humans_on_tacmap = TRUE + if(last_living_human && shipside_humans_count <= 1 && (GLOB.last_qm_callout + 2 MINUTES) < world.time) GLOB.last_qm_callout = world.time // Tell the xenos where the human is. xeno_announcement("I sense the last tallhost hiding in [get_area(last_living_human)].", XENO_HIVE_NORMAL, SPAN_ANNOUNCEMENT_HEADER_BLUE("[QUEEN_MOTHER_ANNOUNCE]")) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 62fbd1da09fa..d116aa741d2f 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -129,7 +129,7 @@ if(gloves && !skipgloves) msg += "[t_He] [t_has] [gloves.get_examine_line(user)] [gloves.get_examine_location(src, user, WEAR_HANDS, t_He, t_his, t_him, t_has, t_is)].\n" else if(hands_blood_color) - msg += SPAN_WARNING("[t_He] [t_has] [(hands_blood_color != "#030303") ? "blood" : "oil"]-stained hands!\n") + msg += SPAN_WARNING("[t_He] [t_has] [(hands_blood_color != COLOR_OIL) ? "blood" : "oil"]-stained hands!\n") //belt if(belt) @@ -139,7 +139,7 @@ if(shoes && !skipshoes) msg += "[t_He] [t_is] wearing [shoes.get_examine_line(user)] [shoes.get_examine_location(src, user, WEAR_FEET, t_He, t_his, t_him, t_has, t_is)].\n" else if(feet_blood_color) - msg += SPAN_WARNING("[t_He] [t_has] [(feet_blood_color != "#030303") ? "blood" : "oil"]-stained feet!\n") + msg += SPAN_WARNING("[t_He] [t_has] [(feet_blood_color != COLOR_OIL) ? "blood" : "oil"]-stained feet!\n") //mask if(wear_mask && !skipmask) @@ -528,24 +528,24 @@ if(istype(passed_mob, /mob/living/carbon/human)) var/mob/living/carbon/human/passed_human = passed_mob if (issynth(passed_human)) - return 1 + return TRUE switch(hudtype) if("security") if(skillcheck(passed_human, SKILL_POLICE, SKILL_POLICE_SKILLED)) var/datum/mob_hud/sec_hud = GLOB.huds[MOB_HUD_SECURITY_ADVANCED] - if(locate(passed_mob) in sec_hud.hudusers) + if(sec_hud.hudusers[passed_human]) return TRUE if("medical") if(skillcheck(passed_human, SKILL_MEDICAL, SKILL_MEDICAL_MEDIC)) var/datum/mob_hud/med_hud = GLOB.huds[MOB_HUD_MEDICAL_ADVANCED] - if(locate(passed_mob) in med_hud.hudusers) + if(med_hud.hudusers[passed_human]) return TRUE if("squadleader") var/datum/mob_hud/faction_hud = GLOB.huds[MOB_HUD_FACTION_USCM] - if(passed_human.mind && passed_human.assigned_squad && passed_human.assigned_squad.squad_leader == passed_human && locate(passed_mob) in faction_hud.hudusers) + if(passed_human.mind && passed_human.assigned_squad && passed_human.assigned_squad.squad_leader == passed_human && faction_hud.hudusers[passed_mob]) return TRUE else - return 0 + return FALSE else if(isrobot(passed_mob)) var/mob/living/silicon/robot/R = passed_mob switch(hudtype) @@ -554,6 +554,6 @@ if("medical") return istype(R.module_state_1, /obj/item/robot/sight/hud/med) || istype(R.module_state_2, /obj/item/robot/sight/hud/med) || istype(R.module_state_3, /obj/item/robot/sight/hud/med) else - return 0 + return FALSE else - return 0 + return FALSE diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b523cef08eec..d2e0db929624 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1445,7 +1445,7 @@ /mob/living/carbon/human/verb/remove_your_splints() set name = "Remove Your Splints" - set category = "Object" + set category = "IC" remove_splints() @@ -1748,3 +1748,28 @@ // clamped to max 500 if(dizziness > 100 && !is_dizzy) INVOKE_ASYNC(src, PROC_REF(dizzy_process)) + +/proc/setup_human(mob/living/carbon/human/target, mob/new_player/new_player, is_late_join = FALSE) + new_player.spawning = TRUE + new_player.close_spawn_windows() + new_player.client.prefs.copy_all_to(target, new_player.job, is_late_join) + + if(new_player.client.prefs.be_random_body) + var/datum/preferences/rand_prefs = new() + rand_prefs.randomize_appearance(target) + + target.job = new_player.job + target.name = new_player.real_name + target.voice = new_player.real_name + + if(new_player.mind) + new_player.mind_initialize() + new_player.mind.transfer_to(target, TRUE) + new_player.mind.setup_human_stats() + + target.sec_hud_set_ID() + target.hud_set_squad() + + INVOKE_ASYNC(target, TYPE_PROC_REF(/mob/living/carbon/human, regenerate_icons)) + INVOKE_ASYNC(target, TYPE_PROC_REF(/mob/living/carbon/human, update_body), 1, 0) + INVOKE_ASYNC(target, TYPE_PROC_REF(/mob/living/carbon/human, update_hair)) diff --git a/code/modules/mob/living/carbon/human/human_abilities.dm b/code/modules/mob/living/carbon/human/human_abilities.dm index b5a401bc5649..a568e93df5c0 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 8f032288065b..f14b023b81da 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -4,9 +4,11 @@ if(..()) return TRUE + SEND_SIGNAL(attacking_mob, COMSIG_LIVING_ATTACKHAND_HUMAN, src) + if((attacking_mob != src) && check_shields(0, attacking_mob.name)) visible_message(SPAN_DANGER("[attacking_mob] attempted to touch [src]!"), null, null, 5) - return 0 + return FALSE switch(attacking_mob.a_intent) if(INTENT_HELP) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index e09e9e2ebb7b..cebbbd6086bb 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,7 +307,7 @@ 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 diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index dd25a13538af..9ec9d0b05ec5 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -66,8 +66,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. diff --git a/code/modules/mob/living/carbon/human/human_dummy.dm b/code/modules/mob/living/carbon/human/human_dummy.dm index 061ac3cea05f..1f90c618fd38 100644 --- a/code/modules/mob/living/carbon/human/human_dummy.dm +++ b/code/modules/mob/living/carbon/human/human_dummy.dm @@ -73,3 +73,12 @@ GLOBAL_LIST_EMPTY(dummy_mob_list) /mob/living/carbon/human/dummy/add_to_all_mob_huds() return + + +/mob/living/carbon/human/dummy/tutorial // Effectively an even more disabled dummy + +/mob/living/carbon/human/dummy/tutorial/Initialize(mapload) + . = ..() + status_flags = GODMODE + ADD_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_SOURCE_TUTORIAL) + anchored = TRUE diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index b54f03e2ce7d..3d372376d1e7 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -354,8 +354,7 @@ current_storage.attempt_item_insertion(equipping_item, disable_warning, src) back.update_icon() if(WEAR_IN_SHOES) - shoes.attempt_insert_item(src, equipping_item, TRUE) - shoes.update_icon() + shoes.attempt_insert_item(src, equipping_item) if(WEAR_IN_SCABBARD) var/obj/item/storage/current_storage = back current_storage.attempt_item_insertion(equipping_item, disable_warning, src) @@ -495,7 +494,8 @@ /// Multiplier for how quickly the user can strip things. var/user_speed = user.get_skill_duration_multiplier(SKILL_CQC) /// The total skill level of CQC & Police - var/target_skills = (target.skills.get_skill_level(SKILL_CQC) + target.skills.get_skill_level(SKILL_POLICE)) + var/target_skills = 0 + target_skills += (target.skills?.get_skill_level(SKILL_CQC) + target.skills?.get_skill_level(SKILL_POLICE)) /// Delay then gets + 0.5s per skill level, so long as not dead or cuffed. if(!(target.stat || target.handcuffed)) @@ -571,5 +571,3 @@ /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/handle_disabilities.dm b/code/modules/mob/living/carbon/human/life/handle_disabilities.dm index 77358ca45b89..2d7498f53167 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 5d706518f5e3..b84c8e9d24c2 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 e9bb307d7335..5b37238d28ab 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 @@ -58,7 +58,6 @@ 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/life_helpers.dm b/code/modules/mob/living/carbon/human/life/life_helpers.dm index bf254b9da1ed..cab3ae21a782 100644 --- a/code/modules/mob/living/carbon/human/life/life_helpers.dm +++ b/code/modules/mob/living/carbon/human/life/life_helpers.dm @@ -187,31 +187,6 @@ 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_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_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 /mob/living/carbon/human/GetStunDuration(amount) @@ -232,6 +207,13 @@ 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 + + /mob/living/carbon/human/proc/handle_revive() SEND_SIGNAL(src, COMSIG_HUMAN_REVIVED) track_revive(job) diff --git a/code/modules/mob/living/carbon/human/powers/human_powers.dm b/code/modules/mob/living/carbon/human/powers/human_powers.dm index be7848b2a936..36eb927eb7fb 100644 --- a/code/modules/mob/living/carbon/human/powers/human_powers.dm +++ b/code/modules/mob/living/carbon/human/powers/human_powers.dm @@ -202,7 +202,7 @@ if(new_resting == resting) return if(!COOLDOWN_FINISHED(src, rest_cooldown)) - to_chat(src, SPAN_WARNING("You can't 'rest' that fast. Take a breather!")) + to_chat(src, SPAN_WARNING("[isxeno(src) ? "We" : "You"] can't 'rest' that fast. Take a breather!")) return COOLDOWN_START(src, rest_cooldown, 1 SECONDS) @@ -211,24 +211,24 @@ if(new_resting) if(body_position == LYING_DOWN) if(!silent) - to_chat(src, SPAN_NOTICE("You will now try to stay lying down on the floor.")) + to_chat(src, SPAN_NOTICE("[isxeno(src) ? "We" : "You"] will now try to stay lying down on the floor.")) else if(HAS_TRAIT(src, TRAIT_FORCED_STANDING) || (buckled && buckled.buckle_lying != NO_BUCKLE_LYING)) if(!silent) - to_chat(src, SPAN_NOTICE("You will now lay down as soon as you are able to.")) + to_chat(src, SPAN_NOTICE("[isxeno(src) ? "We" : "You"] will now lay down as soon as [isxeno(src) ? "we" : "you"] are able to.")) else if(!silent) - to_chat(src, SPAN_NOTICE("You lay down.")) + to_chat(src, SPAN_NOTICE("[isxeno(src) ? "We" : "You"] lay down.")) set_lying_down() else if(body_position == STANDING_UP) if(!silent) - to_chat(src, SPAN_NOTICE("You will now try to remain standing up.")) + to_chat(src, SPAN_NOTICE("[isxeno(src) ? "We" : "You"] will now try to remain standing up.")) else if(HAS_TRAIT(src, TRAIT_FLOORED) || (buckled && buckled.buckle_lying != NO_BUCKLE_LYING)) if(!silent) - to_chat(src, SPAN_NOTICE("You will now stand up as soon as you are able to.")) + to_chat(src, SPAN_NOTICE("[isxeno(src) ? "We" : "You"] will now stand up as soon as [isxeno(src) ? "we" : "you"] are able to.")) else if(!silent) - to_chat(src, SPAN_NOTICE("You stand up.")) + to_chat(src, SPAN_NOTICE("[isxeno(src) ? "We" : "You"] stand up.")) get_up(instant) // SEND_SIGNAL(src, COMSIG_LIVING_RESTING, new_resting, silent, instant) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index b31604d2cdd6..e8702e56c05f 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/yautja/_species.dm b/code/modules/mob/living/carbon/human/species/yautja/_species.dm index f8937279d8b9..f871bfe02407 100644 --- a/code/modules/mob/living/carbon/human/species/yautja/_species.dm +++ b/code/modules/mob/living/carbon/human/species/yautja/_species.dm @@ -53,8 +53,8 @@ /mob/living/carbon/human/proc/mark_panel, ) - knock_down_reduction = 4 - stun_reduction = 4 + knock_down_reduction = 1.5 + stun_reduction = 1.5 weed_slowdown_mult = 0 // no slowdown! icobase = 'icons/mob/humans/species/r_predator.dmi' @@ -211,7 +211,10 @@ limb.time_to_knit = 600 // 1 minute to self heal bone break, time is in tenths of a second hunter.set_languages(list(LANGUAGE_YAUTJA)) + give_action(hunter, /datum/action/predator_action/claim_equipment) give_action(hunter, /datum/action/yautja_emote_panel) + give_action(hunter, /datum/action/predator_action/mark_for_hunt) + give_action(hunter, /datum/action/predator_action/mark_panel) return ..() /datum/species/yautja/get_hairstyle(style) @@ -228,100 +231,3 @@ /datum/species/yautja/open_emote_panel() var/datum/yautja_emote_panel/ui = new(usr) ui.ui_interact(usr) - -/datum/action/yautja_emote_panel - name = "Open Emote Panel" - action_icon_state = "looc_toggle" - -/datum/action/yautja_emote_panel/can_use_action() - . = ..() - if(!.) - return FALSE - - if(!isyautja(owner)) - return FALSE - - return TRUE - -/datum/action/yautja_emote_panel/action_activate() - if(!can_use_action()) - return - - var/mob/living/carbon/human/human_owner = owner - var/datum/species/yautja/yautja_species = human_owner.species - yautja_species.open_emote_panel() - -/datum/yautja_emote_panel - /// Static dict ("category" : (emotes)) of every yautja emote typepath - var/static/list/yautja_emotes - /// Static list of categories - var/static/list/yautja_categories = list() - /// Panel allows you to spam, so a manual CD is added here - COOLDOWN_DECLARE(panel_emote_cooldown) - -/datum/yautja_emote_panel/New() - if(!length(yautja_emotes)) - var/list/emotes_to_add = list() - for(var/datum/emote/living/carbon/human/yautja/emote as anything in subtypesof(/datum/emote/living/carbon/human/yautja)) - if(!initial(emote.key) || initial(emote.no_panel)) - continue - - if(!(initial(emote.category) in yautja_categories)) - yautja_categories += initial(emote.category) - emotes_to_add += emote - yautja_emotes = emotes_to_add - -/datum/yautja_emote_panel/proc/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "YautjaEmotes") - ui.open() - -/datum/yautja_emote_panel/ui_data(mob/user) - var/list/data = list() - - data["on_cooldown"] = !COOLDOWN_FINISHED(src, panel_emote_cooldown) - - return data - -/datum/yautja_emote_panel/ui_state(mob/user) - return GLOB.conscious_state - -/datum/yautja_emote_panel/ui_static_data(mob/user) - var/list/data = list() - - data["categories"] = yautja_categories - data["emotes"] = list() - - for(var/datum/emote/living/carbon/human/yautja/emote as anything in yautja_emotes) - data["emotes"] += list(list( - "id" = initial(emote.key), - "text" = (initial(emote.override_say) || initial(emote.say_message) || initial(emote.key)), - "category" = initial(emote.category), - "path" = "[emote]", - )) - - return data - -/datum/yautja_emote_panel/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - - switch(action) - if("emote") - var/datum/emote/living/carbon/human/yautja/path - if(!params["emotePath"]) - return FALSE - - path = text2path(params["emotePath"]) - - if(!path || !COOLDOWN_FINISHED(src, panel_emote_cooldown)) - return - - if(!(path in subtypesof(/datum/emote/living/carbon/human/yautja))) - return FALSE - - COOLDOWN_START(src, panel_emote_cooldown, 2.5 SECONDS) - usr.emote(initial(path.key)) - return TRUE diff --git a/code/modules/mob/living/carbon/human/species/zombie.dm b/code/modules/mob/living/carbon/human/species/zombie.dm index 76b1c3928659..f5db0c1b8728 100644 --- a/code/modules/mob/living/carbon/human/species/zombie.dm +++ b/code/modules/mob/living/carbon/human/species/zombie.dm @@ -59,10 +59,10 @@ zombie.equip_to_slot_or_del(new /obj/item/weapon/zombie_claws(zombie), WEAR_L_HAND, TRUE) zombie.equip_to_slot_or_del(new /obj/item/clothing/glasses/zombie_eyes(zombie), WEAR_EYES, TRUE) - var/datum/disease/black_goo/D = locate() in zombie.viruses - if(!D) - D = zombie.AddDisease(new /datum/disease/black_goo()) - D.stage = 5 + var/datum/disease/black_goo/zombie_infection = locate() in zombie.viruses + if(!zombie_infection) + zombie_infection = zombie.AddDisease(new /datum/disease/black_goo()) + zombie_infection.stage = 3 var/datum/mob_hud/Hu = GLOB.huds[MOB_HUD_MEDICAL_OBSERVER] Hu.add_hud_to(zombie, zombie) @@ -70,6 +70,7 @@ return ..() + /datum/species/zombie/post_species_loss(mob/living/carbon/human/zombie) ..() remove_from_revive(zombie) diff --git a/code/modules/mob/living/carbon/xenomorph/Abilities.dm b/code/modules/mob/living/carbon/xenomorph/Abilities.dm index dc44260187a7..5c8dcb9a2032 100644 --- a/code/modules/mob/living/carbon/xenomorph/Abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/Abilities.dm @@ -323,21 +323,6 @@ return return ..() -/datum/action/xeno_action/onclick/queen_award - name = "Give Royal Jelly (500)" - action_icon_state = "queen_award" - plasma_cost = 500 - -/datum/action/xeno_action/onclick/queen_award/use_ability(atom/target) - var/mob/living/carbon/xenomorph/queen/xeno = owner - if(!xeno.check_state()) - return - if(!xeno.check_plasma(plasma_cost)) - return - if(give_jelly_award(xeno.hive)) - xeno.use_plasma(plasma_cost) - return ..() - /datum/action/xeno_action/onclick/queen_word name = "Word of the Queen (50)" action_icon_state = "queen_word" diff --git a/code/modules/mob/living/carbon/xenomorph/Embryo.dm b/code/modules/mob/living/carbon/xenomorph/Embryo.dm index e799c21d3f20..9a1dfcb0e9a5 100644 --- a/code/modules/mob/living/carbon/xenomorph/Embryo.dm +++ b/code/modules/mob/living/carbon/xenomorph/Embryo.dm @@ -160,7 +160,7 @@ /obj/item/alien_embryo/proc/become_larva() // We do not allow chest bursts on the Centcomm Z-level, to prevent // stranded players from admin experiments and other issues - if(!affected_mob || is_admin_level(affected_mob.z)) + if(!affected_mob || should_block_game_interaction(affected_mob)) return stage = 6 // Increase the stage value to prevent this proc getting repeated diff --git a/code/modules/mob/living/carbon/xenomorph/Evolution.dm b/code/modules/mob/living/carbon/xenomorph/Evolution.dm index a2ade5cd0512..d6f963747e33 100644 --- a/code/modules/mob/living/carbon/xenomorph/Evolution.dm +++ b/code/modules/mob/living/carbon/xenomorph/Evolution.dm @@ -143,7 +143,7 @@ return var/area/xeno_area = get_area(new_xeno) - if(!is_admin_level(new_xeno.z) || (xeno_area.flags_atom & AREA_ALLOW_XENO_JOIN)) + if(!should_block_game_interaction(new_xeno) || (xeno_area.flags_atom & AREA_ALLOW_XENO_JOIN)) switch(new_xeno.tier) //They have evolved, add them to the slot count IF they are in regular game space if(2) hive.tier_2_xenos |= new_xeno diff --git a/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm b/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm index 3160c5e20bc7..0b0efbc0f34f 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm @@ -43,12 +43,12 @@ var/list/possible_xenos = list() for(var/mob/living/carbon/xenomorph/T in GLOB.living_xeno_list) - if (T != X && !is_admin_level(T.z) && X.hivenumber == T.hivenumber) // Can't overwatch yourself, Xenos in Thunderdome, or Xenos in other hives + if (T != X && !should_block_game_interaction(T) && X.hivenumber == T.hivenumber) // Can't overwatch yourself, Xenos in Thunderdome, or Xenos in other hives possible_xenos += T var/mob/living/carbon/xenomorph/selected_xeno = tgui_input_list(X, "Target", "Watch which xenomorph?", possible_xenos, theme="hive_status") - if (!selected_xeno || QDELETED(selected_xeno) || selected_xeno == X.observed_xeno || selected_xeno.stat == DEAD || is_admin_level(selected_xeno.z) || !X.check_state(TRUE)) + if (!selected_xeno || QDELETED(selected_xeno) || selected_xeno == X.observed_xeno || selected_xeno.stat == DEAD || should_block_game_interaction(selected_xeno) || !X.check_state(TRUE)) X.overwatch(X.observed_xeno, TRUE) // Cancel OW else if (!isQueen) // Regular Xeno OW vs Queen X.overwatch(selected_xeno) @@ -177,7 +177,7 @@ var/mob/living/carbon/xenomorph/xenoTarget = locate(href_list[XENO_OVERWATCH_TARGET_HREF]) in GLOB.living_xeno_list var/mob/living/carbon/xenomorph/xenoSrc = locate(href_list[XENO_OVERWATCH_SRC_HREF]) in GLOB.living_xeno_list - if(!istype(xenoTarget) || xenoTarget.stat == DEAD || is_admin_level(xenoTarget.z)) + if(!istype(xenoTarget) || xenoTarget.stat == DEAD || should_block_game_interaction(xenoTarget)) return if(!istype(xenoSrc) || xenoSrc.stat == DEAD) diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm index e54383a07b9d..3f83451a6386 100644 --- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm +++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm @@ -114,10 +114,6 @@ var/crit_grace_time = 1 SECONDS var/next_grace_time = 0 - //Amount of construction resources stored internally - var/crystal_stored = 0 - var/crystal_max = 0 - var/evasion = 0 // RNG "Armor" // Armor @@ -252,7 +248,6 @@ var/pounce_distance = 0 // Life reduction variables. - var/life_daze_reduction = -1.5 var/life_slow_reduction = -1.5 ////////////////////////////////////////////////////////////////// @@ -436,6 +431,9 @@ if(mob_size < MOB_SIZE_BIG) mob_flags |= SQUEEZE_UNDER_VEHICLES + GLOB.living_xeno_list += src + GLOB.xeno_mob_list += src + // More setup stuff for names, abilities etc update_icon_source() generate_name() @@ -457,9 +455,6 @@ //Begin SStracking SStracking.start_tracking("hive_[src.hivenumber]", src) - GLOB.living_xeno_list += src - GLOB.xeno_mob_list += src - //WO GAMEMODE if(SSticker?.mode?.hardcore) hardcore = 1 //Prevents healing and queen evolution @@ -480,7 +475,7 @@ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE // Only handle free slots if the xeno is not in tdome - if(hive && !is_admin_level(z)) + if(hive && !should_block_game_interaction(src)) var/selected_caste = GLOB.xeno_datum_list[caste_type]?.type hive.used_slots[selected_caste]++ @@ -735,8 +730,6 @@ if(!isliving(AM)) return FALSE var/mob/living/L = AM - if(issynth(L) && L.health < 0) // no pulling critted or dead synths - return FALSE if(L.buckled) return FALSE //to stop xeno from pulling marines on roller beds. if(!L.is_xeno_grabbable()) @@ -847,7 +840,6 @@ /mob/living/carbon/xenomorph/proc/recalculate_stats() recalculate_health() recalculate_plasma() - recalculate_stockpile() recalculate_speed() recalculate_armor() recalculate_damage() @@ -887,11 +879,6 @@ if(plasma_stored > plasma_max) plasma_stored = plasma_max -/mob/living/carbon/xenomorph/proc/recalculate_stockpile() - crystal_max = caste.crystal_max - if(crystal_stored > crystal_max) - crystal_stored = crystal_max - /mob/living/carbon/xenomorph/proc/recalculate_speed() recalculate_move_delay = TRUE speed = speed_modifier @@ -1052,7 +1039,7 @@ /mob/living/carbon/xenomorph/ghostize(can_reenter_corpse = TRUE, aghosted = FALSE) . = ..() - if(. && !can_reenter_corpse && stat != DEAD && !QDELETED(src) && !is_admin_level(z)) + if(. && !can_reenter_corpse && stat != DEAD && !QDELETED(src) && !should_block_game_interaction(src)) handle_ghost_message() /mob/living/carbon/xenomorph/proc/handle_ghost_message() diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm index 7f3d886deb3a..68312b77936d 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm @@ -31,7 +31,6 @@ if(isobj(O)) I = O - wait_time = I.get_applying_acid_time() if(wait_time == -1) to_chat(src, SPAN_WARNING("We cannot dissolve \the [I].")) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/carrier/carrier_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/carrier/carrier_powers.dm index 28d025869646..dae095f8630f 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/carrier/carrier_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/carrier/carrier_powers.dm @@ -10,6 +10,10 @@ /datum/action/xeno_action/onclick/set_hugger_reserve/use_ability(atom/Atom) var/mob/living/carbon/xenomorph/carrier/carrier = owner - carrier.huggers_reserved = tgui_input_number(usr, "How many facehuggers would you like to keep safe from Observers wanting to join as facehuggers?", "How many to reserve?", 0, carrier.huggers_max, carrier.huggers_reserved) + carrier.huggers_reserved = tgui_input_number(usr, + "How many facehuggers would you like to keep safe from Observers wanting to join as facehuggers?", + "How many to reserve?", + carrier.huggers_reserved, carrier.huggers_max, 0 + ) to_chat(carrier, SPAN_XENONOTICE("We reserve [carrier.huggers_reserved] facehuggers for ourself.")) return ..() diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_powers.dm index 0cb803e67b96..ef084c9b5b59 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_powers.dm @@ -85,20 +85,12 @@ var/facing = get_dir(fendy, carbone) var/headbutt_distance = 1 + (fendy.crest_defense * 2) + (fendy.fortify * 2) - var/turf/thrown_turf = get_turf(fendy) - var/turf/temp = get_turf(fendy) - - for(var/x in 0 to headbutt_distance) - temp = get_step(thrown_turf, facing) - if(!temp) - break - thrown_turf = temp // Hmm today I will kill a marine while looking away from them fendy.face_atom(carbone) fendy.animation_attack_on(carbone) fendy.flick_attack_overlay(carbone, "punch") - carbone.throw_atom(thrown_turf, headbutt_distance, SPEED_SLOW, src) + fendy.throw_carbon(carbone, facing, headbutt_distance, SPEED_SLOW, shake_camera = FALSE, immobilize = FALSE) playsound(carbone,'sound/weapons/alien_claw_block.ogg', 50, 1) apply_cooldown() return ..() 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 f57bd7990293..63cc4cb93431 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm @@ -512,7 +512,7 @@ /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) + if(!QDELETED(source) && (new_stat >= UNCONSCIOUS && old_stat <= UNCONSCIOUS)) post_attack() /datum/action/xeno_action/onclick/place_trap/use_ability(atom/A) @@ -638,7 +638,7 @@ if(!choice) return if(choice == "help") - var/message = "Placing a construction node creates a template for special structures that can benefit the hive, which require the insertion of [MATERIAL_CRYSTAL] to construct the following:
" + var/message = "Placing a construction node creates a template for special structures that can benefit the hive, which require the insertion of plasma to construct the following:
" for(var/structure_name in X.hive.hive_structure_types) var/datum/construction_template/xenomorph/structure_type = X.hive.hive_structure_types[structure_name] message += "[capitalize_first_letters(structure_name)] - [initial(structure_type.description)]
" diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm index a6e79401c9bd..966e9ce84309 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm @@ -326,6 +326,8 @@ else if (LAZYLEN(targets) >= 3) xeno.balloon_alert(xeno, "our tail catches and stuns [LAZYLEN(targets)] targets!", text_color = "#51a16c") + apply_cooldown() + for (var/mob/living/carbon/target in targets) xeno.visible_message(SPAN_XENODANGER("\The [xeno]'s hooked tail coils itself around [target]!"), SPAN_XENODANGER("Our hooked tail coils itself around [target]!")) @@ -359,7 +361,6 @@ qdel(tail_beam) // hook beam catches target, throws them back, is deleted (throw_atom has sleeps), then hook beam catches another target, repeat addtimer(CALLBACK(src, /datum/action/xeno_action/activable/prae_abduct/proc/remove_tail_overlay, target, tail_image), 0.5 SECONDS) //needed so it can actually be seen as it gets deleted too quickly otherwise. - apply_cooldown() return ..() /datum/action/xeno_action/activable/prae_abduct/proc/remove_tail_overlay(mob/living/carbon/human/overlayed_human, image/tail_image) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/queen/queen_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/queen/queen_abilities.dm index 50fa9fd92b2c..d245449fa2cf 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/queen/queen_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/queen/queen_abilities.dm @@ -1,8 +1,3 @@ -/datum/action/xeno_action/onclick/deevolve - name = "De-Evolve a Xenomorph (500)" - action_icon_state = "xeno_deevolve" - plasma_cost = 500 - /datum/action/xeno_action/onclick/remove_eggsac name = "Remove Eggsac" action_icon_state = "grow_ovipositor" @@ -45,23 +40,10 @@ var/node_plant_plasma_cost = 300 var/turf_build_cooldown = 7 SECONDS -/datum/action/xeno_action/onclick/give_evo_points - name = "Trade Larva for Evolution Points (100)" - action_icon_state = "queen_give_evo_points" - plasma_cost = 100 - xeno_cooldown = 60 SECONDS - var/evo_points_per_larva = 250 - var/required_larva = 3 - -/datum/action/xeno_action/onclick/banish - name = "Banish a Xenomorph (500)" - action_icon_state = "xeno_banish" - plasma_cost = 500 - -/datum/action/xeno_action/onclick/readmit - name = "Readmit a Xenomorph (100)" +/datum/action/xeno_action/onclick/manage_hive + name = "Manage The Hive" action_icon_state = "xeno_readmit" - plasma_cost = 100 + plasma_cost = 0 /datum/action/xeno_action/activable/secrete_resin/remote/queen name = "Projected Resin (100)" diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/queen/queen_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/queen/queen_powers.dm index 917a7b1c9af7..cbbc6ae21013 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/queen/queen_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/queen/queen_powers.dm @@ -1,6 +1,7 @@ // devolve a xeno - lots of old, vaguely shitty code here -/datum/action/xeno_action/onclick/deevolve/use_ability(atom/Atom) +/datum/action/xeno_action/onclick/manage_hive/proc/de_evolve_other() var/mob/living/carbon/xenomorph/queen/user_xeno = owner + var/plasma_cost_devolve = 500 if(!user_xeno.check_state()) return if(!user_xeno.observed_xeno) @@ -8,7 +9,7 @@ return var/mob/living/carbon/xenomorph/target_xeno = user_xeno.observed_xeno - if(!user_xeno.check_plasma(plasma_cost)) + if(!user_xeno.check_plasma(plasma_cost_devolve)) return if(target_xeno.hivenumber != user_xeno.hivenumber) @@ -130,7 +131,7 @@ SSround_recording.recorder.stop_tracking(target_xeno) SSround_recording.recorder.track_player(new_xeno) qdel(target_xeno) - return ..() + return /datum/action/xeno_action/onclick/remove_eggsac/use_ability(atom/A) var/mob/living/carbon/xenomorph/queen/X = owner @@ -292,12 +293,15 @@ to_chat(X, SPAN_XENONOTICE("You channel your plasma to heal your sisters' wounds around this area.")) return ..() -/datum/action/xeno_action/onclick/give_evo_points/use_ability(atom/Atom) +/datum/action/xeno_action/onclick/manage_hive/proc/give_evo_points() var/mob/living/carbon/xenomorph/queen/user_xeno = owner + var/plasma_cost_givepoints = 100 + + if(!user_xeno.check_state()) return - if(!user_xeno.check_plasma(plasma_cost)) + if(!user_xeno.check_plasma(plasma_cost_givepoints)) return if(world.time < SSticker.mode.round_time_lobby + SHUTTLE_TIME_LOCK) @@ -308,7 +312,8 @@ if(!choice) return - + var/evo_points_per_larva = 250 + var/required_larva = 3 var/mob/living/carbon/xenomorph/target_xeno for(var/mob/living/carbon/xenomorph/xeno in user_xeno.hive.totalXenos) @@ -351,14 +356,45 @@ target_xeno.evolution_stored += evo_points_per_larva user_xeno.hive.stored_larva-- - return ..() + return + + + +/datum/action/xeno_action/onclick/manage_hive/proc/give_jelly_reward() + var/mob/living/carbon/xenomorph/queen/xeno = owner + var/plasma_cost_jelly = 500 + if(!xeno.check_state()) + return + if(!xeno.check_plasma(plasma_cost_jelly)) + return + if(give_jelly_award(xeno.hive)) + xeno.use_plasma(plasma_cost_jelly) + return +/datum/action/xeno_action/onclick/manage_hive/use_ability(atom/Atom) + var/mob/living/carbon/xenomorph/queen/queenbanish = owner + plasma_cost = 0 -/datum/action/xeno_action/onclick/banish/use_ability(atom/Atom) + var/choice = tgui_input_list(queenbanish, "Manage The Hive", "Hive Management", list("Banish (500)", "Re-Admit (100)", "De-evolve (500)", "Reward Jelly (500)", "Exchange larva for evolution (100)",), theme="hive_status") + switch(choice) + if("Banish (500)") + banish() + if("Re-Admit (100)") + readmit() + if("De-evolve (500)") + de_evolve_other() + if("Reward Jelly (500)") + give_jelly_reward(queenbanish.hive) + if("Exchange larva for evolution (100)") + give_evo_points() + + +/datum/action/xeno_action/onclick/manage_hive/proc/banish() var/mob/living/carbon/xenomorph/queen/user_xeno = owner + var/plasma_cost_banish = 500 if(!user_xeno.check_state()) return - if(!user_xeno.check_plasma(plasma_cost)) + if(!user_xeno.check_plasma(plasma_cost_banish)) return var/choice = tgui_input_list(user_xeno, "Choose a xenomorph to banish:", "Banish", user_xeno.hive.totalXenos, theme="hive_status") @@ -399,7 +435,7 @@ to_chat(user_xeno, SPAN_XENOWARNING("You must provide a reason for banishing [target_xeno].")) return - if(!user_xeno.check_state() || !check_and_use_plasma_owner(plasma_cost) || target_xeno.health < 0) + if(!user_xeno.check_state() || !check_and_use_plasma_owner(plasma_cost_banish) || target_xeno.health < 0) return // Let everyone know they were banished @@ -413,20 +449,21 @@ addtimer(CALLBACK(src, PROC_REF(remove_banish), user_xeno.hive, target_xeno.name), 30 MINUTES) message_admins("[key_name_admin(user_xeno)] has banished [key_name_admin(target_xeno)]. Reason: [reason]") - return ..() + return -/datum/action/xeno_action/onclick/banish/proc/remove_banish(datum/hive_status/hive, name) +/datum/action/xeno_action/proc/remove_banish(datum/hive_status/hive, name) hive.banished_ckeys.Remove(name) // Readmission = un-banish -/datum/action/xeno_action/onclick/readmit/use_ability(atom/Atom) +/datum/action/xeno_action/onclick/manage_hive/proc/readmit() var/mob/living/carbon/xenomorph/queen/user_xeno = owner + var/plasma_cost_readmit = 100 if(!user_xeno.check_state()) return - if(!user_xeno.check_plasma(plasma_cost)) + if(!user_xeno.check_plasma(plasma_cost_readmit)) return var/choice = tgui_input_list(user_xeno, "Choose a xenomorph to readmit:", "Re-admit", user_xeno.hive.banished_ckeys, theme="hive_status") @@ -470,7 +507,7 @@ target_xeno.lock_evolve = FALSE user_xeno.hive.banished_ckeys.Remove(banished_name) - return ..() + return /datum/action/xeno_action/onclick/eye name = "Enter Eye Form" 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 c70c3cae6cd3..3ec07014b2d1 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 @@ -132,16 +132,8 @@ human.attack_alien(xeno, rand(xeno.melee_damage_lower, xeno.melee_damage_upper)) var/facing = get_dir(xeno, human) - var/turf/turf = xeno.loc - var/turf/temp = xeno.loc - - for(var/step in 0 to behavior.fling_distance-1) - temp = get_step(turf, facing) - if (!temp) - break - turf = temp - human.throw_atom(turf, behavior.fling_distance, SPEED_VERY_FAST, xeno, TRUE) + xeno.throw_carbon(human, facing, behavior.fling_distance, SPEED_VERY_FAST, shake_camera = FALSE, immobilize = TRUE) /datum/action/xeno_action/activable/scissor_cut/use_ability(atom/target_atom) var/mob/living/carbon/xenomorph/ravager_user = owner @@ -348,7 +340,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/spitter/spitter_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/spitter/spitter_powers.dm index 1385eb1cf668..c6ba00d9a3bb 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/spitter/spitter_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/spitter/spitter_powers.dm @@ -23,6 +23,7 @@ zenomorf.speed_modifier -= speed_buff_amount zenomorf.armor_modifier += armor_buff_amount zenomorf.recalculate_speed() + zenomorf.recalculate_armor() /// Though the ability's other buffs are supposed to last for its duration, it's only supposed to enhance one spit. RegisterSignal(zenomorf, COMSIG_XENO_POST_SPIT, PROC_REF(disable_spatter)) @@ -50,6 +51,7 @@ zenomorf.speed_modifier += speed_buff_amount zenomorf.armor_modifier -= armor_buff_amount zenomorf.recalculate_speed() + zenomorf.recalculate_armor() to_chat(zenomorf, SPAN_XENOHIGHDANGER("We feel our movement speed slow down!")) disable_spatter() buffs_active = FALSE 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 be550e50f0e2..bbb4a584e2a5 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 @@ -86,23 +86,14 @@ if(carbon.slowed < slowdown) carbon.apply_effect(slowdown, SLOW) carbon.last_damage_data = create_cause_data(initial(xeno.caste_type), xeno) - shake_camera(carbon, 2, 1) var/facing = get_dir(xeno, carbon) - var/turf/throw_turf = xeno.loc - var/turf/temp = xeno.loc - - for (var/step in 0 to fling_distance-1) - temp = get_step(throw_turf, facing) - if (!temp) - break - throw_turf = temp // Hmm today I will kill a marine while looking away from them xeno.face_atom(carbon) xeno.animation_attack_on(carbon) xeno.flick_attack_overlay(carbon, "disarm") - carbon.throw_atom(throw_turf, fling_distance, SPEED_VERY_FAST, xeno, TRUE) + xeno.throw_carbon(carbon, facing, fling_distance, SPEED_VERY_FAST, shake_camera = TRUE, immobilize = TRUE) apply_cooldown() return ..() 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 0ed15debb963..ca15c6e37306 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/xeno_action.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/xeno_action.dm @@ -71,7 +71,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/L) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Burrower.dm b/code/modules/mob/living/carbon/xenomorph/castes/Burrower.dm index 69a498184fa3..886ffcfe1ef2 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Burrower.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Burrower.dm @@ -9,7 +9,6 @@ max_health = XENO_HEALTH_TIER_6 plasma_gain = XENO_PLASMA_GAIN_TIER_8 plasma_max = XENO_PLASMA_TIER_6 - crystal_max = XENO_CRYSTAL_LOW xeno_explosion_resistance = XENO_EXPLOSIVE_ARMOR_TIER_4 armor_deflection = XENO_ARMOR_TIER_2 evasion = XENO_EVASION_NONE diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Carrier.dm b/code/modules/mob/living/carbon/xenomorph/castes/Carrier.dm index cf3acb890e4d..2e106743514a 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Carrier.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Carrier.dm @@ -9,7 +9,6 @@ max_health = XENO_HEALTH_TIER_9 plasma_gain = XENO_PLASMA_GAIN_TIER_6 plasma_max = XENO_PLASMA_TIER_5 - crystal_max = XENO_CRYSTAL_LOW xeno_explosion_resistance = XENO_EXPLOSIVE_ARMOR_TIER_2 armor_deflection = XENO_NO_ARMOR evasion = XENO_EVASION_NONE diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Drone.dm b/code/modules/mob/living/carbon/xenomorph/castes/Drone.dm index 77992b33a52b..c4c9b11b37e4 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Drone.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Drone.dm @@ -7,7 +7,6 @@ max_health = XENO_HEALTH_TIER_6 plasma_gain = XENO_PLASMA_GAIN_TIER_8 plasma_max = XENO_PLASMA_TIER_10 - crystal_max = XENO_CRYSTAL_LOW xeno_explosion_resistance = XENO_NO_EXPLOSIVE_ARMOR armor_deflection = XENO_NO_ARMOR evasion = XENO_EVASION_MEDIUM @@ -74,7 +73,11 @@ icon_xeno = 'icons/mob/xenos/drone.dmi' icon_xenonid = 'icons/mob/xenonids/drone.dmi' - weed_food_icon = 'icons/mob/xenos/weeds_48x48.dmi' weed_food_states = list("Drone_1","Drone_2","Drone_3") weed_food_states_flipped = list("Drone_1","Drone_2","Drone_3") + +/mob/living/carbon/xenomorph/drone/tutorial + +/mob/living/carbon/xenomorph/drone/tutorial/gib(datum/cause_data/cause = create_cause_data("gibbing", src)) + death(cause, 1) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Hivelord.dm b/code/modules/mob/living/carbon/xenomorph/castes/Hivelord.dm index 9c062bf779fd..b00ec2a9c1eb 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Hivelord.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Hivelord.dm @@ -8,7 +8,6 @@ max_health = XENO_HEALTH_TIER_7 plasma_gain = XENO_PLASMA_GAIN_TIER_10 plasma_max = XENO_PLASMA_TIER_10 - crystal_max = XENO_CRYSTAL_HIGH xeno_explosion_resistance = XENO_EXPLOSIVE_ARMOR_TIER_1 armor_deflection = XENO_NO_ARMOR evasion = XENO_EVASION_NONE diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm index 7e5d6ea4efb3..f847c1a4ac8a 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm @@ -12,7 +12,6 @@ max_health = XENO_HEALTH_QUEEN plasma_gain = XENO_PLASMA_GAIN_TIER_7 plasma_max = XENO_PLASMA_TIER_10 - crystal_max = XENO_CRYSTAL_MEDIUM xeno_explosion_resistance = XENO_EXPLOSIVE_ARMOR_TIER_10 armor_deflection = XENO_ARMOR_TIER_2 evasion = XENO_EVASION_NONE @@ -59,7 +58,7 @@ if(hive.living_xeno_queen.hivenumber == hive.hivenumber) continue for(var/mob/living/carbon/xenomorph/queen/Q in GLOB.living_xeno_list) - if(Q.hivenumber == hive.hivenumber && !is_admin_level(Q.z)) + if(Q.hivenumber == hive.hivenumber && !should_block_game_interaction(Q)) hive.living_xeno_queen = Q xeno_message(SPAN_XENOANNOUNCE("A new Queen has risen to lead the Hive! Rejoice!"),3,hive.hivenumber) continue outer_loop @@ -103,6 +102,7 @@ COMSIG_XENO_STOP_OVERWATCH, COMSIG_XENO_STOP_OVERWATCH_XENO ), PROC_REF(stop_watching)) + RegisterSignal(Q, COMSIG_MOB_REAL_NAME_CHANGED, PROC_REF(on_name_changed)) RegisterSignal(src, COMSIG_MOVABLE_TURF_ENTER, PROC_REF(turf_weed_only)) // Default color @@ -158,6 +158,10 @@ X.reset_view() return +/mob/hologram/queen/proc/on_name_changed(mob/parent, old_name, new_name) + SIGNAL_HANDLER + name = "[initial(src.name)] ([new_name])" + /mob/hologram/queen/proc/turf_weed_only(mob/self, turf/crossing_turf) SIGNAL_HANDLER @@ -264,8 +268,6 @@ drag_delay = 6 //pulling a big dead xeno is hard tier = 0 //Queen doesn't count towards population limit. hive_pos = XENO_QUEEN - crystal_max = XENO_CRYSTAL_MEDIUM - crystal_stored = XENO_CRYSTAL_MEDIUM small_explosives_stun = FALSE pull_speed = 3 //screech/neurodragging is cancer, at the very absolute least get some runner to do it for teamwork @@ -303,10 +305,8 @@ /datum/action/xeno_action/onclick/choose_resin/queen_macro, //fourth macro /datum/action/xeno_action/activable/secrete_resin/queen_macro, //fifth macro /datum/action/xeno_action/onclick/grow_ovipositor, - /datum/action/xeno_action/onclick/banish, - /datum/action/xeno_action/onclick/readmit, - /datum/action/xeno_action/onclick/queen_award, /datum/action/xeno_action/activable/info_marker/queen, + /datum/action/xeno_action/onclick/manage_hive, ) inherent_verbs = list( @@ -336,13 +336,12 @@ /datum/action/xeno_action/onclick/choose_resin/queen_macro, //fourth macro /datum/action/xeno_action/activable/secrete_resin/queen_macro, //fifth macro /datum/action/xeno_action/onclick/grow_ovipositor, - /datum/action/xeno_action/onclick/banish, - /datum/action/xeno_action/onclick/readmit, - /datum/action/xeno_action/onclick/queen_award, + /datum/action/xeno_action/onclick/manage_hive, /datum/action/xeno_action/activable/info_marker/queen, /datum/action/xeno_action/onclick/screech, //custom macro, Screech /datum/action/xeno_action/activable/xeno_spit/queen_macro, //third macro - /datum/action/xeno_action/onclick/shift_spits, //second macro + /datum/action/xeno_action/onclick/shift_spits, + //second macro ) // Abilities they get when they've successfully aged. @@ -394,7 +393,7 @@ /mob/living/carbon/xenomorph/queen/Initialize() . = ..() SStracking.set_leader("hive_[hivenumber]", src) - if(!is_admin_level(z))//so admins can safely spawn Queens in Thunderdome for tests. + if(!should_block_game_interaction(src))//so admins can safely spawn Queens in Thunderdome for tests. xeno_message(SPAN_XENOANNOUNCE("A new Queen has risen to lead the Hive! Rejoice!"),3,hivenumber) notify_ghosts(header = "New Queen", message = "A new Queen has risen.", source = src, action = NOTIFY_ORBIT) playsound(loc, 'sound/voice/alien_queen_command.ogg', 75, 0) @@ -500,7 +499,7 @@ if(hive && hive.living_xeno_queen == src) var/mob/living/carbon/xenomorph/queen/next_queen = null for(var/mob/living/carbon/xenomorph/queen/queen in hive.totalXenos) - if(!is_admin_level(queen.z) && queen != src && !QDELETED(queen)) + if(!should_block_game_interaction(queen) && queen != src && !QDELETED(queen)) next_queen = queen break hive.set_living_xeno_queen(next_queen) // either null or a queen @@ -792,13 +791,24 @@ return TRUE /mob/living/carbon/xenomorph/queen/death(cause, gibbed) - if(hive.living_xeno_queen == src) + if(src == hive?.living_xeno_queen) hive.xeno_queen_timer = world.time + XENO_QUEEN_DEATH_DELAY - hive.banished_ckeys = list() // Reset the banished ckey list + + // Reset the banished ckey list + if(length(hive.banished_ckeys)) + for(var/mob/living/carbon/xenomorph/target_xeno in hive.totalXenos) + if(!target_xeno.ckey) + continue + for(var/mob_name in hive.banished_ckeys) + if(target_xeno.ckey == hive.banished_ckeys[mob_name]) + target_xeno.banished = FALSE + target_xeno.hud_update_banished() + target_xeno.lock_evolve = FALSE + hive.banished_ckeys = list() + icon = queen_standing_icon return ..() - /mob/living/carbon/xenomorph/queen/proc/mount_ovipositor() if(ovipositor) return //sanity check @@ -826,19 +836,15 @@ /datum/action/xeno_action/onclick/psychic_whisper, /datum/action/xeno_action/onclick/psychic_radiance, /datum/action/xeno_action/onclick/choose_resin/queen_macro, //fourth macro - /datum/action/xeno_action/onclick/banish, - /datum/action/xeno_action/onclick/readmit, - /datum/action/xeno_action/onclick/queen_award, + /datum/action/xeno_action/onclick/manage_hive, /datum/action/xeno_action/activable/info_marker/queen, // Screech is typically new for this list, but its possible they never ovi and it then is forced here: /datum/action/xeno_action/onclick/screech, //custom macro, Screech // These are new and their arrangement matters: /datum/action/xeno_action/onclick/remove_eggsac, - /datum/action/xeno_action/onclick/give_evo_points, /datum/action/xeno_action/onclick/set_xeno_lead, /datum/action/xeno_action/activable/queen_heal, //first macro /datum/action/xeno_action/activable/queen_give_plasma, //second macro - /datum/action/xeno_action/onclick/deevolve, /datum/action/xeno_action/onclick/queen_order, /datum/action/xeno_action/activable/expand_weeds, //third macro /datum/action/xeno_action/activable/secrete_resin/remote/queen, //fifth macro diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Ravager.dm b/code/modules/mob/living/carbon/xenomorph/castes/Ravager.dm index e4f1d183f601..6d19a1b8feec 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Ravager.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Ravager.dm @@ -110,5 +110,5 @@ if (rav_shield && ((rav_shield.last_damage_taken + shield_decay_time) < world.time)) QDEL_NULL(rav_shield) - to_chat(bound_xeno, SPAN_XENODANGER("You feel your shield decay!")) + to_chat(bound_xeno, SPAN_XENODANGER("We feel our shield decay!")) bound_xeno.overlay_shields() diff --git a/code/modules/mob/living/carbon/xenomorph/castes/caste_datum.dm b/code/modules/mob/living/carbon/xenomorph/castes/caste_datum.dm index 63d6146afb14..cfaedf013a44 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/caste_datum.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/caste_datum.dm @@ -16,8 +16,6 @@ var/plasma_max = 10 var/plasma_gain = 5 - var/crystal_max = 0 - var/max_health = XENO_UNIVERSAL_HPMULT * 100 ///Are they allowed to evolve (and have their evolution progress group) var/evolution_allowed = 1 diff --git a/code/modules/mob/living/carbon/xenomorph/castes/lesser_drone.dm b/code/modules/mob/living/carbon/xenomorph/castes/lesser_drone.dm index 8a1908efb230..f050a0dcfe8a 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/lesser_drone.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/lesser_drone.dm @@ -7,7 +7,6 @@ max_health = XENO_HEALTH_LESSER_DRONE plasma_gain = XENO_PLASMA_GAIN_TIER_7 plasma_max = XENO_PLASMA_TIER_3 - crystal_max = XENO_CRYSTAL_LOW xeno_explosion_resistance = XENO_NO_EXPLOSIVE_ARMOR armor_deflection = XENO_NO_ARMOR evasion = XENO_EVASION_LOW diff --git a/code/modules/mob/living/carbon/xenomorph/damage_procs.dm b/code/modules/mob/living/carbon/xenomorph/damage_procs.dm index e372b03e68d9..624c9df25f3e 100644 --- a/code/modules/mob/living/carbon/xenomorph/damage_procs.dm +++ b/code/modules/mob/living/carbon/xenomorph/damage_procs.dm @@ -313,4 +313,4 @@ fire.set_on_fire(src) //Deals an extra proc of fire when you're crossing it. 30 damage per tile crossed, plus 15 per Process(). next_move_slowdown = next_move_slowdown + (SLOWDOWN_AMT_GREENFIRE * resist_modifier) if(resist_modifier > 0) - to_chat(src, SPAN_DANGER("You feel pieces of your exoskeleton fusing with the viscous fluid below and tearing off as you struggle to move through the flames!")) + to_chat(src, SPAN_DANGER("We feel pieces of our exoskeleton fusing with the viscous fluid below and tearing off as we struggle to move through the flames!")) diff --git a/code/modules/mob/living/carbon/xenomorph/death.dm b/code/modules/mob/living/carbon/xenomorph/death.dm index ea1e674a1faf..503ca11a7631 100644 --- a/code/modules/mob/living/carbon/xenomorph/death.dm +++ b/code/modules/mob/living/carbon/xenomorph/death.dm @@ -26,7 +26,7 @@ hud_used.alien_plasma_display.icon_state = "power_display_empty" update_icons() - if(!is_admin_level(z)) //so xeno players don't get death messages from admin tests + if(!should_block_game_interaction(src)) //so xeno players don't get death messages from admin tests if(isqueen(src)) var/mob/living/carbon/xenomorph/queen/XQ = src playsound(loc, 'sound/voice/alien_queen_died.ogg', 75, 0) diff --git a/code/modules/mob/living/carbon/xenomorph/egg_item.dm b/code/modules/mob/living/carbon/xenomorph/egg_item.dm index e4cc7bd39fe0..6f00ae1798e9 100644 --- a/code/modules/mob/living/carbon/xenomorph/egg_item.dm +++ b/code/modules/mob/living/carbon/xenomorph/egg_item.dm @@ -25,6 +25,17 @@ set_hive_data(src, hivenumber) . = ..() + if(hivenumber == XENO_HIVE_NORMAL) + RegisterSignal(SSdcs, COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING, PROC_REF(forsaken_handling)) + +/obj/item/xeno_egg/proc/forsaken_handling() + SIGNAL_HANDLER + if(is_ground_level(z)) + hivenumber = XENO_HIVE_FORSAKEN + set_hive_data(src, XENO_HIVE_FORSAKEN) + + UnregisterSignal(SSdcs, COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING) + /obj/item/xeno_egg/get_examine_text(mob/user) . = ..() if(isxeno(user)) diff --git a/code/modules/mob/living/carbon/xenomorph/hive_status.dm b/code/modules/mob/living/carbon/xenomorph/hive_status.dm index c7326937c4cd..7cc5850e3701 100644 --- a/code/modules/mob/living/carbon/xenomorph/hive_status.dm +++ b/code/modules/mob/living/carbon/xenomorph/hive_status.dm @@ -45,7 +45,6 @@ var/isSlotOpen = TRUE //Set true for starting alerts only after the hive has reached its full potential var/allowed_nest_distance = 15 //How far away do we allow nests from an ovied Queen. Default 15 tiles. var/obj/effect/alien/resin/special/pylon/core/hive_location = null //Set to ref every time a core is built, for defining the hive location - var/crystal_stored = 0 //How much stockpiled material is stored for the hive to use. var/datum/mutator_set/hive_mutators/mutators = new var/tier_slot_multiplier = 1 @@ -69,6 +68,10 @@ var/hardcore = FALSE /// Set to false if you want to prevent getting burrowed larva from latejoin marines var/latejoin_burrowed = TRUE + /// If hit limit of larva from pylons + var/hit_larva_pylon_limit = FALSE + + var/see_humans_on_tacmap = FALSE var/list/hive_inherant_traits @@ -207,7 +210,7 @@ // Can only have one queen. if(isqueen(X)) - if(!living_xeno_queen && !is_admin_level(X.z)) // Don't consider xenos in admin level + if(!living_xeno_queen && !should_block_game_interaction(X)) // Don't consider xenos in admin level set_living_xeno_queen(X) X.hivenumber = hivenumber @@ -219,7 +222,7 @@ X.hud_update() var/area/A = get_area(X) - if(!is_admin_level(X.z) || (A.flags_atom & AREA_ALLOW_XENO_JOIN)) + if(!should_block_game_interaction(X) || (A.flags_atom & AREA_ALLOW_XENO_JOIN)) totalXenos += X if(X.tier == 2) tier_2_xenos += X @@ -242,7 +245,7 @@ if(living_xeno_queen == xeno) var/mob/living/carbon/xenomorph/queen/next_queen = null for(var/mob/living/carbon/xenomorph/queen/queen in totalXenos) - if(!is_admin_level(queen.z) && queen != src && !QDELETED(queen)) + if(!should_block_game_interaction(queen) && queen != src && !QDELETED(queen)) next_queen = queen break @@ -265,7 +268,7 @@ tier_3_xenos -= xeno // Only handle free slots if the xeno is not in tdome - if(!is_admin_level(xeno.z)) + if(!should_block_game_interaction(xeno)) var/selected_caste = GLOB.xeno_datum_list[xeno.caste_type]?.type if(used_slots[selected_caste]) used_slots[selected_caste]-- @@ -409,7 +412,7 @@ for(var/mob/living/carbon/xenomorph/X in totalXenos) //don't show xenos in the thunderdome when admins test stuff. - if(is_admin_level(X.z)) + if(should_block_game_interaction(X)) var/area/A = get_area(X) if(!(A.flags_atom & AREA_ALLOW_XENO_JOIN)) continue @@ -423,28 +426,27 @@ // The idea is that we sort this list, and use it as a "key" for all the other information (especially the nicknumber) // in the hive status UI. That way we can minimize the amount of sorts performed by only calling this when xenos are created/disposed /datum/hive_status/proc/get_xeno_keys() - var/list/xenos[totalXenos.len] + var/list/xenos = list() - var/index = 1 - var/useless_slots = 0 for(var/mob/living/carbon/xenomorph/X in totalXenos) - if(is_admin_level(X.z)) + if(should_block_game_interaction(X)) var/area/A = get_area(X) if(!(A.flags_atom & AREA_ALLOW_XENO_JOIN)) - useless_slots++ continue - // Insert without doing list merging - xenos[index++] = list( + if(!(X in GLOB.living_xeno_list)) + continue + + // This looks weird, but in DM adding List A to List B actually adds each item in List B to List A, not List B itself. + // Having a nested list like this sort of tricks it into adding the list instead. + // In this case this results in an array of different 'xeno' dictionaries, rather than just a dictionary. + xenos += list(list( "nicknumber" = X.nicknumber, "tier" = X.tier, // This one is only important for sorting "is_leader" = (IS_XENO_LEADER(X)), "is_queen" = istype(X.caste, /datum/caste_datum/queen), "caste_type" = X.caste_type - ) - - // Clear nulls from the xenos list - xenos.len -= useless_slots + )) // Make it all nice and fancy by sorting the list before returning it var/list/sorted_keys = sort_xeno_keys(xenos) @@ -510,7 +512,7 @@ var/list/xenos = list() for(var/mob/living/carbon/xenomorph/X in totalXenos) - if(is_admin_level(X.z)) + if(should_block_game_interaction(X)) var/area/A = get_area(X) if(!(A.flags_atom & AREA_ALLOW_XENO_JOIN)) continue @@ -541,7 +543,7 @@ var/list/xenos = list() for(var/mob/living/carbon/xenomorph/X in totalXenos) - if(is_admin_level(X.z)) + if(should_block_game_interaction(X)) var/area/A = get_area(X) if(!(A.flags_atom & AREA_ALLOW_XENO_JOIN)) continue @@ -935,6 +937,30 @@ return TRUE +// Get amount of real xenos, don't count lessers/huggers +/datum/hive_status/proc/get_real_total_xeno_count() + var/count = 0 + for(var/mob/living/carbon/xenomorph/xeno as anything in totalXenos) + if(xeno.counts_for_slots) + count++ + return count + +// Checks if we hit larva limit +/datum/hive_status/proc/check_if_hit_larva_from_pylon_limit() + var/groundside_humans_weighted_count = 0 + for(var/mob/living/carbon/human/current_human as anything in GLOB.alive_human_list) + if(!(isspecieshuman(current_human) || isspeciessynth(current_human))) + continue + var/datum/job/job = GLOB.RoleAuthority.roles_for_mode[current_human.job] + if(!job) + continue + var/turf/turf = get_turf(current_human) + if(is_ground_level(turf?.z)) + groundside_humans_weighted_count += GLOB.RoleAuthority.calculate_role_weight(job) + hit_larva_pylon_limit = (get_real_total_xeno_count() + stored_larva) > (groundside_humans_weighted_count * ENDGAME_LARVA_CAP_MULTIPLIER) + hive_ui.update_pylon_status() + return hit_larva_pylon_limit + ///Called by /obj/item/alien_embryo when a host is bursting to determine extra larva per burst /datum/hive_status/proc/increase_larva_after_burst() var/extra_per_burst = CONFIG_GET(number/extra_larva_per_burst) @@ -1225,14 +1251,13 @@ if(!target_hive.living_xeno_queen && !target_hive.allow_no_queen_actions) return if(allies[faction]) - xeno_message(SPAN_XENOANNOUNCE("You sense that [name] [living_xeno_queen ? "Queen " : ""]set up an alliance with us!"), 3, target_hive.hivenumber) + xeno_message(SPAN_XENOANNOUNCE("We sense that [name] [living_xeno_queen ? "Queen " : ""]set up an alliance with us!"), 3, target_hive.hivenumber) return - xeno_message(SPAN_XENOANNOUNCE("You sense that [name] [living_xeno_queen ? "Queen " : ""]broke the alliance with us!"), 3, target_hive.hivenumber) + xeno_message(SPAN_XENOANNOUNCE("We sense that [name] [living_xeno_queen ? "Queen " : ""]broke the alliance with us!"), 3, target_hive.hivenumber) if(target_hive.allies[name]) //autobreak alliance on betrayal target_hive.change_stance(name, FALSE) - /datum/hive_status/corrupted/change_stance(faction, should_ally) . = ..() if(allies[faction]) @@ -1255,14 +1280,14 @@ /datum/hive_status/corrupted/proc/give_defection_choice(mob/living/carbon/xenomorph/xeno, faction) if(tgui_alert(xeno, "Your Queen has broken the alliance with the [faction]. The device inside your carapace begins to suppress your connection with the Hive. Do you remove it and stay loyal to her?", "Alliance broken!", list("Stay loyal", "Obey the talls"), 10 SECONDS) == "Obey the talls") if(!xeno.iff_tag) - to_chat(xeno, SPAN_XENOWARNING("It's too late now. The device is gone and your service to the Queen continues.")) + to_chat(xeno, SPAN_XENOWARNING("It's too late now. The device is gone and our service to the Queen continues.")) return defectors += xeno xeno.set_hive_and_update(XENO_HIVE_RENEGADE) to_chat(xeno, SPAN_XENOANNOUNCE("You lost the connection with your Hive. Now you have no Queen, only your masters.")) - to_chat(xeno, SPAN_NOTICE("Your instincts have changed, you seem compelled to protect [english_list(xeno.iff_tag.faction_groups, "no one")].")) + to_chat(xeno, SPAN_NOTICE("Our instincts have changed, we seem compelled to protect [english_list(xeno.iff_tag.faction_groups, "no one")].")) return - xeno.visible_message(SPAN_XENOWARNING("[xeno] rips out [xeno.iff_tag]!"), SPAN_XENOWARNING("You rip out [xeno.iff_tag]! For the Hive!")) + xeno.visible_message(SPAN_XENOWARNING("[xeno] rips out [xeno.iff_tag]!"), SPAN_XENOWARNING("We rip out [xeno.iff_tag]! For the Hive!")) xeno.adjustBruteLoss(50) xeno.iff_tag.forceMove(get_turf(xeno)) xeno.iff_tag = null @@ -1285,6 +1310,10 @@ xeno_message(SPAN_XENOANNOUNCE("You sense that [english_list(defectors)] turned their backs against their sisters and the Queen in favor of their slavemasters!"), 3, hivenumber) defectors.Cut() +/datum/hive_status/proc/override_evilution(evil, override) + if(SSxevolution) + SSxevolution.override_power(hivenumber, evil, override) + //Xeno Resin Mark Shit, the very best place for it too :0) //Defines at the bottom of this list here will show up at the top in the mark menu /datum/xeno_mark_define diff --git a/code/modules/mob/living/carbon/xenomorph/hive_status_ui.dm b/code/modules/mob/living/carbon/xenomorph/hive_status_ui.dm index 4fe1be51bfff..17514a31e502 100644 --- a/code/modules/mob/living/carbon/xenomorph/hive_status_ui.dm +++ b/code/modules/mob/living/carbon/xenomorph/hive_status_ui.dm @@ -11,6 +11,7 @@ var/hive_location var/burrowed_larva var/evilution_level + var/pylon_status var/data_initialized = FALSE @@ -104,6 +105,7 @@ update_xeno_vitals() update_xeno_keys(FALSE) update_xeno_info(FALSE) + update_pylon_status(FALSE) if(send_update) SStgui.update_uis(src) @@ -113,8 +115,19 @@ data_initialized = TRUE update_all_xeno_data(FALSE) update_burrowed_larva(FALSE) + update_pylon_status(FALSE) SStgui.update_uis(src) +/datum/hive_status_ui/proc/update_pylon_status(send_update = TRUE) + if(assoc_hive.get_structure_count(XENO_STRUCTURE_PYLON) < 1) + pylon_status = "" + else if(assoc_hive.hit_larva_pylon_limit) + pylon_status = "The hive's power has surpassed what the pylons can provide." + else + pylon_status = "Pylons are strengthening our numbers!" + if(send_update) + SStgui.update_uis(src) + /datum/hive_status_ui/ui_state(mob/user) return GLOB.hive_state[assoc_hive.internal_faction] @@ -123,6 +136,10 @@ if(isobserver(user)) return UI_INTERACTIVE + // If the Queen died or is otherwise missing. + if(!assoc_hive.living_xeno_queen) + return UI_CLOSE + /datum/hive_status_ui/ui_data(mob/user) . = list() .["total_xenos"] = total_xenos @@ -131,10 +148,13 @@ .["xeno_keys"] = xeno_keys .["xeno_info"] = xeno_info .["xeno_vitals"] = xeno_vitals - .["queen_location"] = get_area_name(assoc_hive.living_xeno_queen) + .["queen_location"] = null + if(assoc_hive.living_xeno_queen) + .["queen_location"] = get_area_name(assoc_hive.living_xeno_queen) .["hive_location"] = hive_location .["burrowed_larva"] = burrowed_larva .["evilution_level"] = evilution_level + .["pylon_status"] = pylon_status var/mob/living/carbon/xenomorph/queen/Q = user .["is_in_ovi"] = istype(Q) && Q.ovipositor @@ -175,7 +195,7 @@ var/mob/living/carbon/xenomorph/xenoTarget = locate(params["target_ref"]) in GLOB.living_xeno_list var/mob/living/carbon/xenomorph/xenoSrc = ui.user - if(QDELETED(xenoTarget) || xenoTarget.stat == DEAD || is_admin_level(xenoTarget.z)) + if(QDELETED(xenoTarget) || xenoTarget.stat == DEAD || should_block_game_interaction(xenoTarget)) return if(xenoSrc.stat == DEAD) @@ -188,7 +208,7 @@ var/mob/living/carbon/xenomorph/xenoTarget = locate(params["target_ref"]) in GLOB.living_xeno_list var/mob/living/carbon/xenomorph/xenoSrc = ui.user - if(QDELETED(xenoTarget) || xenoTarget.stat == DEAD || is_admin_level(xenoTarget.z)) + if(QDELETED(xenoTarget) || xenoTarget.stat == DEAD || should_block_game_interaction(xenoTarget)) return if(xenoSrc.stat == DEAD) @@ -201,7 +221,7 @@ var/mob/living/carbon/xenomorph/xenoTarget = locate(params["target_ref"]) in GLOB.living_xeno_list var/mob/living/carbon/xenomorph/xenoSrc = ui.user - if(QDELETED(xenoTarget) || xenoTarget.stat == DEAD || is_admin_level(xenoTarget.z)) + if(QDELETED(xenoTarget) || xenoTarget.stat == DEAD || should_block_game_interaction(xenoTarget)) return if(xenoSrc.stat == DEAD) diff --git a/code/modules/mob/living/carbon/xenomorph/life.dm b/code/modules/mob/living/carbon/xenomorph/life.dm index 07efb5be2ff8..aab61776118d 100644 --- a/code/modules/mob/living/carbon/xenomorph/life.dm +++ b/code/modules/mob/living/carbon/xenomorph/life.dm @@ -267,11 +267,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 @@ -300,6 +295,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. @@ -556,6 +558,9 @@ Make sure their actual health updates immediately.*/ /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) @@ -566,11 +571,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) diff --git a/code/modules/mob/living/carbon/xenomorph/mark_menu.dm b/code/modules/mob/living/carbon/xenomorph/mark_menu.dm index 5f7c1f8bc8c8..dd63f8a4fa70 100644 --- a/code/modules/mob/living/carbon/xenomorph/mark_menu.dm +++ b/code/modules/mob/living/carbon/xenomorph/mark_menu.dm @@ -180,7 +180,7 @@ var/list/possible_xenos = list() possible_xenos |= FunkTownOhyea for(var/mob/living/carbon/xenomorph/T in GLOB.living_xeno_list) - if (T != X && !is_admin_level(T.z) && X.hivenumber == T.hivenumber) + if (T != X && !should_block_game_interaction(T) && X.hivenumber == T.hivenumber) possible_xenos += T var/mob/living/carbon/xenomorph/selected_xeno = tgui_input_list(X, "Target", "Watch which xenomorph?", possible_xenos, theme="hive_status") @@ -195,7 +195,7 @@ . = TRUE update_all_data() return - if (!selected_xeno || QDELETED(selected_xeno) || selected_xeno.stat == DEAD || is_admin_level(selected_xeno.z) || !X.check_state(1)) + if (!selected_xeno || QDELETED(selected_xeno) || selected_xeno.stat == DEAD || should_block_game_interaction(selected_xeno) || !X.check_state(1)) return else selected_xeno.stop_tracking_resin_mark(FALSE, TRUE) diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm index 3b321ca259c9..10cbc29f51b0 100644 --- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm +++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm @@ -102,7 +102,7 @@ plasma_use_per_tick = 15 action_start_message = "You start forming eggs." - action_end_message = "You don't have enough plasma to support forming eggs." + action_end_message = "We don't have enough plasma to support forming eggs." var/egg_generation_progress = 0 ability_primacy = XENO_PRIMARY_ACTION_3 diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/praetorian/vanguard.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/praetorian/vanguard.dm index 8e6fbd203805..d5ca8c4d6aad 100644 --- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/praetorian/vanguard.dm +++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/praetorian/vanguard.dm @@ -98,7 +98,7 @@ bound_xeno.explosivearmor_modifier += 1.5*XENO_EXPOSIVEARMOR_MOD_VERY_LARGE bound_xeno.recalculate_armor() new_shield.explosive_armor_amount = 1.5*XENO_EXPOSIVEARMOR_MOD_VERY_LARGE - to_chat(praetorian, SPAN_XENOHIGHDANGER("You feel your defensive shell regenerate! It will block one hit!")) + to_chat(praetorian, SPAN_XENOHIGHDANGER("We feel our defensive shell regenerate! It will block one hit!")) var/datum/action/xeno_action/activable/cleave/caction = get_xeno_action_by_type(bound_xeno, /datum/action/xeno_action/activable/cleave) if (istype(caction)) diff --git a/code/modules/mob/living/carbon/xenomorph/say.dm b/code/modules/mob/living/carbon/xenomorph/say.dm index a2413b766505..5b8ce1ecd292 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 7b048bdf2f58..65795634a27c 100644 --- a/code/modules/mob/living/carbon/xenomorph/update_icons.dm +++ b/code/modules/mob/living/carbon/xenomorph/update_icons.dm @@ -90,7 +90,6 @@ update_inv_r_hand() update_inv_l_hand() update_inv_back() - update_inv_resource() update_icons() /* CRUTCH ZONE - Update icons when relevant status happen - Ideally do this properly and for everything, then kill update_icons() someday */ @@ -191,12 +190,6 @@ if(dir == NORTH && (back.flags_item & ITEM_OVERRIDE_NORTHFACE)) backpack_icon_holder.layer = -X_BACK_FRONT_LAYER -/mob/living/carbon/xenomorph/proc/update_inv_resource() - remove_overlay(X_RESOURCE_LAYER) - if(crystal_stored) - overlays_standing[X_RESOURCE_LAYER] = image("icon" = icon, "icon_state" = "[caste_type]_resources", "layer" =-X_RESOURCE_LAYER) - apply_overlay(X_RESOURCE_LAYER) - /mob/living/carbon/xenomorph/update_inv_legcuffed() remove_overlay(X_LEGCUFF_LAYER) if(legcuffed) @@ -308,7 +301,6 @@ return var/health_threshold - wound_icon_holder.layer = layer + 0.01 health_threshold = max(CEILING((health * 4) / (maxHealth), 1), 0) //From 0 to 4, in 25% chunks if(health > HEALTH_THRESHOLD_DEAD) if(health_threshold > 3) @@ -323,10 +315,9 @@ else wound_icon_holder.icon_state = handle_special_wound_states(health_threshold) - ///Used to display the xeno wounds/backpacks without rapidly switching overlays /atom/movable/vis_obj - vis_flags = VIS_INHERIT_ID|VIS_INHERIT_DIR + vis_flags = VIS_INHERIT_ID|VIS_INHERIT_DIR|VIS_INHERIT_LAYER|VIS_INHERIT_PLANE appearance_flags = RESET_COLOR /atom/movable/vis_obj/xeno_wounds diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm index 696eaa3f0120..a2b92007d97e 100644 --- a/code/modules/mob/living/init_signals.dm +++ b/code/modules/mob/living/init_signals.dm @@ -17,17 +17,22 @@ 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 /// 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 /// Called when [TRAIT_IMMOBILIZED] is added to the mob. /mob/living/proc/on_immobilized_trait_gain(datum/source) @@ -87,6 +92,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_health_procs.dm b/code/modules/mob/living/living_health_procs.dm index 50e59622f132..fb80c50042a3 100644 --- a/code/modules/mob/living/living_health_procs.dm +++ b/code/modules/mob/living/living_health_procs.dm @@ -127,20 +127,56 @@ 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 + 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) - if(status_flags & CANDAZE) - dazed = max(amount,0) - return +/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) - if(status_flags & CANDAZE) - dazed = max(dazed + amount,0) - return +/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) @@ -378,11 +414,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) diff --git a/code/modules/mob/living/living_verbs.dm b/code/modules/mob/living/living_verbs.dm index 3f5f5403818a..1d51e43fd71d 100644 --- a/code/modules/mob/living/living_verbs.dm +++ b/code/modules/mob/living/living_verbs.dm @@ -173,7 +173,7 @@ if(mobility_flags & MOBILITY_MOVE) if(on_fire) resist_fire() - if(is_type_in_list(/datum/effects/acid, effects_list)) + if(locate(/datum/effects/acid) in effects_list) resist_acid() if(last_special <= world.time) resist_restraints() diff --git a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm index 7ecaab1c3e79..abb044d474e8 100644 --- a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm +++ b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm @@ -1,5 +1,3 @@ -#define BORG_CAMERA_BUFFER 5 - //UPDATE TRIGGERS, when the chunk (and the surrounding chunks) should update. // TURFS @@ -66,10 +64,9 @@ if(src.camera && src.camera.network.len) if(!updating) updating = 1 - spawn(BORG_CAMERA_BUFFER) - if(oldLoc != src.loc) - GLOB.cameranet.updatePortableCamera(src.camera) - updating = 0 + if(oldLoc != src.loc) + GLOB.cameranet.updatePortableCamera(src.camera) + updating = 0 /mob/living/carbon/human/var/updating = 0 @@ -83,10 +80,9 @@ if (updating) continue updating = TRUE - spawn(BORG_CAMERA_BUFFER) - if (oldLoc != loc) - GLOB.cameranet.updatePortableCamera(H.camera) - updating = FALSE + if (oldLoc != loc) + GLOB.cameranet.updatePortableCamera(H.camera) + updating = FALSE // CAMERA @@ -114,4 +110,3 @@ GLOB.cameranet.removeCamera(src) . = ..() -//#undef BORG_CAMERA_BUFFER diff --git a/code/modules/mob/living/silicon/decoy/decoy.dm b/code/modules/mob/living/silicon/decoy/decoy.dm index bc7271554352..3c2d65bd4180 100644 --- a/code/modules/mob/living/silicon/decoy/decoy.dm +++ b/code/modules/mob/living/silicon/decoy/decoy.dm @@ -47,6 +47,9 @@ /mob/living/silicon/decoy/death(cause, gibbed, deathmessage = "sparks up and falls silent...") if(stat == DEAD) return FALSE + + //ARES sends out last messages + ares_final_words() icon_state = "hydra-off" var/datum/cause_data/cause_data = create_cause_data("rapid unscheduled disassembly", src, src) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), loc, -1, 0, 8, 12, TRUE, FALSE, 0, cause_data), 2 SECONDS) diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 6b29a47be3ea..3838386c634c 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -9,16 +9,16 @@ /obj/item/tool/pen/robopen/attack_self(mob/user) ..() - var/choice = tgui_input_list(usr, "Would you like to change color or mode?", "Change Mode", list("Colour","Mode")) + var/choice = tgui_input_list(usr, "Would you like to change color or mode?", "Change Mode", list("Color","Mode")) if(!choice) return playsound(src.loc, 'sound/effects/pop.ogg', 25, FALSE) switch(choice) - if("Colour") - var/newcolour = tgui_input_list(usr, "Which color would you like to use?", list("black","blue","red","green","yellow")) - if(newcolour) pen_colour = newcolour + if("Color") + var/newcolor = tgui_input_list(usr, "Which color would you like to use?", list("black","blue","red","green","yellow")) + if(newcolor) pen_color = newcolor if("Mode") if (mode == 1) mode = 2 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 2ed1ee5e126c..79cd0c521067 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -463,6 +463,7 @@ /mob/proc/swap_hand() hand = !hand + SEND_SIGNAL(src, COMSIG_MOB_SWAPPED_HAND) //attempt to pull/grab something. Returns true upon success. /mob/proc/start_pulling(atom/movable/AM, lunge, no_msg) @@ -842,15 +843,9 @@ note dizziness decrements automatically in the mob's Life() proc. handle_silent() handle_drugged() handle_slurring() - handle_dazed() handle_slowed() handle_superslowed() -/mob/living/proc/handle_dazed() - if(dazed) - adjust_effect(-1, DAZE) - return dazed - /mob/living/proc/handle_slowed() if(slowed) adjust_effect(-1, SLOW) @@ -989,6 +984,7 @@ note dizziness decrements automatically in the mob's Life() proc. /// Adds this list to the output to the stat browser /mob/proc/get_status_tab_items() . = list() + SEND_SIGNAL(src, COMSIG_MOB_GET_STATUS_TAB_ITEMS, .) /mob/proc/get_role_name() return @@ -1056,3 +1052,14 @@ note dizziness decrements automatically in the mob's Life() proc. /mob/proc/update_stat() return + +/// Send src back to the lobby as a `/mob/new_player()` +/mob/proc/send_to_lobby() + var/mob/new_player/new_player = new + + if(!mind) + mind_initialize() + + mind.transfer_to(new_player) + + qdel(src) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index f0e5bc48a855..f7f062295778 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -174,7 +174,7 @@ mouse_drag_pointer = MOUSE_ACTIVE_POINTER - var/status_flags = CANKNOCKDOWN|CANPUSH|STATUS_FLAGS_DEBILITATE //bitflags defining which status effects can be inflicted (replaces canweaken, canstun, etc) + var/status_flags = DEFAULT_MOB_STATUS_FLAGS //bitflags defining which status effects can be inflicted (replaces canweaken, canstun, etc) var/area/lastarea = null var/obj/control_object //Used by admins to possess objects. All mobs should have this var diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index e918a00b0984..b9c5dd12a8aa 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -87,6 +87,10 @@ ADD_TRAIT(victim, TRAIT_FLOORED, CHOKEHOLD_TRAIT) /obj/item/grab/proc/progress_passive(mob/living/carbon/human/user, mob/living/victim) + if(SEND_SIGNAL(victim, COMSIG_MOB_AGGRESSIVELY_GRABBED, user) & COMSIG_MOB_AGGRESIVE_GRAB_CANCEL) + to_chat(user, SPAN_WARNING("You can't grab [victim] aggressively!")) + return + user.grab_level = GRAB_AGGRESSIVE playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 25, 1, 7) user.visible_message(SPAN_WARNING("[user] has grabbed [victim] aggressively!"), null, null, 5) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 6abe12eee9b1..4f9244126c36 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -131,6 +131,72 @@ GLOBAL_LIST_INIT(limb_types_by_name, list( index++ return output_message +/** + * Summary: proc that parses an html input string and scrambles the non-html string contents. + * + * Arguments: + * * message - an html string value to be parsed and modified. + * + * Return: + * returns the parsed and modified html output with the text content being partially scrambled with asteriks + */ +/proc/stars_decode_html(message) + if(!length(message)) + return + + // boolean value to know if the current indexed element needs to be scrambled. + var/parsing_message = FALSE + + // boolean values to know if we are currently inside a double or single quotation. + var/in_single_quote = FALSE + var/in_double_quote = FALSE + + // string of what tag we're currently in + var/current_tag = "" + var/escaped_tag = FALSE + + // string that will be scrambled + var/current_string_to_scramble = "" + + // output string after parse + var/output_message = "" + for(var/character_index in 1 to length(message)) + var/current_char = message[character_index] + + // Apparent edge case safety, we only want to check the < and > on the edges of the tag. + if(!parsing_message) + if(current_char == "'") + in_single_quote = !in_single_quote + if(current_char == "\"") + in_double_quote = !in_double_quote + if(in_single_quote || in_double_quote) + output_message += current_char + continue + + if(current_char == ">") + parsing_message = TRUE + output_message += current_char + current_tag += current_char + if(findtext(current_tag, "") == 1 || findtext(current_tag, "[key_name(character, 1, 1, 0)]. IP: [character.lastKnownIP], CID: [character.computer_id]") - if(client.player_data && client.player_data.playtime_loaded && ((round(client.get_total_human_playtime() DECISECONDS_TO_HOURS, 0.1)) <= 5)) + if(client.player_data && client.player_data.playtime_loaded && ((round(client.get_total_human_playtime() DECISECONDS_TO_HOURS, 0.1)) <= CONFIG_GET(number/notify_new_player_age))) msg_sea("NEW PLAYER: [key_name(character, 0, 1, 0)] only has [(round(client.get_total_human_playtime() DECISECONDS_TO_HOURS, 0.1))] hours as a human. Current role: [get_actual_job_name(character)] - Current location: [get_area(character)]") character.client.init_verbs() @@ -370,30 +395,8 @@ new_character.lastarea = get_area(loc) - client.prefs.copy_all_to(new_character, job, is_late_join) - - if (client.prefs.be_random_body) - var/datum/preferences/TP = new() - TP.randomize_appearance(new_character) - - if(mind) - mind_initialize() - mind.active = 0 //we wish to transfer the key manually - mind.original = new_character - mind.transfer_to(new_character) //won't transfer key since the mind is not active - mind.setup_human_stats() - - new_character.job = job - new_character.name = real_name - new_character.voice = real_name - - // Update the character icons - // This is done in set_species when the mob is created as well, but - INVOKE_ASYNC(new_character, TYPE_PROC_REF(/mob/living/carbon/human, regenerate_icons)) - INVOKE_ASYNC(new_character, TYPE_PROC_REF(/mob/living/carbon/human, update_body), 1, 0) - INVOKE_ASYNC(new_character, TYPE_PROC_REF(/mob/living/carbon/human, update_hair)) + setup_human(new_character, src, is_late_join) - new_character.key = key //Manually transfer the key to log them in new_character.client?.change_view(GLOB.world_view_size) return new_character diff --git a/code/modules/organs/limbs.dm b/code/modules/organs/limbs.dm index 8df96650ac50..949104c5d673 100644 --- a/code/modules/organs/limbs.dm +++ b/code/modules/organs/limbs.dm @@ -547,6 +547,7 @@ This function completely restores a damaged organ to perfect condition. /obj/limb/proc/remove_all_bleeding(external = FALSE, internal = FALSE) + SEND_SIGNAL(src, COMSIG_LIMB_STOP_BLEEDING, external, internal) if(external) for(var/datum/effects/bleeding/external/B in bleeding_effects_list) qdel(B) @@ -954,7 +955,13 @@ This function completely restores a damaged organ to perfect condition. // OK so maybe your limb just flew off, but if it was attached to a pair of cuffs then hooray! Freedom! release_restraints() - if(vital) owner.death(cause) + if(vital) + var/mob/caused_mob + if(istype(cause, /mob)) + caused_mob = cause + if(!istype(cause, /datum/cause_data)) + cause = create_cause_data("lost vital limb", caused_mob) + owner.death(cause) /* HELPERS diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index b572b5d9e87b..106d3df3e786 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -75,26 +75,25 @@ /obj/item/paper/get_examine_text(mob/user) . = ..() - if(in_range(user, src) || istype(user, /mob/dead/observer)) + if(in_range(user, src) || isobserver(user)) if(!(istype(user, /mob/dead/observer) || istype(user, /mob/living/carbon/human) || isRemoteControlling(user))) // Show scrambled paper if they aren't a ghost, human, or silicone. - if(photo_list) - for(var/photo in photo_list) - user << browse_rsc(photo_list[photo], photo) - show_browser(user, "[stars(info)][stamps]", name, name, "size=650x700") - onclose(user, name) + read_paper(user,scramble = TRUE) else read_paper(user) else . += SPAN_NOTICE("It is too far away.") -/obj/item/paper/proc/read_paper(mob/user) +/obj/item/paper/proc/read_paper(mob/user, scramble = FALSE) var/datum/asset/asset_datum = get_asset_datum(/datum/asset/simple/paper) asset_datum.send(user) if(photo_list) for(var/photo in photo_list) user << browse_rsc(photo_list[photo], photo) - show_browser(user, "[info][stamps]", name, name, "size=650x700") + var/paper_info = info + if(scramble) + paper_info = stars_decode_html(info) + show_browser(user, "[paper_info][stamps]", name, name, "size=650x700") onclose(user, name) /obj/item/paper/verb/rename() @@ -259,7 +258,7 @@ t = replacetext(t, "\[upp\]", "") t = replacetext(t, "\[cmb\]", "") - t = "[t]" + t = "[t]" else // If it is a crayon, and he still tries to use these, make them empty! t = replacetext(t, "\[*\]", "") t = replacetext(t, "\[hr\]", "") @@ -273,7 +272,7 @@ t = replacetext(t, "\[cell\]", "") t = replacetext(t, "\[logo\]", "") - t = "[t]" + t = "[t]" // t = replacetext(t, "#", "") // Junk converted to nothing! @@ -362,8 +361,8 @@ iscrayon = 1 - // if paper is not in usr, then it must be near them, or in a clipboard or folder, which must be in or near usr - if(src.loc != usr && !src.Adjacent(usr) && !((istype(src.loc, /obj/item/clipboard) || istype(src.loc, /obj/item/folder)) && (src.loc.loc == usr || src.loc.Adjacent(usr)) ) ) + // if paper is not in usr, then it must be near them, or in a clipboard, noticeboard or folder, which must be in or near usr + if(src.loc != usr && !src.Adjacent(usr) && !((istype(src.loc, /obj/item/clipboard) || istype(src.loc, /obj/structure/noticeboard) || istype(src.loc, /obj/item/folder)) && (src.loc.loc == usr || src.loc.Adjacent(usr)) ) ) return t = replacetext(t, "\n", "
") diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index cebb4ad613b0..40d88f684791 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -46,7 +46,7 @@ ..() /obj/item/photo/get_examine_text(mob/user) - if(in_range(user, src)) + if(in_range(user, src) || isobserver(user)) show(user) return list(desc) else diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index c41a57f53527..d00b6cbe90c9 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -493,7 +493,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 @@ -759,7 +759,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. @@ -843,6 +843,7 @@ User can be passed as null, (a gun reloading itself for instance), so we need to to_chat(user, SPAN_WARNING("Your reload was interrupted!")) return replace_magazine(user, magazine) + SEND_SIGNAL(user, COMSIG_MOB_RELOADED_GUN, src) else current_mag = magazine magazine.forceMove(src) @@ -1048,6 +1049,7 @@ and you're good to go. user.swap_hand() unload(user, TRUE, drop_to_ground) // We want to quickly autoeject the magazine. This proc does the rest based on magazine type. User can be passed as null. playsound(src, empty_sound, 25, 1) + SEND_SIGNAL(user, COMSIG_MOB_GUN_EMPTY, src) else // Just fired a chambered bullet with no magazine in the gun update_icon() diff --git a/code/modules/projectiles/gun_attachables.dm b/code/modules/projectiles/gun_attachables.dm index 33d28527c8a1..0f3fde8f3c9b 100644 --- a/code/modules/projectiles/gun_attachables.dm +++ b/code/modules/projectiles/gun_attachables.dm @@ -342,6 +342,10 @@ Defined in conflicts.dm of the #defines folder. throw_range = 7 pry_delay = 1 SECONDS +/obj/item/attachable/bayonet/van_bandolier + name = "\improper Fairbairn-Sykes fighting knife" + desc = "This isn't for dressing game or performing camp chores. It's almost certainly not an original. Almost." + /obj/item/attachable/bayonet/co2/update_icon() icon_state = "co2_knife[filled ? "-f" : ""]" attach_icon = "co2_bayonet[filled ? "-f" : ""]_a" @@ -1582,7 +1586,7 @@ Defined in conflicts.dm of the #defines folder. scoper.clear_fullscreen("vulture") scoper.client.remove_from_screen(scope_element) scoper.see_in_dark -= darkness_view - scoper.lighting_alpha = 127 + scoper.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE scoper.sync_lighting_plane_alpha() QDEL_NULL(scope_element) recalculate_scope_pos() diff --git a/code/modules/projectiles/guns/flamer/flamer.dm b/code/modules/projectiles/guns/flamer/flamer.dm index 18fb0bf44cd8..282edcab9fd6 100644 --- a/code/modules/projectiles/guns/flamer/flamer.dm +++ b/code/modules/projectiles/guns/flamer/flamer.dm @@ -621,7 +621,7 @@ burn_damage = 0 if(!burn_damage) - to_chat(M, SPAN_DANGER("You step over the flames.")) + to_chat(M, SPAN_DANGER("[isxeno(M) ? "We" : "You"] step over the flames.")) return M.last_damage_data = weapon_cause_data @@ -632,7 +632,7 @@ if(FIRE_VARIANT_TYPE_B) if(isxeno(M)) var/mob/living/carbon/xenomorph/X = M - X.armor_deflection?(variant_burn_msg=" You feel the flames weakening your exoskeleton!"):(variant_burn_msg=" You feel the flaming chemicals eating into your body!") + X.armor_deflection?(variant_burn_msg=" We feel the flames weakening our exoskeleton!"):(variant_burn_msg=" You feel the flaming chemicals eating into your body!") to_chat(M, SPAN_DANGER("You are burned![variant_burn_msg?"[variant_burn_msg]":""]")) M.updatehealth() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 38ee9c55b2a8..ee9caa61d7a7 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -1227,9 +1227,10 @@ return if(COOLDOWN_FINISHED(src, shot_cooldown)) visible_message(SPAN_DANGER("[src] is hit by the [P.name] in the [parse_zone(P.def_zone)]!"), \ - SPAN_HIGHDANGER("You are hit by the [P.name] in the [parse_zone(P.def_zone)]!"), null, 4, CHAT_TYPE_TAKING_HIT) + SPAN_HIGHDANGER("[isxeno(src) ? "We" : "You"] are hit by the [P.name] in the [parse_zone(P.def_zone)]!"), null, 4, CHAT_TYPE_TAKING_HIT) COOLDOWN_START(src, shot_cooldown, 1 SECONDS) + last_damage_data = P.weapon_cause_data if(P.firer && ismob(P.firer)) var/mob/firingMob = P.firer diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 6d36765146ed..c5650ad001a2 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -28,7 +28,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/overdose_dam = 1//Handeled by heart damage var/spray_warning = FALSE //whether spraying that reagent creates an admin message. //var/list/viruses = list() - var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!) + var/color = COLOR_BLACK //(does not support alpha channels - yet!) var/datum/weakref/last_source_mob // For explosions var/explosive = FALSE @@ -152,6 +152,9 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) handle_processing(M, mods, delta_time) holder.remove_reagent(id, custom_metabolism * delta_time) + if(!holder) + return FALSE + return TRUE //Pre-processing diff --git a/code/modules/reagents/chemistry_machinery/acid_harness.dm b/code/modules/reagents/chemistry_machinery/acid_harness.dm index 52a1a5f13bd7..b349b3224d1a 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_machinery/reagent_analyzer.dm b/code/modules/reagents/chemistry_machinery/reagent_analyzer.dm index e0d0a80cadc2..51db188826b8 100644 --- a/code/modules/reagents/chemistry_machinery/reagent_analyzer.dm +++ b/code/modules/reagents/chemistry_machinery/reagent_analyzer.dm @@ -29,6 +29,9 @@ updateUsrDialog() if(!do_after(user, 1 SECONDS, INTERRUPT_ALL, BUSY_ICON_GENERIC)) return + if(!sample) + to_chat(user, SPAN_WARNING("Someone else removed the sample. Make up your mind!")) + return processing = TRUE if(sample.reagents.total_volume < 30 || sample.reagents.reagent_list.len > 1) icon_state = "reagent_analyzer_error" diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 8bf7eadc5d77..a8a11fc299ad 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_reagents/alcohol.dm b/code/modules/reagents/chemistry_reagents/alcohol.dm index 08beb42fa410..b5db671b626c 100644 --- a/code/modules/reagents/chemistry_reagents/alcohol.dm +++ b/code/modules/reagents/chemistry_reagents/alcohol.dm @@ -234,7 +234,7 @@ name = "Poison Wine" id = "pwine" description = "Is this even wine? Toxic! Hallucinogenic! Probably consumed in boatloads by your superiors!" - color = "#000000" // rgb: 0, 0, 0 SHOCKER + color = COLOR_BLACK properties = list(PROPERTY_ALCOHOLIC = 1, PROPERTY_FUELING = 3, PROPERTY_OXIDIZING = 3, PROPERTY_FLOWING = 2) boozepwr = 1 @@ -559,7 +559,7 @@ name = "Snow White" id = "snowwhite" description = "A cold refreshment" - color = "#FFFFFF" // rgb: 255, 255, 255 + color = COLOR_WHITE properties = list(PROPERTY_ALCOHOLIC = 1.5, PROPERTY_FUELING = 3, PROPERTY_OXIDIZING = 3, PROPERTY_FLOWING = 2) boozepwr = 1.5 diff --git a/code/modules/reagents/chemistry_reagents/drink.dm b/code/modules/reagents/chemistry_reagents/drink.dm index 9739687dec20..9577f61a3dcd 100644 --- a/code/modules/reagents/chemistry_reagents/drink.dm +++ b/code/modules/reagents/chemistry_reagents/drink.dm @@ -163,8 +163,10 @@ /datum/reagent/drink/milk/on_mob_life(mob/living/M) . = ..() - if(!.) return - if(M.getBruteLoss() && prob(20)) M.heal_limb_damage(1,0) + if(!.) + return + if(M.getBruteLoss() && prob(20)) + M.heal_limb_damage(1,0) holder.remove_reagent("capsaicin", 10*REAGENTS_METABOLISM) holder.remove_reagent("hotsauce", 10*REAGENTS_METABOLISM) @@ -220,7 +222,7 @@ name = "Cherry Souto" id = "souto_cherry" description = "A cherry flavored soda that's canned in Havanna" - color = "#800000" + color = COLOR_MAROON /datum/reagent/drink/souto/lime name = "Lime Souto" @@ -492,7 +494,7 @@ name = "Lemonade" description = "Oh the nostalgia..." id = "lemonade" - color = "#FFFF00" // rgb: 255, 255, 0 + color = COLOR_YELLOW //*****************************************************************************************************/ //***************************************Remove When Safe**********************************************/ diff --git a/code/modules/reagents/chemistry_reagents/food.dm b/code/modules/reagents/chemistry_reagents/food.dm index 0ec3a2250260..2ee2a05bef32 100644 --- a/code/modules/reagents/chemistry_reagents/food.dm +++ b/code/modules/reagents/chemistry_reagents/food.dm @@ -184,7 +184,7 @@ id = "sodiumchloride" description = "A salt made of sodium chloride. Commonly used to season food." reagent_state = SOLID - color = "#FFFFFF" // rgb: 255,255,255 + color = COLOR_WHITE chemfiresupp = TRUE intensitymod = 0.1 burncolor = "#ffff00" @@ -227,7 +227,7 @@ id = "sprinkles" description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#FF00FF" // rgb: 255, 0, 255 + color = COLOR_MAGENTA properties = list(PROPERTY_NUTRITIOUS = 2) flags = REAGENT_NO_GENERATION @@ -288,7 +288,7 @@ description = "The most widely consumed staple food on Earth. Rice is the most important grain with regard to human nutrition and caloric intake." reagent_state = SOLID nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#FFFFFF" // rgb: 0, 0, 0 + color = COLOR_WHITE properties = list(PROPERTY_NUTRITIOUS = 2) /datum/reagent/cherryjelly @@ -304,6 +304,6 @@ name = "Honey" id = "honey" description = "Honey is a natural sweet, viscous food substance composed of mainly fructose and glucose." - color = "#FFFF00" + color = COLOR_YELLOW chemclass = CHEM_CLASS_RARE flags = REAGENT_NO_GENERATION diff --git a/code/modules/reagents/chemistry_reagents/other.dm b/code/modules/reagents/chemistry_reagents/other.dm index 45e66c182e6a..2416e9e84fe3 100644 --- a/code/modules/reagents/chemistry_reagents/other.dm +++ b/code/modules/reagents/chemistry_reagents/other.dm @@ -185,7 +185,7 @@ id = "oxygen" description = "Chemical element of atomic number 8. It is an oxidizing agent that forms oxides with most elements and many other compounds. Dioxygen is used in cellular respiration and is nessesary to sustain organic life." reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY chemfiresupp = TRUE properties = list(PROPERTY_OXIDIZING = 2) intensitymod = 0.75 @@ -212,7 +212,7 @@ id = "nitrogen" description = "Chemical element of atomic number 7. Liquid nitrogen is commonly used in cryogenics, with its melting point of 63.15 kelvin. Nitrogen is a component of many explosive compounds and fertilizers." reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY chemclass = CHEM_CLASS_BASIC custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) @@ -223,7 +223,7 @@ id = "hydrogen" description = "Chemical element of atomic number 1. Is the most abundant chemical element in the Universe. Liquid hydrogen was used as one of the first fuel sources for space travel. Very combustible and is used in many chemical reactions." reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY chemfiresupp = TRUE durationmod = -0.5 radiusmod = 0.2 @@ -295,7 +295,7 @@ id = "chlorine" description = "Chemical element of atomic number 17. High concentrations of elemental chlorine is highly reactive and poisonous for all living organisms. Chlorine gas has been used as a chemical warfare agent. Industrially used in the production of disinfectants, medicines, plastics and purification of water." reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY overdose = REAGENTS_OVERDOSE overdose_critical = REAGENTS_OVERDOSE_CRITICAL chemclass = CHEM_CLASS_BASIC @@ -306,7 +306,7 @@ id = "fluorine" description = "Chemical element of atomic number 9. It is a very reactive and highly toxic pale yellow gas at standard conditions. Mostly used for medical and dental purposes." reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY overdose = REAGENTS_OVERDOSE overdose_critical = REAGENTS_OVERDOSE_CRITICAL chemclass = CHEM_CLASS_BASIC @@ -317,7 +317,7 @@ id = "sodium" description = "Chemical element of atomic number 11. Pure it is a soft and very reactive metal. Many salt compounds contain sodium, such as sodium chloride and sodium bicarbonate. There are more uses for sodium as a salt than as a metal." reagent_state = SOLID - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY chemclass = CHEM_CLASS_BASIC custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) @@ -343,7 +343,7 @@ id = "lithium" description = "Chemical element of atomic number 3. Is a soft alkali metal commonly used in the production of batteries. Highly reactive and flammable. Used as an antidepressant and for treating bipolar disorder." reagent_state = SOLID - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY chemfiresupp = TRUE intensitymod = 0.15 burncolor = "#ff356f" @@ -358,7 +358,7 @@ id = "sugar" description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste. The most simple form of sugar, glucose, is the only form of nutriment for red blood cells as they have no mitocondria. Sugar can therefore be used to improve blood regeneration as a nutriment, although ineffective." reagent_state = SOLID - color = "#FFFFFF" // rgb: 255, 255, 255 + color = COLOR_WHITE chemclass = CHEM_CLASS_BASIC properties = list(PROPERTY_NUTRITIOUS = 1) flags = REAGENT_TYPE_MEDICAL @@ -368,7 +368,7 @@ id = "glycerol" description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity, often used in medicines and beverages. Used in the production of plastic, nitroglycerin and other explosives." reagent_state = LIQUID - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY chemclass = CHEM_CLASS_RARE custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) @@ -720,8 +720,8 @@ id = "napalmgel" description = "Unlike its liquid contemporaries, this gelled variant of napalm is easily extinguished, but shoots far and lingers on the ground in a viscous mess, while reacting with inorganic materials to ignite them." flameshape = FLAMESHAPE_LINE - color = "#00ff00" - burncolor = "#00ff00" + color = COLOR_GREEN + burncolor = COLOR_GREEN burn_sprite = "green" properties = list( PROPERTY_INTENSITY = BURN_LEVEL_TIER_2, @@ -750,8 +750,8 @@ id = "napalmb" description = "A special variant of napalm that's unable to cling well to anything, but disperses over a wide area while burning slowly. The composition reacts with inorganic materials to ignite them, causing severe damage." flameshape = FLAMESHAPE_TRIANGLE - color = "#00ff00" - burncolor = "#00ff00" + color = COLOR_GREEN + burncolor = COLOR_GREEN burn_sprite = "green" properties = list( PROPERTY_INTENSITY = BURN_LEVEL_TIER_2, @@ -764,8 +764,8 @@ name = "Napalm E" id = "napalme" description = "A sticky combustible liquid chemical that penetrates the best fire retardants." - color = "#800080" - burncolor = "#800080" + color = COLOR_PURPLE + burncolor = COLOR_PURPLE burn_sprite = "dynamic" properties = list( PROPERTY_INTENSITY = BURN_LEVEL_TIER_2, @@ -807,7 +807,7 @@ id = "chlorine trifluoride" description = "A highly reactive interhalogen compound capaple of self ignition. A very strong oxidizer and is extremely reactive with most organic and inorganic materials." reagent_state = LIQUID - color = "#00FFFF" + color = COLOR_CYAN custom_metabolism = 100 chemfiresupp = TRUE burncolor = "#ff9300" @@ -874,7 +874,7 @@ id = "nitroglycerin" description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol. Despite being a highly volatile material, it is used for many medical purposes." reagent_state = LIQUID - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) explosive = TRUE power = 1 diff --git a/code/modules/reagents/chemistry_reagents/toxin.dm b/code/modules/reagents/chemistry_reagents/toxin.dm index 445918ef284d..53ccb53f1748 100644 --- a/code/modules/reagents/chemistry_reagents/toxin.dm +++ b/code/modules/reagents/chemistry_reagents/toxin.dm @@ -205,10 +205,10 @@ id = "potassium_chloride" description = "A bitter tasting salt that can be used as a spice, but can cause cardiac arrest in larger quantities. It has for this reason been used as a component in lethal injections for many years." reagent_state = SOLID - color = "#FFFFFF" // rgb: 255,255,255 + color = COLOR_WHITE chemfiresupp = TRUE intensitymod = 0.1 - burncolor = "#800080" + burncolor = COLOR_PURPLE burncolormod = 5 overdose = 30 chemclass = CHEM_CLASS_UNCOMMON @@ -219,7 +219,7 @@ id = "potassium_chlorophoride" description = "A specific chemical based on Potassium Chloride used to stop the heart for surgery. Causes instant cardiac arrest. Not safe to eat!" reagent_state = SOLID - color = "#FFFFFF" // rgb: 255,255,255 + color = COLOR_WHITE overdose = 20 chemclass = CHEM_CLASS_UNCOMMON properties = list(PROPERTY_RELAXING = 8, PROPERTY_HYPOXEMIC = 4, PROPERTY_TOXIC = 2) @@ -261,7 +261,7 @@ name = "Formaldehyde" id = "formaldehyde" description = "Formaldehyde is a toxic organic gas that is mostly used in making resins, polymers and explosives. It is known to be a natural carcinogen." - color = "#808080" // rgb: 128, 128, 128 + color = COLOR_GRAY reagent_state = GAS chemclass = CHEM_CLASS_UNCOMMON properties = list(PROPERTY_TOXIC = 1, PROPERTY_CARCINOGENIC = 1) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 88efcf7a37ba..4a6b98e8b5cf 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -1377,7 +1377,7 @@ //Expel the contents of the holder object, then delete it. Called when the holder exits the outlet /obj/structure/disposaloutlet/proc/expel(obj/structure/disposalholder/H) - flick("outlet-open", src) + flick("[icon_state]-open", src) playsound(src, 'sound/machines/warning-buzzer.ogg', 25, 0) sleep(20) //Wait until correct animation frame playsound(src, 'sound/machines/hiss.ogg', 25, 0) diff --git a/code/modules/shuttle/computers/dropship_computer.dm b/code/modules/shuttle/computers/dropship_computer.dm index 86c0c86abfc2..d357a15b36f8 100644 --- a/code/modules/shuttle/computers/dropship_computer.dm +++ b/code/modules/shuttle/computers/dropship_computer.dm @@ -275,7 +275,6 @@ return /obj/structure/machinery/computer/shuttle/dropship/flight/proc/hijack(mob/user, force = FALSE) - // select crash location var/turf/source_turf = get_turf(src) var/obj/docking_port/mobile/marine_dropship/dropship = SSshuttle.getShuttle(shuttleId) @@ -307,7 +306,14 @@ hivenumber = xeno.hivenumber xeno_message(SPAN_XENOANNOUNCE("The Queen has commanded the metal bird to depart for the metal hive in the sky! Rejoice!"), 3, hivenumber) xeno_message(SPAN_XENOANNOUNCE("The hive swells with power! You will now steadily gain pooled larva over time."), 2, hivenumber) - GLOB.hive_datum[hivenumber].abandon_on_hijack() + var/datum/hive_status/hive = GLOB.hive_datum[hivenumber] + hive.abandon_on_hijack() + var/original_evilution = hive.evolution_bonus + hive.override_evilution(XENO_HIJACK_EVILUTION_BUFF, TRUE) + if(hive.living_xeno_queen) + var/datum/action/xeno_action/onclick/grow_ovipositor/ovi_ability = get_xeno_action_by_type(hive.living_xeno_queen, /datum/action/xeno_action/onclick/grow_ovipositor) + ovi_ability.reduce_cooldown(ovi_ability.xeno_cooldown) + addtimer(CALLBACK(hive, TYPE_PROC_REF(/datum/hive_status, override_evilution), original_evilution, FALSE), XENO_HIJACK_EVILUTION_TIME) // Notify the yautja too so they stop the hunt message_all_yautja("The serpent Queen has commanded the landing shuttle to depart.") diff --git a/code/modules/shuttle/shuttles/crashable/escape_shuttle.dm b/code/modules/shuttle/shuttles/crashable/escape_shuttle.dm index 1f0a8fd502cf..c2c6b818b37b 100644 --- a/code/modules/shuttle/shuttles/crashable/escape_shuttle.dm +++ b/code/modules/shuttle/shuttles/crashable/escape_shuttle.dm @@ -73,6 +73,8 @@ for(var/mob/living/occupant in interior_area) occupant_count++ for(var/obj/structure/machinery/cryopod/evacuation/cryotube in interior_area) + if(cryotube.occupant) + occupant_count++ cryos += list(cryotube) if (occupant_count > max_capacity) playsound(src,'sound/effects/escape_pod_warmup.ogg', 50, 1) diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm index b9a9f27a28ae..8be96f27404a 100644 --- a/code/modules/tgs/core/core.dm +++ b/code/modules/tgs/core/core.dm @@ -42,11 +42,11 @@ var/datum/tgs_version/max_api_version = TgsMaximumApiVersion(); if(version.suite != null && version.minor != null && version.patch != null && version.deprecated_patch != null && version.deprefixed_parameter > max_api_version.deprefixed_parameter) - TGS_ERROR_LOG("Detected unknown API version! Defaulting to latest. Update the DMAPI to fix this problem.") + TGS_ERROR_LOG("Detected unknown Interop API version! Defaulting to latest. Update the DMAPI to fix this problem.") api_datum = /datum/tgs_api/latest if(!api_datum) - TGS_ERROR_LOG("Found unsupported API version: [raw_parameter]. If this is a valid version please report this, backporting is done on demand.") + TGS_ERROR_LOG("Found unsupported Interop API version: [raw_parameter]. If this is a valid version please report this, backporting is done on demand.") return TGS_INFO_LOG("Activating API for version [version.deprefixed_parameter]") @@ -107,6 +107,13 @@ if(api) return api.ApiVersion() +/world/TgsEngine() +#ifdef OPENDREAM + return TGS_ENGINE_TYPE_OPENDREAM +#else + return TGS_ENGINE_TYPE_BYOND +#endif + /world/TgsInstanceName() var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) if(api) diff --git a/code/modules/tgs/v5/__interop_version.dm b/code/modules/tgs/v5/__interop_version.dm index 83420d130a74..616263098fd3 100644 --- a/code/modules/tgs/v5/__interop_version.dm +++ b/code/modules/tgs/v5/__interop_version.dm @@ -1 +1 @@ -"5.7.0" +"5.8.0" diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm index 48969c0c7d56..1c7d67d20cdf 100644 --- a/code/modules/tgs/v5/_defines.dm +++ b/code/modules/tgs/v5/_defines.dm @@ -8,7 +8,6 @@ #define DMAPI5_TOPIC_REQUEST_LIMIT 65528 #define DMAPI5_TOPIC_RESPONSE_LIMIT 65529 -#define DMAPI5_BRIDGE_COMMAND_PORT_UPDATE 0 #define DMAPI5_BRIDGE_COMMAND_STARTUP 1 #define DMAPI5_BRIDGE_COMMAND_PRIME 2 #define DMAPI5_BRIDGE_COMMAND_REBOOT 3 @@ -18,6 +17,7 @@ #define DMAPI5_PARAMETER_ACCESS_IDENTIFIER "accessIdentifier" #define DMAPI5_PARAMETER_CUSTOM_COMMANDS "customCommands" +#define DMAPI5_PARAMETER_TOPIC_PORT "topicPort" #define DMAPI5_CHUNK "chunk" #define DMAPI5_CHUNK_PAYLOAD "payload" diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index 7226f29bba60..25d49b3e3bdb 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -17,6 +17,8 @@ var/list/chat_channels var/initialized = FALSE + var/initial_bridge_request_received = FALSE + var/datum/tgs_version/interop_version var/chunked_requests = 0 var/list/chunked_topics = list() @@ -25,7 +27,8 @@ /datum/tgs_api/v5/New() . = ..() - TGS_DEBUG_LOG("V5 API created") + interop_version = version + TGS_DEBUG_LOG("V5 API created: [json_encode(args)]") /datum/tgs_api/v5/ApiVersion() return new /datum/tgs_version( @@ -38,8 +41,8 @@ access_identifier = world.params[DMAPI5_PARAM_ACCESS_IDENTIFIER] var/datum/tgs_version/api_version = ApiVersion() - version = null - 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())) + version = null // we want this to be the TGS version, not the interop version + 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)) TGS_ERROR_LOG("Failed initial bridge request!") return FALSE @@ -53,7 +56,8 @@ TGS_INFO_LOG("DMAPI validation, exiting...") TerminateWorld() - version = new /datum/tgs_version(runtime_information[DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION]) + initial_bridge_request_received = TRUE + version = new /datum/tgs_version(runtime_information[DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION]) // reassigning this because it can change if TGS updates security_level = runtime_information[DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL] visibility = runtime_information[DMAPI5_RUNTIME_INFORMATION_VISIBILITY] instance_name = runtime_information[DMAPI5_RUNTIME_INFORMATION_INSTANCE_NAME] @@ -102,10 +106,17 @@ initialized = TRUE return TRUE +/datum/tgs_api/v5/proc/GetTopicPort() +#if defined(OPENDREAM) && defined(OPENDREAM_TOPIC_PORT_EXISTS) + return "[world.opendream_topic_port]" +#else + return null +#endif + /datum/tgs_api/v5/proc/RequireInitialBridgeResponse() TGS_DEBUG_LOG("RequireInitialBridgeResponse()") var/logged = FALSE - while(!version) + while(!initial_bridge_request_received) if(!logged) TGS_DEBUG_LOG("RequireInitialBridgeResponse: Starting sleep") logged = TRUE diff --git a/code/modules/tgs/v5/bridge.dm b/code/modules/tgs/v5/bridge.dm index 37f58bcdf632..a0ab35987670 100644 --- a/code/modules/tgs/v5/bridge.dm +++ b/code/modules/tgs/v5/bridge.dm @@ -48,7 +48,9 @@ var/json = CreateBridgeData(command, data, TRUE) var/encoded_json = url_encode(json) - var/url = "http://127.0.0.1:[server_port]/Bridge?[DMAPI5_BRIDGE_DATA]=[encoded_json]" + var/api_prefix = interop_version.minor >= 8 ? "api/" : "" + + var/url = "http://127.0.0.1:[server_port]/[api_prefix]Bridge?[DMAPI5_BRIDGE_DATA]=[encoded_json]" return url /datum/tgs_api/v5/proc/CreateBridgeData(command, list/data, needs_auth) @@ -81,11 +83,16 @@ TGS_ERROR_LOG("Failed bridge request: [bridge_request]") return - var/response_json = file2text(export_response["CONTENT"]) - if(!response_json) + var/content = export_response["CONTENT"] + if(!content) TGS_ERROR_LOG("Failed bridge request, missing content!") return + var/response_json = file2text(content) + if(!response_json) + TGS_ERROR_LOG("Failed bridge request, failed to load content!") + return + var/list/bridge_response = json_decode(response_json) if(!bridge_response) TGS_ERROR_LOG("Failed bridge request, bad json: [response_json]") diff --git a/code/modules/tgs/v5/topic.dm b/code/modules/tgs/v5/topic.dm index 2ef0c70a97fa..05e6c4e1b214 100644 --- a/code/modules/tgs/v5/topic.dm +++ b/code/modules/tgs/v5/topic.dm @@ -175,6 +175,7 @@ var/list/reattach_response = TopicResponse(error_message) reattach_response[DMAPI5_PARAMETER_CUSTOM_COMMANDS] = ListCustomCommands() + reattach_response[DMAPI5_PARAMETER_TOPIC_PORT] = GetTopicPort() return reattach_response if(DMAPI5_TOPIC_COMMAND_SEND_CHUNK) diff --git a/code/modules/tgs/v5/undefs.dm b/code/modules/tgs/v5/undefs.dm index fd1ed7e4cf54..d531d4b7b9dd 100644 --- a/code/modules/tgs/v5/undefs.dm +++ b/code/modules/tgs/v5/undefs.dm @@ -8,7 +8,6 @@ #undef DMAPI5_TOPIC_REQUEST_LIMIT #undef DMAPI5_TOPIC_RESPONSE_LIMIT -#undef DMAPI5_BRIDGE_COMMAND_PORT_UPDATE #undef DMAPI5_BRIDGE_COMMAND_STARTUP #undef DMAPI5_BRIDGE_COMMAND_PRIME #undef DMAPI5_BRIDGE_COMMAND_REBOOT @@ -18,6 +17,7 @@ #undef DMAPI5_PARAMETER_ACCESS_IDENTIFIER #undef DMAPI5_PARAMETER_CUSTOM_COMMANDS +#undef DMAPI5_PARAMETER_TOPIC_PORT #undef DMAPI5_CHUNK #undef DMAPI5_CHUNK_PAYLOAD diff --git a/code/modules/tgui_input/text.dm b/code/modules/tgui_input/text.dm index 2a9b7f6dfff4..f60691860d79 100644 --- a/code/modules/tgui_input/text.dm +++ b/code/modules/tgui_input/text.dm @@ -14,8 +14,9 @@ * * 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 */ -/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) if (!user) user = usr if (!istype(user)) @@ -39,7 +40,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) text_input.tgui_interact(user) text_input.wait() if (text_input) @@ -73,14 +74,17 @@ var/timeout /// The title of the TGUI window var/title + /// 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) src.default = default src.encode = encode src.max_length = max_length src.message = message src.multiline = multiline src.title = title + src.trim = trim if (timeout) src.timeout = timeout start_time = world.time @@ -141,7 +145,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 +160,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/span_macros.dm b/code/span_macros.dm index 77e57f2077a0..b6a0e79a956b 100644 --- a/code/span_macros.dm +++ b/code/span_macros.dm @@ -106,3 +106,4 @@ #define SPAN_MAROON(X) "[X]" #define SPAN_STAFF_IC(X) "[X]" +#define SPAN_BIGNOTICE(X) "[X]" diff --git a/colonialmarines.dme b/colonialmarines.dme index ca8e80ef5067..ec330db86a4d 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -78,6 +78,7 @@ #include "code\__DEFINES\MC.dm" #include "code\__DEFINES\minimap.dm" #include "code\__DEFINES\misc.dm" +#include "code\__DEFINES\mob.dm" #include "code\__DEFINES\mob_hud.dm" #include "code\__DEFINES\mobs.dm" #include "code\__DEFINES\mode.dm" @@ -111,6 +112,7 @@ #include "code\__DEFINES\tgui.dm" #include "code\__DEFINES\traits.dm" #include "code\__DEFINES\turf_flags.dm" +#include "code\__DEFINES\tutorial.dm" #include "code\__DEFINES\unit_tests.dm" #include "code\__DEFINES\urls.dm" #include "code\__DEFINES\vehicle.dm" @@ -403,6 +405,7 @@ #include "code\datums\components\rename.dm" #include "code\datums\components\speed_modifier.dm" #include "code\datums\components\toxin_buildup.dm" +#include "code\datums\components\tutorial_status.dm" #include "code\datums\components\weed_damage_reduction.dm" #include "code\datums\components\weed_food.dm" #include "code\datums\components\autofire\_automated_fire.dm" @@ -663,6 +666,15 @@ #include "code\datums\supply_packs\spec_ammo.dm" #include "code\datums\supply_packs\vehicle_ammo.dm" #include "code\datums\supply_packs\weapons.dm" +#include "code\datums\tutorial\_tutorial.dm" +#include "code\datums\tutorial\_tutorial_menu.dm" +#include "code\datums\tutorial\tutorial_example.dm" +#include "code\datums\tutorial\marine\_marine.dm" +#include "code\datums\tutorial\marine\basic_marine.dm" +#include "code\datums\tutorial\marine\medical_basic.dm" +#include "code\datums\tutorial\ss13\_ss13.dm" +#include "code\datums\tutorial\ss13\basic_ss13.dm" +#include "code\datums\tutorial\ss13\intents.dm" #include "code\datums\weather\weather_event.dm" #include "code\datums\weather\weather_map_holder.dm" #include "code\datums\weather\weather_events\big_red.dm" @@ -972,6 +984,7 @@ #include "code\game\machinery\vending\vendor_types\squad_prep\squad_smartgunner.dm" #include "code\game\machinery\vending\vendor_types\squad_prep\squad_specialist.dm" #include "code\game\machinery\vending\vendor_types\squad_prep\squad_tl.dm" +#include "code\game\machinery\vending\vendor_types\squad_prep\tutorial.dm" #include "code\game\objects\empulse.dm" #include "code\game\objects\explosion.dm" #include "code\game\objects\explosion_recursive.dm" @@ -1614,6 +1627,7 @@ #include "code\modules\cm_preds\smartdisc.dm" #include "code\modules\cm_preds\thrall_items.dm" #include "code\modules\cm_preds\thrall_procs.dm" +#include "code\modules\cm_preds\yaut_actions.dm" #include "code\modules\cm_preds\yaut_bracers.dm" #include "code\modules\cm_preds\yaut_hudprocs.dm" #include "code\modules\cm_preds\yaut_items.dm" diff --git a/html/changelogs/AutoChangeLog-pr-4812.yml b/html/changelogs/AutoChangeLog-pr-4812.yml deleted file mode 100644 index f6989a13dc1f..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4812.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "mullenpaul" -delete-after: True -changes: - - ui: "tgui dropship weapons console" - - refactor: "added MFD panel" - - refactor: "creates datum component to manage camera code" - - qol: "CAS weapons operator can see camera in UI" - - rscadd: "CAS can offset in X and Y coordinates" - - refactor: "CAS can offset in different direction to attack vector" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5179.yml b/html/changelogs/AutoChangeLog-pr-5179.yml deleted file mode 100644 index ad3c7884925f..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5179.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Steelpoint" -delete-after: True -changes: - - rscadd: "The Executive Officer now has a personal weapons vendor. It includes the ability to acquire a full suite of combat and support gear, giving the XO more agency in customizing their loadout." - - rscadd: "Adds a new set of belts to the Executive Officer's uniform vendor." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5350.yml b/html/changelogs/AutoChangeLog-pr-5350.yml new file mode 100644 index 000000000000..94cad78f7e71 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5350.yml @@ -0,0 +1,4 @@ +author: "InsaneRed" +delete-after: True +changes: + - qol: "Moves \"Banish, Re-admit and De-evolving\" queen abilities into one list, making the queen ui less clutterier" \ No newline at end of file diff --git a/html/changelogs/archive/2023-12.yml b/html/changelogs/archive/2023-12.yml index 2f1249ec934b..6f487820ae46 100644 --- a/html/changelogs/archive/2023-12.yml +++ b/html/changelogs/archive/2023-12.yml @@ -468,3 +468,124 @@ 2023-12-25: InsaneRed: - balance: Tweaks down the buffed root of vanguard down to 1.8 from 2.5 +2023-12-26: + Ben10083: + - rscadd: If ARES is destroyed, systems such as bioscan also shut down, this will + be expanded in the future + - rscadd: ARES plays an announcement when destroyed + - code_imp: Procs to check for APOLLO processor and if ARES is alive added + - refactor: ARES subsystems modified to utilize new procs + - admin: Prompt to force a Marine Bioscan only shows when ARES is unable to perform + the bioscan. + Drathek: + - bugfix: Fix queen death not fully readmitting any banished xenos + - bugfix: Fixed resisting acid + SabreML: + - code_imp: Made the Tech Tree subsystem initialise faster. + Steelpoint: + - rscadd: The Executive Officer now has a personal weapons vendor. It includes the + ability to acquire a full suite of combat and support gear, giving the XO more + agency in customizing their loadout. + - rscadd: Adds a new set of belts to the Executive Officer's uniform vendor. + mullenpaul: + - ui: tgui dropship weapons console + - refactor: added MFD panel + - refactor: creates datum component to manage camera code + - qol: CAS weapons operator can see camera in UI + - rscadd: CAS can offset in X and Y coordinates + - refactor: CAS can offset in different direction to attack vector + realforest2001: + - bugfix: Yautja bracer lock can now properly unlock thrall bracers. +2023-12-27: + Birdtalon: + - rscdel: Removed old crystal code from xenos + - code_imp: Renames still used vars from crystal to plasma + - code_imp: Removes crystal define in place of plasma string + Drathek: + - bugfix: Fix xeno wounds layering over weeds when merged with the weeds + InsaneRed: + - spellcheck: More WE/YOU fixes for xenomorph side. + - bugfix: Spitter's charge spit abiltiy now properly adds and removes the 5 armor + like its supposed to initially. + SabreML: + - bugfix: Fixed the Queen Eye still showing as "Immature" after the Queen ages. + - bugfix: Fixed carriers being unable to reduce their 'reserved facehuggers' number. + - bugfix: Fixed being able to vend infinite alcohol. + - bugfix: Fixed the death message from GAU-21 and Laser Cannon strikes saying that + the player was killed by the ammo crate. + cuberound: + - balance: launchbay price 400 -> 200 + - balance: DS installed sentrygun price lowered to 200 + realforest2001: + - code_imp: Added a new span class that combines bold and big. + - code_imp: Tweaked the way prayer sends notifications to be more efficient. + - admin: Moved the prayer notification sound to a toggle preference, combined with + ARES Interface notifications. +2023-12-28: + InsaneRed: + - bugfix: Synths are no longer immune to lunges / dragging while in 'critical state' + since they dont go into crit. + SabreML: + - bugfix: Fixed inserting/removing an item from shoes sometimes acting weirdly. + - refactor: Refactored shoe item storage. + fira: + - bugfix: Fixed XRF Scanner bricking if people were adding and removing vials at + same time. +2023-12-29: + sleepynecrons: + - imageadd: new sprites for predalien, predlarva and weeded corpse + - imageadd: added predalien wound overlays +2023-12-30: + Birdtalon: + - bugfix: Runtime in inventory.dm + Cthulhu80: + - bugfix: fixes immobilized mobs being able to buckle themselves + InsaneRed: + - qol: '"View Playtime" is now under the "Records" section under OOC' + - qol: '"Remove Your Splints" is now under the "IC" section.' + SabreML: + - bugfix: Fixed the CAS laser cannon only setting fire to a single tile, rather + a 7x7 range. + - qol: Made the designation of a tunnel display in chat when a player enters it. + - bugfix: Fixed the pyro spec's fuel pack sometimes giving weird failure messages + when trying to switch fuel. + Zonespace27: + - rscadd: Added a tutorial system for various roles (and just general information), + find it in the lobby screen. + cuberound: + - bugfix: m56d can not longer shoot backwards when facing north + mullenpaul: + - refactor: tgui js components now jsx +2023-12-31: + AnonHault: + - spellcheck: fixed a typo + BeagleGaming1: + - qol: Adds the ability to hide your action buttons + Birdtalon: + - bugfix: Fixes a runtime on decapping one's self. + - bugfix: Runtime with milk and possibly other reagent's on_mob_life() + - bugfix: Fixes runtime calling post_attack() on a mob which has already been qdeleted + via gibbing. + - code_imp: Refactors some code to new throw_carbon proc + Cthulhu80: + - bugfix: Fixes movement delay stacking on weeds + - bugfix: Fixes evac pods launching with more than the occupant limit + Huffie56: + - qol: creating a new section called engineering supplies for the rifleman and the + team leader. + - balance: added standard binocular to the rifleman vendor at a cost of 5. + - balance: added Range Finder and Laser Designator binoculars to Team leader at + a cost of 10 and 20. + - balance: added ES-11 Mobile Fuel Canister and ME3 hand welder to Team leader and + rifleman for 5 each. + InsaneRed: + - balance: Properly tweaks predator stun resist back to what it should have been. + SabreML: + - bugfix: Fixed the Hive Status window showing an error message when the Queen dies. + - qol: Added a 'Time Since Death' counter to the status tab for ghosts. + blackdragonTOW: + - rscadd: Max CL Headset radio keys from 3 to 5. (+2 increase) + cuberound: + - balance: gives trucker engineer level construction skill + mullenpaul: + - refactor: sentry laptop now uses camera manager component diff --git a/html/changelogs/archive/2024-01.yml b/html/changelogs/archive/2024-01.yml new file mode 100644 index 000000000000..0223446c6c38 --- /dev/null +++ b/html/changelogs/archive/2024-01.yml @@ -0,0 +1,156 @@ +2024-01-01: + Cthulhu80: + - bugfix: fixes the associated examine text being displayed for different hud types + even when removed. + - balance: slightly increases zombie infection rate in dead mobs + - refactor: refactored some zombie code. + - bugfix: Fixes mobs being able to understand other languages while in crit. + - bugfix: fixes users getting stuck inside of the simulator + - bugfix: fixes xenos being able to view raw html on paper. + - bugfix: Fixes photos not being viewable from any distance as an observer + - bugfix: Fixes permanent lighting buff after using the vulture sniper rifle. + Drathek: + - bugfix: Fix handling of sentry_computer deletion + InsaneRed: + - spellcheck: Changed hit alerts to We instead of You on the xeno side. + Private Tristan: + - bugfix: Eggs are properly converted to Forsaken hive on evac + fira: + - bugfix: Fixed Nuke failing to detonate under specific circumstances. It may involve + a little rodent. + - bugfix: Nuke explosion will now kill mobs on its actual explosion rather than + at the start of the cinematic sequence. + mullenpaul: + - bugfix: properly sorted team lead position in squad info page +2024-01-02: + Cthulhu80: + - bugfix: Fixes voting message not formatting correctly. + SabreML: + - bugfix: Fixed screen alert tooltips ('Buckled' indicator and stuff) getting stuck + open. + Zonespace27: + - rscadd: The Three-World Empire will now occasionally respond to distress beacons. + cuberound: + - balance: m56d can not be placed within five tiles of another one +2024-01-03: + SabreML: + - bugfix: Fixed custom xeno ERTs sending a distress beacon announcement when it + shouldn't. + Steelpoint: + - mapadd: Shivas Snowball is back in rotation. + - maptweak: The south east landing zone on Shivas has been relocated to the south + west, the dig site in the south west has been similarly relocated. + - maptweak: Comms towers on Shivas have been placed in more consistent locations + near each other, instead of some of them being on the opposite sides of the + map from each other. + poltava, ihatethisengine: + - rscadd: added intel chestrig + - imageadd: added sprites for intel chestrig +2024-01-04: + BeagleGaming1, Mr.Crowford: + - rscadd: Added Yautja action buttons + - qol: Added a keybind to control falcon drones + - qol: Thwei crystals and healing capsules say how much time until off cooldown + - code_imp: Yautja keybinds now redirect to action buttons + - code_imp: Changed thwei crystals and healing capsules to cooldowns instead of + timers + - code_imp: Miscellaneous Yautja-related code cleanup + SabreML: + - bugfix: Fixed non-combat synthetics being able to fire the M2C. + - bugfix: Fixed scouts being able to use the M56D or M2C before their cloak's gun + cooldown had ended. + - bugfix: Fixed the M56D and M2C saying that the user is too far away to man it, + even when they successfully man it. + - bugfix: Fixed a runtime which was caused whenever someone manned an M56D or M2C. + - refactor: Refactored some M56D and M2C manning/unmanning code. + fira: + - code_imp: Refactored Daze to use new Status backend + - bugfix: Dazed screen effect now applies immediately + - bugfix: Stuttering now starts properly when dazed + - rscdel: Removed unused disabilities code + - rscdel: Removed an old, goofy and unused decade old horse mask +2024-01-05: + Birdtalon: + - bugfix: Fixed exploit in praetorian hook caused by an oversight. + Huffie56: + - refactor: for the file coulours.dm and other files change define in it from COULOUR + to COLOR + SabreML: + - bugfix: Made the 'Time Since Death' counter show hours if it passes 1 hour, rather + than wrapping the minutes back to 0. + - ui: Separated xeno hivemind chat messages into their own toggleable category, + separate from 'Radio'. +2024-01-06: + private-tristan: + - bugfix: Trijent security southern hallway and engineering east tunnel no longer + have 2 APCs +2024-01-07: + BadAtThisGame302: + - qol: Spruced up the CLs office by adding a new plant, changing the stuck posters + to be random every round + - bugfix: Fixed the ATM Machine in the CLs office having Weyland-Yutani Automatic + Teller Machine and not Wey-Yu. Same thing, useless mapedit. + - bugfix: Fixes the PROUDLY REMEMBER IO! Posters in the CLs office (Again) + - bugfix: Puts the 29th Poster which was a pinup into the pinup posters and not + the music ones. + Birdtalon: + - bugfix: Runtime when consuming xeno fruits. + Blundir: + - rscadd: added approved stamp + - bugfix: fixed being unable to write on papers on noticeboard + - ui: changed noticeboard UI from scratch + - refactor: refactored noticeboard code + - maptweak: added noticeboard to req and approved stamp to QM's office, as well + as some pens in req area to interact with noticeboard + Drathek: + - refactor: Refactored the overlay_lighting component to better handle objects deleting + - bugfix: Fix putting lights in bags somereason keeping the light on + - ui: Polished various aspects of the new dropship weapons UI + - bugfix: Fixed CAS direct firing + - bugfix: Fixed Medevac buttons not moving the dropship (still currently requires + manual winch) + - bugfix: Fixed camera_manager resizing the view incorrectly because of overlay_lighting + - refactor: Ported some hard delete fixes for maps. + - bugfix: Fixed simulators detonation button + - bugfix: Fixed weeded corpses not changing color during forsaken conversion + - code_imp: Add missing bitfield definitions for variable viewer (VV) + LTNTS: + - bugfix: fixes trippy carrot cake sprite + SabreML: + - bugfix: Fixed observing a monkey/farwa/stok/etc. locking the camera onto it. + - bugfix: Fixed the 'busy' circle icon sometimes rendering behind object on the + tile above. + - spellcheck: Updated the night vision goggles 'Tip of the round' to instead relate + to night vision optics. + TheGamerdk: + - rscadd: SLs, SOs and XOs can now recommend people for medals! Do this by right-clicking + your headset, or using the new button in the object panel of the Status Panel! + ihatethisengine: + - balance: Pylons give larva only up to 50% of groundside (weighted) marines, instead + of 40% of all humans. + - balance: Xenos get major boost to evo speed for 3 minutes after hijack. Hijacking + resets ovi cooldown. + - rscadd: Xenos now see marines on the tacmap during hijack if xenos outnumber marines + for more than 25%. + private-tristan: + - spellcheck: Changed a tip related to runner pounce to be more accurate +2024-01-08: + realforest2001: + - bugfix: Yautja scimitars no longer bypass attack delay. +2024-01-09: + private-tristan: + - bugfix: Tunnels are now converted to forsaken on evac. +2024-01-10: + SabreML: + - bugfix: Fixed tunnels not showing on the minimap. + Tsurupeta: + - bugfix: Regular expressions in chat highlights work again. +2024-01-12: + Vicacrov: + - bugfix: Placing flags now anchors the actual flag, not the stack of flags in your + hand. + Zenith, Steelpoint: + - rscadd: Updates Steelpoint's donor armour, replacing it with a new sprite, camouflage + options for all maps and new item descriptions that are lore friendly. + realforest2001: + - rscadd: Added the X17 Riot Breaching Charge. diff --git a/icons/misc/tutorial.dmi b/icons/misc/tutorial.dmi new file mode 100644 index 000000000000..d4a4e65963ba Binary files /dev/null and b/icons/misc/tutorial.dmi differ diff --git a/icons/mob/hud/actions.dmi b/icons/mob/hud/actions.dmi index 843d38a67b86..820da22ea5b1 100644 Binary files a/icons/mob/hud/actions.dmi and b/icons/mob/hud/actions.dmi differ diff --git a/icons/mob/hud/actions_yautja.dmi b/icons/mob/hud/actions_yautja.dmi new file mode 100644 index 000000000000..c94388456e96 Binary files /dev/null and b/icons/mob/hud/actions_yautja.dmi differ diff --git a/icons/mob/humans/onmob/back.dmi b/icons/mob/humans/onmob/back.dmi index 5e3d1e030661..4758f430a498 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/head_0.dmi b/icons/mob/humans/onmob/head_0.dmi index f1d6a2c6e665..cfe8b33da4ee 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/suit_0.dmi b/icons/mob/humans/onmob/suit_0.dmi index d0f816e2b7fa..3fc9e8e0770b 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/xenos/predalien.dmi b/icons/mob/xenos/predalien.dmi index 1e3ec5caf806..c6162729b516 100644 Binary files a/icons/mob/xenos/predalien.dmi and b/icons/mob/xenos/predalien.dmi differ diff --git a/icons/mob/xenos/predalien_larva.dmi b/icons/mob/xenos/predalien_larva.dmi index 82786f273980..41eb31a2c809 100644 Binary files a/icons/mob/xenos/predalien_larva.dmi and b/icons/mob/xenos/predalien_larva.dmi differ diff --git a/icons/mob/xenos/weeds_64x64.dmi b/icons/mob/xenos/weeds_64x64.dmi index 26a31eb0fc60..53c971cfe97c 100644 Binary files a/icons/mob/xenos/weeds_64x64.dmi and b/icons/mob/xenos/weeds_64x64.dmi differ diff --git a/icons/mob/xenos/wounds.dmi b/icons/mob/xenos/wounds.dmi index bf7d573b73a9..730e367f43ae 100644 Binary files a/icons/mob/xenos/wounds.dmi and b/icons/mob/xenos/wounds.dmi differ diff --git a/icons/obj/items/assemblies.dmi b/icons/obj/items/assemblies.dmi index 522e0fb5e55d..eb36d5696741 100644 Binary files a/icons/obj/items/assemblies.dmi and b/icons/obj/items/assemblies.dmi differ diff --git a/icons/obj/items/clothing/backpacks.dmi b/icons/obj/items/clothing/backpacks.dmi index 4119b32a09cf..fa03f0434fb5 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/donor/HEAD.dmi b/icons/obj/items/clothing/donor/HEAD.dmi index d7345e41d94b..3116bdef26b6 100644 Binary files a/icons/obj/items/clothing/donor/HEAD.dmi and b/icons/obj/items/clothing/donor/HEAD.dmi differ diff --git a/icons/obj/items/clothing/donor/SUITS.dmi b/icons/obj/items/clothing/donor/SUITS.dmi index 51c41b837c9a..fc0c9987b9d4 100644 Binary files a/icons/obj/items/clothing/donor/SUITS.dmi and b/icons/obj/items/clothing/donor/SUITS.dmi differ diff --git a/icons/obj/items/clothing/hats.dmi b/icons/obj/items/clothing/hats.dmi index de6673d07b51..e9da08f07477 100644 Binary files a/icons/obj/items/clothing/hats.dmi and b/icons/obj/items/clothing/hats.dmi differ diff --git a/icons/obj/items/clothing/suits.dmi b/icons/obj/items/clothing/suits.dmi index 10fbfff30d7c..7d67de8e5a2e 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/food.dmi b/icons/obj/items/food.dmi index 9e746bb62656..12093cd2c45b 100644 Binary files a/icons/obj/items/food.dmi and b/icons/obj/items/food.dmi differ diff --git a/icons/obj/items/paper.dmi b/icons/obj/items/paper.dmi index c39fede23679..fa8858e8a17b 100644 Binary files a/icons/obj/items/paper.dmi and b/icons/obj/items/paper.dmi differ diff --git a/icons/obj/structures/props/stationobjs.dmi b/icons/obj/structures/props/stationobjs.dmi index 66c396f41d12..8d0bf3b9377d 100644 Binary files a/icons/obj/structures/props/stationobjs.dmi and b/icons/obj/structures/props/stationobjs.dmi differ diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi index 8b525fd568d6..c8bf32b00b40 100644 Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ diff --git a/map_config/maps.txt b/map_config/maps.txt index ba0bd17a89c7..885b1e76faad 100644 --- a/map_config/maps.txt +++ b/map_config/maps.txt @@ -44,8 +44,6 @@ map ice_colony_v2 endmap map shivas_snowball - voteweight 0 - disabled endmap map kutjevo diff --git a/maps/fiorina_sciannex.json b/maps/fiorina_sciannex.json index 89997cc9d668..61212c433be0 100644 --- a/maps/fiorina_sciannex.json +++ b/maps/fiorina_sciannex.json @@ -4,15 +4,15 @@ "map_file": "Fiorina_SciAnnex.dmm", "webmap_url": "Fiorina", "survivor_types": [ - "/datum/equipment_preset/survivor/scientist/florina", - "/datum/equipment_preset/survivor/doctor/florina", + "/datum/equipment_preset/survivor/scientist/fiorina", + "/datum/equipment_preset/survivor/doctor/fiorina", "/datum/equipment_preset/survivor/interstellar_human_rights_observer", - "/datum/equipment_preset/survivor/security/florina", - "/datum/equipment_preset/survivor/colonial_marshal/florina", + "/datum/equipment_preset/survivor/security/fiorina", + "/datum/equipment_preset/survivor/colonial_marshal/fiorina", "/datum/equipment_preset/survivor/prisoner", "/datum/equipment_preset/survivor/prisoner", "/datum/equipment_preset/survivor/gangleader", - "/datum/equipment_preset/survivor/engineer/florina", + "/datum/equipment_preset/survivor/engineer/fiorina", "/datum/equipment_preset/survivor/clf", "/datum/equipment_preset/survivor/civilian" ], diff --git a/maps/map_files/DesertDam/Desert_Dam.dmm b/maps/map_files/DesertDam/Desert_Dam.dmm index 66684b33731c..bf1d64fbc499 100644 --- a/maps/map_files/DesertDam/Desert_Dam.dmm +++ b/maps/map_files/DesertDam/Desert_Dam.dmm @@ -9512,14 +9512,6 @@ icon_state = "desert_transition_edge1" }, /area/desert_dam/exterior/valley/valley_crashsite) -"aCH" = ( -/obj/structure/machinery/power/apc{ - dir = 1; - pixel_y = 24; - start_charge = 0 - }, -/turf/open/floor/interior/wood/alt, -/area/desert_dam/interior/dam_interior/east_tunnel_entrance) "aCI" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/interior/wood/alt, @@ -25382,17 +25374,6 @@ /obj/structure/window/reinforced, /turf/open/floor/interior/wood, /area/desert_dam/building/security/courtroom) -"bBU" = ( -/obj/structure/machinery/power/apc{ - dir = 8; - pixel_x = -30; - start_charge = 0 - }, -/turf/open/floor/prison{ - dir = 8; - icon_state = "darkred2" - }, -/area/desert_dam/building/security/southern_hallway) "bBV" = ( /obj/structure/pipes/standard/simple/hidden/green{ dir = 4 @@ -76387,7 +76368,7 @@ bsS bvy bsS bsS -bBU +bsS bFr aQH bIX @@ -86410,7 +86391,7 @@ dTs dTs dTs aEa -aCH +aCJ aCI aDh aCJ diff --git a/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm b/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm index b37d42f1a55f..ab98e02cb6e4 100644 --- a/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm +++ b/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm @@ -31053,7 +31053,7 @@ }, /area/fiorina/station/park) "sRv" = ( -/obj/item/clothing/shoes/marine/upp_knife, +/obj/item/clothing/shoes/marine/upp/knife, /turf/open/floor/prison, /area/fiorina/station/lowsec) "sRE" = ( diff --git a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm index 60847e12bae1..b43c34586c5c 100644 --- a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm +++ b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm @@ -17,10 +17,6 @@ /obj/structure/girder, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/colony/medseceng) -"aaf" = ( -/obj/item/lightstick/planted, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/cp_s_research) "aag" = ( /obj/structure/bed/chair{ dir = 4 @@ -113,29 +109,20 @@ /turf/open/auto_turf/ice/layer1, /area/shiva/exterior/cp_lz2) "aat" = ( -/obj/structure/ice/thin/single{ - opacity = 1; - unacidable = 0 +/obj/item/tool/shovel/snow{ + pixel_y = 8 }, -/obj/structure/blocker/forcefield/multitile_vehicles, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/left_spiders) +/obj/item/tool/shovel/snow, +/obj/structure/surface/rack, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "aau" = ( /obj/effect/spider/stickyweb, /turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/left_spiders) +/area/shiva/interior/caves/cp_camp) "aav" = ( -/obj/effect/spider/stickyweb{ - icon_state = "stickyweb2" - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/left_spiders) -"aaw" = ( -/obj/effect/spider/cocoon{ - icon_state = "cocoon_large2" - }, /turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/left_spiders) +/area/shiva/exterior/telecomm/lz1_north) "aax" = ( /obj/structure/prop/ice_colony/surveying_device{ layer = 3.01; @@ -176,10 +163,6 @@ }, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/right_spiders) -"aaE" = ( -/mob/living/simple_animal/hostile/giant_spider/nurse, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/left_spiders) "aaF" = ( /obj/structure/platform/strata{ dir = 4 @@ -226,10 +209,6 @@ /obj/item/tool/pickaxe/drill, /turf/open/auto_turf/ice/layer1, /area/shiva/exterior/cp_colony_grounds) -"aaL" = ( -/obj/effect/spider/cocoon, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/left_spiders) "aaM" = ( /obj/structure/platform/strata{ dir = 4 @@ -247,10 +226,6 @@ /obj/item/explosive/plastic, /turf/open/auto_turf/ice/layer1, /area/shiva/exterior/cp_colony_grounds) -"aaP" = ( -/mob/living/simple_animal/hostile/giant_spider/hunter, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/left_spiders) "aaQ" = ( /obj/effect/spider/stickyweb, /obj/item/clothing/head/helmet/marine/sof, @@ -272,12 +247,6 @@ }, /turf/open/auto_turf/ice/layer1, /area/shiva/exterior/cp_lz2) -"aaU" = ( -/obj/effect/spider/cocoon{ - icon_state = "cocoon_large3" - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/left_spiders) "aaV" = ( /obj/effect/spider/stickyweb, /obj/effect/spider/cocoon{ @@ -301,7 +270,7 @@ "aaZ" = ( /obj/structure/fence, /turf/open/auto_turf/ice/layer1, -/area/shiva/interior/warehouse/caves) +/area/shiva/interior/caves/research_caves) "aba" = ( /obj/item/device/flashlight/lamp/tripod/grey, /turf/open/auto_turf/snow/layer3, @@ -455,7 +424,7 @@ /area/shiva/exterior/cp_lz2) "abv" = ( /obj/structure/prop/ice_colony/surveying_device, -/turf/open/auto_turf/ice/layer1, +/turf/open/auto_turf/snow/layer1, /area/shiva/interior/caves/cp_camp) "abw" = ( /obj/item/lightstick/red/spoke/planted{ @@ -493,20 +462,6 @@ }, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/cp_camp) -"abC" = ( -/mob/living/simple_animal/hostile/giant_spider/nurse, -/obj/effect/spider/stickyweb{ - icon_state = "stickyweb2" - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/left_spiders) -"abD" = ( -/obj/effect/spider/cocoon, -/obj/effect/spider/stickyweb{ - icon_state = "stickyweb2" - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/left_spiders) "abE" = ( /obj/effect/landmark/hunter_primary, /turf/open/auto_turf/ice/layer1, @@ -521,11 +476,6 @@ /obj/effect/landmark/hunter_secondary, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/cp_camp) -"abI" = ( -/obj/effect/spider/stickyweb, -/obj/item/device/flashlight/lamp/tripod/grey, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/left_spiders) "abJ" = ( /turf/open/shuttle/elevator/grating, /area/shiva/interior/colony/research_hab) @@ -535,11 +485,6 @@ }, /turf/open/auto_turf/ice/layer2, /area/shiva/interior/caves/right_spiders) -"abL" = ( -/obj/effect/spider/cocoon, -/obj/effect/spider/stickyweb, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/left_spiders) "abM" = ( /turf/closed/shuttle/elevator{ dir = 1 @@ -549,25 +494,6 @@ /obj/effect/spider/stickyweb, /turf/open/auto_turf/ice/layer0, /area/shiva/interior/caves/right_spiders) -"abO" = ( -/obj/effect/spider/cocoon{ - icon_state = "cocoon_large3" - }, -/obj/effect/spider/stickyweb{ - icon_state = "stickyweb2" - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/left_spiders) -"abP" = ( -/obj/structure/prop/ice_colony/surveying_device{ - dir = 4 - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) -"abQ" = ( -/obj/structure/prop/ice_colony/surveying_device/measuring_device, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "abR" = ( /obj/structure/flora/grass/tallgrass/ice, /obj/structure/flora/bush/ausbushes/lavendergrass, @@ -579,12 +505,6 @@ }, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/cp_lz2) -"abT" = ( -/obj/structure/tunnel{ - id = "north_research_tunnel" - }, -/turf/open/auto_turf/ice/layer0, -/area/shiva/interior/caves/cp_camp) "abU" = ( /obj/structure/flora/grass/tallgrass/ice/corner{ dir = 1 @@ -631,7 +551,7 @@ "abZ" = ( /obj/item/lightstick/planted, /turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/cp_s_research) +/area/shiva/exterior/junkyard) "aca" = ( /obj/item/tank/oxygen, /obj/item/tank/oxygen, @@ -649,17 +569,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/colony/research_hab) -"acc" = ( -/obj/item/tool/shovel/spade{ - pixel_x = -3; - pixel_y = -3 - }, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/cp_s_research) -"acd" = ( -/obj/structure/machinery/space_heater, -/turf/open/auto_turf/ice/layer1, -/area/shiva/exterior/research_alley) "ace" = ( /turf/closed/shuttle/elevator/gears, /area/shiva/interior/colony/central) @@ -809,16 +718,6 @@ "acL" = ( /turf/closed/shuttle/elevator/arrivals, /area/shiva/interior/colony/central) -"acM" = ( -/mob/living/simple_animal/hostile/retaliate/clown{ - desc = "Uh oh, looks like Gonzo got blocked by a cave-in. How is he gonna get out of this one?"; - health = 10000; - move_to_delay = 2; - name = "Gonzo the Magnificent"; - rapid = 1 - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/oob/dev_room) "acN" = ( /obj/structure/machinery/door/airlock/almayer/security/glass/colony{ name = "\improper Underground Security Interrogation"; @@ -826,12 +725,6 @@ }, /turf/open/floor/plating, /area/shiva/interior/colony/medseceng) -"acO" = ( -/obj/effect/decal/hefa_cult_decals/d96{ - desc = "Original map by Infernus, remapped by Triiodine." - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/oob/dev_room) "acP" = ( /obj/effect/landmark/xeno_spawn, /turf/open/auto_turf/ice/layer1, @@ -1553,7 +1446,7 @@ "agy" = ( /obj/item/lightstick/planted, /turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/cp_s_research) +/area/shiva/exterior/junkyard) "agz" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor{ @@ -1700,13 +1593,6 @@ dir = 1 }, /area/shiva/interior/colony/medseceng) -"ahB" = ( -/obj/structure/machinery/light/double{ - dir = 8; - pixel_y = -5 - }, -/turf/open/floor/shiva, -/area/shiva/interior/colony/research_hab) "ahC" = ( /obj/structure/flora/bush/snow{ icon_state = "snowgrassbb_2" @@ -2115,9 +2001,8 @@ /turf/open/floor/plating, /area/shiva/interior/colony/medseceng) "ajy" = ( -/obj/structure/machinery/colony_floodlight, -/turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/cp_s_research) +/turf/open/floor/shiva, +/area/shiva/interior/caves/cp_camp) "ajD" = ( /obj/structure/machinery/vending/snack, /turf/open/floor/shiva{ @@ -2230,7 +2115,7 @@ "akf" = ( /obj/item/lightstick/red/planted, /turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/cp_s_research) +/area/shiva/exterior/junkyard) "akh" = ( /obj/effect/landmark/xeno_spawn, /turf/open/floor/shiva{ @@ -2261,6 +2146,7 @@ /obj/structure/barricade/snow{ dir = 4 }, +/obj/structure/blocker/forcefield/multitile_vehicles, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/junkyard/fortbiceps) "akr" = ( @@ -2741,16 +2627,6 @@ icon_state = "bluefull" }, /area/shiva/interior/colony/n_admin) -"ano" = ( -/obj/structure/closet/toolcloset, -/obj/structure/machinery/light/double{ - dir = 4; - pixel_y = -5 - }, -/turf/open/floor/shiva{ - icon_state = "floor3" - }, -/area/shiva/interior/aerodrome) "anq" = ( /obj/structure/toilet, /turf/open/floor/plating, @@ -3526,10 +3402,6 @@ }, /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/cp_lz2) -"asC" = ( -/obj/structure/fence, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/research_alley) "asE" = ( /obj/structure/prop/invuln/ice_prefab{ dir = 5 @@ -3705,10 +3577,6 @@ }, /turf/open/auto_turf/ice/layer0, /area/shiva/interior/caves/cp_camp) -"atJ" = ( -/obj/structure/flora/tree/dead/tree_3, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/research_alley) "atK" = ( /obj/structure/fence, /turf/open/auto_turf/snow/layer1, @@ -3959,6 +3827,10 @@ }, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/cp_lz2) +"awP" = ( +/obj/item/lightstick/red/variant/planted, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/cp_s_research) "awY" = ( /obj/structure/flora/grass/tallgrass/ice, /obj/structure/flora/bush/ausbushes/lavendergrass{ @@ -4230,6 +4102,10 @@ icon_state = "yellowcorners" }, /area/shiva/interior/garage) +"ayz" = ( +/obj/structure/fence, +/turf/open/auto_turf/snow/layer3, +/area/shiva/exterior/cp_s_research) "ayB" = ( /obj/structure/surface/table, /obj/item/device/flashlight, @@ -4253,12 +4129,6 @@ /obj/item/clothing/shoes/snow, /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/cp_lz2) -"ayJ" = ( -/obj/structure/prop/invuln/ice_prefab/standalone{ - icon_state = "white" - }, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/research_alley) "ayK" = ( /obj/structure/prop/invuln/ice_prefab, /turf/open/auto_turf/snow/layer0, @@ -5179,10 +5049,6 @@ icon_state = "floor3" }, /area/shiva/interior/bar) -"aHz" = ( -/obj/structure/flora/tree/dead/tree_1, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/research_alley) "aHB" = ( /obj/structure/flora/bush/snow{ icon_state = "snowgrassbb_1" @@ -5219,19 +5085,12 @@ /obj/item/weapon/wirerod, /turf/open/shuttle/elevator/grating, /area/shiva/interior/aerodrome) -"aIO" = ( -/turf/closed/wall/shiva/prefabricated/red, -/area/shiva/interior/oob) "aJc" = ( /obj/structure/largecrate/random/mini/med, /turf/open/floor/shiva{ icon_state = "floor3" }, /area/shiva/interior/valley_huts/no2) -"aJd" = ( -/obj/structure/surface/table/reinforced/prison, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "aJe" = ( /obj/effect/spawner/random/toolbox, /obj/effect/landmark/crap_item, @@ -5296,12 +5155,6 @@ icon_state = "floor3" }, /area/shiva/interior/aerodrome) -"aJR" = ( -/obj/structure/flora/bush/snow{ - icon_state = "snowgrassgb_2" - }, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/cp_s_research) "aJU" = ( /obj/structure/bed/chair/office/light{ dir = 8 @@ -5312,9 +5165,6 @@ /obj/structure/prop/invuln/ice_prefab/standalone/trim{ icon_state = "pink_trim" }, -/obj/structure/machinery/portable_atmospherics/powered/scrubber{ - icon_state = "psiphon:1" - }, /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/valley) "aKn" = ( @@ -5323,18 +5173,6 @@ }, /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/valley) -"aKo" = ( -/obj/structure/surface/rack, -/obj/item/ammo_rcd{ - pixel_x = -4 - }, -/obj/item/ammo_rcd{ - pixel_x = 4 - }, -/turf/open/floor/shiva{ - icon_state = "floor3" - }, -/area/shiva/interior/caves/cp_camp) "aKp" = ( /obj/effect/decal/cleanable/blood, /turf/open/auto_turf/snow/layer3, @@ -5346,33 +5184,12 @@ }, /turf/open/floor/plating, /area/shiva/interior/colony/medseceng) -"aKr" = ( -/obj/structure/stairs/perspective{ - dir = 1; - icon_state = "p_stair_sn_full_cap" - }, -/turf/open/auto_turf/snow/layer0, -/area/shiva/interior/bar) "aKv" = ( /obj/item/stack/folding_barricade, /turf/open/floor/shiva{ icon_state = "floor3" }, /area/shiva/interior/colony/s_admin) -"aKA" = ( -/obj/structure/stairs/perspective{ - dir = 1; - icon_state = "p_stair_full" - }, -/turf/open/auto_turf/snow/layer0, -/area/shiva/interior/bar) -"aKD" = ( -/obj/structure/stairs/perspective{ - dir = 8; - icon_state = "p_stair_sn_full_cap" - }, -/turf/open/auto_turf/snow/layer0, -/area/shiva/interior/bar) "aKJ" = ( /obj/structure/machinery/door/airlock/almayer/generic{ dir = 1; @@ -5392,15 +5209,6 @@ }, /turf/open/floor/plating, /area/shiva/interior/aerodrome) -"aKP" = ( -/obj/structure/platform/strata{ - dir = 1 - }, -/obj/structure/platform/strata{ - dir = 4 - }, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/lz1_valley) "aKQ" = ( /obj/structure/machinery/computer/cameras, /obj/structure/surface/table/reinforced/prison, @@ -5498,24 +5306,11 @@ }, /turf/open/auto_turf/snow/layer0, /area/shiva/exterior/junkyard/cp_bar) -"aMk" = ( -/obj/effect/decal/cleanable/blood{ - dir = 4; - icon_state = "gib6" - }, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/junkyard/cp_bar) "aMl" = ( /obj/effect/landmark/corpsespawner/engineer, /obj/effect/decal/cleanable/blood, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/junkyard/cp_bar) -"aMn" = ( -/obj/structure/platform/strata{ - dir = 4 - }, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/lz1_valley) "aMs" = ( /obj/structure/flora/pottedplant{ icon_state = "pottedplant_22"; @@ -5550,16 +5345,6 @@ icon_state = "floor3" }, /area/shiva/interior/colony/central) -"aMy" = ( -/obj/structure/machinery/space_heater, -/obj/structure/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/shiva{ - dir = 8; - icon_state = "snow_mat" - }, -/area/shiva/interior/caves/cp_camp) "aMz" = ( /obj/structure/machinery/smartfridge{ density = 0; @@ -5648,13 +5433,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/asphalt/cement, /area/shiva/interior/warehouse) -"aMZ" = ( -/obj/structure/machinery/power/port_gen/pacman, -/obj/structure/machinery/light/small{ - dir = 4 - }, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/cp_s_research) "aNb" = ( /obj/structure/safe, /obj/item/spacecash/c1000{ @@ -5785,27 +5563,11 @@ /obj/structure/machinery/colony_floodlight, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/cp_colony_grounds) -"aOk" = ( -/obj/structure/prop/invuln/ice_prefab/standalone/trim{ - icon_state = "pink_trim" - }, -/turf/open/auto_turf/snow/layer4, -/area/shiva/exterior/valley) -"aOl" = ( -/obj/structure/prop/invuln/ice_prefab/roof_greeble{ - dir = 1 - }, -/turf/open/auto_turf/snow/layer4, -/area/shiva/exterior/valley) "aOo" = ( /obj/item/dogtag, /obj/effect/decal/cleanable/blood, /turf/open/auto_turf/snow/layer0, /area/shiva/interior/bar) -"aOp" = ( -/obj/item/tool/shovel/snow, -/turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/valley) "aOu" = ( /turf/closed/wall/shiva/ice, /area/shiva/interior/caves/medseceng_caves) @@ -5924,15 +5686,6 @@ icon_state = "multi_tiles" }, /area/shiva/interior/colony/central) -"aPX" = ( -/obj/structure/prop/invuln/ice_prefab/trim{ - dir = 4 - }, -/obj/structure/prop/invuln/ice_prefab/roof_greeble{ - dir = 1 - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "aQb" = ( /obj/effect/decal/cleanable/blood, /turf/open/floor/shiva{ @@ -5946,19 +5699,6 @@ icon_state = "floor3" }, /area/shiva/interior/aerodrome) -"aQh" = ( -/obj/item/lightstick/red/spoke/planted{ - layer = 2.99; - pixel_x = -13; - pixel_y = 28 - }, -/obj/structure/largecrate/random/mini/small_case/b, -/obj/structure/largecrate/random/mini/small_case{ - pixel_x = 14; - pixel_y = -3 - }, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/valley) "aQi" = ( /obj/structure/largecrate/random/barrel/red, /turf/open/auto_turf/snow/layer2, @@ -6020,20 +5760,6 @@ /obj/item/stool, /turf/open/floor/shiva, /area/shiva/interior/bar) -"aRo" = ( -/obj/structure/largecrate/random/mini/med{ - pixel_x = -7; - pixel_y = 9 - }, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/valley) -"aRp" = ( -/obj/structure/prop/invuln/ice_prefab/standalone/trim{ - icon_state = "pink_trim" - }, -/obj/structure/prop/invuln/ice_prefab/roof_greeble, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/valley) "aRs" = ( /obj/structure/closet/radiation, /obj/structure/machinery/light/double{ @@ -6120,25 +5846,6 @@ /obj/effect/decal/cleanable/blood/oil, /turf/open/floor/shiva, /area/shiva/interior/aerodrome) -"aSC" = ( -/obj/item/lightstick/red/spoke/planted{ - layer = 3.1; - pixel_x = -13; - pixel_y = 25 - }, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/research_alley) -"aSF" = ( -/obj/item/reagent_container/glass/bucket{ - pixel_x = 8; - pixel_y = -8 - }, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/valley) -"aSG" = ( -/obj/structure/largecrate/random/case/double, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/valley) "aSI" = ( /obj/structure/closet/radiation, /turf/open/floor/shiva{ @@ -6185,7 +5892,7 @@ name = "\improper Anti-Freeze Lounge" }, /turf/open/floor/plating, -/area/shiva/interior/bar) +/area/shiva/exterior/cp_s_research) "aSX" = ( /obj/structure/largecrate/random/mini/ammo, /turf/open/floor/plating, @@ -6232,52 +5939,10 @@ /obj/effect/spawner/random/tool, /turf/open/floor/shiva, /area/shiva/interior/aerodrome) -"aTr" = ( -/obj/item/tool/shovel/snow{ - pixel_y = 8 - }, -/obj/item/tool/shovel/snow, -/obj/structure/surface/rack, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/valley) -"aTt" = ( -/obj/item/lightstick/red/variant/planted{ - pixel_x = 11; - pixel_y = 11 - }, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/valley) -"aTw" = ( -/obj/structure/prop/ice_colony/soil_net, -/obj/item/tool/shovel/spade{ - layer = 2.99; - pixel_x = -9; - pixel_y = -11 - }, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/valley) "aTE" = ( /obj/structure/largecrate/random/barrel, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/s_lz2) -"aTH" = ( -/obj/item/reagent_container/glass/bucket{ - pixel_x = 9; - pixel_y = 8 - }, -/obj/structure/largecrate/random/case, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/valley) -"aTL" = ( -/obj/structure/largecrate/random/case{ - pixel_y = 11 - }, -/obj/structure/largecrate/random/mini/chest/b{ - pixel_x = -4; - pixel_y = -5 - }, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/valley) "aTO" = ( /obj/item/stack/rods, /turf/open/asphalt/cement, @@ -6377,21 +6042,6 @@ icon_state = "green" }, /area/shiva/interior/colony/botany) -"aUP" = ( -/obj/structure/surface/rack, -/obj/item/stack/cable_coil/blue, -/obj/item/stack/cable_coil/orange{ - pixel_y = 6 - }, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/valley) -"aUQ" = ( -/obj/item/lightstick/red/spoke/planted{ - pixel_x = 12; - pixel_y = 25 - }, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/research_alley) "aUS" = ( /obj/structure/machinery/disposal, /turf/open/floor/shiva{ @@ -6582,13 +6232,6 @@ icon_state = "floor7" }, /area/shiva/interior/aerodrome) -"aVW" = ( -/obj/item/lightstick/red/variant/planted{ - pixel_x = -7; - pixel_y = -5 - }, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/valley) "aWb" = ( /obj/structure/foamed_metal, /obj/item/weapon/gun/shotgun/pump/dual_tube/cmb, @@ -6650,16 +6293,6 @@ }, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/junkyard) -"aWG" = ( -/obj/item/lightstick/red/spoke/planted{ - pixel_x = -11; - pixel_y = 20 - }, -/obj/structure/flora/grass/tallgrass/ice/corner{ - dir = 4 - }, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/junkyard) "aWH" = ( /obj/structure/flora/grass/tallgrass/ice/corner{ dir = 4 @@ -6817,28 +6450,6 @@ opacity = 0 }, /area/shiva/interior/aerodrome) -"aYf" = ( -/obj/structure/machinery/light{ - dir = 8 - }, -/obj/structure/bed/chair/dropship/passenger{ - dir = 4 - }, -/turf/open/shuttle/dropship{ - icon_state = "rasputin15" - }, -/area/shiva/interior/aerodrome) -"aYg" = ( -/obj/structure/machinery/light{ - dir = 4 - }, -/obj/structure/bed/chair/dropship/passenger{ - dir = 8 - }, -/turf/open/shuttle/dropship{ - icon_state = "rasputin15" - }, -/area/shiva/interior/aerodrome) "aYx" = ( /turf/closed/shuttle/ert{ icon_state = "rightengine_3" @@ -6848,10 +6459,6 @@ /obj/structure/window_frame/shiva, /turf/open/floor/plating, /area/shiva/interior/aerodrome) -"aYF" = ( -/obj/item/stack/rods, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/valley) "aYU" = ( /obj/structure/machinery/computer/arcade, /turf/open/floor/shiva{ @@ -6955,9 +6562,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/auto_turf/snow/layer0, /area/shiva/interior/bar) -"bax" = ( -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/research_alley) "baN" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/tool/pen/blue{ @@ -7024,12 +6628,6 @@ /obj/item/stack/rods, /turf/open/floor/plating, /area/shiva/interior/aerodrome) -"bbt" = ( -/obj/item/shard{ - icon_state = "medium" - }, -/turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/valley) "bbw" = ( /obj/structure/barricade/handrail/strata{ dir = 8 @@ -7039,12 +6637,6 @@ icon_state = "multi_tiles" }, /area/shiva/interior/colony/deck) -"bbF" = ( -/obj/structure/platform/strata{ - dir = 8 - }, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/valley) "bbG" = ( /obj/structure/ice/thin/indestructible{ dir = 4; @@ -7102,33 +6694,11 @@ }, /turf/open/gm/river, /area/shiva/interior/warehouse/caves) -"bdk" = ( -/obj/structure/bed/chair/dropship/passenger{ - dir = 4 - }, -/obj/structure/machinery/light{ - dir = 8 - }, -/turf/open/shuttle/dropship{ - icon_state = "rasputin15" - }, -/area/shiva/interior/aerodrome) "bdT" = ( /turf/open/floor/shiva{ icon_state = "radiator_tile2" }, /area/shiva/interior/colony/medseceng) -"bea" = ( -/obj/structure/bed/chair/dropship/passenger{ - dir = 8 - }, -/obj/structure/machinery/light{ - dir = 4 - }, -/turf/open/shuttle/dropship{ - icon_state = "rasputin15" - }, -/area/shiva/interior/aerodrome) "ben" = ( /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/telecomm/lz1_north) @@ -7187,10 +6757,6 @@ icon_state = "floor3" }, /area/shiva/interior/aerodrome) -"bfB" = ( -/obj/effect/spawner/random/tool, -/turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/valley) "bfL" = ( /obj/structure/largecrate/random/mini/wooden, /turf/open/auto_turf/snow/layer2, @@ -7226,7 +6792,7 @@ icon_state = "snowgrassall_1" }, /turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/cp_s_research) +/area/shiva/exterior/junkyard) "bhI" = ( /turf/open/floor/shiva{ dir = 6; @@ -7282,6 +6848,10 @@ }, /turf/open/floor/plating, /area/shiva/interior/colony/central) +"bkK" = ( +/obj/structure/inflatable/popped, +/turf/open/auto_turf/snow/layer0, +/area/shiva/exterior/cp_s_research) "bkP" = ( /obj/effect/spider/cocoon{ icon_state = "cocoon_large2" @@ -7300,6 +6870,10 @@ icon_state = "green" }, /area/shiva/interior/colony/botany) +"bme" = ( +/obj/structure/blocker/forcefield/multitile_vehicles, +/turf/open/auto_turf/ice/layer1, +/area/shiva/exterior/valley) "bmg" = ( /obj/structure/machinery/space_heater, /turf/open/auto_turf/snow/layer2, @@ -7339,12 +6913,6 @@ /obj/structure/bed/chair, /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/junkyard) -"boz" = ( -/obj/structure/flora/grass/tallgrass/ice/corner{ - dir = 8 - }, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/lz1_valley) "boA" = ( /obj/item/tool/crowbar, /turf/open/auto_turf/snow/layer1, @@ -7357,12 +6925,6 @@ /obj/docking_port/stationary/marine_dropship/lz1, /turf/open/floor/plating, /area/shiva/exterior/lz1_valley) -"boS" = ( -/obj/structure/flora/bush/snow{ - icon_state = "snowgrassbb_3" - }, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/cp_s_research) "boT" = ( /obj/structure/largecrate/random/mini/wooden{ pixel_y = 6 @@ -7617,10 +7179,14 @@ /obj/structure/largecrate/random/barrel, /turf/open/floor/plating, /area/shiva/interior/colony/central) -"bBT" = ( -/obj/structure/inflatable/popped, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/research_alley) +"bCr" = ( +/obj/structure/surface/table/reinforced/prison, +/obj/structure/machinery/computer/shuttle/dropship/flight/lz1, +/obj/effect/decal/warning_stripes{ + icon_state = "E-corner" + }, +/turf/open/floor/plating, +/area/shiva/exterior/lz1_valley) "bDx" = ( /obj/item/reagent_container/food/drinks/flask/vacuumflask, /turf/open/floor/shiva, @@ -7660,16 +7226,6 @@ }, /turf/open/floor/plating, /area/shiva/interior/aerodrome) -"bGk" = ( -/obj/item/stack/rods, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/valley) -"bGx" = ( -/obj/item/shard{ - icon_state = "medium" - }, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/valley) "bGU" = ( /obj/structure/prop/invuln/ice_prefab{ dir = 9 @@ -7868,16 +7424,6 @@ dir = 1 }, /area/shiva/interior/colony/medseceng) -"bQX" = ( -/obj/structure/prop/ice_colony/poly_kevlon_roll{ - pixel_y = 21 - }, -/obj/structure/prop/ice_colony/poly_kevlon_roll{ - pixel_x = -7; - pixel_y = 13 - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "bQZ" = ( /turf/closed/wall/shiva/prefabricated/reinforced/hull, /area/shiva/interior/caves/s_lz2) @@ -7890,7 +7436,7 @@ "bRU" = ( /obj/structure/flora/tree/dead/tree_5, /turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/cp_s_research) +/area/shiva/exterior/junkyard) "bSB" = ( /obj/structure/prop/invuln{ desc = "big pile energy."; @@ -8046,6 +7592,16 @@ icon_state = "red" }, /area/shiva/interior/colony/central) +"bYV" = ( +/obj/structure/machinery/disposal, +/obj/structure/machinery/light/double{ + dir = 8; + pixel_y = -5 + }, +/turf/open/floor/shiva{ + icon_state = "floor3" + }, +/area/shiva/interior/aerodrome) "bZZ" = ( /obj/effect/landmark/objective_landmark/far, /turf/open/floor/shiva{ @@ -8088,6 +7644,10 @@ dir = 1 }, /area/shiva/interior/colony/s_admin) +"cbG" = ( +/obj/effect/spawner/random/tool, +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/caves/cp_camp) "cbW" = ( /obj/structure/largecrate/random/mini/med, /turf/open/floor/plating, @@ -8105,6 +7665,13 @@ /obj/structure/prop/invuln/ice_prefab/standalone, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/cp_camp) +"ccT" = ( +/obj/item/lightstick/red/spoke/planted{ + pixel_x = 12; + pixel_y = 25 + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/exterior/cp_s_research) "cdh" = ( /obj/structure/fence, /turf/open/auto_turf/snow/layer2, @@ -8169,6 +7736,13 @@ icon_state = "multi_tiles" }, /area/shiva/interior/colony/research_hab) +"cid" = ( +/obj/structure/platform/strata{ + dir = 4 + }, +/obj/structure/platform/strata, +/turf/open/gm/river, +/area/shiva/exterior/cp_s_research) "cio" = ( /turf/open/floor/shiva{ icon_state = "floor3" @@ -8212,9 +7786,6 @@ icon_state = "yellow" }, /area/shiva/interior/colony/medseceng) -"clK" = ( -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/left_spiders) "cnb" = ( /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/telecomm/lz2_northeast) @@ -8272,6 +7843,13 @@ icon_state = "red" }, /area/shiva/interior/colony/medseceng) +"cps" = ( +/obj/effect/decal/cleanable/blood{ + dir = 4; + icon_state = "gib6" + }, +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/caves/cp_camp) "cpC" = ( /obj/item/lightstick/red/variant/planted, /turf/open/auto_turf/snow/layer1, @@ -8398,10 +7976,6 @@ icon_state = "multi_tiles" }, /area/shiva/interior/colony/botany) -"cyW" = ( -/obj/structure/girder, -/turf/open/auto_turf/snow/layer1, -/area/shiva/interior/caves/cp_camp) "czf" = ( /obj/structure/flora/bush/snow{ icon_state = "snowgrassall_1" @@ -8440,10 +8014,6 @@ icon_state = "yellow" }, /area/shiva/interior/colony/medseceng) -"cBs" = ( -/obj/structure/machinery/cell_charger, -/turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/research_alley) "cBB" = ( /obj/item/clothing/shoes/snow, /obj/structure/surface/rack, @@ -8482,16 +8052,6 @@ /obj/structure/machinery/vending/cigarette, /turf/open/floor/shiva, /area/shiva/interior/bar) -"cBU" = ( -/turf/open/auto_turf/snow/layer1, -/area/shiva/interior/caves/research_caves) -"cBX" = ( -/obj/item/lightstick/red/spoke/planted{ - pixel_x = -16; - pixel_y = -3 - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "cCI" = ( /turf/open/floor/shiva{ dir = 8; @@ -8516,10 +8076,6 @@ icon_state = "wred" }, /area/shiva/interior/colony/medseceng) -"cEV" = ( -/obj/structure/inflatable, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/research_alley) "cFa" = ( /obj/structure/machinery/light/double{ dir = 4; @@ -8593,10 +8149,26 @@ }, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/cp_lz2) +"cIs" = ( +/obj/item/lightstick/red/spoke/planted{ + layer = 2.99; + pixel_x = 12; + pixel_y = 28 + }, +/turf/closed/wall/shiva/ice, +/area/shiva/interior/caves/cp_camp) "cIV" = ( /obj/structure/blocker/forcefield/multitile_vehicles, /turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/research_caves) +/area/shiva/interior/warehouse/caves) +"cIZ" = ( +/obj/structure/surface/rack, +/obj/item/stack/cable_coil/blue, +/obj/item/stack/cable_coil/orange{ + pixel_y = 6 + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "cJy" = ( /obj/structure/surface/table, /turf/open/floor/shiva{ @@ -8791,6 +8363,13 @@ icon_state = "bluecorners" }, /area/shiva/interior/colony/central) +"cTU" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/warning_stripes{ + icon_state = "E-corner" + }, +/turf/open/floor/plating, +/area/shiva/exterior/lz1_valley) "cTY" = ( /obj/item/ammo_magazine/flamer_tank, /turf/open/floor/shiva{ @@ -8869,6 +8448,15 @@ /obj/structure/prop/ice_colony/surveying_device, /turf/open/auto_turf/snow/layer2, /area/shiva/interior/caves/cp_camp) +"cXU" = ( +/obj/structure/platform/strata{ + dir = 1 + }, +/obj/structure/platform/strata{ + dir = 4 + }, +/turf/open/gm/river, +/area/shiva/exterior/cp_s_research) "cYa" = ( /turf/open/floor/shiva{ dir = 8; @@ -8964,11 +8552,19 @@ "daD" = ( /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/junkyard/cp_bar) +"dbv" = ( +/obj/structure/largecrate/random/case, +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/aerodrome) "dbH" = ( /turf/closed/shuttle/ert{ icon_state = "stan1" }, /area/shiva/interior/aerodrome) +"dbO" = ( +/obj/structure/prop/invuln/ice_prefab/standalone, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/cp_s_research) "dbQ" = ( /obj/structure/bed/chair/office/light{ dir = 8 @@ -8977,6 +8573,17 @@ icon_state = "wredfull" }, /area/shiva/interior/colony/medseceng) +"dcn" = ( +/obj/item/lightstick/red/spoke/planted{ + layer = 2.99; + pixel_x = -13; + pixel_y = 28 + }, +/obj/structure/prop/invuln/ice_prefab/roof_greeble{ + dir = 1 + }, +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) "dcu" = ( /obj/structure/flora/tree/dead/tree_4, /turf/open/auto_turf/snow/layer2, @@ -8996,12 +8603,6 @@ dir = 1 }, /area/shiva/interior/colony/medseceng) -"ddA" = ( -/obj/structure/flora/bush/snow{ - icon_state = "snowgrassbb_1" - }, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/cp_s_research) "dex" = ( /obj/structure/machinery/photocopier, /obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot, @@ -9038,10 +8639,6 @@ /obj/vehicle/train/cargo/engine, /turf/open/auto_turf/snow/layer0, /area/shiva/exterior/junkyard/cp_bar) -"dhx" = ( -/obj/item/device/binoculars/civ, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/research_caves) "diL" = ( /obj/structure/machinery/light/double{ dir = 1; @@ -9130,6 +8727,11 @@ /obj/structure/window/reinforced, /turf/open/floor/wood, /area/shiva/interior/colony/central) +"dnj" = ( +/obj/structure/surface/rack, +/obj/item/tool/shovel/snow, +/turf/open/auto_turf/snow/layer3, +/area/shiva/exterior/cp_s_research) "dnv" = ( /obj/structure/prop/invuln/minecart_tracks/bumper{ dir = 5 @@ -9188,6 +8790,11 @@ /obj/item/device/flashlight/lamp, /turf/open/floor/carpet, /area/shiva/interior/colony/central) +"dro" = ( +/obj/structure/platform/strata, +/obj/structure/blocker/forcefield/multitile_vehicles, +/turf/open/auto_turf/snow/layer1, +/area/shiva/exterior/cp_s_research) "drx" = ( /obj/structure/bed/chair/comfy/black{ dir = 4 @@ -9308,7 +8915,7 @@ "dyt" = ( /obj/vehicle/train/cargo/trolley, /turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/cp_s_research) +/area/shiva/exterior/junkyard) "dze" = ( /obj/effect/decal/warning_stripes{ icon_state = "W-corner" @@ -9361,14 +8968,10 @@ icon_state = "stan2" }, /area/shiva/interior/aerodrome) -"dCY" = ( -/obj/structure/ice/thin/single{ - opacity = 1; - unacidable = 0 - }, -/obj/structure/blocker/forcefield/multitile_vehicles, -/turf/open/auto_turf/ice/layer2, -/area/shiva/interior/caves/left_spiders) +"dDj" = ( +/obj/item/tool/shovel/snow, +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/caves/cp_camp) "dDo" = ( /obj/structure/machinery/landinglight/ds1/spoke, /turf/open/floor/shiva{ @@ -9397,12 +9000,6 @@ dir = 1 }, /area/shiva/interior/colony/central) -"dHr" = ( -/obj/structure/flora/bush/snow{ - icon_state = "snowgrassall_3" - }, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/cp_s_research) "dIF" = ( /obj/structure/machinery/photocopier, /turf/open/floor/shiva{ @@ -9534,13 +9131,8 @@ }, /area/shiva/interior/colony/n_admin) "dRb" = ( -/turf/closed/wall/shiva/ice, -/area/shiva/interior/caves/left_spiders) -"dRi" = ( -/obj/structure/prop/invuln/ice_prefab{ - dir = 10 - }, -/turf/open/auto_turf/ice/layer1, +/obj/structure/fence, +/turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/cp_camp) "dTj" = ( /obj/structure/machinery/space_heater, @@ -9703,12 +9295,6 @@ icon_state = "floor3" }, /area/shiva/interior/colony/research_hab) -"eaB" = ( -/obj/structure/platform/strata{ - dir = 4 - }, -/turf/open/auto_turf/snow/layer4, -/area/shiva/exterior/lz1_valley) "ebK" = ( /obj/structure/fence, /turf/open/auto_turf/snow/layer2, @@ -9732,9 +9318,15 @@ icon_state = "floor3" }, /area/shiva/interior/colony/botany) +"ecx" = ( +/obj/structure/largecrate/random, +/turf/open/floor/shiva{ + icon_state = "floor3" + }, +/area/shiva/interior/caves/cp_camp) "ecz" = ( /obj/structure/barricade/handrail/wire, -/turf/open/auto_turf/snow/layer0, +/turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/cp_camp) "ecZ" = ( /turf/open/floor/shiva{ @@ -9784,10 +9376,8 @@ }, /turf/open/floor/wood, /area/shiva/interior/colony/botany) -"ehe" = ( -/obj/effect/landmark/nightmare{ - insert_tag = "labs-entrance" - }, +"ehO" = ( +/obj/structure/blocker/forcefield/multitile_vehicles, /turf/closed/wall/shiva/prefabricated/blue, /area/shiva/interior/colony/research_hab) "ehV" = ( @@ -9825,6 +9415,13 @@ /obj/structure/largecrate/random/case/double, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/junkyard) +"elf" = ( +/obj/item/reagent_container/glass/bucket{ + pixel_x = 8; + pixel_y = -8 + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "eln" = ( /obj/structure/surface/table, /obj/item/book/manual/engineering_guide{ @@ -9877,9 +9474,6 @@ /obj/structure/prop/invuln/ice_prefab, /turf/open/auto_turf/ice/layer0, /area/shiva/exterior/cp_lz2) -"enh" = ( -/turf/open/auto_turf/ice/layer1, -/area/shiva/exterior/research_alley) "eni" = ( /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/cp_lz2) @@ -10142,13 +9736,6 @@ icon_state = "floor3" }, /area/shiva/interior/colony/research_hab) -"eGe" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "W-corner" - }, -/obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/plating, -/area/shiva/exterior/lz1_valley) "eGq" = ( /obj/structure/platform/strata, /obj/structure/platform/strata{ @@ -10235,17 +9822,6 @@ icon_state = "wred" }, /area/shiva/interior/colony/medseceng) -"eKp" = ( -/obj/item/reagent_container/glass/bucket{ - pixel_x = 8; - pixel_y = -8 - }, -/obj/item/reagent_container/glass/bucket{ - pixel_x = -2; - pixel_y = -8 - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "eKY" = ( /obj/structure/closet/radiation, /obj/effect/landmark/crap_item, @@ -10263,11 +9839,6 @@ }, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/cp_lz2) -"eMx" = ( -/obj/structure/surface/rack, -/obj/item/tool/lighter/zippo, -/turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/research_alley) "eNr" = ( /obj/structure/bed, /obj/effect/landmark/corpsespawner/prisoner, @@ -10353,11 +9924,14 @@ icon_state = "floor3" }, /area/shiva/interior/colony/research_hab) -"eSc" = ( -/obj/structure/surface/rack, -/obj/item/tool/pickaxe/plasmacutter, -/turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/research_alley) +"eSf" = ( +/obj/item/lightstick/red/spoke/planted{ + layer = 2.99; + pixel_x = 12; + pixel_y = 28 + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "eSt" = ( /obj/effect/landmark/xeno_spawn, /turf/open/floor/shiva{ @@ -10379,6 +9953,12 @@ }, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/cp_colony_grounds) +"eUn" = ( +/obj/structure/prop/invuln/ice_prefab/roof_greeble{ + dir = 1 + }, +/turf/open/auto_turf/snow/layer4, +/area/shiva/interior/caves/cp_camp) "eUT" = ( /turf/closed/wall/shiva/prefabricated/white, /area/shiva/exterior/cp_lz2) @@ -10409,6 +9989,10 @@ icon_state = "snow_mat" }, /area/shiva/exterior/cp_lz2) +"eWl" = ( +/obj/structure/inflatable/popped, +/turf/open/auto_turf/snow/layer1, +/area/shiva/exterior/cp_s_research) "eWn" = ( /obj/structure/machinery/iv_drip, /turf/open/floor/shiva{ @@ -10433,6 +10017,10 @@ }, /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/cp_lz2) +"eXQ" = ( +/obj/structure/inflatable/popped, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/cp_s_research) "eYH" = ( /turf/closed/wall/shiva/prefabricated/reinforced/hull, /area/shiva/exterior/cp_lz2) @@ -10465,17 +10053,6 @@ /obj/effect/landmark/ert_spawns/groundside_xeno, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/medseceng_caves) -"faR" = ( -/obj/structure/prop/invuln/dense/ice_tray{ - dir = 8; - pixel_y = -9 - }, -/obj/structure/prop/invuln/dense/ice_tray{ - dir = 5; - pixel_y = 10 - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "faT" = ( /obj/structure/prop/invuln/ice_prefab{ dir = 8; @@ -10483,20 +10060,6 @@ }, /turf/open/auto_turf/ice/layer0, /area/shiva/exterior/cp_lz2) -"faW" = ( -/obj/structure/prop/ice_colony/poly_kevlon_roll{ - dir = 1 - }, -/obj/structure/prop/ice_colony/poly_kevlon_roll{ - dir = 1; - pixel_y = 5 - }, -/obj/structure/prop/ice_colony/poly_kevlon_roll{ - dir = 1; - pixel_y = 10 - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "fbf" = ( /obj/effect/decal/cleanable/blood/oil/streak, /obj/effect/decal/cleanable/dirt, @@ -10510,6 +10073,11 @@ icon_state = "floor3" }, /area/shiva/interior/colony/botany) +"fbS" = ( +/obj/structure/flora/grass/tallgrass/ice/corner, +/obj/structure/blocker/forcefield/multitile_vehicles, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/cp_s_research) "fcq" = ( /obj/structure/closet/coffin, /obj/effect/landmark/objective_landmark/close, @@ -10633,9 +10201,6 @@ /obj/structure/blocker/forcefield/multitile_vehicles, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/colony/medseceng) -"fjv" = ( -/turf/open/auto_turf/snow/layer4, -/area/shiva/interior/caves/research_caves) "fjI" = ( /obj/structure/surface/table, /obj/item/storage/firstaid/o2, @@ -10718,13 +10283,20 @@ /obj/effect/landmark/objective_landmark/science, /turf/open/floor/wood, /area/shiva/interior/colony/botany) +"fmo" = ( +/obj/structure/platform/strata{ + dir = 4 + }, +/obj/structure/platform/strata, +/turf/open/gm/river, +/area/shiva/interior/caves/research_caves) "fnw" = ( /obj/structure/stairs/perspective/ice{ dir = 1; icon_state = "p_stair_full" }, /turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/lz1_valley) +/area/shiva/interior/caves/research_caves) "fnx" = ( /turf/open/floor/shiva{ dir = 8; @@ -10753,13 +10325,13 @@ icon_state = "floor7" }, /area/shiva/interior/aerodrome) -"fqb" = ( -/obj/item/lightstick/red/spoke/planted{ - pixel_x = 12; - pixel_y = 25 +"fpF" = ( +/obj/structure/stairs/perspective/ice{ + dir = 8; + icon_state = "p_stair_sn_full_cap" }, /turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/valley) +/area/shiva/interior/warehouse/caves) "fqJ" = ( /obj/structure/bed/chair/office/dark{ dir = 1 @@ -10859,7 +10431,7 @@ "fxy" = ( /obj/item/lightstick/variant/planted, /turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/cp_s_research) +/area/shiva/exterior/junkyard) "fxJ" = ( /obj/structure/surface/table, /obj/item/clipboard{ @@ -10920,6 +10492,10 @@ icon_state = "greenfull" }, /area/shiva/interior/colony/n_admin) +"fBA" = ( +/obj/structure/machinery/space_heater, +/turf/open/auto_turf/ice/layer1, +/area/shiva/exterior/cp_s_research) "fBJ" = ( /obj/structure/surface/table/woodentable, /obj/item/paper_bin, @@ -10945,6 +10521,10 @@ dir = 1 }, /area/shiva/interior/colony/botany) +"fDH" = ( +/obj/structure/machinery/colony_floodlight, +/turf/open/auto_turf/snow/layer0, +/area/shiva/exterior/junkyard) "fEf" = ( /obj/structure/machinery/vending/snack, /turf/open/floor/shiva{ @@ -11044,7 +10624,7 @@ "fHx" = ( /obj/vehicle/train/cargo/engine, /turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/cp_s_research) +/area/shiva/exterior/junkyard) "fHH" = ( /obj/item/stack/sheet/metal, /turf/open/floor/shiva{ @@ -11148,6 +10728,21 @@ }, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/junkyard) +"fLk" = ( +/obj/item/clothing/shoes/snow, +/obj/structure/surface/rack, +/obj/item/clothing/shoes/snow, +/obj/item/clothing/suit/storage/snow_suit, +/obj/item/clothing/suit/storage/snow_suit, +/obj/item/tank/emergency_oxygen/engi, +/obj/effect/decal/strata_decals/grime/grime3{ + dir = 8 + }, +/obj/item/clothing/mask/rebreather, +/obj/item/tank/emergency_oxygen/engi, +/obj/item/clothing/mask/rebreather, +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/colony/research_hab) "fLz" = ( /obj/structure/machinery/landinglight/ds2{ dir = 4 @@ -11192,10 +10787,25 @@ /obj/structure/bed/chair/office/dark, /turf/open/floor/carpet, /area/shiva/interior/colony/medseceng) +"fNf" = ( +/obj/structure/platform/strata{ + dir = 8 + }, +/obj/structure/platform/strata{ + dir = 1 + }, +/turf/open/gm/river, +/area/shiva/interior/warehouse/caves) "fNE" = ( /obj/structure/window/framed/shiva, /turf/open/floor/plating, /area/shiva/interior/colony/research_hab) +"fOa" = ( +/obj/item/lightstick/red/spoke/planted{ + pixel_x = -11 + }, +/turf/open/auto_turf/snow/layer2, +/area/shiva/interior/caves/cp_camp) "fOE" = ( /obj/item/ammo_magazine/rifle/boltaction, /turf/open/floor/shiva{ @@ -11261,23 +10871,32 @@ icon_state = "multi_tiles" }, /area/shiva/interior/colony/botany) -"fSR" = ( -/turf/open/floor/shiva, -/area/shiva/interior/caves/research_caves) "fTX" = ( /obj/structure/machinery/space_heater, /turf/open/floor/shiva{ dir = 1 }, /area/shiva/interior/bar) +"fUP" = ( +/obj/structure/machinery/light/double{ + dir = 4; + pixel_y = -5 + }, +/turf/open/floor/shiva{ + dir = 8; + icon_state = "bluefull" + }, +/area/shiva/interior/aerodrome) "fUZ" = ( /obj/item/lightstick/red/planted, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/junkyard/cp_bar) -"fVl" = ( -/obj/structure/largecrate/random, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/cp_s_research) +"fVq" = ( +/obj/structure/prop/invuln/ice_prefab/standalone{ + icon_state = "pink" + }, +/turf/open/auto_turf/snow/layer2, +/area/shiva/interior/caves/cp_camp) "fVw" = ( /obj/structure/prop/ice_colony/dense/planter_box/hydro{ density = 0 @@ -11316,14 +10935,33 @@ icon_state = "floor3" }, /area/shiva/interior/aerodrome) +"fXp" = ( +/obj/structure/prop/invuln{ + desc = "The mounting points are ground down from heavy use. They'll need some maintenance work before they can be used again."; + icon = 'icons/obj/structures/props/almayer_props.dmi'; + icon_state = "equip_base"; + name = "shuttle attachment point" + }, +/obj/effect/landmark/objective_landmark/close, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/shuttle{ + icon_state = "floor7" + }, +/area/shiva/interior/aerodrome) +"fXr" = ( +/obj/item/lightstick/red/spoke/planted{ + layer = 3.1; + pixel_x = -13; + pixel_y = 25 + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "fXB" = ( /obj/structure/largecrate/random/case/double, /turf/open/asphalt/cement, /area/shiva/interior/warehouse) -"fXQ" = ( -/obj/structure/largecrate/random/case, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "fXX" = ( /turf/open/floor/plating, /area/shiva/interior/caves/research_caves) @@ -11465,29 +11103,11 @@ /obj/item/stack/rods, /turf/open/auto_turf/snow/layer0, /area/shiva/interior/warehouse) -"ggv" = ( -/obj/structure/prop/invuln/dense/ice_tray{ - dir = 5; - pixel_y = -9 - }, -/obj/structure/prop/invuln/dense/ice_tray{ - dir = 6; - pixel_y = 10 - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "ggC" = ( -/obj/structure/bed/chair{ - dir = 4 - }, -/obj/structure/bed/chair{ - dir = 4; - pixel_y = 4 - }, -/turf/open/floor/shiva{ - dir = 4; - icon_state = "snow_mat" +/obj/item/lightstick/red/spoke/planted{ + pixel_x = 11 }, +/turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/cp_camp) "ggL" = ( /obj/structure/inflatable/popped, @@ -11524,6 +11144,9 @@ icon_state = "redfull" }, /area/shiva/interior/colony/research_hab) +"gik" = ( +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/aerodrome) "giH" = ( /obj/structure/machinery/door/airlock/almayer/security/glass/colony, /turf/open/floor/plating, @@ -11596,6 +11219,9 @@ dir = 8 }, /area/shiva/interior/colony/central) +"goe" = ( +/turf/open/auto_turf/ice/layer2, +/area/shiva/interior/aerodrome) "goh" = ( /obj/effect/decal/cleanable/blood{ icon_state = "gib6" @@ -11620,6 +11246,13 @@ /obj/structure/machinery/space_heater, /turf/open/floor/plating, /area/shiva/interior/colony/research_hab) +"gpj" = ( +/obj/item/lightstick/red/variant/planted{ + pixel_x = -7; + pixel_y = -5 + }, +/turf/open/auto_turf/snow/layer2, +/area/shiva/interior/caves/cp_camp) "gpn" = ( /obj/structure/largecrate/random/case, /turf/open/floor/shiva{ @@ -11629,6 +11262,17 @@ "gpz" = ( /turf/open/auto_turf/ice/layer0, /area/shiva/interior/caves/research_caves) +"gpF" = ( +/obj/structure/largecrate/random/case/double, +/obj/structure/machinery/light/double{ + dir = 4; + pixel_y = -5 + }, +/turf/open/floor/shiva{ + dir = 8; + icon_state = "bluefull" + }, +/area/shiva/interior/aerodrome) "gpS" = ( /obj/structure/flora/bush/snow{ icon_state = "snowgrassbb_3" @@ -11674,6 +11318,16 @@ dir = 1 }, /area/shiva/interior/caves/s_lz2) +"grk" = ( +/obj/structure/platform/strata{ + dir = 8 + }, +/obj/structure/stairs/perspective/ice{ + dir = 1; + icon_state = "p_stair_sn_full_cap" + }, +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/warehouse/caves) "gso" = ( /obj/structure/platform/strata, /turf/open/gm/river, @@ -11739,12 +11393,16 @@ dir = 1 }, /area/shiva/interior/lz2_habs) +"guH" = ( +/obj/structure/prop/ice_colony/surveying_device, +/turf/open/auto_turf/ice/layer0, +/area/shiva/exterior/cp_s_research) "gva" = ( /obj/structure/prop/ice_colony/ground_wire{ dir = 8 }, /obj/item/lightstick/planted, -/turf/open/auto_turf/snow/layer0, +/turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/cp_camp) "gvz" = ( /turf/open/floor{ @@ -11757,12 +11415,6 @@ }, /turf/open/auto_turf/snow/layer3, /area/shiva/interior/colony/medseceng) -"gvY" = ( -/obj/structure/prop/ice_colony/surveying_device{ - dir = 1 - }, -/turf/open/auto_turf/ice/layer0, -/area/shiva/interior/caves/cp_camp) "gwq" = ( /obj/structure/bed/chair/comfy/blue, /turf/open/floor/shiva{ @@ -11887,6 +11539,12 @@ }, /turf/closed/wall/shiva/ice, /area/shiva/interior/caves/cp_camp) +"gEn" = ( +/obj/structure/machinery/portable_atmospherics/powered/scrubber{ + icon_state = "psiphon:1" + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "gFb" = ( /obj/structure/surface/table, /obj/structure/window{ @@ -11991,28 +11649,19 @@ }, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/cp_camp) -"gJk" = ( -/obj/structure/platform/strata{ - dir = 4 - }, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/lz1_valley) "gJo" = ( /turf/open/auto_turf/ice/layer1, /area/shiva/exterior/junkyard/cp_bar) +"gJF" = ( +/obj/item/lightstick/red/variant/planted, +/turf/open/auto_turf/snow/layer0, +/area/shiva/exterior/cp_s_research) "gJI" = ( /obj/structure/surface/rack, /obj/item/stack/cable_coil, /obj/item/tool/crowbar, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/cp_lz2) -"gKf" = ( -/obj/structure/machinery/light/double{ - dir = 8; - pixel_y = -5 - }, -/turf/open/floor/shiva, -/area/shiva/interior/bar) "gKE" = ( /obj/structure/surface/table, /obj/item/stock_parts/matter_bin{ @@ -12128,6 +11777,16 @@ dir = 10 }, /area/shiva/interior/aerodrome) +"gQK" = ( +/obj/structure/platform/strata{ + dir = 8 + }, +/obj/structure/platform/strata{ + dir = 4 + }, +/obj/structure/platform/strata, +/turf/open/gm/river, +/area/shiva/interior/caves/research_caves) "gQL" = ( /obj/structure/closet/cabinet, /obj/item/clothing/under/darkred, @@ -12257,6 +11916,10 @@ icon_state = "wred" }, /area/shiva/interior/colony/medseceng) +"gXu" = ( +/obj/structure/largecrate/random/barrel/green, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "gXS" = ( /turf/open/auto_turf/ice/layer1, /area/shiva/interior/colony/medseceng) @@ -12283,6 +11946,14 @@ /obj/item/lightstick/red/planted, /turf/open/auto_turf/snow/layer0, /area/shiva/exterior/cp_colony_grounds) +"gZi" = ( +/obj/structure/closet/toolcloset, +/turf/open/auto_turf/snow/layer3, +/area/shiva/exterior/cp_s_research) +"gZk" = ( +/obj/effect/landmark/hunter_primary, +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/caves/cp_camp) "gZG" = ( /obj/structure/machinery/door/airlock/almayer/medical/colony{ dir = 2; @@ -12308,6 +11979,13 @@ /obj/structure/platform/strata, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/oob/dev_room) +"hbp" = ( +/obj/structure/stairs/perspective/ice{ + dir = 1; + icon_state = "p_stair_full" + }, +/turf/open/auto_turf/snow/layer4, +/area/shiva/exterior/junkyard) "hbu" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/reagent_container/food/snacks/flour{ @@ -12325,7 +12003,7 @@ /area/shiva/interior/warehouse/caves) "hbD" = ( /obj/structure/flora/grass/tallgrass/ice/corner{ - dir = 10 + dir = 6 }, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/lz1_valley) @@ -12341,6 +12019,16 @@ icon_state = "floor3" }, /area/shiva/interior/colony/research_hab) +"hfw" = ( +/obj/structure/machinery/light/double{ + dir = 8; + pixel_y = -5 + }, +/turf/open/floor/shiva{ + dir = 8; + icon_state = "redfull" + }, +/area/shiva/interior/colony/research_hab) "hfN" = ( /obj/structure/surface/table, /turf/open/floor/shiva{ @@ -12362,6 +12050,18 @@ /obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot, /turf/open/floor/plating/plating_catwalk/shiva, /area/shiva/interior/telecomm/lz1_biceps) +"hhT" = ( +/obj/structure/platform/strata{ + dir = 8 + }, +/turf/open/auto_turf/snow/layer3, +/area/shiva/exterior/lz1_valley) +"hic" = ( +/obj/structure/platform_decoration/strata{ + dir = 4 + }, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/lz1_valley) "hif" = ( /obj/structure/bed/chair/office/dark{ dir = 8 @@ -12377,6 +12077,13 @@ /obj/structure/machinery/disposal, /turf/open/floor/wood, /area/shiva/interior/colony/central) +"hip" = ( +/obj/structure/platform/strata, +/obj/structure/platform/strata{ + dir = 4 + }, +/turf/open/gm/river, +/area/shiva/interior/warehouse/caves) "hju" = ( /turf/open/floor/shiva{ dir = 8; @@ -12400,10 +12107,14 @@ }, /turf/open/asphalt/cement, /area/shiva/interior/warehouse) -"hlh" = ( -/obj/item/tool/pickaxe, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) +"hkZ" = ( +/obj/structure/prop/invuln/ice_prefab/roof_greeble{ + icon_state = "vent4"; + pixel_x = -4; + pixel_y = 10 + }, +/turf/open/auto_turf/snow/layer3, +/area/shiva/exterior/cp_s_research) "hlm" = ( /obj/structure/bed/chair{ dir = 8 @@ -12477,6 +12188,10 @@ "hng" = ( /turf/closed/wall/shiva/ice, /area/shiva/exterior/cp_colony_grounds) +"hnj" = ( +/obj/item/lightstick/red/variant/planted, +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) "hnw" = ( /obj/structure/coatrack, /turf/open/floor/wood, @@ -12562,9 +12277,6 @@ icon_state = "wredfull" }, /area/shiva/interior/colony/medseceng) -"hsu" = ( -/turf/open/auto_turf/ice/layer2, -/area/shiva/interior/caves/left_spiders) "hsw" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/circuitboard, @@ -12672,6 +12384,15 @@ /obj/structure/flora/tree/dead/tree_2, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/cp_s_research) +"hye" = ( +/obj/structure/prop/ice_colony/flamingo{ + dir = 1 + }, +/obj/structure/platform_decoration/shiva/catwalk{ + dir = 8 + }, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/lz1_valley) "hyu" = ( /turf/open/floor/shiva{ icon_state = "bluefull" @@ -12715,6 +12436,10 @@ /obj/structure/machinery/door/airlock/multi_tile/almayer/generic, /turf/open/floor/plating, /area/shiva/interior/colony/research_hab) +"hBn" = ( +/obj/effect/landmark/hunter_secondary, +/turf/open/auto_turf/snow/layer2, +/area/shiva/interior/caves/cp_camp) "hBq" = ( /turf/open/auto_turf/snow/layer4, /area/shiva/interior/caves/cp_camp) @@ -12748,7 +12473,7 @@ /obj/structure/prop/ice_colony/ground_wire{ dir = 8 }, -/turf/open/auto_turf/snow/layer0, +/turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/cp_camp) "hCt" = ( /obj/structure/machinery/firealarm{ @@ -12826,7 +12551,7 @@ icon_state = "p_stair_sn_full_cap" }, /obj/structure/platform/shiva/catwalk{ - dir = 8 + dir = 4 }, /turf/open/floor/plating, /area/shiva/interior/aerodrome) @@ -12840,6 +12565,18 @@ }, /turf/open/floor/plating, /area/shiva/interior/colony/deck) +"hEx" = ( +/obj/item/lightstick/red/spoke/planted{ + pixel_x = 12; + pixel_y = 25 + }, +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/caves/cp_camp) +"hEB" = ( +/obj/structure/surface/rack, +/obj/item/tool/lighter/zippo, +/turf/open/auto_turf/snow/layer0, +/area/shiva/exterior/cp_s_research) "hEE" = ( /obj/structure/barricade/handrail/wire{ dir = 8; @@ -12887,6 +12624,15 @@ }, /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/junkyard/fortbiceps) +"hHR" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W-corner" + }, +/obj/structure/barricade/metal{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shiva/exterior/junkyard) "hHV" = ( /obj/structure/surface/table, /obj/structure/machinery/cell_charger, @@ -12905,12 +12651,6 @@ }, /turf/open/floor/plating/plating_catwalk/shiva, /area/shiva/exterior/lz2_fortress) -"hIn" = ( -/obj/structure/platform_decoration/strata{ - dir = 8 - }, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/lz1_valley) "hIu" = ( /obj/structure/surface/rack, /obj/item/device/radio{ @@ -12935,10 +12675,6 @@ /obj/structure/flora/tree/dead/tree_4, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/cp_colony_grounds) -"hJd" = ( -/obj/structure/prop/ice_colony/soil_net, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/valley) "hJH" = ( /obj/structure/machinery/door/airlock/almayer/maint/colony, /turf/open/floor/plating, @@ -13035,10 +12771,6 @@ /obj/structure/machinery/light/double, /turf/open/asphalt/cement, /area/shiva/interior/warehouse) -"hRF" = ( -/obj/structure/inflatable, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/research_alley) "hRK" = ( /obj/effect/decal/cleanable/blood/drip{ icon_state = "3" @@ -13054,6 +12786,12 @@ }, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/s_lz2) +"hRY" = ( +/obj/structure/stairs/perspective/ice{ + icon_state = "p_stair_full" + }, +/turf/open/auto_turf/ice/layer0, +/area/shiva/interior/warehouse/caves) "hSa" = ( /obj/effect/landmark/static_comms/net_two, /turf/open/auto_turf/ice/layer1, @@ -13126,6 +12864,13 @@ }, /turf/open/auto_turf/snow/layer4, /area/shiva/exterior/cp_lz2) +"hUA" = ( +/obj/structure/largecrate/random/secure, +/obj/item/ashtray/bronze{ + pixel_y = 7 + }, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/cp_s_research) "hUG" = ( /obj/effect/landmark/xeno_hive_spawn, /obj/effect/landmark/ert_spawns/groundside_xeno, @@ -13140,13 +12885,6 @@ }, /turf/open/floor/wood, /area/shiva/interior/colony/medseceng) -"hVr" = ( -/obj/effect/landmark/objective_landmark/science, -/turf/open/floor/shiva{ - dir = 4; - icon_state = "snow_mat" - }, -/area/shiva/interior/caves/cp_camp) "hVs" = ( /obj/structure/surface/table, /obj/item/evidencebag{ @@ -13176,16 +12914,6 @@ }, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/junkyard) -"hWY" = ( -/obj/structure/machinery/light/double{ - dir = 4; - pixel_y = -5 - }, -/turf/open/floor/shiva{ - dir = 4; - icon_state = "multi_tiles" - }, -/area/shiva/interior/colony/research_hab) "hXB" = ( /obj/structure/flora/grass/tallgrass/ice, /turf/open/auto_turf/snow/layer2, @@ -13264,6 +12992,16 @@ dir = 1 }, /area/shiva/interior/colony/central) +"ibP" = ( +/obj/structure/closet/toolcloset, +/obj/structure/machinery/light/double{ + dir = 8; + pixel_y = -5 + }, +/turf/open/floor/shiva{ + icon_state = "floor3" + }, +/area/shiva/interior/aerodrome) "icC" = ( /obj/structure/machinery/light/double{ dir = 8; @@ -13291,10 +13029,6 @@ icon_state = "kitchen" }, /area/shiva/interior/bar) -"iel" = ( -/obj/structure/prop/ice_colony/surveying_device, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/research_caves) "ieo" = ( /obj/structure/bed/chair/office/light{ dir = 4 @@ -13341,12 +13075,6 @@ dir = 1 }, /area/shiva/interior/colony/medseceng) -"ifQ" = ( -/obj/effect/landmark/nightmare{ - insert_tag = "labs-cave-complete" - }, -/turf/closed/wall/shiva/ice, -/area/shiva/interior/oob) "igl" = ( /obj/item/paper_bin, /obj/item/tool/pen/blue, @@ -13406,6 +13134,10 @@ /obj/effect/landmark/corpsespawner/wygoon, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/colony/central) +"ijm" = ( +/obj/structure/blocker/forcefield/multitile_vehicles, +/turf/open/auto_turf/ice/layer2, +/area/shiva/interior/warehouse/caves) "ijq" = ( /obj/structure/largecrate/random/case/double, /turf/open/floor/shiva{ @@ -13419,6 +13151,13 @@ /obj/structure/fence, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/cp_lz2) +"ijE" = ( +/obj/structure/platform/strata, +/obj/structure/platform/strata{ + dir = 8 + }, +/turf/open/gm/river, +/area/shiva/interior/caves/research_caves) "ijP" = ( /obj/structure/machinery/door/airlock/almayer/engineering/colony{ dir = 1; @@ -13466,6 +13205,10 @@ icon_state = "yellow" }, /area/shiva/interior/colony/medseceng) +"ilW" = ( +/obj/item/lightstick/planted, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "imk" = ( /obj/effect/spider/stickyweb, /turf/open/auto_turf/ice/layer1, @@ -13692,6 +13435,15 @@ icon_state = "red" }, /area/shiva/interior/colony/medseceng) +"ivE" = ( +/obj/structure/platform/strata{ + dir = 1 + }, +/obj/structure/platform/strata{ + dir = 8 + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/exterior/lz1_valley) "ivS" = ( /obj/structure/filingcabinet, /obj/effect/landmark/objective_landmark/medium, @@ -13853,7 +13605,7 @@ /area/shiva/exterior/cp_lz2) "iDy" = ( /obj/structure/flora/grass/tallgrass/ice/corner{ - dir = 9 + dir = 4 }, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/lz1_valley) @@ -13870,7 +13622,7 @@ icon_state = "p_stair_sn_full_cap" }, /obj/structure/platform/shiva/catwalk{ - dir = 4 + dir = 8 }, /turf/open/floor/plating, /area/shiva/interior/aerodrome) @@ -13902,13 +13654,12 @@ icon_state = "multi_tiles" }, /area/shiva/interior/colony/botany) -"iGn" = ( -/obj/structure/machinery/light/double{ - dir = 4; - pixel_y = -5 +"iHu" = ( +/obj/structure/platform_decoration/shiva/catwalk{ + dir = 8 }, -/turf/open/floor/shiva, -/area/shiva/interior/bar) +/turf/open/auto_turf/snow/layer4, +/area/shiva/exterior/lz1_valley) "iHN" = ( /obj/effect/landmark/survivor_spawner, /turf/open/floor/shiva{ @@ -13942,10 +13693,20 @@ icon_state = "yellowfull" }, /area/shiva/interior/colony/research_hab) +"iIg" = ( +/obj/structure/stairs/perspective/ice{ + icon_state = "p_stair_sn_full_cap" + }, +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/caves/research_caves) "iIP" = ( /obj/item/device/flashlight/lamp/tripod/grey, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/s_lz2) +"iIR" = ( +/obj/structure/flora/bush/ausbushes/lavendergrass, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/cp_s_research) "iJr" = ( /obj/effect/decal/cleanable/blood{ icon_state = "gib6" @@ -13969,6 +13730,12 @@ icon_state = "red" }, /area/shiva/interior/colony/medseceng) +"iKW" = ( +/obj/structure/platform_decoration/shiva/catwalk{ + dir = 4 + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/exterior/lz1_valley) "iLf" = ( /obj/item/lightstick/red/spoke/planted{ pixel_x = 12; @@ -14012,6 +13779,15 @@ /obj/effect/decal/cleanable/blood, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/colony/central) +"iOp" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S-corner" + }, +/obj/effect/decal/warning_stripes{ + icon_state = "E-corner" + }, +/turf/open/floor/plating, +/area/shiva/exterior/lz1_valley) "iOr" = ( /obj/structure/prop/invuln/ice_prefab{ dir = 9 @@ -14086,13 +13862,6 @@ icon_state = "floor3" }, /area/shiva/interior/colony/central) -"iSp" = ( -/obj/item/tool/screwdriver, -/turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/research_alley) -"iSG" = ( -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/research_alley) "iTQ" = ( /obj/structure/girder, /turf/open/floor/plating, @@ -14268,12 +14037,6 @@ icon_state = "floor3" }, /area/shiva/interior/colony/research_hab) -"iYu" = ( -/obj/structure/surface/rack, -/obj/item/device/flashlight, -/obj/item/device/t_scanner, -/turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/research_alley) "iYC" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/interior/plastic/alt, @@ -14295,9 +14058,6 @@ dir = 1 }, /area/shiva/interior/garage) -"iZI" = ( -/turf/closed/wall/shiva/prefabricated/blue, -/area/shiva/interior/caves/cp_camp) "iZX" = ( /obj/structure/machinery/power/apc{ dir = 4; @@ -14321,6 +14081,9 @@ /obj/item/lightstick/red/planted, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/valley) +"jaT" = ( +/turf/open/auto_turf/snow/layer4, +/area/shiva/interior/warehouse/caves) "jaU" = ( /obj/structure/surface/table, /obj/item/device/whistle, @@ -14363,6 +14126,12 @@ }, /turf/open/floor/carpet, /area/shiva/interior/colony/research_hab) +"jfO" = ( +/obj/effect/spider/stickyweb{ + icon_state = "stickyweb2" + }, +/turf/open/auto_turf/ice/layer2, +/area/shiva/interior/caves/cp_camp) "jfS" = ( /obj/effect/landmark/nightmare{ insert_tag = "lz2-south-caves" @@ -14379,6 +14148,12 @@ icon_state = "multi_tiles" }, /area/shiva/interior/colony/botany) +"jhm" = ( +/obj/structure/platform/shiva/catwalk{ + dir = 8 + }, +/turf/open/auto_turf/snow/layer4, +/area/shiva/exterior/lz1_valley) "jhq" = ( /turf/open/floor/shiva{ icon_state = "radiator_tile" @@ -14410,11 +14185,6 @@ dir = 1 }, /area/shiva/interior/colony/s_admin) -"jjq" = ( -/obj/structure/surface/rack, -/obj/effect/spawner/random/toolbox, -/turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/research_alley) "jkH" = ( /obj/item/lightstick/red/spoke/planted{ layer = 3.1; @@ -14423,16 +14193,12 @@ }, /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/junkyard) -"jkM" = ( -/obj/structure/machinery/door_control/brbutton{ - id = "hangar_ice_2"; - pixel_y = 28 - }, -/obj/structure/platform/shiva/catwalk{ - dir = 8 +"jld" = ( +/obj/item/shard{ + icon_state = "medium" }, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/lz1_valley) +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/caves/cp_camp) "jlv" = ( /obj/item/stack/sheet/wood, /obj/effect/decal/cleanable/blood{ @@ -14464,21 +14230,6 @@ "jmW" = ( /turf/open/auto_turf/ice/layer2, /area/shiva/interior/caves/cp_camp) -"jnc" = ( -/obj/structure/prop/invuln{ - desc = "The mounting points are ground down from heavy use. They'll need some maintenance work before they can be used again."; - icon = 'icons/obj/structures/props/almayer_props.dmi'; - icon_state = "equip_base"; - name = "shuttle attachment point" - }, -/obj/structure/machinery/light{ - dir = 8 - }, -/obj/effect/landmark/objective_landmark/close, -/turf/open/shuttle{ - icon_state = "floor7" - }, -/area/shiva/interior/aerodrome) "jny" = ( /obj/structure/filingcabinet, /obj/effect/landmark/objective_landmark/close, @@ -14532,7 +14283,7 @@ pixel_x = 15; pixel_y = -3 }, -/turf/open/auto_turf/snow/layer0, +/turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/cp_camp) "jpE" = ( /obj/structure/machinery/portable_atmospherics/hydroponics, @@ -14541,7 +14292,7 @@ "jqo" = ( /obj/item/lightstick/planted, /obj/effect/decal/cleanable/blood/drip, -/turf/open/auto_turf/snow/layer0, +/turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/cp_camp) "jqx" = ( /obj/structure/platform/strata, @@ -14647,6 +14398,13 @@ icon_state = "warnplate" }, /area/shiva/interior/colony/medseceng) +"jzs" = ( +/obj/structure/largecrate/random/mini/wooden{ + pixel_x = -16; + pixel_y = -1 + }, +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/warehouse/caves) "jAg" = ( /turf/open/floor/shiva{ icon_state = "snow_mat" @@ -14713,7 +14471,7 @@ icon_state = "large"; name = "ice shard" }, -/turf/open/auto_turf/snow/layer0, +/turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/cp_camp) "jDp" = ( /obj/structure/surface/table/woodentable, @@ -14726,6 +14484,14 @@ icon_state = "floor3" }, /area/shiva/interior/bar) +"jDv" = ( +/obj/structure/ice/thin/single{ + opacity = 1; + unacidable = 0 + }, +/obj/structure/blocker/forcefield/multitile_vehicles, +/turf/open/auto_turf/ice/layer1, +/area/shiva/exterior/valley) "jDB" = ( /obj/item/shard, /turf/open/floor/shiva{ @@ -14833,6 +14599,14 @@ }, /turf/open/asphalt/cement, /area/shiva/interior/warehouse) +"jKm" = ( +/obj/structure/prop/invuln/ice_prefab/roof_greeble{ + icon_state = "vent5"; + pixel_x = 16; + pixel_y = 10 + }, +/turf/open/auto_turf/snow/layer3, +/area/shiva/exterior/cp_s_research) "jKN" = ( /obj/structure/fence, /turf/open/auto_turf/snow/layer0, @@ -14877,11 +14651,21 @@ icon_state = "chapel" }, /area/shiva/interior/colony/central) +"jNr" = ( +/obj/structure/machinery/colony_floodlight, +/turf/open/auto_turf/snow/layer2, +/area/shiva/interior/caves/cp_camp) "jOi" = ( /turf/open/floor/shiva{ icon_state = "floor3" }, /area/shiva/interior/caves/cp_camp) +"jOv" = ( +/obj/structure/surface/rack, +/obj/item/device/flashlight, +/obj/item/device/t_scanner, +/turf/open/auto_turf/snow/layer0, +/area/shiva/exterior/cp_s_research) "jOA" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/item/weapon/gun/smg/pps43, @@ -14944,12 +14728,6 @@ }, /turf/open/auto_turf/snow/layer0, /area/shiva/exterior/junkyard) -"jQt" = ( -/obj/structure/platform/shiva/catwalk{ - dir = 4 - }, -/turf/open/auto_turf/snow/layer4, -/area/shiva/exterior/lz1_valley) "jQy" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/medidoor/colony{ dir = 1; @@ -15037,6 +14815,13 @@ }, /turf/open/auto_turf/snow/layer0, /area/shiva/interior/colony/medseceng) +"jWh" = ( +/obj/structure/stairs/perspective/ice{ + dir = 1; + icon_state = "p_stair_full" + }, +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/warehouse/caves) "jWL" = ( /obj/structure/machinery/space_heater, /obj/structure/machinery/light/double{ @@ -15052,6 +14837,15 @@ /obj/structure/flora/tree/dead/tree_4, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/junkyard) +"jXM" = ( +/obj/structure/machinery/light/double{ + dir = 8; + pixel_y = -5 + }, +/turf/open/floor/shiva{ + icon_state = "floor3" + }, +/area/shiva/interior/colony/research_hab) "jYO" = ( /obj/item/lightstick/red/spoke/planted{ layer = 3.1; @@ -15160,6 +14954,11 @@ icon_state = "yellowfull" }, /area/shiva/interior/colony/medseceng) +"kch" = ( +/obj/structure/surface/rack, +/obj/item/tool/pickaxe/plasmacutter, +/turf/open/auto_turf/snow/layer0, +/area/shiva/exterior/cp_s_research) "kcB" = ( /obj/structure/machinery/landinglight/ds2/spoke, /obj/structure/machinery/landinglight/ds2/delayone{ @@ -15239,14 +15038,6 @@ }, /turf/open/auto_turf/snow/layer0, /area/shiva/exterior/junkyard) -"kfl" = ( -/obj/structure/surface/table/reinforced/prison, -/obj/effect/decal/warning_stripes{ - icon_state = "W-corner" - }, -/obj/structure/machinery/computer/shuttle/dropship/flight/lz1, -/turf/open/floor/plating, -/area/shiva/exterior/lz1_console) "kfW" = ( /obj/effect/decal/cleanable/blood/oil, /obj/effect/decal/cleanable/dirt, @@ -15345,13 +15136,19 @@ }, /turf/open/floor/plating, /area/shiva/interior/aerodrome) -"kjU" = ( -/obj/structure/machinery/light/double{ - dir = 8; - pixel_y = -5 +"kjX" = ( +/obj/structure/stairs/perspective/ice{ + dir = 1; + icon_state = "p_stair_full" }, -/turf/open/floor/wood, -/area/shiva/interior/aerodrome) +/turf/open/auto_turf/snow/layer4, +/area/shiva/interior/warehouse/caves) +"klF" = ( +/obj/structure/bed/chair{ + dir = 4 + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/exterior/cp_s_research) "klN" = ( /obj/effect/spider/stickyweb{ icon_state = "stickyweb2" @@ -15370,6 +15167,13 @@ }, /turf/open/auto_turf/snow/layer2, /area/shiva/interior/colony/medseceng) +"kmO" = ( +/obj/structure/machinery/light/double{ + dir = 4; + pixel_y = -5 + }, +/turf/open/floor/shiva, +/area/shiva/interior/colony/research_hab) "kng" = ( /turf/open/auto_turf/ice/layer0, /area/shiva/interior/caves/right_spiders) @@ -15412,17 +15216,6 @@ icon_state = "radiator_tile2" }, /area/shiva/interior/colony/central) -"kqE" = ( -/obj/structure/prop/invuln/dense/ice_tray{ - dir = 4; - pixel_y = -9 - }, -/obj/structure/prop/invuln/dense/ice_tray{ - dir = 1; - pixel_y = 10 - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "kqH" = ( /obj/structure/machinery/firealarm{ dir = 8; @@ -15449,12 +15242,6 @@ icon_state = "green" }, /area/shiva/interior/colony/botany) -"krT" = ( -/obj/effect/landmark/nightmare{ - insert_tag = "labs-elevator" - }, -/turf/closed/wall/shiva/prefabricated/orange, -/area/shiva/interior/colony/research_hab) "krU" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/largecrate/random/barrel/white, @@ -15556,6 +15343,9 @@ /obj/structure/fence, /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/lz1_valley) +"kwa" = ( +/turf/open/floor/plating, +/area/shiva/exterior/junkyard) "kwc" = ( /obj/structure/bed/chair/comfy/blue, /obj/structure/machinery/light/double{ @@ -15601,6 +15391,10 @@ /obj/structure/largecrate/random/barrel/green, /turf/open/asphalt/cement, /area/shiva/interior/warehouse) +"kyt" = ( +/obj/item/tool/shovel/snow, +/turf/open/auto_turf/snow/layer1, +/area/shiva/exterior/cp_s_research) "kyu" = ( /obj/structure/surface/table, /obj/structure/machinery/door/window/eastright{ @@ -15611,15 +15405,6 @@ icon_state = "multi_tiles" }, /area/shiva/interior/colony/research_hab) -"kyw" = ( -/obj/structure/barricade/metal{ - dir = 8 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "W-corner" - }, -/turf/open/floor/plating, -/area/shiva/exterior/lz1_valley) "kyD" = ( /turf/open/auto_turf/snow/layer0, /area/shiva/exterior/junkyard) @@ -15655,6 +15440,27 @@ }, /turf/open/auto_turf/snow/layer0, /area/shiva/interior/colony/medseceng) +"kAd" = ( +/obj/structure/closet/radiation, +/turf/open/auto_turf/snow/layer3, +/area/shiva/exterior/cp_s_research) +"kAg" = ( +/mob/living/simple_animal/hostile/retaliate/clown{ + desc = "Uh oh, looks like Gonzo got blocked by a cave-in. How is he gonna get out of this one?"; + health = 10000; + move_to_delay = 2; + name = "Gonzo the Magnificent"; + rapid = 1 + }, +/obj/effect/decal/hefa_cult_decals/d96{ + desc = "Original map by Infernus, remapped by Triiodine." + }, +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/oob/dev_room) +"kAm" = ( +/obj/structure/flora/tree/dead/tree_6, +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) "kAp" = ( /obj/item/stack/sheet/metal/small_stack, /obj/structure/foamed_metal, @@ -15771,13 +15577,6 @@ /obj/effect/landmark/static_comms/net_one, /turf/open/floor/wood, /area/shiva/interior/aerodrome) -"kGO" = ( -/obj/structure/platform/shiva/catwalk{ - dir = 8 - }, -/obj/item/lightstick/red/variant/planted, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/lz1_valley) "kGW" = ( /obj/structure/flora/tree/dead/tree_2, /turf/open/auto_turf/snow/layer2, @@ -15793,13 +15592,13 @@ icon_state = "redfull" }, /area/shiva/interior/colony/medseceng) -"kIo" = ( -/obj/structure/platform/shiva/catwalk{ - dir = 4 +"kHG" = ( +/obj/structure/largecrate/random/mini/med, +/obj/effect/landmark/objective_landmark/close, +/turf/open/floor/shiva{ + icon_state = "floor3" }, -/obj/item/lightstick/red/variant/planted, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/lz1_valley) +/area/shiva/interior/caves/cp_camp) "kIq" = ( /obj/structure/bed/chair, /turf/open/floor/shiva{ @@ -16030,6 +15829,10 @@ icon_state = "yellowfull" }, /area/shiva/interior/colony/research_hab) +"kRq" = ( +/obj/item/lightstick/red/variant/planted, +/turf/open/auto_turf/snow/layer2, +/area/shiva/interior/caves/cp_camp) "kRI" = ( /obj/structure/surface/table, /turf/open/floor/shiva{ @@ -16068,10 +15871,6 @@ }, /turf/open/gm/river, /area/shiva/interior/caves/cp_camp) -"kSW" = ( -/obj/item/circuitboard, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/research_alley) "kTd" = ( /turf/open/auto_turf/ice/layer0, /area/shiva/interior/colony/research_hab) @@ -16109,12 +15908,6 @@ }, /turf/open/floor/shiva, /area/shiva/interior/colony/research_hab) -"kVs" = ( -/obj/structure/platform_decoration/strata{ - dir = 1 - }, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/valley) "kVA" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/weapon/twohanded/fireaxe, @@ -16276,11 +16069,8 @@ /turf/open/floor/plating, /area/shiva/interior/colony/central) "leg" = ( -/obj/effect/spider/cocoon{ - icon_state = "cocoon_large1" - }, -/turf/open/auto_turf/ice/layer2, -/area/shiva/interior/caves/left_spiders) +/turf/closed/wall/shiva/prefabricated/reinforced/hull, +/area/shiva/exterior/telecomm/lz1_north) "lfe" = ( /obj/structure/prop/ice_colony/soil_net, /turf/open/auto_turf/snow/layer1, @@ -16332,12 +16122,12 @@ /obj/structure/surface/rack, /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/junkyard/fortbiceps) -"lhu" = ( -/obj/effect/landmark/nightmare{ - insert_tag = "south-spidercave" +"lhP" = ( +/obj/structure/prop/invuln/ice_prefab/standalone/trim{ + icon_state = "pink_trim" }, -/turf/closed/wall/shiva/ice, -/area/shiva/interior/oob) +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "lip" = ( /obj/structure/flora/grass/tallgrass/ice/corner{ dir = 10 @@ -16389,6 +16179,9 @@ icon_state = "redfull" }, /area/shiva/interior/colony/research_hab) +"llZ" = ( +/turf/open/auto_turf/snow/layer2, +/area/shiva/interior/warehouse/caves) "lmt" = ( /obj/structure/largecrate/random/barrel/red, /turf/open/auto_turf/snow/layer0, @@ -16444,7 +16237,7 @@ layer = 2.9 }, /turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/cp_s_research) +/area/shiva/exterior/junkyard) "lok" = ( /obj/structure/cargo_container/ferret/left, /turf/open/auto_turf/snow/layer3, @@ -16505,6 +16298,17 @@ dir = 1 }, /area/shiva/interior/lz2_habs) +"lqu" = ( +/obj/structure/blocker/forcefield/multitile_vehicles, +/obj/structure/blocker/forcefield/multitile_vehicles, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/colony/research_hab) +"lqT" = ( +/obj/effect/spider/stickyweb{ + icon_state = "stickyweb2" + }, +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/caves/cp_camp) "lqY" = ( /obj/structure/largecrate/random/mini/small_case{ pixel_x = -9; @@ -16552,12 +16356,12 @@ icon_state = "kitchen" }, /area/shiva/interior/colony/central) -"ltJ" = ( -/obj/structure/platform_decoration/shiva/catwalk{ - dir = 8 - }, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/lz1_valley) +"ltA" = ( +/obj/structure/surface/rack, +/obj/item/tool/shovel/snow, +/obj/item/storage/belt/utility/full, +/turf/open/auto_turf/snow/layer3, +/area/shiva/exterior/cp_s_research) "luD" = ( /obj/structure/machinery/space_heater, /turf/open/auto_turf/snow/layer1, @@ -16636,15 +16440,6 @@ icon_state = "wred" }, /area/shiva/interior/colony/medseceng) -"lyE" = ( -/obj/structure/platform_decoration/shiva/catwalk{ - dir = 4 - }, -/obj/structure/prop/ice_colony/flamingo{ - dir = 1 - }, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/lz1_valley) "lzQ" = ( /obj/effect/decal/warning_stripes{ icon_state = "NS-center" @@ -16660,8 +16455,11 @@ /turf/open/floor/plating, /area/shiva/interior/caves/research_caves) "lAN" = ( -/obj/item/lightstick/red/variant/planted, -/turf/open/auto_turf/ice/layer1, +/obj/effect/decal/cleanable/blood{ + dir = 4; + icon_state = "gib6" + }, +/turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/cp_camp) "lBC" = ( /obj/structure/machinery/landinglight/ds2/delaythree{ @@ -16675,18 +16473,13 @@ /obj/item/tool/pickaxe, /turf/open/auto_turf/ice/layer0, /area/shiva/interior/caves/s_lz2) -"lCe" = ( -/obj/structure/platform_decoration/shiva/catwalk{ - dir = 8 - }, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/lz1_valley) -"lCp" = ( -/obj/structure/platform_decoration/shiva/catwalk{ - dir = 4 +"lCg" = ( +/obj/structure/stairs/perspective{ + dir = 1; + icon_state = "p_stair_sn_full_cap" }, -/turf/open/auto_turf/snow/layer4, -/area/shiva/exterior/lz1_valley) +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/caves/cp_camp) "lDv" = ( /obj/structure/machinery/computer/crew, /turf/open/floor/shiva{ @@ -16750,6 +16543,12 @@ }, /turf/open/gm/river/no_overlay, /area/shiva/interior/caves/cp_camp) +"lGT" = ( +/obj/structure/stairs/perspective{ + icon_state = "p_stair_sn_full_cap" + }, +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/caves/cp_camp) "lGU" = ( /obj/structure/surface/table, /obj/item/storage/fancy/cigarettes/lucky_strikes{ @@ -16846,14 +16645,14 @@ icon_state = "greencorners" }, /area/shiva/interior/colony/botany) +"lLf" = ( +/obj/item/tool/screwdriver, +/turf/open/auto_turf/snow/layer0, +/area/shiva/exterior/cp_s_research) "lLv" = ( /obj/structure/machinery/power/port_gen/pacman, /turf/open/floor/plating, /area/shiva/exterior/lz1_valley) -"lLE" = ( -/obj/structure/prop/invuln/ice_prefab/standalone, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/research_alley) "lMO" = ( /obj/structure/barricade/snow{ dir = 8 @@ -16966,6 +16765,9 @@ icon_state = "floor3" }, /area/shiva/interior/valley_huts) +"lRJ" = ( +/turf/open/auto_turf/snow/layer4, +/area/shiva/interior/colony/research_hab) "lSz" = ( /obj/effect/landmark/survivor_spawner, /turf/open/floor/shiva{ @@ -17007,16 +16809,6 @@ icon_state = "snow_mat" }, /area/shiva/interior/colony/botany) -"lUL" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "W-corner" - }, -/obj/item/lightstick/red/spoke/planted{ - pixel_x = -11; - pixel_y = 25 - }, -/turf/open/floor/plating, -/area/shiva/exterior/lz1_valley) "lUQ" = ( /obj/structure/closet/toolcloset, /obj/effect/landmark/objective_landmark/close, @@ -17046,15 +16838,6 @@ }, /turf/open/gm/river/no_overlay, /area/shiva/interior/colony/central) -"lVJ" = ( -/obj/structure/surface/rack, -/obj/item/tool/shovel/snow, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/research_alley) -"lVN" = ( -/obj/structure/closet/radiation, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/research_alley) "lWr" = ( /obj/structure/barricade/handrail/strata, /obj/structure/surface/table, @@ -17063,6 +16846,16 @@ dir = 1 }, /area/shiva/interior/colony/central) +"lWC" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W-corner" + }, +/obj/item/lightstick/red/spoke/planted{ + pixel_x = -10; + pixel_y = -1 + }, +/turf/open/floor/plating, +/area/shiva/exterior/junkyard) "lWL" = ( /obj/effect/spider/cocoon{ icon_state = "cocoon_large3" @@ -17123,6 +16916,13 @@ icon_state = "floor3" }, /area/shiva/interior/bar) +"lXQ" = ( +/obj/structure/stairs/perspective/ice{ + dir = 1; + icon_state = "p_stair_sn_full_cap" + }, +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/warehouse/caves) "lYf" = ( /obj/structure/machinery/door/poddoor/shutters/almayer{ dir = 4; @@ -17232,10 +17032,6 @@ }, /turf/open/floor/plating, /area/shiva/exterior/lz1_valley) -"mda" = ( -/obj/structure/prop/ice_colony/soil_net, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "mdx" = ( /turf/open/floor/shiva{ dir = 1 @@ -17322,7 +17118,7 @@ "mhs" = ( /obj/effect/spawner/random/powercell, /turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/cp_s_research) +/area/shiva/exterior/junkyard) "mhx" = ( /obj/structure/machinery/light/double, /turf/open/floor/shiva{ @@ -17340,10 +17136,6 @@ "mib" = ( /turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/medseceng_caves) -"mie" = ( -/obj/structure/prop/ice_colony/surveying_device/measuring_device, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/research_caves) "miD" = ( /turf/open/floor/shiva{ dir = 4; @@ -17362,6 +17154,13 @@ /obj/structure/largecrate/random/case/small, /turf/open/floor/plating, /area/shiva/interior/colony/central) +"mkC" = ( +/obj/structure/stairs/perspective{ + dir = 4; + icon_state = "p_stair_sn_full_cap" + }, +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/caves/cp_camp) "mkK" = ( /obj/structure/surface/table/reinforced/prison, /turf/open/floor/shiva{ @@ -17384,14 +17183,6 @@ dir = 1 }, /area/shiva/interior/colony/deck) -"mmW" = ( -/obj/structure/prop/invuln/ice_prefab/roof_greeble{ - icon_state = "vent5"; - pixel_x = 16; - pixel_y = 10 - }, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/research_alley) "mnD" = ( /turf/open/floor/shiva{ icon_state = "radiator_tile2" @@ -17403,12 +17194,6 @@ }, /turf/open/auto_turf/snow/layer2, /area/shiva/interior/colony/medseceng) -"mnZ" = ( -/turf/open/floor/shiva{ - dir = 4; - icon_state = "snow_mat" - }, -/area/shiva/interior/caves/cp_camp) "moV" = ( /obj/structure/closet/crate/freezer/rations, /obj/item/reagent_container/food/snacks/bigbiteburger, @@ -17426,6 +17211,10 @@ }, /turf/open/asphalt/cement, /area/shiva/interior/warehouse) +"mpI" = ( +/obj/structure/fence, +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/caves/cp_camp) "mqd" = ( /obj/structure/filingcabinet, /obj/item/paper/research_notes, @@ -17477,10 +17266,6 @@ icon_state = "green" }, /area/shiva/interior/colony/botany) -"msh" = ( -/obj/structure/flora/tree/dead/tree_6, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/cp_s_research) "msu" = ( /obj/structure/closet/bodybag, /obj/effect/landmark/objective_landmark/close, @@ -17519,13 +17304,6 @@ /obj/structure/fence, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/junkyard) -"muI" = ( -/obj/structure/barricade/handrail/wire{ - dir = 4 - }, -/obj/structure/barricade/handrail/wire, -/turf/open/auto_turf/ice/layer0, -/area/shiva/interior/caves/cp_camp) "muN" = ( /obj/structure/surface/table/woodentable/fancy, /obj/item/device/flashlight/lamp, @@ -17575,12 +17353,25 @@ icon_state = "floor3" }, /area/shiva/interior/bar) +"mxr" = ( +/obj/structure/stairs/perspective/ice{ + dir = 8; + icon_state = "p_stair_sn_full_cap" + }, +/turf/open/auto_turf/snow/layer0, +/area/shiva/exterior/junkyard) "myR" = ( /obj/structure/prop/invuln/ice_prefab/trim{ dir = 8 }, /turf/closed/wall/shiva/ice, /area/shiva/interior/caves/s_lz2) +"mzf" = ( +/obj/structure/flora/bush/snow{ + icon_state = "snowgrassbb_3" + }, +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) "mzx" = ( /obj/structure/prop/invuln/ice_prefab/standalone/trim, /turf/open/auto_turf/snow/layer2, @@ -17658,6 +17449,15 @@ icon_state = "bluefull" }, /area/shiva/interior/colony/s_admin) +"mCG" = ( +/obj/structure/platform_decoration/strata{ + dir = 4 + }, +/obj/structure/platform_decoration/strata{ + dir = 8 + }, +/turf/open/gm/river, +/area/shiva/interior/caves/research_caves) "mCQ" = ( /obj/structure/prop/ice_colony/surveying_device/measuring_device{ dir = 1; @@ -17725,6 +17525,15 @@ icon_state = "wred" }, /area/shiva/interior/colony/medseceng) +"mGk" = ( +/obj/item/tool/shovel/snow, +/obj/item/storage/fancy/cigarettes/arcturian_ace{ + layer = 3.1; + pixel_x = -8; + pixel_y = 23 + }, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/cp_s_research) "mGn" = ( /obj/structure/machinery/light/double{ dir = 4; @@ -17840,6 +17649,10 @@ icon_state = "floor3" }, /area/shiva/interior/aerodrome) +"mKD" = ( +/obj/structure/machinery/cell_charger, +/turf/open/auto_turf/snow/layer0, +/area/shiva/exterior/cp_s_research) "mKF" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/auto_turf/ice/layer1, @@ -17863,12 +17676,6 @@ icon_state = "floor3" }, /area/shiva/interior/bar) -"mLR" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "W-corner" - }, -/turf/open/floor/plating, -/area/shiva/exterior/lz1_valley) "mLT" = ( /obj/structure/machinery/alarm{ pixel_y = 24 @@ -17890,6 +17697,19 @@ }, /turf/open/floor/plating, /area/shiva/interior/colony/medseceng) +"mME" = ( +/obj/item/lightstick/red/spoke/planted{ + layer = 2.99; + pixel_x = -13; + pixel_y = 28 + }, +/obj/structure/largecrate/random/mini/small_case/b, +/obj/structure/largecrate/random/mini/small_case{ + pixel_x = 14; + pixel_y = -3 + }, +/turf/open/auto_turf/snow/layer2, +/area/shiva/interior/caves/cp_camp) "mMK" = ( /turf/open/auto_turf/snow/layer4, /area/shiva/exterior/cp_lz2) @@ -17915,10 +17735,6 @@ }, /turf/open/auto_turf/snow/layer4, /area/shiva/exterior/lz1_valley) -"mOT" = ( -/mob/living/simple_animal/hostile/giant_spider/hunter, -/turf/open/auto_turf/ice/layer2, -/area/shiva/interior/caves/left_spiders) "mOY" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/shiva, @@ -17997,22 +17813,6 @@ icon_state = "floor3" }, /area/shiva/interior/colony/central) -"mTN" = ( -/obj/structure/barricade/handrail/wire{ - dir = 8 - }, -/obj/structure/prop/ice_colony/surveying_device/measuring_device{ - dir = 4; - pixel_x = -5; - pixel_y = -2 - }, -/obj/structure/prop/ice_colony/surveying_device/measuring_device{ - dir = 1; - pixel_x = 7; - pixel_y = 16 - }, -/turf/open/auto_turf/ice/layer0, -/area/shiva/interior/caves/cp_camp) "mUB" = ( /obj/item/lightstick/red/spoke/planted{ layer = 2.99; @@ -18032,15 +17832,6 @@ }, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/junkyard/cp_bar) -"mUT" = ( -/obj/structure/machinery/light/double{ - dir = 4; - pixel_y = -5 - }, -/turf/open/floor/shiva{ - icon_state = "floor3" - }, -/area/shiva/interior/colony/research_hab) "mVl" = ( /obj/structure/prop/dam/truck, /turf/open/floor/shiva{ @@ -18187,6 +17978,11 @@ icon_state = "floor3" }, /area/shiva/interior/colony/central) +"ndb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/colony/research_hab) "ndJ" = ( /obj/structure/flora/bush/snow{ icon_state = "snowgrassall_3" @@ -18293,12 +18089,22 @@ icon_state = "multi_tiles" }, /area/shiva/interior/colony/n_admin) -"nhF" = ( -/obj/structure/prop/ice_colony/surveying_device{ - dir = 4 +"nig" = ( +/obj/structure/prop/invuln/ice_prefab/standalone/trim{ + icon_state = "pink_trim" }, -/turf/open/auto_turf/snow/layer0, +/turf/open/auto_turf/snow/layer4, /area/shiva/interior/caves/cp_camp) +"nij" = ( +/obj/item/circuitboard, +/turf/open/auto_turf/snow/layer3, +/area/shiva/exterior/cp_s_research) +"niA" = ( +/obj/structure/stairs/perspective/ice{ + icon_state = "p_stair_full" + }, +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/caves/research_caves) "niL" = ( /obj/structure/platform/strata{ dir = 8 @@ -18311,10 +18117,6 @@ }, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/cp_lz2) -"nkH" = ( -/obj/structure/girder, -/turf/open/floor/shiva, -/area/shiva/interior/caves/research_caves) "nlx" = ( /obj/structure/platform/strata, /obj/structure/platform/strata{ @@ -18334,6 +18136,13 @@ dir = 1 }, /area/shiva/exterior/lz2_fortress) +"nmf" = ( +/obj/structure/prop/invuln/ice_prefab/standalone/trim{ + icon_state = "pink_trim" + }, +/obj/structure/prop/invuln/ice_prefab/roof_greeble, +/turf/open/auto_turf/snow/layer2, +/area/shiva/interior/caves/cp_camp) "nmi" = ( /obj/item/weapon/twohanded/spear, /turf/open/floor/shiva{ @@ -18390,6 +18199,10 @@ }, /turf/open/auto_turf/snow/layer3, /area/shiva/interior/colony/medseceng) +"npY" = ( +/obj/structure/inflatable, +/turf/open/auto_turf/snow/layer3, +/area/shiva/exterior/cp_s_research) "nqu" = ( /turf/open/floor/shiva{ dir = 1; @@ -18473,6 +18286,18 @@ }, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/cp_camp) +"nvu" = ( +/obj/structure/platform/strata{ + dir = 1 + }, +/obj/structure/platform/strata{ + dir = 4 + }, +/obj/structure/platform/strata{ + dir = 8 + }, +/turf/open/gm/river, +/area/shiva/interior/caves/research_caves) "nvS" = ( /turf/open/floor/shiva{ dir = 8; @@ -18496,6 +18321,17 @@ /obj/structure/machinery/space_heater, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/junkyard) +"nxt" = ( +/obj/structure/platform_decoration/strata{ + dir = 1 + }, +/obj/item/lightstick/red/variant/planted{ + pixel_x = -7; + pixel_y = -5 + }, +/obj/structure/blocker/forcefield/multitile_vehicles, +/turf/open/auto_turf/snow/layer0, +/area/shiva/exterior/cp_s_research) "nxA" = ( /obj/structure/bed/chair/office/dark{ dir = 4 @@ -18504,6 +18340,17 @@ icon_state = "floor3" }, /area/shiva/interior/colony/research_hab) +"nyc" = ( +/obj/structure/flora/bush/ausbushes/lavendergrass, +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) +"nyS" = ( +/obj/structure/platform/strata{ + dir = 8 + }, +/obj/structure/platform/strata, +/turf/open/gm/river, +/area/shiva/interior/caves/research_caves) "nzf" = ( /obj/structure/surface/table, /obj/structure/noticeboard{ @@ -18524,10 +18371,11 @@ /turf/open/floor/shiva, /area/shiva/interior/colony/research_hab) "nzr" = ( -/obj/structure/barricade/handrail/wire{ - dir = 8 +/obj/effect/decal/cleanable/blood{ + dir = 4; + icon_state = "gib6" }, -/turf/open/auto_turf/ice/layer0, +/turf/open/auto_turf/snow/layer2, /area/shiva/interior/caves/cp_camp) "nzR" = ( /obj/structure/largecrate/random/case/small, @@ -18537,18 +18385,6 @@ /obj/item/tool/crowbar, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/junkyard) -"nAp" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "S" - }, -/obj/structure/desertdam/decals/road_stop{ - icon_state = "road_edge_decal8" - }, -/turf/open/floor/shiva{ - dir = 1; - icon_state = "purplefull" - }, -/area/shiva/interior/colony/research_hab) "nAs" = ( /obj/effect/decal/cleanable/blood/oil, /turf/open/auto_turf/snow/layer1, @@ -18625,6 +18461,16 @@ }, /turf/open/floor/plating, /area/shiva/exterior/lz1_valley) +"nEQ" = ( +/obj/structure/inflatable, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/cp_s_research) +"nEU" = ( +/obj/structure/prop/ice_colony/ground_wire{ + dir = 1 + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "nEZ" = ( /obj/structure/machinery/vending/snack, /turf/open/floor/shiva{ @@ -18667,14 +18513,6 @@ dir = 1 }, /area/shiva/interior/colony/n_admin) -"nHp" = ( -/obj/structure/prop/invuln/ice_prefab/roof_greeble{ - icon_state = "vent4"; - pixel_x = -4; - pixel_y = 10 - }, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/research_alley) "nHt" = ( /obj/structure/machinery/light/double{ dir = 1; @@ -18692,6 +18530,13 @@ }, /turf/open/floor/shiva, /area/shiva/interior/colony/research_hab) +"nIA" = ( +/obj/item/lightstick/red/variant/planted, +/obj/structure/platform/shiva/catwalk{ + dir = 8 + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/aerodrome) "nIB" = ( /obj/structure/surface/table, /obj/item/device/taperecorder, @@ -18707,10 +18552,6 @@ }, /turf/open/floor/wood, /area/shiva/interior/bar) -"nJu" = ( -/obj/item/frame/rack, -/turf/open/auto_turf/snow/layer0, -/area/shiva/interior/caves/cp_camp) "nKc" = ( /obj/structure/machinery/door/airlock/almayer/medical/colony{ dir = 1; @@ -18783,15 +18624,6 @@ icon_state = "yellow" }, /area/shiva/interior/colony/medseceng) -"nNl" = ( -/obj/structure/platform/strata{ - dir = 1 - }, -/obj/structure/platform/strata{ - dir = 4 - }, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/lz1_valley) "nNN" = ( /obj/structure/bed/chair/comfy/black{ dir = 8 @@ -18819,13 +18651,6 @@ }, /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/cp_colony_grounds) -"nOw" = ( -/obj/structure/stairs/perspective/ice{ - dir = 8; - icon_state = "p_stair_sn_full_cap" - }, -/turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/lz1_valley) "nOB" = ( /obj/item/stack/sheet/metal, /turf/open/floor/shiva{ @@ -18833,6 +18658,15 @@ icon_state = "purplefull" }, /area/shiva/interior/colony/research_hab) +"nOK" = ( +/obj/structure/platform/strata{ + dir = 1 + }, +/obj/structure/platform/strata{ + dir = 8 + }, +/turf/open/gm/river, +/area/shiva/exterior/cp_s_research) "nPb" = ( /obj/structure/prop/ice_colony/soil_net, /obj/structure/platform/strata{ @@ -18870,10 +18704,13 @@ icon_state = "bluefull" }, /area/shiva/interior/colony/n_admin) -"nRL" = ( -/obj/item/device/flashlight, -/turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/research_alley) +"nRD" = ( +/obj/structure/stairs/perspective/ice{ + dir = 1; + icon_state = "p_stair_full" + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/warehouse/caves) "nSI" = ( /obj/structure/machinery/light/double{ dir = 1; @@ -18910,6 +18747,12 @@ }, /turf/open/floor/wood, /area/shiva/interior/aerodrome) +"nUk" = ( +/obj/structure/platform/strata{ + dir = 4 + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "nUn" = ( /obj/structure/bed/chair{ dir = 8 @@ -18977,6 +18820,13 @@ "nZA" = ( /turf/open/auto_turf/ice/layer0, /area/shiva/interior/warehouse/caves) +"nZG" = ( +/obj/item/lightstick/red/spoke/planted{ + pixel_x = -16; + pixel_y = -3 + }, +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) "nZM" = ( /obj/structure/filingcabinet, /obj/effect/landmark/objective_landmark/close, @@ -19034,12 +18884,6 @@ }, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/cp_lz2) -"ocl" = ( -/obj/effect/landmark/nightmare{ - insert_tag = "labs-larder" - }, -/turf/closed/wall/shiva/prefabricated/blue, -/area/shiva/interior/colony/research_hab) "ocv" = ( /obj/item/weapon/ice_axe/red, /turf/open/auto_turf/ice/layer0, @@ -19062,16 +18906,6 @@ }, /turf/open/floor/shiva, /area/shiva/interior/bar) -"ocI" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "W-corner" - }, -/obj/item/lightstick/red/spoke/planted{ - pixel_x = -10; - pixel_y = -1 - }, -/turf/open/floor/plating, -/area/shiva/exterior/lz1_valley) "odb" = ( /obj/structure/machinery/light/double{ dir = 8; @@ -19101,10 +18935,6 @@ }, /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/lz1_valley) -"ofr" = ( -/obj/item/frame/rack, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "ofw" = ( /turf/open/auto_turf/snow/layer4, /area/shiva/exterior/junkyard) @@ -19150,6 +18980,12 @@ icon_state = "yellowfull" }, /area/shiva/interior/garage) +"ohd" = ( +/obj/structure/prop/ice_colony/ground_wire{ + dir = 1 + }, +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) "ohq" = ( /obj/structure/largecrate/random/case, /turf/open/floor/shiva{ @@ -19168,6 +19004,17 @@ /obj/structure/flora/tree/dead/tree_1, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/junkyard) +"oiL" = ( +/obj/item/lightstick/red/spoke/planted{ + pixel_x = 15; + pixel_y = -3 + }, +/obj/item/lightstick/red/spoke/planted{ + pixel_x = -16; + pixel_y = -3 + }, +/turf/open/auto_turf/ice/layer1, +/area/shiva/exterior/cp_s_research) "oiX" = ( /obj/structure/prop/invuln/ice_prefab{ dir = 10 @@ -19179,6 +19026,13 @@ /obj/structure/blocker/forcefield/multitile_vehicles, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/valley) +"okc" = ( +/obj/structure/machinery/light/double{ + dir = 4; + pixel_y = -5 + }, +/turf/open/floor/wood, +/area/shiva/interior/aerodrome) "okz" = ( /obj/effect/decal/cleanable/blood{ layer = 3 @@ -19195,9 +19049,6 @@ icon_state = "redfull" }, /area/shiva/interior/colony/medseceng) -"ols" = ( -/turf/closed/wall/shiva/prefabricated/reinforced/hull, -/area/shiva/exterior/valley) "olI" = ( /obj/item/device/pinpointer, /turf/open/floor/shiva{ @@ -19219,10 +19070,6 @@ /obj/item/evidencebag, /turf/open/floor/wood, /area/shiva/interior/colony/medseceng) -"onF" = ( -/obj/item/lightstick/red/variant/planted, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/valley) "onM" = ( /obj/structure/bed/chair/office/dark{ dir = 1 @@ -19299,6 +19146,10 @@ dir = 1 }, /area/shiva/interior/colony/central) +"ork" = ( +/obj/structure/flora/tree/dead/tree_1, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/cp_s_research) "ors" = ( /obj/effect/decal/cleanable/dirt, /turf/open/auto_turf/ice/layer1, @@ -19322,6 +19173,16 @@ /obj/structure/prop/ice_colony/dense/ice_tray, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/cp_camp) +"osV" = ( +/obj/structure/machinery/light/double{ + dir = 8; + pixel_y = -5 + }, +/turf/open/floor/shiva{ + dir = 4; + icon_state = "multi_tiles" + }, +/area/shiva/interior/colony/research_hab) "otA" = ( /obj/structure/machinery/computer/cameras/wooden_tv{ pixel_y = 7 @@ -19377,7 +19238,7 @@ "owr" = ( /obj/structure/flora/bush/ausbushes/lavendergrass, /turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/cp_s_research) +/area/shiva/exterior/junkyard) "owt" = ( /obj/structure/bed, /obj/item/bedsheet/medical, @@ -19451,14 +19312,6 @@ /obj/structure/largecrate, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/warehouse/caves) -"oCk" = ( -/obj/item/lightstick/red/spoke/planted{ - layer = 2.99; - pixel_x = 12; - pixel_y = 28 - }, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/valley) "oCr" = ( /obj/item/shard{ icon_state = "large" @@ -19689,9 +19542,16 @@ "oQl" = ( /turf/closed/wall/shiva/ice, /area/shiva/exterior/valley) +"oQo" = ( +/turf/closed/wall/shiva/prefabricated, +/area/shiva/exterior/cp_s_research) "oRH" = ( /turf/open/auto_turf/snow/layer2, /area/shiva/interior/caves/cp_camp) +"oRK" = ( +/obj/structure/blocker/forcefield/multitile_vehicles, +/turf/open/auto_turf/snow/layer0, +/area/shiva/exterior/valley) "oSU" = ( /obj/structure/machinery/disposal, /turf/open/floor/shiva{ @@ -19779,6 +19639,7 @@ /obj/structure/platform/strata{ dir = 4 }, +/obj/structure/blocker/forcefield/multitile_vehicles, /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/junkyard) "oZs" = ( @@ -19841,7 +19702,7 @@ "pct" = ( /obj/effect/spider/stickyweb, /turf/open/auto_turf/ice/layer2, -/area/shiva/interior/caves/left_spiders) +/area/shiva/interior/caves/cp_camp) "pcC" = ( /obj/item/tool/pen/blue, /obj/structure/surface/table/reinforced/prison, @@ -19869,22 +19730,11 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/largecrate/random/barrel/yellow, /obj/structure/machinery/light/double{ - dir = 4; + dir = 8; pixel_y = -5 }, /turf/open/asphalt/cement, /area/shiva/interior/warehouse) -"pei" = ( -/obj/item/lightstick/red/spoke/planted{ - pixel_x = 15; - pixel_y = -3 - }, -/obj/item/lightstick/red/spoke/planted{ - pixel_x = -16; - pixel_y = -3 - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "pey" = ( /obj/structure/platform/strata{ dir = 4 @@ -19897,6 +19747,10 @@ icon_state = "bluefull" }, /area/shiva/interior/colony/n_admin) +"pff" = ( +/obj/item/stack/rods, +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) "pfg" = ( /obj/structure/barricade/handrail/strata{ dir = 8 @@ -19986,10 +19840,6 @@ "plM" = ( /turf/open/auto_turf/ice/layer0, /area/shiva/exterior/junkyard) -"plS" = ( -/obj/structure/flora/bush/ausbushes/lavendergrass, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/cp_s_research) "pmj" = ( /obj/effect/landmark/objective_landmark/close, /turf/open/auto_turf/ice/layer1, @@ -20033,6 +19883,15 @@ dir = 1 }, /area/shiva/interior/colony/medseceng) +"poz" = ( +/obj/structure/platform/strata{ + dir = 1 + }, +/obj/structure/platform/strata{ + dir = 8 + }, +/turf/open/auto_turf/snow/layer3, +/area/shiva/exterior/lz1_valley) "ppb" = ( /obj/structure/prop/invuln/ice_prefab{ dir = 9 @@ -20045,6 +19904,12 @@ icon_state = "floor3" }, /area/shiva/interior/aerodrome) +"ppS" = ( +/obj/structure/stairs/perspective{ + icon_state = "p_stair_full" + }, +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/caves/cp_camp) "pqe" = ( /turf/closed/wall/shiva/prefabricated/reinforced/hull, /area/shiva/interior/bar) @@ -20076,7 +19941,7 @@ dir = 8 }, /turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/junkyard) +/area/shiva/interior/caves/research_caves) "prU" = ( /obj/structure/machinery/light/double{ dir = 8; @@ -20118,7 +19983,7 @@ icon_state = "p_stair_sn_full_cap" }, /turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/junkyard) +/area/shiva/interior/caves/research_caves) "ptr" = ( /turf/open/floor/shiva{ dir = 8; @@ -20178,10 +20043,6 @@ "pvv" = ( /turf/open/floor/shiva, /area/shiva/interior/aerodrome) -"pvR" = ( -/obj/structure/platform_decoration/strata, -/turf/open/gm/river, -/area/shiva/interior/caves/cp_camp) "pvU" = ( /obj/structure/flora/grass/tallgrass/ice, /turf/open/auto_turf/snow/layer2, @@ -20193,10 +20054,10 @@ /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/cp_camp) "pwT" = ( -/turf/open/floor/shiva{ - dir = 1; - icon_state = "snow_mat" +/obj/structure/flora/bush/snow{ + icon_state = "snowgrassall_1" }, +/turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/cp_camp) "pxi" = ( /obj/structure/closet/secure_closet/engineering_welding, @@ -20226,16 +20087,6 @@ dir = 1 }, /area/shiva/exterior/lz2_fortress) -"pyB" = ( -/obj/structure/prop/invuln/dense/ice_tray{ - dir = 10; - pixel_y = -9 - }, -/obj/structure/prop/invuln/dense/ice_tray{ - pixel_y = 10 - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "pyI" = ( /obj/structure/machinery/light/small{ dir = 8 @@ -20327,7 +20178,14 @@ icon_state = "p_stair_sn_full_cap" }, /turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/lz1_valley) +/area/shiva/interior/caves/research_caves) +"pCw" = ( +/obj/item/lightstick/red/spoke/planted{ + pixel_x = 12; + pixel_y = 25 + }, +/turf/open/auto_turf/snow/layer4, +/area/shiva/interior/caves/cp_camp) "pCH" = ( /obj/item/tool/shovel, /turf/open/auto_turf/snow/layer3, @@ -20374,10 +20232,6 @@ }, /turf/open/floor/shiva, /area/shiva/interior/colony/research_hab) -"pDH" = ( -/obj/structure/platform_decoration/strata, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/valley) "pDW" = ( /obj/structure/prop/ice_colony/soil_net, /turf/open/auto_turf/snow/layer1, @@ -20434,11 +20288,6 @@ }, /turf/open/gm/river/no_overlay, /area/shiva/interior/caves/cp_camp) -"pFq" = ( -/obj/structure/surface/rack, -/obj/item/tool/crowbar/red, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/cp_s_research) "pFt" = ( /turf/open/floor/shiva{ icon_state = "red" @@ -20468,10 +20317,22 @@ dir = 1 }, /area/shiva/exterior/lz2_fortress) +"pGi" = ( +/obj/structure/prop/ice_colony/ground_wire, +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) "pGj" = ( /obj/item/weapon/ice_axe/red, -/turf/open/auto_turf/snow/layer0, +/turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/cp_camp) +"pGt" = ( +/obj/item/lightstick/red/spoke/planted{ + layer = 3.1; + pixel_x = -13; + pixel_y = 25 + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/exterior/cp_s_research) "pGL" = ( /obj/structure/platform/strata{ dir = 1 @@ -20506,6 +20367,15 @@ }, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/junkyard/cp_bar) +"pIV" = ( +/obj/structure/prop/invuln/ice_prefab/standalone/trim, +/obj/structure/prop/invuln/ice_prefab/roof_greeble{ + icon_state = "windsock"; + pixel_x = 6; + pixel_y = -1 + }, +/turf/closed/wall/shiva/ice, +/area/shiva/exterior/cp_s_research) "pJp" = ( /obj/effect/decal/cleanable/ash, /turf/open/floor/shiva{ @@ -20691,10 +20561,6 @@ icon_state = "yellowfull" }, /area/shiva/interior/colony/medseceng) -"pOy" = ( -/obj/structure/inflatable, -/turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/research_alley) "pOI" = ( /obj/structure/surface/table, /obj/item/reagent_container/food/drinks/dry_ramen, @@ -20724,10 +20590,6 @@ }, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/cp_camp) -"pPY" = ( -/obj/structure/inflatable/popped, -/turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/research_alley) "pQt" = ( /obj/item/stack/sheet/metal, /turf/open/floor/shiva{ @@ -20744,6 +20606,13 @@ }, /turf/open/floor/shiva, /area/shiva/interior/colony/research_hab) +"pRM" = ( +/obj/structure/platform_decoration/strata{ + dir = 1 + }, +/obj/structure/platform_decoration/strata, +/turf/open/gm/river, +/area/shiva/interior/caves/research_caves) "pRU" = ( /obj/item/stack/cable_coil/white, /turf/open/auto_turf/ice/layer1, @@ -20845,16 +20714,18 @@ /obj/effect/landmark/objective_landmark/close, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/cp_camp) +"pWp" = ( +/obj/structure/barricade/handrail/wire{ + dir = 4 + }, +/turf/open/auto_turf/ice/layer1, +/area/shiva/exterior/cp_s_research) "pWw" = ( /obj/structure/closet/cabinet, /obj/item/clothing/under/colonist, /obj/effect/landmark/good_item, /turf/open/floor/wood, /area/shiva/interior/colony/botany) -"pWY" = ( -/obj/structure/girder, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "pXU" = ( /obj/item/lightstick/red/spoke/planted{ pixel_x = -16; @@ -20910,6 +20781,18 @@ icon_state = "yellow" }, /area/shiva/interior/colony/medseceng) +"qdh" = ( +/obj/structure/platform/strata{ + dir = 1 + }, +/obj/structure/platform/strata{ + dir = 4 + }, +/turf/open/gm/river, +/area/shiva/interior/caves/research_caves) +"qdH" = ( +/turf/closed/wall/shiva/prefabricated/blue, +/area/shiva/exterior/junkyard/cp_bar) "qep" = ( /turf/open/auto_turf/snow/layer4, /area/shiva/exterior/cp_colony_grounds) @@ -20955,18 +20838,13 @@ icon_state = "yellowfull" }, /area/shiva/interior/garage) -"qfI" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "N" - }, -/obj/structure/desertdam/decals/road_stop{ - icon_state = "road_edge_decal5" - }, -/turf/open/floor/shiva{ - dir = 1; - icon_state = "purplefull" - }, -/area/shiva/interior/colony/research_hab) +"qfR" = ( +/obj/structure/flora/grass/tallgrass/ice, +/turf/open/auto_turf/snow/layer2, +/area/shiva/interior/caves/research_caves) +"qfZ" = ( +/turf/closed/wall/shiva/prefabricated/orange, +/area/shiva/interior/caves/research_caves) "qgd" = ( /obj/structure/prop/ice_colony/ground_wire, /turf/open/auto_turf/ice/layer2, @@ -20991,9 +20869,9 @@ dir = 1 }, /area/shiva/interior/colony/central) -"qgD" = ( -/turf/closed/wall/shiva/prefabricated/reinforced/hull, -/area/shiva/interior/colony/research_hab) +"qgP" = ( +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/warehouse/caves) "qhm" = ( /obj/structure/barricade/metal{ dir = 4 @@ -21028,6 +20906,10 @@ icon_state = "floor3" }, /area/shiva/interior/bar) +"qiy" = ( +/obj/structure/barricade/handrail/wire, +/turf/open/auto_turf/ice/layer1, +/area/shiva/exterior/cp_s_research) "qjY" = ( /obj/structure/blocker/forcefield/multitile_vehicles, /turf/open/auto_turf/snow/layer0, @@ -21158,6 +21040,13 @@ /obj/effect/landmark/objective_landmark/science, /turf/open/floor/interior/plastic/alt, /area/shiva/interior/warehouse) +"qnJ" = ( +/obj/structure/machinery/light/double{ + dir = 8; + pixel_y = -5 + }, +/turf/open/floor/shiva, +/area/shiva/interior/caves/cp_camp) "qof" = ( /obj/item/stack/cable_coil/blue, /obj/structure/airlock_assembly, @@ -21232,9 +21121,12 @@ dir = 1 }, /area/shiva/interior/colony/central) +"qrY" = ( +/turf/closed/wall/shiva/prefabricated/reinforced, +/area/shiva/exterior/junkyard) "qsN" = ( /obj/structure/machinery/light/double{ - dir = 8; + dir = 4; pixel_y = -5 }, /turf/open/floor/interior/plastic, @@ -21259,17 +21151,6 @@ /obj/item/lightstick/red/variant/planted, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/lz1_valley) -"quO" = ( -/obj/item/tool/shovel/snow, -/obj/item/tool/shovel/snow{ - pixel_y = 8 - }, -/obj/structure/surface/rack, -/turf/open/floor/shiva{ - dir = 4; - icon_state = "snow_mat" - }, -/area/shiva/interior/caves/cp_camp) "qvr" = ( /obj/structure/machinery/alarm{ dir = 8; @@ -21360,16 +21241,6 @@ icon_state = "yellowfull" }, /area/shiva/interior/colony/medseceng) -"qBn" = ( -/obj/structure/prop/invuln/ice_prefab{ - dir = 9 - }, -/obj/structure/prop/invuln/ice_prefab/roof_greeble{ - icon_state = "vent5"; - pixel_y = 10 - }, -/turf/open/auto_turf/snow/layer3, -/area/shiva/interior/caves/cp_camp) "qBM" = ( /obj/structure/platform/strata{ dir = 8 @@ -21377,12 +21248,6 @@ /obj/structure/platform/strata, /turf/open/gm/river, /area/shiva/interior/caves/cp_camp) -"qBN" = ( -/obj/effect/landmark/crap_item, -/turf/open/floor/shiva{ - icon_state = "radiator_tile" - }, -/area/shiva/interior/caves/cp_camp) "qCa" = ( /obj/structure/bed/chair{ dir = 4 @@ -21415,6 +21280,15 @@ icon_state = "floor3" }, /area/shiva/interior/colony/botany) +"qCW" = ( +/obj/structure/platform/strata{ + dir = 1 + }, +/obj/structure/platform/strata{ + dir = 8 + }, +/turf/open/gm/river, +/area/shiva/interior/caves/research_caves) "qDg" = ( /obj/structure/bed/chair{ dir = 8 @@ -21456,8 +21330,19 @@ icon_state = "wred" }, /area/shiva/interior/colony/medseceng) +"qEH" = ( +/obj/structure/largecrate/random/case/small, +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/aerodrome) +"qEK" = ( +/obj/structure/prop/invuln/ice_prefab/standalone{ + icon_state = "white" + }, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/cp_s_research) "qEQ" = ( /obj/structure/platform/strata, +/obj/structure/blocker/forcefield/multitile_vehicles, /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/junkyard) "qFx" = ( @@ -21478,17 +21363,6 @@ "qIr" = ( /turf/open/floor/plating/plating_catwalk/shiva, /area/shiva/interior/warehouse) -"qIu" = ( -/obj/structure/prop/invuln/dense/ice_tray{ - dir = 4; - pixel_y = -9 - }, -/obj/structure/prop/invuln/dense/ice_tray{ - dir = 9; - pixel_y = 10 - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "qII" = ( /turf/open/floor/shiva{ dir = 6; @@ -21506,30 +21380,6 @@ icon_state = "yellow" }, /area/shiva/interior/colony/medseceng) -"qKn" = ( -/obj/structure/bed/chair{ - dir = 4 - }, -/obj/structure/bed/chair{ - dir = 4; - pixel_y = 4 - }, -/obj/structure/bed/chair{ - dir = 4; - pixel_y = 8 - }, -/obj/structure/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/shiva{ - dir = 4; - icon_state = "snow_mat" - }, -/area/shiva/interior/caves/cp_camp) -"qKA" = ( -/obj/structure/barricade/handrail/wire, -/turf/open/auto_turf/ice/layer0, -/area/shiva/interior/caves/cp_camp) "qLA" = ( /obj/structure/machinery/door/airlock/almayer/maint/colony/autoname{ dir = 8 @@ -21556,6 +21406,11 @@ /obj/structure/flora/grass/tallgrass/ice, /turf/open/auto_turf/snow/layer4, /area/shiva/exterior/cp_lz2) +"qMT" = ( +/obj/structure/surface/rack, +/obj/effect/spawner/random/toolbox, +/turf/open/auto_turf/snow/layer0, +/area/shiva/exterior/cp_s_research) "qNj" = ( /obj/structure/flora/tree/dead/tree_5, /turf/open/auto_turf/snow/layer2, @@ -21582,9 +21437,6 @@ }, /turf/open/gm/river, /area/shiva/exterior/cp_lz2) -"qNE" = ( -/turf/closed/wall/shiva/ice, -/area/shiva/exterior/research_alley) "qNK" = ( /obj/structure/surface/table, /obj/item/reagent_container/glass/beaker/cryopredmix{ @@ -21617,10 +21469,6 @@ /obj/item/storage/firstaid/rad, /turf/open/floor/interior/plastic/alt, /area/shiva/interior/warehouse) -"qOP" = ( -/obj/structure/machinery/power/port_gen/pacman, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/cp_s_research) "qOZ" = ( /obj/structure/bed/chair/comfy/beige{ dir = 8 @@ -21637,17 +21485,6 @@ }, /turf/open/floor/interior/plastic/alt, /area/shiva/interior/warehouse) -"qPi" = ( -/obj/structure/closet/toolcloset, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/research_alley) -"qPj" = ( -/obj/structure/platform/strata{ - dir = 4 - }, -/obj/structure/platform/strata, -/turf/open/gm/river, -/area/shiva/interior/caves/left_spiders) "qRb" = ( /obj/structure/barricade/metal/wired, /turf/open/floor/shiva{ @@ -21680,10 +21517,6 @@ /obj/item/stack/sheet/metal, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/cp_colony_grounds) -"qRV" = ( -/obj/structure/platform/strata, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/valley) "qRX" = ( /obj/structure/tunnel{ id = "hydroponics_tunnel" @@ -21782,14 +21615,6 @@ icon_state = "greenfull" }, /area/shiva/interior/colony/n_admin) -"qXC" = ( -/obj/structure/prop/ice_colony/surveying_device/measuring_device{ - dir = 8; - pixel_x = -6; - pixel_y = 13 - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "qXS" = ( /turf/open/floor/shiva, /area/shiva/interior/bar) @@ -21885,15 +21710,6 @@ }, /turf/open/auto_turf/snow/layer0, /area/shiva/interior/caves/cp_camp) -"rdQ" = ( -/obj/structure/prop/invuln/ice_prefab/standalone/trim, -/obj/structure/prop/invuln/ice_prefab/roof_greeble{ - icon_state = "windsock"; - pixel_x = 6; - pixel_y = -1 - }, -/turf/closed/wall/shiva/ice, -/area/shiva/exterior/research_alley) "rdS" = ( /obj/effect/decal/cleanable/dirt, /turf/open/asphalt/cement, @@ -21945,10 +21761,6 @@ /obj/structure/platform/strata, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/cp_lz2) -"rfv" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/research_alley) "rfU" = ( /obj/structure/flora/grass/tallgrass/ice/corner{ dir = 9 @@ -21987,6 +21799,14 @@ icon_state = "redfull" }, /area/shiva/interior/colony/research_hab) +"rib" = ( +/obj/structure/ice/thin/single{ + opacity = 1; + unacidable = 0 + }, +/obj/structure/blocker/forcefield/multitile_vehicles, +/turf/open/auto_turf/ice/layer2, +/area/shiva/exterior/valley) "ril" = ( /obj/structure/closet/secure_closet/freezer/fridge, /turf/open/floor/shiva{ @@ -22019,6 +21839,10 @@ /obj/structure/window/framed/shiva, /turf/open/floor/plating, /area/shiva/interior/garage) +"rkG" = ( +/obj/structure/flora/tree/dead/tree_2, +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) "rkS" = ( /obj/item/lightstick/red/spoke/planted{ pixel_x = -13; @@ -22032,6 +21856,15 @@ icon_state = "warnplate" }, /area/shiva/exterior/junkyard/fortbiceps) +"rld" = ( +/obj/structure/prop/ice_colony/ground_wire{ + dir = 4 + }, +/obj/structure/prop/ice_colony/ground_wire{ + dir = 4 + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "rli" = ( /obj/structure/flora/tree/dead/tree_1, /turf/open/auto_turf/snow/layer2, @@ -22048,15 +21881,6 @@ }, /turf/open/auto_turf/snow/layer0, /area/shiva/exterior/cp_colony_grounds) -"rnO" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "S-corner" - }, -/obj/effect/decal/warning_stripes{ - icon_state = "W-corner" - }, -/turf/open/floor/plating, -/area/shiva/exterior/lz1_valley) "rov" = ( /obj/item/lightstick/red/spoke/planted{ layer = 3.1; @@ -22077,7 +21901,7 @@ unacidable = 0 }, /turf/open/auto_turf/ice/layer2, -/area/shiva/interior/caves/left_spiders) +/area/shiva/interior/caves/cp_camp) "rpL" = ( /obj/structure/bed, /obj/item/bedsheet/medical, @@ -22091,6 +21915,20 @@ icon_state = "wred" }, /area/shiva/interior/colony/medseceng) +"rqK" = ( +/obj/structure/desertdam/decals/road_stop{ + icon_state = "road_edge_decal5"; + pixel_y = -17 + }, +/turf/closed/wall/shiva/prefabricated/orange, +/area/shiva/interior/colony/research_hab) +"rrj" = ( +/obj/item/lightstick/red/variant/planted{ + pixel_x = -7; + pixel_y = -5 + }, +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/caves/research_caves) "rsa" = ( /obj/structure/filingcabinet, /obj/effect/landmark/objective_landmark/close, @@ -22122,10 +21960,6 @@ /obj/item/lightstick/red/variant/planted, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/junkyard) -"rwy" = ( -/obj/structure/inflatable/popped, -/turf/open/auto_turf/snow/layer2, -/area/shiva/exterior/research_alley) "rwQ" = ( /obj/structure/bedsheetbin, /turf/open/floor/shiva{ @@ -22137,17 +21971,6 @@ /obj/structure/bed/chair, /turf/open/floor/interior/plastic/alt, /area/shiva/interior/warehouse) -"rxf" = ( -/obj/structure/largecrate/random/case/double, -/obj/structure/machinery/light/double{ - dir = 8; - pixel_y = -5 - }, -/turf/open/floor/shiva{ - dir = 8; - icon_state = "bluefull" - }, -/area/shiva/interior/aerodrome) "rxF" = ( /obj/structure/prop/invuln/ice_prefab/standalone{ icon_state = "pink" @@ -22181,6 +22004,10 @@ icon_state = "yellow" }, /area/shiva/interior/lz2_habs) +"rzw" = ( +/obj/structure/platform_decoration/strata, +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) "rzz" = ( /obj/structure/flora/pottedplant, /turf/open/floor/shiva{ @@ -22351,6 +22178,10 @@ icon_state = "floor3" }, /area/shiva/interior/colony/s_admin) +"rKq" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/auto_turf/snow/layer3, +/area/shiva/exterior/cp_s_research) "rKW" = ( /obj/structure/machinery/computer3/powermonitor, /turf/open/floor/shiva{ @@ -22404,6 +22235,17 @@ icon_state = "purplefull" }, /area/shiva/interior/colony/research_hab) +"rNx" = ( +/obj/structure/bed/chair/dropship/passenger{ + dir = 8 + }, +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shiva/interior/aerodrome) "rNO" = ( /obj/structure/prop/ice_colony/soil_net, /turf/open/auto_turf/snow/layer2, @@ -22430,6 +22272,17 @@ }, /turf/open/floor/plating, /area/shiva/interior/colony/medseceng) +"rPa" = ( +/obj/structure/bed/chair/dropship/passenger{ + dir = 4 + }, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shiva/interior/aerodrome) "rRb" = ( /obj/structure/surface/rack, /obj/item/weapon/ice_axe, @@ -22467,6 +22320,9 @@ /obj/effect/landmark/objective_landmark/science, /turf/open/floor/plating, /area/shiva/interior/colony/research_hab) +"rRZ" = ( +/turf/closed/wall/shiva/prefabricated/reinforced, +/area/shiva/exterior/cp_s_research) "rSr" = ( /obj/structure/bed/chair/office/light, /turf/open/floor/shiva{ @@ -22523,6 +22379,10 @@ icon_state = "yellowfull" }, /area/shiva/interior/lz2_habs) +"rUW" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) "rVF" = ( /obj/effect/landmark/objective_landmark/close, /turf/open/floor/shiva{ @@ -22570,6 +22430,13 @@ icon_state = "multi_tiles" }, /area/shiva/interior/colony/research_hab) +"rWW" = ( +/obj/item/lightstick/red/spoke/planted{ + pixel_x = 11; + pixel_y = 20 + }, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/cp_s_research) "rXn" = ( /turf/closed/shuttle/elevator{ dir = 5 @@ -22591,6 +22458,10 @@ /obj/effect/landmark/railgun_camera_pos, /turf/open/auto_turf/ice/layer1, /area/shiva/exterior/cp_lz2) +"rYj" = ( +/obj/structure/blocker/forcefield/multitile_vehicles, +/turf/open/auto_turf/snow/layer4, +/area/shiva/exterior/junkyard/cp_bar) "rZj" = ( /obj/structure/surface/table, /obj/structure/machinery/computer/station_alert{ @@ -22661,6 +22532,13 @@ "sax" = ( /turf/closed/wall/shiva/ice, /area/shiva/interior/warehouse/caves) +"saA" = ( +/obj/item/lightstick/red/spoke/planted{ + pixel_x = 12; + pixel_y = 25 + }, +/turf/open/auto_turf/snow/layer2, +/area/shiva/interior/caves/cp_camp) "sbd" = ( /obj/effect/decal/cleanable/blood/splatter, /turf/open/floor/shiva{ @@ -22675,6 +22553,12 @@ /obj/structure/largecrate/random/barrel/green, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/junkyard) +"scp" = ( +/obj/structure/platform_decoration/shiva/catwalk{ + dir = 4 + }, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/lz1_valley) "scN" = ( /obj/structure/surface/table, /obj/item/device/assembly/infra, @@ -22753,6 +22637,12 @@ "sgX" = ( /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/telecomm/lz2_northeast) +"shi" = ( +/obj/structure/prop/invuln/ice_prefab/standalone/trim{ + icon_state = "white_trim" + }, +/turf/closed/wall/shiva/ice, +/area/shiva/exterior/cp_s_research) "shx" = ( /obj/structure/ice/thin/single{ opacity = 1; @@ -22827,14 +22717,6 @@ dir = 1 }, /area/shiva/interior/colony/medseceng) -"skK" = ( -/obj/structure/prop/ice_colony/surveying_device/measuring_device{ - dir = 8; - pixel_x = -6; - pixel_y = 13 - }, -/turf/open/auto_turf/ice/layer0, -/area/shiva/interior/caves/cp_camp) "slj" = ( /turf/open/floor/shiva{ icon_state = "radiator_tile" @@ -22885,9 +22767,6 @@ icon_state = "floor3" }, /area/shiva/interior/aerodrome) -"snZ" = ( -/turf/closed/wall/shiva/prefabricated/reinforced, -/area/shiva/exterior/valley) "sod" = ( /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/junkyard/fortbiceps) @@ -22923,6 +22802,13 @@ icon_state = "floor3" }, /area/shiva/interior/colony/deck) +"srJ" = ( +/obj/structure/stairs/perspective/ice{ + dir = 4; + icon_state = "p_stair_sn_full_cap" + }, +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/caves/research_caves) "ssf" = ( /turf/open/auto_turf/snow/layer3, /area/shiva/interior/colony/central) @@ -22954,18 +22840,15 @@ /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/cp_colony_grounds) "sud" = ( -/turf/open/floor/shiva{ - icon_state = "snow_mat" +/obj/structure/flora/bush/snow{ + icon_state = "snowgrassbb_1" }, +/turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/cp_camp) "suD" = ( /obj/effect/landmark/structure_spawner/xvx_hive/xeno_core, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/medseceng_caves) -"swn" = ( -/obj/structure/largecrate/random, -/turf/open/auto_turf/ice/layer0, -/area/shiva/interior/caves/cp_camp) "swF" = ( /obj/structure/machinery/firealarm{ dir = 8; @@ -22983,7 +22866,7 @@ icon_state = "medium"; name = "ice shard" }, -/turf/open/auto_turf/snow/layer0, +/turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/cp_camp) "swW" = ( /obj/structure/machinery/space_heater, @@ -23147,10 +23030,24 @@ icon_state = "floor3" }, /area/shiva/interior/colony/research_hab) +"sDd" = ( +/obj/item/lightstick/planted, +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) +"sEC" = ( +/obj/structure/flora/grass/tallgrass/ice/corner{ + dir = 10 + }, +/obj/structure/blocker/forcefield/multitile_vehicles, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/cp_s_research) "sFj" = ( /obj/structure/largecrate/random/case/double, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/cp_camp) +"sFs" = ( +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/aerodrome) "sFu" = ( /obj/item/tool/mop, /turf/open/floor/wood, @@ -23234,7 +23131,7 @@ /obj/item/shard{ icon_state = "large" }, -/turf/open/auto_turf/snow/layer0, +/turf/open/auto_turf/snow/layer1, /area/shiva/interior/caves/cp_camp) "sIX" = ( /obj/structure/machinery/constructable_frame{ @@ -23286,6 +23183,13 @@ }, /turf/open/auto_turf/snow/layer0, /area/shiva/interior/colony/botany) +"sKi" = ( +/obj/structure/machinery/light/double{ + dir = 8; + pixel_y = -5 + }, +/turf/open/floor/shiva, +/area/shiva/interior/aerodrome) "sKH" = ( /obj/item/lightstick/red/spoke/planted{ pixel_x = 12 @@ -23393,6 +23297,9 @@ icon_state = "redfull" }, /area/shiva/interior/colony/research_hab) +"sQX" = ( +/turf/open/auto_turf/ice/layer0, +/area/shiva/exterior/cp_s_research) "sRV" = ( /obj/effect/decal/cleanable/blood{ icon_state = "xgibdown1" @@ -23617,6 +23524,13 @@ icon_state = "green" }, /area/shiva/interior/colony/botany) +"teK" = ( +/obj/structure/stairs/perspective/ice{ + dir = 4; + icon_state = "p_stair_sn_full_cap" + }, +/turf/open/auto_turf/ice/layer2, +/area/shiva/interior/warehouse/caves) "tfd" = ( /turf/open/floor/wood, /area/shiva/interior/colony/central) @@ -23649,16 +23563,6 @@ dir = 1 }, /area/shiva/interior/colony/s_admin) -"thK" = ( -/obj/structure/platform/strata{ - dir = 8 - }, -/turf/open/gm/river, -/area/shiva/interior/caves/cp_camp) -"tig" = ( -/obj/structure/blocker/forcefield/multitile_vehicles, -/turf/open/auto_turf/snow/layer1, -/area/shiva/interior/caves/cp_camp) "tiw" = ( /obj/structure/machinery/light, /turf/open/floor/shiva{ @@ -23669,6 +23573,9 @@ /obj/structure/fence, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/junkyard) +"tjL" = ( +/turf/open/auto_turf/snow/layer4, +/area/shiva/interior/aerodrome) "tkb" = ( /obj/structure/surface/table, /obj/item/tool/pen/blue, @@ -23680,15 +23587,13 @@ /obj/structure/largecrate/random/case, /turf/open/asphalt/cement, /area/shiva/interior/warehouse) -"tkB" = ( -/obj/structure/platform/strata{ - dir = 1 - }, -/obj/structure/platform/strata{ - dir = 8 +"tkS" = ( +/obj/structure/largecrate/random/mini/med{ + pixel_x = -7; + pixel_y = 9 }, -/turf/open/gm/river, -/area/shiva/interior/caves/left_spiders) +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) "tle" = ( /obj/structure/prop/invuln/ice_prefab/standalone, /turf/open/auto_turf/snow/layer2, @@ -23731,6 +23636,10 @@ icon_state = "red" }, /area/shiva/interior/colony/central) +"tmP" = ( +/obj/structure/largecrate/random/case/double, +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/aerodrome) "tmV" = ( /obj/structure/machinery/door/airlock/multi_tile/elevator/arrivals, /turf/open/shuttle/elevator/grating, @@ -23781,6 +23690,15 @@ }, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/cp_lz2) +"too" = ( +/obj/structure/prop/ice_colony/soil_net, +/obj/item/tool/shovel/spade{ + layer = 2.99; + pixel_x = -9; + pixel_y = -11 + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "toA" = ( /turf/open/floor/shiva{ dir = 1; @@ -23803,6 +23721,10 @@ icon_state = "redfull" }, /area/shiva/interior/colony/research_hab) +"toO" = ( +/obj/item/stack/rods, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "tpg" = ( /turf/open/floor/plating/plating_catwalk/shiva, /area/shiva/exterior/lz1_valley) @@ -23810,7 +23732,10 @@ /obj/effect/decal/warning_stripes{ icon_state = "NW-out" }, -/obj/effect/decal/cleanable/dirt, +/obj/structure/desertdam/decals/road_stop{ + icon_state = "road_edge_decal5"; + pixel_x = -14 + }, /turf/open/floor/shiva{ dir = 8; icon_state = "purplefull" @@ -23841,15 +23766,6 @@ }, /turf/open/auto_turf/ice/layer0, /area/shiva/interior/caves/cp_camp) -"trw" = ( -/obj/structure/platform/strata{ - dir = 1 - }, -/obj/structure/platform/strata{ - dir = 4 - }, -/turf/open/gm/river, -/area/shiva/interior/caves/left_spiders) "trX" = ( /obj/structure/machinery/conveyor, /obj/effect/decal/cleanable/dirt, @@ -23887,13 +23803,6 @@ dir = 1 }, /area/shiva/exterior/cp_colony_grounds) -"tue" = ( -/obj/structure/platform/strata{ - dir = 8 - }, -/obj/structure/platform/strata, -/turf/open/gm/river, -/area/shiva/interior/caves/left_spiders) "tuz" = ( /obj/structure/platform_decoration/strata{ dir = 1 @@ -23959,12 +23868,6 @@ icon_state = "red" }, /area/shiva/interior/colony/medseceng) -"txO" = ( -/obj/effect/landmark/objective_landmark/science, -/turf/open/floor/shiva{ - icon_state = "floor3" - }, -/area/shiva/interior/caves/cp_camp) "txS" = ( /turf/open/floor/shiva{ icon_state = "multi_tiles" @@ -24182,8 +24085,8 @@ }, /area/shiva/interior/colony/botany) "tJP" = ( -/obj/structure/surface/rack, -/turf/open/auto_turf/ice/layer0, +/obj/structure/flora/tree/dead/tree_4, +/turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/cp_camp) "tJS" = ( /obj/structure/blocker/invisible_wall, @@ -24193,6 +24096,10 @@ /obj/effect/decal/warning_stripes{ icon_state = "SW-out" }, +/obj/structure/desertdam/decals/road_stop{ + icon_state = "road_edge_decal8"; + pixel_x = -14 + }, /turf/open/floor/shiva{ dir = 8; icon_state = "purplefull" @@ -24235,6 +24142,13 @@ dir = 1 }, /area/shiva/interior/colony/medseceng) +"tLC" = ( +/obj/item/lightstick/red/variant/planted, +/obj/structure/platform/shiva/catwalk{ + dir = 4 + }, +/turf/open/auto_turf/snow/layer2, +/area/shiva/interior/aerodrome) "tLP" = ( /obj/structure/platform/shiva/catwalk{ dir = 1 @@ -24336,6 +24250,10 @@ icon_state = "floor3" }, /area/shiva/interior/valley_huts/no2) +"tPB" = ( +/obj/structure/platform/strata, +/turf/open/auto_turf/snow/layer4, +/area/shiva/interior/caves/cp_camp) "tPJ" = ( /obj/structure/platform/shiva/catwalk, /turf/open/auto_turf/snow/layer1, @@ -24376,10 +24294,6 @@ icon_state = "floor3" }, /area/shiva/interior/colony/botany) -"tRn" = ( -/obj/item/lightstick/red/variant/planted, -/turf/open/auto_turf/ice/layer0, -/area/shiva/interior/caves/cp_camp) "tRq" = ( /obj/structure/filingcabinet{ pixel_x = 8; @@ -24438,7 +24352,7 @@ /area/shiva/interior/colony/research_hab) "tTc" = ( /obj/effect/landmark/monkey_spawn, -/turf/open/auto_turf/snow/layer0, +/turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/cp_camp) "tTd" = ( /obj/structure/prop/ice_colony/dense/planter_box{ @@ -24639,6 +24553,13 @@ }, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/junkyard) +"ucN" = ( +/obj/structure/flora/grass/tallgrass/ice/corner{ + dir = 6 + }, +/obj/structure/blocker/forcefield/multitile_vehicles, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/cp_s_research) "udD" = ( /obj/structure/prop/dam/truck{ dir = 4; @@ -24736,13 +24657,9 @@ /obj/structure/largecrate/random/case/double, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/s_lz2) -"ugD" = ( -/obj/structure/machinery/light/double{ - dir = 4; - pixel_y = -5 - }, -/turf/open/floor/shiva, -/area/shiva/interior/aerodrome) +"ugC" = ( +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/oob) "ugP" = ( /obj/structure/computerframe, /turf/open/floor/shiva{ @@ -24792,18 +24709,15 @@ icon_state = "floor3" }, /area/shiva/interior/colony/s_admin) -"uil" = ( -/obj/structure/prop/invuln/ice_prefab/standalone/trim{ - icon_state = "white_trim" - }, -/turf/closed/wall/shiva/ice, -/area/shiva/exterior/research_alley) "uim" = ( /obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node, /turf/open/floor/shiva{ icon_state = "multi_tiles" }, /area/shiva/interior/colony/research_hab) +"uir" = ( +/turf/closed/wall/shiva/prefabricated/reinforced, +/area/shiva/interior/caves/cp_camp) "uiI" = ( /obj/item/reagent_container/food/drinks/cans/beer, /turf/open/auto_turf/snow/layer0, @@ -24882,6 +24796,10 @@ /obj/structure/platform/shiva/catwalk, /turf/open/floor/plating/plating_catwalk/shiva, /area/shiva/exterior/junkyard/fortbiceps) +"ulI" = ( +/obj/structure/flora/bush/ausbushes/lavendergrass, +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/caves/cp_camp) "ulZ" = ( /obj/structure/platform/shiva/catwalk, /obj/structure/cable/heavyduty{ @@ -24935,11 +24853,11 @@ /turf/closed/wall/shiva/prefabricated/white, /area/shiva/exterior/cp_lz2) "uoZ" = ( -/obj/effect/spider/stickyweb{ - icon_state = "stickyweb2" +/obj/structure/tunnel{ + id = "south_tcomms_tunnel" }, /turf/open/auto_turf/ice/layer2, -/area/shiva/interior/caves/left_spiders) +/area/shiva/interior/caves/cp_camp) "upf" = ( /obj/item/tool/pickaxe, /turf/open/auto_turf/snow/layer1, @@ -24961,6 +24879,11 @@ icon_state = "purplefull" }, /area/shiva/interior/lz2_habs) +"upK" = ( +/obj/effect/landmark/corpsespawner/engineer, +/obj/effect/decal/cleanable/blood, +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) "uqb" = ( /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/lz1_valley) @@ -25063,6 +24986,12 @@ icon_state = "multi_tiles" }, /area/shiva/interior/colony/botany) +"uxZ" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W-corner" + }, +/turf/open/floor/plating, +/area/shiva/exterior/junkyard) "uyI" = ( /obj/structure/largecrate/random/mini/small_case/c{ pixel_x = 11; @@ -25254,6 +25183,10 @@ /obj/item/stack/sheet/plasteel/medium_stack, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/s_lz2) +"uIE" = ( +/obj/structure/blocker/forcefield/multitile_vehicles, +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/colony/research_hab) "uII" = ( /obj/structure/surface/table, /obj/effect/landmark/corpsespawner/scientist, @@ -25261,6 +25194,13 @@ icon_state = "floor3" }, /area/shiva/interior/colony/research_hab) +"uIO" = ( +/obj/item/lightstick/red/variant/planted{ + pixel_x = 11; + pixel_y = 11 + }, +/turf/open/auto_turf/snow/layer2, +/area/shiva/interior/caves/cp_camp) "uJg" = ( /obj/item/clothing/shoes/snow, /obj/structure/surface/rack, @@ -25367,6 +25307,9 @@ }, /turf/open/gm/river/no_overlay, /area/shiva/interior/caves/cp_camp) +"uLi" = ( +/turf/open/auto_turf/ice/layer0, +/area/shiva/interior/aerodrome) "uLn" = ( /obj/structure/closet/secure_closet/medical1{ req_access_txt = "100" @@ -25408,16 +25351,6 @@ }, /turf/open/auto_turf/snow/layer0, /area/shiva/exterior/cp_lz2) -"uMJ" = ( -/obj/structure/machinery/light/double{ - dir = 8; - pixel_y = -5 - }, -/turf/open/floor/shiva{ - dir = 8; - icon_state = "bluefull" - }, -/area/shiva/interior/aerodrome) "uNe" = ( /obj/structure/machinery/door/airlock/almayer/engineering/colony{ name = "\improper Colony Engineering Locker Room" @@ -25425,14 +25358,6 @@ /obj/structure/blocker/forcefield/multitile_vehicles, /turf/open/floor/plating, /area/shiva/interior/colony/medseceng) -"uOc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/shiva{ - dir = 8; - icon_state = "purplefull" - }, -/area/shiva/interior/colony/research_hab) "uOR" = ( /obj/effect/landmark/xeno_spawn, /turf/open/floor/shiva{ @@ -25647,13 +25572,6 @@ icon_state = "greenfull" }, /area/shiva/interior/colony/botany) -"uZF" = ( -/obj/structure/barricade/handrail/wire{ - dir = 8 - }, -/obj/structure/barricade/handrail/wire, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "uZJ" = ( /obj/structure/bed/chair{ dir = 8 @@ -25672,10 +25590,6 @@ }, /turf/open/auto_turf/snow/layer0, /area/shiva/interior/colony/medseceng) -"vaT" = ( -/obj/effect/landmark/hunter_primary, -/turf/open/auto_turf/snow/layer1, -/area/shiva/interior/caves/cp_camp) "vbb" = ( /obj/structure/surface/table/woodentable, /obj/item/device/flashlight/lamp, @@ -25775,6 +25689,7 @@ /area/shiva/interior/colony/central) "veu" = ( /obj/structure/platform_decoration/strata, +/obj/structure/blocker/forcefield/multitile_vehicles, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/junkyard) "vey" = ( @@ -25796,6 +25711,10 @@ icon_state = "multi_tiles" }, /area/shiva/interior/colony/central) +"vgR" = ( +/obj/structure/platform_decoration/strata, +/turf/open/auto_turf/snow/layer4, +/area/shiva/interior/caves/cp_camp) "vhp" = ( /obj/structure/surface/table, /obj/effect/landmark/objective_landmark/close, @@ -25822,7 +25741,7 @@ "vhM" = ( /obj/structure/flora/tree/dead/tree_4, /turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/cp_s_research) +/area/shiva/exterior/junkyard) "vhQ" = ( /obj/structure/machinery/space_heater, /turf/open/floor/shiva{ @@ -25844,13 +25763,6 @@ icon_state = "floor3" }, /area/shiva/interior/bar) -"vjg" = ( -/obj/structure/platform/strata, -/obj/structure/platform/strata{ - dir = 4 - }, -/turf/open/gm/river, -/area/shiva/interior/caves/cp_camp) "vjs" = ( /obj/effect/decal/warning_stripes{ icon_state = "E" @@ -25878,6 +25790,10 @@ icon_state = "redfull" }, /area/shiva/interior/colony/medseceng) +"vkr" = ( +/obj/item/device/flashlight, +/turf/open/auto_turf/snow/layer0, +/area/shiva/exterior/cp_s_research) "vkZ" = ( /obj/structure/largecrate/random, /turf/open/floor/shiva{ @@ -25913,10 +25829,6 @@ icon_state = "wred" }, /area/shiva/interior/colony/medseceng) -"vnr" = ( -/obj/structure/prop/ice_colony/soil_net, -/turf/open/auto_turf/ice/layer0, -/area/shiva/interior/caves/cp_camp) "vnF" = ( /obj/structure/surface/table, /obj/item/device/radio, @@ -25992,6 +25904,10 @@ dir = 1 }, /area/shiva/interior/colony/s_admin) +"vrG" = ( +/obj/structure/largecrate/random/barrel/blue, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "vrM" = ( /obj/effect/decal/warning_stripes{ pixel_y = 32 @@ -26016,7 +25932,7 @@ /area/shiva/interior/caves/s_lz2) "vtz" = ( /obj/effect/decal/cleanable/blood/drip, -/turf/open/auto_turf/snow/layer0, +/turf/open/auto_turf/snow/layer1, /area/shiva/interior/caves/cp_camp) "vuj" = ( /obj/structure/bed/roller, @@ -26032,6 +25948,10 @@ dir = 1 }, /area/shiva/interior/colony/central) +"vwn" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/auto_turf/ice/layer1, +/area/shiva/exterior/valley) "vwv" = ( /obj/effect/decal/cleanable/blood, /obj/effect/landmark/corpsespawner/scientist, @@ -26039,6 +25959,14 @@ icon_state = "wredfull" }, /area/shiva/interior/colony/medseceng) +"vwx" = ( +/obj/item/lightstick/red/spoke/planted{ + layer = 3.1; + pixel_x = -13; + pixel_y = 25 + }, +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/caves/cp_camp) "vxb" = ( /obj/structure/stairs/perspective{ icon_state = "p_stair_full" @@ -26064,6 +25992,12 @@ icon_state = "floor3" }, /area/shiva/interior/colony/s_admin) +"vym" = ( +/obj/structure/prop/ice_colony/ground_wire{ + dir = 8 + }, +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) "vyM" = ( /obj/structure/bed/roller, /turf/open/floor/plating, @@ -26142,6 +26076,12 @@ icon_state = "redfull" }, /area/shiva/interior/colony/medseceng) +"vCe" = ( +/obj/structure/flora/bush/snow{ + icon_state = "snowgrassbb_1" + }, +/turf/open/auto_turf/snow/layer2, +/area/shiva/interior/caves/cp_camp) "vCj" = ( /obj/structure/barricade/snow{ dir = 1 @@ -26189,13 +26129,6 @@ /obj/structure/prop/ice_colony/surveying_device, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/junkyard/cp_bar) -"vEN" = ( -/obj/structure/largecrate/random/mini/wooden{ - pixel_x = -16; - pixel_y = -1 - }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/warehouse/caves) "vFi" = ( /obj/item/stack/sheet/metal, /turf/open/floor/plating, @@ -26256,16 +26189,6 @@ icon_state = "floor3" }, /area/shiva/interior/valley_huts/no2) -"vIk" = ( -/obj/structure/machinery/disposal, -/obj/structure/machinery/light/double{ - dir = 4; - pixel_y = -5 - }, -/turf/open/floor/shiva{ - icon_state = "floor3" - }, -/area/shiva/interior/aerodrome) "vIy" = ( /obj/structure/prop/invuln/ice_prefab/trim{ dir = 4 @@ -26292,6 +26215,9 @@ dir = 1 }, /area/shiva/interior/colony/deck) +"vJu" = ( +/turf/closed/wall/shiva/prefabricated/blue, +/area/shiva/exterior/valley) "vKu" = ( /turf/open/floor/shiva{ dir = 8; @@ -26314,15 +26240,9 @@ }, /area/shiva/interior/colony/botany) "vNN" = ( -/obj/structure/machinery/light/double{ - dir = 4; - pixel_y = -5 - }, -/turf/open/floor/shiva{ - dir = 8; - icon_state = "redfull" - }, -/area/shiva/interior/colony/research_hab) +/obj/structure/fence, +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/warehouse/caves) "vOb" = ( /obj/structure/prop/ice_colony/surveying_device{ dir = 4 @@ -26349,6 +26269,9 @@ icon_state = "yellow" }, /area/shiva/interior/colony/medseceng) +"vPr" = ( +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/warehouse/caves) "vPK" = ( /obj/structure/platform/strata{ dir = 1 @@ -26508,6 +26431,12 @@ dir = 1 }, /area/shiva/interior/lz2_habs) +"vZS" = ( +/obj/structure/platform/strata{ + dir = 8 + }, +/turf/open/auto_turf/snow/layer4, +/area/shiva/exterior/lz1_valley) "wag" = ( /turf/closed/wall/shiva/prefabricated/reinforced, /area/shiva/interior/colony/n_admin) @@ -26559,6 +26488,12 @@ dir = 1 }, /area/shiva/interior/colony/medseceng) +"wfH" = ( +/obj/item/lightstick/red/spoke/planted{ + pixel_x = -11 + }, +/turf/open/auto_turf/snow/layer2, +/area/shiva/exterior/cp_s_research) "wfL" = ( /obj/structure/machinery/door/airlock/almayer/security/colony{ name = "\improper Underground Security Evidence Storage" @@ -26647,17 +26582,13 @@ dir = 1 }, /area/shiva/interior/lz2_habs) -"wiG" = ( -/obj/structure/prop/invuln/dense/ice_tray{ - dir = 6; - pixel_y = -9 - }, -/obj/structure/prop/invuln/dense/ice_tray{ - dir = 8; - pixel_y = 10 +"wiy" = ( +/obj/structure/barricade/snow{ + dir = 4 }, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) +/obj/structure/blocker/forcefield/multitile_vehicles, +/turf/open/auto_turf/snow/layer1, +/area/shiva/exterior/junkyard/fortbiceps) "wiM" = ( /obj/structure/machinery/light/double{ dir = 1; @@ -26782,7 +26713,7 @@ pixel_y = 9 }, /turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/cp_s_research) +/area/shiva/exterior/junkyard) "wtC" = ( /turf/open/floor/shiva{ dir = 6; @@ -26801,14 +26732,14 @@ }, /turf/open/auto_turf/snow/layer3, /area/shiva/exterior/cp_lz2) -"wuw" = ( -/obj/item/lightstick/red/spoke/planted{ - layer = 3.1; - pixel_x = -13; - pixel_y = 25 +"wvd" = ( +/obj/structure/prop/ice_colony/surveying_device/measuring_device{ + dir = 8; + pixel_x = -6; + pixel_y = 13 }, -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/valley) +/turf/open/auto_turf/ice/layer0, +/area/shiva/exterior/cp_s_research) "wvx" = ( /obj/structure/largecrate/random/case, /turf/open/floor/shiva, @@ -26827,6 +26758,21 @@ dir = 1 }, /area/shiva/interior/colony/medseceng) +"wwl" = ( +/obj/item/lightstick/red/spoke/planted{ + layer = 3.1; + pixel_x = -13; + pixel_y = 25 + }, +/obj/structure/largecrate/random/case{ + pixel_y = 11 + }, +/obj/structure/largecrate/random/mini/chest/b{ + pixel_x = -4; + pixel_y = -5 + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "wwp" = ( /obj/effect/landmark/hunter_secondary, /turf/open/auto_turf/snow/layer3, @@ -26839,9 +26785,13 @@ dir = 1 }, /area/shiva/exterior/cp_colony_grounds) -"wwW" = ( -/turf/open/auto_turf/snow/layer1, -/area/shiva/exterior/research_alley) +"wwZ" = ( +/obj/structure/stairs/perspective{ + dir = 8; + icon_state = "p_stair_sn_full_cap" + }, +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/caves/cp_camp) "wxs" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/reagent_container/spray/cleaner{ @@ -27049,6 +26999,13 @@ dir = 1 }, /area/shiva/interior/lz2_habs) +"wLM" = ( +/obj/structure/stairs/perspective{ + dir = 1; + icon_state = "p_stair_full" + }, +/turf/open/auto_turf/snow/layer0, +/area/shiva/interior/caves/cp_camp) "wMh" = ( /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/cp_camp) @@ -27084,6 +27041,16 @@ /obj/structure/window/framed/shiva, /turf/open/floor/plating/icefloor, /area/shiva/interior/telecomm/lz1_biceps) +"wNB" = ( +/obj/structure/machinery/door_control/brbutton{ + id = "hangar_ice_2"; + pixel_y = 28 + }, +/obj/structure/platform/shiva/catwalk{ + dir = 4 + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/exterior/lz1_valley) "wOq" = ( /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/shiva{ @@ -27102,9 +27069,10 @@ icon_state = "multi_tiles" }, /area/shiva/interior/colony/research_hab) -"wPp" = ( -/turf/closed/wall/shiva/ice, -/area/shiva/interior/colony/research_hab) +"wPs" = ( +/obj/item/lightstick/red/variant/planted, +/turf/open/auto_turf/snow/layer1, +/area/shiva/exterior/cp_s_research) "wPz" = ( /obj/effect/decal/cleanable/blood/drip{ icon_state = "3" @@ -27132,10 +27100,6 @@ "wRm" = ( /turf/open/floor/plating, /area/shiva/interior/aerodrome) -"wRL" = ( -/obj/structure/prop/ice_colony/soil_net, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/cp_s_research) "wSv" = ( /obj/item/lightstick/red/variant/planted{ pixel_x = -7; @@ -27174,15 +27138,8 @@ }, /area/shiva/interior/colony/research_hab) "wTx" = ( -/obj/item/lightstick/red/spoke/planted{ - pixel_x = 15; - pixel_y = -3 - }, -/obj/item/lightstick/red/spoke/planted{ - pixel_x = -16; - pixel_y = -3 - }, -/turf/open/auto_turf/ice/layer0, +/obj/effect/spawner/random/toolbox, +/turf/open/auto_turf/snow/layer1, /area/shiva/interior/caves/cp_camp) "wTz" = ( /obj/structure/largecrate/random/mini/chest{ @@ -27239,6 +27196,10 @@ icon_state = "multi_tiles" }, /area/shiva/interior/colony/research_hab) +"wXs" = ( +/obj/structure/blocker/forcefield/multitile_vehicles, +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/aerodrome) "wXQ" = ( /obj/effect/decal/cleanable/blood/drip, /turf/open/floor/shiva{ @@ -27307,16 +27268,6 @@ icon_state = "bluefull" }, /area/shiva/interior/colony/n_admin) -"xbm" = ( -/obj/structure/largecrate/random/case/small, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) -"xbn" = ( -/obj/structure/prop/invuln/ice_prefab/trim{ - dir = 6 - }, -/turf/closed/wall/shiva/ice, -/area/shiva/interior/caves/cp_camp) "xbz" = ( /obj/structure/window/framed/shiva, /obj/structure/blocker/forcefield/multitile_vehicles, @@ -27328,12 +27279,6 @@ dir = 1 }, /area/shiva/interior/colony/medseceng) -"xbT" = ( -/obj/effect/landmark/static_comms/net_one, -/turf/open/floor/shiva{ - icon_state = "yellowfull" - }, -/area/shiva/interior/telecomm/lz1_biceps) "xbZ" = ( /obj/structure/prop/invuln/minecart_tracks{ dir = 8 @@ -27342,10 +27287,6 @@ dir = 1 }, /area/shiva/exterior/cp_colony_grounds) -"xct" = ( -/obj/structure/blocker/forcefield/multitile_vehicles, -/turf/open/auto_turf/ice/layer1, -/area/shiva/interior/caves/cp_camp) "xcE" = ( /obj/structure/inflatable/popped, /turf/open/floor/shiva{ @@ -27371,7 +27312,7 @@ dir = 4; pixel_y = 10 }, -/turf/open/auto_turf/snow/layer0, +/turf/open/auto_turf/snow/layer3, /area/shiva/interior/caves/cp_camp) "xeE" = ( /obj/effect/decal/warning_stripes{ @@ -27380,10 +27321,6 @@ /obj/structure/window/reinforced, /turf/open/floor/wood, /area/shiva/interior/colony/central) -"xfZ" = ( -/obj/structure/prop/ice_colony/surveying_device, -/turf/open/auto_turf/ice/layer0, -/area/shiva/interior/caves/cp_camp) "xgc" = ( /turf/open/auto_turf/snow/layer1, /area/shiva/exterior/cp_s_research) @@ -27471,13 +27408,6 @@ icon_state = "yellow" }, /area/shiva/interior/colony/medseceng) -"xog" = ( -/obj/structure/platform/strata, -/obj/structure/platform/strata{ - dir = 8 - }, -/turf/open/gm/river, -/area/shiva/interior/caves/cp_camp) "xoi" = ( /obj/structure/machinery/light/double{ dir = 1; @@ -27510,9 +27440,6 @@ /obj/structure/foamed_metal, /turf/open/floor/plating/plating_catwalk/shiva, /area/shiva/exterior/lz2_fortress) -"xrC" = ( -/turf/open/auto_turf/snow/layer0, -/area/shiva/exterior/research_alley) "xst" = ( /obj/item/lightstick/red/spoke/planted{ layer = 2.99; @@ -27547,6 +27474,10 @@ }, /turf/open/gm/river, /area/shiva/exterior/cp_lz2) +"xun" = ( +/obj/structure/tunnel, +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/colony/research_hab) "xuz" = ( /obj/structure/machinery/space_heater, /turf/open/auto_turf/ice/layer1, @@ -27555,12 +27486,6 @@ /obj/structure/flora/bush/ausbushes/lavendergrass, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/lz1_valley) -"xvd" = ( -/obj/structure/surface/rack, -/obj/item/tool/shovel/snow, -/obj/item/storage/belt/utility/full, -/turf/open/auto_turf/snow/layer3, -/area/shiva/exterior/research_alley) "xvf" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/paper_bin, @@ -27613,6 +27538,15 @@ icon_state = "redfull" }, /area/shiva/interior/colony/n_admin) +"xxY" = ( +/obj/item/lightstick/red/spoke/planted{ + layer = 2.99; + pixel_x = 12; + pixel_y = 28 + }, +/obj/structure/largecrate/random/case/double, +/turf/open/auto_turf/snow/layer4, +/area/shiva/interior/caves/cp_camp) "xyd" = ( /obj/structure/prop/invuln/minecart_tracks{ dir = 10 @@ -27697,12 +27631,29 @@ dir = 1 }, /area/shiva/interior/colony/medseceng) +"xCz" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W-corner" + }, +/obj/item/lightstick/red/spoke/planted{ + pixel_x = -11; + pixel_y = 25 + }, +/turf/open/floor/plating, +/area/shiva/exterior/junkyard) "xCA" = ( /obj/effect/decal/cleanable/blood/drip, /turf/open/floor/prison{ icon_state = "kitchen" }, /area/shiva/interior/bar) +"xCD" = ( +/obj/effect/decal/cleanable/blood{ + dir = 4; + icon_state = "gib6" + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "xCN" = ( /obj/structure/prop/souto_land/pole{ dir = 1 @@ -27777,9 +27728,6 @@ }, /turf/open/auto_turf/snow/layer4, /area/shiva/exterior/cp_lz2) -"xFP" = ( -/turf/open/auto_turf/snow/layer0, -/area/shiva/interior/colony/research_hab) "xFR" = ( /turf/open/floor/shiva{ dir = 8; @@ -27799,6 +27747,9 @@ icon_state = "floor3" }, /area/shiva/interior/aerodrome) +"xHv" = ( +/turf/open/auto_turf/ice/layer1, +/area/shiva/interior/aerodrome) "xIL" = ( /obj/item/powerloader_clamp, /turf/open/floor/shiva{ @@ -27831,6 +27782,22 @@ icon_state = "yellowfull" }, /area/shiva/interior/colony/research_hab) +"xLy" = ( +/obj/structure/platform/strata, +/obj/structure/platform/strata{ + dir = 8 + }, +/turf/open/gm/river, +/area/shiva/exterior/cp_s_research) +"xMs" = ( +/obj/structure/prop/ice_colony/ground_wire{ + dir = 4 + }, +/obj/structure/prop/ice_colony/ground_wire{ + dir = 4 + }, +/turf/open/auto_turf/snow/layer3, +/area/shiva/interior/caves/cp_camp) "xMz" = ( /turf/closed/wall/shiva/ice, /area/shiva/exterior/lz1_valley) @@ -27864,6 +27831,13 @@ }, /turf/open/auto_turf/snow/layer0, /area/shiva/interior/caves/cp_camp) +"xMX" = ( +/obj/effect/spawner/random/toolbox, +/obj/effect/landmark/crap_item, +/turf/open/floor/shiva{ + icon_state = "floor3" + }, +/area/shiva/interior/caves/cp_camp) "xNe" = ( /obj/structure/machinery/iv_drip, /turf/open/floor/shiva{ @@ -27871,16 +27845,9 @@ icon_state = "redfull" }, /area/shiva/interior/colony/medseceng) -"xNO" = ( -/turf/open/auto_turf/snow/layer4, -/area/shiva/exterior/research_alley) "xOb" = ( /turf/open/floor/plating/plating_catwalk/shiva, /area/shiva/interior/bar) -"xOT" = ( -/obj/item/device/flashlight/lamp/tripod/grey, -/turf/open/auto_turf/ice/layer2, -/area/shiva/interior/caves/left_spiders) "xPd" = ( /turf/open/floor/shiva{ icon_state = "radiator_tile2" @@ -27994,12 +27961,6 @@ }, /turf/open/auto_turf/ice/layer1, /area/shiva/interior/caves/cp_camp) -"xWy" = ( -/obj/structure/flora/grass/tallgrass/ice/corner{ - dir = 5 - }, -/turf/open/auto_turf/snow/layer4, -/area/shiva/exterior/junkyard) "xXv" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/trash/plate{ @@ -28024,6 +27985,10 @@ }, /turf/open/auto_turf/snow/layer2, /area/shiva/exterior/cp_colony_grounds) +"xXQ" = ( +/obj/structure/inflatable, +/turf/open/auto_turf/snow/layer0, +/area/shiva/exterior/cp_s_research) "xXV" = ( /obj/structure/closet/secure_closet/engineering_welding, /obj/effect/landmark/objective_landmark/close, @@ -28121,6 +28086,10 @@ icon_state = "floor3" }, /area/shiva/interior/lz2_habs) +"yhA" = ( +/obj/structure/fence, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "yhX" = ( /obj/structure/surface/table, /obj/item/tool/wrench{ @@ -28195,6 +28164,12 @@ /obj/structure/blocker/forcefield/multitile_vehicles, /turf/closed/wall/shiva/prefabricated, /area/shiva/interior/colony/medseceng) +"ylF" = ( +/obj/item/shard{ + icon_state = "medium" + }, +/turf/open/auto_turf/snow/layer1, +/area/shiva/interior/caves/cp_camp) "ylO" = ( /obj/structure/machinery/colony_floodlight_switch{ pixel_y = 32 @@ -28213,7 +28188,7 @@ /obj/structure/prop/ice_colony/ground_wire{ dir = 4 }, -/turf/open/auto_turf/snow/layer0, +/turf/open/auto_turf/snow/layer1, /area/shiva/interior/caves/cp_camp) "ylZ" = ( /obj/structure/machinery/light/double, @@ -28360,22 +28335,22 @@ puZ puZ puZ puZ -qgD -qgD -qgD -qgD -qgD -qgD -qgD -qgD -qgD -qgD -qgD -qgD -qgD -qgD -qgD -qgD +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -28505,39 +28480,39 @@ puZ puZ puZ puZ -pxA -pxA -pxA -pxA -pxA -pxA -pxA -pxA -pxA -aIO -pxA -pxA -pxA -pxA puZ puZ puZ -pxA -pxA -pxA -pxA -pxA -pxA -pxA -pxA -pxA -pxA -pxA -pxA -pxA -pxA -pxA -pxA +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -28660,46 +28635,46 @@ puZ puZ puZ puZ -asz -asz -asz -asz -asz -asz puZ -pxA -ueu -mMa -euA -vKu -euA -euA -vKu -rhS -oqQ -oqQ -rhS -ueu -pxA -pxA -pxA -pxA -pxA -sym -ctk -ugP -pxA -pxA -xwi -thc -ckI -dTn -pxA -pxA -rZt -rZt -rZt -pxA +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -28820,48 +28795,48 @@ puZ puZ puZ puZ -asz -asz -asz -goj -djO -goj -goj -asz -pxA -pxA -lkX -ffw -uim -vKu -uim -ffw -lkX -vKu -vKu -vKu -vKu -vKu -uLu -pxA -pxA -bJi -bJi -euA -vPR -euA -euA -bJi -euA -euA -vPR -euA -bJi -euA -euA -bJi -rZt -pxA +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -28982,50 +28957,50 @@ puZ puZ puZ puZ -asz -fjd -rZt -djO -kts -wAM -djO -asz -pxA -pxA -ift -smI -hUG -vKu -udJ -euA -ift -pKP -nNN -kZy -pKP -vKu -uLu -pxA -pxA -bJi -rZt -dTU -dTU -dTU -dTU -rZt -dTU -dTU -dTU -dTU -rZt -dTU -rZt -mwF -rZt -pxA -kTd -kTd +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +hFl +hFl +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -29144,51 +29119,51 @@ puZ puZ puZ puZ -asz -wgp -rZt -goj -qNK -hrb -goj -wnK -rZt -vKu -lkX -ift -sQU -vKu -sQU -ift -lkX -rhS -oqQ -oqQ -lNm -vKu -pxA -pxA -ctk -mwF -chU -bJi -euA -euA -euA -bJi -euA -euA -euA -euA -bJi -bJi -chU -mwF -rZt -twi -kue -kTd -flN +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +hFl +jCE +jCE +jCE +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -29303,55 +29278,55 @@ puZ puZ puZ puZ +tlB +oRH +tlB +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +aDM +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +hFl +jCE +jCE +kAg +jCE +jCE +puZ +puZ puZ puZ puZ -asz -tqs -rZt -goj -rZt -fHM -goj -wnK -rZt -vKu -wnK -rZt -rZt -wnK -rZt -rZt -wnK -vKu -vKu -vKu -vKu -vKu -bqy -pxA -ugP -mwF -chU -mwF -pxA -pxA -pxA -pxA -wnK -vKu -xIL -vKu -wnK -bJi -chU -bJi -rZt -twi -flN -flN -kue -flN puZ puZ puZ @@ -29451,6 +29426,8 @@ puZ puZ puZ puZ +ntJ +ntJ puZ puZ puZ @@ -29461,6 +29438,21 @@ puZ puZ puZ puZ +hBq +tlB +hBq +hBq +oRH +tlB +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -29468,52 +29460,35 @@ puZ puZ puZ puZ -asz -asz -rZt -goj -rZt -rZt -goj -wnK -xEB -vKu -wnK -rZt -rZt -eFQ -rZt -rZt -wnK -vKu -vKu -vKu -vKu -vKu -jqT -pxA -ctk -cVy -chU -mwF -pxA -kRV -kVe -wnK -mwF -mwF -yiS -mwF -vKu -mwF -chU -mwF -rZt -flN -flN -flN -kTd -kTd +puZ +puZ +puZ +snN +uqb +uqb +aDM +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +oaP +jCE +jCE +jCE +jCE +jCE +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -29612,6 +29587,9 @@ puZ puZ puZ puZ +wMh +ntJ +ntJ puZ puZ puZ @@ -29621,6 +29599,13 @@ puZ puZ puZ puZ +hBq +tlB +oRH +oRH +oRH +hBq +oRH puZ puZ puZ @@ -29630,68 +29615,58 @@ puZ puZ puZ puZ -asz -iIe -rZt -goj -fHM -rZt -goj -wnK -rZt -vKu -vKu -vKu -vKu -vKu -vKu -vKu -toN -vKu -vKu -dgF -hEE -wnK -pxA -pxA -pxA -wnK -wnK -wnK -pxA -hQO -pve -wnK -flN -wAP -flN -dJS -flN -mwF -chU -mwF -rZt -rZt -wBf -pxA -kTd -kue -flN puZ puZ -"} -(10,1,1) = {" puZ puZ puZ -caS -caS -caS -dsD -gpn -caS -caS -caS +puZ +puZ +puZ +uqb +uqb +uqb +kLM +uqb +uqb +uqb +aDM +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +hFl +jLx +iWS +jCE +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +"} +(10,1,1) = {" +puZ +puZ +puZ +caS +caS +caS +dsD +gpn +caS +caS +caS aac aac tQN @@ -29773,15 +29748,63 @@ puZ puZ puZ puZ +ntJ +wMh +wMh +wMh puZ puZ puZ -aau -aau -aau puZ puZ puZ +xAS +xAS +hBq +tlB +oRH +oRH +tlB +tlB +oRH +tlB +hBq +puZ +puZ +puZ +puZ +puZ +puZ +slO +slO +slO +puZ +puZ +mev +cQW +rbA +aDM +cko +rLu +rLu +nMR +uqb +uqb +uqb +uqb +uqb +uqb +aDM +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +jCE puZ puZ puZ @@ -29789,56 +29812,8 @@ puZ puZ puZ puZ -lhu puZ puZ -asz -bNu -rZt -djO -qCs -pPt -goj -wnK -qyE -wnK -asz -fNE -fNE -fNE -pxA -xvS -xvS -pxA -pxA -iQe -qaF -chU -pxA -pxA -pxA -vKu -vKu -vKu -pxA -lGU -wnK -wnK -aPd -aRz -aXi -bag -flN -mwF -chU -mwF -rZt -flN -flN -pxA -flN -kTd -kue puZ puZ "} @@ -29935,14 +29910,62 @@ puZ puZ puZ puZ +jmW +jmW +jmW +wMh +ntJ +puZ +puZ +puZ +vrG +gXu +xAS +xAS +oRH +hBq +oRH +tlB +oRH +xAS +xAS +oRH +hBq +oRH +puZ +puZ +puZ +puZ +puZ +slO +slO +slO +slO +puZ +lLv +cQW +rbA +uqb +mNs +xMz +slO +ofl +uqb +uqb +aDM +uqb +uqb +uqb +uqb +riV +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ -pct -hsu -hsu -aaP -aau -aau puZ puZ puZ @@ -29950,57 +29973,9 @@ puZ puZ puZ puZ -clK puZ puZ puZ -asz -iqt -rZt -goj -axa -hVs -djO -dBB -rZt -rZt -fNE -sdF -biM -biM -fNE -rZt -vKu -pxA -pxA -rZt -hEE -chU -gFb -sfM -oHF -wnK -wnK -wnK -pxA -lYG -wnK -wnK -aPe -aSJ -aXn -bah -flN -mwF -chU -mwF -flN -rZt -rZt -flN -flN -kTd -kue puZ puZ "} @@ -30097,72 +30072,72 @@ puZ puZ puZ puZ +wMh +wMh +wMh +jmW +ntJ +puZ +puZ +xAS +xAS +xAS +xAS +aFO +xAS +oRH +nmf +dcn +fVq +wwl +gpj +tlB +oRH +hBq +puZ +puZ +puZ +puZ +slO +slO +slO +poz +hhT +puZ +bCr +cTU +iOp +qza +mNs +slO +slO +ofl +uqb +xvb +kGW +aDM +uqb +uqb +uqb +aDM +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ -pct -hsu -aav -clK -uoZ -aau puZ puZ puZ -aav -clK -aav -clK -aav puZ puZ puZ -asz -asz -asz -goj -goj -djO -goj -wnK -rZt -rZt -fNE -nPH -biM -biM -fNE -chU -wnK -vFX -pxA -iQe -qaF -chU -kyu -drx -rZt -chU -rZt -chU -fNE -mHU -pDp -wnK -aQm -aXc -aXI -bbG -flN -mwF -chU -mwF -rZt -flN -rZt -flN -flN -flN -kue puZ puZ "} @@ -30259,72 +30234,72 @@ puZ puZ puZ puZ -puZ -aaw -hsu +wMh +wMh +wMh uoZ -clK -clK -aav -clK -aav -aav -rpE -clK -aav -aaP -aav -clK -dCY -asz -asz -asz -asz -asz -wnK -wnK -wnK -wnK -wnK -rZt -rZt -asz -wTm -biM -biM -fNE -chU -vKu -vQm -pxA -rZt -iQe -wnK -gFb -nMk -chU -rZt -chU -rZt -fNE -mWE -pDu -wnK -flN -flN -flN -flN -flN -mwF -chU -fww -sNX -dAt -flN -pxA -flN -flN -kue +ntJ +puZ +puZ +gEn +xAS +xAS +xAS +aFO +hBq +oRH +tlB +xxY +eHY +saA +oRH +lfe +oRH +oRH +puZ +puZ +puZ +puZ +vZS +vZS +niL +hic +aDM +uqb +uqb +uqb +uqb +mfa +jqx +slO +ivE +oqH +uqb +aDM +kLM +kLM +xvb +uqb +aDM +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ "} @@ -30421,72 +30396,72 @@ puZ puZ puZ puZ +wMh +jmW +wMh +wMh +wMh +puZ +puZ +gEn +tlB +oRH +aFO +aFO +aFO +hBq +hBq +xAS +oRH +xAS +oRH +oRH +oRH +xAS +xAS +kvQ +uqb +aDM +uqb +uqb +uqb +uqb +uqb +uqb +qza +kLM +hXX +kLM +mOv +niL +hic +kLM +uqb +uqb +aDM +xvb +uqb +uqb +uqb +aDM +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ -aaw -hsu -clK -aau -aau -clK -aav -hsu -aav -rpE -clK -aav -clK -aav -clK -dCY -asz -wFB -eSt -wFB -dTU -rZt -gAV -rZt -dTU -asz -asz -asz -asz -asz -goj -goj -fNE -chU -wnK -pxA -pxA -pxA -pxA -pxA -pxA -mcw -rZt -chU -rZt -chU -pxA -pxA -pxA -wnK -mwF -mwF -mwF -mwF -vKu -mwF -chU -uOR -rZt -acP -flN -pxA -flN -flN -kue puZ puZ "} @@ -30582,73 +30557,73 @@ puZ puZ puZ puZ +wMh +jmW +jmW +wMh +puZ +puZ +puZ +puZ +lhP +dcn +fVq +vwx +aFO +dDj +aFO +aFO +aFO +aFO +aFO +xAS +oRH +oRH +xAS +xAS +kvQ +iOu +kLM +kLM +kLM +kLM +kLM +uqb +uqb +uqb +uqb +kLM +iQq +uqb +uqb +kLM +kLM +kLM +uqb +uqb +uqb +uqb +kLM +uqb +kLM +aDM +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ -aaU -uoZ -aav -aau -dRb -dRb -aau -clK -clK -aau -dRb -dRb -dRb -dRb -aaL -abL -dCY -asz -gha -uuN -sNX -rZt -chU -gAV -chU -rZt -asz -dnH -jft -ghS -asz -goj -goj -pxA -rZH -vKu -ghU -pxA -vQm -vFX -pxA -pxA -wnK -wnK -wnK -wnK -wnK -pxA -rZt -vKu -vKu -wnK -vKu -wnK -vKu -wnK -bJi -chU -fww -gaJ -dAt -rZt -rZt -flN -flN -kTd puZ puZ "} @@ -30743,74 +30718,74 @@ puZ puZ puZ puZ +wMh +wMh +wMh +wMh +puZ +puZ +puZ +puZ +puZ +xAS +eSf +xAS +hEx +aFO +aFO +aFO +aFO +elf +too +xAS +oRH +aFO +aFO +xAS +aFO +iQq +iQq +iQq +iQq +uqb +uqb +uqb +uqb +kLM +kLM +iQq +gCx +uqb +uqb +qkI +iQq +kLM +kLM +kLM +kLM +gCx +kLM +uqb +uqb +aDM +upf +aDM +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ -clK -aav -clK -aav -tkB -tue -dRb -clK -hsu -aav -dRb -dRb -dRb -dRb -dRb -dRb -dRb -dRb -asz -wFB -eSt -wFB -dTU -rZt -gAV -rZt -txX -kRj -qOZ -cEj -qOZ -goj -fwv -goj -bXo -chU -kQJ -vKu -wnK -vKu -wnK -vKu -kap -rZt -crF -crF -crF -wnK -vKu -wnK -chU -rZt -chU -rZt -chU -rZt -chU -rZt -chU -mwF -byr -rZt -rZt -flN -flN -kTd -kue puZ puZ "} @@ -30905,74 +30880,74 @@ puZ puZ puZ puZ -clK -aav -hsu -aau -clK -trw -qPj -abL -clK -aav -aaL -dRb -dRb -dRb -dRb -dRb -dRb -dRb -dRb -asz -rZt -byr -rZt -rZt -chU -gAV -chU -iaK -feA -biM -biM -biM -uuv -yhX -goj -pxA -rZt -dTU -hWY -dTU -dTU -dTU -rZt -kap -rZt -crF -crF -crF -wnK -vKu -wnK -chU -rZt -chU -rZt -chU -rZt -chU -rZt -chU -mwF -bgC -flN -flN -rZt -flN -kTd -flN +wMh +lqT +wMh +puZ +puZ +puZ +puZ +puZ +puZ +xAS +xAS +aFO +aFO +aFO +aFO +xAS +xAS +oRH +uIO +oRH +oRH +xAS +tlB +xAS +xAS +kvQ +oUu +uqb +kLM +kLM +uqb +iQq +gCx +kLM +uqb +kLM +iQq +iQq +kLM +kLM +kLM +kLM +kLM +iQq +iQq +kLM +kLM +kLM +uqb +uqb +uqb +kLM +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ "} @@ -31066,86 +31041,86 @@ puZ puZ puZ puZ -hsu +jmW pct -clK -clK -aav -clK -aaw -abL -clK -aav -hsu -abD -tkB -tue -dRb -dRb -dRb -dRb -dRb -dRb -asz -eaa -rZt -rZt -rZt -chU -gAV -chU -iaK -kTI -biM -xtI -qOd -goj -wnK -goj -pxA -pxA -pxA -pxA -pxA -pxA -pxA -pxA -pxA -wnK -wnK -wnK -wnK -wnK -pxA -rZt -vKu -vKu -wnK -vKu -wnK -vKu -wnK -bJi -chU -fww -sNX -dAt -flN -rZt -flN -kTd -puZ -puZ -puZ -"} -(19,1,1) = {" -puZ -puZ -puZ -caS -caS -mFm -mFm +wMh +pcY +pcY +pcY +pcY +pcY +pcY +oRH +xAS +aFO +aFO +aFO +aFO +xAS +oRH +tkS +xAS +aFO +oRH +xAS +oRH +xAS +xAS +xAS +kvQ +uqb +dgG +kLM +kLM +kLM +kLM +kLM +iQq +iQq +iQq +iQq +iQq +iQq +iQq +iQq +iQq +iQq +iQq +iQq +iQq +iQq +gCx +kLM +kLM +uqb +kLM +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +"} +(19,1,1) = {" +puZ +puZ +puZ +caS +caS +mFm +mFm mFm mFm mhP @@ -31227,75 +31202,75 @@ puZ puZ puZ puZ -clK -uoZ -hsu -aau -aaP -clK -aau -aau -clK -aaE +wMh +jfO +jmW aau -hsu -uoZ -trw -qPj -dRb -dRb -dRb -dRb -dRb -dRb -asz -rZt -bgC -rZt -rZt -chU -gAV -chU -rZt -asz -biM -biM -biM -goj -lpA -uWA -pxA -tNP -lFp -jcv -fqJ -cSn -pxA -pxA -pxA -rZH -rZt -chU -rZt -rZt -pxA -pxA -pxA -wnK -mwF -mwF -mwF -mwF -vKu -mwF -chU -uOR -uuN -acP -flN -pxA -flN -kTd +ntJ +ntJ +wMh +wMh +wMh +oRH +xAS +aFO +aFO +aFO +oRH +xAS +eUn +tlB +xAS +aFO +xAS +xAS +oRH +oRH +rzw +nUk +xMz +xMz +uqb +uqb +kLM +kLM +gCx +iQq +iQq +cQW +cQW +cQW +iQq +iQq +iQq +gGH +iQq +iQq +cQW +cQW +cQW +cQW +kLM +iQq +iQq +iQq +kLM +uqb +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -31389,75 +31364,75 @@ puZ puZ puZ puZ -aav -clK -abC -clK -aau -aav -hsu -clK -clK -aau -clK -pct -hsu -aaL -dRb -dRb -dRb -dRb -aau -aau -dRb -asz -dAt -sNX -dAt -rZt -chU -gAV -chU -rZt -bXo -biM -biM -biM -goj -xJA -goj -bXo -vKu -soj -wnK -wnK -cSn -pxA -pxA -pxA -wnK -wnK -wnK -wnK -wnK -pxA -kRV -pEv -wnK -flN -flN -flN -flN -flN -mwF -chU -fww -sNX -dAt -rZt -pxA -kTd -flN +lqT +wMh +lqT +wMh +wMh +jmW +jmW +wMh +oRH +oRH +xAS +aFO +aFO +xAS +xAS +tlB +nig +mME +fVq +fXr +oRH +oRH +xAS +kRq +aFc +wMh +xMz +xMz +aDM +uqb +kLM +kLM +gGH +iQq +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +iQq +cQW +cQW +cQW +cQW +kLM +gGH +cQW +iQq +kLM +uqb +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -31551,74 +31526,74 @@ puZ puZ puZ puZ -aav -clK -aav -clK -aav -dRb -dRb -abI -clK -aau -aau -clK -aav -abD -dRb -dRb -aav -aav -hsu -clK -dRb -asz -gha -rZt -sNX -rZt -chU -gAV -chU -rZt -asz -wqc -tOq -hXQ -asz -goj -goj -pxA -vKu -wnK -wnK -cSn -pxA -pxA -sIX -chU -rZt -chU -rZt -wnK -pxA -pxA -nmT -pve -wnK -aPd -aRz -aXi -bag -flN -mwF -chU -mwF -flN -wBf -pxA -pxA -kTd +lqT +wMh +lqT +wMh +wMh +wMh +wMh +wMh +oRH +hBq +xAS +aFO +xAS +xAS +hBq +xAS +pcY +cIs +hBq +pCw +xAS +oRH +xAS +xAS +mfc +xMz +xMz +aDM +uqb +uqb +kLM +iQq +iQq +iQq +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +kLM +cQW +iQq +kLM +kLM +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -31712,78 +31687,78 @@ puZ puZ puZ puZ -aav -hsu -aav -aav -clK -dRb -dRb -tkB -tue -xOT -aau -clK -aav -hsu -hsu -abD -rpE -hsu -hsu -uoZ -clK +lqT +jmW +lqT +lqT +wMh +abH +wMh +oRH +oRH +hBq +xAS +aFO +aFO +xAS +xAS +oRH +pcY +pcY +pcY +pcY +pcY aat -asz -dAt -sNX -dAt -rZt -chU -gAV -chU -asz -asz -asz -asz -asz -asz -asz -asz -pxA -vdS -wnK -vKu -pxA -pxA -ahu -wnK -wnK -wnK -wnK -mUT -uYt -amu -pxA -nrr -wnK -wnK -aPe -act -acA -bah -flN -mwF -chU -bJi -rZt -flN -flN -rZt -flN +oRH +oRH +xAS +oRH +xMz +xMz +aDM +uqb +kLM +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +kLM +kLM +kLM +aDM +aDM +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ -ifQ puZ "} (23,1,1) = {" @@ -31874,75 +31849,75 @@ puZ puZ puZ puZ -uoZ -aav -clK -aaL -abD -dRb -dRb -trw -qPj -abD -hsu -aau -clK -aau -clK -uoZ -rpE -aav -aav -clK -aav -aat -asz -asz -asz -asz -asz -chU -gAV -chU -adS -aea -ptr -aew -aew -aex -asz -asz -lXy -nxA -vKu -vKu -bUe -rZt -chU -rZt -chU -dwQ -wnK -pxA -amu -amu -pxA -nzf -wnK -wnK -aQm -aXc -aXI -bbG -flN -mwF -chU -bJi -bJi -wBf -flN -kTd -kTd +jfO +lqT +wMh +wMh +wMh +oRH +oRH +oRH +tlB +tlB +xAS +aFO +aFO +xAS +oRH +oRH +pcY +pcY +pcY +pcY +pcY +pcY +cIZ +tlB +xAS +oRH +xMz +xMz +kLM +uqb +kLM +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +iQq +iQq +kLM +kLM +uqb +kLM +uqb +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -32037,73 +32012,73 @@ puZ puZ puZ rpE -rpE -rpE -dRb -dRb -dRb -dRb -dRb +jmW +jmW +pcY +pcY +xAS +oRH +oRH +tlB +xAS +tlB +xAS +xAS +oRH +xAS +oRH +pcY +pcY +pcY +pcY +pcY +pcY +yhA dRb -abO -aav -hsu -aaE -aav -aau -clK -rpE -aav -aaP -aav -clK -aat -aat -aat -aat +tlB dRb -asz -chU -gAV -chU -adT -rZt -rZt -rZt -rZt -mRU -aex -asz -nVn -iCJ -pxA -pxA -pxA -wnK -wnK -wnK -wnK -mUT -wnK -amu -jrg -jrg -pxA -nHH -pDp -wnK -flN -flN -flN -flN -flN -mwF -rZt -rZt -mwF -pxA -kTd -kTd +yhA +xMz +uqb +kLM +iQq +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +boD +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +iQq +iQq +iQq +iQq +iQq +kLM +lMO +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -32193,78 +32168,78 @@ tlB puZ wMh wMh -aFO -fuz -aFO -dJl -fuz -aFO +tlB +vym +tlB +sDd +vym +xAS wMh abB -dRb -dRb -dRb -dRb -dRb -dRb -tkB -tue -aav -hsu -clK -clK -aav -rpE -clK -aav -clK -aav -clK -clK -clK -clK -dRb -asz -chU -gAV -chU -adV -rZt -rZt -rZt -rZt -rZt -mOu -asz -asz -asz -asz -asz -rZt -flN -rZt -rZt -dwQ -pxA -amu -amu -jrg -jrg -pxA -mWE -pJA -wnK -mwF -mwF -mwF -mwF -vKu -bJi -bJi -chU -mwF -pxA -flN +pcY +pcY +xAS +xAS +tlB +xAS +tlB +xAS +tlB +oRH +ben +vpD +vpD +pcY +pcY +pcY +pcY +pcY +pcY +pcY +tlB +xAS +tlB +tlB +xMz +uqb +uqb +kLM +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +iQq +iQq +iQq +kLM +kLM +ath +aDM +kLM +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -32355,102 +32330,102 @@ tlB tlB oRH oRH -elN +pGi jmW -tPs -elN +ohd +pGi jmW -tPs +nEU abv wMh -dRb -dRb -dRb -dRb -dRb -dRb -trw -qPj -clK -uoZ -clK -aav -clK -rpE -aav -clK -uoZ -mOT -uoZ -aav -dRb -dRb -dRb -asz -rZH -gAV -chU -adW -aeb -rZt -miD -miD -adi -aCB -asz -asz -asz -asz -wnK -wnK -wnK -wnK -dwQ -flN -jrg -jrg -jrg -jrg -jrg -pxA -pxA -pxA -wnK -wnK -vKu -wnK -vNN -wnK -rZt -mwF -chU -mwF -pxA -puZ -puZ -puZ -puZ -puZ -puZ -puZ -"} -(27,1,1) = {" -puZ -puZ -puZ -caS -caS -mFm -mFm -mFm -mFm -mhP -jLc -mFm -mFm -aar -mFm -gkY +pcY +aFO +aFO +wMh +uir +uir +wMh +xAS +oRH +oRH +vpD +vpD +qFx +pcY +pcY +pcY +pcY +pcY +pcY +tlB +xAS +aFO +xAS +tlB +xMz +uqb +uqb +uqb +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +iQq +kLM +kLM +lNg +uqb +kLM +kLM +vNN +kAw +kAw +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +"} +(27,1,1) = {" +puZ +puZ +puZ +caS +caS +mFm +mFm +mFm +mFm +mhP +jLc +mFm +mFm +aar +mFm +gkY gkY gkY gkY @@ -32514,80 +32489,80 @@ oRH oRH jVi oRH -xAS -aFO -aFO -vtz -pMV +tlB +tlB +tlB +rUW +xMs jqo -aFO -pMV -aFO +tlB +rld +tlB +xAS +wMh +wMh aFO wMh +jOi +ecx +uir +uir wMh -dRb -dRb -dRb -dRb -dRb -dRb -dRb -uoZ -clK -aav -clK -aav -dRb +hBq +xAS +vpD +vpD +vpD +ccu leg -uoZ -hsu -pct -dRb -dRb -dRb -dRb -dRb -asz -chU -gAV -chU -asz -asz -aed -asz -asz -aez -mRU -aeQ -asz -asz -rZt -flN -rZt -dwQ -flN -flN -amu -bJj -jrg -jrg -jrg -jrg -jrg -jrg -pxA -wnK -wnK -pxA -pxA -pxA -pxA -pxA -mwF -chU -mwF -pxA +pcY +pcY +pcY +pcY +rkG +xAS +aFO +xAS +tlB +xMz +aDM +uqb +uqb +kLM +iQq +iQq +iQq +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +kLM +cQW +iQq +kLM +kLM +wgM +kLM +ath +iQq +vNN +cwZ +kAw +puZ +puZ +puZ +puZ puZ puZ puZ @@ -32676,80 +32651,80 @@ jmW tlB oRH xAS -aFO +tlB vtz -aFO -aFO +xAS +tlB mCQ pPK eFI -aFO +tlB vtz gva -aFO +xAS wMh eFI wMh -dRb -dRb -dRb -dRb -dRb -hsu -aav -aav -dRb -dRb -dRb -aaw -aav +jOi +jOi +xMX +uir +wMh +wMh +wMh aav -dRb -dRb -lSU -lSU -lSU -lSU -lSU -chU -gAV -rZt -dTU -dTU -dTU -rZt -fNE -aeC -rZt -aeR -asz -wnK -dwQ -wnK -wnK -wnK -dwQ -bJj -bJj -jrg -jrg -bJj -osE -jrg -jrg -jrg -pxA -wnK -wnK -pxA -pxA -pxA -pxA -pxA -vKu -vKu -vKu -pxA +ben +vpD +vpD +vpD +pcY +pcY +pcY +pcY +tlB +tlB +xAS +tlB +xAS +xMz +aDM +uqb +uqb +uqb +kLM +gGH +iQq +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +cQW +kLM +cQW +cQW +cQW +cQW +kLM +gGH +cQW +kLM +uqb +lNg +erj +kLM +tcp +iQq +vNN +cwZ +kAw +kAw +hrk +puZ +puZ puZ puZ puZ @@ -32837,81 +32812,81 @@ pcY jmW wMh oRH -aFO -aFO -oRH -oRH +tlB +tlB +xAS +xAS wMh pcY jmW nuY wMh -elN +pGi jmW -tPs +ohd wMh wMh wMh wMh +jOi +kHG +uir wMh +ntJ +ntJ +wMh +wMh +wMh +wMh +oRH +pcY +pcY +pcY +pcY +yhA dRb +xAS dRb -aav -uoZ -clK -aav -dRb -dRb -dRb -dRb -dRb -dRb -dRb -dRb -lSU -rHO -rHO -fgK -lSU -chU -gAV -gAV -gAV -gAV -gAV -chU -fNE -aeP -miD -aiV -asz -rZt -rZt -rZt -rZt -flN -amu -fXX -bJj -jrg -bJj -bJj -bJj -bJj -bJj -osE -pxA -wnK -wnK -pxA -pxA -pxA -pxA -pxA -mwF -chU -mwF -pxA +yhA +xMz +cnt +cnt +uqb +xvb +kLM +gCx +kLM +iQq +cQW +cQW +cQW +iQq +iQq +iQq +gGH +kLM +kLM +cQW +cQW +cQW +cQW +kLM +iQq +iQq +kLM +kLM +lNg +xMz +xMz +iQq +kLM +vNN +cwZ +kAw +kAw +hrk +ugC +puZ puZ puZ puZ @@ -33008,72 +32983,72 @@ pcY pcY pcY wMh -aFO -pMV -dJl -aFO -aFO -aFO +tlB +xMs +ilW +xAS +xAS wMh -eFI +jOi +jOi wMh -dRb -rpE -rpE -rpE -dRb -dRb -dRb -dRb -dRb -dRb -dRb -dRb -dRb -ocl -dwQ -dwQ -dwQ -bXo -rZt -dTU -dTU -rZt -gAV -gAV -chU -asz -asz -asz -asz -asz -wnK -wnK -dwQ -wnK -fXX -bJj -bJj -gpz -gpz -gpz -bJj -osE -osE -gpz -gpz -xTK -fXX -fXX -jrg -jrg -jrg -jrg -pxA -xcE -ggL -xcE -pxA +uir +wMh +jmW +ntJ +jmW +ntJ +wMh +wMh +pcY +pcY +pcY +pcY +pcY +pcY +tlB +xAS +xAS +hBq +xMz +xMz +xMz +xMz +oqf +uqb +kTP +kLM +kLM +iQq +iQq +iQq +kLM +iQq +iQq +iQq +iQq +iQq +kLM +kLM +iQq +iQq +iQq +qkI +iQq +uqb +kLM +aDM +xMz +xMz +xMz +iQq +vNN +cwZ +kAw +kAw +kAw +hrk +puZ puZ puZ puZ @@ -33170,72 +33145,72 @@ pcY pcY pcY ouS -aFO +tlB jpp wMh wMh wMh +tlB +xAS wMh -aFO -aFO wMh -abP wMh +jmW +wMh +wMh +ntJ +jmW wMh -abB pcY pcY +tlB +hBq +tlB pcY -lSU -dRb -dRb -abY -abY -dRb -lSU -dwQ -dwQ -lSU -lSU -lSU -lSU -lSU -shO -gAV -gAV -chU -rZt -rZt -ahB -rZt -rZt -rZt -rZt -rZt -rZt -bJj -bJj -osE -gpz -bJj -bJj -bJj -bJj -bJj -gpz -gpz -rad -fXX -osE -gRJ -jrg -jrg -jrg -pxA -mwF -chU -mwF -pxA +hBq +tlB +xAS +aFO +tlB +hBq +xMz +xMz +xMz +xMz +aDM +uqb +kLM +gCx +kLM +kLM +kLM +kLM +kLM +kLM +iQq +iQq +kLM +iQq +iQq +kLM +uqb +iQq +iQq +iQq +kLM +xvb +uqb +uCs +xMz +xMz +xMz +xMz +cwZ +cwZ +kAw +kAw +kAw +hrk puZ puZ puZ @@ -33332,72 +33307,72 @@ pcY pcY pcY laz -aFO -aFO +tlB +tlB yjM kSO qBM -wMh -aFO -aFO -wMh +tlB +tlB xAS xAS -abQ +xAS +xAS +hBq +wMh +wMh +ntJ wMh -pcY -pcY -pcY -lSU dRb -abX -ors -ors -lSU -lSU -dwQ -dwQ -lSU -ada -ady -adE -lSU -goj -goj -goj -goj -goj -goj -goj -goj -goj -wnK -wnK -dwQ -flN -fXX -bJj -bJj -osE -bJj -bJj -gpz -gpz -bJj -bJj -xuz -ciL -bJj -bJj -bJj -jrg -jrg -jrg -amu -fXX -fXX -fSR -amu +xAS +hBq +tlB +tlB +hBq +tlB +tlB +tlB +xAS +aFO +tlB +xAS +tlB +xAS +kvQ +kLM +xvb +kLM +kLM +kLM +kLM +kLM +gCx +kJQ +kLM +qkI +iQq +kLM +iOu +kLM +iQq +qkI +lNg +kLM +lNg +uqb +uqb +xMz +xMz +xMz +xMz +xMz +xMz +cwZ +cwZ +kAw +kAw +kAw +kAw puZ puZ puZ @@ -33489,77 +33464,77 @@ wMh tQn nBo tlB -oRH +xAS sFj pcY kBo obH -aFO -aFO +tlB +tlB cQY rJI gso -pcY -wMh +tlB +tlB +tlB +oRH wMh -aFO -aFO +tlB +xAS xAS wMh -iZI ntJ -ntJ -pcY -lSU -abV -skl -skl -ors -elw -dwQ -dwQ -dwQ -lSU -ada -dwQ -dwQ -adI -goj -chU -goj -chU -chU -chU -goj -chU -aiD -rZt -flN -rZt -dwQ -bJj -osE -bJj -osE -osE -osE -gpz -bJj -gpz -gpz -bJj -ciL -gpz -bJj -xuz -jrg -jrg -jrg -amu -bJj -fSR -fXX -amu +wMh +mpI +hBq +tlB +tlB +xAS +xAS +xAS +xAS +xAS +xAS +xAS +aFO +xAS +tlB +xAS +cdh +aDM +uqb +kLM +kLM +uqb +uqb +kLM +kLM +kLM +iQq +bzK +iQq +iQq +kLM +kLM +iQq +iQq +iQq +iQq +iQq +iQq +iQq +xMz +xMz +xMz +xMz +xMz +xMz +kAw +kAw +kAw +kAw +kAw +kAw puZ puZ puZ @@ -33651,119 +33626,119 @@ pcY pcY pcY xeq -aFO +xAS tze wMh wMh pWn -aFO +tlB tTc cQY aNy xtc -nKD +tlB wMh wMh -vtz -aFO -aFO +tlB +tlB +tlB +xAS xAS wMh wMh -ntJ +aaA wMh -lSU -sgB -skl -skl -ors -dwQ -elw -dwQ -dwQ -adI -adj -dwQ -adH -lSU -goj -wnK -goj -wnK -wnK -wnK -goj -txU -goj -rZt -rZt -flN -asz -jrg -jrg -jrg -osE -osE -osE -osE -bJj -bJj -bJj -bJj -sLj -sLj -tnG -jrg -jrg -jrg -jrg -nkH -bJj -fXX -fSR -amu -puZ -puZ -puZ -puZ -puZ -puZ -puZ -"} -(35,1,1) = {" -puZ -puZ -puZ -caS -caS -mFm -mFm -mFm -caS -caS -mFm -mFm -caS -caS -mFm -lTL -caS -voH -slj -vOd -vOd -slj -las -caS -mFm -mFm -wMj -wMj -mFm -mFm -caS -voH -slj +xAS +tlB +xAS +xAS +aFO +aFO +aFO +aFO +aFO +tlB +xAS +aFO +xAS +tlB +kLM +uqb +kLM +kLM +kLM +kLM +kLM +iQq +iQq +kLM +iQq +iQq +iQq +iQq +kLM +iQq +iQq +iQq +iQq +iQq +iQq +iQq +iQq +xMz +xMz +xMz +xMz +xMz +xMz +kAw +kAw +kAw +kAw +kAw +kAw +puZ +puZ +puZ +puZ +puZ +puZ +puZ +"} +(35,1,1) = {" +puZ +puZ +puZ +caS +caS +mFm +mFm +mFm +caS +caS +mFm +mFm +caS +caS +mFm +lTL +caS +voH +slj +vOd +vOd +slj +las +caS +mFm +mFm +wMj +wMj +mFm +mFm +caS +voH +slj vFq ghK slj @@ -33813,77 +33788,77 @@ wMh cQY xhU wMh -aFO -aFO -dJl -fuz -dJl -aFO -aFO -pXU +tlB +tlB +sDd +vym +sDd +tlB +tlB +nZG wMh wMh -aFO +tlB +hBq +tlB +tlB +oRH +tlB +tlB wMh wMh wMh -eFI +wMh +mpI +hBq +aFO +aFO +aFO +aFO aFO aFO xAS -wMh -ntJ -wMh -lSU -kbT -skl -skl -ors -lSU -lSU -dwQ -dwQ -lSU -dwQ -dwQ -dwQ -lSU -dtE -rZt -rZt -iXr -pue -wui -rZt -rZt -goj -asz -asz -asz -asz -asz -asz -jrg -jrg -jrg -bJj -bJj -bJj -gpz -osE -osE -bJj -osE -osE -jrg -jrg -jrg -jrg -jrg -bJj -gRJ -bJj -amu +tlB +tlB +tlB +xAS +aFO +xAS +kvQ +uqb +aDM +iQq +kLM +kLM +iQq +uqb +uqb +iQq +iQq +iQq +iQq +iQq +kLM +kLM +iQq +iQq +uqb +lNg +lNg +xvb +uqb +xMz +xMz +xMz +xMz +xMz +xMz +kAw +nZA +kAw +kAw +nZA +kAw puZ puZ puZ @@ -33975,77 +33950,77 @@ oRH cQY oRH sIP -aFO -aFO -elN +tlB +tlB +pGi jmW -tPs -aFO +ohd +tlB wMh wMh wMh -aFO -aFO +tlB +tlB +tlB +tlB +oRH +tlB +tlB +xAS +wMh wMh -aFO wMh +wMh +dRb +xAS +tlB +xAS aFO +xAS +xAS +tlB +tlB +xAS +xAS +xAS aFO -tTc +xAS aFO -vaT -wMh -wMh -lSU -xFP -mIx -aca -wPp -wPp -lSU -dwQ -dwQ -lSU -gpb -adC -adC -lSU -goj -wnK -goj -gKE -pue -iYc -onM -wnK -goj -asz -afz -azH -agZ -aUS -asz -jrg -jrg -jrg -jrg -jrg -bJj -gpz -osE -osE -gpz -bJj -bJj -mKF -jrg -jrg -gRJ -sUD -hXH -apD -hXH -czI +fKb +kLM +iQq +kLM +kLM +kLM +kLM +uqb +iOu +kLM +iQq +iQq +iQq +iQq +iQq +iOu +iQq +iQq +uqb +hbD +iDy +iDy +hzJ +hzJ +xMz +xMz +xMz +xMz +xMz +kAw +nZA +nZA +kAw +kAw +kAw puZ puZ puZ @@ -34135,80 +34110,80 @@ aFO aFO aFO wfP -oRH +xAS tlB oRH -aFO -dJl +tlB +sDd hCa -dJl -aFO -aFO +sDd +tlB +tlB wMh wMh -aFO -aFO -aFO -aFO -aFO -aFO -aFO -vtz -aFO +hBq +wMh +wMh +hBq +tlB +tlB xAS +tlB wMh +jmW pcY -lSU -wPp -wPp -acb -wPp -wPp -lSU -dwQ -dwQ -lSU -lSU -lSU -lSU -lSU -goj -chU -dsY -hTb -pRH -lpA -goj -chU -goj -fNE -afV -rZt -rZt -aCB -asz -jrg -jrg -jrg -jrg -bJj -bJj -bJj -gpz -gpz -gpz -bJj -bJj -bJj -jrg -gRJ -bJj -osE -gpz -bJj -bJj -jrg -puZ +pcY +pcY +pcY +hBq +xAS +xAS +pcY +pcY +xAS +xAS +xAS +xAS +cbG +ylF +tlB +uji +uji +uji +uji +uji +uAd +kbK +jpE +iQq +kLM +iQq +iQq +iQq +iQq +iQq +iQq +iQq +iQq +kLM +kLM +qoU +hXB +hzJ +hzJ +hzJ +xMz +xMz +xMz +xMz +kAw +kAw +kAw +kAw +kAw +kAw +hrk +hrk puZ puZ puZ @@ -34301,76 +34276,76 @@ pZB wMh wMh aaA -elN +pGi jmW swV -aFO -aFO -aFO -wMh -wMh -wMh -aFO -wMh +xAS +xAS +tlB wMh +hBq +tlB wMh -aFO -vtz +tlB +oRH +tlB +tlB wMh wMh +ntJ pcY pcY -lSU -wPp -wPp -wPp -wPp -wPp -lSU -elw -dwQ -dwQ -dwQ -dwQ -lSU -lQm -goj -chU -goj -dqH -rZt -sCl -onM -chU -goj -fNE -afX -rZt -rZt -ahS -asz -jrg -jrg -jrg -jrg -bJj -bJj -bJj -osE -bJj -bJj -gpz -bJj -bJj -jrg -osE -bJj -bJj -gpz -bJj -jrg -jrg -puZ +pcY +pcY +tlB +hBq +xAS +pcY +pcY +pcY +xAS +toO +jld +xAS +pff +tlB +uji +uji +uji +uji +uji +kLM +kLM +knI +iQq +iQq +iQq +iQq +iQq +iQq +iQq +iQq +kLM +uqb +uqb +uqb +qEB +hzJ +hzJ +hzJ +hzJ +kAw +hrk +kAw +kAw +kAw +kAw +kAw +nZA +kAw +kAw +kAw +kAw puZ puZ puZ @@ -34463,77 +34438,77 @@ pcY gXW gXW kQW -dJl +ilW ylU -dJl -aFO -wMh +ilW +tlB wMh -aFO wMh -aFO -aFO -aFO +xAS wMh -aFO -aFO +tlB +tlB +tlB +tlB xAS +tlB +wMh +wMh wMh pcY pcY pcY -wPp -wPp -wPp -lSU -lSU -lSU -lSU -dwQ -oaO -dwQ -dwQ -dwQ -bXo -rZt -goj -vuj -goj -eaz -rZt -nwd -goj -wnK -goj -fNE -aud -rZt -rZt -ahT -asz -jrg -jrg -jrg -jrg -bJj -bJj -bJj -bJj -bJj -bJj -bJj -gpz -gpz -bJj -osE -bJj -gpz -gpz -bJj -jrg -jrg -puZ -puZ +pcY +hBq +tlB +pcY +pcY +pcY +uKZ +iMA +aYy +bbj +aYy +iMA +uKZ +uji +uji +uji +uji +uji +uji +qhm +qhm +kXs +mcH +mcH +mcH +mcH +nEH +mcH +mcH +mcH +pNo +qhm +qhm +hzJ +hzJ +hzJ +hzJ +hzJ +kAw +kAw +kAw +hrk +hrk +kAw +nZA +nZA +kAw +kAw +kAw +kAw +hrk puZ puZ puZ @@ -34629,73 +34604,73 @@ mbt mbt abt wMh -aFO -aFO -aFO -aFO -aFO -aFO -fXQ -pcY -wMh -vtz +xAS +tlB +xAS +tlB xAS wMh -pcY +wMh +tlB +tlB wMh wMh -wPp -wPp -wPp -lSU -dwQ -dwQ -dwQ -oaO -dwQ -rEW -lSU -lSU -lSU -ehe -bxW -chU -goj -rZt -rZt -rZt -goj -chU -oag -asz -aud -rZt -rZt -tiw -asz -jrg -jrg -jrg -bJj -osE -bJj -bJj -jrg -bJj -osE -bJj -gpz -gpz -gpz -bJj -bJj -gpz -gpz -fXX -jrg -iTQ -puZ -puZ +wMh +jmW +pcY +pcY +pcY +uji +uKZ +uKZ +uji +uji +uji +uKZ +fRg +fRg +fRg +bfy +fRg +uKZ +uji +dMo +ibP +dMo +uji +uji +kLM +lNE +uqb +iOu +kLM +iQq +iQq +iQq +iQq +kLM +kLM +uqb +uqb +uqb +hzJ +huz +huz +huz +huz +ncS +ncS +ncS +huz +huz +hrk +kAw +kAw +kAw +kAw +kAw +hrk +hrk puZ puZ puZ @@ -34793,70 +34768,70 @@ gXW mbt abw wMh -aFO -aFO -aFO +tlB +tlB +xAS wMh -sFj -pcY wMh -aFO +tlB xAS wMh -iZI -ntJ +wMh ntJ wMh -wPp -wPp -lSU -dwQ -eBG -dwQ -dwQ -elw -rRP -lSU -cvn -lSU -exm -goj -rWS -fVI -rZt -rZt -rZt -goj -chU -goj -aeU -rZt -rZt -rZt -aCB -asz -jrg -jrg -jrg -osE -bJj -bJj -bJj -jrg -bJj -bJj -bJj -bJj -bJj -bJj -bJj -gpz -bJj -bJj -fXX -fXX -iTQ -puZ +pcY +pcY +pcY +uji +oYH +ahe +pvv +sKi +pvv +pvv +aWY +pvv +pvv +pvv +pvv +pvv +pvv +pvv +pvv +fRg +uji +aDM +uqb +uqb +uqb +kLM +kLM +iQq +iQq +iQq +iQq +kLM +kLM +sqb +lNg +aDM +aDM +huz +huz +huz +huz +tRN +rdS +xvQ +huz +huz +kAw +kAw +kAw +kAw +nZA +kAw +hrk puZ puZ puZ @@ -34954,110 +34929,110 @@ idR jHg aui ecz -aFO -aFO -aFO -wMh -jmW -pcY -pcY -pcY -aFO -aFO +tlB +tlB +tlB xAS -iZI +tlB +tlB +tlB +tlB wMh wMh ntJ -wPp -wPp -lSU -dwQ -lSU -lSU -lSU -lSU -lSU -lSU -dwQ -lSU -qRo -goj -wnK -goj -kMJ -rZt -neS -goj -wnK -oag -asz -agl -rZt -rZt -apk -asz -jrg -jrg -jrg -osE -bJj -bJj -jrg -jrg -bJj -bJj -gpz -gpz -bJj -bJj -bJj -gpz -bJj -fXX -bJj -fXX -amu -puZ -puZ -puZ -puZ -puZ -puZ -puZ -"} -(43,1,1) = {" -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -eni -mMK -ntc -vYm -vYm -vYm -vYm -vYm -vYm -vYm -vYm -vYm -vYm -vYm -ntc -vYm -vYm -vYm -vYm -eni -ntc -ntc +ntJ +pcY +pcY +pcY +uji +dtr +oYH +pvv +aTn +pvv +pvv +pvv +pvv +pvv +bfi +pvv +pvv +pvv +pvv +pvv +fRg +hGj +kLM +iOu +uqb +kJQ +uqb +iQq +iQq +iQq +iQq +kLM +iQq +kLM +uqb +kLM +que +aDM +huz +kys +pef +rdS +axJ +axJ +xvQ +fXB +ncS +kAw +nZA +kAw +kAw +nZA +kAw +hrk +puZ +puZ +puZ +puZ +puZ +puZ +"} +(43,1,1) = {" +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +puZ +eni +mMK +ntc +vYm +vYm +vYm +vYm +vYm +vYm +vYm +vYm +vYm +vYm +vYm +ntc +vYm +vYm +vYm +vYm +eni +ntc +ntc eni eni ntc @@ -35118,69 +35093,69 @@ tes sPo wMh tze -aFO -xbm -pcY -pcY -pcY +tlB +tlB +tlB +tlB +xAS +xAS wMh wMh -vtz -aFO -cyW -xAS wMh wMh wMh -iZI -lSU -jis -lSU -acU -acU -lSU -lSU -lSU -fgH -lSU -bYk -goj -chU -dsY -uKo -rZt -wjK -goj -vTj -goj -asz -agm -rZt -rZt -ard -asz -asz -asz -jrg -bJj -bJj -bJj -jrg -jrg -jrg -bJj -gpz -bJj -gpz -bJj -osE -jrg -amu -fXX -fXX -bJj -amu -puZ +pcY +pcY +uji +fRg +oYH +pvv +pvv +aTh +aVx +aWI +aYd +baX +bcJ +pvv +pvv +pvv +pvv +pvv +fRg +hGj +kLM +iQq +kLM +uqb +kLM +iQq +iQq +iQq +iQq +iQq +kLM +iQq +iQq +kLM +kLM +kLM +huz +krU +axJ +axJ +trX +uLT +wTT +fXB +ncS +hrk +hrk +nZA +kAw +kAw +kAw +kAw puZ puZ puZ @@ -35279,70 +35254,70 @@ aRL uLf nlx wMh -aFO -aFO +tlB +tlB wMh -jmW -pcY wMh -aFO -aFO -aFO -aFO -vtz -aFO -aFO +wMh +wMh +tlB xAS wMh -iZI wMh -flN -kEs -agw -agw -kEs -wXh -lSU -cvn -lSU -wOO -goj -chU -goj -lfk -rZt -uII -aiD -chU -goj -fNE -aud -rZt -rZt -mRU -ptr -aue -asz -jrg -bJj -gpz -gpz -bJj -jrg -jrg -jrg -gpz -gpz -gpz -bJj -osE -jrg -iTQ -rbq -rbq -rbq -amu -puZ +wMh +ntJ +wMh +wMh +uKZ +fRg +oYH +pvv +pvv +aUw +aVB +aWQ +aVN +aVN +aVN +bqN +aVx +dbH +pvv +pvv +gxK +hGj +iQq +iQq +iQq +kLM +iQq +iQq +iQq +iQq +iQq +iQq +iQq +kLM +kLM +iQq +iQq +iQq +huz +axJ +axJ +rBC +rdS +axJ +axJ +tkm +ncS +hrk +hrk +kAw +kAw +kAw +kAw +kAw puZ puZ puZ @@ -35441,72 +35416,72 @@ wMh wMh jJv afY -aFO +tlB tTc wMh +gZk +tlB +tlB +tlB +xAS wMh wMh -aFO -aFO -aFO -aFO -aFO -aFO -tTc -vtz -aFO -eFI -xct wMh -kEs -flN -flN -kEs -flN -kOi -lSU -lSU -lSU -lSU -bxW -wnK -goj -aNf -rZt -nBs -goj -txU -goj -fNE -aud -ptr -miD -miD -rZt -ava -asz -asz -dVw -gpz -gpz -bJj -bJj -jrg -bJj -bJj -gpz -bJj -bJj -jrg -jrg -amu -rbq -rbq -rbq -amu -puZ -puZ -puZ +wMh +ntJ +ntJ +uKZ +aQg +oYH +pvv +aTh +aUx +aVL +aWS +rNx +bbg +rNx +aWS +bYO +aWQ +dbH +fhv +fRg +hGj +kLM +kLM +iQq +iQq +kLM +vdk +iQq +iQq +iQq +iQq +iQq +iQq +iQq +iQq +iQq +tpg +exX +qIr +axJ +axJ +axJ +dQq +axJ +huz +huz +huz +hrk +kAw +kAw +kAw +kAw +kAw +fNf +oFl puZ puZ puZ @@ -35602,75 +35577,75 @@ wMh ntJ wMh wMh +tlB +tlB +hBq +pcY wMh -aFO -aFO -aFO -aFO -aFO -aFO -wMh -pWY -wMh -wMh -xAS -xAS +tlB +tlB +tlB wMh +pcY +pcY wMh -tig wMh -eFI -flN -kEs -kEs -fgB -kEs -kOi -lSU -coj -coj -lSU -dtE -rZt -rZt -rZt -rZt -mgT -rZt -uvU -goj -fNE -aud -miD -ptr -ptr -rZt -aCB -aeU -dwQ -bJj -bJj -bJj -bJj -bJj -bJj -bJj -bJj -gpz -bJj -bJj -bJj -jrg -amu -gpz -bJj -osE -amu -puZ -puZ -puZ -puZ -puZ +ntJ +ntJ +uKZ +aQg +oYH +pvv +aTi +aUy +aVL +vVq +aVL +aVL +aVL +aWS +clp +aVU +aUA +gIQ +fRg +hGj +uqb +uqb +uqb +kLM +iQq +ipc +iQq +iQq +iQq +iQq +iQq +iQq +iQq +iQq +iQq +eSN +akF +alS +aMW +wHx +dQq +axJ +axJ +huz +huz +huz +hrk +nZA +nZA +nZA +kAw +kAw +rBk +hip +puZ +puZ puZ puZ "} @@ -35756,7 +35731,7 @@ oRH oRH tlB wMh -tlB +xAS wMh wMh oRH @@ -35764,71 +35739,71 @@ tlB tlB wMh wMh -aFO -aFO -aFO -aFO -wMh -wMh -wMh -wMh -wMh -iZI -wMh -wMh -wMh +tlB +tlB +hBq +pcY +pcY +dRb +dRb +dRb +pcY +pcY +pcY +pcY wMh -jmW -xct wMh wMh -gCL -flN -kEs -flN -flN -vTc -rMI -dTU -dTU -rMI -goj -wnK -goj -wnK -wnK -wnK -goj -wnK -goj -fNE -aud -rZt -rZt -rZt -nBh -ajg -asz -asz -jrg -jrg -jrg -cBU -cBU -cBU -bJj -bJj -bJj -gpz -bJj -bJj -bJj -bJj -fXX -osE -fXX -amu -puZ +uKZ +fRg +oYH +pvv +aTj +aUz +aVU +aWS +rPa +baY +rPa +aWS +cbk +aWU +deV +eVG +fRg +hGj +uqb +kLM +kLM +iQq +iQq +ipc +iQq +kLM +iQq +iQq +iQq +iQq +iQq +iQq +iQq +tpg +exX +qIr +rdS +axJ +axJ +axJ +axJ +axJ +huz +huz +sax +hrk +nZA +nZA +kAw +kAw puZ puZ puZ @@ -35925,77 +35900,77 @@ wMh oRH oRH wMh -aFO -aFO -aFO -aFO -wMh -wMh -pcY +tlB +tlB +tlB +tlB +tlB +tlB +hBq +tlB +xAS pcY pcY pcY -iZI pcY -wMh -ntJ -wMh -xct -wMh -wMh -wMh -flN -flN -eit -kEs -kEs -flN -rMI -dTU -dTU -rMI -goj -chU -goj -chU -chU -chU -goj -chU -aiD -asz -twt -agY -aha -arK -arU -asz -asz -qNE -qNE -enh -xNO -bJj -cBU -cBU -cBU -bJj -fXX -gpz -gpz -vlD -bJj -bJj -bJj -osE -bJj -amu -amu -amu -amu -amu -amu -amu +uji +uKZ +uKZ +uji +dtr +oYH +pvv +fhv +aUA +aVB +aWU +aVx +aVx +aVx +bqN +aVN +deV +dKR +pvv +fRg +hGj +kLM +iQq +iQq +iQq +iQq +iQq +kLM +kLM +uqb +kLM +iQq +iQq +iQq +iQq +iQq +tpg +exX +qIr +aut +rdS +rdS +axJ +axJ +rdS +huz +huz +sax +hrk +kAw +nZA +kAw +kAw +puZ +puZ +puZ +puZ +puZ puZ "} (49,1,1) = {" @@ -36087,77 +36062,77 @@ wMh wMh wMh wMh -aFO -aFO -aFO -aFO -aFO -wMh -pcY -pcY +tlB +tlB +oRH +tlB +tlB +tlB +tlB +tlB +xAS pcY pcY pcY pcY -jmW -abT -wMh -iZI -pWY -wMh -wMh -flN -kEs -kEs -flN -eit -vTc -asz -coj -coj -asz -dtE -goj -goj -goj -goj -goj -goj -aiD -goj -asz -agz -asz -asz -asz -asz -asz -asz -qNE -enh -xNO -acd -cBU -cBU -cBU -bJj -cBU -bJj -gpz -gpz -bJj -bJj -gpz -rbq -fXX -rbq -mwJ -fXX -fXX -fXX -fXX -pLS -amu +uKZ +cHB +xSk +afd +fRg +oYH +aSA +gIQ +aTj +aVN +aWV +aYx +bbh +beK +pvv +pvv +pvv +pvv +pvv +fRg +hGj +iQq +iQq +iQq +iQq +iQq +iQq +kLM +aDM +kLM +iQq +iQq +iQq +iQq +iQq +iQq +iQq +huz +aut +rdS +aCy +tdc +axJ +axJ +tZW +huz +huz +sax +hrk +kAw +nZA +kAw +kAw +puZ +puZ +puZ +puZ +puZ puZ "} (50,1,1) = {" @@ -36247,96 +36222,96 @@ wMh hBq wMh oRH -aFO -aFO -aFO -aFO -aFO -wMh -wMh -wMh -pcY -pcY +tlB +tlB +tlB +oRH +tlB +oRH +tlB +tlB +tlB +tlB pcY pcY pcY pcY -jmW -jmW pcY -lSU -lSU -lSU -lSU -lSU -wBf -kEs -fgB -kEs -flN -asz -asz -asz -asz -asz -asz -tDg -iWX -wZh -asz -rMI -kdy -asz -asz -asz -asz -asz -asz -asz -asz -asz -qNE -xNO -enh -wwW -bJj -bJj -bJj -jrg -cBU -bJj -fXX -fXX -bJj -gpz -bJj -bJj -fXX -vOb -cuJ -fXX -bJj -fXX -fXX -pLS -amu -puZ -"} -(51,1,1) = {" -puZ -puZ -puZ -puZ -puZ -anc -anc -iXC -ukU -iPU -anc -edw -bsM -iVj +uKZ +xSk +aNq +oYH +fRg +oYH +pvv +pvv +pvv +pvv +pvv +pvv +pvv +pvv +pvv +pvv +pvv +pvv +pvv +fRg +hGj +iQq +iOu +kLM +iOu +kLM +kLM +iQq +kLM +iQq +iQq +iQq +iQq +pKK +iQq +iOu +kLM +huz +rdS +axJ +amH +tbR +axJ +rdS +ixC +huz +huz +sax +hrk +kAw +kAw +kAw +kAw +puZ +puZ +puZ +puZ +puZ +puZ +"} +(51,1,1) = {" +puZ +puZ +puZ +puZ +puZ +anc +anc +iXC +ukU +iPU +anc +edw +bsM +iVj qII ntc ntc @@ -36409,15 +36384,13 @@ hBq wMh oRH xAS -aFO +tlB jCZ pGj -aFO -abH -wMh -wMh -pcY -pcY +tlB +hBn +oRH +tlB pcY pcY pcY @@ -36426,62 +36399,64 @@ pcY pcY pcY pcY -lSU -lSU -lSU -aSI -aRs -uRt -flN -sBW -rZt -nOB -rMI -rMI -asz -tRq -wdy -dTU -bZZ -dTU -twc -fNE -rZt -uvU -asz -asz -qNE -qNE -qNE -qNE -qNE -qNE -qNE -qNE -cEV -kSW -wwW -cBU -bJj -jrg -jrg -cBU -cBU -bJj -bJj -bJj -bJj -bJj -fXX -osE -gpz -amu -amu -amu -fXX -igJ -fXX -amu +uKZ +hsw +aNp +bfR +oYH +oYH +pvv +pvv +pvv +pvv +pvv +pvv +pvv +pvv +pvv +pvv +pvv +pvv +pvv +gqe +uji +wNB +khx +jac +khx +iHu +idG +kLM +iQq +iQq +kLM +kLM +huz +huz +huz +huz +huz +huz +mpt +axJ +rxd +sFv +axJ +rdS +hRC +huz +huz +sax +qCr +kAw +nZA +kAw +kAw +puZ +puZ +puZ +puZ +puZ puZ "} (52,1,1) = {" @@ -36571,79 +36546,79 @@ tlB wMh oRH xAS -elN +pGi jmW swV -aFO -wMh -xAS -wMh -pcY -pcY -xbn -qBn -rdp +tlB +oRH +oRH +tlB pcY pcY pcY pcY pcY -lSU -lSU -aOv -afF -rZt -rZt -gLv -afF -wBf -wnK -dTU -pkK -asz -emq -chU -kbZ -chU -gTv -chU -fNE -uvU -rZt -asz -asz -qNE -qNE -qNE -enh -enh -iSG -xNO -iSG -hRF -bax -wwW -wvS -cBU -bJj -bJj -cBU -cBU -bJj -bJj -bJj -qMc -bJj -rbq -osE -gpz -gpz -amu -amu -fXX -fXX -lAb -amu +uji +uji +uji +uji +uKZ +uKZ +uji +uji +uji +qLA +uji +uKZ +aVT +fRg +fRg +oYH +uKZ +bFS +ail +ail +ail +uKZ +uji +uji +iMA +iMA +iMA +uKZ +ehV +aDM +kTP +iQq +iQq +kLM +uqb +huz +cio +ieD +aKR +aDu +huz +axJ +rdS +rti +ieD +axJ +axJ +hIu +huz +huz +sax +sax +nZA +nZA +kAw +kAw +kAw +puZ +puZ +puZ +puZ puZ "} (53,1,1) = {" @@ -36733,79 +36708,79 @@ wMh wMh wMh oRH -aFO -pMV -aFO -aFO -wMh -wMh -pcY -pcY +tlB +xMs +tlB +oRH +tlB +oRH pcY -xbn -ppb -rdp pcY pcY pcY pcY pcY -lSU -lSU -tSI -rZt -gLv -rZt -gLv -afF -wBf -wnK -dTU -wnK -asz -kbZ -chU -gTv -sHf -tRq -chU -ogu -rZt -rZt -asz -asz -qNE -qNE -xNO -iSG -xNO -xNO -xNO -iSG -rwy -bBT -xrC -cBU -cBU -cBU -bJj -bJj -cBU -bJj -bJj -osE -bJj -bJj -bJj -amu -gpz -gpz -amu -amu -fXX -fXX -pLS -amu +uji +uji +fRg +aMs +bYV +lJh +loH +ppI +aMs +bKV +bKV +uKZ +nUa +bKV +bKV +bKV +iDW +bzh +fRg +fRg +fRg +fRg +aKS +fRg +ohq +mKB +cLq +iMA +avx +voo +kLM +iQq +iQq +kLM +tpg +exX +qIr +azS +qny +aDu +aut +kfW +axJ +axJ +axJ +axJ +axJ +rdS +huz +huz +sax +sax +nZA +nZA +kAw +kAw +kAw +puZ +puZ +puZ +puZ puZ "} (54,1,1) = {" @@ -36896,123 +36871,123 @@ wMh wMh oRH xAS -aFO -aFO +tlB +tlB wMh xAS -ntJ -pcY -pcY -pcY -xbn -qBn -rdp -wMh -wMh -wMh -ntJ +aFO pcY -lSU -lSU -afF -sBW -xDq -aSI -afF -aUT -asz -rMI -rMI -rMI -asz -emq -wnK -dTU -wnK -dTU -hfm -asz -rZt -rZq -asz -asz -rdQ -mmW -lLE -aSC -iSG -iSG -atJ -bax -bax -bBT -xrC -cBU -bJj -bJj -cBU -cBU -bJj -fjv -iTQ -osE -gpz -gpz -bJj -amu -gpz -gpz -amu -amu -fXX -fXX -amu -amu -puZ -"} -(55,1,1) = {" -puZ -puZ -puZ -puZ -anc -jWL -nTC -nTC -nTC -nTC -nTC -nTC -pFJ -anc -xkV -fxJ -frV -gNM -aMu -azy -vYm -vYm -vYm -vYm -vYm -vYm -vYm -vYm -ntc -ntc -aEJ -mMK -eni -kOV -kOV -vYm -ntc -ntc -eni -eni -eni -ntc +gUc +xgH +xgH +xgH +gQJ +uji +uji +fRg +fRg +fRg +fRg +fRg +fRg +fRg +bKV +bKV +iMA +vHX +aWX +bKV +bKV +bsC +pvv +pvv +pvv +pvv +pvv +pvv +pvv +pvv +fRg +xQa +iMA +avx +uqb +kLM +iQq +iQq +kLM +tpg +exX +alW +arW +anJ +dQq +hmo +rdS +axJ +dQq +axJ +axJ +axJ +axJ +huz +huz +sax +sax +nZA +nZA +kAw +kAw +kAw +puZ +puZ +puZ +puZ +puZ +"} +(55,1,1) = {" +puZ +puZ +puZ +puZ +anc +jWL +nTC +nTC +nTC +nTC +nTC +nTC +pFJ +anc +xkV +fxJ +frV +gNM +aMu +azy +vYm +vYm +vYm +vYm +vYm +vYm +vYm +vYm +ntc +ntc +aEJ +mMK +eni +kOV +kOV +vYm +ntc +ntc +eni +eni +eni +ntc kOV ntc kOV @@ -37057,78 +37032,78 @@ aFO xAS oRH xAS +tlB +tlB +xAS aFO -aFO -aFO -wMh xAS -ntJ -pcY -pcY +aFO pcY -xbn -ppb -rdp -wMh -ntJ -wMh -wMh -wMh -lSU -aNL -nmi -afP -asz -asz -aTQ -asz -asz -wnK -dTU -wnK -asz -asz -qkL -fNE -fNE -asz -asz -asz -crF -crF -asz -asz -qNE -iSG -bax -aUQ -xNO -iSG -iSG -iSG -wwW -pPY -wwW -bJj -fjv -fjv -fjv -bJj -fjv -jrg -amu -osE -gpz -gpz -fXX -bJj -gpz -gpz -amu -amu -fXX -fXX -amu +aGc +qkC +tzo +qkC +tGv +dtr +fRg +bKV +bKV +bKV +bKV +bKV +bKV +bKV +bKV +bKV +iMA +vHX +bKV +bKV +bKV +bsC +pvv +pvv +pvv +pvv +pvv +pvv +pvv +pvv +fRg +uKZ +uKZ +vqV +kLM +kLM +iQq +iQq +iQq +kLM +huz +pJM +ayZ +rdS +bqO +axJ +bqO +axJ +axJ +axJ +axJ +axJ +axJ +huz +huz +sax +sax +nZA +nZA +nZA +kAw +kAw +fNf +oFl +puZ puZ puZ "} @@ -37219,78 +37194,78 @@ aFO aFO xAS aFO +tlB +tlB +xAS aFO aFO aFO -wMh -wMh -ntJ -pcY -pcY -pcY -xbn -qBn -tyi -wMh -ntJ -ntJ -wMh -wMh -bXo -kxx -bIh -afQ -fNE -rZt -rZt -rZt -rZt -rZt -rZt -rZt -rkc -wnK -rZt -rZt -rZt -asz -asz -hMY -rZt -rZt -asz -asz -qNE -qPi -iSG -iSG -iSG -iSG -bax -iSG -wwW -pOy -wwW -jrg -cBU -fjv -fjv -fjv -jrg -jrg -amu -osE -gpz -osE -osE -bJj -gpz -amu -amu -amu -fXX -fXX -amu +xAS +aGd +aHd +aIG +tzo +aJk +fRg +fRg +bKV +bKV +aMK +aNl +aNl +aPn +bKV +bKV +tsU +uKZ +ocB +bKV +bKV +bKV +hDW +bAX +fRg +fRg +fRg +qXk +fRg +pvv +khz +fRg +iMA +nIA +scp +kLM +iQq +iQq +kLM +iQq +iQq +huz +aQq +axJ +axJ +axJ +axJ +jJZ +oXU +axJ +dQq +axJ +axJ +rdS +huz +huz +sax +sax +kAw +kAw +kAw +kAw +kAw +rBk +hip +puZ puZ puZ "} @@ -37378,81 +37353,81 @@ wMh wMh oRH oRH +xAS +tlB +tlB +hnj +tlB +tlB +xAS aFO aFO aFO -cou -aFO -aFO -xAS -wMh -pcY -jmW -pcY -pcY -aPX -dRi -abA -wMh -wMh -wMh -ntJ -wMh -asz -aNN -afN -afP -fNE -rZt -rZt -rZt -rZt -gGf -rZt -rZt -qVo -wnK -wnK -wnK -rZt -asz -asz -hLB -rZt -rZt -asz -asz -uil -iSG -ayJ -aSC -wwW -wwW -bax -wwW -wwW -cEV -rfv -jrg -amu -iTQ -amu -amu -amu -amu -amu -osE -gpz -osE -osE -bJj -gpz -amu -amu -amu -fXX -fXX -amu +aGd +tzo +qkC +tzo +aGd +fRg +fRg +bKV +bKV +bKV +bKV +kGz +bKV +bKV +ohE +bKV +uKZ +ahe +fRg +fRg +oYH +uKZ +bwk +cex +cex +cex +uKZ +xHu +pvv +pvv +oCG +kjM +oCG +iQq +iQq +iQq +kLM +aDM +kLM +iQq +huz +huz +avz +avz +axJ +axJ +alO +pJM +rgI +rdS +axJ +kLi +alP +huz +huz +sax +sax +kAw +kAw +nZA +kAw +kAw +kAw +puZ +puZ puZ puZ "} @@ -37546,75 +37521,75 @@ wMh wMh wMh aFO +tlB +xAS aFO xAS -wMh -jmW -jmW -wMh -wMh -wMh -ntJ -wMh -ntJ -wMh -wMh -ntJ -asz -asz -asz -asz -asz -asz -krT -rZt -rZt -rZt -gGf -bDx -asz -kXt -asz -wnK -rZt -asz -asz -kPX -rZt -rZt -asz -asz -qNE -nHp -bax -aUQ -wwW -wwW -bax -wwW -wwW -jrg -jrg -jrg -amu -igJ -fXX -fXX -fXX -fXX -fXX -osE -gpz -bJj -fXX -bJj -iTQ -amu -amu -amu -fXX -fXX -amu +aGb +tzo +qkC +tzo +aGd +fRg +fRg +bKV +bKV +pzj +pzi +bKV +bKV +bKV +bKV +bKV +oYH +bKV +bKV +bKV +bKV +oYH +bKV +bKV +bKV +bKV +iMA +sFR +pvv +pvv +oCG +wRm +oCG +iQq +iQq +iQq +szU +kLM +iQq +iQq +uqb +ncS +pTp +pTp +rdS +axJ +alO +huz +qWL +aut +axJ +kLi +kLi +huz +huz +sax +sax +kAw +kAw +nZA +nZA +kAw +kAw +puZ +puZ puZ puZ "} @@ -37709,74 +37684,74 @@ xAS wMh wMh aFO -aFO +tlB xAS -wMh -wMh -ntJ -ntJ -wMh -wMh -lAN -wMh -ntJ -ntJ -wMh -asz -abn -abF -abF -abF -acg -asz -aUU -aXh -mYX -bVr -aXh -aXh -bJf -rkc -wnK -rZt -hMY -asz -asz -crF -crF -asz -asz -xNO -iSG -iSG -iSG -iSG -wwW -xrC -xrC -iSG -enh -jrg -jrg -amu -lAb -fXX -fXX -fXX -fXX -fXX -fXX -bJj -bJj -gpz -osE -bJj -mwJ -bJj -fXX -fXX -fXX -amu +uji +aGe +tzo +tzo +aJj +aGd +fRg +fRg +bKV +bKV +aMK +aNl +aNl +aPn +bKV +bKV +bKV +fRg +bKV +bKV +bKV +bKV +uHA +bKV +bKV +rfd +bKV +iMA +hFJ +fRg +dZN +fRg +iMA +tLC +hye +kLM +iQq +kLM +iQq +iQq +kLM +uqb +ncS +mRc +rdS +aXk +axJ +jFq +huz +qPh +rdS +axJ +axJ +sXt +huz +huz +sax +sax +kAw +kAw +nZA +nZA +nZA +kAw +puZ +puZ puZ puZ "} @@ -37872,73 +37847,73 @@ wMh aFO aFO aFO -aFO -aFO -wMh -wMh -ntJ -gvY -ntJ -qXC -wMh -wMh -wMh -wMh -asz -abp -abG -abJ -abG -ach -asz -aWC -aWs -qkR -eRG -sbd -wnK -aXH -rkc -wnK -rZt -fir -asz -asz -rZt -rZt -asz -asz -iSG -iSG -iSG -bax -bax -wwW -xrC -nRL -kSW -enh -jrg -jrg -amu -cur -fXX -fXX -amu -amu -iTQ -bJj -fXX -gpz -gpz -bJj -fXX -cuJ -fXX -bJj -fXX -fXX -amu +tlB +uji +ahX +qkC +tzo +qkC +mhS +dtr +fRg +bKV +bKV +bKV +bKV +bKV +bKV +bKV +bKV +bKV +fRg +bKV +bKV +bKV +bKV +fRg +bKV +bKV +bKV +bKV +uKZ +uKZ +iMA +iMA +iMA +uKZ +uKZ +ehV +kLM +iQq +iQq +iQq +kLM +kLM +uqb +ncS +bWB +auh +aTO +hkS +itR +oNz +qOE +rdS +axJ +sYx +wFm +huz +huz +sax +sax +kAw +kAw +nZA +hrk +nZA +kAw +puZ +puZ puZ puZ "} @@ -38034,73 +38009,73 @@ wMh xAS xAS aFO -aFO -aFO -aFO -wMh -tRn -wMh -wMh -wMh -pyB -lAN -wMh -wMh -asz -abp -abJ -abJ -abJ -aSK -aTR -rMI -acY -rZt -bJi -rZt -wnK -aXH -rkc -wnK -wnK -asz -asz -dTj -rZt -rZt -tYA -fNE -iSG -aHz -iSG -bax -bax -eSc -xrC -cBs -xNO -enh -jrg -jrg -amu -amu -fXX -fXX -amu -jrg -osE -bJj -gpz -gpz -gpz -osE -bJj -iTQ -iTQ -amu -amu -amu -amu +xAS +uji +rXn +dsx +dsx +dsx +waS +uji +uji +fRg +fRg +pgh +fRg +fRg +fRg +lro +bKV +bKV +oYH +bKV +meg +bKV +bbi +beP +bKV +meg +bKV +bKV +eGG +bKV +bKV +ftr +obb +vHX +iMA +ehV +kLM +iQq +iQq +kLM +uqb +uqb +huz +huz +auh +bWB +qvY +gZZ +iof +aDu +qoY +axJ +axJ +wFm +sYx +huz +huz +sax +sax +nZA +kAw +nZA +nZA +nZA +kAw +puZ +puZ puZ puZ "} @@ -38197,70 +38172,70 @@ vXw wMh xAS aFO -aFO -aFO -aFO -wMh -kSO -thK -xog -kqE -wMh -wMh -wMh -asz -aNP -abJ -abG -abJ -abJ -rZt -kxx -oZs -bJi -bJi -bJi -wnK -bQx -asz -asz -qkL -asz -asz -rZt -rZt -iEF -cYC -fNE -iSG -iSG -bax -wwW -xrC -xrC -xrC -iSp -xNO -xNO -enh -jrg -jrg -amu -fXX -fXX -amu -jrg -bJj -gpz -bJj -bJj -bJj -osE -bJj -amu -puZ -puZ -puZ +uji +uji +uji +uji +uji +uji +uji +uji +uji +aKL +uji +aNh +aLs +uji +uji +iMA +iMA +uKZ +oYH +gxK +fRg +oYH +uKZ +iMA +iMA +uji +uKZ +uKZ +bKV +okc +bKV +krm +iXx +iMA +ehV +uqb +kLM +iQq +nAs +uqb +ajE +huz +qSW +arZ +aIh +aPf +gtx +aTO +oww +qmv +axJ +axJ +axJ +axJ +huz +huz +sax +sax +kAw +kAw +hrk +kAw +nZA +kAw puZ puZ puZ @@ -38359,71 +38334,71 @@ hPp pcY wMh xAS -aFO -aFO -nhF -aFO -rJI -pvR -vjg -wiG -wMh -ntJ -wMh -asz -aNR -abJ -abG -abJ -abJ -rZt -kxx -oZs -bJi -bJi -ahZ -eRG -aXH -rZt -rZt -rZt -hAX -crF -rZt -rZt -rZt -fhd -fNE -iSG -iSG -bax -wwW -xrC -xrC -xrC -xrC -xNO -xNO -enh -jrg -jrg -amu -eom -fXX -amu -osE -osE -bJj -bJj -bJj -bJj -bJj -bJj -amu -puZ -puZ -puZ -puZ +uji +uji +uji +uji +uji +uji +uji +uji +aLk +bKV +bKV +aNg +bKV +aOb +uji +snX +fRg +aKS +fRg +fRg +dLk +fRg +aKS +fRg +fRg +fRg +rIj +uKZ +giH +uji +iMA +iMA +iMA +uKZ +ehV +uqb +kLM +iQq +iQq +kLM +ajd +huz +fjS +anJ +aGf +aNE +ggr +hLE +qvY +qkQ +axJ +axJ +axJ +axJ +huz +huz +sax +iZj +kAw +kAw +hrk +kAw +nZA +kAw +hrk puZ puZ puZ @@ -38521,71 +38496,71 @@ pcY pcY wMh xAS -aFO -aFO -aFO -wMh -rJI -gso -aJd -ntJ +tPB wMh wMh +ntJ +ntJ +ntJ wMh -asz -abp -abJ -abJ -abJ -abJ -rZt -rMI -oZs -azm -bJi -rZt -wnK -aXH -rZt -rZt -rZt -dwQ -crF -rZt -rZt -rZt -rZt -fNE -iSG -iSG -wwW -xrC -wwW -jjq -iYu -eMx -xNO -xNO -jrg -jrg -jrg -amu -fXX -fXX -amu -osE -osE -gpz -bJj -jrg -bJj -bJj -gpz -osE -puZ -puZ -puZ -puZ +iMA +aKQ +bKV +bKV +omu +aFr +uji +uji +pvv +kJw +pvv +pvv +pvv +pvv +pvv +sYh +pvv +pvv +pvv +pvv +eGs +fRg +uji +xwo +jhm +bHC +bHC +iKW +kLM +iQq +iQq +iQq +iQq +qIr +oWk +qIr +anG +axJ +axJ +ggh +rdS +owe +axJ +rdS +axJ +axJ +axJ +huz +huz +sax +kAw +kAw +nZA +nZA +kAw +kAw +kAw +hrk puZ puZ puZ @@ -38683,71 +38658,71 @@ pcY jmW wMh aFO -aFO -aFO +tPB wMh -ntJ -rJI -gso -faR -ntJ wMh wMh +ntJ +ntJ wMh -asz -abp -abG -abJ -abG -acj -asz -aUX -aWB -gTU -wnK -wnK -wnK -aXH -rZt -rZt -rZt -asz -asz -rZt -rZt -hCY -hCY -fNE -iSG -iSG -xrC -wwW -bax -iSG -xrC -xrC -xNO -jrg -jrg -jrg -jrg -amu -fXX -fXX -amu -iTQ -bJj -gpz -bJj -jrg -bJj -bJj -gpz -osE -puZ -puZ -puZ -puZ +iMA +aJM +aJU +bKV +aLk +bMK +uji +snX +pvv +aSA +pvv +vFR +eVG +pvv +pvv +pvv +aSA +pvv +pvv +pvv +pvv +fRg +hvZ +kLM +iOu +kLM +iOu +kLM +iQq +kLM +iQq +iQq +iQq +qIr +oWk +qIr +ans +ans +aMW +fMq +aut +axJ +rdS +aut +huz +huz +huz +huz +huz +hrk +kAw +hrk +hrk +nZA +kAw +kAw +nZA +nZA puZ puZ puZ @@ -38845,70 +38820,70 @@ pcY jmW wMh nuy -nuy -aFO +vgR wMh ntJ -rJI -gso -qIu -ntJ ntJ wMh +ntJ wMh -asz -abx -abM -abM -abM -ack -asz -aUY -vjs -aXw -kaL -wnK -wnK -aXH -rZt -rZt -rZt -fNE -ril -rZt -iEF -far -nVL -fNE -iSG -wwW -xrC -wwW -wwW -enh -xNO -xNO -jrg -jrg -jrg -jrg -jrg -amu -fXX -fXX -osE -osE -gpz -gpz -jrg -jrg -bJj -bJj -osE -osE -puZ -puZ -puZ +uKZ +iMA +iMA +uji +uji +uji +uji +fRg +pvv +pvv +aTh +aVx +aWI +aYd +baX +bcJ +pvv +pvv +pvv +aSA +pvv +fRg +hvZ +kLM +iQq +iQq +iQq +iQq +kLM +iQq +iQq +iQq +iQq +qIr +akF +alS +ans +axJ +axJ +fbf +fbf +ook +hAS +aDu +huz +huz +huz +huz +huz +kAw +kAw +nZA +nZA +nZA +kAw +kAw +nZA puZ puZ puZ @@ -39007,70 +38982,70 @@ wMh wMh aFO nuy -nuy -aFO +hBq wMh -tRn -aNy -xtc -ggv +pcY ntJ +jmW +wMh ntJ wMh +fEl wMh -asz -asz -asz -asz -asz -asz -asz -ufb -wnK -jaU -uEx -bJi -bJi -aXH -rZt -rZt -rZt -fNE -mWA -rZt -iEF -etV -tNN -fNE -wwW -wwW -xrC -wwW -wwW -enh -enh -jrg -jrg -jrg -jrg -jrg -jrg -amu -fXX -fXX -osE -osE -bJj -bJj -jrg -jrg -jrg -bJj -bJj -bJj -puZ -puZ -puZ +hBq +lRJ +uKZ +fRg +gxK +pvv +pvv +aUw +fof +aWQ +aVN +aVN +aVN +bqN +aVN +dbH +wTz +pvv +fRg +hvZ +iQq +kLM +iQq +iQq +iQq +iQq +iQq +kLM +iQq +iQq +qIr +exX +qIr +rdS +rdS +axJ +axJ +axJ +bsS +pKf +iYC +huz +huz +oBV +pRU +hrk +hrk +kAw +nZA +nZA +nZA +kAw +kAw +nZA puZ puZ puZ @@ -39169,70 +39144,70 @@ aFO aFO aFO aFO -aFO -aFO -aFO -wMh -ofr -nJu -tze -wMh wMh -ntJ wMh pcY pcY -pcY -pcY -pcY -pcY -asz -asz -asz -ahu -qfI -bJi -bJi -nAp -rZt -asz -asz -asz -asz -qkL -asz -asz -asz -asz -wwW -wwW -iSG -enh -enh -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -amu -amu -amu -bJj -fXX -gpz -bJj -bJj -jrg -jrg -bJj -gpz -osE -puZ -puZ -puZ +jmW +jmW +wMh +wMh +fEl +upK +hBq +hBq +uKZ +fRg +fRg +pvv +aTh +aUx +aVM +aWS +rNx +bbg +rNx +aWS +bYO +aWQ +dbH +wvx +fRg +hvZ +kLM +iQq +kLM +iQq +iQq +iQq +kLM +snN +kTP +iQq +huz +huz +kLi +amI +aCy +rdS +axJ +axJ +nTu +hAS +sjh +huz +huz +tuA +kAw +hrk +hrk +kAw +kAw +kAw +nZA +kAw +kAw +nZA puZ puZ puZ @@ -39331,70 +39306,70 @@ tPs aFO aFO aFO -aFO -aFO -aFO -aFO -wMh -aFO -aFO -jmW wMh -lAN -ntJ wMh -cQY -skK -kSO -xog pcY pcY -asz -asz -asz -tpL -orO -orO -tJY -asz -asz -asz -gSJ -bJi -bJi -bJi -asz -xvd -lVJ -iSG -wwW -iSG -enh -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -bJj -fXX -bJj -bJj -gpz -bJj -bJj -bJj -gpz -bJj -puZ -puZ -puZ +pcY +pcY +pcY +pcY +pcY +lAN +nyc +tlB +uKZ +wUy +fRg +pvv +aTi +aUy +aVL +aWT +aVL +bOh +aVL +aWS +aVL +aVL +dCS +eoH +fRg +hvZ +iQq +iQq +kLM +iQq +iQq +kLM +bcM +aDM +lNg +kLM +huz +huz +dLi +amH +qsN +aMN +faH +hHf +nTu +qsN +iYC +huz +huz +dWO +hbB +kAw +hrk +kAw +kAw +kAw +kAw +kAw +oBV +nZA puZ puZ puZ @@ -39470,91 +39445,91 @@ aXb eni ntc kOV -oRH -xAS -aFO -aFO -aFO -wMh -jmW -xAS -xAS -aFO -aFO -xAS -xAS -aFO -aFO -cou -aFO -aFO -pMV -aFO -aFO -aFO -aFO -aFO -cou -aFO -aFO -aFO -aFO -aFO -aFO -aFO -wMh -wMh -wMh -cQY -ntJ -aNy -xtc -pcY -pcY -asz -crF -aXH -bJi -crF -crF -tHD -uEx -crF -fNE -hyx -xFp -xFp -sHL -asz -lVN -iSG -iSG -wwW -iSG -enh -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -bJj -gpz -bJj -gpz -gpz -gpz -bJj -bJj -bJj -bJj -puZ +oRH +xAS +aFO +aFO +aFO +wMh +jmW +xAS +xAS +aFO +aFO +xAS +xAS +aFO +aFO +cou +aFO +aFO +pMV +aFO +aFO +aFO +aFO +aFO +wMh +pcY +pcY +pcY +pcY +pcY +pcY +hBq +tlB +hBq +tlB +uKZ +xHu +fRg +pvv +aTj +cov +eHL +aWS +rPa +baY +rPa +aWS +fXp +aWU +deV +uyI +fRg +hvZ +iQq +iQq +iQq +iQq +iQq +iQq +kLM +aDM +uqb +iQq +huz +huz +huz +huz +huz +huz +huz +huz +huz +huz +huz +huz +huz +nNX +hbB +kAw +kAw +kAw +hrk +kAw +kAw +jzs puZ puZ puZ @@ -39655,68 +39630,68 @@ aFO aFO wMh aFO -nuy -aFO -aFO -aFO -xAS -aFO -aFO aFO -aFO -aFO -wMh -wMh -pei -wMh -xfZ -ntJ pcY pcY -asz -crF -aXH -tHD -crF -crF -tHD -uEx -crF -fNE -qud -tZA -ctC -ctC -asz -asC -asC -iSG -asC -asC -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -bJj -gpz -gpz -gpz -gpz -gpz -gpz -gpz -gpz -bJj -bJj +pcY +pcY +pcY +pcY +nyc +hBq +xCD +hBq +tlB +uKZ +uwS +fRg +pvv +pvv +aUw +xyY +aWU +aVx +aVx +aVx +bqN +aUA +deV +pti +pvv +fRg +hvZ +kLM +iQq +iQq +iQq +iQq +iQq +kLM +lNg +kLM +iQq +iQq +huz +huz +huz +huz +huz +huz +huz +huz +huz +huz +huz +huz +dWO +hbB +kAw +kAw +kAw +hrk +kAw +nZA +kAw puZ puZ puZ @@ -39817,68 +39792,68 @@ cou wMh wMh wMh -aFO -aFO -aFO -xAS wMh -jmW -aFO -aFO -aFO -aFO -aFO -aFO -cQY -mbt -mbt -mbt pcY pcY -asz -asz -asz -uOc -pCI -gmV -vTc -asz -asz -asz -fNE -fNE -fNE -fNE -asz -kVd -kVd -uzu -xgc -uzu -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -osE -gpz -gpz -gpz -gpz -bJj -bJj -bJj -gpz -bJj -bJj +pcY +pcY +pcY +hBq +nyc +hBq +cps +tlB +tlB +uKZ +oIR +fRg +pvv +pvv +aTj +aVN +aWV +aYx +bbh +beK +aSA +gIQ +oXM +pvv +pvv +fRg +hvZ +kLM +kLM +iQq +iQq +iQq +iQq +iQq +kLM +kLM +iQq +iQq +iQq +lXQ +cwZ +kAw +kAw +nZA +kAw +kAw +hrk +hrk +hrk +acl +kAw +kAw +hrk +kAw +kAw +kAw +kAw +kAw +puZ puZ puZ puZ @@ -39980,67 +39955,67 @@ wMh jmW jmW wMh -aFO -aFO -aFO -wMh -tJP -lAN -aFO -aFO -aFO -aFO -wMh -wMh -wMh -wMh -wMh -wMh pcY pcY -siZ -ukp -kVd -kVd -boW -boW -boW -siZ -dkv -xgc -kVd -kVd -rAH -rAH -kVd -uzu -boW -xgc -uzu -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -bJj -gpz -bJj -bJj -jrg -bJj -bJj -bJj -bJj -bJj -bJj +pcY +pcY +pcY +hBq +hBq +tlB +aFO +hBq +hBq +uKZ +rIj +wCn +pvv +pvv +pvv +pvv +pvv +mOY +drM +pvv +aSA +uaa +pvv +pvv +pvv +fRg +hvZ +kLM +iOu +kLM +iOu +kLM +kLM +iQq +kLM +iQq +iQq +kLM +iQq +jWh +cwZ +kAw +kAw +kAw +kAw +nZA +hrk +hrk +nZA +hRY +hrk +nZA +nZA +nZA +kAw +kAw +kAw +nDv +puZ puZ puZ puZ @@ -40112,98 +40087,98 @@ kOV kOV kOV kOV -kOV -kOV -aqd -eBc -aqI -aqI -aqI -aqI -asj -ntc -jmW -xAS -aFO -aFO -aFO -pMV -aFO -xAS -wMh -xAS -wMh -pcY -pcY -wMh -aFO -wMh -jmW -jmW -jmW -wMh -aFO -aFO -aFO -xAS -tJP -wMh -aFO -aFO -wMh -wMh -wMh -wMh -ntJ -ntJ -wMh -wMh -ukp -kVd -ckH -lIa -lIa -qjY -qjY -qjY -qjY -tsK -qjY -tsK -lIa -oHf -oHf -oHf -lIa -qjY -tsK -tsK -ckH -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -bJj -bJj -gpz -bJj -jrg -jrg -bJj -bJj -bJj -bJj -bJj -bJj -bJj +kOV +kOV +aqd +eBc +aqI +aqI +aqI +aqI +asj +ntc +jmW +xAS +aFO +aFO +aFO +pMV +aFO +xAS +wMh +xAS +wMh +pcY +pcY +wMh +aFO +wMh +jmW +jmW +jmW +wMh +pcY +pcY +pcY +pcY +tJP +nyc +tlB +xAS +xCD +xAS +hBq +uKZ +rIj +ohq +pvv +pvv +pvv +tXL +pvv +pvv +pvv +pvv +pvv +pvv +pvv +hZI +pvv +fWq +uji +iOA +aDM +lNg +kLM +uqb +uqb +iQq +iQq +kLM +kLM +kLM +kLM +fpF +wSv +kAw +kAw +kAw +kAw +kAw +nZA +nZA +nZA +aco +hrk +nZA +nZA +nZA +kAw +nZA +nZA +puZ +puZ +puZ puZ puZ puZ @@ -40304,68 +40279,68 @@ wMh jmW wMh wMh -aFO +wMh +pcY +pcY +tlB +hBq +tlB +xAS aFO xAS xAS -tJP -faW -faW -faW -jmW -wMh -wMh -wMh -ntJ -ntJ -wMh -wMh -kVd -kVd -kVd -kVd -kVd -boW -boW -boW -boW -xgc -boW -xgc -xgc -kVd -rAH -rAH -kVd -xgc -kVd -ukp -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -bJj -bJj -bJj -osE -bJj -bJj -jrg -jrg -bJj -bJj -osE -bJj -bJj -bJj -bJj +oRH +uKZ +uKZ +uKZ +fRg +fRg +fRg +fRg +fRg +fRg +oZR +fRg +iXc +fRg +bxL +bxL +gGc +rzR +uji +qrY +qrY +qrY +hHR +hHR +xCz +uxZ +uxZ +uxZ +lWC +hHR +hHR +sax +sax +sax +hrk +kAw +kAw +kAw +kAw +kAw +kAw +teK +hrk +hrk +hrk +kAw +nZA +nZA +puZ +puZ +puZ +puZ puZ puZ puZ @@ -40467,67 +40442,67 @@ wMh ntJ wMh aFO +hBq +xAS +xAS +xAS +xAS +xAS aFO -cpC -lfe -pcY -pcY -pcY -pcY -mTN +oRH nzr -uZF -wMh -wMh -ntJ -ntJ -wMh -kVd -kVd -xgc -xgc -boW -boW -boW -xgc -boW -xgc -xgc -rAH -xgc -xgc -rAH -rAH -kVd -xgc -uzu -mhs -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -bJj -bJj -jrg -bJj -bJj -bJj -iel -jrg -jrg -bJj -bJj -osE -bJj -bJj -jrg -bJj +xAS +oRH +hBq +uKZ +uKZ +uji +gpF +oYH +fUP +uji +uKZ +iMA +iMA +iMA +uKZ +uKZ +uKZ +uKZ +uji +ofw +ofw +jMf +tHd +kop +kop +kyD +kyD +kyD +tHd +kop +gzb +sax +sax +sax +bcV +oFl +kAw +kAw +kAw +hrk +bcV +tFd +hrk +hrk +kAw +nZA +nZA +nZA +puZ +puZ +puZ +puZ puZ puZ puZ @@ -40627,69 +40602,69 @@ ntc xAS wMh wMh -wMh -jmW -wMh -wMh -kSO -xog -pcY -pcY -pcY -kSO -xog +aFO +aFO +aFO +aFO +xAS +aFO +aFO +aFO +xAS +xAS +aFO wTx -wMh -wMh -ntJ -wMh -vnr -kVd -kVd -dyt -dyt -fHx -xgc -boW -boW -xgc -boW -boW -boW -xgc -xgc -kVd -rAH -rAH -uzu -kVd -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -bJj -bJj -bJj -bJj -bJj -osE -osE -bJj -bJj -bJj -mie -jrg -bJj -bJj -gpz -bJj -bJj -bJj -bJj +xAS +fOa +aFO +aFO +uji +uKZ +jLX +uKZ +uji +tHd +rtZ +tHd +tHd +rtZ +kop +kop +xvp +tHd +jMf +xvp +kop +kop +kop +tHd +kyD +kyD +kyD +tHd +kop +bhN +fCs +sax +sax +rBk +vAU +kAw +kAw +kAw +tad +tlr +tuz +tFy +hrk +kAw +nZA +nZA +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -40761,96 +40736,96 @@ aqI asj kOV kOV -kOV -kOV -eni -kOV -eni -eni -mMK -ntc -ntc -vYm -ntc -vYm -vYm -xAS -xAS -aFO -aFO -wMh -pcY -pcY -kOV -toD -toD -toD -toD -jmW -wMh -wMh -jmW -xAS -xAS -pcY -aNy -xtc -pcY -pcY -pcY -aNy -xtc -qKA -ntJ -wMh -wMh -ntJ -ntJ -kVd -kVd -boW -boW -xgc -boW -boW -boW -boW -boW -boW -boW -boW -kVd -xgc -rAH -rAH -uzu -kVd -jrg -jrg -jrg -jrg -jrg -jrg -jrg -jrg -bJj -jrg -bJj -bJj -bJj -osE -osE -bJj -gpz -bJj -bJj -jrg -gpz -gpz -bJj -bJj -bJj -bJj +kOV +kOV +eni +kOV +eni +eni +mMK +ntc +ntc +vYm +ntc +vYm +vYm +xAS +xAS +aFO +aFO +wMh +pcY +pcY +kOV +toD +toD +toD +toD +jmW +wMh +wMh +aFO +aFO +aFO +aFO +aFO +xAS +xAS +xAS +aFO +aFO +aFO +aFO +oRH +xAS +aFO +aFO +wwZ +qnJ +jOi +qnJ +mkC +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +tHd +iMC +kyD +kyD +tHd +tHd +kyD +tHd +kyD +kyD +tHd +kop +bhN +fCs +sax +sax +sax +sax +kAw +kAw +kAw +acl +rBk +vAU +hrk +kAw +nZA +nZA +nZA +puZ +puZ +puZ +puZ puZ puZ puZ @@ -40951,68 +40926,68 @@ kOV wMh wMh wMh -ntJ -pcY -pcY -pcY -pcY -pcY -pcY -pcY -pcY -pcY -gXW -muI -wMh wMh -eKp -mda +oRH wMh -wRL -kVd +xAS +xAS +xAS +aFO +aFO +xAS +xAS +xAS +xAS +xAS +aFO +aFO +aFO +wLM ajy -boW -akf -boW -boW -boW -boW -boW -boW -boW -boW -boW -xgc -xgc -kVd -kVd -uzu -ukp -jrg -jrg -jrg -jrg -jrg -jrg -xgc -ukp -ukp -kVd -kVd -bJj -bJj -bJj -bJj -gpz -dhx -bJj -osE -gpz -gpz -bJj -bJj -bJj -bJj +jOi +ajy +ppS +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +tHd +kop +lip +sax +sax +sax +sax +kAw +kAw +nZA +kAw +aco +kAw +hrk +kAw +nZA +nZA +nZA +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -41114,66 +41089,66 @@ pcY pcY wMh wMh -ntJ -wMh -wMh -pcY -bQX -wMh -cBX -wMh -wMh -hlh wMh +oRH +oRH +xAS wMh -pcY -pcY -pcY -acc -kVd -kVd -boW -boW -boW -boW -boW -boW -boW -boW -boW -fHx -boW -boW -kVd -xgc -rAH -kVd -kVd -uzu -ukp -jrg -jrg -jrg -jrg -jrg -ukp -kVd -xgc -xgc -rAH -kVd -bJj -bJj -bJj -bJj -bJj -bJj -gpz -gpz -bJj -bJj -jrg -bJj +aFO +xAS +oRH +xAS +xAS +aFO +aFO +aFO +aFO +aFO +wLM +ajy +jOi +ajy +ppS +kyD +kyD +kyD +kyD +kyD +kyD +tHd +tHd +kyD +tHd +tHd +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +tHd +ofw +sax +hrk +llZ +kAw +nZA +nZA +nZA +kAw +aco +kAw +kAw +kAw +nZA +kAw +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -41275,67 +41250,67 @@ aby pcY pcY wMh -wMh -wMh -wMh -wMh -wMh -wMh -wMh -hlh -hPp -hPp -hPp -hPp -hPp -hPp -hPp -pcY -pcY -kVd -kVd -dyt -dyt -fHx -boW -boW -boW -boW -boW -boW -dyt -boW -boW -boW -rAH -xgc -kVd -kVd -uzu -ukp -jrg -jrg -ukp -ukp -jrg -uzu -xgc -xgc -xgc -xgc -uzu -rAH -osE -bJj -bJj -bJj -bJj -gpz -gpz -bJj -bJj -bJj -bJj +hBq +vCe +oRH +oRH +xAS +xAS +aFO +aFO +xAS +xAS +oRH +xAS +xAS +aFO +aFO +aFO +wLM +ajy +jOi +ajy +ppS +tHd +tHd +tHd +kop +aQJ +kop +eyx +kop +tHd +kop +kop +tHd +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +grk +hrk +kAw +qgP +kAw +nZA +qgP +kAw +aco +kAw +nZA +kAw +kAw +nZA +puZ +puZ +puZ +puZ +puZ puZ puZ puZ @@ -41400,102 +41375,102 @@ oHE aLv pvU pvU -sfY -rfU -kOV -aCo -jrR -jrR -asu -mMK -eni -lop -eni -eni -eni -ntc -ntc -tJe -asB -ntc -ntc -vYm -ntc -eni -kOV -kOV -kOV -kOV -hUv -arP -arP -ijA -aqE -aqE -asI -abz -pcY -wMh -wMh -jmW -wMh -ntJ -wMh -ntJ -hlh -wMh -jmW -hPp -aMy -mnZ -pwT -mnZ -qKn -hPp -pcY -pcY -ukp -kVd -boW -boW -boW -boW -boW -xgc -boW -boW -boW -dyt -boW -boW -boW -kVd -xgc -rAH -uzu -uzu -uzu -ukp -ukp -uzu -uzu -fkB -xgc -uzu -rAH -rAH -uzu -rAH -kVd -osE -bJj -bJj -bJj -gpz -bJj -bJj -bJj -bJj +sfY +rfU +kOV +aCo +jrR +jrR +asu +mMK +eni +lop +eni +eni +eni +ntc +ntc +tJe +asB +ntc +ntc +vYm +ntc +eni +kOV +kOV +kOV +kOV +hUv +arP +arP +ijA +aqE +aqE +asI +abz +pcY +wMh +wMh +ulI +hBq +mzf +oRH +wMh +xAS +aFO +xAS +xAS +oRH +tlB +oRH +oRH +xAS +aFO +aFO +lCg +ajy +jOi +ajy +lGT +jMf +tHd +kop +jMf +sJo +ofw +etl +fLi +gGT +kop +tHd +xvp +kyD +kyD +kyD +tHd +kyD +kyD +kyD +tHd +oDi +nRD +kAw +vPr +kAw +nZA +nZA +sax +kAw +acp +kAw +nZA +nZA +kAw +nZA +puZ +puZ +puZ puZ puZ puZ @@ -41601,62 +41576,62 @@ ntJ wMh wMh wMh -ntJ -ntJ -ntJ wMh -sFj -hPp -hPp -quO +vzM +wMh +xAS +aFO +aFO +jNr +xAS pwT -hVr +tlB sud ggC -hPp -pcY -ukp -rAH -kVd -boW -boW -boW -boW -boW -boW -xgc -boW -boW -boW -boW -boW -boW -xgc -xgc -kVd -kVd -kVd -uzu -ukp -pLf -rAH -rAH -oHf -rAH -kVd -rAH -kVd -rAH -rAH -bJj -bJj -bJj -gpz -gpz -osE -bJj -bJj -bJj +xAS +aFO +uir +bni +bni +bni +uir +ofw +jMf +tHd +kop +jMf +gGT +kop +rli +kop +kop +tHd +kyD +kyD +kyD +tHd +kyD +tHd +kyD +kyD +kyD +tHd +kjX +kAw +vPr +qgP +vPr +sax +sax +sax +sax +kAw +nZA +nZA +kAw +puZ +puZ +puZ puZ puZ puZ @@ -41767,56 +41742,56 @@ jmW wMh ntJ ntJ -swn -hPp -aKo -qBN -jOi -jOi -jOi -fGb -hPp -xgc -rAH -xgc -kVd -boW -boW -boW -boW -xgc -boW -boW -boW -boW -boW -boW -boW -xgc -xgc -xgc -kVd -kVd -plS -uzu -uzu -rAH -rAH -rAH -fkB -xgc -rAH -kVd -kVd -bJj -bJj -bJj -osE -osE -gpz -osE -bJj -bJj +oRH +oRH +oRH +oRH +oRH +oRH +tlB +tlB +tlB +tHd +kwa +kwa +kyD +kyD +kyD +kyD +kyD +tHd +kyD +kyD +kyD +kyD +kyD +kop +kop +kop +tHd +tHd +jMf +jMf +qLS +ofw +ofw +kop +kyD +kop +hbp +kAw +llZ +nZA +nZA +acl +kAw +kAw +hrk +hrk +nZA +hrk +kAw +kAw puZ puZ puZ @@ -41930,55 +41905,55 @@ wMh jmW ntJ wMh -bni -jOi -txO -jOi -jOi -jOi -jOi -bni -xgc -xgc -boW -xgc -ajy -boW +oRH +oRH +oRH +oRH +oRH +tlB +hBq +tlB +tHd +qrY +kyD +kwa +kyD +kyD akf -boW -boW -xgc -boW -boW -boW -boW -boW -boW -xgc -kVd -kVd -kVd -plS +fDH +kyD +tHd +kyD +kyD +kyD +kop +kop +kop +kop +jMf +jMf +jMf +qLS bRU -uzu -rAH -ukp -uzu -rAH -fkB -uzu -uzu -uzu -ukp -bJj -bJj -bJj -osE -gpz -gpz -gpz -bJj -bJj +ofw +kop +mwE +ofw +kyD +hbp +kAw +kAw +jaT +hrk +aco +kAw +qgP +hrk +nZA +nZA +nZA +kAw +kAw puZ puZ puZ @@ -42092,54 +42067,54 @@ pcY wMh wMh wMh -bni -jOi -jOi -jOi -jOi -jOi -jOi -bni -rAH -rAH -boW -boW -boW -boW -boW -boW -boW -boW -boW -boW -boW -boW -boW -boW -kVd -uzu -kVd -kVd -kVd -uzu -plS -rAH -rAH -rAH -rAH -rAH -ckH -ukp -ukp -jrg -bJj -bJj -jrg -osE -gpz -gpz -osE -bJj +oRH +kAm +hBq +kAm +hBq +hBq +xAS +oRH +kop +qrY +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +jMf +ofw +jMf +jMf +jMf +ofw +qLS +kop +kyD +kop +kyD +mxr +kAw +vPr +vPr +nZA +acp +kAw +sax +hrk +nZA +nZA +hrk +kAw puZ puZ puZ @@ -42251,57 +42226,57 @@ wMh ntJ pcY pcY -kVd -kVd -kVd -hPp -hPp -hPp -hPp -hPp -hPp -hPp -hPp -rAH -xgc -xgc -boW +jMf +jMf +jMf +kAm +oRH +hBq +oRH +hBq +xAS +tlB +oRH +kop +qrY +kyD +kyD dyt dyt -boW -boW -boW -boW -boW -boW -boW -boW -xgc -boW -xgc -xgc -kVd -kVd -kVd -uzu -kVd -uzu +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +tHd +kyD +tHd +tHd +jMf +jMf +jMf +ofw +jMf +ofw bhB -rAH -rAH -ukp -jrg -jrg -jrg -jrg -jrg -bJj -bJj -osE -bJj -bJj -bJj -bJj +kop +kop +gss +sax +sax +sax +sax +sax +kAw +kAw +hrk +kAw +kAw +kAw +kAw puZ puZ puZ @@ -42413,57 +42388,57 @@ jmW pcY pcY pcY -rAH -rAH -rAH -siZ -pFq -fVl -qOP -aMZ -uzu -xgc -siZ -rAH -xgc -xgc -boW -boW +kop +kop +kop +kop +kop +kop +kop +kop +jMf +kop +ofw +kop +kyD +kyD +kyD +kyD fHx -boW -xgc -boW -boW -boW -boW -boW -boW -boW -boW -xgc -xgc -kVd -kVd -xgc -kVd -rAH -kVd -uzu -uzu -ddA -kVd -ukp -jrg -jrg -jrg -jrg -jrg -bJj -osE -bJj -bJj -bJj -bJj +kyD +tHd +kyD +kyD +kyD +kyD +kyD +kyD +kyD +kyD +tHd +tHd +jMf +jMf +tHd +jMf +kop +jMf +ofw +ofw +rgy +jMf +gss +sax +sax +sax +sax +sax +kAw +hrk +kAw +kAw +kAw +kAw puZ puZ puZ @@ -42575,56 +42550,56 @@ wMh pcY pcY pcY -rAH -rAH -rAH -kVd -kVd -kVd -kVd -kVd -kVd -kVd -kVd +kop +kop +kop +kop +kop +jMf +kop +ofw +jMf +jMf +jMf agy -boW -boW -boW -boW -boW -boW -boW -xgc -boW -boW -boW -boW -xgc -boW -boW -rAH -rAH -aaf -rAH -rAH -ddA -xgc -rAH -uzu -msh -uzu -uzu -rAH -ukp -jrg -jrg -jrg -jrg -jrg -osE -gpz -gpz -bJj +kyD +kyD +kyD +kyD +qrY +kyD +kyD +tHd +kyD +kyD +kyD +kyD +tHd +kyD +kop +kop +kop +bnD +kop +kop +rgy +tHd +kop +ofw +oxP +ofw +ofw +kop +mwE +sax +sax +sax +sax +sax +hrk +nZA +nZA +kAw puZ puZ puZ @@ -42737,56 +42712,56 @@ wMh pcY pcY pcY -rAH -rAH -rAH -kVd -uzu -kVd -uzu -kVd -uzu -kVd -rAH -xgc -ajy -boW -xgc -boW -boW -boW -boW -boW -boW -boW -boW -xgc -boW -boW -boW -kVd -kVd -rAH -rAH -kVd -rAH -rAH -xgc -kVd -kVd -kVd -rAH -rAH +kop +kop +kop +jMf +ofw +jMf +ofw +jMf +ofw +jMf +kop +tHd +kyD +kyD +kyD +kyD +qrY +kyD +kyD +kyD +kyD +kyD +kyD +tHd +kyD +kyD +kyD +jMf +jMf +kop +kop +jMf +kop +kop +tHd +jMf +jMf +jMf +kop +kop mhs -jrg -jrg -jrg -jrg -jrg -bJj -bJj -bJj -bJj +sax +sax +sax +sax +sax +kAw +kAw +qgP +kAw puZ puZ puZ @@ -42895,59 +42870,59 @@ kOV ntc kOV kOV -ukp -kVd -kVd -dHr -rAH -msh -uzu -uzu -xgc -rAH -kVd -kVd -rAH -xgc -rAH -xgc -xgc -boW -xgc -boW -xgc -boW -boW -xgc -xgc -xgc -xgc -boW -boW -boW -boW -kVd -kVd -kVd -kVd -ddA -rAH -kVd -kVd -rAH -xgc -xgc -kVd -uzu +mwE +jMf +jMf +mdV +kop +oxP +ofw +ofw +tHd +kop +jMf +jMf +kop +tHd +kop +fDH +tHd +kyD +tHd +kyD +qrY +kyD +kyD +tHd +tHd +tHd +tHd +kyD +kyD +kop +kop +jMf +jMf +jMf +jMf +rgy +kop +jMf +jMf +kop +tHd +tHd +jMf +ofw loe -jrg -jrg -jrg -jrg -jrg -bJj -gpz -bJj +sax +sax +sax +sax +sax +qgP +nZA +kAw puZ puZ puZ @@ -43057,59 +43032,59 @@ kOV kOV ntc kOV -kVd -kVd +jMf +jMf bhB -kVd -rAH -rAH -uzu -xgc -kVd -rAH -xgc -xgc -kVd -rAH -xgc -rAH -xgc -xgc -boW -boW -boW -xgc -uzu +jMf +kop +kop +ofw +tHd +jMf +kop +tHd +tHd +jMf +kop +tHd +kop +tHd +tHd +kyD +kyD +kyD +tHd +ofw gss gss gss gss -xgc -xgc -xgc -kVd -kVd -kVd -kVd -huF -uzu -rAH -uzu -aJR -kVd -rAH -rAH -rAH -rAH -kVd -rAH -jrg -jrg -jrg -jrg -bJj -gpz -bJj +tHd +tHd +tHd +jMf +jMf +jMf +jMf +gBp +ofw +kop +ofw +rEd +jMf +kop +kop +kop +kop +jMf +kop +sax +sax +sax +sax +hrk +nZA +kAw puZ puZ puZ @@ -43219,29 +43194,29 @@ kOV kOV ntc ntc -uzu +ofw vhM -uzu -kVd -kVd -rAH -rAH -kVd -rAH -uzu +ofw +jMf +jMf +kop +kop +jMf +kop +ofw dYp dYp dYp -kVd -kVd -rAH +jMf +jMf +kop fxy -boW -boW -boW +kyD +kyD +kyD fxy -xgc -rAH +tHd +kop gss gss gss @@ -43253,25 +43228,25 @@ tiO tiO gss abZ -kVd -kVd -rAH -rAH -rAH -boS -kVd -rAH -xgc -rAH -rAH -rAH -ukp -jrg -jrg -jrg -cIV -cIV -cIV +jMf +jMf +kop +kop +kop +gpS +jMf +kop +tHd +kop +kop +kop +mwE +sax +sax +sax +nZA +llZ +nZA puZ puZ puZ @@ -43381,16 +43356,16 @@ kOV kOV ntc ntc -kVd -uzu -kVd -kVd -rAH -kVd -xgc -rAH -rAH -uzu +jMf +ofw +jMf +jMf +kop +jMf +tHd +kop +kop +ofw dYp dYp dYp @@ -43431,9 +43406,9 @@ tHd mwE geE geE -mwE -mwE -mwE +kop +kop +plM tYw tYw tYw @@ -43543,15 +43518,15 @@ aEq ntc ntc vYm -xgc -kVd -kVd -xgc -xgc -rAH -xgc -kVd -uzu +tHd +jMf +jMf +tHd +tHd +kop +tHd +jMf +ofw dYp dYp dYp @@ -43705,15 +43680,15 @@ nOd nOd nOd nOd -xgc -xgc -kVd -xgc -kVd -xgc -kVd -uzu -uzu +tHd +tHd +jMf +tHd +jMf +tHd +jMf +ofw +ofw dYp dYp dYp @@ -43867,15 +43842,15 @@ dZb eOG aeN nOd -rAH -rAH -rAH -rAH -xgc -rAH -kVd +kop +kop +kop +kop +tHd +kop +jMf bRU -kVd +jMf dYp dYp dYp @@ -44029,15 +44004,15 @@ uhL uhL eHk nOd -kVd +jMf bhB -xgc -kVd -xgc -rAH -uzu -kVd -uzu +tHd +jMf +tHd +kop +ofw +jMf +ofw dYp dYp dYp @@ -44191,14 +44166,14 @@ uhL uhL eHk nOd -dHr -kVd -kVd -hxY -kVd -rAH -kVd -ddA +mdV +jMf +jMf +sJo +jMf +kop +jMf +rgy dYp dYp pqe @@ -44355,12 +44330,12 @@ nOd nOd nOd nOd -kVd -xgc -xgc -rAH -kVd -kVd +jMf +tHd +tHd +kop +jMf +jMf dYp dYp pqe @@ -44517,12 +44492,12 @@ uhL gIq jny nOd -rAH -xgc -xgc -kVd -uzu -dHr +kop +tHd +tHd +jMf +ofw +mdV dYp dYp pqe @@ -44679,12 +44654,12 @@ bVb goh okz nOd -kVd -xgc -xgc -kVd -huF -xgc +jMf +tHd +tHd +jMf +gBp +tHd dYp dYp pqe @@ -44841,12 +44816,12 @@ uFr tds uhL nOd -rAH +kop wta owr -uzu -plS -xgc +ofw +qLS +tHd dYp dYp pqe @@ -45003,11 +44978,11 @@ glG tds uhL nOd -rAH -aGF -boW -boW -boW +kop +aQJ +kyD +kyD +kyD dYp dYp dYp @@ -45165,11 +45140,11 @@ tWn hyu uhL nOd -rAH -kuS -boW -boW -boW +kop +oiH +kyD +kyD +kyD owr dYp dYp @@ -45327,12 +45302,12 @@ hyu uKN uhL nOd -rAH -xgc +kop +tHd owr -boW +kyD owr -boW +kyD dYp dYp pqe @@ -47649,7 +47624,7 @@ puZ hcJ cUl cUl -xbT +cUl hcJ puZ puZ @@ -50228,17 +50203,17 @@ kyD tHd veu oZq -hrk -kAw -kAw +ijm +cIV +cIV sax sax sax sax -sPM -sPM -sPM -sPM +wiy +wiy +wiy +wiy ako puZ puZ @@ -50389,15 +50364,15 @@ tHd kyD tHd qEQ -sax -kAw -nZA -kAw -sax -bcV -oFl -sax -sax +jrg +bJj +gpz +bJj +jrg +qCW +ijE +jrg +jrg aaZ aaZ aaZ @@ -50523,47 +50498,47 @@ iXm daD dKL aPk -hcH -tnu +rRZ +oQo aSQ -tnu -hcH -aWF -jMf -ofw -jMf -tHd -kop -jMf -gGT -kop -rli -kop -kop -tHd -kyD -kyD -kyD -tHd -kyD -tHd -kyD -kyD -kyD -qEQ -sax -hrk -hrk -kAw -kAw -rBk -vAU -sax -sax -kAw -nZA -nZA -kAw +oQo +rRZ +rWW +kVd +uzu +kVd +xgc +rAH +kVd +iIR +rAH +ork +rAH +rAH +xgc +boW +boW +boW +xgc +boW +xgc +boW +boW +boW +dro +jrg +osE +osE +bJj +bJj +qdh +fmo +jrg +jrg +bJj +gpz +gpz +bJj puZ puZ puZ @@ -50680,53 +50655,53 @@ bIV bFg bIV bIV -cZk +bFg daD cZk cZk bIV -aKr -gKf -lxn -gKf -aFA -kyD -tHd -jMf -tHd -kop -jMf -sJo -ofw -etl -fLi -gGT -kop -tHd -xvp -kyD -kyD -kyD -tHd -kyD -kyD -kyD -tHd -oDi +boW +boW +boW +boW +boW +boW +xgc +kVd +xgc +rAH +kVd +hxY +uzu +hUA +mGk +iIR +rAH +xgc +wPs +boW +boW +boW +xgc +boW +boW +boW +xgc +nxt prO -kAw -hrk -nZA -nZA -nZA -kAw -kAw -acl -kAw -nZA -nZA -kAw -nZA +bJj +osE +gpz +gpz +gpz +bJj +bJj +iIg +bJj +gpz +gpz +bJj +gpz puZ puZ puZ @@ -50845,50 +50820,50 @@ bIV bIV cZk bIV -bIV bFg -aKA -qXS -lxn -qXS -aFC -kyD -kyD -tHd -tHd -tHd -kop -aQJ -kop -eyx -kop -tHd -kop -kop -tHd -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD +cZk +rAH +boW +boW +boW +boW +boW +boW +xgc +xgc +xgc +rAH +aGF +rAH +klF +rAH +xgc +rAH +rAH +xgc +boW +boW +boW +boW +boW +boW +boW +boW +qjY ptm -hrk -kAw -nZA -nZA -nZA -kAw -kAw -aco -kAw -nZA -kAw -kAw -nZA +osE +bJj +gpz +gpz +gpz +bJj +bJj +niA +bJj +gpz +bJj +bJj +gpz puZ puZ puZ @@ -51008,49 +50983,49 @@ bIV bIV bFg bFg -bFg -aKA -qXS -lxn -qXS -aFC -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -tHd -tHd -kyD -tHd -tHd -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -tHd -ofw -sax -hrk -kAw -nZA -nZA -nZA -nZA -kAw -aco -kAw -kAw -kAw -nZA -kAw +cZk +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +xgc +xgc +boW +xgc +xgc +boW +boW +boW +boW +boW +boW +boW +boW +xgc +fkB +jrg +osE +bJj +gpz +gpz +gpz +gpz +bJj +niA +bJj +bJj +bJj +gpz +bJj puZ puZ puZ @@ -51170,50 +51145,50 @@ bIV bIV bIV bIV -bFg -aKA -qXS -lxn -qXS -aFC -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -tHd -kop -gzb -sax -sax -sax -sax -kAw -kAw -nZA -kAw -aco -kAw -hrk -kAw -nZA -nZA -nZA +cZk +xgc +xgc +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +xgc +rAH +ucN +jrg +jrg +jrg +jrg +bJj +bJj +gpz +bJj +niA +bJj +osE +bJj +gpz +gpz +gpz puZ puZ puZ @@ -51333,50 +51308,50 @@ bFg bFg cZk bIV -aKD -iGn -lxn -iGn -aFI -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -kyD -tHd -iMC -kyD -kyD -tHd -tHd -kyD -tHd -kyD -kyD -tHd -kop -bhN -fCs -sax -sax -sax -sax -kAw -kAw -kAw -acp -bcV -tFd -hrk -kAw -nZA -nZA -nZA +rAH +xgc +rAH +rAH +xgc +boW +boW +boW +boW +boW +boW +boW +boW +boW +boW +xgc +kyt +boW +boW +xgc +xgc +boW +xgc +boW +boW +xgc +rAH +fbS +qfR +jrg +jrg +jrg +jrg +bJj +bJj +bJj +srJ +qCW +nyS +osE +bJj +gpz +gpz +gpz puZ puZ puZ @@ -51495,50 +51470,50 @@ bFg aNe bIV aPm -uji -uKZ -jLX -uKZ -uji -aWG -xWy -tHd -rtZ -tHd -tHd -rtZ -kop -kop -xvp -tHd -jMf -xvp -kop -kop -kop -tHd -kyD -kyD -kyD -tHd -kop -bhN -fCs -sax -sax -bcV -oFl -kAw -kAw -kAw -tad -tlr -tuz -tFy -hrk -kAw -nZA -nZA +xgc +rAH +xgc +rAH +rAH +rAH +uzu +xgc +gJF +boW +boW +awP +rAH +xgc +wPs +xgc +kVd +wPs +rAH +rAH +rAH +xgc +boW +boW +boW +xgc +rAH +fbS +qfR +jrg +jrg +qCW +ijE +bJj +bJj +bJj +nvu +mCG +pRM +gQK +osE +bJj +gpz +gpz puZ puZ puZ @@ -51657,51 +51632,51 @@ aME bIV cZk xvA -iMA -rxf -oYH -uMJ -uji -uKZ -uKZ -uKZ -iMA -iMA -iMA -uKZ -uKZ -uKZ -uKZ -uji -ofw -ofw -jMf -tHd -kop -kop -kyD -kyD -kyD -tHd -kop -lip -sax -sax -sax -rBk -vAU -kAw -kAw -kAw -hrk -rBk -vAU -hrk -hrk -kAw -nZA -nZA -nZA +boW +xgc +wfH +rAH +xgc +rAH +wfH +rAH +boW +boW +boW +xgc +xgc +rAH +rAH +rAH +uzu +uzu +kVd +xgc +rAH +rAH +boW +boW +boW +xgc +rAH +sEC +jrg +jrg +jrg +qdh +fmo +bJj +bJj +bJj +osE +qdh +fmo +osE +osE +bJj +gpz +gpz +gpz puZ puZ puZ @@ -51817,53 +51792,53 @@ bFg bIV bIV cZk -uKZ -uKZ -uKZ -fRg -fRg -fRg -fRg -fRg -fRg -oZR -fRg -iXc -fRg -bxL -bxL -gGc -rzR -uji -hzJ -hzJ -hzJ -kyw -kyw -lUL -mLR -mLR -mLR -ocI -kyw -kyw -sax -sax -sax -hrk -kAw -kAw -kAw -kAw -kAw -kAw -hrk -hrk -hrk -hrk -kAw -nZA -nZA +rAH +rAH +rAH +rAH +rAH +boW +rAH +rAH +rAH +xgc +boW +boW +boW +rAH +rAH +rAH +rAH +rAH +rAH +rAH +rAH +rAH +rAH +rAH +boW +boW +xgc +rAH +rAH +oHf +jrg +jrg +jrg +osE +bJj +bJj +bJj +bJj +bJj +bJj +osE +osE +osE +osE +bJj +gpz +gpz puZ puZ puZ @@ -51979,54 +51954,54 @@ bIV aLZ bIV xvA -uKZ -rIj -ohq -pvv -pvv -pvv -tXL -pvv -pvv -pvv -pvv -pvv -pvv -pvv -hZI -pvv -fWq -uji -iOA -aDM -lNg -kLM -uqb -uqb -iQq -iQq -kLM -kLM -kLM -kLM +ukp +ukp +rAH +ukp +rAH +rAH +boW +ukp +kVd +kVd +boW +boW +boW +siZ +dkv +xgc +kVd +kVd +rAH +rAH +kVd +uzu +boW +xgc +uzu +boW +xgc +xgc +xgc +tsK pCe -wSv -kAw -kAw -kAw -kAw -kAw -nZA -nZA -nZA -kAw -hrk -nZA -nZA -nZA -kAw -nZA -nZA +rrj +bJj +bJj +bJj +bJj +bJj +gpz +gpz +gpz +bJj +osE +gpz +gpz +gpz +bJj +gpz +gpz puZ puZ puZ @@ -52141,55 +52116,55 @@ daD bFg xvA xvA -uKZ -rIj -wCn -pvv -pvv -pvv -pvv -pvv -mOY -drM -pvv -aSA -uaa -pvv -pvv -pvv -fRg -hvZ -kLM -iOu -kLM -iOu -kLM -kLM -iQq -kLM -iQq -iQq -kLM -iQq +rAH +rAH +ukp +rAH +rAH +rAH +ckH +lIa +lIa +qjY +qjY +qjY +qjY +tsK +qjY +tsK +lIa +oHf +oHf +oHf +lIa +qjY +tsK +tsK +ckH +tsK +qjY +qjY +tsK +qjY fnw -cwZ -kAw -kAw -kAw -kAw -nZA -hrk -hrk -nZA -nZA -hrk -nZA -nZA -nZA -kAw -kAw -kAw -nDv +wvS +bJj +bJj +bJj +bJj +gpz +osE +osE +gpz +gpz +osE +gpz +gpz +gpz +bJj +bJj +bJj +xuz puZ puZ puZ @@ -52302,57 +52277,57 @@ peb xvA aMj daD -daD -uKZ -oIR -fRg -pvv -pvv -aTh -aVx -aWI -aYd -baX -bcJ -aSA -gIQ -oXM -pvv -pvv -fRg -hvZ -kLM -kLM -iQq -iQq -iQq -iQq -iQq -kLM -kLM -iQq -iQq -iQq -nOw -cwZ -kAw -kAw -nZA -kAw -kAw -hrk -hrk -hrk -kAw -kAw -kAw -hrk -kAw -kAw -kAw -kAw -kAw -puZ +boW +qiy +pWp +pWp +pWp +pLf +pLf +asz +asz +asz +ndb +pCI +gmV +vTc +asz +asz +asz +fNE +fNE +fNE +fNE +asz +kVd +kVd +uzu +xgc +uzu +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +bJj +bJj +osE +gpz +gpz +gpz +gpz +bJj +bJj +bJj +gpz +bJj +bJj puZ puZ puZ @@ -52464,57 +52439,57 @@ peb xvA aLZ xvA -daD -uKZ -uwS -fRg -pvv -pvv -aUw -xyY -aWQ -aVx -aVx -aVx -bqN -aUA -dbH -pti -pvv -fRg -hvZ -kLM -iQq -iQq -iQq -iQq -iQq -kLM -lNg -kLM -iQq -iQq -huz -huz -huz -huz -huz -huz -huz -huz -huz -huz -huz -huz -dWO -hbB -kAw -kAw -kAw -hrk -kAw -nZA -kAw +ukp +oiL +ukp +guH +sQX +pLf +pLf +asz +crF +aXH +tHD +crF +crF +tHD +uEx +crF +fNE +qud +tZA +ctC +ctC +asz +ayz +ayz +kVd +ayz +ayz +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +bJj +bJj +gpz +gpz +gpz +gpz +gpz +gpz +gpz +gpz +bJj +bJj puZ puZ puZ @@ -52622,61 +52597,61 @@ aUd aUd aUd aUd -aUd -xvA -daD +aUd xvA daD -uKZ -xHu -fRg -pvv -aTh -aUx -eHL -aWS -aYf -baY -bdk -aWS -jnc -aWQ -dbH -uyI -fRg -hvZ -iQq -iQq -iQq -iQq -iQq -iQq -kLM -aDM -uqb -iQq -huz -huz -huz -huz -huz -huz -huz -huz -huz -huz -huz -huz -huz -nNX -hbB -kAw -kAw -kAw -hrk -kAw -kAw -vEN +bFg +ukp +qiy +sQX +cXU +cid +pLf +pLf +asz +crF +aXH +bJi +crF +crF +tHD +uEx +crF +fNE +hyx +xFp +xFp +sHL +asz +kAd +kVd +kVd +xgc +kVd +ukp +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +bJj +gpz +bJj +gpz +gpz +gpz +bJj +bJj +bJj +bJj +sax puZ puZ puZ @@ -52786,61 +52761,61 @@ aUd aUd aUd aUd -aMk +aMj peb -daD -uKZ -wUy -fRg -pvv -aTi -aUy -aVL -aWT -aVL -bOh -aVL -aWS -aVL -aVL -dCS -eoH -fRg -hvZ -iQq -iQq -kLM -iQq -iQq -kLM -bcM -aDM -lNg -kLM -huz -huz -dLi -amH -qsN -aMN -faH -hHf -nTu -qsN -iYC -huz -huz -dWO -hbB -kAw -hrk -kAw -kAw -kAw -kAw -kAw -oBV -nZA +ukp +qiy +wvd +nOK +xLy +pLf +pLf +asz +asz +asz +tpL +orO +orO +tJY +asz +asz +asz +gSJ +bJi +bJi +bJi +asz +ltA +dnj +kVd +xgc +kVd +ukp +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +bJj +fXX +bJj +bJj +gpz +bJj +bJj +bJj +gpz +bJj +sax +sax +sax puZ puZ puZ @@ -52949,60 +52924,60 @@ gJo gJo abg aMl -xvA -xvA -uKZ -fRg -fRg -pvv -aTj -cov -aVM -aWS -aYg -bbg -bea -aWS -cbk -aWU -deV -wvx -fRg -hvZ -kLM -iQq -kLM -iQq -iQq -iQq -kLM -snN -kTP -iQq -huz -huz -kLi -amI -aCy -rdS -axJ -axJ -nTu -hAS -sjh -huz -huz -tuA -kAw -hrk -hrk -kAw -kAw -kAw -nZA -kAw -kAw -nZA +rYj +pLf +pLf +pLf +pLf +pLf +pLf +asz +asz +asz +ahu +uEx +bJi +bJi +aXH +rZt +asz +asz +asz +asz +qkL +asz +asz +asz +asz +xgc +xgc +kVd +ukp +bJj +jrg +jrg +jrg +jrg +jrg +jrg +jrg +jrg +amu +amu +amu +bJj +fXX +gpz +bJj +bJj +jrg +jrg +bJj +gpz +osE +sax +sax +sax puZ puZ puZ @@ -53111,60 +53086,60 @@ qbF gJo abg gJo -xvA -xvA -uKZ -fRg -gxK -pvv -pvv -aUw -fof -aWU -aVN -aVN -aVN -bqN -aVN -deV -wTz -pvv -fRg -hvZ -iQq -kLM -iQq -iQq -iQq -iQq -iQq -kLM -iQq -iQq -tpg -exX -qIr -rdS -rdS -axJ -axJ -axJ -bsS -pKf -iYC -huz -huz -oBV -pRU -hrk -hrk -kAw -nZA -nZA -nZA -kAw -kAw -nZA +rYj +asz +asz +asz +asz +asz +asz +asz +ufb +wnK +jaU +uEx +bJi +bJi +aXH +rZt +rZt +rZt +fNE +mWA +rZt +iEF +etV +tNN +fNE +xgc +xgc +boW +xgc +xgc +ukp +ukp +jrg +jrg +jrg +jrg +jrg +jrg +amu +fXX +fXX +osE +osE +bJj +bJj +jrg +jrg +jrg +bJj +bJj +bJj +sax +sax +sax puZ puZ puZ @@ -53222,111 +53197,111 @@ sYu sYu sYu lwo -lwo -lwo -eOM -lwo -eOM -eOM -sYu -sYu -eOM -eOM -lwo -arX -arX -eOM -lwo -lwo -eOM -eOM -arX -eOM -aCH -toA -ver -ver -ver -ver -ver -ver -ver -ver -fEO -oDM -ktd -bFg -bIV -bFg -bFg -bFg -cZk -cZk -xvA -cgR -gJo -qbF -qbF -gJo -qbF -gJo -uKZ -iMA -iMA -uji -uji -uji -uji -fRg -pvv -pvv -aTj -aVN -aWV -aYx -bbh -beK -pvv -pvv -pvv -aSA -pvv -fRg -hvZ -kLM -iQq -iQq -iQq -iQq -kLM -iQq -iQq -iQq -iQq -tpg -akF -alS -ans -axJ -axJ -fbf -fbf -ook -hAS -aDu -huz -huz -huz -huz -huz -kAw -kAw -nZA -nZA -nZA -kAw -kAw -nZA +lwo +lwo +eOM +lwo +eOM +eOM +sYu +sYu +eOM +eOM +lwo +arX +arX +eOM +lwo +lwo +eOM +eOM +arX +eOM +aCH +toA +ver +ver +ver +ver +ver +ver +ver +ver +fEO +oDM +ktd +bFg +bIV +bFg +bFg +bFg +cZk +cZk +xvA +cgR +gJo +qbF +qbF +gJo +qbF +daD +xHv +xHv +xHv +wXs +asz +abn +abF +abF +abF +acg +asz +aUY +vjs +aXw +kaL +wnK +wnK +aXH +rZt +rZt +rZt +fNE +ril +rZt +iEF +far +nVL +fNE +kVd +xgc +boW +xgc +xgc +ukp +uzu +uzu +jrg +jrg +jrg +jrg +jrg +amu +fXX +fXX +osE +osE +gpz +gpz +jrg +jrg +bJj +bJj +osE +osE +sax +sax +sax puZ puZ puZ @@ -53427,69 +53402,69 @@ cZk cZk tBB gJo -gJo -gJo -qbF +bFg +qdH +qdH qbF -gJo -iMA -aJM -aJU -bKV -aLk -bMK -uji -snX -pvv -aSA -pvv -vFR -eVG -pvv -pvv -pvv -aSA -pvv -pvv -pvv -pvv -fRg -hvZ -kLM -iOu -kLM -iOu -kLM -iQq -kLM -iQq -iQq -iQq -tpg -oWk -qIr -ans -ans -aMW -fMq -aut -axJ -rdS -aut -huz -huz -huz -huz -huz -hrk -kAw -hrk -hrk -nZA -kAw -kAw -nZA -nZA +bIV +xHv +xHv +xHv +wXs +asz +abp +abG +abJ +abG +acj +asz +aUX +aWB +gTU +wnK +wnK +wnK +aXH +rZt +rZt +rZt +asz +asz +rZt +rZt +hCY +hCY +fNE +kVd +kVd +boW +xgc +rAH +kVd +boW +boW +uzu +jrg +jrg +jrg +jrg +amu +fXX +fXX +amu +iTQ +bJj +gpz +bJj +jrg +bJj +bJj +gpz +osE +sax +sax +sax +sax puZ puZ puZ @@ -53589,69 +53564,69 @@ xvA xvA tBB gJo -gJo -qbF +bFg +qdH qbF qbF gJo -iMA -aKQ -bKV -bKV -omu -aFr -uji -uji -pvv -kJw -pvv -pvv -pvv -pvv -pvv -sYh -pvv -pvv -pvv -pvv -eGs -fRg -uji -jac -jQt -khx -khx -ltJ -kLM -iQq -iQq -iQq -iQq -tpg -oWk -qIr -anG -axJ -axJ -ggh -rdS -owe -axJ -rdS -axJ -axJ -axJ -huz -huz +xHv +xHv +xHv +wXs +asz +abp +abJ +abJ +abJ +aSK +aTR +rMI +oZs +azm +bJi +rZt +wnK +aXH +rZt +rZt +rZt +hAX +crF +rZt +rZt +rZt +rZt +fNE +kVd +kVd +xgc +boW +xgc +qMT +jOv +hEB +uzu +uzu +jrg +jrg +jrg +amu +fXX +fXX +amu +osE +osE +gpz +bJj +jrg +bJj +bJj +gpz +osE +sax +sax +sax sax -kAw -kAw -nZA -nZA -kAw -kAw -kAw -hrk puZ puZ puZ @@ -53749,71 +53724,71 @@ bIV cZk cZk cZk -uji -uji -uji -uji -uji -uji -uji -uji -aLk -bKV -bKV -aNg -bKV -aOb -uji -snX -fRg -pgh -fRg -fRg -dLk -fRg -pgh -fRg -fRg -fRg -rIj -uKZ -giH -uji -iMA -iMA -iMA -uKZ -ehV -uqb -kLM -iQq -iQq -kLM -ajd -huz -fjS -anJ -aGf -aNE -ggr -hLE -qvY -qkQ -axJ -axJ -axJ -axJ -huz -huz +sFs +xHv +sFs +xHv +xHv +xHv +xHv +xHv +xHv +uLi +wXs +asz +aNR +abJ +abG +abJ +abJ +rZt +kxx +oZs +bJi +bJi +ahZ +eRG +aXH +rZt +rZt +rZt +dwQ +crF +rZt +rZt +rZt +fhd +fNE +kVd +kVd +rAH +xgc +boW +boW +boW +boW +uzu +uzu +ukp +jrg +jrg +amu +eom +fXX +amu +osE +osE +bJj +bJj +bJj +bJj +bJj +bJj +amu +sax +sax +sax sax -iZj -kAw -kAw -hrk -kAw -nZA -kAw -hrk puZ puZ puZ @@ -53911,70 +53886,70 @@ cZk cZk cZk cZk -uji -uji -uji -uji -uji -uji -uji -uji -uji -aKL -uji -aNh -aLs -uji -uji -iMA -iMA -uKZ -oYH -gxK -fRg -oYH -uKZ -iMA -iMA -uji -uKZ -uKZ -bKV -kjU -bKV -krm -iXx -iMA -ehV -uqb -kLM -iQq -nAs -uqb -ajE -huz -qSW -arZ -aIh -aPf -gtx -aTO -oww -qmv -axJ -axJ -axJ -axJ -huz -huz +tjL +xHv +xHv +gik +gik +gik +dbv +kaC +xHv +xHv +wXs +asz +aNP +abJ +abG +abJ +abJ +rZt +kxx +oZs +bJi +bJi +bJi +wnK +bQx +asz +asz +qkL +asz +asz +rZt +rZt +iEF +cYC +fNE +kVd +kVd +rAH +xgc +boW +boW +boW +lLf +uzu +uzu +ukp +jrg +jrg +amu +fXX +fXX +amu +jrg +bJj +gpz +bJj +bJj +bJj +osE +bJj +amu +sax sax sax -kAw -kAw -hrk -kAw -nZA -kAw puZ puZ puZ @@ -54073,72 +54048,72 @@ bIV bFg cZk bIV -uji -gUc -xgH -xgH -xgH -gQJ -uji -uji -fRg -fRg -aKS -fRg -fRg -fRg -lro -bKV -bKV -oYH -bKV -meg -bKV -bbi -beP -bKV -meg -bKV -bKV -eGG -bKV -bKV -ftr -obb -vHX -iMA -ehV -kLM -iQq -iQq -kLM -uqb -uqb -huz -huz -auh -bWB -qvY -gZZ -iof -aDu -qoY -axJ -axJ -wFm -sYx -huz -huz -sax -sax -nZA -kAw -nZA -nZA -nZA -kAw -puZ -puZ +xHv +sFs +xHv +xHv +gik +xHv +tmP +kaC +xHv +goe +wXs +asz +abp +abJ +abJ +abJ +abJ +rZt +rMI +acY +rZt +bJi +rZt +wnK +aXH +rkc +wnK +wnK +asz +asz +dTj +rZt +rZt +tYA +fNE +kVd +kuS +kVd +rAH +rAH +kch +boW +mKD +uzu +ukp +jrg +jrg +amu +amu +fXX +fXX +amu +jrg +osE +bJj +gpz +gpz +gpz +osE +bJj +iTQ +iTQ +amu +amu +amu +amu puZ puZ "} @@ -54235,72 +54210,72 @@ bIV fUZ bIV bIV -uji -ahX -qkC -tzo -qkC -mhS -dtr -fRg -bKV -bKV -bKV -bKV -bKV -bKV -bKV -bKV -bKV -fRg -bKV -bKV -bKV -bKV -fRg -bKV -bKV -bKV -bKV -uKZ -uKZ -iMA -iMA -iMA -uKZ -uKZ -ehV -kLM -iQq -iQq -iQq -kLM -kLM -uqb -ncS -bWB -auh -aTO -hkS -itR -oNz -qOE -rdS -axJ -sYx -wFm -huz -huz -sax -sax -kAw -kAw -nZA -hrk -nZA -kAw -puZ -puZ +xHv +xHv +xHv +xHv +xHv +goe +kaC +kaC +kaC +xHv +wXs +asz +abp +abG +abJ +abG +ach +asz +aWC +aWs +qkR +eRG +sbd +wnK +aXH +rkc +wnK +rZt +fir +rqK +asz +rZt +rZt +asz +asz +kVd +kVd +kVd +rAH +rAH +xgc +boW +vkr +nij +ukp +jrg +jrg +amu +cur +fXX +fXX +amu +amu +iTQ +bJj +fXX +gpz +gpz +bJj +fXX +cuJ +fXX +bJj +fXX +fXX +amu puZ puZ "} @@ -54397,72 +54372,72 @@ bIV bFg bFg bFg -uji -aGc -tzo -tzo -aJj -aJk -fRg -fRg -bKV -bKV -aMK -aNl -aNl -aPn -bKV -bKV -bKV -fRg -bKV -bKV -bKV -bKV -uHA -bKV -bKV -rfd -bKV -iMA -hFJ -fRg -dZN -fRg -iMA -kGO -lyE -kLM -iQq -kLM -iQq -iQq -kLM -uqb -ncS -mRc -rdS -aXk -axJ -jFq -huz -qPh -rdS -axJ -axJ -sXt -huz -huz -sax -sax -kAw -kAw -nZA -nZA -nZA -kAw -puZ -puZ +xHv +xHv +uLi +xHv +qEH +kaC +kaC +kaC +xHv +xHv +wXs +asz +abx +abM +abM +abM +ack +asz +aUU +aXh +mYX +bVr +aXh +aXh +bJf +rkc +wnK +rZt +hMY +asz +asz +crF +crF +asz +asz +uzu +kVd +kVd +kVd +kVd +xgc +boW +boW +kVd +ukp +jrg +jrg +amu +lAb +fXX +fXX +fXX +fXX +fXX +fXX +bJj +bJj +gpz +osE +bJj +mwJ +bJj +fXX +fXX +fXX +amu puZ puZ "} @@ -54520,111 +54495,111 @@ lwo lwo lwo lwo -eTV -lwo -eTV -lwo -lwo -eOM -eOM -lwo -eOM -qep -arX -arX -arX -amQ -arX -eOM -arX -arX -ktd -axK -ver -ver -ver -htb -ver -ver -ver -ver -bYd -ktd -ktd -gJo -bIV -bIV -bFg -bFg -bFg -bFg -bFg -bIV -aGb -tzo -qkC -tzo -aGd -fRg -fRg -bKV -bKV -pzj -pzi -kGz -bKV -bKV -bKV -bKV -oYH -bKV -bKV -bKV -bKV -oYH -bKV -bKV -bKV -bKV -iMA -sFR -pvv -pvv -oCG -kjM -tpg -iQq -iQq -iQq -szU -kLM -iQq -iQq -uqb -ncS -pTp -pTp -rdS -axJ -alO -huz -qWL -aut -axJ -kLi -kLi -huz -huz -sax -sax -kAw -kAw -nZA -nZA -kAw -kAw -puZ -puZ +eTV +lwo +eTV +lwo +lwo +eOM +eOM +lwo +eOM +qep +arX +arX +arX +amQ +arX +eOM +arX +arX +ktd +axK +ver +ver +ver +htb +ver +ver +ver +ver +bYd +ktd +ktd +gJo +bIV +bIV +bFg +bFg +bFg +bFg +bFg +bIV +xHv +sFs +xHv +xHv +goe +kaC +xHv +gik +xHv +wXs +asz +asz +asz +asz +asz +asz +asz +rZt +rZt +rZt +gGf +bDx +asz +kXt +asz +wnK +rZt +asz +asz +kPX +rZt +rZt +asz +asz +pLf +hkZ +rAH +ccT +xgc +xgc +rAH +xgc +xgc +jrg +jrg +jrg +amu +igJ +fXX +fXX +fXX +fXX +fXX +osE +gpz +bJj +fXX +bJj +iTQ +amu +amu +amu +fXX +fXX +amu puZ puZ "} @@ -54722,71 +54697,71 @@ bFg bFg bFg bFg -aGd -tzo -qkC -tzo -aGd -fRg -fRg -bKV -bKV -bKV -bKV -bKV -bKV -bKV -ohE -bKV -uKZ -ahe -fRg -fRg -oYH -uKZ -bwk -cex -cex -cex -uKZ -xHu -pvv -pvv -oCG -wRm -tpg -iQq -iQq -iQq -kLM -aDM -kLM -iQq -huz -huz -avz -avz -axJ -axJ -alO -pJM -rgI -rdS -axJ -kLi -alP -huz -huz -sax -sax -kAw -kAw -nZA -kAw -kAw -kAw -puZ -puZ +xHv +xHv +xHv +sFs +xHv +xHv +xHv +gik +gik +wXs +asz +aNN +afN +afP +fNE +rZt +rZt +rZt +rZt +gGf +rZt +rZt +qVo +wnK +wnK +wnK +rZt +asz +asz +hLB +rZt +rZt +asz +asz +shi +kVd +qEK +pGt +xgc +xgc +rAH +xgc +xgc +npY +rKq +jrg +amu +iTQ +amu +amu +amu +amu +amu +osE +gpz +osE +osE +bJj +gpz +amu +amu +amu +fXX +fXX +amu puZ puZ "} @@ -54884,71 +54859,71 @@ bFg bFg bFg bIV -aGd -aHd -aIG -tzo -aGd -fRg -fRg -bKV -bKV -aMK -aNl -aNl -aPn -bKV -bKV -tsU -uKZ -ocB -bKV -bKV -bKV -hDW -bzh -fRg -fRg -fRg -qXk -fRg -pvv -khz -fRg -iMA -kIo -lCe -kLM -iQq -iQq -kLM -iQq -iQq -huz -aQq -axJ -axJ -axJ -axJ -jJZ -oXU -axJ -dQq -axJ -axJ -rdS -huz -huz -sax -sax -kAw -kAw -kAw -kAw -kAw -bcV -oFl -puZ +xHv +xHv +xHv +uLi +xHv +xHv +xHv +gik +xHv +wXs +bXo +kxx +bIh +afQ +fNE +rZt +rZt +rZt +rZt +rZt +rZt +rZt +rkc +wnK +rZt +rZt +rZt +asz +asz +hMY +rZt +rZt +asz +asz +pLf +gZi +kVd +kVd +kVd +kVd +rAH +kVd +xgc +xXQ +boW +jrg +xgc +ukp +ukp +ukp +pLf +jrg +amu +osE +gpz +osE +osE +bJj +gpz +amu +amu +amu +fXX +fXX +amu puZ puZ "} @@ -55046,71 +55021,71 @@ bFg bFg bIV kaC -aGe -qkC -tzo -qkC -tGv -dtr -fRg -bKV -bKV -bKV -bKV -bKV -bKV -bKV -bKV -bKV -iMA -vHX -bKV -bKV -bKV -bsC -pvv -pvv -pvv -pvv -pvv -pvv -pvv -pvv -fRg -uKZ -uKZ -vqV -kLM -kLM -iQq -iQq -iQq -kLM -huz -pJM -ayZ -rdS -bqO -axJ -bqO -axJ -axJ -axJ -axJ -axJ -axJ -huz -huz -sax -sax -nZA -nZA -nZA -kAw -kAw -rBk -vAU -puZ +xHv +xHv +xHv +sFs +xHv +xHv +uLi +xHv +goe +wXs +lSU +aNL +nmi +afP +asz +asz +aTQ +asz +asz +wnK +dTU +wnK +asz +asz +qkL +fNE +fNE +asz +asz +asz +crF +crF +asz +asz +pLf +kVd +rAH +ccT +uzu +kVd +kVd +kVd +xgc +bkK +xgc +rAH +ukp +kVd +uzu +ukp +ukp +jrg +amu +osE +gpz +gpz +fXX +bJj +gpz +gpz +amu +amu +fXX +fXX +amu puZ puZ "} @@ -55204,75 +55179,75 @@ oQl oQl oQl gJo -bFg -bFg -cZk -kaC -rXn -dsx -dsx -dsx -waS -uji -uji -fRg -fRg -fRg -fRg -fRg -fRg -fRg -bKV -bKV -iMA -vHX -aWX -bKV -bKV -bsC -pvv -pvv -pvv -pvv -pvv -pvv -pvv -pvv -fRg -xQa -iMA -avx -uqb -kLM -iQq -iQq -kLM -tpg -exX -alW -arW -anJ -dQq -hmo -rdS -axJ -dQq -axJ -axJ -axJ -axJ -huz -huz -sax -sax -nZA -nZA -kAw -kAw -kAw -puZ -puZ -puZ +bFg +bFg +cZk +kaC +xHv +xHv +xHv +xHv +xHv +goe +xHv +xHv +xHv +wXs +lSU +lSU +afF +sBW +xDq +aSI +afF +aUT +asz +rMI +rMI +rMI +asz +emq +wnK +dTU +wnK +dTU +hfm +asz +rZt +rZq +asz +asz +pIV +jKm +dbO +pGt +kVd +kVd +huF +rAH +rAH +bkK +boW +ukp +ukp +kVd +ukp +ukp +ukp +bJj +iTQ +osE +gpz +gpz +bJj +amu +gpz +gpz +amu +amu +fXX +fXX +amu puZ puZ "} @@ -55375,66 +55350,66 @@ kaC kaC kaC kaC -uji -uji -fRg -aMs -vIk -lJh -loH -ppI -aMs -bKV -bKV -uKZ -nUa -bKV -bKV -bKV -iDW -bAX -fRg -fRg -fRg -fRg -pgh -fRg -ohq -mKB -cLq -iMA -avx -voo -kLM -iQq -iQq -kLM -tpg -exX -qIr -azS -qny -aDu -aut -kfW -axJ -axJ -axJ -axJ -axJ -rdS -huz -huz -sax -sax -nZA -nZA -kAw -kAw -kAw -puZ -puZ -puZ +xHv +xHv +xHv +xHv +wXs +lSU +lSU +tSI +rZt +gLv +rZt +gLv +afF +wBf +wnK +dTU +wnK +asz +kbZ +chU +gTv +sHf +tRq +chU +ogu +rZt +rZt +asz +asz +pLf +pLf +uzu +kVd +uzu +uzu +uzu +boW +eXQ +eWl +boW +ukp +ukp +xgc +ukp +ukp +ukp +bJj +bJj +osE +bJj +bJj +bJj +amu +gpz +gpz +amu +amu +fXX +fXX +pLS puZ puZ "} @@ -55532,71 +55507,71 @@ mIL fQX fQX fQX -kaC -kaC -kaC -kaC -kaC -uji -uji -uji -uji -uKZ -uKZ -uji -uji -uji -qLA -uji -uKZ -aVT -fRg -fRg -oYH -uKZ -bFS -ail -ail -ail -uKZ -uji -uji -iMA -iMA -iMA -uKZ -ehV -aDM -kTP -iQq -iQq -kLM -uqb -huz -cio -ieD -aKR -aDu -huz -axJ -rdS -rti -ieD -axJ -axJ -hIu -huz -huz -sax -sax -nZA -nZA -kAw -kAw -kAw -puZ -puZ -puZ +oQl +oQl +oQl +oQl +oQl +mIL +mIL +gaz +mIL +bme +lSU +lSU +aOv +afF +rZt +rZt +gLv +afF +wBf +wnK +dTU +pkK +asz +emq +chU +kbZ +chU +gTv +chU +fNE +uvU +rZt +asz +asz +pLf +pLf +pLf +ukp +ukp +kVd +uzu +kVd +nEQ +ukp +xgc +ukp +xgc +kVd +ukp +ukp +ukp +bJj +bJj +bJj +qMc +bJj +rbq +osE +gpz +gpz +amu +amu +fXX +fXX +lAb puZ puZ "} @@ -55702,63 +55677,63 @@ oQl oQl oQl oQl -uKZ -hsw -aNp -bfR -oYH -oYH -pvv -pvv -pvv -pvv -pvv -pvv -pvv -pvv -pvv -pvv -pvv -pvv -pvv -gqe -uji -jkM -bHC -xwo -bHC -lCp -idG -kLM -iQq -iQq -kLM -kLM -huz -huz -huz -huz -huz -huz -mpt -axJ -rxd -sFv -axJ -rdS -hRC -huz -huz -sax -qCr -kAw -nZA -kAw -kAw -puZ -puZ -puZ -puZ +ood +bme +lSU +lSU +lSU +aSI +aRs +uRt +flN +sBW +rZt +nOB +rMI +rMI +asz +tRq +wdy +dTU +bZZ +dTU +twc +fNE +rZt +uvU +asz +asz +pLf +pLf +pLf +pLf +pLf +pLf +pLf +pLf +npY +nij +rAH +ukp +ukp +pLf +pLf +ukp +xgc +bJj +bJj +bJj +bJj +bJj +fXX +osE +gpz +amu +amu +amu +fXX +igJ +fXX puZ puZ "} @@ -55812,115 +55787,115 @@ hkC arX arX arX -bjv -bjv -ecj -ecj -ecj -ecj -ecj -ecj -aaN -agM -arX -aDI -eOM -eOM -pCH -lwo -lwo -eOM -lwo -eOM -arX -oQl -oQl -oQl -oQl -oQl -oQl -oQl -oQl -oQl -oQl -oQl -oQl -oQl -oQl -oQl -oQl -oQl -oQl -oQl -oQl -mIL -fQX -fQX -fQX -fQX -cKL -oQl -oQl -oQl -oQl -oQl -uKZ -xSk -aNq -oYH -fRg -oYH -pvv -pvv -pvv -pvv -pvv -pvv -pvv -pvv -pvv -pvv -pvv -pvv -pvv -fRg -hGj -iQq -iOu -kLM -iOu -kLM -kLM -iQq -kLM -iQq -iQq -iQq -iQq -pKK -iQq -iOu -kLM -huz -rdS -axJ -amH -tbR -axJ -rdS -ixC -huz -huz -sax -hrk -kAw -kAw -kAw -kAw -puZ -puZ -puZ -puZ +bjv +bjv +ecj +ecj +ecj +ecj +ecj +ecj +aaN +agM +arX +aDI +eOM +eOM +pCH +lwo +lwo +eOM +lwo +eOM +arX +oQl +oQl +oQl +oQl +oQl +oQl +oQl +oQl +oQl +oQl +oQl +oQl +oQl +oQl +oQl +oQl +oQl +oQl +oQl +oQl +mIL +fQX +fQX +fQX +fQX +cKL +oQl +oQl +oQl +oQl +oQl +mIL +bme +lSU +lSU +lSU +lSU +lSU +wBf +kEs +fgB +kEs +flN +asz +asz +asz +asz +asz +asz +tDg +iWX +wZh +asz +rMI +kdy +asz +asz +asz +asz +asz +asz +asz +asz +asz +pLf +uzu +ukp +xgc +ukp +ukp +ukp +pLf +ukp +bJj +fXX +fXX +bJj +gpz +bJj +bJj +fXX +vOb +cuJ +fXX +bJj +fXX +fXX +pLS puZ puZ "} @@ -56026,63 +56001,63 @@ oQl oQl oQl oQl -uKZ -cHB -xSk -afd -fRg -oYH -aSA -gIQ -aTh -aVx -aWI -aYd -baX -bcJ -pvv -pvv -pvv -pvv -pvv -fRg -hGj -iQq -iQq -iQq -iQq -iQq -iQq -kLM -aDM -kLM -iQq -iQq -iQq -iQq -iQq -iQq -iQq -huz -aut -rdS -aCy -tdc -axJ -axJ -tZW -huz -huz -sax -hrk -kAw -nZA -kAw -kAw -puZ -puZ -puZ -puZ +mIL +bme +lSU +twi +flN +flN +flN +kEs +kEs +flN +eit +vTc +asz +coj +coj +asz +dtE +goj +goj +goj +goj +goj +goj +aiD +goj +asz +agz +asz +asz +asz +asz +asz +asz +pLf +ukp +uzu +fBA +xgc +ukp +ukp +ukp +xgc +bJj +gpz +gpz +bJj +bJj +gpz +rbq +fXX +rbq +mwJ +fXX +fXX +fXX +fXX +pLS puZ puZ "} @@ -56188,63 +56163,63 @@ oQl oQl oQl oQl -uji -uKZ -uKZ -uji -dtr -oYH -pvv -fhv -aUA -aVB -aWQ -aVx -aVx -aVx -bqN -aVx -dbH -dKR -pvv -fRg -hGj -kLM -iQq -iQq -iQq -iQq -iQq -kLM -kLM -uqb -kLM -iQq -iQq -iQq -iQq -iQq -tpg -exX -qIr -aut -rdS -rdS -axJ -axJ -rdS -huz -huz -sax -hrk -kAw -nZA -kAw -kAw -puZ -puZ -puZ -puZ +mIL +mIL +uIE +flN +flN +flN +flN +flN +eit +kEs +kEs +flN +rMI +dTU +dTU +rMI +goj +chU +goj +chU +chU +chU +goj +chU +aiD +asz +twt +agY +aha +arK +arU +asz +asz +pLf +pLf +ukp +uzu +ukp +ukp +xgc +ukp +bJj +fXX +gpz +gpz +vlD +bJj +bJj +bJj +osE +bJj +amu +amu +amu +amu +amu +amu puZ puZ "} @@ -56351,58 +56326,58 @@ oQl oQl oQl mIL -mIL -mIL -uKZ -fRg -oYH -pvv -aTh -aUx -aVU -aWS -aYf -baY -bdk -aWS -bYO -aWQ -dbH -eVG -fRg -hGj -uqb -kLM -kLM -iQq -iQq -ipc -iQq -kLM -iQq -iQq -iQq -iQq -iQq -iQq -iQq -tpg -exX -qIr -rdS -axJ -axJ -axJ -axJ -axJ -huz -huz +fQX +gaz +uIE +flN +flN +gCL +flN +kEs +flN +flN +vTc +rMI +dTU +dTU +rMI +goj +wnK +goj +wnK +wnK +wnK +goj +wnK +goj +fNE +aud +rZt +rZt +rZt +nBh +ajg +asz +qfZ +jrg +jrg +jrg +ukp +ukp +ukp +bJj +bJj +bJj +gpz +bJj +bJj +bJj +bJj +fXX +osE +fXX +amu sax -hrk -nZA -nZA -kAw -kAw puZ puZ puZ @@ -56514,59 +56489,59 @@ oQl mIL mIL ood -ood -uKZ -aQg -oYH -pvv -aTi -aUy -aVL -vVq -aVL -aVL -aVL -aWS -clp -aVU -aUA -gIQ -fRg -hGj -uqb -uqb -uqb -kLM -iQq -ipc -iQq -iQq -iQq -iQq -iQq -iQq -iQq -iQq -iQq -eSN -akF -alS -aMW -wHx -dQq -axJ -axJ -huz -huz -huz -hrk -nZA -nZA -nZA -kAw -kAw -bcV -oFl +mIL +lqu +flN +eit +flN +kEs +kEs +fgB +kEs +kOi +lSU +coj +coj +lSU +dtE +rZt +rZt +rZt +rZt +mgT +rZt +uvU +goj +fNE +aud +miD +ptr +ptr +rZt +aCB +aeU +fXX +bJj +bJj +bJj +bJj +bJj +bJj +bJj +bJj +gpz +bJj +bJj +bJj +jrg +amu +gpz +bJj +osE +amu +sax +sax +sax puZ puZ puZ @@ -56668,67 +56643,67 @@ mIL mIL mPu fQX -fQX -fQX +jAL +jAL fQX mIL mIL mIL mIL ood -ood -uKZ -aQg -oYH -pvv -aTj -aUz -aVL -aWS -aYg -bbg -bea -aWS -cbk -aWU -deV -fhv -fRg -hGj -kLM -kLM -iQq -iQq -kLM -vdk -iQq -iQq -iQq -iQq -iQq -iQq -iQq -iQq -iQq -tpg -exX -qIr -axJ -axJ -axJ -dQq -axJ -huz -huz -huz -hrk -kAw -kAw -kAw -kAw -kAw -rBk -vAU +pqj +vwn +uIE +flN +kEs +flN +flN +kEs +flN +kOi +lSU +lSU +lSU +lSU +bxW +wnK +goj +aNf +rZt +nBs +goj +txU +goj +fNE +aud +ptr +miD +miD +rZt +ava +asz +qfZ +dVw +gpz +gpz +bJj +bJj +jrg +bJj +bJj +gpz +bJj +bJj +jrg +jrg +amu +rbq +rbq +rbq +amu +sax +sax +sax puZ puZ puZ @@ -56831,64 +56806,64 @@ mIL mIL fQX fQX -fQX -fQX -mIL +jAL +jAL mIL +vJu mIL ood +fQX +jAL mIL -mIL -uKZ -fRg -oYH -pvv -pvv -aUw -aVB -aWU -aVN -aVN -aVN -bqN -aVN -deV -pvv -pvv -gxK -hGj -iQq -iQq -iQq -kLM -iQq -iQq -iQq -iQq -iQq -iQq -iQq -kLM -kLM -iQq -iQq -iQq -huz -axJ -axJ -rBC -rdS -axJ -axJ -tkm -ncS -hrk -hrk -kAw -kAw -kAw -kAw -kAw +lSU +uIE +flN +kEs +agw +agw +kEs +wXh +lSU +cvn +lSU +wOO +goj +chU +goj +lfk +rZt +uII +aiD +chU +goj +fNE +aud +rZt +rZt +mRU +ptr +aue +asz +jrg +bJj +gpz +gpz +bJj +jrg +jrg +jrg +gpz +gpz +gpz +bJj +osE +jrg +iTQ +rbq +rbq +rbq +amu +sax puZ puZ puZ @@ -56996,61 +56971,61 @@ fQX fQX mIL mIL -mIL +vJu mIL mIL oQl -oQl -uji -fRg -oYH -pvv -pvv -aTj -aVN -aWV -aYx -bbh -beK -pvv -pvv -pvv -pvv -pvv -fRg -hGj -kLM -iQq -kLM -uqb -kLM -iQq -iQq -iQq -iQq -iQq -kLM -iQq -iQq -kLM -kLM -kLM -huz -krU -axJ -axJ -trX -uLT -wTT -fXB -ncS -hrk -hrk -nZA -kAw -kAw -kAw -kAw +mIL +mIL +lSU +ehO +jis +lSU +acU +acU +lSU +lSU +lSU +fgH +lSU +bYk +goj +chU +dsY +uKo +rZt +wjK +goj +vTj +goj +asz +agm +rZt +rZt +ard +asz +asz +asz +jrg +bJj +bJj +bJj +jrg +jrg +jrg +bJj +gpz +bJj +gpz +bJj +osE +jrg +amu +fXX +fXX +bJj +amu +sax puZ puZ puZ @@ -57153,66 +57128,66 @@ fQX fQX fQX fQX +jAL fQX -fQX -fQX -mIL +jAL mIL +jAL ood ood oQl oQl +ood oQl -uji -dtr -oYH -pvv -aTn -pvv -pvv -pvv -pvv -pvv -bfi -pvv -pvv -pvv -pvv -pvv -fRg -hGj -kLM -iOu -uqb -kJQ -uqb -iQq -iQq -iQq -iQq -kLM -iQq -kLM -uqb -kLM -que -aDM -huz -kys -pef -rdS -axJ -axJ -xvQ -fXB -ncS -kAw -nZA -kAw -kAw -nZA -kAw -hrk +oQl +lSU +dwQ +lSU +lSU +lSU +lSU +lSU +lSU +dwQ +lSU +qRo +goj +wnK +goj +kMJ +rZt +neS +goj +wnK +oag +asz +agl +rZt +rZt +apk +asz +jrg +jrg +jrg +osE +bJj +bJj +jrg +jrg +bJj +bJj +gpz +gpz +bJj +bJj +bJj +gpz +bJj +fXX +bJj +fXX +amu +sax puZ puZ puZ @@ -57324,57 +57299,57 @@ ood mIL oQl oQl +mIL oQl -uji -oYH -ahe -pvv -ugD -pvv -pvv -aWY -pvv -pvv -pvv -pvv -pvv -pvv -pvv -pvv -fRg -uji -aDM -uqb -uqb -uqb -kLM -kLM -iQq -iQq -iQq -iQq -kLM -kLM -sqb -lNg -aDM -aDM -huz -huz -huz -huz -tRN -rdS -xvQ -huz -huz -kAw -kAw -kAw -kAw -nZA -kAw -hrk +oQl +lSU +dwQ +eBG +dwQ +dwQ +elw +rRP +lSU +cvn +lSU +exm +goj +rWS +fVI +rZt +rZt +rZt +goj +chU +goj +aeU +rZt +rZt +rZt +aCB +asz +jrg +jrg +jrg +osE +bJj +bJj +bJj +jrg +bJj +bJj +bJj +bJj +bJj +bJj +bJj +gpz +bJj +bJj +fXX +fXX +iTQ +sax puZ puZ puZ @@ -57475,69 +57450,69 @@ iMb iMb iMb fQX +jAL fQX fQX fQX +jAL +mIL fQX fQX -mIL -mIL -mIL gaz oQl oQl oQl -uji -uKZ -uKZ -uji -uji -uji -uKZ -fRg -fRg -fRg -bfy -fRg -uKZ -uji -dMo -ano -dMo -uji -hzJ -kLM -lNE -uqb -iOu -kLM -iQq -iQq -iQq -iQq -kLM -kLM -uqb -uqb -uqb -hzJ -huz -huz -huz -huz -ncS -ncS -ncS -huz -huz -hrk -kAw -kAw -kAw -kAw -kAw -hrk -hrk +oQl +oQl +lSU +dwQ +dwQ +dwQ +oaO +dwQ +rEW +lSU +lSU +lSU +lSU +bxW +chU +goj +rZt +rZt +rZt +goj +chU +oag +asz +aud +rZt +rZt +tiw +asz +jrg +jrg +jrg +bJj +osE +bJj +bJj +jrg +bJj +osE +bJj +gpz +gpz +gpz +bJj +bJj +gpz +gpz +fXX +jrg +iTQ +sax +sax puZ puZ puZ @@ -57639,67 +57614,67 @@ iMb kri fQX fQX -fQX -fQX -fQX -fQX mIL mIL +jAL +mIL +jAL +mIL mIL oQl oQl oQl oQl -cKL -fQX -oQl -oQl oQl -uKZ -iMA -aYy -bbj -aYy -iMA -uKZ -uji -uji -uji -uji -uji -hzJ -qhm -qhm -kXs -mcH -mcH -mcH -mcH -nEH -mcH -mcH -mcH -pNo -qhm -qhm -hzJ -hzJ -hzJ -hzJ -hzJ -kAw -kAw -kAw -hrk -hrk -kAw -nZA -nZA -kAw -kAw -kAw -kAw -hrk +lSU +lSU +lSU +lSU +dwQ +oaO +dwQ +dwQ +dwQ +bXo +rZt +goj +vuj +goj +eaz +rZt +nwd +goj +wnK +goj +fNE +aud +rZt +rZt +ahT +asz +jrg +jrg +jrg +jrg +bJj +bJj +bJj +bJj +bJj +bJj +bJj +gpz +gpz +bJj +osE +bJj +gpz +gpz +bJj +jrg +jrg +sax +sax puZ puZ puZ @@ -57800,67 +57775,67 @@ fIT fQX iMb fQX -mIL -mIL -fQX -fQX -fQX +wMh +cQY +kSO +qBM +wMh mIL mIL ood oQl oQl +vJu oQl oQl -fQX -cKL -jAL oQl oQl oQl -jAL -aYF -bbt -jAL -bGk -fQX -snZ -hzJ -hzJ -hzJ -hzJ -kLM -kLM -knI -iQq -iQq -iQq -iQq -iQq -iQq -iQq -iQq -kLM -uqb -uqb -uqb -qEB -hzJ -hzJ -hzJ -hzJ -kAw -hrk -kAw -kAw -kAw -kAw -kAw -nZA -kAw -kAw -kAw -kAw +lSU +elw +dwQ +dwQ +dwQ +dwQ +lSU +lQm +goj +chU +goj +dqH +rZt +sCl +onM +chU +goj +fNE +afX +rZt +rZt +ahS +asz +jrg +jrg +jrg +jrg +bJj +bJj +bJj +osE +bJj +bJj +gpz +bJj +bJj +jrg +osE +bJj +bJj +gpz +bJj +jrg +jrg +sax puZ puZ puZ @@ -57961,68 +57936,68 @@ tPz fIT fQX iMb -mIL -mIL -mIL -fQX -fQX -fQX -fQX +wMh +wMh +cQY +rJI +gso +pcY +gaz mIL gaz oQl oQl +vJu oQl oQl -cKL -jAL -jAL +acb oQl oQl -jAL -jAL -jAL -jAL -bfB -bGx -fQX -snZ -hzJ -hzJ -hzJ -hzJ -uAd -kbK -jpE -iQq -kLM -iQq -iQq -iQq -iQq -iQq -iQq -iQq -iQq -kLM -kLM -qoU -hXB -hzJ -hzJ -hzJ -xMz -xMz -xMz -xMz -kAw -kAw -kAw -kAw -kAw -kAw -hrk -hrk +lSU +dwQ +dwQ +lSU +lSU +lSU +lSU +lSU +goj +chU +dsY +hTb +pRH +lpA +goj +chU +goj +fNE +afV +rZt +rZt +aCB +asz +jrg +jrg +jrg +jrg +bJj +bJj +bJj +gpz +gpz +gpz +bJj +bJj +bJj +jrg +gRJ +bJj +osE +gpz +bJj +bJj +jrg +sax puZ puZ puZ @@ -58123,67 +58098,67 @@ aXZ fIT fQX iMb +wMh +wMh +cQY +aNy +xtc +nKD mIL mIL mIL -fQX -fQX -fQX -fQX -mIL -mIL mIL mIL -mhl -fQX -fQX -fQX -fQX -jAL -jAL -fQX -fQX -jAL -jAL -jAL -pqj -jAL -pqj -fKb -kLM -iQq -kLM -kLM -kLM -kLM -uqb -iOu -kLM -iQq -iQq -iQq -iQq -iQq -iOu -iQq -iQq -uqb -hbD -boz -iDy -hzJ -hzJ -xMz -xMz -xMz -xMz -xMz -kAw -nZA -nZA -kAw -kAw -kAw +vJu +oRK +mIx +aca +oQl +oQl +lSU +dwQ +dwQ +lSU +gpb +adC +adC +lSU +goj +wnK +goj +gKE +pue +iYc +onM +wnK +goj +asz +afz +azH +agZ +aUS +asz +jrg +jrg +jrg +jrg +jrg +bJj +gpz +osE +osE +gpz +bJj +bJj +mKF +jrg +jrg +gRJ +sUD +hXH +apD +hXH +czI puZ puZ puZ @@ -58286,66 +58261,66 @@ fIT iMb fQX fQX -mIL -fQX -fQX -fQX -fQX -fQX +wMh +pXU +wMh +wMh +aFO +gaz mIL mIL mIL mIL -wxY -fQX -fQX -fQX -fQX -fQX -fQX -fQX -fQX -fQX -fQX -fQX -jAL -pqj -jAL -kvQ -uqb -aDM -iQq -kLM -kLM -iQq -uqb -uqb -iQq -iQq -iQq -iQq -iQq -kLM -kLM -iQq -iQq -uqb -lNg -lNg -xvb -uqb -xMz -xMz -xMz -xMz -xMz -xMz -kAw -nZA -kAw -kAw -nZA -kAw +vJu +kbT +skl +skl +ors +lSU +lSU +dwQ +dwQ +lSU +dwQ +dwQ +dwQ +lSU +dtE +rZt +rZt +iXr +pue +wui +rZt +rZt +goj +asz +asz +asz +asz +asz +asz +jrg +jrg +jrg +bJj +bJj +bJj +gpz +osE +osE +bJj +osE +osE +jrg +jrg +jrg +jrg +jrg +flN +fLk +flN +pxA puZ puZ puZ @@ -58447,67 +58422,67 @@ fIT fQX iMb iMb -fQX +jAL fQX fQX fQX fQX cKL -fQX -fQX +ood +cKL mIL mIL rcD -mIL -fQX -fQX -fQX -fQX -fQX -fQX -fQX -fQX -fQX -fQX -jAL -pqj -jAL -fQX -kLM -uqb -kLM -kLM -kLM -kLM -kLM -iQq -iQq -kLM -iQq -iQq -iQq -iQq -kLM -iQq -iQq -iQq -iQq -iQq -iQq -iQq -iQq -xMz -xMz -xMz -xMz -xMz -xMz -kAw -kAw -kAw -kAw -kAw -kAw +vJu +sgB +skl +skl +ors +dwQ +elw +dwQ +dwQ +adI +adj +dwQ +adH +lSU +goj +wnK +goj +wnK +wnK +wnK +goj +txU +goj +rZt +rZt +flN +asz +jrg +jrg +jrg +osE +osE +osE +osE +bJj +bJj +bJj +bJj +sLj +sLj +tnG +jrg +jrg +jrg +jrg +wBf +flN +dwQ +rZt +pxA puZ puZ puZ @@ -58616,60 +58591,60 @@ fQX cKL fQX fQX -fQX +ood mIL ood mIL -wxY -fQX -fQX -fQX -fQX -fQX -fQX -fQX -fQX -jAL -jAL -pqj -jAL -fQX -jAL -cdh -aDM -uqb -kLM -kLM -uqb -uqb -kLM -kLM -kLM -iQq -bzK -iQq -iQq -kLM -kLM -iQq -iQq -iQq -iQq -iQq -iQq -iQq -xMz -xMz -xMz -xMz -xMz -xMz -kAw -kAw -kAw -kAw -kAw -kAw +vJu +abV +skl +skl +ors +elw +dwQ +dwQ +dwQ +lSU +ada +dwQ +dwQ +adI +goj +chU +goj +chU +chU +chU +goj +chU +aiD +rZt +flN +rZt +dwQ +bJj +osE +bJj +osE +osE +osE +gpz +bJj +gpz +gpz +bJj +ciL +gpz +bJj +xuz +jrg +jrg +jrg +pxA +flN +rZt +dwQ +pxA puZ puZ puZ @@ -58782,56 +58757,56 @@ mIL mIL ood mIL -mhl -fQX -cKL -fQX -fQX -cKL -fQX -fQX -fQX -jAL -pqj -fQX -jAL -fQX -jAL -kvQ -kLM -xvb -kLM -kLM -kLM -kLM -kLM -gCx -kJQ -kLM -qkI -iQq -kLM -iOu -kLM -iQq -qkI -lNg -kLM -lNg -uqb -uqb -xMz -xMz -xMz -xMz -xMz -xMz -cwZ -cwZ -kAw -kAw -kAw -kAw +vJu +oQl +abX +ors +ors +lSU +lSU +dwQ +dwQ +lSU +ada +ady +adE +lSU +goj +goj +goj +goj +goj +goj +goj +goj +goj +wnK +wnK +dwQ +flN +fXX +bJj +bJj +osE +bJj +bJj +gpz +gpz +bJj +bJj +xuz +ciL +bJj +bJj +bJj +jrg +jrg +jrg +pxA +dwQ +dwQ +rZt +pxA puZ puZ puZ @@ -58930,7 +58905,7 @@ fQX fQX iMb iMb -fQX +jAL iMb iMb pQE @@ -58940,60 +58915,60 @@ pQE mIL gaz mIL -mIL -ood -gaz -mIL -oQl -oQl -fQX -cKL -fQX -oQl -cKL -fQX -jAL -pqj -fQX -cKL -xMz -xMz -xMz -xMz -aDM -uqb -kLM -gCx -kLM -kLM -kLM -kLM -kLM -kLM -iQq -iQq -kLM -iQq -iQq -kLM -uqb -iQq -iQq -iQq -kLM -xvb -uqb -uCs -xMz -xMz -xMz -xMz -cwZ -cwZ -kAw -kAw -kAw -hrk +mIL +jAL +gaz +mIL +vJu +oQl +oQl +abY +abY +oQl +lSU +dwQ +dwQ +lSU +lSU +lSU +lSU +lSU +shO +gAV +gAV +chU +rZt +rZt +kmO +rZt +rZt +rZt +rZt +rZt +rZt +bJj +bJj +osE +gpz +bJj +bJj +bJj +bJj +bJj +gpz +gpz +rad +fXX +osE +gRJ +jrg +jrg +jrg +pxA +mwF +chU +mwF +pxA puZ puZ puZ @@ -59106,56 +59081,56 @@ ood gaz ood mIL -mIL oQl oQl oQl oQl oQl oQl -fQX -jAL -jAL -cKL -xMz -xMz -xMz -xMz -oqf -uqb -kTP -kLM -kLM -iQq -iQq -iQq -kLM -iQq -iQq -iQq -iQq -iQq -kLM -kLM -iQq -iQq -iQq -qkI -iQq -uqb -kLM -aDM -xMz -xMz -xMz -iQq -fKb -cwZ -kAw -kAw -kAw -hrk -puZ +lSU +dwQ +dwQ +dwQ +bXo +rZt +dTU +dTU +rZt +gAV +gAV +chU +asz +asz +asz +asz +asz +wnK +wnK +dwQ +wnK +dwQ +bJj +bJj +gpz +gpz +gpz +bJj +osE +osE +gpz +gpz +xTK +fXX +fXX +jrg +jrg +jrg +jrg +pxA +xcE +ggL +xcE +pxA puZ puZ puZ @@ -59267,57 +59242,57 @@ ood ood mIL mIL -mIL -mIL -iMb +jAL oQl oQl oQl oQl -vAp -mhl -jAL -mhl -vAp -xMz -cnt -cnt -uqb -xvb -kLM -gCx -kLM -iQq -cQW -cQW -cQW -iQq -iQq -iQq -gGH -kLM -kLM -cQW -cQW -cQW -cQW -kLM -iQq -iQq -kLM -kLM -lNg -xMz -xMz -iQq -kLM -fKb -cwZ -kAw -kAw -hrk -kAw -puZ +oQl +oQl +lSU +rHO +rHO +fgK +lSU +chU +gAV +gAV +gAV +gAV +gAV +chU +fNE +aeP +miD +aiV +asz +rZt +rZt +rZt +rZt +flN +pxA +fXX +bJj +jrg +bJj +bJj +bJj +bJj +bJj +osE +pxA +wnK +wnK +pxA +pxA +pxA +pxA +pxA +mwF +chU +mwF +pxA puZ puZ puZ @@ -59430,56 +59405,56 @@ mIL mIL iMb iMb +oQl +iMb iMb iMb oQl oQl -oQl -oQl -fQX -fQX -jAL -fQX -jAL -xMz -aDM -uqb -uqb -uqb -kLM -gGH -iQq -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -kLM -cQW -cQW -cQW -cQW -kLM -gGH -cQW -kLM -uqb -lNg -erj -kLM -tcp -iQq -fKb -cwZ -kAw -kAw -hrk -sax -puZ +lSU +lSU +lSU +lSU +lSU +chU +gAV +rZt +dTU +dTU +dTU +rZt +fNE +aeC +rZt +aeR +asz +wnK +dwQ +wnK +wnK +wnK +dwQ +bJj +bJj +jrg +jrg +bJj +osE +jrg +jrg +jrg +pxA +wnK +wnK +pxA +pxA +pxA +pxA +pxA +vKu +vKu +vKu +pxA puZ puZ puZ @@ -59589,59 +59564,59 @@ pQE mIL iMb iMb -vpD -vpD -vpD -ccu -ols +iMb +iMb +iMb oQl +iMb +iMb +iMb +iMb oQl oQl oQl -fQX -jAL -pqj -jAL -fQX -xMz -aDM -uqb -uqb -kLM -iQq -iQq -iQq -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -kLM -cQW -iQq -kLM -kLM -wgM -kLM -ath -iQq -fKb -cwZ -kAw -sax -sax -sax -puZ +oQl +oQl +asz +chU +gAV +chU +asz +asz +aed +asz +asz +aez +mRU +aeQ +asz +asz +rZt +flN +rZt +dwQ +flN +flN +amu +bJj +jrg +jrg +jrg +jrg +jrg +jrg +pxA +wnK +wnK +pxA +pxA +pxA +pxA +pxA +mwF +chU +mwF +pxA puZ puZ puZ @@ -59749,61 +59724,61 @@ pQE pQE mIL fQX +jAL +iMb +iMb +iMb +iMb +iMb +iMb +jAL +iMb +iMb iMb iMb -vpD -vpD -qFx -oQl -oQl -oQl oQl oQl oQl -fQX -jAL -pqj -jAL -fQX -xMz -uqb -uqb -uqb -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -iQq -kLM -kLM -lNg -uqb -kLM -kLM -fKb -kAw -kAw -sax -sax -sax -puZ +asz +rZH +gAV +chU +adW +aeb +rZt +miD +miD +adi +aCB +asz +asz +asz +asz +wnK +wnK +wnK +wnK +dwQ +flN +jrg +jrg +jrg +jrg +jrg +pxA +pxA +pxA +wnK +wnK +vKu +wnK +hfw +wnK +rZt +mwF +chU +mwF +pxA puZ puZ puZ @@ -59913,60 +59888,60 @@ fQX jAL fQX iMb -ben -vpD -vpD -oQl -oQl -oQl -oQl -oQl -oQl -oQl -fQX jAL -fQX -fQX -xMz -uqb -uqb -kLM -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -iQq -iQq -iQq -kLM -kLM -ath -aDM -kLM -sax -sax -sax -sax -sax -sax -sax -puZ -puZ +iMb +iMb +iMb +iMb +jAL +iMb +iMb +iMb +jAL +jAL +iMb +oQl +asz +chU +gAV +chU +adV +rZt +rZt +rZt +rZt +rZt +mOu +asz +asz +asz +asz +asz +rZt +flN +rZt +rZt +dwQ +pxA +pxA +pxA +jrg +jrg +pxA +mWE +pJA +wnK +mwF +mwF +mwF +mwF +vKu +bJi +bJi +chU +mwF +pxA +flN puZ puZ puZ @@ -60069,67 +60044,67 @@ fQX iMb iMb iMb -iMb +jAL fQX jAL fQX jAL jAL -vpD -ben -vpD -oQl -oQl -oQl -oQl -oQl +iMb +jAL +iMb +iMb +iMb +iMb +iMb +iMb +jDv +jDv +jDv +jDv oQl -vAp -mhl -fQX -mhl -vAp -xMz -uqb -kLM -iQq -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -boD -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -iQq -iQq -iQq -iQq -iQq -kLM -lMO -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +asz +chU +gAV +chU +adT +rZt +rZt +rZt +rZt +mRU +aex +asz +nVn +iCJ +pxA +pxA +pxA +wnK +wnK +wnK +wnK +jXM +wnK +pxA +jrg +jrg +pxA +nHH +pDp +wnK +flN +flN +flN +flN +flN +mwF +rZt +rZt +mwF +pxA +kTd +kTd puZ puZ puZ @@ -60240,59 +60215,59 @@ pqj jAL iMb iMb -oQl -oQl -oQl -oQl -oQl -oQl -aUP -fQX -jAL iMb -xMz -xMz -kLM -uqb -kLM -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -iQq -iQq -kLM -kLM -uqb -kLM -uqb -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +iMb +iMb +iMb +iMb +jDv +asz +asz +asz +asz +asz +chU +gAV +chU +adS +aea +ptr +aew +aew +aex +asz +asz +lXy +nxA +vKu +vKu +bUe +rZt +chU +rZt +chU +dwQ +wnK +pxA +pxA +pxA +pxA +nzf +wnK +wnK +aQm +aXc +aXI +bbG +flN +mwF +chU +bJi +bJi +wBf +flN +kTd +kTd puZ puZ puZ @@ -60402,59 +60377,59 @@ pqj jAL jAL iMb -oQl -oQl -oQl -oQl -oQl -aTr +iMb iMb iMb jAL iMb -xMz -xMz -aDM -uqb -kLM -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -kLM -kLM -kLM -aDM -aDM -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +jDv +asz +dAt +sNX +dAt +rZt +chU +gAV +chU +asz +asz +asz +asz +asz +asz +asz +asz +pxA +vdS +wnK +vKu +pxA +pxA +ahu +wnK +wnK +wnK +wnK +jXM +uYt +pxA +pxA +nrr +wnK +wnK +aPe +act +acA +bah +flN +mwF +chU +bJi +rZt +flN +flN +rZt +flN puZ puZ puZ @@ -60564,59 +60539,59 @@ pqj jAL jAL cKL -jAL -oQl oQl -cKL -cKL -jAL iMb -jAL -jAL -pDH -xMz -xMz -aDM -uqb -uqb -kLM -iQq -iQq -iQq -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -kLM -cQW -iQq -kLM -kLM -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +iMb +iMb +iMb +oQl +asz +gha +rZt +sNX +rZt +chU +gAV +chU +rZt +asz +wqc +tOq +hXQ +asz +goj +goj +pxA +vKu +wnK +wnK +cSn +pxA +pxA +sIX +chU +rZt +chU +rZt +wnK +pxA +pxA +nmT +pve +wnK +aPd +aRz +aXi +bag +flN +mwF +chU +mwF +flN +wBf +pxA +pxA +kTd puZ puZ puZ @@ -60726,60 +60701,60 @@ pqj pqj jAL jAL -fQX -aOk -aQh -rxF -wuw -iMb +oQl +oQl +oQl iMb jAL -onF -qRV -mIL -xMz -xMz -aDM -uqb -kLM -kLM -gGH -iQq -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -cQW -iQq -cQW -cQW -cQW -cQW -kLM -gGH -cQW -iQq -kLM -uqb -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +oQl +asz +dAt +sNX +dAt +rZt +chU +gAV +chU +rZt +bXo +biM +biM +biM +goj +xJA +goj +bXo +vKu +soj +wnK +wnK +cSn +pxA +pxA +pxA +wnK +wnK +wnK +wnK +wnK +pxA +kRV +pEv +wnK +flN +flN +flN +flN +flN +mwF +chU +fww +sNX +dAt +rZt +pxA +kTd +flN puZ puZ puZ @@ -60888,60 +60863,60 @@ pqj pqj pqj iMb -jAL -aOl -oCk -jAL -jJf -jAL -jAL -iMb -iMb -kVs -bbF -xMz -xMz -uqb -uqb -kLM -kLM -gCx -iQq -iQq -cQW -cQW -cQW -iQq -iQq -iQq -gGH -iQq -iQq -cQW -cQW -cQW -cQW -kLM -iQq -iQq -iQq -kLM -uqb -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +oQl +oQl +oQl +oQl +oQl +oQl +asz +rZt +bgC +rZt +rZt +chU +gAV +chU +rZt +asz +biM +biM +biM +goj +lpA +uWA +pxA +tNP +lFp +jcv +fqJ +cSn +pxA +pxA +pxA +rZH +rZt +chU +rZt +rZt +pxA +pxA +pxA +wnK +mwF +mwF +mwF +mwF +vKu +mwF +chU +uOR +uuN +acP +flN +pxA +flN +kTd puZ puZ puZ @@ -61050,60 +61025,60 @@ jAL pqj pqj pqj -pqj -jAL -iMb -aRo -jAL -pqj -iMb -jAL -iMb -jAL -jAL -jAL -kvQ -uqb -dgG -kLM -kLM -kLM -kLM -kLM -iQq -iQq -iQq -iQq -iQq -iQq -iQq -iQq -iQq -iQq -iQq -iQq -iQq -iQq -gCx -kLM -kLM -uqb -kLM -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +oQl +oQl +oQl +oQl +oQl +oQl +asz +eaa +rZt +rZt +rZt +chU +gAV +chU +iaK +kTI +biM +xtI +qOd +goj +wnK +goj +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA +wnK +wnK +wnK +wnK +wnK +pxA +rZt +vKu +vKu +wnK +vKu +wnK +vKu +wnK +bJi +chU +fww +sNX +dAt +flN +rZt +flN +kTd puZ puZ puZ @@ -61212,61 +61187,61 @@ jAL jAL pqj pqj -pqj -pqj -jAL -jAL -iMb -aTt -iMb -iMb -iMb -fQX -jAL -jAL -kvQ -oUu -uqb -kLM -kLM -uqb -iQq -gCx -kLM -uqb -kLM -iQq -iQq -kLM -kLM -kLM -kLM -kLM -iQq -iQq -kLM -kLM -kLM -uqb -uqb -uqb -kLM -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +oQl +oQl +oQl +oQl +oQl +oQl +asz +rZt +byr +rZt +rZt +chU +gAV +chU +iaK +feA +biM +biM +biM +uuv +yhX +goj +pxA +rZt +dTU +osV +dTU +dTU +dTU +rZt +kap +rZt +crF +crF +crF +wnK +vKu +wnK +chU +rZt +chU +rZt +chU +rZt +chU +rZt +chU +mwF +bgC +flN +flN +rZt +flN +kTd +flN puZ puZ "} @@ -61374,61 +61349,61 @@ jAL jAL jAL pqj -pqj -pqj -pqj -pqj -aSF -aTw -iMb -iMb -jAL -pqj -jAL -pqj -iQq -iQq -iQq -iQq -uqb -uqb -uqb -uqb -kLM -kLM -iQq -gCx -uqb -uqb -qkI -iQq -kLM -kLM -kLM -kLM -gCx -kLM -uqb -uqb -aDM -upf -aDM -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +oQl +oQl +oQl +oQl +oQl +oQl +asz +wFB +eSt +wFB +dTU +rZt +gAV +rZt +txX +kRj +qOZ +cEj +qOZ +goj +fwv +goj +bXo +chU +kQJ +vKu +wnK +vKu +wnK +vKu +kap +rZt +crF +crF +crF +wnK +vKu +wnK +chU +rZt +chU +rZt +chU +rZt +chU +rZt +chU +mwF +byr +rZt +rZt +xun +flN +kTd +kue puZ puZ "} @@ -61536,61 +61511,61 @@ aKk lyh rxF wcF -pqj -aOp -pqj -pqj -fQX -iMb -iMb -jAL +oQl +oQl +oQl iMb iMb -jAL -jAL -kvQ -iOu -kLM -kLM -kLM -kLM -kLM -uqb -uqb -uqb -uqb -kLM -iQq -uqb -uqb -kLM -kLM -kLM -uqb -uqb -uqb -uqb -kLM -uqb -kLM -aDM -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +rib +asz +gha +uuN +sNX +rZt +chU +gAV +chU +rZt +asz +dnH +jft +ghS +asz +goj +goj +pxA +rZH +vKu +ghU +pxA +vQm +vFX +pxA +pxA +wnK +wnK +wnK +wnK +wnK +pxA +rZt +vKu +vKu +wnK +vKu +wnK +vKu +wnK +bJi +chU +fww +gaJ +dAt +rZt +rZt +flN +flN +kTd puZ puZ "} @@ -61694,65 +61669,65 @@ gkv gkv puZ puZ -aKn +jAL rMb iMb jJf -pqj -pqj -cKL -cKL -fQX -iMb -fQX iMb iMb iMb jAL -jAL -kvQ -uqb -aDM -uqb -uqb -uqb -uqb -uqb -uqb -qza -kLM -hXX -kLM -cko -rLu -nMR -kLM -uqb -uqb -aDM -xvb -uqb -uqb -uqb -aDM -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +iMb +rib +asz +wFB +eSt +wFB +dTU +rZt +gAV +rZt +dTU +asz +asz +asz +asz +asz +goj +goj +fNE +chU +wnK +pxA +pxA +pxA +pxA +pxA +pxA +mcw +rZt +chU +rZt +chU +pxA +pxA +pxA +wnK +mwF +mwF +mwF +mwF +vKu +mwF +chU +uOR +rZt +acP +flN +pxA +flN +flN +kue puZ puZ "} @@ -61860,61 +61835,61 @@ aKn jAL jAL jAL -pqj -cKL -iMb -fQX -cKL -aTH +jAL iMb iMb -hJd iMb iMb -puZ -puZ -puZ -puZ -eaB -eaB -gJk -hIn -aDM -uqb -uqb -uqb -uqb -mfa -jqx -slO -nNl -nMR -uqb -aDM -kLM -kLM -xvb -uqb -aDM -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +rib +asz +asz +asz +asz +asz +wnK +wnK +wnK +wnK +wnK +rZt +rZt +asz +wTm +biM +biM +fNE +chU +vKu +vQm +pxA +rZt +iQe +wnK +gFb +nMk +chU +rZt +chU +rZt +fNE +mWE +pDu +wnK +flN +flN +flN +flN +flN +mwF +chU +fww +sNX +dAt +flN +pxA +flN +flN +kue puZ puZ "} @@ -62022,61 +61997,61 @@ jAL jAL jAL jAL -pqj jAL iMb -aRp -lyh -rxF -wuw -aVW -fQX iMb -cKL -puZ -puZ -puZ -puZ -slO -slO -slO -aKP -aMn -puZ -kfl -eGe -rnO -qza -mNs -slO -slO -ofl -uqb -xvb -kGW -aDM -uqb -uqb -uqb -aDM -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +jAL +jAL +oQl +oQl +oQl +asz +asz +asz +goj +goj +djO +goj +wnK +rZt +rZt +fNE +nPH +biM +biM +fNE +chU +wnK +vFX +pxA +iQe +qaF +chU +kyu +drx +rZt +chU +rZt +chU +fNE +mHU +pDp +wnK +aQm +aXc +aXI +bbG +flN +mwF +chU +mwF +rZt +flN +rZt +flN +flN +flN +kue puZ puZ "} @@ -62184,61 +62159,61 @@ puZ aLD aMv jAL +oQl +oQl +oQl +oQl jAL -iMb -cKL -iMb -rMb -iMb -fqb -jAL -iMb -cKL -iMb -puZ -puZ -puZ -puZ -puZ -slO -slO -slO -slO -puZ -lLv -cQW -rbA -uqb -mNs -xMz -slO -ofl -uqb -uqb -aDM -uqb -uqb -uqb -uqb -riV -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +oQl +oQl +oQl +asz +iqt +rZt +goj +axa +hVs +djO +dBB +rZt +rZt +fNE +sdF +biM +biM +fNE +rZt +vKu +pxA +pxA +rZt +hEE +chU +gFb +sfM +oHF +wnK +wnK +wnK +pxA +lYG +wnK +wnK +aPe +aSJ +aXn +bah +flN +mwF +chU +mwF +flN +rZt +rZt +flN +flN +kTd +kue puZ puZ "} @@ -62346,61 +62321,61 @@ puZ puZ puZ jAL +oQl +oQl +oQl +oQl jAL -cKL -fQX -iMb -aSG -aTL -fQX -iMb -fQX -cKL -puZ -puZ -puZ -puZ -puZ -puZ -slO -slO -slO -puZ -puZ -mev -cQW -rbA -aDM -mOv -niL -niL -oqH -uqb -uqb -uqb -uqb -uqb -uqb -aDM -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -jCE -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +oQl +oQl +oQl +asz +bNu +rZt +djO +qCs +pPt +goj +wnK +qyE +wnK +asz +fNE +fNE +fNE +pxA +xvS +xvS +pxA +pxA +iQe +qaF +chU +pxA +pxA +pxA +vKu +vKu +vKu +pxA +lGU +wnK +wnK +aPd +aRz +aXi +bag +flN +mwF +chU +mwF +rZt +flN +flN +pxA +flN +kTd +kue puZ puZ "} @@ -62510,59 +62485,59 @@ puZ puZ puZ puZ -cKL -fQX -iMb -iMb -iMb -cKL -iMb -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -uqb -uqb -uqb -kLM -uqb -uqb -uqb -aDM -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -hFl -jLx -iWS -jCE -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +oQl +oQl +oQl +oQl +oQl +oQl +asz +iIe +rZt +goj +fHM +rZt +goj +wnK +rZt +vKu +vKu +vKu +vKu +vKu +vKu +vKu +toN +vKu +vKu +dgF +hEE +wnK +pxA +pxA +pxA +wnK +wnK +wnK +pxA +hQO +pve +wnK +flN +wAP +flN +dJS +flN +mwF +chU +mwF +rZt +rZt +wBf +pxA +kTd +kue +flN puZ puZ "} @@ -62673,57 +62648,57 @@ puZ puZ puZ puZ -cKL -fQX -cKL -cKL -iMb -fQX -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -snN -uqb -uqb -aDM -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -oaP -jCE -jCE -jCE -jCE -acO -puZ -puZ -puZ -puZ -puZ -puZ +oQl +oQl +oQl +oQl +oQl +asz +asz +rZt +goj +rZt +rZt +goj +wnK +xEB +vKu +wnK +rZt +rZt +eFQ +rZt +rZt +wnK +vKu +vKu +vKu +vKu +vKu +jqT +pxA +ctk +cVy +chU +mwF +pxA +kRV +kVe +wnK +mwF +mwF +yiS +mwF +vKu +mwF +chU +mwF +rZt +flN +flN +flN +kTd +kTd puZ puZ puZ @@ -62837,55 +62812,55 @@ puZ puZ puZ puZ -fQX -iMb -fQX -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -aDM -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -hFl -jCE -jCE -acM -jCE -jCE -puZ -puZ -puZ -puZ -puZ +oQl +oQl +oQl +asz +tqs +rZt +goj +rZt +fHM +goj +wnK +rZt +vKu +wnK +rZt +rZt +wnK +rZt +rZt +wnK +vKu +vKu +vKu +vKu +vKu +bqy +pxA +ugP +mwF +chU +mwF +pxA +pxA +pxA +pxA +wnK +vKu +xIL +vKu +wnK +bJi +chU +bJi +rZt +twi +flN +flN +kue +flN puZ puZ puZ @@ -63002,51 +62977,51 @@ puZ puZ puZ puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -hFl -jCE -jCE -jCE -puZ -puZ -puZ -puZ -puZ +asz +wgp +rZt +goj +qNK +hrb +goj +wnK +rZt +vKu +lkX +ift +sQU +vKu +sQU +ift +lkX +rhS +oqQ +oqQ +lNm +vKu +pxA +pxA +ctk +mwF +chU +bJi +euA +euA +euA +bJi +euA +euA +euA +euA +bJi +bJi +chU +mwF +rZt +twi +kue +kTd +flN puZ puZ puZ @@ -63164,50 +63139,50 @@ puZ puZ puZ puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -hFl -hFl -puZ -puZ -puZ -puZ -puZ +asz +fjd +rZt +djO +kts +wAM +djO +asz +pxA +pxA +ift +smI +hUG +vKu +udJ +euA +ift +pKP +nNN +kZy +pKP +vKu +uLu +pxA +pxA +bJi +rZt +dTU +dTU +dTU +dTU +rZt +dTU +dTU +dTU +dTU +rZt +dTU +rZt +mwF +rZt +pxA +kTd +kTd puZ puZ puZ @@ -63326,48 +63301,48 @@ puZ puZ puZ puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +asz +asz +asz +goj +djO +goj +goj +asz +pxA +pxA +lkX +ffw +uim +vKu +uim +ffw +lkX +vKu +vKu +vKu +vKu +vKu +uLu +pxA +pxA +bJi +bJi +euA +vPR +euA +euA +bJi +euA +euA +vPR +euA +bJi +euA +euA +bJi +rZt +pxA puZ puZ puZ @@ -63490,46 +63465,46 @@ puZ puZ puZ puZ +asz +asz +asz +asz +asz +asz puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +pxA +ueu +mMa +euA +vKu +euA +euA +vKu +rhS +oqQ +oqQ +rhS +ueu +pxA +pxA +pxA +pxA +pxA +sym +ctk +ugP +pxA +pxA +xwi +thc +ckI +dTn +pxA +pxA +rZt +rZt +rZt +pxA puZ puZ puZ @@ -63659,39 +63634,39 @@ puZ puZ puZ puZ +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA puZ puZ puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ -puZ +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA +pxA puZ puZ puZ diff --git a/maps/map_files/New_Varadero/New_Varadero.dmm b/maps/map_files/New_Varadero/New_Varadero.dmm index a56328df85f0..c6131febd8f5 100644 --- a/maps/map_files/New_Varadero/New_Varadero.dmm +++ b/maps/map_files/New_Varadero/New_Varadero.dmm @@ -6074,10 +6074,7 @@ pixel_x = -7; pixel_y = 8 }, -/obj/item/tool/lighter/zippo{ - icon_off = "blackzippo"; - icon_on = "blackzippoon"; - icon_state = "blackzippo"; +/obj/item/tool/lighter/zippo/black{ pixel_x = -5; pixel_y = 7 }, diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index 26c9816ca0c3..d637d1fa9b91 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -13828,10 +13828,7 @@ /obj/structure/machinery/photocopier{ anchored = 0 }, -/obj/structure/sign/poster{ - desc = "A large piece of cheap printed paper. This one proudly demands that you REMEMBER IO!"; - icon_state = "poster14"; - name = "propaganda poster"; +/obj/structure/sign/poster/art{ pixel_y = 32 }, /turf/open/floor/wood/ship, @@ -17731,11 +17728,9 @@ }, /area/almayer/squads/req) "bEt" = ( -/obj/structure/machinery/light{ - dir = 1 - }, -/obj/structure/sign/safety/commline_connection{ - pixel_y = 32 +/obj/structure/noticeboard{ + pixel_x = -10; + pixel_y = 31 }, /turf/open/floor/almayer{ dir = 5; @@ -28870,13 +28865,8 @@ /obj/structure/bed/chair{ dir = 1 }, -/obj/structure/sign/poster{ - desc = "Koorlander Golds, lovingly machine rolled for YOUR pleasure."; - icon_state = "poster10"; - name = "Koorlander Gold Poster"; - pixel_x = 29; - pixel_y = 6; - serial_number = 10 +/obj/structure/sign/poster/ad{ + pixel_x = 30 }, /turf/open/floor/wood/ship, /area/almayer/command/corporateliaison) @@ -30742,14 +30732,13 @@ /turf/open/floor/almayer, /area/almayer/engineering/upper_engineering/port) "eNw" = ( -/obj/structure/machinery/atm{ - name = "Weyland-Yutani Automatic Teller Machine"; - pixel_y = 30 - }, /obj/structure/surface/table/almayer, /obj/item/spacecash/c1000/counterfeit, /obj/item/storage/box/drinkingglasses, /obj/item/storage/fancy/cigar, +/obj/structure/machinery/atm{ + pixel_y = 32 + }, /turf/open/floor/almayer, /area/almayer/command/corporateliaison) "eNx" = ( @@ -34672,6 +34661,10 @@ phone_id = "Medical Lower"; pixel_x = 16 }, +/obj/item/device/helmet_visor/medical/advanced, +/obj/item/device/helmet_visor/medical/advanced, +/obj/item/device/helmet_visor/medical/advanced, +/obj/item/device/helmet_visor/medical/advanced, /turf/open/floor/almayer{ icon_state = "sterile_green" }, @@ -34821,6 +34814,7 @@ /obj/structure/surface/table/almayer, /obj/item/storage/firstaid/regular, /obj/item/clipboard, +/obj/item/tool/pen, /turf/open/floor/almayer{ icon_state = "plate" }, @@ -37220,15 +37214,12 @@ /obj/structure/flora/pottedplant{ icon_state = "pottedplant_21" }, -/obj/structure/sign/poster{ - desc = "A large piece of cheap printed paper. This one proudly demands that you REMEMBER IO!"; - icon_state = "poster14"; - name = "propaganda poster"; - pixel_y = 32 - }, /obj/structure/sign/safety/escapepod{ pixel_x = -17 }, +/obj/structure/sign/poster/hero/voteno{ + pixel_y = 32 + }, /turf/open/floor/wood/ship, /area/almayer/command/corporateliaison) "hqU" = ( @@ -41181,6 +41172,10 @@ /obj/structure/machinery/prop/almayer/computer/PC{ dir = 4 }, +/obj/item/tool/stamp/approved{ + pixel_y = -11; + pixel_x = -3 + }, /turf/open/floor/almayer, /area/almayer/squads/req) "iVo" = ( @@ -48294,6 +48289,7 @@ /obj/structure/surface/table/almayer, /obj/effect/spawner/random/toolbox, /obj/item/clipboard, +/obj/item/tool/pen, /turf/open/floor/almayer{ dir = 8; icon_state = "green" @@ -59729,8 +59725,8 @@ "pWA" = ( /obj/structure/machinery/disposal, /obj/structure/disposalpipe/trunk, -/obj/structure/sign/safety/storage{ - pixel_x = -17 +/obj/structure/machinery/light{ + dir = 8 }, /turf/open/floor/almayer{ dir = 8; @@ -65349,6 +65345,14 @@ /obj/structure/pipes/vents/scrubber{ dir = 4 }, +/obj/structure/sign/safety/storage{ + pixel_y = 7; + pixel_x = -17 + }, +/obj/structure/sign/safety/commline_connection{ + pixel_x = -17; + pixel_y = -7 + }, /turf/open/floor/almayer{ dir = 8; icon_state = "green" @@ -67519,7 +67523,7 @@ /area/almayer/command/cic) "sSP" = ( /obj/structure/flora/pottedplant{ - icon_state = "pottedplant_21" + icon_state = "pottedplant_29" }, /turf/open/floor/wood/ship, /area/almayer/command/corporateliaison) @@ -70165,18 +70169,13 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/hangar) "tQM" = ( -/obj/structure/sign/poster{ - desc = "One of those hot, tanned babes back the beaches of good ol' Earth."; - icon_state = "poster12"; - name = "Beach Babe Pinup"; - pixel_x = -30; - pixel_y = 6; - serial_number = 12 - }, /obj/effect/decal/warning_stripes{ icon_state = "E"; pixel_x = 1 }, +/obj/structure/sign/poster/pinup{ + pixel_x = -30 + }, /turf/open/floor/almayer{ icon_state = "dark_sterile" }, @@ -123626,7 +123625,7 @@ bdl lOr lOr iwI -lOr +bdl bdl bEt bNP diff --git a/maps/prison_station_fop.json b/maps/prison_station_fop.json index f2c22dbe4bb8..69469ea2fd03 100644 --- a/maps/prison_station_fop.json +++ b/maps/prison_station_fop.json @@ -3,14 +3,14 @@ "map_path": "map_files/FOP_v2_Cellblocks", "map_file": "Prison_Station_FOP.dmm", "survivor_types": [ - "/datum/equipment_preset/survivor/scientist/florina", - "/datum/equipment_preset/survivor/doctor/florina", + "/datum/equipment_preset/survivor/scientist/fiorina", + "/datum/equipment_preset/survivor/doctor/fiorina", "/datum/equipment_preset/survivor/interstellar_human_rights_observer", - "/datum/equipment_preset/survivor/security/florina", + "/datum/equipment_preset/survivor/security/fiorina", "/datum/equipment_preset/survivor/prisoner", "/datum/equipment_preset/survivor/prisoner", "/datum/equipment_preset/survivor/gangleader", - "/datum/equipment_preset/survivor/engineer/florina", + "/datum/equipment_preset/survivor/engineer/fiorina", "/datum/equipment_preset/survivor/clf", "/datum/equipment_preset/survivor/civilian" ], diff --git a/maps/tutorial/tutorial_12x12.dmm b/maps/tutorial/tutorial_12x12.dmm new file mode 100644 index 000000000000..a682957ea702 --- /dev/null +++ b/maps/tutorial/tutorial_12x12.dmm @@ -0,0 +1,180 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall/almayer/outer, +/area/misc/tutorial) +"z" = ( +/turf/open/floor/almayer, +/area/misc/tutorial) +"R" = ( +/obj/effect/landmark/tutorial_bottom_left, +/turf/open/floor/almayer, +/area/misc/tutorial) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +z +z +z +z +z +z +z +z +z +R +a +"} +(3,1,1) = {" +a +z +z +z +z +z +z +z +z +z +z +a +"} +(4,1,1) = {" +a +z +z +z +z +z +z +z +z +z +z +a +"} +(5,1,1) = {" +a +z +z +z +z +z +z +z +z +z +z +a +"} +(6,1,1) = {" +a +z +z +z +z +z +z +z +z +z +z +a +"} +(7,1,1) = {" +a +z +z +z +z +z +z +z +z +z +z +a +"} +(8,1,1) = {" +a +z +z +z +z +z +z +z +z +z +z +a +"} +(9,1,1) = {" +a +z +z +z +z +z +z +z +z +z +z +a +"} +(10,1,1) = {" +a +z +z +z +z +z +z +z +z +z +z +a +"} +(11,1,1) = {" +a +z +z +z +z +z +z +z +z +z +z +a +"} +(12,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/maps/tutorial/tutorial_7x7.dmm b/maps/tutorial/tutorial_7x7.dmm new file mode 100644 index 000000000000..4297ef72ab8b --- /dev/null +++ b/maps/tutorial/tutorial_7x7.dmm @@ -0,0 +1,75 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall/almayer/outer, +/area/misc/tutorial) +"z" = ( +/turf/open/floor/almayer, +/area/misc/tutorial) +"R" = ( +/obj/effect/landmark/tutorial_bottom_left, +/turf/open/floor/almayer, +/area/misc/tutorial) + +(1,1,1) = {" +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +z +z +z +z +R +a +"} +(3,1,1) = {" +a +z +z +z +z +z +a +"} +(4,1,1) = {" +a +z +z +z +z +z +a +"} +(5,1,1) = {" +a +z +z +z +z +z +a +"} +(6,1,1) = {" +a +z +z +z +z +z +a +"} +(7,1,1) = {" +a +a +a +a +a +a +a +"} diff --git a/maps/tutorial/tutorial_8x9.dmm b/maps/tutorial/tutorial_8x9.dmm new file mode 100644 index 000000000000..fc0cdd7a3e48 --- /dev/null +++ b/maps/tutorial/tutorial_8x9.dmm @@ -0,0 +1,100 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall/almayer/outer, +/area/misc/tutorial) +"z" = ( +/turf/open/floor/almayer, +/area/misc/tutorial) +"R" = ( +/obj/effect/landmark/tutorial_bottom_left, +/turf/open/floor/almayer, +/area/misc/tutorial) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +z +z +z +z +z +z +R +a +"} +(3,1,1) = {" +a +z +z +z +z +z +z +z +a +"} +(4,1,1) = {" +a +z +z +z +z +z +z +z +a +"} +(5,1,1) = {" +a +z +z +z +z +z +z +z +a +"} +(6,1,1) = {" +a +z +z +z +z +z +z +z +a +"} +(7,1,1) = {" +a +z +z +z +z +z +z +z +a +"} +(8,1,1) = {" +a +a +a +a +a +a +a +a +a +"} diff --git a/maps/tutorial/tutorial_8x9_nb.dmm b/maps/tutorial/tutorial_8x9_nb.dmm new file mode 100644 index 000000000000..2e03d5162f65 --- /dev/null +++ b/maps/tutorial/tutorial_8x9_nb.dmm @@ -0,0 +1,100 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall/almayer/outer, +/area/misc/tutorial/no_baselight) +"z" = ( +/turf/open/floor/almayer, +/area/misc/tutorial/no_baselight) +"R" = ( +/obj/effect/landmark/tutorial_bottom_left, +/turf/open/floor/almayer, +/area/misc/tutorial/no_baselight) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +z +z +z +z +z +z +R +a +"} +(3,1,1) = {" +a +z +z +z +z +z +z +z +a +"} +(4,1,1) = {" +a +z +z +z +z +z +z +z +a +"} +(5,1,1) = {" +a +z +z +z +z +z +z +z +a +"} +(6,1,1) = {" +a +z +z +z +z +z +z +z +a +"} +(7,1,1) = {" +a +z +z +z +z +z +z +z +a +"} +(8,1,1) = {" +a +a +a +a +a +a +a +a +a +"} diff --git a/strings/marinetips.txt b/strings/marinetips.txt index 416c9ef0a4dd..89c55ab6d698 100644 --- a/strings/marinetips.txt +++ b/strings/marinetips.txt @@ -85,7 +85,7 @@ Any marine can perform CPR. On dead marines, this will increase the time they ha If you've been pounced on and your squad is unloading into the target, you can hit the 'rest' button to stay down so you don't get filled with lead after getting up. You can check the landing zone as a marine in the status panel. The Colonial Marshals may come to crack down on too heavy of a Black Market usage. -Functioning night vision goggles can be recharged with batteries. Broken night vision goggles can be repaired by an Engineer with a screwdriver. Not the loadout ones though, those cannot be fixed. +A night vision HUD optic can be recharged by removing it with a screwdriver, then placing it into a recharger. You can put a pistol belt on your suit slot. (Just grab a rifle instead.) Alt-clicking the Squad Leader tracker lets you track your fireteam leader instead. Armor has a randomized reduction in effectiveness, and does not protect the digits. Take the wiki damage values as a best-case scenario. diff --git a/strings/xenotips.txt b/strings/xenotips.txt index 8674146de655..04a6fe46ae65 100644 --- a/strings/xenotips.txt +++ b/strings/xenotips.txt @@ -24,7 +24,7 @@ If you have difficulty clicking marines, try using Directional Slashing, though You can diagonally pounce through the corners of fire as a Lurker or Runner without getting ignited. When playing as Xeno, consider aiming at the limbs instead of the chest. Marine armor doesn't protect the arms and legs as well as it does the body. As Xeno, you can break Night-Vision goggles that some marines wear on their helmets. Just aim for the head and slash until the goggles shatter. -Pounces are ineffective on marines who are laying down. +You can dodge pounces that aren't aimed directly at you by laying down. You may rest immediately during a pounce to pounce straight through mobs. It's not very practical or useful though. Pouncing someone who is buckled to a chair will still stun them, but you won't jump into their tile and they will not be knocked to the ground. Star shell dust from said grenades is just as meltable as normal flares. diff --git a/tgui/packages/tgui-panel/chat/constants.js b/tgui/packages/tgui-panel/chat/constants.js index ac9346d8d5f0..020e8513dc2c 100644 --- a/tgui/packages/tgui-panel/chat/constants.js +++ b/tgui/packages/tgui-panel/chat/constants.js @@ -24,6 +24,7 @@ export const MESSAGE_TYPE_INTERNAL = 'internal'; export const MESSAGE_TYPE_SYSTEM = 'system'; export const MESSAGE_TYPE_LOCALCHAT = 'localchat'; export const MESSAGE_TYPE_RADIO = 'radio'; +export const MESSAGE_TYPE_HIVEMIND = 'hivemind'; export const MESSAGE_TYPE_INFO = 'info'; export const MESSAGE_TYPE_WARNING = 'warning'; export const MESSAGE_TYPE_HELPFUL = 'helpful'; @@ -62,7 +63,13 @@ export const MESSAGE_TYPES = [ type: MESSAGE_TYPE_RADIO, name: 'Radio', description: 'All departments of radio messages', - selector: '.radio, .xeno, .xenoqueen, .xenoleader, .alert, .newscaster', + selector: '.radio, .alert, .newscaster', + }, + { + type: MESSAGE_TYPE_HIVEMIND, + name: 'Hivemind', + description: 'Xenomorph hivemind messages', + selector: '.xeno, .xenoqueen, .xenoleader', }, { type: MESSAGE_TYPE_INFO, diff --git a/tgui/packages/tgui-panel/chat/renderer.js b/tgui/packages/tgui-panel/chat/renderer.js index fe175ee6d94e..7a528cd4fd75 100644 --- a/tgui/packages/tgui-panel/chat/renderer.js +++ b/tgui/packages/tgui-panel/chat/renderer.js @@ -235,6 +235,8 @@ class ChatRenderer { highlightWords.push(line); } } + const regexStr = regexExpressions.join('|'); + const flags = 'g' + (matchCase ? '' : 'i'); // We wrap this in a try-catch to ensure that broken regex doesn't break // the entire chat. try { diff --git a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss index a0dd2608befc..9e6d604bdf82 100644 --- a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss @@ -434,9 +434,9 @@ em { font-weight: bold; } -.minorannounce { +.bigannounce { font-weight: bold; - font-size: 185%; + font-size: 115%; } .greenannounce { diff --git a/tgui/packages/tgui-panel/styles/goon/chat-light.scss b/tgui/packages/tgui-panel/styles/goon/chat-light.scss index 07fc0504e890..78613d37ae51 100644 --- a/tgui/packages/tgui-panel/styles/goon/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/goon/chat-light.scss @@ -470,9 +470,9 @@ h2.alert { font-weight: bold; } -.minorannounce { +.bigannounce { font-weight: bold; - font-size: 185%; + font-size: 115%; } .greenannounce { diff --git a/tgui/packages/tgui/components/Blink.js b/tgui/packages/tgui/components/Blink.jsx similarity index 100% rename from tgui/packages/tgui/components/Blink.js rename to tgui/packages/tgui/components/Blink.jsx diff --git a/tgui/packages/tgui/components/BlockQuote.js b/tgui/packages/tgui/components/BlockQuote.jsx similarity index 100% rename from tgui/packages/tgui/components/BlockQuote.js rename to tgui/packages/tgui/components/BlockQuote.jsx diff --git a/tgui/packages/tgui/components/Button.js b/tgui/packages/tgui/components/Button.jsx similarity index 100% rename from tgui/packages/tgui/components/Button.js rename to tgui/packages/tgui/components/Button.jsx diff --git a/tgui/packages/tgui/components/ByondUi.js b/tgui/packages/tgui/components/ByondUi.jsx similarity index 100% rename from tgui/packages/tgui/components/ByondUi.js rename to tgui/packages/tgui/components/ByondUi.jsx diff --git a/tgui/packages/tgui/components/Chart.js b/tgui/packages/tgui/components/Chart.jsx similarity index 100% rename from tgui/packages/tgui/components/Chart.js rename to tgui/packages/tgui/components/Chart.jsx diff --git a/tgui/packages/tgui/components/Collapsible.js b/tgui/packages/tgui/components/Collapsible.jsx similarity index 100% rename from tgui/packages/tgui/components/Collapsible.js rename to tgui/packages/tgui/components/Collapsible.jsx diff --git a/tgui/packages/tgui/components/ColorBox.js b/tgui/packages/tgui/components/ColorBox.jsx similarity index 100% rename from tgui/packages/tgui/components/ColorBox.js rename to tgui/packages/tgui/components/ColorBox.jsx diff --git a/tgui/packages/tgui/components/Dimmer.js b/tgui/packages/tgui/components/Dimmer.jsx similarity index 100% rename from tgui/packages/tgui/components/Dimmer.js rename to tgui/packages/tgui/components/Dimmer.jsx diff --git a/tgui/packages/tgui/components/Divider.js b/tgui/packages/tgui/components/Divider.jsx similarity index 100% rename from tgui/packages/tgui/components/Divider.js rename to tgui/packages/tgui/components/Divider.jsx diff --git a/tgui/packages/tgui/components/DraggableControl.js b/tgui/packages/tgui/components/DraggableControl.jsx similarity index 100% rename from tgui/packages/tgui/components/DraggableControl.js rename to tgui/packages/tgui/components/DraggableControl.jsx diff --git a/tgui/packages/tgui/components/Dropdown.js b/tgui/packages/tgui/components/Dropdown.jsx similarity index 100% rename from tgui/packages/tgui/components/Dropdown.js rename to tgui/packages/tgui/components/Dropdown.jsx diff --git a/tgui/packages/tgui/components/Grid.js b/tgui/packages/tgui/components/Grid.jsx similarity index 100% rename from tgui/packages/tgui/components/Grid.js rename to tgui/packages/tgui/components/Grid.jsx diff --git a/tgui/packages/tgui/components/Icon.js b/tgui/packages/tgui/components/Icon.jsx similarity index 100% rename from tgui/packages/tgui/components/Icon.js rename to tgui/packages/tgui/components/Icon.jsx diff --git a/tgui/packages/tgui/components/InfinitePlane.js b/tgui/packages/tgui/components/InfinitePlane.jsx similarity index 100% rename from tgui/packages/tgui/components/InfinitePlane.js rename to tgui/packages/tgui/components/InfinitePlane.jsx diff --git a/tgui/packages/tgui/components/Input.js b/tgui/packages/tgui/components/Input.jsx similarity index 100% rename from tgui/packages/tgui/components/Input.js rename to tgui/packages/tgui/components/Input.jsx diff --git a/tgui/packages/tgui/components/Knob.js b/tgui/packages/tgui/components/Knob.jsx similarity index 100% rename from tgui/packages/tgui/components/Knob.js rename to tgui/packages/tgui/components/Knob.jsx diff --git a/tgui/packages/tgui/components/LabeledControls.js b/tgui/packages/tgui/components/LabeledControls.jsx similarity index 100% rename from tgui/packages/tgui/components/LabeledControls.js rename to tgui/packages/tgui/components/LabeledControls.jsx diff --git a/tgui/packages/tgui/components/Modal.js b/tgui/packages/tgui/components/Modal.jsx similarity index 100% rename from tgui/packages/tgui/components/Modal.js rename to tgui/packages/tgui/components/Modal.jsx diff --git a/tgui/packages/tgui/components/NoticeBox.js b/tgui/packages/tgui/components/NoticeBox.jsx similarity index 100% rename from tgui/packages/tgui/components/NoticeBox.js rename to tgui/packages/tgui/components/NoticeBox.jsx diff --git a/tgui/packages/tgui/components/NumberInput.js b/tgui/packages/tgui/components/NumberInput.jsx similarity index 100% rename from tgui/packages/tgui/components/NumberInput.js rename to tgui/packages/tgui/components/NumberInput.jsx diff --git a/tgui/packages/tgui/components/ProgressBar.js b/tgui/packages/tgui/components/ProgressBar.jsx similarity index 100% rename from tgui/packages/tgui/components/ProgressBar.js rename to tgui/packages/tgui/components/ProgressBar.jsx diff --git a/tgui/packages/tgui/components/RestrictedInput.js b/tgui/packages/tgui/components/RestrictedInput.jsx similarity index 100% rename from tgui/packages/tgui/components/RestrictedInput.js rename to tgui/packages/tgui/components/RestrictedInput.jsx diff --git a/tgui/packages/tgui/components/RoundGauge.js b/tgui/packages/tgui/components/RoundGauge.jsx similarity index 100% rename from tgui/packages/tgui/components/RoundGauge.js rename to tgui/packages/tgui/components/RoundGauge.jsx diff --git a/tgui/packages/tgui/components/Slider.js b/tgui/packages/tgui/components/Slider.jsx similarity index 100% rename from tgui/packages/tgui/components/Slider.js rename to tgui/packages/tgui/components/Slider.jsx diff --git a/tgui/packages/tgui/components/Table.js b/tgui/packages/tgui/components/Table.jsx similarity index 100% rename from tgui/packages/tgui/components/Table.js rename to tgui/packages/tgui/components/Table.jsx diff --git a/tgui/packages/tgui/components/Tabs.js b/tgui/packages/tgui/components/Tabs.jsx similarity index 100% rename from tgui/packages/tgui/components/Tabs.js rename to tgui/packages/tgui/components/Tabs.jsx diff --git a/tgui/packages/tgui/components/TextArea.js b/tgui/packages/tgui/components/TextArea.jsx similarity index 100% rename from tgui/packages/tgui/components/TextArea.js rename to tgui/packages/tgui/components/TextArea.jsx diff --git a/tgui/packages/tgui/components/TimeDisplay.js b/tgui/packages/tgui/components/TimeDisplay.jsx similarity index 100% rename from tgui/packages/tgui/components/TimeDisplay.js rename to tgui/packages/tgui/components/TimeDisplay.jsx diff --git a/tgui/packages/tgui/components/index.js b/tgui/packages/tgui/components/index.jsx similarity index 100% rename from tgui/packages/tgui/components/index.js rename to tgui/packages/tgui/components/index.jsx diff --git a/tgui/packages/tgui/debug/KitchenSink.js b/tgui/packages/tgui/debug/KitchenSink.jsx similarity index 95% rename from tgui/packages/tgui/debug/KitchenSink.js rename to tgui/packages/tgui/debug/KitchenSink.jsx index 246b4f50b478..e25751722c52 100644 --- a/tgui/packages/tgui/debug/KitchenSink.js +++ b/tgui/packages/tgui/debug/KitchenSink.jsx @@ -8,7 +8,7 @@ import { useLocalState } from '../backend'; import { Flex, Section, Tabs } from '../components'; import { Pane, Window } from '../layouts'; -const r = require.context('../stories', false, /\.stories\.js$/); +const r = require.context('../stories', false, /\.stories\.jsx$/); /** * @returns {{ diff --git a/tgui/packages/tgui/interfaces/AcidVest.js b/tgui/packages/tgui/interfaces/AcidVest.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/AcidVest.js rename to tgui/packages/tgui/interfaces/AcidVest.jsx diff --git a/tgui/packages/tgui/interfaces/AlmayerControl.js b/tgui/packages/tgui/interfaces/AlmayerControl.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/AlmayerControl.js rename to tgui/packages/tgui/interfaces/AlmayerControl.jsx diff --git a/tgui/packages/tgui/interfaces/AltitudeControlConsole.js b/tgui/packages/tgui/interfaces/AltitudeControlConsole.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/AltitudeControlConsole.js rename to tgui/packages/tgui/interfaces/AltitudeControlConsole.jsx diff --git a/tgui/packages/tgui/interfaces/AntiAirConsole.js b/tgui/packages/tgui/interfaces/AntiAirConsole.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/AntiAirConsole.js rename to tgui/packages/tgui/interfaces/AntiAirConsole.jsx diff --git a/tgui/packages/tgui/interfaces/Apc.js b/tgui/packages/tgui/interfaces/Apc.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Apc.js rename to tgui/packages/tgui/interfaces/Apc.jsx diff --git a/tgui/packages/tgui/interfaces/AresInterface.js b/tgui/packages/tgui/interfaces/AresInterface.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/AresInterface.js rename to tgui/packages/tgui/interfaces/AresInterface.jsx diff --git a/tgui/packages/tgui/interfaces/Autodispenser.js b/tgui/packages/tgui/interfaces/Autodispenser.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Autodispenser.js rename to tgui/packages/tgui/interfaces/Autodispenser.jsx diff --git a/tgui/packages/tgui/interfaces/Autolathe.js b/tgui/packages/tgui/interfaces/Autolathe.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Autolathe.js rename to tgui/packages/tgui/interfaces/Autolathe.jsx diff --git a/tgui/packages/tgui/interfaces/Binoculars.js b/tgui/packages/tgui/interfaces/Binoculars.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Binoculars.js rename to tgui/packages/tgui/interfaces/Binoculars.jsx diff --git a/tgui/packages/tgui/interfaces/BioSyntheticPrinter.js b/tgui/packages/tgui/interfaces/BioSyntheticPrinter.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/BioSyntheticPrinter.js rename to tgui/packages/tgui/interfaces/BioSyntheticPrinter.jsx diff --git a/tgui/packages/tgui/interfaces/BotanyEditor.js b/tgui/packages/tgui/interfaces/BotanyEditor.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/BotanyEditor.js rename to tgui/packages/tgui/interfaces/BotanyEditor.jsx diff --git a/tgui/packages/tgui/interfaces/BotanyExtractor.js b/tgui/packages/tgui/interfaces/BotanyExtractor.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/BotanyExtractor.js rename to tgui/packages/tgui/interfaces/BotanyExtractor.jsx diff --git a/tgui/packages/tgui/interfaces/BrigCell.js b/tgui/packages/tgui/interfaces/BrigCell.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/BrigCell.js rename to tgui/packages/tgui/interfaces/BrigCell.jsx diff --git a/tgui/packages/tgui/interfaces/CameraConsole.js b/tgui/packages/tgui/interfaces/CameraConsole.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/CameraConsole.js rename to tgui/packages/tgui/interfaces/CameraConsole.jsx diff --git a/tgui/packages/tgui/interfaces/CanvasLayer.js b/tgui/packages/tgui/interfaces/CanvasLayer.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/CanvasLayer.js rename to tgui/packages/tgui/interfaces/CanvasLayer.jsx diff --git a/tgui/packages/tgui/interfaces/CardMod.js b/tgui/packages/tgui/interfaces/CardMod.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/CardMod.js rename to tgui/packages/tgui/interfaces/CardMod.jsx diff --git a/tgui/packages/tgui/interfaces/CasSim.tsx b/tgui/packages/tgui/interfaces/CasSim.tsx index b81e1baafe9c..cac23cde1833 100644 --- a/tgui/packages/tgui/interfaces/CasSim.tsx +++ b/tgui/packages/tgui/interfaces/CasSim.tsx @@ -1,9 +1,8 @@ -import { useBackend } from '../backend'; +import { useBackend, useLocalState } from '../backend'; import { Box, Button, Section, ProgressBar, NoticeBox, Stack } from '../components'; interface CasSimData { configuration: any; - looking: 0 | 1; dummy_mode: string; worldtime: number; nextdetonationtime: number; @@ -12,11 +11,16 @@ interface CasSimData { export const CasSim = (_props, context) => { const { act, data } = useBackend(context); + const [simulationView, setSimulationView] = useLocalState( + context, + 'simulation_view', + false + ); const timeLeft = data.nextdetonationtime - data.worldtime; const timeLeftPct = timeLeft / data.detonation_cooldown; - const canDetonate = timeLeft < 0 && data.configuration && data.looking; + const canDetonate = timeLeft < 0 && data.configuration && simulationView; return ( @@ -48,13 +52,16 @@ export const CasSim = (_props, context) => {
- {(!data.looking && ( + {(!simulationView && ( + + {data.recommendations.map((recommendation, index) => ( +
+ + + + + + + + + + + + + + + + + + + + + + + + Recommender: {recommendation.recommender_name} ( + {recommendation.recommender_rank}) + + Reason: {recommendation.reason} + + +
+ ))} + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/KeyBinds.js b/tgui/packages/tgui/interfaces/KeyBinds.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/KeyBinds.js rename to tgui/packages/tgui/interfaces/KeyBinds.jsx diff --git a/tgui/packages/tgui/interfaces/KillPanel.js b/tgui/packages/tgui/interfaces/KillPanel.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/KillPanel.js rename to tgui/packages/tgui/interfaces/KillPanel.jsx diff --git a/tgui/packages/tgui/interfaces/LanguageMenu.js b/tgui/packages/tgui/interfaces/LanguageMenu.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/LanguageMenu.js rename to tgui/packages/tgui/interfaces/LanguageMenu.jsx diff --git a/tgui/packages/tgui/interfaces/ListInput.js b/tgui/packages/tgui/interfaces/ListInput.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/ListInput.js rename to tgui/packages/tgui/interfaces/ListInput.jsx diff --git a/tgui/packages/tgui/interfaces/MedalsPanel.js b/tgui/packages/tgui/interfaces/MedalsPanel.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/MedalsPanel.js rename to tgui/packages/tgui/interfaces/MedalsPanel.jsx diff --git a/tgui/packages/tgui/interfaces/MfdPanels/CameraPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/CameraPanel.tsx index f3a1197e9802..8bf5807b9fcd 100644 --- a/tgui/packages/tgui/interfaces/MfdPanels/CameraPanel.tsx +++ b/tgui/packages/tgui/interfaces/MfdPanels/CameraPanel.tsx @@ -11,9 +11,9 @@ export const CameraMfdPanel = (props: MfdProps, context) => { return ( act('nvg-enable') }, - { children: 'nvgoff', onClick: () => act('nvg-disable') }, + leftButtons={[ + { children: 'NV-ON', onClick: () => act('nvg-enable') }, + { children: 'NV-OFF', onClick: () => act('nvg-disable') }, ]} bottomButtons={[{ children: 'EXIT', onClick: () => setPanelState('') }]}> diff --git a/tgui/packages/tgui/interfaces/MfdPanels/EquipmentPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/EquipmentPanel.tsx index 05a500563b52..8f2cff9f1842 100644 --- a/tgui/packages/tgui/interfaces/MfdPanels/EquipmentPanel.tsx +++ b/tgui/packages/tgui/interfaces/MfdPanels/EquipmentPanel.tsx @@ -314,16 +314,6 @@ export const EquipmentMfdPanel = (props: MfdProps, context) => { return ( setPanelState('firemission'), - }, - {}, - {}, - ]} leftButtons={[ weap2 ? generateButton(weap2) : {}, weap1 ? generateButton(weap1) : {}, diff --git a/tgui/packages/tgui/interfaces/MfdPanels/FiremissionPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/FiremissionPanel.tsx index fd71dab8f045..0eaa43f53478 100644 --- a/tgui/packages/tgui/interfaces/MfdPanels/FiremissionPanel.tsx +++ b/tgui/packages/tgui/interfaces/MfdPanels/FiremissionPanel.tsx @@ -67,11 +67,7 @@ const FiremissionMfdHomePage = (props: MfdProps, context) => { const firemission = data.firemission_data.length > x ? data.firemission_data[x] : undefined; return { - children: firemission ? ( -
- FM {x + 1}
{firemission?.name} -
- ) : undefined, + children: firemission ?
FM {x + 1}
: undefined, onClick: () => setSelectedFm(firemission?.name), }; }; @@ -95,7 +91,6 @@ const FiremissionMfdHomePage = (props: MfdProps, context) => { leftButtons={left_firemissions} rightButtons={right_firemissions} topButtons={[ - {}, {}, {}, fmName @@ -110,10 +105,11 @@ const FiremissionMfdHomePage = (props: MfdProps, context) => { }, } : {}, + {}, { - children: , + children: fmOffset > 0 ? : undefined, onClick: () => { - if (fmOffset >= 1) { + if (fmOffset > 0) { setFmOffset(fmOffset - 1); } }, @@ -128,9 +124,12 @@ const FiremissionMfdHomePage = (props: MfdProps, context) => { {}, {}, { - children: , + children: + fmOffset + 10 < data.firemission_data?.length ? ( + + ) : undefined, onClick: () => { - if (fmOffset + 8 < data.firemission_data.length) { + if (fmOffset + 10 < data.firemission_data?.length) { setFmOffset(fmOffset + 1); } }, @@ -212,7 +211,10 @@ const ViewFiremissionMfdPanel = ( bottomButtons={[ { children: 'EXIT', - onClick: () => setPanelState(''), + onClick: () => { + setSelectedFm(undefined); + setPanelState(''); + }, }, ]} rightButtons={editFm === true ? rightButtons : []}> diff --git a/tgui/packages/tgui/interfaces/MfdPanels/FultonPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/FultonPanel.tsx index 05d33e51a8d1..5bb2f462d1a2 100644 --- a/tgui/packages/tgui/interfaces/MfdPanels/FultonPanel.tsx +++ b/tgui/packages/tgui/interfaces/MfdPanels/FultonPanel.tsx @@ -55,7 +55,7 @@ export const FultonMfdPanel = (props: MfdProps, context) => { { children: , onClick: () => { - if (fulltonOffset >= 1) { + if (fulltonOffset > 0) { setFultonOffset(fulltonOffset - 1); } }, @@ -70,6 +70,9 @@ export const FultonMfdPanel = (props: MfdProps, context) => { }, }, ]} + topButtons={[ + { children: 'EQUIP', onClick: () => setPanelState('equipment') }, + ]} bottomButtons={[ { children: 'EXIT', diff --git a/tgui/packages/tgui/interfaces/MfdPanels/MGPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/MGPanel.tsx index dc6df25e17c1..fac34ef3e49a 100644 --- a/tgui/packages/tgui/interfaces/MfdPanels/MGPanel.tsx +++ b/tgui/packages/tgui/interfaces/MfdPanels/MGPanel.tsx @@ -7,6 +7,7 @@ import { EquipmentContext, MGSpec } from './types'; const MgPanel = (props: DropshipEquipment) => { const mgData = props.data as MGSpec; + return ( @@ -44,6 +45,8 @@ export const MgMfdPanel = (props: MfdProps, context) => { const { setPanelState } = mfdState(context, props.panelStateId); const { equipmentState } = useEquipmentState(context, props.panelStateId); const mg = data.equipment_data.find((x) => x.mount_point === equipmentState); + const deployLabel = (mg?.data?.deployed ?? 0) === 1 ? 'RETRACT' : 'DEPLOY'; + return ( { ]} leftButtons={[ { - children: 'DEPLOY', + children: deployLabel, onClick: () => act('deploy-equipment', { equipment_id: mg?.mount_point }), }, diff --git a/tgui/packages/tgui/interfaces/MfdPanels/MedevacPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/MedevacPanel.tsx index 634b4ef2a52e..a804b4d92e59 100644 --- a/tgui/packages/tgui/interfaces/MfdPanels/MedevacPanel.tsx +++ b/tgui/packages/tgui/interfaces/MfdPanels/MedevacPanel.tsx @@ -48,6 +48,7 @@ const MedevacOccupant = (props: { data: MedevacTargets }) => ( ); export const MedevacMfdPanel = (props: MfdProps, context) => { + const { data, act } = useBackend(context); const [medevacOffset, setMedevacOffset] = useLocalState( context, `${props.panelStateId}_medevacoffset`, @@ -56,8 +57,6 @@ export const MedevacMfdPanel = (props: MfdProps, context) => { const { setPanelState } = mfdState(context, props.panelStateId); const { equipmentState } = useEquipmentState(context, props.panelStateId); - const { data, act } = useBackend(context); - const result = data.equipment_data.find( (x) => x.mount_point === equipmentState ); @@ -85,6 +84,7 @@ export const MedevacMfdPanel = (props: MfdProps, context) => { const all_targets = range(medevacOffset, medevacOffset + 8) .map((x) => data.medevac_targets[x]) .filter((x) => x !== undefined); + return ( { { children: , onClick: () => { - if (medevacOffset >= 1) { + if (medevacOffset > 0) { setMedevacOffset(medevacOffset - 1); } }, @@ -109,10 +109,7 @@ export const MedevacMfdPanel = (props: MfdProps, context) => { }, ]} topButtons={[ - { - children: 'EQUIP', - onClick: () => setPanelState('equipment'), - }, + { children: 'EQUIP', onClick: () => setPanelState('equipment') }, ]} bottomButtons={[ { @@ -168,7 +165,7 @@ export const MedevacMfdPanel = (props: MfdProps, context) => { {all_targets.map((x) => ( <> - + diff --git a/tgui/packages/tgui/interfaces/MfdPanels/MultifunctionDisplay.tsx b/tgui/packages/tgui/interfaces/MfdPanels/MultifunctionDisplay.tsx index 9df7eaffcde4..35f81b45ed3e 100644 --- a/tgui/packages/tgui/interfaces/MfdPanels/MultifunctionDisplay.tsx +++ b/tgui/packages/tgui/interfaces/MfdPanels/MultifunctionDisplay.tsx @@ -13,6 +13,7 @@ export interface MfdProps { rightButtons?: Array; bottomButtons?: Array; children?: InfernoNode; + otherPanelStateId?: string; } export const MfdButton = (props: ButtonProps, context) => { diff --git a/tgui/packages/tgui/interfaces/MfdPanels/SentryPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/SentryPanel.tsx index d8ea220ec986..c5f9bd04c1b0 100644 --- a/tgui/packages/tgui/interfaces/MfdPanels/SentryPanel.tsx +++ b/tgui/packages/tgui/interfaces/MfdPanels/SentryPanel.tsx @@ -57,6 +57,7 @@ export const SentryMfdPanel = (props: MfdProps, context) => { ); const deployLabel = (sentry?.data?.deployed ?? 0) === 1 ? 'RETRACT' : 'DEPLOY'; + return ( { act('deploy-equipment', { equipment_id: sentry?.mount_point }), }, { - children: 'CAMERA', + children: sentry?.data?.camera_available ? 'CAMERA' : undefined, onClick: () => act('set-camera-sentry', { equipment_id: sentry?.mount_point }), }, diff --git a/tgui/packages/tgui/interfaces/MfdPanels/SpotlightPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/SpotlightPanel.tsx index ce241420497e..f3a5884f89ca 100644 --- a/tgui/packages/tgui/interfaces/MfdPanels/SpotlightPanel.tsx +++ b/tgui/packages/tgui/interfaces/MfdPanels/SpotlightPanel.tsx @@ -33,6 +33,9 @@ export const SpotlightMfdPanel = (props: MfdProps, context) => { const spotlight = data.equipment_data.find( (x) => x.mount_point === equipmentState ); + const deployLabel = + (spotlight?.data?.deployed ?? 0) === 1 ? 'DISABLE' : 'ENABLE'; + return ( { ]} leftButtons={[ { - children: 'DEPLOY', + children: deployLabel, onClick: () => act('deploy-equipment', { equipment_id: spotlight?.mount_point }), }, diff --git a/tgui/packages/tgui/interfaces/MfdPanels/SupportPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/SupportPanel.tsx index 1eca123173b0..5767b4960840 100644 --- a/tgui/packages/tgui/interfaces/MfdPanels/SupportPanel.tsx +++ b/tgui/packages/tgui/interfaces/MfdPanels/SupportPanel.tsx @@ -36,6 +36,9 @@ export const SupportMfdPanel = (props: MfdProps, context) => { return ( setPanelState('equipment') }, + ]} bottomButtons={[ { children: 'EXIT', diff --git a/tgui/packages/tgui/interfaces/MfdPanels/TargetAquisition.tsx b/tgui/packages/tgui/interfaces/MfdPanels/TargetAquisition.tsx index 49f22db18104..ebaacfb90337 100644 --- a/tgui/packages/tgui/interfaces/MfdPanels/TargetAquisition.tsx +++ b/tgui/packages/tgui/interfaces/MfdPanels/TargetAquisition.tsx @@ -59,7 +59,7 @@ const useTargetFiremissionSelect = (context) => { }; }; -const useTargetOffset = (context, panelId: string) => { +export const useTargetOffset = (context, panelId: string) => { const [data, set] = useLocalState(context, `${panelId}_targetOffset`, 0); return { targetOffset: data, @@ -79,7 +79,7 @@ const useTargetSubmenu = (context, panelId: string) => { }; }; -const TargetLines = (props: { panelId: string }, context) => { +export const TargetLines = (props: { panelId: string }, context) => { const { data } = useBackend< EquipmentContext & FiremissionContext & TargetContext >(context); @@ -140,6 +140,34 @@ const leftButtonGenerator = (context, panelId: string) => { useTargetFiremissionSelect(context); const { weaponSelected, setWeaponSelected } = useWeaponSelectedState(context); const weapons = data.equipment_data.filter((x) => x.is_weapon); + const [fmOffset] = useLocalState( + context, + `${panelId}_fm_strike_select_offset`, + 0 + ); + const firemission_mapper = (x: number) => { + if (x === 0) { + return { + children: 'CANCEL', + onClick: () => { + setFiremissionSelected(undefined); + setStrikeMode(undefined); + setLeftButtonMode(undefined); + }, + }; + } + x -= 1; + const firemission = + data.firemission_data.length > x ? data.firemission_data[x] : undefined; + return { + children: firemission ?
FM {x + 1}
: undefined, + onClick: () => { + setFiremissionSelected(data.firemission_data[x]); + setLeftButtonMode(undefined); + }, + }; + }; + if (leftButtonMode === undefined) { return [ { @@ -154,26 +182,30 @@ const leftButtonGenerator = (context, panelId: string) => { } if (leftButtonMode === 'STRIKE') { if (strikeMode === 'weapon' && weaponSelected === undefined) { - return weapons.map((x) => { - return { - children: x.shorthand, + const cancelButton = [ + { + children: 'CANCEL', onClick: () => { - setWeaponSelected(x.mount_point); + setFiremissionSelected(undefined); + setStrikeMode(undefined); setLeftButtonMode(undefined); }, - }; - }); + }, + ]; + return cancelButton.concat( + weapons.map((x) => { + return { + children: x.shorthand, + onClick: () => { + setWeaponSelected(x.eqp_tag); + setLeftButtonMode(undefined); + }, + }; + }) + ); } if (strikeMode === 'firemission' && firemissionSelected === undefined) { - return data.firemission_data.map((x) => { - return { - children: x.name, - onClick: () => { - setFiremissionSelected(x); - setLeftButtonMode(undefined); - }, - }; - }); + return range(fmOffset, fmOffset + 5).map(firemission_mapper); } return [ { children: 'CANCEL', onClick: () => setLeftButtonMode(undefined) }, @@ -230,7 +262,7 @@ const leftButtonGenerator = (context, panelId: string) => { return []; }; -const lazeMapper = (context, offset) => { +export const lazeMapper = (context, offset) => { const { act, data } = useBackend(context); const { setSelectedTarget } = useLazeTarget(context); @@ -271,6 +303,21 @@ const lazeMapper = (context, offset) => { }; }; +export const getLastTargetName = (data) => { + const target = data.targets_data[data.targets_data.length - 1] ?? undefined; + const isDebug = target?.target_name.includes('debug'); + if (isDebug) { + return 'debug ' + target.target_name.split(' ')[3]; + } + const label = target?.target_name.split(' ')[0] ?? ''; + const squad = label[0] ?? undefined; + const number = label.split('-')[1] ?? undefined; + + return squad !== undefined && number !== undefined + ? `${squad}-${number}` + : target?.target_name; +}; + export const TargetAquisitionMfdPanel = (props: MfdProps, context) => { const { panelStateId } = props; @@ -288,45 +335,37 @@ export const TargetAquisitionMfdPanel = (props: MfdProps, context) => { context, panelStateId ); + const [fmOffset, setFmOffset] = useLocalState( + context, + `${props.panelStateId}_fm_strike_select_offset`, + 0 + ); + const { leftButtonMode } = useTargetSubmenu(context, props.panelStateId); const { fmXOffsetValue } = useFiremissionXOffsetValue(context); const { fmYOffsetValue } = useFiremissionYOffsetValue(context); - const lazes = range(0, 5).map((x) => - x > data.targets_data.length ? undefined : data.targets_data[x] - ); - const strikeConfigLabel = strikeMode === 'weapon' - ? data.equipment_data.find((x) => x.mount_point === weaponSelected)?.name + ? data.equipment_data.find((x) => x.eqp_tag === weaponSelected)?.name : firemissionSelected !== undefined ? data.firemission_data.find( (x) => x.mission_tag === firemissionSelected.mission_tag )?.name : 'NONE'; - const lazeIndex = lazes.findIndex((x) => x?.target_tag === selectedTarget); - const strikeReady = strikeMode !== undefined && lazeIndex !== -1; + const strikeReady = + selectedTarget !== undefined && + strikeDirection !== undefined && + ((strikeMode === 'weapon' && + weaponSelected !== undefined && + data.equipment_data.find((x) => x.eqp_tag === weaponSelected)) || + (strikeMode === 'firemission' && firemissionSelected !== undefined)); const targets = range(targetOffset, targetOffset + 5).map((x) => lazeMapper(context, x) ); - const getLastName = () => { - const target = data.targets_data[data.targets_data.length - 1] ?? undefined; - const isDebug = target?.target_name.includes('debug'); - if (isDebug) { - return 'debug ' + target.target_name.split(' ')[3]; - } - const label = target?.target_name.split(' ')[0] ?? ''; - const squad = label[0] ?? undefined; - const number = label.split('-')[1] ?? undefined; - - return squad !== undefined && number !== undefined - ? `${squad}-${number}` - : target?.target_name; - }; - if ( selectedTarget && data.targets_data.find((x) => `${x.target_tag}` === `${selectedTarget}`) === @@ -361,7 +400,20 @@ export const TargetAquisitionMfdPanel = (props: MfdProps, context) => { } }, }, - {}, + { + children: + leftButtonMode === 'STRIKE' && + strikeMode === 'firemission' && + firemissionSelected === undefined && + fmOffset > 0 ? ( + + ) : undefined, + onClick: () => { + if (fmOffset > 0) { + setFmOffset(fmOffset - 1); + } + }, + }, {}, {}, { @@ -378,16 +430,29 @@ export const TargetAquisitionMfdPanel = (props: MfdProps, context) => { children: 'EXIT', onClick: () => setPanelState(''), }, - {}, + { + children: + leftButtonMode === 'STRIKE' && + strikeMode === 'firemission' && + firemissionSelected === undefined && + fmOffset + 4 < data.firemission_data?.length ? ( + + ) : undefined, + onClick: () => { + if (fmOffset + 4 < data.firemission_data?.length) { + setFmOffset(fmOffset + 1); + } + }, + }, {}, {}, { children: - targetOffset < lazes.length ? ( + targetOffset + 5 < data.targets_data?.length ? ( ) : undefined, onClick: () => { - if (targetOffset < lazes.length) { + if (targetOffset + 5 < data.targets_data?.length) { setTargetOffset(targetOffset + 1); } }, @@ -443,8 +508,9 @@ export const TargetAquisitionMfdPanel = (props: MfdProps, context) => {

Target selected:{' '} - {lazes.find((x) => x?.target_tag === selectedTarget) - ?.target_name ?? 'NONE'} + {data.targets_data.find( + (x) => x?.target_tag === selectedTarget + )?.target_name ?? 'NONE'}

@@ -502,7 +568,7 @@ export const TargetAquisitionMfdPanel = (props: MfdProps, context) => { LATEST - {getLastName()} + {getLastTargetName(data)} )} diff --git a/tgui/packages/tgui/interfaces/MfdPanels/WeaponPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/WeaponPanel.tsx index 090001aa3ac9..cec542fdc3d1 100644 --- a/tgui/packages/tgui/interfaces/MfdPanels/WeaponPanel.tsx +++ b/tgui/packages/tgui/interfaces/MfdPanels/WeaponPanel.tsx @@ -1,10 +1,11 @@ import { range } from 'common/collections'; import { useBackend } from '../../backend'; -import { Box, Stack } from '../../components'; +import { Box, Icon, Stack } from '../../components'; import { DropshipEquipment } from '../DropshipWeaponsConsole'; import { MfdProps, MfdPanel } from './MultifunctionDisplay'; import { mfdState, useWeaponState } from './stateManagers'; import { LazeTarget } from './types'; +import { getLastTargetName, lazeMapper, TargetLines, useTargetOffset } from './TargetAquisition'; const EmptyWeaponPanel = (props, context) => { return
Nothing Listed
; @@ -14,30 +15,12 @@ interface EquipmentContext { targets_data: Array; } -const getLazeButtonProps = (context) => { - const { act, data } = useBackend(context); - const lazes = range(0, 5).map((x) => - x > data.targets_data.length ? undefined : data.targets_data[x] - ); - const get_laze = (index: number) => { - const laze = lazes.find((_, i) => i === index); - if (laze === undefined) { - return { - children: '', - onClick: () => act('set-camera', { equipment_id: null }), - }; - } - return { - children: laze?.target_name.split(' ')[0] ?? 'NONE', - onClick: laze - ? () => act('set-camera', { 'equipment_id': laze.target_tag }) - : undefined, - }; - }; - return [get_laze(0), get_laze(1), get_laze(2), get_laze(3), get_laze(4)]; -}; +const WeaponPanel = ( + props: { panelId: string; equipment: DropshipEquipment }, + context +) => { + const { data } = useBackend(context); -const WeaponPanel = (props: { equipment: DropshipEquipment }, context) => { return ( @@ -45,7 +28,7 @@ const WeaponPanel = (props: { equipment: DropshipEquipment }, context) => { ACTIONS - {false && ( + {true && ( { - - - - SELECT - - - TARGETS - - - - - - - - + + + {data.targets_data.length === 0 && ( + + + NO TARGETS + + + )} + {data.targets_data.length > 0 && ( + + + SELECT + + + TARGETS + + + {Math.min(5, data.targets_data.length)} of{' '} + {data.targets_data.length} + + {data.targets_data.length > 0 && ( + <> + + LATEST + + + {getLastTargetName(data)} + + + )} + + )} + + @@ -146,7 +135,14 @@ export const WeaponMfdPanel = (props: MfdProps, context) => { const { setPanelState } = mfdState(context, props.panelStateId); const { weaponState } = useWeaponState(context, props.panelStateId); const { data, act } = useBackend(context); + const { targetOffset, setTargetOffset } = useTargetOffset( + context, + props.panelStateId + ); const weap = data.equipment_data.find((x) => x.mount_point === weaponState); + const targets = range(targetOffset, targetOffset + 5).map((x) => + lazeMapper(context, x) + ); return ( { onClick: () => setPanelState(''), }, {}, + {}, + {}, + { + children: + targetOffset + 5 < data.targets_data?.length ? ( + + ) : undefined, + onClick: () => { + if (targetOffset + 5 < data.targets_data?.length) { + setTargetOffset(targetOffset + 1); + } + }, + }, ]} topButtons={[ + { children: 'EQUIP', onClick: () => setPanelState('equipment') }, + {}, + {}, + {}, { - children: 'EQUIP', - onClick: () => setPanelState('equipment'), + children: targetOffset > 0 ? : undefined, + onClick: () => { + if (targetOffset > 0) { + setTargetOffset(targetOffset - 1); + } + }, }, ]} - rightButtons={getLazeButtonProps(context)}> + rightButtons={targets}> - {weap ? : } + {weap ? ( + + ) : ( + + )} ); diff --git a/tgui/packages/tgui/interfaces/MfdPanels/stateManagers.ts b/tgui/packages/tgui/interfaces/MfdPanels/stateManagers.ts index e639938eabf8..4b1729dce0f7 100644 --- a/tgui/packages/tgui/interfaces/MfdPanels/stateManagers.ts +++ b/tgui/packages/tgui/interfaces/MfdPanels/stateManagers.ts @@ -60,6 +60,17 @@ export const mfdState = (context, panelId: string) => { }; }; +export const otherMfdState = (context, otherPanelId: string | undefined) => { + const [data] = useSharedState( + context, + `${otherPanelId}_panelstate`, + '' + ); + return { + otherPanelState: data, + }; +}; + export const useWeaponState = (context, panelId: string) => { const [data, set] = useSharedState( context, diff --git a/tgui/packages/tgui/interfaces/MfdPanels/types.ts b/tgui/packages/tgui/interfaces/MfdPanels/types.ts index 78e7c3314b30..c20449ece428 100644 --- a/tgui/packages/tgui/interfaces/MfdPanels/types.ts +++ b/tgui/packages/tgui/interfaces/MfdPanels/types.ts @@ -66,7 +66,7 @@ export type SentrySpec = { kills: number; iff_status: string[]; camera_available: number; - deployed: number; + deployed: 0 | 1; }; export type SpotlightSpec = { diff --git a/tgui/packages/tgui/interfaces/Mortar.js b/tgui/packages/tgui/interfaces/Mortar.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Mortar.js rename to tgui/packages/tgui/interfaces/Mortar.jsx diff --git a/tgui/packages/tgui/interfaces/NoticeBoard.tsx b/tgui/packages/tgui/interfaces/NoticeBoard.tsx new file mode 100644 index 000000000000..6cc761c0fb6f --- /dev/null +++ b/tgui/packages/tgui/interfaces/NoticeBoard.tsx @@ -0,0 +1,56 @@ +import { BooleanLike } from 'common/react'; + +import { useBackend } from '../backend'; +import { Box, Button, Section, Stack } from '../components'; +import { Window } from '../layouts'; + +type Data = { + allowed: BooleanLike; + items: { ref: string; name: string }[]; +}; + +export const NoticeBoard = (props, context) => { + const { act, data } = useBackend(context); + const { allowed, items = [] } = data; + + return ( + + + {!items.length ? ( +
+ + The notice board is empty! + +
+ ) : ( + items.map((item) => ( + + + {item.name} + + + + + )) + )} +
+ + + +
+ {chosenTutorial !== null ? ( + + +
+ + + +
+
+ {chosenTutorial.description} + {completed_tutorials.indexOf(chosenTutorial.id) === -1 ? ( +
+ ) : ( + + Tutorial has been completed. + + )} + +
+
+ + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/VehicleStatus.js b/tgui/packages/tgui/interfaces/VehicleStatus.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/VehicleStatus.js rename to tgui/packages/tgui/interfaces/VehicleStatus.jsx diff --git a/tgui/packages/tgui/interfaces/VoteMenu.js b/tgui/packages/tgui/interfaces/VoteMenu.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/VoteMenu.js rename to tgui/packages/tgui/interfaces/VoteMenu.jsx diff --git a/tgui/packages/tgui/interfaces/VoxPanel.js b/tgui/packages/tgui/interfaces/VoxPanel.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/VoxPanel.js rename to tgui/packages/tgui/interfaces/VoxPanel.jsx diff --git a/tgui/packages/tgui/interfaces/WeaponStats.js b/tgui/packages/tgui/interfaces/WeaponStats.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/WeaponStats.js rename to tgui/packages/tgui/interfaces/WeaponStats.jsx diff --git a/tgui/packages/tgui/interfaces/Wires.js b/tgui/packages/tgui/interfaces/Wires.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Wires.js rename to tgui/packages/tgui/interfaces/Wires.jsx diff --git a/tgui/packages/tgui/interfaces/WorkingJoe.js b/tgui/packages/tgui/interfaces/WorkingJoe.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/WorkingJoe.js rename to tgui/packages/tgui/interfaces/WorkingJoe.jsx diff --git a/tgui/packages/tgui/interfaces/common/AccessList.js b/tgui/packages/tgui/interfaces/common/AccessList.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/common/AccessList.js rename to tgui/packages/tgui/interfaces/common/AccessList.jsx diff --git a/tgui/packages/tgui/interfaces/common/BeakerContents.js b/tgui/packages/tgui/interfaces/common/BeakerContents.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/common/BeakerContents.js rename to tgui/packages/tgui/interfaces/common/BeakerContents.jsx diff --git a/tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.js b/tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.js rename to tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.jsx diff --git a/tgui/packages/tgui/layouts/Layout.js b/tgui/packages/tgui/layouts/Layout.jsx similarity index 100% rename from tgui/packages/tgui/layouts/Layout.js rename to tgui/packages/tgui/layouts/Layout.jsx diff --git a/tgui/packages/tgui/layouts/NtosWindow.js b/tgui/packages/tgui/layouts/NtosWindow.jsx similarity index 100% rename from tgui/packages/tgui/layouts/NtosWindow.js rename to tgui/packages/tgui/layouts/NtosWindow.jsx diff --git a/tgui/packages/tgui/layouts/Pane.js b/tgui/packages/tgui/layouts/Pane.jsx similarity index 100% rename from tgui/packages/tgui/layouts/Pane.js rename to tgui/packages/tgui/layouts/Pane.jsx diff --git a/tgui/packages/tgui/layouts/Window.js b/tgui/packages/tgui/layouts/Window.jsx similarity index 100% rename from tgui/packages/tgui/layouts/Window.js rename to tgui/packages/tgui/layouts/Window.jsx diff --git a/tgui/packages/tgui/routes.js b/tgui/packages/tgui/routes.jsx similarity index 98% rename from tgui/packages/tgui/routes.js rename to tgui/packages/tgui/routes.jsx index eb4ddff15393..0ad869fc63cb 100644 --- a/tgui/packages/tgui/routes.js +++ b/tgui/packages/tgui/routes.jsx @@ -74,6 +74,7 @@ export const getRoutedComponent = (store) => { const name = config?.interface; const interfacePathBuilders = [ (name) => `./${name}.tsx`, + (name) => `./${name}.jsx`, (name) => `./${name}.js`, (name) => `./${name}/index.tsx`, (name) => `./${name}/index.js`, diff --git a/tgui/packages/tgui/stories/Blink.stories.js b/tgui/packages/tgui/stories/Blink.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Blink.stories.js rename to tgui/packages/tgui/stories/Blink.stories.jsx diff --git a/tgui/packages/tgui/stories/BlockQuote.stories.js b/tgui/packages/tgui/stories/BlockQuote.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/BlockQuote.stories.js rename to tgui/packages/tgui/stories/BlockQuote.stories.jsx diff --git a/tgui/packages/tgui/stories/Box.stories.js b/tgui/packages/tgui/stories/Box.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Box.stories.js rename to tgui/packages/tgui/stories/Box.stories.jsx diff --git a/tgui/packages/tgui/stories/Button.stories.js b/tgui/packages/tgui/stories/Button.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Button.stories.js rename to tgui/packages/tgui/stories/Button.stories.jsx diff --git a/tgui/packages/tgui/stories/ByondUi.stories.js b/tgui/packages/tgui/stories/ByondUi.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/ByondUi.stories.js rename to tgui/packages/tgui/stories/ByondUi.stories.jsx diff --git a/tgui/packages/tgui/stories/Collapsible.stories.js b/tgui/packages/tgui/stories/Collapsible.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Collapsible.stories.js rename to tgui/packages/tgui/stories/Collapsible.stories.jsx diff --git a/tgui/packages/tgui/stories/Flex.stories.js b/tgui/packages/tgui/stories/Flex.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Flex.stories.js rename to tgui/packages/tgui/stories/Flex.stories.jsx diff --git a/tgui/packages/tgui/stories/Input.stories.js b/tgui/packages/tgui/stories/Input.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Input.stories.js rename to tgui/packages/tgui/stories/Input.stories.jsx diff --git a/tgui/packages/tgui/stories/LabeledList.stories.js b/tgui/packages/tgui/stories/LabeledList.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/LabeledList.stories.js rename to tgui/packages/tgui/stories/LabeledList.stories.jsx diff --git a/tgui/packages/tgui/stories/Popper.stories.js b/tgui/packages/tgui/stories/Popper.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Popper.stories.js rename to tgui/packages/tgui/stories/Popper.stories.jsx diff --git a/tgui/packages/tgui/stories/ProgressBar.stories.js b/tgui/packages/tgui/stories/ProgressBar.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/ProgressBar.stories.js rename to tgui/packages/tgui/stories/ProgressBar.stories.jsx diff --git a/tgui/packages/tgui/stories/Stack.stories.js b/tgui/packages/tgui/stories/Stack.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Stack.stories.js rename to tgui/packages/tgui/stories/Stack.stories.jsx diff --git a/tgui/packages/tgui/stories/Storage.stories.js b/tgui/packages/tgui/stories/Storage.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Storage.stories.js rename to tgui/packages/tgui/stories/Storage.stories.jsx diff --git a/tgui/packages/tgui/stories/Tabs.stories.js b/tgui/packages/tgui/stories/Tabs.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Tabs.stories.js rename to tgui/packages/tgui/stories/Tabs.stories.jsx diff --git a/tgui/packages/tgui/stories/Themes.stories.js b/tgui/packages/tgui/stories/Themes.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Themes.stories.js rename to tgui/packages/tgui/stories/Themes.stories.jsx diff --git a/tgui/packages/tgui/stories/Tooltip.stories.js b/tgui/packages/tgui/stories/Tooltip.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Tooltip.stories.js rename to tgui/packages/tgui/stories/Tooltip.stories.jsx diff --git a/tgui/packages/tgui/stories/common.js b/tgui/packages/tgui/stories/common.jsx similarity index 100% rename from tgui/packages/tgui/stories/common.js rename to tgui/packages/tgui/stories/common.jsx diff --git a/tgui/public/tgui-panel.bundle.css b/tgui/public/tgui-panel.bundle.css index 9a9fc658bc7a..10fb3458b06b 100644 --- a/tgui/public/tgui-panel.bundle.css +++ b/tgui/public/tgui-panel.bundle.css @@ -1,2 +1,2 @@ -html,body{box-sizing:border-box;height:100%;margin:0;font-size:12px}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif}*,*:before,*:after{box-sizing:inherit}h1,h2,h3,h4,h5,h6{display:block;margin:0;padding:6px 0;padding:.5rem 0}h1{font-size:18px;font-size:1.5rem}h2{font-size:16px;font-size:1.333rem}h3{font-size:14px;font-size:1.167rem}h4{font-size:12px;font-size:1rem}td,th{vertical-align:baseline;text-align:left}.candystripe:nth-child(odd){background-color:rgba(0,0,0,.25)}.color-black{color:#1a1a1a !important}.color-white{color:#fff !important}.color-red{color:#df3e3e !important}.color-orange{color:#f37f33 !important}.color-yellow{color:#fbda21 !important}.color-olive{color:#cbe41c !important}.color-green{color:#25ca4c !important}.color-teal{color:#00d6cc !important}.color-blue{color:#2e93de !important}.color-dark-blue{color:#005fa7 !important}.color-violet{color:#7349cf !important}.color-purple{color:#ad45d0 !important}.color-pink{color:#e34da1 !important}.color-brown{color:#b97447 !important}.color-grey{color:#848484 !important}.color-light-grey{color:#b3b3b3 !important}.color-good{color:#68c22d !important}.color-average{color:#f29a29 !important}.color-bad{color:#df3e3e !important}.color-label{color:#8b9bb0 !important}.color-xeno{color:#664573 !important}.color-bg-black{background-color:#000 !important}.color-bg-white{background-color:#d9d9d9 !important}.color-bg-red{background-color:#bd2020 !important}.color-bg-orange{background-color:#d95e0c !important}.color-bg-yellow{background-color:#d9b804 !important}.color-bg-olive{background-color:#9aad14 !important}.color-bg-green{background-color:#1b9638 !important}.color-bg-teal{background-color:#009a93 !important}.color-bg-blue{background-color:#1c71b1 !important}.color-bg-dark-blue{background-color:#003e6e !important}.color-bg-violet{background-color:#552dab !important}.color-bg-purple{background-color:#8b2baa !important}.color-bg-pink{background-color:#cf2082 !important}.color-bg-brown{background-color:#8c5836 !important}.color-bg-grey{background-color:#646464 !important}.color-bg-light-grey{background-color:#919191 !important}.color-bg-good{background-color:#4d9121 !important}.color-bg-average{background-color:#cd7a0d !important}.color-bg-bad{background-color:#bd2020 !important}.color-bg-label{background-color:#657a94 !important}.color-bg-xeno{background-color:#462f4e !important}.debug-layout,.debug-layout *:not(g):not(path){color:rgba(255,255,255,.9) !important;background:transparent !important;outline:1px solid rgba(255,255,255,.5) !important;box-shadow:none !important;filter:none !important}.debug-layout:hover,.debug-layout *:not(g):not(path):hover{outline-color:rgba(255,255,255,.8) !important}.outline-dotted{outline-style:dotted !important}.outline-dashed{outline-style:dashed !important}.outline-solid{outline-style:solid !important}.outline-double{outline-style:double !important}.outline-groove{outline-style:groove !important}.outline-ridge{outline-style:ridge !important}.outline-inset{outline-style:inset !important}.outline-outset{outline-style:outset !important}.outline-color-black{outline:.167rem solid #1a1a1a !important}.outline-color-white{outline:.167rem solid #fff !important}.outline-color-red{outline:.167rem solid #df3e3e !important}.outline-color-orange{outline:.167rem solid #f37f33 !important}.outline-color-yellow{outline:.167rem solid #fbda21 !important}.outline-color-olive{outline:.167rem solid #cbe41c !important}.outline-color-green{outline:.167rem solid #25ca4c !important}.outline-color-teal{outline:.167rem solid #00d6cc !important}.outline-color-blue{outline:.167rem solid #2e93de !important}.outline-color-dark-blue{outline:.167rem solid #005fa7 !important}.outline-color-violet{outline:.167rem solid #7349cf !important}.outline-color-purple{outline:.167rem solid #ad45d0 !important}.outline-color-pink{outline:.167rem solid #e34da1 !important}.outline-color-brown{outline:.167rem solid #b97447 !important}.outline-color-grey{outline:.167rem solid #848484 !important}.outline-color-light-grey{outline:.167rem solid #b3b3b3 !important}.outline-color-good{outline:.167rem solid #68c22d !important}.outline-color-average{outline:.167rem solid #f29a29 !important}.outline-color-bad{outline:.167rem solid #df3e3e !important}.outline-color-label{outline:.167rem solid #8b9bb0 !important}.outline-color-xeno{outline:.167rem solid #664573 !important}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:bold}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.BlockQuote{color:#8b9bb0;border-left:.1666666667em solid #8b9bb0;padding-left:.5em;margin-bottom:.5em}.BlockQuote:last-child{margin-bottom:0}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fas,.Button .far{margin-left:-0.25em;margin-right:-0.25em;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fas,.Button--hasContent .far{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--dark-blue{transition:color 50ms,background-color 50ms;background-color:#003e6e;color:#fff}.Button--color--dark-blue:hover{transition:color 0ms,background-color 0ms}.Button--color--dark-blue:focus{transition:color 100ms,background-color 100ms}.Button--color--dark-blue:hover,.Button--color--dark-blue:focus{background-color:#135b92;color:#fff}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--xeno{transition:color 50ms,background-color 50ms;background-color:#462f4e;color:#fff}.Button--color--xeno:hover{transition:color 0ms,background-color 0ms}.Button--color--xeno:focus{transition:color 100ms,background-color 100ms}.Button--color--xeno:hover,.Button--color--xeno:focus{background-color:#64496d;color:#fff}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#202020;color:#fff;background-color:rgba(32,32,32,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#383838;color:#fff}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.ColorBox{display:inline-block;width:1em;height:1em;line-height:1em;text-align:center}.Dimmer{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.75);z-index:1}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Dropdown{position:relative}.Dropdown__control{position:relative;display:inline-block;font-family:Verdana,sans-serif;font-size:1em;width:8.3333333333em;line-height:1.4166666667em;user-select:none}.Dropdown__arrow-button{float:right;padding-left:.35em;width:1.2em;height:1.8333333333em;border-left:.0833333333em solid #000;border-left:.0833333333em solid rgba(0,0,0,.25)}.Dropdown__menu{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;overflow-y:scroll;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menu-noscroll{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menuentry{padding:.1666666667em .3333333333em;font-family:Verdana,sans-serif;font-size:1em;line-height:1.4166666667em;transition:background-color 100ms ease-out}.Dropdown__menuentry:hover{background-color:rgba(255,255,255,.2);transition:background-color 0ms}.Dropdown__over{top:auto;bottom:100%}.Dropdown__selected-text{display:inline-block;text-overflow:ellipsis;white-space:nowrap;height:1.4166666667em;width:calc(100% - 1.2em)}.Flex{display:-ms-flexbox;display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:block}.Flex--iefix.Flex--inline{display:inline-block}.Flex__item--iefix{display:inline-block}.Flex--iefix--column>.Flex__item--iefix{display:block}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto;margin-bottom:-0.2em;cursor:n-resize}.Knob:after{content:".";color:transparent;line-height:2.5em}.Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%);border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.Knob__ringTrackPivot{transform:rotateZ(135deg)}.Knob__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotateZ(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotateZ(270deg)}.Knob__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.Knob--color--white .Knob__ringFill{stroke:#fff}.Knob--color--red .Knob__ringFill{stroke:#df3e3e}.Knob--color--orange .Knob__ringFill{stroke:#f37f33}.Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.Knob--color--green .Knob__ringFill{stroke:#25ca4c}.Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.Knob--color--blue .Knob__ringFill{stroke:#2e93de}.Knob--color--dark-blue .Knob__ringFill{stroke:#005fa7}.Knob--color--violet .Knob__ringFill{stroke:#7349cf}.Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.Knob--color--pink .Knob__ringFill{stroke:#e34da1}.Knob--color--brown .Knob__ringFill{stroke:#b97447}.Knob--color--grey .Knob__ringFill{stroke:#848484}.Knob--color--light-grey .Knob__ringFill{stroke:#b3b3b3}.Knob--color--good .Knob__ringFill{stroke:#68c22d}.Knob--color--average .Knob__ringFill{stroke:#f29a29}.Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.Knob--color--xeno .Knob__ringFill{stroke:#664573}.LabeledList{display:table;width:100%;width:calc(100% + 1em);border-collapse:collapse;border-spacing:0;margin:-0.25em -0.5em;margin-bottom:0;padding:0}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{display:table-cell;margin:0;padding:.25em .5em;border:0;text-align:left}.LabeledList__label--nowrap{width:1%;white-space:nowrap;min-width:5em}.LabeledList__buttons{width:.1%;white-space:nowrap;text-align:right;padding-top:.0833333333em;padding-bottom:0}.Modal{background-color:#202020;max-width:calc(100% - 1rem);padding:1rem}.NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:bold;font-style:italic;color:#000;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg, transparent, transparent 0.8333333333em, rgba(0, 0, 0, 0.1) 0.8333333333em, rgba(0, 0, 0, 0.1) 1.6666666667em)}.NoticeBox--color--black{color:#fff;background-color:#000}.NoticeBox--color--white{color:#000;background-color:#b3b3b3}.NoticeBox--color--red{color:#fff;background-color:#701f1f}.NoticeBox--color--orange{color:#fff;background-color:#854114}.NoticeBox--color--yellow{color:#000;background-color:#83710d}.NoticeBox--color--olive{color:#000;background-color:#576015}.NoticeBox--color--green{color:#fff;background-color:#174e24}.NoticeBox--color--teal{color:#fff;background-color:#064845}.NoticeBox--color--blue{color:#fff;background-color:#1b4565}.NoticeBox--color--dark-blue{color:#fff;background-color:#02121f}.NoticeBox--color--violet{color:#fff;background-color:#3b2864}.NoticeBox--color--purple{color:#fff;background-color:#542663}.NoticeBox--color--pink{color:#fff;background-color:#802257}.NoticeBox--color--brown{color:#fff;background-color:#4c3729}.NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.NoticeBox--color--light-grey{color:#fff;background-color:#6a6a6a}.NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.NoticeBox--color--average{color:#fff;background-color:#7b4e13}.NoticeBox--color--bad{color:#fff;background-color:#701f1f}.NoticeBox--color--label{color:#fff;background-color:#53565a}.NoticeBox--color--xeno{color:#fff;background-color:#19161b}.NoticeBox--type--info{color:#fff;background-color:#235982}.NoticeBox--type--success{color:#fff;background-color:#1e662f}.NoticeBox--type--warning{color:#fff;background-color:#a95219}.NoticeBox--type--danger{color:#fff;background-color:#8f2828}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:.5em}.NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color 900ms ease-out}.ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.ProgressBar--color--default{border:.0833333333em solid #3e6189}.ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.ProgressBar--color--black{border-color:#000 !important}.ProgressBar--color--black .ProgressBar__fill{background-color:#000}.ProgressBar--color--white{border-color:#d9d9d9 !important}.ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.ProgressBar--color--red{border-color:#bd2020 !important}.ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--orange{border-color:#d95e0c !important}.ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.ProgressBar--color--yellow{border-color:#d9b804 !important}.ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.ProgressBar--color--olive{border-color:#9aad14 !important}.ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.ProgressBar--color--green{border-color:#1b9638 !important}.ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.ProgressBar--color--teal{border-color:#009a93 !important}.ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.ProgressBar--color--blue{border-color:#1c71b1 !important}.ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.ProgressBar--color--dark-blue{border-color:#003e6e !important}.ProgressBar--color--dark-blue .ProgressBar__fill{background-color:#003e6e}.ProgressBar--color--violet{border-color:#552dab !important}.ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.ProgressBar--color--purple{border-color:#8b2baa !important}.ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.ProgressBar--color--pink{border-color:#cf2082 !important}.ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.ProgressBar--color--brown{border-color:#8c5836 !important}.ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.ProgressBar--color--grey{border-color:#646464 !important}.ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.ProgressBar--color--light-grey{border-color:#919191 !important}.ProgressBar--color--light-grey .ProgressBar__fill{background-color:#919191}.ProgressBar--color--good{border-color:#4d9121 !important}.ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.ProgressBar--color--average{border-color:#cd7a0d !important}.ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.ProgressBar--color--bad{border-color:#bd2020 !important}.ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--label{border-color:#657a94 !important}.ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.ProgressBar--color--xeno{border-color:#462f4e !important}.ProgressBar--color--xeno .ProgressBar__fill{background-color:#462f4e}.Section{position:relative;margin-bottom:.5em;background-color:#131313;background-color:#131313;box-sizing:border-box}.Section:last-child{margin-bottom:0}.Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fff}.Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.Section__rest{position:relative}.Section__content{padding:.66em .5em}.Section--fitted>.Section__rest>.Section__content{padding:0}.Section--fill{display:flex;flex-direction:column;height:100%}.Section--fill>.Section__rest{flex-grow:1}.Section--fill>.Section__rest>.Section__content{height:100%}.Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.Section--scrollable{overflow-x:hidden;overflow-y:hidden}.Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.Section .Section:first-child{margin-top:-0.5em}.Section .Section .Section__titleText{font-size:1.0833333333em}.Section .Section .Section .Section__titleText{font-size:1em}.Slider{cursor:e-resize}.Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none !important}.Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid transparent;border-right:.4166666667em solid transparent;border-bottom:.4166666667em solid #fff}.Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--fill{height:100%}.Stack--horizontal>.Stack__item{margin-left:.5em}.Stack--horizontal>.Stack__item:first-child{margin-left:0}.Stack--vertical>.Stack__item{margin-top:.5em}.Stack--vertical>.Stack__item:first-child{margin-top:0}.Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Table{display:table;width:100%;border-collapse:collapse;border-spacing:0;margin:0}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{display:table-cell;padding:0 .25em}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__row--header .Table__cell,.Table__cell--header{font-weight:bold;padding-bottom:.5em}.Table__cell--collapsing{width:1%;white-space:nowrap}.Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#131313}.Tabs--fill{height:100%}.Section .Tabs{background-color:transparent}.Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.Tabs--horizontal:last-child{margin-bottom:0}.Tabs__Tab{flex-grow:0}.Tabs--fluid .Tabs__Tab{flex-grow:1}.Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em}.Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.Tab__text{flex-grow:1;margin:0 .5em}.Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4dfec}.Tab--selected.Tab--color--black{color:#535353}.Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#1a1a1a}.Tab--selected.Tab--color--white{color:#fff}.Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#fff}.Tab--selected.Tab--color--red{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#df3e3e}.Tab--selected.Tab--color--orange{color:#f69f66}.Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#f37f33}.Tab--selected.Tab--color--yellow{color:#fce358}.Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#fbda21}.Tab--selected.Tab--color--olive{color:#d8eb55}.Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#cbe41c}.Tab--selected.Tab--color--green{color:#53e074}.Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#25ca4c}.Tab--selected.Tab--color--teal{color:#21fff5}.Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00d6cc}.Tab--selected.Tab--color--blue{color:#62aee6}.Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#2e93de}.Tab--selected.Tab--color--dark-blue{color:#008ffd}.Tabs--horizontal .Tab--selected.Tab--color--dark-blue{border-bottom-color:#005fa7}.Tabs--vertical .Tab--selected.Tab--color--dark-blue{border-right-color:#005fa7}.Tab--selected.Tab--color--violet{color:#9676db}.Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#7349cf}.Tab--selected.Tab--color--purple{color:#c274db}.Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#ad45d0}.Tab--selected.Tab--color--pink{color:#ea79b9}.Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#e34da1}.Tab--selected.Tab--color--brown{color:#ca9775}.Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#b97447}.Tab--selected.Tab--color--grey{color:#a3a3a3}.Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#848484}.Tab--selected.Tab--color--light-grey{color:#c6c6c6}.Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#b3b3b3}.Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#b3b3b3}.Tab--selected.Tab--color--good{color:#8cd95a}.Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#68c22d}.Tab--selected.Tab--color--average{color:#f5b35e}.Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#f29a29}.Tab--selected.Tab--color--bad{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#df3e3e}.Tab--selected.Tab--color--label{color:#a8b4c4}.Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#8b9bb0}.Tab--selected.Tab--color--xeno{color:#9366a3}.Tabs--horizontal .Tab--selected.Tab--color--xeno{border-bottom-color:#664573}.Tabs--vertical .Tab--selected.Tab--color--xeno{border-right-color:#664573}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.TextArea--fluid{display:block;width:auto;height:auto}.TextArea--noborder{border:0px}.TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity 150ms ease-out;background-color:#000;color:#fff;box-shadow:.1em .1em 1.25em -0.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.Chat{color:#abc6ec}.Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:crimson;border-radius:10px;transition:font-size 200ms ease-out}.Chat__badge:before{content:"x"}.Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.Chat__scrollButton{position:fixed;right:2em;bottom:1em}.Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#131313}.Chat__reconnected:after{content:"";display:block;margin-top:-0.75em;border-bottom:.1666666667em solid #db2828}.Chat__highlight{color:#000}.Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:bold}.ChatMessage{word-wrap:break-word}.ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.Ping{position:relative;padding:.125em .25em;border:.0833333333em solid rgba(140,140,140,.5);border-radius:.25em;width:3.75em;text-align:right}.Ping__indicator{content:"";position:absolute;top:.5em;left:.5em;width:.5em;height:.5em;background-color:#888;border-radius:.25em}.Notifications{position:absolute;bottom:1em;left:1em;right:2em}.Notification{color:#fff;background-color:crimson;padding:.5em;margin:1em 0}.Notification:first-child{margin-top:0}.Notification:last-child{margin-bottom:0}.Layout,.Layout *{scrollbar-base-color:#181818;scrollbar-face-color:#363636;scrollbar-3dlight-color:#202020;scrollbar-highlight-color:#202020;scrollbar-track-color:#181818;scrollbar-arrow-color:#909090;scrollbar-shadow-color:#363636}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#202020;background-image:linear-gradient(to bottom, #202020 0%, #202020 100%)}.Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(56,56,56,.25);pointer-events:none}.Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}em{font-style:normal;font-weight:bold}img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}a{color:#397ea5}a.visited{color:#7c00e6}a:visited{color:#7c00e6}a.popt{text-decoration:none}.popup{position:fixed;top:50%;left:50%;background:#ddd}.popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.popup .close:hover{background:#999}.popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:bold;border-bottom:2px solid green}.popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.popup input[type=text]:hover,.popup input[type=text]:active,.popup input[type=text]:focus{border-color:green}.popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:bold}.popup input[type=submit]:hover,.popup input[type=submit]:focus,.popup input[type=submit]:active{background:#aaa;cursor:pointer}.changeFont{padding:10px}.changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.changeFont a:hover{background:#ccc}.highlightPopup{padding:10px;text-align:center}.highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.highlightPopup input.highlightColor{background-color:#ff0}.highlightPopup input.highlightTermSubmit{margin-top:5px}.contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.contextMenu a:hover{background-color:#ccc}.filterMessages{padding:5px}.filterMessages div{padding:2px 0}.icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.motd{color:#a4bad6;font-family:Verdana,sans-serif;white-space:normal}.motd h1,.motd h2,.motd h3,.motd h4,.motd h5,.motd h6{color:#a4bad6;text-decoration:underline}.motd a,.motd a:link,.motd a:visited,.motd a:active,.motd a:hover{color:#a4bad6}.bold,.name,.prefix,.ooc,.looc,.adminooc,.admin,.medal,.yell{font-weight:bold}.italic,.italics{font-style:italic}.highlight{background:#ff0}h1,h2,h3,h4,h5,h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}h1.alert,h2.alert{color:#a4bad6}em{font-style:normal;font-weight:bold}.ooc{font-weight:bold}.adminobserverooc{color:#09c;font-weight:bold}.adminooc{color:#3d5bc3;font-weight:bold}.adminsay{color:#9611d4;font-weight:bold}.admin{color:#5975da;font-weight:bold}.name{font-weight:bold}.deadsay{color:#e2c1ff}.binarysay{color:#1e90ff}.binarysay a{color:lime}.binarysay a:active,.binarysay a:visited{color:#8f8}.radio{color:#1ecc43}.sciradio{color:#c68cfa}.comradio{color:#fcdf03}.secradio{color:#dd3535}.medradio{color:#57b8f0}.engradio{color:#f37746}.suppradio{color:#b88646}.servradio{color:#6ca729}.syndradio{color:#8f4a4b}.gangradio{color:#ac2ea1}.centcomradio{color:#2681a5}.aiprivradio{color:#d65d95}.redteamradio{color:#f44}.blueteamradio{color:#3434fd}.greenteamradio{color:#34fd34}.yellowteamradio{color:#fdfd34}.yell{font-weight:bold}.alert{color:#d82020}.userdanger{color:#c51e1e;font-weight:bold;font-size:185%}.bolddanger{color:#c51e1e;font-weight:bold}.danger{color:#c51e1e}.warning{color:#c51e1e;font-style:italic}.alertwarning{color:red;font-weight:bold}.boldwarning{color:#c51e1e;font-style:italic;font-weight:bold}.announce{color:#c51e1e;font-weight:bold}.boldannounce{color:#c51e1e;font-weight:bold}.minorannounce{font-weight:bold;font-size:185%}.greenannounce{color:#059223;font-weight:bold}.rose{color:#ff5050}.info{color:#9ab0ff}.notice{color:#6685f5}.staff_ic{color:#6685f5}.tinynotice{color:#6685f5;font-size:85%}.tinynoticeital{color:#6685f5;font-style:italic;font-size:85%}.smallnotice{color:#6685f5;font-size:90%}.smallnoticeital{color:#6685f5;font-style:italic;font-size:90%}.boldnotice{color:#6685f5;font-weight:bold}.hear{color:#6685f5;font-style:italic}.adminnotice{color:#6685f5}.adminhelp{color:red;font-weight:bold}.unconscious{color:#a4bad6;font-weight:bold}.suicide{color:#ff5050;font-style:italic}.green{color:#059223}.grey{color:#838383}.red{color:red}.blue{color:#215cff}.nicegreen{color:#059223}.boldnicegreen{color:#059223;font-weight:bold}.cult{color:#973e3b}.cultitalic{color:#973e3b;font-style:italic}.cultbold{color:#973e3b;font-style:italic;font-weight:bold}.cultboldtalic{color:#973e3b;font-weight:bold;font-size:185%}.cultlarge{color:#973e3b;font-weight:bold;font-size:185%}.narsie{color:#973e3b;font-weight:bold;font-size:925%}.narsiesmall{color:#973e3b;font-weight:bold;font-size:370%}.colossus{color:#7f282a;font-size:310%}.hierophant{color:#b441ee;font-weight:bold;font-style:italic}.hierophant_warning{color:#c56bf1;font-style:italic}.purple{color:#9956d3}.holoparasite{color:#88809c}.revennotice{color:#c099e2}.revenboldnotice{color:#c099e2;font-weight:bold}.revenbignotice{color:#c099e2;font-weight:bold;font-size:185%}.revenminor{color:#823abb}.revenwarning{color:#760fbb;font-style:italic}.revendanger{color:#760fbb;font-weight:bold;font-size:185%}.deconversion_message{color:#a947ff;font-size:185%;font-style:italic}.ghostalert{color:#60f;font-style:italic;font-weight:bold}.alien{color:#855d85}.noticealien{color:#059223}.alertalien{color:#059223;font-weight:bold}.changeling{color:#059223;font-style:italic}.alertsyndie{color:red;font-size:185%;font-weight:bold}.spider{color:#80f;font-weight:bold;font-size:185%}.interface{color:#750e75}.sans{font-family:"Comic Sans MS",cursive,sans-serif}.papyrus{font-family:"Papyrus",cursive,sans-serif}.robot{font-family:"Courier New",cursive,sans-serif}.tape_recorder{color:red;font-family:"Courier New",cursive,sans-serif}.command_headset{font-weight:bold;font-size:160%}.small{font-size:60%}.big{font-size:185%}.reallybig{font-size:245%}.extremelybig{font-size:310%}.greentext{color:#059223;font-size:185%}.redtext{color:#c51e1e;font-size:185%}.clown{color:#ff70c1;font-size:160%;font-family:"Comic Sans MS",cursive,sans-serif;font-weight:bold}.singing{font-family:"Trebuchet MS",cursive,sans-serif;font-style:italic}.his_grace{color:#15d512;font-family:"Courier New",cursive,sans-serif;font-style:italic}.hypnophrase{color:#202020;font-weight:bold;animation:hypnocolor 1500ms infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#202020}25%{color:#4b02ac}50%{color:#9f41f1}75%{color:#541c9c}100%{color:#7adbf3}}.phobia{color:#d00;font-weight:bold;animation:phobia 750ms infinite}@keyframes phobia{0%{color:#f75a5a}50%{color:#d00}100%{color:#f75a5a}}.icon{height:1em;width:auto}.bigicon{font-size:2.5em}.memo{color:#638500;text-align:center}.memoedit{text-align:center;font-size:125%}.abductor{color:#c204c2;font-style:italic}.mind_control{color:#df3da9;font-size:100%;font-weight:bold;font-style:italic}.slime{color:#00ced1}.drone{color:#848482}.monkey{color:#975032}.swarmer{color:#2c75ff}.resonate{color:#298f85}.monkeyhive{color:#a56408}.monkeylead{color:#af6805;font-size:80%}.connectionClosed,.fatalError{background:red;color:#fff;padding:5px}.connectionClosed.restored{background:green}.internal.boldnshit{color:#3d5bc3;font-weight:bold}.text-normal{font-weight:normal;font-style:normal}.hidden{display:none;visibility:hidden}.ml-1{margin-left:1em}.ml-2{margin-left:2em}.ml-3{margin-left:3em}.xooc{color:#ac04e9;font-weight:bold;font-size:140%}.mooc{color:#090;font-weight:bold;font-size:140%}.yooc{color:#999600;font-weight:bold;font-size:140%}.headminsay{color:#653d78;font-weight:bold}.radio{color:#b4b4b4}.deptradio{color:#939}.comradio{color:#779cc2}.centradio{color:#5c5c8a}.hcradio{color:#318779}.pvstradio{color:#9b0612}.cryoradio{color:#ad6d48}.airadio{color:#f0f}.secradio{color:#a52929}.engradio{color:#a66300}.sentryradio{color:#844300}.medradio{color:#008160}.supradio{color:#ba8e41}.jtacradio{color:#ad3b98}.intelradio{color:#027d02}.wyradio{color:#fe9b24}.pmcradio{color:#4dc5ce}.vairadio{color:#e3580e}.rmcradio{color:#e3580e}.cmbradio{color:#1b748c}.clfradio{color:#8e83ca}.alpharadio{color:#db2626}.bravoradio{color:#c68610}.charlieradio{color:#a5a}.deltaradio{color:#007fcf}.echoradio{color:#3eb489}.medium{font-size:110%}.big{font-size:115%}.large{font-size:125%}.extra_large{font-size:130%}.huge{font-size:150%}.underline{text-decoration:underline}.orange{color:#eca100}.normal{font-style:normal}.attack{color:#ff3838}.moderate{color:#c00}.disarm{color:#900}.passive{color:#600}.helpful{color:#368f31}.scanner{color:#ff3838}.scannerb{color:#ff3838;font-weight:bold}.scannerburn{color:orange}.scannerburnb{color:orange;font-weight:bold}.rose{color:#ff5050}.debuginfo{color:#493d26;font-style:italic}.xenonotice{color:#51a16c}.xenoboldnotice{color:#51a16c;font-style:italic}.xenowarning{color:#51a16c;font-style:italic}.xenominorwarning{color:#51a16c;font-weight:bold;font-style:italic}.xenodanger{color:#51a16c;font-weight:bold}.avoidharm{color:#72a0e5;font-weight:bold}.highdanger{color:#ff3838;font-weight:bold;font-size:140%}.xenohighdanger{color:#51a16c;font-weight:bold;font-size:140%}.xenoannounce{color:#65c585;font-family:book-antiqua;font-weight:bold;font-size:140%}.yautjabold{color:purple;font-weight:bold}.yautjaboldbig{color:purple;font-weight:bold;font-size:120%}.objectivebig{font-weight:bold;font-size:130%}.objectivegreen{color:lime}.objectivered{color:red}.objectivesuccess{color:lime;font-weight:bold;font-size:110%}.objectivefail{color:red;font-weight:bold;font-size:110%}.xenotalk,.xeno{color:#c048c0;font-style:italic}.xenoleader{color:#996e99;font-style:italic;font-size:125%}.xenoqueen{color:#996e99;font-style:italic;font-weight:bold;font-size:125%}.newscaster{color:maroon}.role_header{color:#e92d2d;display:block;text-align:center;font-weight:bold;font-family:trebuchet-ms;font-size:150%}.role_body{color:#3a3ae9;display:block;text-align:center;font-size:125%}.round_header{color:#e92d2d;display:block;text-align:center;font-family:courier;font-weight:bold;font-size:180%}.round_body{color:#c5c5c5;display:block;text-align:center;font-family:trebuchet-ms;font-weight:bold;font-size:125%}.event_announcement{color:#600d48;font-family:arial-narrow;font-weight:bold;font-size:125%}.announce_header{color:#cecece;font-weight:bold;font-size:150%}.announce_header_blue{color:#7575f3;font-weight:bold;font-size:150%}.announce_header_admin{color:#7575f3;font-weight:bold;font-size:150%}.announce_body{color:#e92d2d;font-weight:normal;font-size:125%}.centerbold{display:block;text-align:center;font-weight:bold}.mod{color:#917455;font-weight:bold}.modooc{color:#184880;font-weight:bold}.adminmod{color:#7c440c;font-weight:bold}.mentorsay{color:#d4af57;font-weight:bold}.mentorhelp{color:#090;font-weight:bold}.mentorbody{color:#da6200;font-weight:bold}.mentorstaff{color:#b5850d;font-weight:bold}.staffsay{color:#b5850d;font-weight:bold}.tajaran{color:#803b56}.tajaran_signlang{color:#941c1c}.skrell{color:#00ced1}.soghun{color:#228b22}.changeling{color:purple}.vox{color:#a0a}.monkey{color:#966c47}.german{color:#858f1e;font-family:"Times New Roman",Times,serif}.spanish{color:#cf982b}.japanese{color:#940927}.chinese{color:#fe1919}.zombie{color:#2dacb1;font-style:italic}.rough{font-family:trebuchet-ms,cursive,sans-serif}.commando{color:#fe9b24;font-style:bold}.say_quote{font-family:Georgia,Verdana,sans-serif}.admin .message{color:#314cad}.admin .prefix{font-weight:bolder}.pm{font-size:110%}.deadsay{color:#8b4dff}.retro_translator{font-weight:bold}.yautja_translator{color:#a00;font-weight:bold;animation:glitch .5s infinite}@keyframes glitch{25%{color:#a00;transform:translate(-2px, -1px)}50%{color:#be0000;transform:translate(1px, -2px)}75%{color:#8d0000;transform:translate(-1px, 2px)}100%{color:#830000;transform:translate(1px, 1px)}}.examine_block{background:#1b1c1e;border:1px solid #a4bad6;margin:.5em;padding:.5em .75em}.examine_block .icon{width:1.5em;height:1.5em;margin:0;padding:0}.tooltip{font-style:italic;border-bottom:1px dashed #fff} -.theme-light .color-black{color:#000 !important}.theme-light .color-white{color:#e6e6e6 !important}.theme-light .color-red{color:#c82121 !important}.theme-light .color-orange{color:#e6630d !important}.theme-light .color-yellow{color:#e5c304 !important}.theme-light .color-olive{color:#a3b816 !important}.theme-light .color-green{color:#1d9f3b !important}.theme-light .color-teal{color:#00a39c !important}.theme-light .color-blue{color:#1e78bb !important}.theme-light .color-dark-blue{color:#004274 !important}.theme-light .color-violet{color:#5a30b5 !important}.theme-light .color-purple{color:#932eb4 !important}.theme-light .color-pink{color:#db228a !important}.theme-light .color-brown{color:#955d39 !important}.theme-light .color-grey{color:#e6e6e6 !important}.theme-light .color-light-grey{color:#999 !important}.theme-light .color-good{color:#529923 !important}.theme-light .color-average{color:#da810e !important}.theme-light .color-bad{color:#c82121 !important}.theme-light .color-label{color:#353535 !important}.theme-light .color-xeno{color:#4a3253 !important}.theme-light .color-bg-black{background-color:#000 !important}.theme-light .color-bg-white{background-color:#bfbfbf !important}.theme-light .color-bg-red{background-color:#a61c1c !important}.theme-light .color-bg-orange{background-color:#c0530b !important}.theme-light .color-bg-yellow{background-color:#bfa303 !important}.theme-light .color-bg-olive{background-color:#889912 !important}.theme-light .color-bg-green{background-color:#188532 !important}.theme-light .color-bg-teal{background-color:#008882 !important}.theme-light .color-bg-blue{background-color:#19649c !important}.theme-light .color-bg-dark-blue{background-color:#003761 !important}.theme-light .color-bg-violet{background-color:#4b2897 !important}.theme-light .color-bg-purple{background-color:#7a2696 !important}.theme-light .color-bg-pink{background-color:#b61d73 !important}.theme-light .color-bg-brown{background-color:#7c4d2f !important}.theme-light .color-bg-grey{background-color:#bfbfbf !important}.theme-light .color-bg-light-grey{background-color:gray !important}.theme-light .color-bg-good{background-color:#44801d !important}.theme-light .color-bg-average{background-color:#b56b0b !important}.theme-light .color-bg-bad{background-color:#a61c1c !important}.theme-light .color-bg-label{background-color:#2c2c2c !important}.theme-light .color-bg-xeno{background-color:#3e2945 !important}.theme-light .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#fff}.theme-light .Tabs--fill{height:100%}.theme-light .Section .Tabs{background-color:transparent}.theme-light .Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.theme-light .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.theme-light .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-light .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.theme-light .Tabs--horizontal:last-child{margin-bottom:0}.theme-light .Tabs__Tab{flex-grow:0}.theme-light .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-light .Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(0,0,0,.5);min-height:2.25em;min-width:4em}.theme-light .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.theme-light .Tab--selected{background-color:rgba(255,255,255,.125);color:#404040}.theme-light .Tab__text{flex-grow:1;margin:0 .5em}.theme-light .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-light .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-light .Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-light .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #000}.theme-light .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-light .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #000}.theme-light .Tab--selected.Tab--color--black{color:#404040}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-light .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#000}.theme-light .Tab--selected.Tab--color--white{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--red{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--orange{color:#f48942}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-light .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#e6630d}.theme-light .Tab--selected.Tab--color--yellow{color:#fcdd33}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#e5c304}.theme-light .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#e5c304}.theme-light .Tab--selected.Tab--color--olive{color:#d0e732}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#a3b816}.theme-light .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#a3b816}.theme-light .Tab--selected.Tab--color--green{color:#33da5a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-light .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#1d9f3b}.theme-light .Tab--selected.Tab--color--teal{color:#00faef}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-light .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00a39c}.theme-light .Tab--selected.Tab--color--blue{color:#419ce1}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-light .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#1e78bb}.theme-light .Tab--selected.Tab--color--dark-blue{color:#0079d7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--dark-blue{border-bottom-color:#004274}.theme-light .Tabs--vertical .Tab--selected.Tab--color--dark-blue{border-right-color:#004274}.theme-light .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-light .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#5a30b5}.theme-light .Tab--selected.Tab--color--purple{color:#b455d4}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-light .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#932eb4}.theme-light .Tab--selected.Tab--color--pink{color:#e558a7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-light .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#db228a}.theme-light .Tab--selected.Tab--color--brown{color:#c0825a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-light .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#955d39}.theme-light .Tab--selected.Tab--color--grey{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--light-grey{color:#b3b3b3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#999}.theme-light .Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#999}.theme-light .Tab--selected.Tab--color--good{color:#77d23b}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#529923}.theme-light .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#529923}.theme-light .Tab--selected.Tab--color--average{color:#f3a23a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#da810e}.theme-light .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#da810e}.theme-light .Tab--selected.Tab--color--bad{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--label{color:#686868}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#353535}.theme-light .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#353535}.theme-light .Tab--selected.Tab--color--xeno{color:#7e558e}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--xeno{border-bottom-color:#4a3253}.theme-light .Tabs--vertical .Tab--selected.Tab--color--xeno{border-right-color:#4a3253}.theme-light .Section{position:relative;margin-bottom:.5em;background-color:#fff;background-color:#fff;box-sizing:border-box}.theme-light .Section:last-child{margin-bottom:0}.theme-light .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #fff}.theme-light .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#000}.theme-light .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-light .Section__rest{position:relative}.theme-light .Section__content{padding:.66em .5em}.theme-light .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-light .Section--fill{display:flex;flex-direction:column;height:100%}.theme-light .Section--fill>.Section__rest{flex-grow:1}.theme-light .Section--fill>.Section__rest>.Section__content{height:100%}.theme-light .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-light .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-light .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-light .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-light .Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.theme-light .Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.theme-light .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-light .Section .Section:first-child{margin-top:-0.5em}.theme-light .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-light .Section .Section .Section .Section__titleText{font-size:1em}.theme-light .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-light .Button:last-child{margin-right:0;margin-bottom:0}.theme-light .Button .fa,.theme-light .Button .fas,.theme-light .Button .far{margin-left:-0.25em;margin-right:-0.25em;min-width:1.333em;text-align:center}.theme-light .Button--hasContent .fa,.theme-light .Button--hasContent .fas,.theme-light .Button--hasContent .far{margin-right:.25em}.theme-light .Button--hasContent.Button--iconPosition--right .fa,.theme-light .Button--hasContent.Button--iconPosition--right .fas,.theme-light .Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.theme-light .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-light .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-light .Button--circular{border-radius:50%}.theme-light .Button--compact{padding:0 .25em;line-height:1.333em}.theme-light .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.theme-light .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--black:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--black:hover,.theme-light .Button--color--black:focus{background-color:#131313;color:#fff}.theme-light .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--white:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--white:hover,.theme-light .Button--color--white:focus{background-color:#efefef;color:#000}.theme-light .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--red:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--red:hover,.theme-light .Button--color--red:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#c0530b;color:#fff}.theme-light .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--orange:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--orange:hover,.theme-light .Button--color--orange:focus{background-color:#ea7426;color:#fff}.theme-light .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#bfa303;color:#fff}.theme-light .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--yellow:hover,.theme-light .Button--color--yellow:focus{background-color:#efce17;color:#fff}.theme-light .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#889912;color:#fff}.theme-light .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--olive:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--olive:hover,.theme-light .Button--color--olive:focus{background-color:#afc328;color:#fff}.theme-light .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#188532;color:#fff}.theme-light .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--green:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--green:hover,.theme-light .Button--color--green:focus{background-color:#2fac4c;color:#fff}.theme-light .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#008882;color:#fff}.theme-light .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--teal:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--teal:hover,.theme-light .Button--color--teal:focus{background-color:#13afa9;color:#fff}.theme-light .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#19649c;color:#fff}.theme-light .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--blue:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--blue:hover,.theme-light .Button--color--blue:focus{background-color:#3086c7;color:#fff}.theme-light .Button--color--dark-blue{transition:color 50ms,background-color 50ms;background-color:#003761;color:#fff}.theme-light .Button--color--dark-blue:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--dark-blue:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--dark-blue:hover,.theme-light .Button--color--dark-blue:focus{background-color:#135283;color:#fff}.theme-light .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#4b2897;color:#fff}.theme-light .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--violet:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--violet:hover,.theme-light .Button--color--violet:focus{background-color:#6a41c1;color:#fff}.theme-light .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#7a2696;color:#fff}.theme-light .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--purple:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--purple:hover,.theme-light .Button--color--purple:focus{background-color:#a03fc0;color:#fff}.theme-light .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#b61d73;color:#fff}.theme-light .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--pink:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--pink:hover,.theme-light .Button--color--pink:focus{background-color:#da3f96;color:#fff}.theme-light .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#7c4d2f;color:#fff}.theme-light .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--brown:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--brown:hover,.theme-light .Button--color--brown:focus{background-color:#a26c49;color:#fff}.theme-light .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--grey:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--grey:hover,.theme-light .Button--color--grey:focus{background-color:#efefef;color:#000}.theme-light .Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:gray;color:#fff}.theme-light .Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--light-grey:hover,.theme-light .Button--color--light-grey:focus{background-color:#a6a6a6;color:#fff}.theme-light .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#44801d;color:#fff}.theme-light .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--good:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--good:hover,.theme-light .Button--color--good:focus{background-color:#62a635;color:#fff}.theme-light .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#b56b0b;color:#fff}.theme-light .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--average:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--average:hover,.theme-light .Button--color--average:focus{background-color:#e48f20;color:#fff}.theme-light .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--bad:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--bad:hover,.theme-light .Button--color--bad:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#2c2c2c;color:#fff}.theme-light .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--label:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--label:hover,.theme-light .Button--color--label:focus{background-color:#464646;color:#fff}.theme-light .Button--color--xeno{transition:color 50ms,background-color 50ms;background-color:#3e2945;color:#fff}.theme-light .Button--color--xeno:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--xeno:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--xeno:hover,.theme-light .Button--color--xeno:focus{background-color:#5a4363;color:#fff}.theme-light .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#bbb;color:#000}.theme-light .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--default:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--default:hover,.theme-light .Button--color--default:focus{background-color:#eaeaea;color:#000}.theme-light .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-light .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--caution:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--caution:hover,.theme-light .Button--color--caution:focus{background-color:#ec8420;color:#fff}.theme-light .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-light .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--danger:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--danger:hover,.theme-light .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-light .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#eee;color:#000;background-color:rgba(238,238,238,0);color:rgba(0,0,0,.5)}.theme-light .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--transparent:hover,.theme-light .Button--color--transparent:focus{background-color:#fcfcfc;color:#000}.theme-light .Button--disabled{background-color:#363636 !important}.theme-light .Button--selected{transition:color 50ms,background-color 50ms;background-color:#0668b8;color:#fff}.theme-light .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--selected:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--selected:hover,.theme-light .Button--selected:focus{background-color:#1a8be7;color:#fff}.theme-light .Button--flex{display:inline-flex;flex-direction:column}.theme-light .Button--flex--fluid{width:100%}.theme-light .Button--verticalAlignContent--top{justify-content:flex-start}.theme-light .Button--verticalAlignContent--middle{justify-content:center}.theme-light .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-light .Button__content{display:block;align-self:stretch}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#353535;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-light .NumberInput--fluid{display:block}.theme-light .NumberInput__content{margin-left:.5em}.theme-light .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-light .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #353535;background-color:#353535}.theme-light .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#fff;color:#000;text-align:right}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .TextArea{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;background-color:#fff;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-light .TextArea--fluid{display:block;width:auto;height:auto}.theme-light .TextArea--noborder{border:0px}.theme-light .TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.theme-light .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-light .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.theme-light .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto;margin-bottom:-0.2em;cursor:n-resize}.theme-light .Knob:after{content:".";color:transparent;line-height:2.5em}.theme-light .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%);border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.theme-light .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-light .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-light .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.theme-light .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-light .Knob__ringTrackPivot{transform:rotateZ(135deg)}.theme-light .Knob__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-light .Knob__ringFillPivot{transform:rotateZ(135deg)}.theme-light .Knob--bipolar .Knob__ringFillPivot{transform:rotateZ(270deg)}.theme-light .Knob__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-light .Knob--color--black .Knob__ringFill{stroke:#000}.theme-light .Knob--color--white .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--red .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--orange .Knob__ringFill{stroke:#e6630d}.theme-light .Knob--color--yellow .Knob__ringFill{stroke:#e5c304}.theme-light .Knob--color--olive .Knob__ringFill{stroke:#a3b816}.theme-light .Knob--color--green .Knob__ringFill{stroke:#1d9f3b}.theme-light .Knob--color--teal .Knob__ringFill{stroke:#00a39c}.theme-light .Knob--color--blue .Knob__ringFill{stroke:#1e78bb}.theme-light .Knob--color--dark-blue .Knob__ringFill{stroke:#004274}.theme-light .Knob--color--violet .Knob__ringFill{stroke:#5a30b5}.theme-light .Knob--color--purple .Knob__ringFill{stroke:#932eb4}.theme-light .Knob--color--pink .Knob__ringFill{stroke:#db228a}.theme-light .Knob--color--brown .Knob__ringFill{stroke:#955d39}.theme-light .Knob--color--grey .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--light-grey .Knob__ringFill{stroke:#999}.theme-light .Knob--color--good .Knob__ringFill{stroke:#529923}.theme-light .Knob--color--average .Knob__ringFill{stroke:#da810e}.theme-light .Knob--color--bad .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--label .Knob__ringFill{stroke:#353535}.theme-light .Knob--color--xeno .Knob__ringFill{stroke:#4a3253}.theme-light .Slider{cursor:e-resize}.theme-light .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none !important}.theme-light .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #000}.theme-light .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid transparent;border-right:.4166666667em solid transparent;border-bottom:.4166666667em solid #000}.theme-light .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.theme-light .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color 900ms ease-out}.theme-light .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-light .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-light .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-light .ProgressBar--color--default{border:.0833333333em solid #bfbfbf}.theme-light .ProgressBar--color--default .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--black{border-color:#000 !important}.theme-light .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-light .ProgressBar--color--white{border-color:#bfbfbf !important}.theme-light .ProgressBar--color--white .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--red{border-color:#a61c1c !important}.theme-light .ProgressBar--color--red .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--orange{border-color:#c0530b !important}.theme-light .ProgressBar--color--orange .ProgressBar__fill{background-color:#c0530b}.theme-light .ProgressBar--color--yellow{border-color:#bfa303 !important}.theme-light .ProgressBar--color--yellow .ProgressBar__fill{background-color:#bfa303}.theme-light .ProgressBar--color--olive{border-color:#889912 !important}.theme-light .ProgressBar--color--olive .ProgressBar__fill{background-color:#889912}.theme-light .ProgressBar--color--green{border-color:#188532 !important}.theme-light .ProgressBar--color--green .ProgressBar__fill{background-color:#188532}.theme-light .ProgressBar--color--teal{border-color:#008882 !important}.theme-light .ProgressBar--color--teal .ProgressBar__fill{background-color:#008882}.theme-light .ProgressBar--color--blue{border-color:#19649c !important}.theme-light .ProgressBar--color--blue .ProgressBar__fill{background-color:#19649c}.theme-light .ProgressBar--color--dark-blue{border-color:#003761 !important}.theme-light .ProgressBar--color--dark-blue .ProgressBar__fill{background-color:#003761}.theme-light .ProgressBar--color--violet{border-color:#4b2897 !important}.theme-light .ProgressBar--color--violet .ProgressBar__fill{background-color:#4b2897}.theme-light .ProgressBar--color--purple{border-color:#7a2696 !important}.theme-light .ProgressBar--color--purple .ProgressBar__fill{background-color:#7a2696}.theme-light .ProgressBar--color--pink{border-color:#b61d73 !important}.theme-light .ProgressBar--color--pink .ProgressBar__fill{background-color:#b61d73}.theme-light .ProgressBar--color--brown{border-color:#7c4d2f !important}.theme-light .ProgressBar--color--brown .ProgressBar__fill{background-color:#7c4d2f}.theme-light .ProgressBar--color--grey{border-color:#bfbfbf !important}.theme-light .ProgressBar--color--grey .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--light-grey{border-color:gray !important}.theme-light .ProgressBar--color--light-grey .ProgressBar__fill{background-color:gray}.theme-light .ProgressBar--color--good{border-color:#44801d !important}.theme-light .ProgressBar--color--good .ProgressBar__fill{background-color:#44801d}.theme-light .ProgressBar--color--average{border-color:#b56b0b !important}.theme-light .ProgressBar--color--average .ProgressBar__fill{background-color:#b56b0b}.theme-light .ProgressBar--color--bad{border-color:#a61c1c !important}.theme-light .ProgressBar--color--bad .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--label{border-color:#2c2c2c !important}.theme-light .ProgressBar--color--label .ProgressBar__fill{background-color:#2c2c2c}.theme-light .ProgressBar--color--xeno{border-color:#3e2945 !important}.theme-light .ProgressBar--color--xeno .ProgressBar__fill{background-color:#3e2945}.theme-light .Chat{color:#000}.theme-light .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:crimson;border-radius:10px;transition:font-size 200ms ease-out}.theme-light .Chat__badge:before{content:"x"}.theme-light .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-light .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-light .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-light .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#fff}.theme-light .Chat__reconnected:after{content:"";display:block;margin-top:-0.75em;border-bottom:.1666666667em solid #db2828}.theme-light .Chat__highlight{color:#000}.theme-light .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:bold}.theme-light .ChatMessage{word-wrap:break-word}.theme-light .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-light .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-light .Layout,.theme-light .Layout *{scrollbar-base-color:#f2f2f2;scrollbar-face-color:#d6d6d6;scrollbar-3dlight-color:#eee;scrollbar-highlight-color:#eee;scrollbar-track-color:#f2f2f2;scrollbar-arrow-color:#777;scrollbar-shadow-color:#d6d6d6}.theme-light .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-light .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-light .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#eee;background-image:linear-gradient(to bottom, #eeeeee 0%, #eeeeee 100%)}.theme-light .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-light .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-light .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-light .Window__contentPadding:after{height:0}.theme-light .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-light .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(252,252,252,.25);pointer-events:none}.theme-light .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-light .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-light .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-light .TitleBar{background-color:#eee;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-light .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#eee;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-light .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-light .TitleBar__title{position:absolute;display:inline-block;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap;pointer-events:none}.theme-light .TitleBar__buttons{pointer-events:initial;display:inline-block;width:100%;margin-left:10px}.theme-light .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-light .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-light .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-light .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-light html,.theme-light body{padding:0;margin:0;height:100%;color:#000}.theme-light body{background:#fff;font-family:Verdana,sans-serif;font-size:13px;line-height:1.2;overflow-x:hidden;overflow-y:scroll;word-wrap:break-word}.theme-light em{font-style:normal;font-weight:bold}.theme-light img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}.theme-light img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}.theme-light a{color:blue}.theme-light a.visited{color:#f0f}.theme-light a:visited{color:#f0f}.theme-light a.popt{text-decoration:none}.theme-light .popup{position:fixed;top:50%;left:50%;background:#ddd}.theme-light .popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.theme-light .popup .close:hover{background:#999}.theme-light .popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:bold;border-bottom:2px solid green}.theme-light .popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.theme-light .popup input[type=text]:hover,.theme-light .popup input[type=text]:active,.theme-light .popup input[type=text]:focus{border-color:green}.theme-light .popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:bold}.theme-light .popup input[type=submit]:hover,.theme-light .popup input[type=submit]:focus,.theme-light .popup input[type=submit]:active{background:#aaa;cursor:pointer}.theme-light .changeFont{padding:10px}.theme-light .changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.theme-light .changeFont a:hover{background:#ccc}.theme-light .highlightPopup{padding:10px;text-align:center}.theme-light .highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.theme-light .highlightPopup input.highlightColor{background-color:#ff0}.theme-light .highlightPopup input.highlightTermSubmit{margin-top:5px}.theme-light .contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.theme-light .contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.theme-light .contextMenu a:hover{background-color:#ccc}.theme-light .filterMessages{padding:5px}.theme-light .filterMessages div{padding:2px 0}.theme-light .icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.theme-light .motd{color:#638500;font-family:Verdana,sans-serif;white-space:normal}.theme-light .motd h1,.theme-light .motd h2,.theme-light .motd h3,.theme-light .motd h4,.theme-light .motd h5,.theme-light .motd h6{color:#638500;text-decoration:underline}.theme-light .motd a,.theme-light .motd a:link,.theme-light .motd a:visited,.theme-light .motd a:active,.theme-light .motd a:hover{color:#638500}.theme-light .bold,.theme-light .name,.theme-light .prefix,.theme-light .ooc,.theme-light .looc,.theme-light .adminooc,.theme-light .admin,.theme-light .medal,.theme-light .yell{font-weight:bold}.theme-light .italic,.theme-light .italics{font-style:italic}.theme-light .highlight{background:#ff0}.theme-light h1,.theme-light h2,.theme-light h3,.theme-light h4,.theme-light h5,.theme-light h6{color:blue;font-family:Georgia,Verdana,sans-serif}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light em{font-style:normal;font-weight:bold}.theme-light .ooc{font-weight:bold}.theme-light .adminobserverooc{color:#09c;font-weight:bold}.theme-light .adminooc{color:#700038;font-weight:bold}.theme-light .adminsay{color:#ff4500;font-weight:bold}.theme-light .admin{color:#4473ff;font-weight:bold}.theme-light .name{font-weight:bold}.theme-light .deadsay{color:#5c00e6}.theme-light .binarysay{color:#20c20e;background-color:#000;display:block}.theme-light .binarysay a{color:lime}.theme-light .binarysay a:active,.theme-light .binarysay a:visited{color:#8f8}.theme-light .radio{color:green}.theme-light .sciradio{color:#939}.theme-light .comradio{color:#948f02}.theme-light .secradio{color:#a30000}.theme-light .medradio{color:#337296}.theme-light .engradio{color:#fb5613}.theme-light .sentryradio{color:#844300}.theme-light .suppradio{color:#a8732b}.theme-light .servradio{color:#6eaa2c}.theme-light .syndradio{color:#6d3f40}.theme-light .gangradio{color:#ac2ea1}.theme-light .centcomradio{color:#686868}.theme-light .aiprivradio{color:#f0f}.theme-light .redteamradio{color:red}.theme-light .blueteamradio{color:blue}.theme-light .greenteamradio{color:lime}.theme-light .yellowteamradio{color:#d1ba22}.theme-light .yell{font-weight:bold}.theme-light .alert{color:red}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light .userdanger{color:red;font-weight:bold;font-size:185%}.theme-light .bolddanger{color:red;font-weight:bold}.theme-light .danger{color:red}.theme-light .tinydanger{color:red;font-size:85%}.theme-light .smalldanger{color:red;font-size:90%}.theme-light .warning{color:red;font-style:italic}.theme-light .alertwarning{color:red;font-weight:bold}.theme-light .boldwarning{color:red;font-style:italic;font-weight:bold}.theme-light .announce{color:#228b22;font-weight:bold}.theme-light .boldannounce{color:red;font-weight:bold}.theme-light .minorannounce{font-weight:bold;font-size:185%}.theme-light .greenannounce{color:lime;font-weight:bold}.theme-light .rose{color:#ff5050}.theme-light .info{color:#00c}.theme-light .notice{color:#009}.theme-light .staff_ic{color:#009}.theme-light .tinynotice{color:#009;font-size:85%}.theme-light .tinynoticeital{color:#009;font-style:italic;font-size:85%}.theme-light .smallnotice{color:#009;font-size:90%}.theme-light .smallnoticeital{color:#009;font-style:italic;font-size:90%}.theme-light .boldnotice{color:#009;font-weight:bold}.theme-light .hear{color:#009;font-style:italic}.theme-light .adminnotice{color:blue}.theme-light .adminhelp{color:red;font-weight:bold}.theme-light .unconscious{color:blue;font-weight:bold}.theme-light .suicide{color:#ff5050;font-style:italic}.theme-light .green{color:#03ff39}.theme-light .grey{color:#838383}.theme-light .red{color:red}.theme-light .blue{color:blue}.theme-light .nicegreen{color:#14a833}.theme-light .boldnicegreen{color:#14a833;font-weight:bold}.theme-light .cult{color:#973e3b}.theme-light .cultitalic{color:#973e3b;font-style:italic}.theme-light .cultbold{color:#973e3b;font-style:italic;font-weight:bold}.theme-light .cultboldtalic{color:#973e3b;font-weight:bold;font-size:185%}.theme-light .cultlarge{color:#973e3b;font-weight:bold;font-size:185%}.theme-light .narsie{color:#973e3b;font-weight:bold;font-size:925%}.theme-light .narsiesmall{color:#973e3b;font-weight:bold;font-size:370%}.theme-light .colossus{color:#7f282a;font-size:310%}.theme-light .hierophant{color:#609;font-weight:bold;font-style:italic}.theme-light .hierophant_warning{color:#609;font-style:italic}.theme-light .purple{color:#5e2d79}.theme-light .holoparasite{color:#35333a}.theme-light .revennotice{color:#1d2953}.theme-light .revenboldnotice{color:#1d2953;font-weight:bold}.theme-light .revenbignotice{color:#1d2953;font-weight:bold;font-size:185%}.theme-light .revenminor{color:#823abb}.theme-light .revenwarning{color:#760fbb;font-style:italic}.theme-light .revendanger{color:#760fbb;font-weight:bold;font-size:185%}.theme-light .deconversion_message{color:#5000a0;font-size:185%;font-style:italic}.theme-light .ghostalert{color:#5c00e6;font-style:italic;font-weight:bold}.theme-light .alien{color:#543354}.theme-light .noticealien{color:#00c000}.theme-light .alertalien{color:#00c000;font-weight:bold}.theme-light .changeling{color:purple;font-style:italic}.theme-light .alertsyndie{color:red;font-size:185%;font-weight:bold}.theme-light .spider{color:#4d004d;font-weight:bold;font-size:185%}.theme-light .interface{color:#303}.theme-light .sans{font-family:"Comic Sans MS",cursive,sans-serif}.theme-light .papyrus{font-family:"Papyrus",cursive,sans-serif}.theme-light .robot{font-family:"Courier New",cursive,sans-serif}.theme-light .tape_recorder{color:maroon;font-family:"Courier New",cursive,sans-serif}.theme-light .command_headset{font-weight:bold;font-size:160%}.theme-light .small{font-size:60%}.theme-light .big{font-size:185%}.theme-light .reallybig{font-size:245%}.theme-light .extremelybig{font-size:310%}.theme-light .greentext{color:lime;font-size:185%}.theme-light .redtext{color:red;font-size:185%}.theme-light .clown{color:#ff69bf;font-size:160%;font-family:"Comic Sans MS",cursive,sans-serif;font-weight:bold}.theme-light .singing{font-family:"Trebuchet MS",cursive,sans-serif;font-style:italic}.theme-light .his_grace{color:#15d512;font-family:"Courier New",cursive,sans-serif;font-style:italic}.theme-light .hypnophrase{color:#0d0d0d;font-weight:bold;animation:hypnocolor 1500ms infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#0d0d0d}25%{color:#410194}50%{color:#7f17d8}75%{color:#410194}100%{color:#3bb5d3}}.theme-light .phobia{color:#d00;font-weight:bold;animation:phobia 750ms infinite}@keyframes phobia{0%{color:#0d0d0d}50%{color:#d00}100%{color:#0d0d0d}}.theme-light .icon{height:1em;width:auto}.theme-light .bigicon{font-size:2.5em}.theme-light .memo{color:#638500;text-align:center}.theme-light .memoedit{text-align:center;font-size:125%}.theme-light .abductor{color:purple;font-style:italic}.theme-light .mind_control{color:#a00d6f;font-size:100%;font-weight:bold;font-style:italic}.theme-light .slime{color:#00ced1}.theme-light .drone{color:#848482}.theme-light .monkey{color:#975032}.theme-light .swarmer{color:#2c75ff}.theme-light .resonate{color:#298f85}.theme-light .monkeyhive{color:#774704}.theme-light .monkeylead{color:#774704;font-size:80%}.theme-light .connectionClosed,.theme-light .fatalError{background:red;color:#fff;padding:5px}.theme-light .connectionClosed.restored{background:green}.theme-light .internal.boldnshit{color:blue;font-weight:bold}.theme-light .text-normal{font-weight:normal;font-style:normal}.theme-light .hidden{display:none;visibility:hidden}.theme-light .ml-1{margin-left:1em}.theme-light .ml-2{margin-left:2em}.theme-light .ml-3{margin-left:3em}.theme-light .xooc{color:#6c0094;font-weight:bold;font-size:140%}.theme-light .mooc{color:#090;font-weight:bold;font-size:140%}.theme-light .yooc{color:#999600;font-weight:bold;font-size:140%}.theme-light .headminsay{color:#5a0a7f;font-weight:bold}.theme-light .radio{color:#4e4e4e}.theme-light .deptradio{color:#939}.theme-light .comradio{color:#004080}.theme-light .centradio{color:#5c5c8a}.theme-light .cryoradio{color:#554e3f}.theme-light .hcradio{color:#318779}.theme-light .pvstradio{color:#9b0612}.theme-light .airadio{color:#f0f}.theme-light .secradio{color:#a30000}.theme-light .engradio{color:#a66300}.theme-light .sentryradio{color:#844300}.theme-light .medradio{color:#008160}.theme-light .supradio{color:#5f4519}.theme-light .jtacradio{color:#702963}.theme-light .intelradio{color:#027d02}.theme-light .wyradio{color:#fe9b24}.theme-light .pmcradio{color:#136957}.theme-light .vairadio{color:#943d0a}.theme-light .cmbradio{color:#1b748c}.theme-light .clfradio{color:#6f679c}.theme-light .alpharadio{color:#ea0000}.theme-light .bravoradio{color:#c68610}.theme-light .charlieradio{color:#a5a}.theme-light .deltaradio{color:#007fcf}.theme-light .echoradio{color:#3a7e65}.theme-light .medium{font-size:110%}.theme-light .big{font-size:115%}.theme-light .large{font-size:125%}.theme-light .extra_large{font-size:130%}.theme-light .huge{font-size:150%}.theme-light .underline{text-decoration:underline}.theme-light .orange{color:#eca100}.theme-light .normal{font-style:normal}.theme-light .attack{color:red}.theme-light .moderate{color:#c00}.theme-light .disarm{color:#900}.theme-light .passive{color:#600}.theme-light .helpful{color:#368f31}.theme-light .scanner{color:red}.theme-light .scannerb{color:red;font-weight:bold}.theme-light .scannerburn{color:orange}.theme-light .scannerburnb{color:orange;font-weight:bold}.theme-light .rose{color:#ff5050}.theme-light .debuginfo{color:#493d26;font-style:italic}.theme-light .xenonotice{color:#2a623d}.theme-light .xenoboldnotice{color:#2a623d;font-style:italic}.theme-light .xenowarning{color:#2a623d;font-style:italic}.theme-light .xenominorwarning{color:#2a623d;font-weight:bold;font-style:italic}.theme-light .xenodanger{color:#2a623d;font-weight:bold}.theme-light .avoidharm{color:#72a0e5;font-weight:bold}.theme-light .highdanger{color:red;font-weight:bold;font-size:140%}.theme-light .xenohighdanger{color:#2a623d;font-weight:bold;font-size:140%}.theme-light .xenoannounce{color:#1a472a;font-family:book-antiqua;font-weight:bold;font-size:140%}.theme-light .yautjabold{color:purple;font-weight:bold}.theme-light .yautjaboldbig{color:purple;font-weight:bold;font-size:120%}.theme-light .objectivebig{font-weight:bold;font-size:130%}.theme-light .objectivegreen{color:lime}.theme-light .objectivered{color:red}.theme-light .objectivesuccess{color:lime;font-weight:bold;font-size:110%}.theme-light .objectivefail{color:red;font-weight:bold;font-size:110%}.theme-light .xenotalk,.theme-light .xeno{color:#900090;font-style:italic}.theme-light .xenoleader{color:#730d73;font-style:italic;font-size:125%}.theme-light .xenoqueen{color:#730d73;font-style:italic;font-weight:bold;font-size:125%}.theme-light .newscaster{color:maroon}.theme-light .role_header{color:#db0000;display:block;text-align:center;font-weight:bold;font-family:trebuchet-ms;font-size:150%}.theme-light .role_body{color:#009;display:block;text-align:center;font-size:125%}.theme-light .round_header{color:#db0000;display:block;text-align:center;font-family:courier;font-weight:bold;font-size:180%}.theme-light .round_body{color:#001427;display:block;text-align:center;font-family:trebuchet-ms;font-weight:bold;font-size:125%}.theme-light .event_announcement{color:#600d48;font-family:arial-narrow;font-weight:bold;font-size:125%}.theme-light .announce_header{color:#000;font-weight:bold;font-size:150%}.theme-light .announce_header_blue{color:#009;font-weight:bold;font-size:150%}.theme-light .announce_body{color:red;font-weight:normal;font-size:125%}.theme-light .centerbold{display:block;text-align:center;font-weight:bold}.theme-light .mod{color:#735638;font-weight:bold}.theme-light .modooc{color:#184880;font-weight:bold}.theme-light .adminmod{color:#402a14;font-weight:bold}.theme-light .mentorsay{color:#b38c32;font-weight:bold}.theme-light .mentorhelp{color:#007e00;font-weight:bold}.theme-light .mentorbody{color:#da6200;font-weight:bold}.theme-light .mentorstaff{color:#876101;font-weight:bold}.theme-light .staffsay{color:#876101;font-weight:bold}.theme-light .tajaran{color:#803b56}.theme-light .tajaran_signlang{color:#941c1c}.theme-light .skrell{color:#00ced1}.theme-light .soghun{color:#228b22}.theme-light .changeling{color:purple}.theme-light .vox{color:#a0a}.theme-light .monkey{color:#966c47}.theme-light .german{color:#858f1e;font-family:"Times New Roman",Times,serif}.theme-light .spanish{color:#cf982b}.theme-light .japanese{color:#940927}.theme-light .chinese{color:#fe1919}.theme-light .zombie{color:#216163;font-style:italic}.theme-light .commando{color:#fe9b24;font-style:bold}.theme-light .rough{font-family:trebuchet-ms,cursive,sans-serif}.theme-light .say_quote{font-family:Georgia,Verdana,sans-serif}.theme-light .admin .message{color:#314cad}.theme-light .admin .prefix{font-weight:bolder}.theme-light .pm{font-size:110%}.theme-light .retro_translator{font-weight:bold}.theme-light .yautja_translator{color:#a00;font-weight:bold;animation:glitch .5s infinite}@keyframes glitch{25%{color:#a00;transform:translate(-2px, -1px)}50%{color:#be0000;transform:translate(1px, -2px)}75%{color:#8d0000;transform:translate(-1px, 2px)}100%{color:#830000;transform:translate(1px, 1px)}}.theme-light .examine_block{background:#f2f7fa;border:1px solid #111a27;margin:.5em;padding:.5em .75em}.theme-light .examine_block .icon{width:1.5em;height:1.5em;margin:0;padding:0}.theme-light .tooltip{font-style:italic;border-bottom:1px dashed #000} +html,body{box-sizing:border-box;height:100%;margin:0;font-size:12px}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif}*,*:before,*:after{box-sizing:inherit}h1,h2,h3,h4,h5,h6{display:block;margin:0;padding:6px 0;padding:.5rem 0}h1{font-size:18px;font-size:1.5rem}h2{font-size:16px;font-size:1.333rem}h3{font-size:14px;font-size:1.167rem}h4{font-size:12px;font-size:1rem}td,th{vertical-align:baseline;text-align:left}.candystripe:nth-child(odd){background-color:rgba(0,0,0,.25)}.color-black{color:#1a1a1a !important}.color-white{color:#fff !important}.color-red{color:#df3e3e !important}.color-orange{color:#f37f33 !important}.color-yellow{color:#fbda21 !important}.color-olive{color:#cbe41c !important}.color-green{color:#25ca4c !important}.color-teal{color:#00d6cc !important}.color-blue{color:#2e93de !important}.color-dark-blue{color:#005fa7 !important}.color-violet{color:#7349cf !important}.color-purple{color:#ad45d0 !important}.color-pink{color:#e34da1 !important}.color-brown{color:#b97447 !important}.color-grey{color:#848484 !important}.color-light-grey{color:#b3b3b3 !important}.color-good{color:#68c22d !important}.color-average{color:#f29a29 !important}.color-bad{color:#df3e3e !important}.color-label{color:#8b9bb0 !important}.color-xeno{color:#664573 !important}.color-bg-black{background-color:#000 !important}.color-bg-white{background-color:#d9d9d9 !important}.color-bg-red{background-color:#bd2020 !important}.color-bg-orange{background-color:#d95e0c !important}.color-bg-yellow{background-color:#d9b804 !important}.color-bg-olive{background-color:#9aad14 !important}.color-bg-green{background-color:#1b9638 !important}.color-bg-teal{background-color:#009a93 !important}.color-bg-blue{background-color:#1c71b1 !important}.color-bg-dark-blue{background-color:#003e6e !important}.color-bg-violet{background-color:#552dab !important}.color-bg-purple{background-color:#8b2baa !important}.color-bg-pink{background-color:#cf2082 !important}.color-bg-brown{background-color:#8c5836 !important}.color-bg-grey{background-color:#646464 !important}.color-bg-light-grey{background-color:#919191 !important}.color-bg-good{background-color:#4d9121 !important}.color-bg-average{background-color:#cd7a0d !important}.color-bg-bad{background-color:#bd2020 !important}.color-bg-label{background-color:#657a94 !important}.color-bg-xeno{background-color:#462f4e !important}.debug-layout,.debug-layout *:not(g):not(path){color:rgba(255,255,255,.9) !important;background:transparent !important;outline:1px solid rgba(255,255,255,.5) !important;box-shadow:none !important;filter:none !important}.debug-layout:hover,.debug-layout *:not(g):not(path):hover{outline-color:rgba(255,255,255,.8) !important}.outline-dotted{outline-style:dotted !important}.outline-dashed{outline-style:dashed !important}.outline-solid{outline-style:solid !important}.outline-double{outline-style:double !important}.outline-groove{outline-style:groove !important}.outline-ridge{outline-style:ridge !important}.outline-inset{outline-style:inset !important}.outline-outset{outline-style:outset !important}.outline-color-black{outline:.167rem solid #1a1a1a !important}.outline-color-white{outline:.167rem solid #fff !important}.outline-color-red{outline:.167rem solid #df3e3e !important}.outline-color-orange{outline:.167rem solid #f37f33 !important}.outline-color-yellow{outline:.167rem solid #fbda21 !important}.outline-color-olive{outline:.167rem solid #cbe41c !important}.outline-color-green{outline:.167rem solid #25ca4c !important}.outline-color-teal{outline:.167rem solid #00d6cc !important}.outline-color-blue{outline:.167rem solid #2e93de !important}.outline-color-dark-blue{outline:.167rem solid #005fa7 !important}.outline-color-violet{outline:.167rem solid #7349cf !important}.outline-color-purple{outline:.167rem solid #ad45d0 !important}.outline-color-pink{outline:.167rem solid #e34da1 !important}.outline-color-brown{outline:.167rem solid #b97447 !important}.outline-color-grey{outline:.167rem solid #848484 !important}.outline-color-light-grey{outline:.167rem solid #b3b3b3 !important}.outline-color-good{outline:.167rem solid #68c22d !important}.outline-color-average{outline:.167rem solid #f29a29 !important}.outline-color-bad{outline:.167rem solid #df3e3e !important}.outline-color-label{outline:.167rem solid #8b9bb0 !important}.outline-color-xeno{outline:.167rem solid #664573 !important}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:bold}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.BlockQuote{color:#8b9bb0;border-left:.1666666667em solid #8b9bb0;padding-left:.5em;margin-bottom:.5em}.BlockQuote:last-child{margin-bottom:0}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fas,.Button .far{margin-left:-0.25em;margin-right:-0.25em;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fas,.Button--hasContent .far{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--dark-blue{transition:color 50ms,background-color 50ms;background-color:#003e6e;color:#fff}.Button--color--dark-blue:hover{transition:color 0ms,background-color 0ms}.Button--color--dark-blue:focus{transition:color 100ms,background-color 100ms}.Button--color--dark-blue:hover,.Button--color--dark-blue:focus{background-color:#135b92;color:#fff}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--xeno{transition:color 50ms,background-color 50ms;background-color:#462f4e;color:#fff}.Button--color--xeno:hover{transition:color 0ms,background-color 0ms}.Button--color--xeno:focus{transition:color 100ms,background-color 100ms}.Button--color--xeno:hover,.Button--color--xeno:focus{background-color:#64496d;color:#fff}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#202020;color:#fff;background-color:rgba(32,32,32,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#383838;color:#fff}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.ColorBox{display:inline-block;width:1em;height:1em;line-height:1em;text-align:center}.Dimmer{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.75);z-index:1}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Dropdown{position:relative}.Dropdown__control{position:relative;display:inline-block;font-family:Verdana,sans-serif;font-size:1em;width:8.3333333333em;line-height:1.4166666667em;user-select:none}.Dropdown__arrow-button{float:right;padding-left:.35em;width:1.2em;height:1.8333333333em;border-left:.0833333333em solid #000;border-left:.0833333333em solid rgba(0,0,0,.25)}.Dropdown__menu{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;overflow-y:scroll;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menu-noscroll{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menuentry{padding:.1666666667em .3333333333em;font-family:Verdana,sans-serif;font-size:1em;line-height:1.4166666667em;transition:background-color 100ms ease-out}.Dropdown__menuentry:hover{background-color:rgba(255,255,255,.2);transition:background-color 0ms}.Dropdown__over{top:auto;bottom:100%}.Dropdown__selected-text{display:inline-block;text-overflow:ellipsis;white-space:nowrap;height:1.4166666667em;width:calc(100% - 1.2em)}.Flex{display:-ms-flexbox;display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:block}.Flex--iefix.Flex--inline{display:inline-block}.Flex__item--iefix{display:inline-block}.Flex--iefix--column>.Flex__item--iefix{display:block}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto;margin-bottom:-0.2em;cursor:n-resize}.Knob:after{content:".";color:transparent;line-height:2.5em}.Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%);border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.Knob__ringTrackPivot{transform:rotateZ(135deg)}.Knob__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotateZ(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotateZ(270deg)}.Knob__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.Knob--color--white .Knob__ringFill{stroke:#fff}.Knob--color--red .Knob__ringFill{stroke:#df3e3e}.Knob--color--orange .Knob__ringFill{stroke:#f37f33}.Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.Knob--color--green .Knob__ringFill{stroke:#25ca4c}.Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.Knob--color--blue .Knob__ringFill{stroke:#2e93de}.Knob--color--dark-blue .Knob__ringFill{stroke:#005fa7}.Knob--color--violet .Knob__ringFill{stroke:#7349cf}.Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.Knob--color--pink .Knob__ringFill{stroke:#e34da1}.Knob--color--brown .Knob__ringFill{stroke:#b97447}.Knob--color--grey .Knob__ringFill{stroke:#848484}.Knob--color--light-grey .Knob__ringFill{stroke:#b3b3b3}.Knob--color--good .Knob__ringFill{stroke:#68c22d}.Knob--color--average .Knob__ringFill{stroke:#f29a29}.Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.Knob--color--xeno .Knob__ringFill{stroke:#664573}.LabeledList{display:table;width:100%;width:calc(100% + 1em);border-collapse:collapse;border-spacing:0;margin:-0.25em -0.5em;margin-bottom:0;padding:0}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{display:table-cell;margin:0;padding:.25em .5em;border:0;text-align:left}.LabeledList__label--nowrap{width:1%;white-space:nowrap;min-width:5em}.LabeledList__buttons{width:.1%;white-space:nowrap;text-align:right;padding-top:.0833333333em;padding-bottom:0}.Modal{background-color:#202020;max-width:calc(100% - 1rem);padding:1rem}.NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:bold;font-style:italic;color:#000;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg, transparent, transparent 0.8333333333em, rgba(0, 0, 0, 0.1) 0.8333333333em, rgba(0, 0, 0, 0.1) 1.6666666667em)}.NoticeBox--color--black{color:#fff;background-color:#000}.NoticeBox--color--white{color:#000;background-color:#b3b3b3}.NoticeBox--color--red{color:#fff;background-color:#701f1f}.NoticeBox--color--orange{color:#fff;background-color:#854114}.NoticeBox--color--yellow{color:#000;background-color:#83710d}.NoticeBox--color--olive{color:#000;background-color:#576015}.NoticeBox--color--green{color:#fff;background-color:#174e24}.NoticeBox--color--teal{color:#fff;background-color:#064845}.NoticeBox--color--blue{color:#fff;background-color:#1b4565}.NoticeBox--color--dark-blue{color:#fff;background-color:#02121f}.NoticeBox--color--violet{color:#fff;background-color:#3b2864}.NoticeBox--color--purple{color:#fff;background-color:#542663}.NoticeBox--color--pink{color:#fff;background-color:#802257}.NoticeBox--color--brown{color:#fff;background-color:#4c3729}.NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.NoticeBox--color--light-grey{color:#fff;background-color:#6a6a6a}.NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.NoticeBox--color--average{color:#fff;background-color:#7b4e13}.NoticeBox--color--bad{color:#fff;background-color:#701f1f}.NoticeBox--color--label{color:#fff;background-color:#53565a}.NoticeBox--color--xeno{color:#fff;background-color:#19161b}.NoticeBox--type--info{color:#fff;background-color:#235982}.NoticeBox--type--success{color:#fff;background-color:#1e662f}.NoticeBox--type--warning{color:#fff;background-color:#a95219}.NoticeBox--type--danger{color:#fff;background-color:#8f2828}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:.5em}.NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color 900ms ease-out}.ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.ProgressBar--color--default{border:.0833333333em solid #3e6189}.ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.ProgressBar--color--black{border-color:#000 !important}.ProgressBar--color--black .ProgressBar__fill{background-color:#000}.ProgressBar--color--white{border-color:#d9d9d9 !important}.ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.ProgressBar--color--red{border-color:#bd2020 !important}.ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--orange{border-color:#d95e0c !important}.ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.ProgressBar--color--yellow{border-color:#d9b804 !important}.ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.ProgressBar--color--olive{border-color:#9aad14 !important}.ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.ProgressBar--color--green{border-color:#1b9638 !important}.ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.ProgressBar--color--teal{border-color:#009a93 !important}.ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.ProgressBar--color--blue{border-color:#1c71b1 !important}.ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.ProgressBar--color--dark-blue{border-color:#003e6e !important}.ProgressBar--color--dark-blue .ProgressBar__fill{background-color:#003e6e}.ProgressBar--color--violet{border-color:#552dab !important}.ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.ProgressBar--color--purple{border-color:#8b2baa !important}.ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.ProgressBar--color--pink{border-color:#cf2082 !important}.ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.ProgressBar--color--brown{border-color:#8c5836 !important}.ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.ProgressBar--color--grey{border-color:#646464 !important}.ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.ProgressBar--color--light-grey{border-color:#919191 !important}.ProgressBar--color--light-grey .ProgressBar__fill{background-color:#919191}.ProgressBar--color--good{border-color:#4d9121 !important}.ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.ProgressBar--color--average{border-color:#cd7a0d !important}.ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.ProgressBar--color--bad{border-color:#bd2020 !important}.ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--label{border-color:#657a94 !important}.ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.ProgressBar--color--xeno{border-color:#462f4e !important}.ProgressBar--color--xeno .ProgressBar__fill{background-color:#462f4e}.Section{position:relative;margin-bottom:.5em;background-color:#131313;background-color:#131313;box-sizing:border-box}.Section:last-child{margin-bottom:0}.Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fff}.Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.Section__rest{position:relative}.Section__content{padding:.66em .5em}.Section--fitted>.Section__rest>.Section__content{padding:0}.Section--fill{display:flex;flex-direction:column;height:100%}.Section--fill>.Section__rest{flex-grow:1}.Section--fill>.Section__rest>.Section__content{height:100%}.Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.Section--scrollable{overflow-x:hidden;overflow-y:hidden}.Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.Section .Section:first-child{margin-top:-0.5em}.Section .Section .Section__titleText{font-size:1.0833333333em}.Section .Section .Section .Section__titleText{font-size:1em}.Slider{cursor:e-resize}.Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none !important}.Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid transparent;border-right:.4166666667em solid transparent;border-bottom:.4166666667em solid #fff}.Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--fill{height:100%}.Stack--horizontal>.Stack__item{margin-left:.5em}.Stack--horizontal>.Stack__item:first-child{margin-left:0}.Stack--vertical>.Stack__item{margin-top:.5em}.Stack--vertical>.Stack__item:first-child{margin-top:0}.Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Table{display:table;width:100%;border-collapse:collapse;border-spacing:0;margin:0}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{display:table-cell;padding:0 .25em}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__row--header .Table__cell,.Table__cell--header{font-weight:bold;padding-bottom:.5em}.Table__cell--collapsing{width:1%;white-space:nowrap}.Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#131313}.Tabs--fill{height:100%}.Section .Tabs{background-color:transparent}.Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.Tabs--horizontal:last-child{margin-bottom:0}.Tabs__Tab{flex-grow:0}.Tabs--fluid .Tabs__Tab{flex-grow:1}.Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em}.Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.Tab__text{flex-grow:1;margin:0 .5em}.Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4dfec}.Tab--selected.Tab--color--black{color:#535353}.Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#1a1a1a}.Tab--selected.Tab--color--white{color:#fff}.Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#fff}.Tab--selected.Tab--color--red{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#df3e3e}.Tab--selected.Tab--color--orange{color:#f69f66}.Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#f37f33}.Tab--selected.Tab--color--yellow{color:#fce358}.Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#fbda21}.Tab--selected.Tab--color--olive{color:#d8eb55}.Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#cbe41c}.Tab--selected.Tab--color--green{color:#53e074}.Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#25ca4c}.Tab--selected.Tab--color--teal{color:#21fff5}.Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00d6cc}.Tab--selected.Tab--color--blue{color:#62aee6}.Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#2e93de}.Tab--selected.Tab--color--dark-blue{color:#008ffd}.Tabs--horizontal .Tab--selected.Tab--color--dark-blue{border-bottom-color:#005fa7}.Tabs--vertical .Tab--selected.Tab--color--dark-blue{border-right-color:#005fa7}.Tab--selected.Tab--color--violet{color:#9676db}.Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#7349cf}.Tab--selected.Tab--color--purple{color:#c274db}.Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#ad45d0}.Tab--selected.Tab--color--pink{color:#ea79b9}.Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#e34da1}.Tab--selected.Tab--color--brown{color:#ca9775}.Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#b97447}.Tab--selected.Tab--color--grey{color:#a3a3a3}.Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#848484}.Tab--selected.Tab--color--light-grey{color:#c6c6c6}.Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#b3b3b3}.Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#b3b3b3}.Tab--selected.Tab--color--good{color:#8cd95a}.Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#68c22d}.Tab--selected.Tab--color--average{color:#f5b35e}.Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#f29a29}.Tab--selected.Tab--color--bad{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#df3e3e}.Tab--selected.Tab--color--label{color:#a8b4c4}.Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#8b9bb0}.Tab--selected.Tab--color--xeno{color:#9366a3}.Tabs--horizontal .Tab--selected.Tab--color--xeno{border-bottom-color:#664573}.Tabs--vertical .Tab--selected.Tab--color--xeno{border-right-color:#664573}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.TextArea--fluid{display:block;width:auto;height:auto}.TextArea--noborder{border:0px}.TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity 150ms ease-out;background-color:#000;color:#fff;box-shadow:.1em .1em 1.25em -0.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.Chat{color:#abc6ec}.Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:crimson;border-radius:10px;transition:font-size 200ms ease-out}.Chat__badge:before{content:"x"}.Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.Chat__scrollButton{position:fixed;right:2em;bottom:1em}.Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#131313}.Chat__reconnected:after{content:"";display:block;margin-top:-0.75em;border-bottom:.1666666667em solid #db2828}.Chat__highlight{color:#000}.Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:bold}.ChatMessage{word-wrap:break-word}.ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.Ping{position:relative;padding:.125em .25em;border:.0833333333em solid rgba(140,140,140,.5);border-radius:.25em;width:3.75em;text-align:right}.Ping__indicator{content:"";position:absolute;top:.5em;left:.5em;width:.5em;height:.5em;background-color:#888;border-radius:.25em}.Notifications{position:absolute;bottom:1em;left:1em;right:2em}.Notification{color:#fff;background-color:crimson;padding:.5em;margin:1em 0}.Notification:first-child{margin-top:0}.Notification:last-child{margin-bottom:0}.Layout,.Layout *{scrollbar-base-color:#181818;scrollbar-face-color:#363636;scrollbar-3dlight-color:#202020;scrollbar-highlight-color:#202020;scrollbar-track-color:#181818;scrollbar-arrow-color:#909090;scrollbar-shadow-color:#363636}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#202020;background-image:linear-gradient(to bottom, #202020 0%, #202020 100%)}.Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(56,56,56,.25);pointer-events:none}.Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}em{font-style:normal;font-weight:bold}img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}a{color:#397ea5}a.visited{color:#7c00e6}a:visited{color:#7c00e6}a.popt{text-decoration:none}.popup{position:fixed;top:50%;left:50%;background:#ddd}.popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.popup .close:hover{background:#999}.popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:bold;border-bottom:2px solid green}.popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.popup input[type=text]:hover,.popup input[type=text]:active,.popup input[type=text]:focus{border-color:green}.popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:bold}.popup input[type=submit]:hover,.popup input[type=submit]:focus,.popup input[type=submit]:active{background:#aaa;cursor:pointer}.changeFont{padding:10px}.changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.changeFont a:hover{background:#ccc}.highlightPopup{padding:10px;text-align:center}.highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.highlightPopup input.highlightColor{background-color:#ff0}.highlightPopup input.highlightTermSubmit{margin-top:5px}.contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.contextMenu a:hover{background-color:#ccc}.filterMessages{padding:5px}.filterMessages div{padding:2px 0}.icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.motd{color:#a4bad6;font-family:Verdana,sans-serif;white-space:normal}.motd h1,.motd h2,.motd h3,.motd h4,.motd h5,.motd h6{color:#a4bad6;text-decoration:underline}.motd a,.motd a:link,.motd a:visited,.motd a:active,.motd a:hover{color:#a4bad6}.bold,.name,.prefix,.ooc,.looc,.adminooc,.admin,.medal,.yell{font-weight:bold}.italic,.italics{font-style:italic}.highlight{background:#ff0}h1,h2,h3,h4,h5,h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}h1.alert,h2.alert{color:#a4bad6}em{font-style:normal;font-weight:bold}.ooc{font-weight:bold}.adminobserverooc{color:#09c;font-weight:bold}.adminooc{color:#3d5bc3;font-weight:bold}.adminsay{color:#9611d4;font-weight:bold}.admin{color:#5975da;font-weight:bold}.name{font-weight:bold}.deadsay{color:#e2c1ff}.binarysay{color:#1e90ff}.binarysay a{color:lime}.binarysay a:active,.binarysay a:visited{color:#8f8}.radio{color:#1ecc43}.sciradio{color:#c68cfa}.comradio{color:#fcdf03}.secradio{color:#dd3535}.medradio{color:#57b8f0}.engradio{color:#f37746}.suppradio{color:#b88646}.servradio{color:#6ca729}.syndradio{color:#8f4a4b}.gangradio{color:#ac2ea1}.centcomradio{color:#2681a5}.aiprivradio{color:#d65d95}.redteamradio{color:#f44}.blueteamradio{color:#3434fd}.greenteamradio{color:#34fd34}.yellowteamradio{color:#fdfd34}.yell{font-weight:bold}.alert{color:#d82020}.userdanger{color:#c51e1e;font-weight:bold;font-size:185%}.bolddanger{color:#c51e1e;font-weight:bold}.danger{color:#c51e1e}.warning{color:#c51e1e;font-style:italic}.alertwarning{color:red;font-weight:bold}.boldwarning{color:#c51e1e;font-style:italic;font-weight:bold}.announce{color:#c51e1e;font-weight:bold}.boldannounce{color:#c51e1e;font-weight:bold}.bigannounce{font-weight:bold;font-size:115%}.greenannounce{color:#059223;font-weight:bold}.rose{color:#ff5050}.info{color:#9ab0ff}.notice{color:#6685f5}.staff_ic{color:#6685f5}.tinynotice{color:#6685f5;font-size:85%}.tinynoticeital{color:#6685f5;font-style:italic;font-size:85%}.smallnotice{color:#6685f5;font-size:90%}.smallnoticeital{color:#6685f5;font-style:italic;font-size:90%}.boldnotice{color:#6685f5;font-weight:bold}.hear{color:#6685f5;font-style:italic}.adminnotice{color:#6685f5}.adminhelp{color:red;font-weight:bold}.unconscious{color:#a4bad6;font-weight:bold}.suicide{color:#ff5050;font-style:italic}.green{color:#059223}.grey{color:#838383}.red{color:red}.blue{color:#215cff}.nicegreen{color:#059223}.boldnicegreen{color:#059223;font-weight:bold}.cult{color:#973e3b}.cultitalic{color:#973e3b;font-style:italic}.cultbold{color:#973e3b;font-style:italic;font-weight:bold}.cultboldtalic{color:#973e3b;font-weight:bold;font-size:185%}.cultlarge{color:#973e3b;font-weight:bold;font-size:185%}.narsie{color:#973e3b;font-weight:bold;font-size:925%}.narsiesmall{color:#973e3b;font-weight:bold;font-size:370%}.colossus{color:#7f282a;font-size:310%}.hierophant{color:#b441ee;font-weight:bold;font-style:italic}.hierophant_warning{color:#c56bf1;font-style:italic}.purple{color:#9956d3}.holoparasite{color:#88809c}.revennotice{color:#c099e2}.revenboldnotice{color:#c099e2;font-weight:bold}.revenbignotice{color:#c099e2;font-weight:bold;font-size:185%}.revenminor{color:#823abb}.revenwarning{color:#760fbb;font-style:italic}.revendanger{color:#760fbb;font-weight:bold;font-size:185%}.deconversion_message{color:#a947ff;font-size:185%;font-style:italic}.ghostalert{color:#60f;font-style:italic;font-weight:bold}.alien{color:#855d85}.noticealien{color:#059223}.alertalien{color:#059223;font-weight:bold}.changeling{color:#059223;font-style:italic}.alertsyndie{color:red;font-size:185%;font-weight:bold}.spider{color:#80f;font-weight:bold;font-size:185%}.interface{color:#750e75}.sans{font-family:"Comic Sans MS",cursive,sans-serif}.papyrus{font-family:"Papyrus",cursive,sans-serif}.robot{font-family:"Courier New",cursive,sans-serif}.tape_recorder{color:red;font-family:"Courier New",cursive,sans-serif}.command_headset{font-weight:bold;font-size:160%}.small{font-size:60%}.big{font-size:185%}.reallybig{font-size:245%}.extremelybig{font-size:310%}.greentext{color:#059223;font-size:185%}.redtext{color:#c51e1e;font-size:185%}.clown{color:#ff70c1;font-size:160%;font-family:"Comic Sans MS",cursive,sans-serif;font-weight:bold}.singing{font-family:"Trebuchet MS",cursive,sans-serif;font-style:italic}.his_grace{color:#15d512;font-family:"Courier New",cursive,sans-serif;font-style:italic}.hypnophrase{color:#202020;font-weight:bold;animation:hypnocolor 1500ms infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#202020}25%{color:#4b02ac}50%{color:#9f41f1}75%{color:#541c9c}100%{color:#7adbf3}}.phobia{color:#d00;font-weight:bold;animation:phobia 750ms infinite}@keyframes phobia{0%{color:#f75a5a}50%{color:#d00}100%{color:#f75a5a}}.icon{height:1em;width:auto}.bigicon{font-size:2.5em}.memo{color:#638500;text-align:center}.memoedit{text-align:center;font-size:125%}.abductor{color:#c204c2;font-style:italic}.mind_control{color:#df3da9;font-size:100%;font-weight:bold;font-style:italic}.slime{color:#00ced1}.drone{color:#848482}.monkey{color:#975032}.swarmer{color:#2c75ff}.resonate{color:#298f85}.monkeyhive{color:#a56408}.monkeylead{color:#af6805;font-size:80%}.connectionClosed,.fatalError{background:red;color:#fff;padding:5px}.connectionClosed.restored{background:green}.internal.boldnshit{color:#3d5bc3;font-weight:bold}.text-normal{font-weight:normal;font-style:normal}.hidden{display:none;visibility:hidden}.ml-1{margin-left:1em}.ml-2{margin-left:2em}.ml-3{margin-left:3em}.xooc{color:#ac04e9;font-weight:bold;font-size:140%}.mooc{color:#090;font-weight:bold;font-size:140%}.yooc{color:#999600;font-weight:bold;font-size:140%}.headminsay{color:#653d78;font-weight:bold}.radio{color:#b4b4b4}.deptradio{color:#939}.comradio{color:#779cc2}.centradio{color:#5c5c8a}.hcradio{color:#318779}.pvstradio{color:#9b0612}.cryoradio{color:#ad6d48}.airadio{color:#f0f}.secradio{color:#a52929}.engradio{color:#a66300}.sentryradio{color:#844300}.medradio{color:#008160}.supradio{color:#ba8e41}.jtacradio{color:#ad3b98}.intelradio{color:#027d02}.wyradio{color:#fe9b24}.pmcradio{color:#4dc5ce}.vairadio{color:#e3580e}.rmcradio{color:#e3580e}.cmbradio{color:#1b748c}.clfradio{color:#8e83ca}.alpharadio{color:#db2626}.bravoradio{color:#c68610}.charlieradio{color:#a5a}.deltaradio{color:#007fcf}.echoradio{color:#3eb489}.medium{font-size:110%}.big{font-size:115%}.large{font-size:125%}.extra_large{font-size:130%}.huge{font-size:150%}.underline{text-decoration:underline}.orange{color:#eca100}.normal{font-style:normal}.attack{color:#ff3838}.moderate{color:#c00}.disarm{color:#900}.passive{color:#600}.helpful{color:#368f31}.scanner{color:#ff3838}.scannerb{color:#ff3838;font-weight:bold}.scannerburn{color:orange}.scannerburnb{color:orange;font-weight:bold}.rose{color:#ff5050}.debuginfo{color:#493d26;font-style:italic}.xenonotice{color:#51a16c}.xenoboldnotice{color:#51a16c;font-weight:bold}.xenowarning{color:#51a16c;font-style:italic}.xenominorwarning{color:#51a16c;font-weight:bold;font-style:italic}.xenodanger{color:#51a16c;font-weight:bold}.avoidharm{color:#72a0e5;font-weight:bold}.highdanger{color:#ff3838;font-weight:bold;font-size:140%}.xenohighdanger{color:#51a16c;font-weight:bold;font-size:140%}.xenoannounce{color:#65c585;font-family:book-antiqua;font-weight:bold;font-size:140%}.yautjabold{color:purple;font-weight:bold}.yautjaboldbig{color:purple;font-weight:bold;font-size:120%}.objectivebig{font-weight:bold;font-size:130%}.objectivegreen{color:lime}.objectivered{color:red}.objectivesuccess{color:lime;font-weight:bold;font-size:110%}.objectivefail{color:red;font-weight:bold;font-size:110%}.xenotalk,.xeno{color:#c048c0;font-style:italic}.xenoleader{color:#996e99;font-style:italic;font-size:125%}.xenoqueen{color:#996e99;font-style:italic;font-weight:bold;font-size:125%}.newscaster{color:maroon}.role_header{color:#e92d2d;display:block;text-align:center;font-weight:bold;font-family:trebuchet-ms;font-size:150%}.role_body{color:#3a3ae9;display:block;text-align:center;font-size:125%}.round_header{color:#e92d2d;display:block;text-align:center;font-family:courier;font-weight:bold;font-size:180%}.round_body{color:#c5c5c5;display:block;text-align:center;font-family:trebuchet-ms;font-weight:bold;font-size:125%}.event_announcement{color:#600d48;font-family:arial-narrow;font-weight:bold;font-size:125%}.announce_header{color:#cecece;font-weight:bold;font-size:150%}.announce_header_blue{color:#7575f3;font-weight:bold;font-size:150%}.announce_header_admin{color:#7575f3;font-weight:bold;font-size:150%}.announce_body{color:#e92d2d;font-weight:normal;font-size:125%}.centerbold{display:block;text-align:center;font-weight:bold}.mod{color:#917455;font-weight:bold}.modooc{color:#184880;font-weight:bold}.adminmod{color:#7c440c;font-weight:bold}.mentorsay{color:#d4af57;font-weight:bold}.mentorhelp{color:#090;font-weight:bold}.mentorbody{color:#da6200;font-weight:bold}.mentorstaff{color:#b5850d;font-weight:bold}.staffsay{color:#b5850d;font-weight:bold}.tajaran{color:#803b56}.tajaran_signlang{color:#941c1c}.skrell{color:#00ced1}.soghun{color:#228b22}.changeling{color:purple}.vox{color:#a0a}.monkey{color:#966c47}.german{color:#858f1e;font-family:"Times New Roman",Times,serif}.spanish{color:#cf982b}.japanese{color:#940927}.chinese{color:#fe1919}.zombie{color:#2dacb1;font-style:italic}.rough{font-family:trebuchet-ms,cursive,sans-serif}.commando{color:#fe9b24;font-style:bold}.say_quote{font-family:Georgia,Verdana,sans-serif}.admin .message{color:#314cad}.admin .prefix{font-weight:bolder}.pm{font-size:110%}.deadsay{color:#8b4dff}.retro_translator{font-weight:bold}.yautja_translator{color:#a00;font-weight:bold;animation:glitch .5s infinite}@keyframes glitch{25%{color:#a00;transform:translate(-2px, -1px)}50%{color:#be0000;transform:translate(1px, -2px)}75%{color:#8d0000;transform:translate(-1px, 2px)}100%{color:#830000;transform:translate(1px, 1px)}}.examine_block{background:#1b1c1e;border:1px solid #a4bad6;margin:.5em;padding:.5em .75em}.examine_block .icon{width:1.5em;height:1.5em;margin:0;padding:0}.tooltip{font-style:italic;border-bottom:1px dashed #fff} +.theme-light .color-black{color:#000 !important}.theme-light .color-white{color:#e6e6e6 !important}.theme-light .color-red{color:#c82121 !important}.theme-light .color-orange{color:#e6630d !important}.theme-light .color-yellow{color:#e5c304 !important}.theme-light .color-olive{color:#a3b816 !important}.theme-light .color-green{color:#1d9f3b !important}.theme-light .color-teal{color:#00a39c !important}.theme-light .color-blue{color:#1e78bb !important}.theme-light .color-dark-blue{color:#004274 !important}.theme-light .color-violet{color:#5a30b5 !important}.theme-light .color-purple{color:#932eb4 !important}.theme-light .color-pink{color:#db228a !important}.theme-light .color-brown{color:#955d39 !important}.theme-light .color-grey{color:#e6e6e6 !important}.theme-light .color-light-grey{color:#999 !important}.theme-light .color-good{color:#529923 !important}.theme-light .color-average{color:#da810e !important}.theme-light .color-bad{color:#c82121 !important}.theme-light .color-label{color:#353535 !important}.theme-light .color-xeno{color:#4a3253 !important}.theme-light .color-bg-black{background-color:#000 !important}.theme-light .color-bg-white{background-color:#bfbfbf !important}.theme-light .color-bg-red{background-color:#a61c1c !important}.theme-light .color-bg-orange{background-color:#c0530b !important}.theme-light .color-bg-yellow{background-color:#bfa303 !important}.theme-light .color-bg-olive{background-color:#889912 !important}.theme-light .color-bg-green{background-color:#188532 !important}.theme-light .color-bg-teal{background-color:#008882 !important}.theme-light .color-bg-blue{background-color:#19649c !important}.theme-light .color-bg-dark-blue{background-color:#003761 !important}.theme-light .color-bg-violet{background-color:#4b2897 !important}.theme-light .color-bg-purple{background-color:#7a2696 !important}.theme-light .color-bg-pink{background-color:#b61d73 !important}.theme-light .color-bg-brown{background-color:#7c4d2f !important}.theme-light .color-bg-grey{background-color:#bfbfbf !important}.theme-light .color-bg-light-grey{background-color:gray !important}.theme-light .color-bg-good{background-color:#44801d !important}.theme-light .color-bg-average{background-color:#b56b0b !important}.theme-light .color-bg-bad{background-color:#a61c1c !important}.theme-light .color-bg-label{background-color:#2c2c2c !important}.theme-light .color-bg-xeno{background-color:#3e2945 !important}.theme-light .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#fff}.theme-light .Tabs--fill{height:100%}.theme-light .Section .Tabs{background-color:transparent}.theme-light .Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.theme-light .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.theme-light .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-light .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.theme-light .Tabs--horizontal:last-child{margin-bottom:0}.theme-light .Tabs__Tab{flex-grow:0}.theme-light .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-light .Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(0,0,0,.5);min-height:2.25em;min-width:4em}.theme-light .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.theme-light .Tab--selected{background-color:rgba(255,255,255,.125);color:#404040}.theme-light .Tab__text{flex-grow:1;margin:0 .5em}.theme-light .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-light .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-light .Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-light .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #000}.theme-light .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-light .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #000}.theme-light .Tab--selected.Tab--color--black{color:#404040}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-light .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#000}.theme-light .Tab--selected.Tab--color--white{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--red{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--orange{color:#f48942}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-light .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#e6630d}.theme-light .Tab--selected.Tab--color--yellow{color:#fcdd33}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#e5c304}.theme-light .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#e5c304}.theme-light .Tab--selected.Tab--color--olive{color:#d0e732}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#a3b816}.theme-light .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#a3b816}.theme-light .Tab--selected.Tab--color--green{color:#33da5a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-light .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#1d9f3b}.theme-light .Tab--selected.Tab--color--teal{color:#00faef}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-light .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00a39c}.theme-light .Tab--selected.Tab--color--blue{color:#419ce1}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-light .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#1e78bb}.theme-light .Tab--selected.Tab--color--dark-blue{color:#0079d7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--dark-blue{border-bottom-color:#004274}.theme-light .Tabs--vertical .Tab--selected.Tab--color--dark-blue{border-right-color:#004274}.theme-light .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-light .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#5a30b5}.theme-light .Tab--selected.Tab--color--purple{color:#b455d4}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-light .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#932eb4}.theme-light .Tab--selected.Tab--color--pink{color:#e558a7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-light .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#db228a}.theme-light .Tab--selected.Tab--color--brown{color:#c0825a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-light .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#955d39}.theme-light .Tab--selected.Tab--color--grey{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--light-grey{color:#b3b3b3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#999}.theme-light .Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#999}.theme-light .Tab--selected.Tab--color--good{color:#77d23b}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#529923}.theme-light .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#529923}.theme-light .Tab--selected.Tab--color--average{color:#f3a23a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#da810e}.theme-light .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#da810e}.theme-light .Tab--selected.Tab--color--bad{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--label{color:#686868}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#353535}.theme-light .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#353535}.theme-light .Tab--selected.Tab--color--xeno{color:#7e558e}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--xeno{border-bottom-color:#4a3253}.theme-light .Tabs--vertical .Tab--selected.Tab--color--xeno{border-right-color:#4a3253}.theme-light .Section{position:relative;margin-bottom:.5em;background-color:#fff;background-color:#fff;box-sizing:border-box}.theme-light .Section:last-child{margin-bottom:0}.theme-light .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #fff}.theme-light .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#000}.theme-light .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-light .Section__rest{position:relative}.theme-light .Section__content{padding:.66em .5em}.theme-light .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-light .Section--fill{display:flex;flex-direction:column;height:100%}.theme-light .Section--fill>.Section__rest{flex-grow:1}.theme-light .Section--fill>.Section__rest>.Section__content{height:100%}.theme-light .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-light .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-light .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-light .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-light .Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.theme-light .Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.theme-light .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-light .Section .Section:first-child{margin-top:-0.5em}.theme-light .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-light .Section .Section .Section .Section__titleText{font-size:1em}.theme-light .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-light .Button:last-child{margin-right:0;margin-bottom:0}.theme-light .Button .fa,.theme-light .Button .fas,.theme-light .Button .far{margin-left:-0.25em;margin-right:-0.25em;min-width:1.333em;text-align:center}.theme-light .Button--hasContent .fa,.theme-light .Button--hasContent .fas,.theme-light .Button--hasContent .far{margin-right:.25em}.theme-light .Button--hasContent.Button--iconPosition--right .fa,.theme-light .Button--hasContent.Button--iconPosition--right .fas,.theme-light .Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.theme-light .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-light .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-light .Button--circular{border-radius:50%}.theme-light .Button--compact{padding:0 .25em;line-height:1.333em}.theme-light .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.theme-light .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--black:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--black:hover,.theme-light .Button--color--black:focus{background-color:#131313;color:#fff}.theme-light .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--white:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--white:hover,.theme-light .Button--color--white:focus{background-color:#efefef;color:#000}.theme-light .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--red:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--red:hover,.theme-light .Button--color--red:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#c0530b;color:#fff}.theme-light .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--orange:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--orange:hover,.theme-light .Button--color--orange:focus{background-color:#ea7426;color:#fff}.theme-light .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#bfa303;color:#fff}.theme-light .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--yellow:hover,.theme-light .Button--color--yellow:focus{background-color:#efce17;color:#fff}.theme-light .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#889912;color:#fff}.theme-light .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--olive:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--olive:hover,.theme-light .Button--color--olive:focus{background-color:#afc328;color:#fff}.theme-light .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#188532;color:#fff}.theme-light .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--green:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--green:hover,.theme-light .Button--color--green:focus{background-color:#2fac4c;color:#fff}.theme-light .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#008882;color:#fff}.theme-light .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--teal:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--teal:hover,.theme-light .Button--color--teal:focus{background-color:#13afa9;color:#fff}.theme-light .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#19649c;color:#fff}.theme-light .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--blue:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--blue:hover,.theme-light .Button--color--blue:focus{background-color:#3086c7;color:#fff}.theme-light .Button--color--dark-blue{transition:color 50ms,background-color 50ms;background-color:#003761;color:#fff}.theme-light .Button--color--dark-blue:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--dark-blue:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--dark-blue:hover,.theme-light .Button--color--dark-blue:focus{background-color:#135283;color:#fff}.theme-light .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#4b2897;color:#fff}.theme-light .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--violet:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--violet:hover,.theme-light .Button--color--violet:focus{background-color:#6a41c1;color:#fff}.theme-light .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#7a2696;color:#fff}.theme-light .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--purple:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--purple:hover,.theme-light .Button--color--purple:focus{background-color:#a03fc0;color:#fff}.theme-light .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#b61d73;color:#fff}.theme-light .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--pink:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--pink:hover,.theme-light .Button--color--pink:focus{background-color:#da3f96;color:#fff}.theme-light .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#7c4d2f;color:#fff}.theme-light .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--brown:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--brown:hover,.theme-light .Button--color--brown:focus{background-color:#a26c49;color:#fff}.theme-light .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--grey:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--grey:hover,.theme-light .Button--color--grey:focus{background-color:#efefef;color:#000}.theme-light .Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:gray;color:#fff}.theme-light .Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--light-grey:hover,.theme-light .Button--color--light-grey:focus{background-color:#a6a6a6;color:#fff}.theme-light .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#44801d;color:#fff}.theme-light .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--good:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--good:hover,.theme-light .Button--color--good:focus{background-color:#62a635;color:#fff}.theme-light .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#b56b0b;color:#fff}.theme-light .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--average:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--average:hover,.theme-light .Button--color--average:focus{background-color:#e48f20;color:#fff}.theme-light .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--bad:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--bad:hover,.theme-light .Button--color--bad:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#2c2c2c;color:#fff}.theme-light .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--label:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--label:hover,.theme-light .Button--color--label:focus{background-color:#464646;color:#fff}.theme-light .Button--color--xeno{transition:color 50ms,background-color 50ms;background-color:#3e2945;color:#fff}.theme-light .Button--color--xeno:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--xeno:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--xeno:hover,.theme-light .Button--color--xeno:focus{background-color:#5a4363;color:#fff}.theme-light .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#bbb;color:#000}.theme-light .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--default:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--default:hover,.theme-light .Button--color--default:focus{background-color:#eaeaea;color:#000}.theme-light .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-light .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--caution:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--caution:hover,.theme-light .Button--color--caution:focus{background-color:#ec8420;color:#fff}.theme-light .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-light .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--danger:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--danger:hover,.theme-light .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-light .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#eee;color:#000;background-color:rgba(238,238,238,0);color:rgba(0,0,0,.5)}.theme-light .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--transparent:hover,.theme-light .Button--color--transparent:focus{background-color:#fcfcfc;color:#000}.theme-light .Button--disabled{background-color:#363636 !important}.theme-light .Button--selected{transition:color 50ms,background-color 50ms;background-color:#0668b8;color:#fff}.theme-light .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--selected:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--selected:hover,.theme-light .Button--selected:focus{background-color:#1a8be7;color:#fff}.theme-light .Button--flex{display:inline-flex;flex-direction:column}.theme-light .Button--flex--fluid{width:100%}.theme-light .Button--verticalAlignContent--top{justify-content:flex-start}.theme-light .Button--verticalAlignContent--middle{justify-content:center}.theme-light .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-light .Button__content{display:block;align-self:stretch}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#353535;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-light .NumberInput--fluid{display:block}.theme-light .NumberInput__content{margin-left:.5em}.theme-light .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-light .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #353535;background-color:#353535}.theme-light .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#fff;color:#000;text-align:right}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .TextArea{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;background-color:#fff;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-light .TextArea--fluid{display:block;width:auto;height:auto}.theme-light .TextArea--noborder{border:0px}.theme-light .TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.theme-light .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-light .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.theme-light .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto;margin-bottom:-0.2em;cursor:n-resize}.theme-light .Knob:after{content:".";color:transparent;line-height:2.5em}.theme-light .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%);border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.theme-light .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-light .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-light .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.theme-light .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-light .Knob__ringTrackPivot{transform:rotateZ(135deg)}.theme-light .Knob__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-light .Knob__ringFillPivot{transform:rotateZ(135deg)}.theme-light .Knob--bipolar .Knob__ringFillPivot{transform:rotateZ(270deg)}.theme-light .Knob__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-light .Knob--color--black .Knob__ringFill{stroke:#000}.theme-light .Knob--color--white .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--red .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--orange .Knob__ringFill{stroke:#e6630d}.theme-light .Knob--color--yellow .Knob__ringFill{stroke:#e5c304}.theme-light .Knob--color--olive .Knob__ringFill{stroke:#a3b816}.theme-light .Knob--color--green .Knob__ringFill{stroke:#1d9f3b}.theme-light .Knob--color--teal .Knob__ringFill{stroke:#00a39c}.theme-light .Knob--color--blue .Knob__ringFill{stroke:#1e78bb}.theme-light .Knob--color--dark-blue .Knob__ringFill{stroke:#004274}.theme-light .Knob--color--violet .Knob__ringFill{stroke:#5a30b5}.theme-light .Knob--color--purple .Knob__ringFill{stroke:#932eb4}.theme-light .Knob--color--pink .Knob__ringFill{stroke:#db228a}.theme-light .Knob--color--brown .Knob__ringFill{stroke:#955d39}.theme-light .Knob--color--grey .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--light-grey .Knob__ringFill{stroke:#999}.theme-light .Knob--color--good .Knob__ringFill{stroke:#529923}.theme-light .Knob--color--average .Knob__ringFill{stroke:#da810e}.theme-light .Knob--color--bad .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--label .Knob__ringFill{stroke:#353535}.theme-light .Knob--color--xeno .Knob__ringFill{stroke:#4a3253}.theme-light .Slider{cursor:e-resize}.theme-light .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none !important}.theme-light .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #000}.theme-light .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid transparent;border-right:.4166666667em solid transparent;border-bottom:.4166666667em solid #000}.theme-light .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.theme-light .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color 900ms ease-out}.theme-light .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-light .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-light .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-light .ProgressBar--color--default{border:.0833333333em solid #bfbfbf}.theme-light .ProgressBar--color--default .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--black{border-color:#000 !important}.theme-light .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-light .ProgressBar--color--white{border-color:#bfbfbf !important}.theme-light .ProgressBar--color--white .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--red{border-color:#a61c1c !important}.theme-light .ProgressBar--color--red .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--orange{border-color:#c0530b !important}.theme-light .ProgressBar--color--orange .ProgressBar__fill{background-color:#c0530b}.theme-light .ProgressBar--color--yellow{border-color:#bfa303 !important}.theme-light .ProgressBar--color--yellow .ProgressBar__fill{background-color:#bfa303}.theme-light .ProgressBar--color--olive{border-color:#889912 !important}.theme-light .ProgressBar--color--olive .ProgressBar__fill{background-color:#889912}.theme-light .ProgressBar--color--green{border-color:#188532 !important}.theme-light .ProgressBar--color--green .ProgressBar__fill{background-color:#188532}.theme-light .ProgressBar--color--teal{border-color:#008882 !important}.theme-light .ProgressBar--color--teal .ProgressBar__fill{background-color:#008882}.theme-light .ProgressBar--color--blue{border-color:#19649c !important}.theme-light .ProgressBar--color--blue .ProgressBar__fill{background-color:#19649c}.theme-light .ProgressBar--color--dark-blue{border-color:#003761 !important}.theme-light .ProgressBar--color--dark-blue .ProgressBar__fill{background-color:#003761}.theme-light .ProgressBar--color--violet{border-color:#4b2897 !important}.theme-light .ProgressBar--color--violet .ProgressBar__fill{background-color:#4b2897}.theme-light .ProgressBar--color--purple{border-color:#7a2696 !important}.theme-light .ProgressBar--color--purple .ProgressBar__fill{background-color:#7a2696}.theme-light .ProgressBar--color--pink{border-color:#b61d73 !important}.theme-light .ProgressBar--color--pink .ProgressBar__fill{background-color:#b61d73}.theme-light .ProgressBar--color--brown{border-color:#7c4d2f !important}.theme-light .ProgressBar--color--brown .ProgressBar__fill{background-color:#7c4d2f}.theme-light .ProgressBar--color--grey{border-color:#bfbfbf !important}.theme-light .ProgressBar--color--grey .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--light-grey{border-color:gray !important}.theme-light .ProgressBar--color--light-grey .ProgressBar__fill{background-color:gray}.theme-light .ProgressBar--color--good{border-color:#44801d !important}.theme-light .ProgressBar--color--good .ProgressBar__fill{background-color:#44801d}.theme-light .ProgressBar--color--average{border-color:#b56b0b !important}.theme-light .ProgressBar--color--average .ProgressBar__fill{background-color:#b56b0b}.theme-light .ProgressBar--color--bad{border-color:#a61c1c !important}.theme-light .ProgressBar--color--bad .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--label{border-color:#2c2c2c !important}.theme-light .ProgressBar--color--label .ProgressBar__fill{background-color:#2c2c2c}.theme-light .ProgressBar--color--xeno{border-color:#3e2945 !important}.theme-light .ProgressBar--color--xeno .ProgressBar__fill{background-color:#3e2945}.theme-light .Chat{color:#000}.theme-light .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:crimson;border-radius:10px;transition:font-size 200ms ease-out}.theme-light .Chat__badge:before{content:"x"}.theme-light .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-light .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-light .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-light .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#fff}.theme-light .Chat__reconnected:after{content:"";display:block;margin-top:-0.75em;border-bottom:.1666666667em solid #db2828}.theme-light .Chat__highlight{color:#000}.theme-light .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:bold}.theme-light .ChatMessage{word-wrap:break-word}.theme-light .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-light .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-light .Layout,.theme-light .Layout *{scrollbar-base-color:#f2f2f2;scrollbar-face-color:#d6d6d6;scrollbar-3dlight-color:#eee;scrollbar-highlight-color:#eee;scrollbar-track-color:#f2f2f2;scrollbar-arrow-color:#777;scrollbar-shadow-color:#d6d6d6}.theme-light .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-light .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-light .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#eee;background-image:linear-gradient(to bottom, #eeeeee 0%, #eeeeee 100%)}.theme-light .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-light .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-light .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-light .Window__contentPadding:after{height:0}.theme-light .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-light .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(252,252,252,.25);pointer-events:none}.theme-light .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-light .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-light .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-light .TitleBar{background-color:#eee;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-light .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#eee;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-light .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-light .TitleBar__title{position:absolute;display:inline-block;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap;pointer-events:none}.theme-light .TitleBar__buttons{pointer-events:initial;display:inline-block;width:100%;margin-left:10px}.theme-light .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-light .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-light .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-light .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-light html,.theme-light body{padding:0;margin:0;height:100%;color:#000}.theme-light body{background:#fff;font-family:Verdana,sans-serif;font-size:13px;line-height:1.2;overflow-x:hidden;overflow-y:scroll;word-wrap:break-word}.theme-light em{font-style:normal;font-weight:bold}.theme-light img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}.theme-light img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}.theme-light a{color:blue}.theme-light a.visited{color:#f0f}.theme-light a:visited{color:#f0f}.theme-light a.popt{text-decoration:none}.theme-light .popup{position:fixed;top:50%;left:50%;background:#ddd}.theme-light .popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.theme-light .popup .close:hover{background:#999}.theme-light .popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:bold;border-bottom:2px solid green}.theme-light .popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.theme-light .popup input[type=text]:hover,.theme-light .popup input[type=text]:active,.theme-light .popup input[type=text]:focus{border-color:green}.theme-light .popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:bold}.theme-light .popup input[type=submit]:hover,.theme-light .popup input[type=submit]:focus,.theme-light .popup input[type=submit]:active{background:#aaa;cursor:pointer}.theme-light .changeFont{padding:10px}.theme-light .changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.theme-light .changeFont a:hover{background:#ccc}.theme-light .highlightPopup{padding:10px;text-align:center}.theme-light .highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.theme-light .highlightPopup input.highlightColor{background-color:#ff0}.theme-light .highlightPopup input.highlightTermSubmit{margin-top:5px}.theme-light .contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.theme-light .contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.theme-light .contextMenu a:hover{background-color:#ccc}.theme-light .filterMessages{padding:5px}.theme-light .filterMessages div{padding:2px 0}.theme-light .icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.theme-light .motd{color:#638500;font-family:Verdana,sans-serif;white-space:normal}.theme-light .motd h1,.theme-light .motd h2,.theme-light .motd h3,.theme-light .motd h4,.theme-light .motd h5,.theme-light .motd h6{color:#638500;text-decoration:underline}.theme-light .motd a,.theme-light .motd a:link,.theme-light .motd a:visited,.theme-light .motd a:active,.theme-light .motd a:hover{color:#638500}.theme-light .bold,.theme-light .name,.theme-light .prefix,.theme-light .ooc,.theme-light .looc,.theme-light .adminooc,.theme-light .admin,.theme-light .medal,.theme-light .yell{font-weight:bold}.theme-light .italic,.theme-light .italics{font-style:italic}.theme-light .highlight{background:#ff0}.theme-light h1,.theme-light h2,.theme-light h3,.theme-light h4,.theme-light h5,.theme-light h6{color:blue;font-family:Georgia,Verdana,sans-serif}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light em{font-style:normal;font-weight:bold}.theme-light .ooc{font-weight:bold}.theme-light .adminobserverooc{color:#09c;font-weight:bold}.theme-light .adminooc{color:#700038;font-weight:bold}.theme-light .adminsay{color:#ff4500;font-weight:bold}.theme-light .admin{color:#4473ff;font-weight:bold}.theme-light .name{font-weight:bold}.theme-light .deadsay{color:#5c00e6}.theme-light .binarysay{color:#20c20e;background-color:#000;display:block}.theme-light .binarysay a{color:lime}.theme-light .binarysay a:active,.theme-light .binarysay a:visited{color:#8f8}.theme-light .radio{color:green}.theme-light .sciradio{color:#939}.theme-light .comradio{color:#948f02}.theme-light .secradio{color:#a30000}.theme-light .medradio{color:#337296}.theme-light .engradio{color:#fb5613}.theme-light .sentryradio{color:#844300}.theme-light .suppradio{color:#a8732b}.theme-light .servradio{color:#6eaa2c}.theme-light .syndradio{color:#6d3f40}.theme-light .gangradio{color:#ac2ea1}.theme-light .centcomradio{color:#686868}.theme-light .aiprivradio{color:#f0f}.theme-light .redteamradio{color:red}.theme-light .blueteamradio{color:blue}.theme-light .greenteamradio{color:lime}.theme-light .yellowteamradio{color:#d1ba22}.theme-light .yell{font-weight:bold}.theme-light .alert{color:red}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light .userdanger{color:red;font-weight:bold;font-size:185%}.theme-light .bolddanger{color:red;font-weight:bold}.theme-light .danger{color:red}.theme-light .tinydanger{color:red;font-size:85%}.theme-light .smalldanger{color:red;font-size:90%}.theme-light .warning{color:red;font-style:italic}.theme-light .alertwarning{color:red;font-weight:bold}.theme-light .boldwarning{color:red;font-style:italic;font-weight:bold}.theme-light .announce{color:#228b22;font-weight:bold}.theme-light .boldannounce{color:red;font-weight:bold}.theme-light .bigannounce{font-weight:bold;font-size:115%}.theme-light .greenannounce{color:lime;font-weight:bold}.theme-light .rose{color:#ff5050}.theme-light .info{color:#00c}.theme-light .notice{color:#009}.theme-light .staff_ic{color:#009}.theme-light .tinynotice{color:#009;font-size:85%}.theme-light .tinynoticeital{color:#009;font-style:italic;font-size:85%}.theme-light .smallnotice{color:#009;font-size:90%}.theme-light .smallnoticeital{color:#009;font-style:italic;font-size:90%}.theme-light .boldnotice{color:#009;font-weight:bold}.theme-light .hear{color:#009;font-style:italic}.theme-light .adminnotice{color:blue}.theme-light .adminhelp{color:red;font-weight:bold}.theme-light .unconscious{color:blue;font-weight:bold}.theme-light .suicide{color:#ff5050;font-style:italic}.theme-light .green{color:#03ff39}.theme-light .grey{color:#838383}.theme-light .red{color:red}.theme-light .blue{color:blue}.theme-light .nicegreen{color:#14a833}.theme-light .boldnicegreen{color:#14a833;font-weight:bold}.theme-light .cult{color:#973e3b}.theme-light .cultitalic{color:#973e3b;font-style:italic}.theme-light .cultbold{color:#973e3b;font-style:italic;font-weight:bold}.theme-light .cultboldtalic{color:#973e3b;font-weight:bold;font-size:185%}.theme-light .cultlarge{color:#973e3b;font-weight:bold;font-size:185%}.theme-light .narsie{color:#973e3b;font-weight:bold;font-size:925%}.theme-light .narsiesmall{color:#973e3b;font-weight:bold;font-size:370%}.theme-light .colossus{color:#7f282a;font-size:310%}.theme-light .hierophant{color:#609;font-weight:bold;font-style:italic}.theme-light .hierophant_warning{color:#609;font-style:italic}.theme-light .purple{color:#5e2d79}.theme-light .holoparasite{color:#35333a}.theme-light .revennotice{color:#1d2953}.theme-light .revenboldnotice{color:#1d2953;font-weight:bold}.theme-light .revenbignotice{color:#1d2953;font-weight:bold;font-size:185%}.theme-light .revenminor{color:#823abb}.theme-light .revenwarning{color:#760fbb;font-style:italic}.theme-light .revendanger{color:#760fbb;font-weight:bold;font-size:185%}.theme-light .deconversion_message{color:#5000a0;font-size:185%;font-style:italic}.theme-light .ghostalert{color:#5c00e6;font-style:italic;font-weight:bold}.theme-light .alien{color:#543354}.theme-light .noticealien{color:#00c000}.theme-light .alertalien{color:#00c000;font-weight:bold}.theme-light .changeling{color:purple;font-style:italic}.theme-light .alertsyndie{color:red;font-size:185%;font-weight:bold}.theme-light .spider{color:#4d004d;font-weight:bold;font-size:185%}.theme-light .interface{color:#303}.theme-light .sans{font-family:"Comic Sans MS",cursive,sans-serif}.theme-light .papyrus{font-family:"Papyrus",cursive,sans-serif}.theme-light .robot{font-family:"Courier New",cursive,sans-serif}.theme-light .tape_recorder{color:maroon;font-family:"Courier New",cursive,sans-serif}.theme-light .command_headset{font-weight:bold;font-size:160%}.theme-light .small{font-size:60%}.theme-light .big{font-size:185%}.theme-light .reallybig{font-size:245%}.theme-light .extremelybig{font-size:310%}.theme-light .greentext{color:lime;font-size:185%}.theme-light .redtext{color:red;font-size:185%}.theme-light .clown{color:#ff69bf;font-size:160%;font-family:"Comic Sans MS",cursive,sans-serif;font-weight:bold}.theme-light .singing{font-family:"Trebuchet MS",cursive,sans-serif;font-style:italic}.theme-light .his_grace{color:#15d512;font-family:"Courier New",cursive,sans-serif;font-style:italic}.theme-light .hypnophrase{color:#0d0d0d;font-weight:bold;animation:hypnocolor 1500ms infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#0d0d0d}25%{color:#410194}50%{color:#7f17d8}75%{color:#410194}100%{color:#3bb5d3}}.theme-light .phobia{color:#d00;font-weight:bold;animation:phobia 750ms infinite}@keyframes phobia{0%{color:#0d0d0d}50%{color:#d00}100%{color:#0d0d0d}}.theme-light .icon{height:1em;width:auto}.theme-light .bigicon{font-size:2.5em}.theme-light .memo{color:#638500;text-align:center}.theme-light .memoedit{text-align:center;font-size:125%}.theme-light .abductor{color:purple;font-style:italic}.theme-light .mind_control{color:#a00d6f;font-size:100%;font-weight:bold;font-style:italic}.theme-light .slime{color:#00ced1}.theme-light .drone{color:#848482}.theme-light .monkey{color:#975032}.theme-light .swarmer{color:#2c75ff}.theme-light .resonate{color:#298f85}.theme-light .monkeyhive{color:#774704}.theme-light .monkeylead{color:#774704;font-size:80%}.theme-light .connectionClosed,.theme-light .fatalError{background:red;color:#fff;padding:5px}.theme-light .connectionClosed.restored{background:green}.theme-light .internal.boldnshit{color:blue;font-weight:bold}.theme-light .text-normal{font-weight:normal;font-style:normal}.theme-light .hidden{display:none;visibility:hidden}.theme-light .ml-1{margin-left:1em}.theme-light .ml-2{margin-left:2em}.theme-light .ml-3{margin-left:3em}.theme-light .xooc{color:#6c0094;font-weight:bold;font-size:140%}.theme-light .mooc{color:#090;font-weight:bold;font-size:140%}.theme-light .yooc{color:#999600;font-weight:bold;font-size:140%}.theme-light .headminsay{color:#5a0a7f;font-weight:bold}.theme-light .radio{color:#4e4e4e}.theme-light .deptradio{color:#939}.theme-light .comradio{color:#004080}.theme-light .centradio{color:#5c5c8a}.theme-light .cryoradio{color:#554e3f}.theme-light .hcradio{color:#318779}.theme-light .pvstradio{color:#9b0612}.theme-light .airadio{color:#f0f}.theme-light .secradio{color:#a30000}.theme-light .engradio{color:#a66300}.theme-light .sentryradio{color:#844300}.theme-light .medradio{color:#008160}.theme-light .supradio{color:#5f4519}.theme-light .jtacradio{color:#702963}.theme-light .intelradio{color:#027d02}.theme-light .wyradio{color:#fe9b24}.theme-light .pmcradio{color:#136957}.theme-light .vairadio{color:#943d0a}.theme-light .cmbradio{color:#1b748c}.theme-light .clfradio{color:#6f679c}.theme-light .alpharadio{color:#ea0000}.theme-light .bravoradio{color:#c68610}.theme-light .charlieradio{color:#a5a}.theme-light .deltaradio{color:#007fcf}.theme-light .echoradio{color:#3a7e65}.theme-light .medium{font-size:110%}.theme-light .big{font-size:115%}.theme-light .large{font-size:125%}.theme-light .extra_large{font-size:130%}.theme-light .huge{font-size:150%}.theme-light .underline{text-decoration:underline}.theme-light .orange{color:#eca100}.theme-light .normal{font-style:normal}.theme-light .attack{color:red}.theme-light .moderate{color:#c00}.theme-light .disarm{color:#900}.theme-light .passive{color:#600}.theme-light .helpful{color:#368f31}.theme-light .scanner{color:red}.theme-light .scannerb{color:red;font-weight:bold}.theme-light .scannerburn{color:orange}.theme-light .scannerburnb{color:orange;font-weight:bold}.theme-light .rose{color:#ff5050}.theme-light .debuginfo{color:#493d26;font-style:italic}.theme-light .xenonotice{color:#2a623d}.theme-light .xenoboldnotice{color:#2a623d;font-weight:bold}.theme-light .xenowarning{color:#2a623d;font-style:italic}.theme-light .xenominorwarning{color:#2a623d;font-weight:bold;font-style:italic}.theme-light .xenodanger{color:#2a623d;font-weight:bold}.theme-light .avoidharm{color:#72a0e5;font-weight:bold}.theme-light .highdanger{color:red;font-weight:bold;font-size:140%}.theme-light .xenohighdanger{color:#2a623d;font-weight:bold;font-size:140%}.theme-light .xenoannounce{color:#1a472a;font-family:book-antiqua;font-weight:bold;font-size:140%}.theme-light .yautjabold{color:purple;font-weight:bold}.theme-light .yautjaboldbig{color:purple;font-weight:bold;font-size:120%}.theme-light .objectivebig{font-weight:bold;font-size:130%}.theme-light .objectivegreen{color:lime}.theme-light .objectivered{color:red}.theme-light .objectivesuccess{color:lime;font-weight:bold;font-size:110%}.theme-light .objectivefail{color:red;font-weight:bold;font-size:110%}.theme-light .xenotalk,.theme-light .xeno{color:#900090;font-style:italic}.theme-light .xenoleader{color:#730d73;font-style:italic;font-size:125%}.theme-light .xenoqueen{color:#730d73;font-style:italic;font-weight:bold;font-size:125%}.theme-light .newscaster{color:maroon}.theme-light .role_header{color:#db0000;display:block;text-align:center;font-weight:bold;font-family:trebuchet-ms;font-size:150%}.theme-light .role_body{color:#009;display:block;text-align:center;font-size:125%}.theme-light .round_header{color:#db0000;display:block;text-align:center;font-family:courier;font-weight:bold;font-size:180%}.theme-light .round_body{color:#001427;display:block;text-align:center;font-family:trebuchet-ms;font-weight:bold;font-size:125%}.theme-light .event_announcement{color:#600d48;font-family:arial-narrow;font-weight:bold;font-size:125%}.theme-light .announce_header{color:#000;font-weight:bold;font-size:150%}.theme-light .announce_header_blue{color:#009;font-weight:bold;font-size:150%}.theme-light .announce_body{color:red;font-weight:normal;font-size:125%}.theme-light .centerbold{display:block;text-align:center;font-weight:bold}.theme-light .mod{color:#735638;font-weight:bold}.theme-light .modooc{color:#184880;font-weight:bold}.theme-light .adminmod{color:#402a14;font-weight:bold}.theme-light .mentorsay{color:#b38c32;font-weight:bold}.theme-light .mentorhelp{color:#007e00;font-weight:bold}.theme-light .mentorbody{color:#da6200;font-weight:bold}.theme-light .mentorstaff{color:#876101;font-weight:bold}.theme-light .staffsay{color:#876101;font-weight:bold}.theme-light .tajaran{color:#803b56}.theme-light .tajaran_signlang{color:#941c1c}.theme-light .skrell{color:#00ced1}.theme-light .soghun{color:#228b22}.theme-light .changeling{color:purple}.theme-light .vox{color:#a0a}.theme-light .monkey{color:#966c47}.theme-light .german{color:#858f1e;font-family:"Times New Roman",Times,serif}.theme-light .spanish{color:#cf982b}.theme-light .japanese{color:#940927}.theme-light .chinese{color:#fe1919}.theme-light .zombie{color:#216163;font-style:italic}.theme-light .commando{color:#fe9b24;font-style:bold}.theme-light .rough{font-family:trebuchet-ms,cursive,sans-serif}.theme-light .say_quote{font-family:Georgia,Verdana,sans-serif}.theme-light .admin .message{color:#314cad}.theme-light .admin .prefix{font-weight:bolder}.theme-light .pm{font-size:110%}.theme-light .retro_translator{font-weight:bold}.theme-light .yautja_translator{color:#a00;font-weight:bold;animation:glitch .5s infinite}@keyframes glitch{25%{color:#a00;transform:translate(-2px, -1px)}50%{color:#be0000;transform:translate(1px, -2px)}75%{color:#8d0000;transform:translate(-1px, 2px)}100%{color:#830000;transform:translate(1px, 1px)}}.theme-light .examine_block{background:#f2f7fa;border:1px solid #111a27;margin:.5em;padding:.5em .75em}.theme-light .examine_block .icon{width:1.5em;height:1.5em;margin:0;padding:0}.theme-light .tooltip{font-style:italic;border-bottom:1px dashed #000} diff --git a/tgui/webpack.config.js b/tgui/webpack.config.js index 19e2975715fa..f90b80926e44 100644 --- a/tgui/webpack.config.js +++ b/tgui/webpack.config.js @@ -55,13 +55,13 @@ module.exports = (env = {}, argv) => { chunkLoadTimeout: 15000, }, resolve: { - extensions: ['.tsx', '.ts', '.js'], + extensions: ['.jsx', '.tsx', '.ts', '.js'], alias: {}, }, module: { rules: [ { - test: /\.(js|cjs|ts|tsx)$/, + test: /\.(js|jsx|cjs|ts|tsx)$/, use: [ { loader: require.resolve('babel-loader'),